pax_global_header00006660000000000000000000000064145736662060014531gustar00rootroot0000000000000052 comment=b6d2d2073b3fdf81e5fc036cff928c1319487b22 grpc-gcp-go-grpcgcp-v1.5.0/000077500000000000000000000000001457366620600154525ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/LICENSE000066400000000000000000000261361457366620600164670ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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. grpc-gcp-go-grpcgcp-v1.5.0/README.md000066400000000000000000000006351457366620600167350ustar00rootroot00000000000000# gRPC for GCP extensions Copyright 2019 [The gRPC Authors](https://github.com/grpc/grpc/blob/master/AUTHORS) ## About This Repository This repo is created to support GCP specific extensions for gRPC. To use the extension features, please refer to [grpcgcp](grpcgcp). This repo also contains supporting infrastructures such as end2end tests and benchmarks for accessing cloud APIs with gRPC client libraries. grpc-gcp-go-grpcgcp-v1.5.0/cloudbuild.yaml000066400000000000000000000006701457366620600204670ustar00rootroot00000000000000steps: - name: golang:1.19 dir: 'grpcgcp' entrypoint: go args: ['test', '-race', '-v', '-timeout', '600s'] - name: golang:1.19 dir: 'grpcgcp' entrypoint: go args: ['test', '-race', '-v', '-timeout', '600s', 'github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/test_grpc'] - name: golang:1.19 dir: 'grpcgcp_tests' env: - 'GCP_PROJECT_ID=grpc-gcp-testing' entrypoint: go args: ['test', '-race', '-v', '-timeout', '600s'] grpc-gcp-go-grpcgcp-v1.5.0/cloudprober/000077500000000000000000000000001457366620600177725ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/cloudprober/cloudprober.cfg000066400000000000000000000005631457366620600227770ustar00rootroot00000000000000probe { type: EXTERNAL name: "spanner" interval_msec: 1800000 timeout_msec: 30000 targets { dummy_targets {} } # No targets for external probe external_probe { mode: ONCE command: "./goprober --spanner" } } surfacer { type: STACKDRIVER name: "stackdriver" stackdriver_surfacer { monitoring_url: "custom.googleapis.com/cloudprober/" } }grpc-gcp-go-grpcgcp-v1.5.0/cloudprober/go.mod000066400000000000000000000004431457366620600211010ustar00rootroot00000000000000module github.com/GoogleCloudPlatform/grpc-gcp-go/cloudprober require ( cloud.google.com/go v0.34.0 github.com/googleapis/gax-go v2.0.2+incompatible // indirect google.golang.org/api v0.1.0 google.golang.org/genproto v0.0.0-20190111180523-db91494dd46c google.golang.org/grpc v1.17.0 ) grpc-gcp-go-grpcgcp-v1.5.0/cloudprober/main.go000066400000000000000000000036461457366620600212560ustar00rootroot00000000000000/* * * Copyright 2019 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 main import ( "os" spanner "cloud.google.com/go/spanner/apiv1" ) func parseArgs() []bool { // Currently we only have spanner probers. May add new features in the future. vars := []bool{false} for _, arg := range os.Args { if arg == "--spanner" { vars[0] = true } } return vars } type spannerProber func(*spanner.Client, map[string]int64) error func executeSpannerProber(p spannerProber, client *spanner.Client, metrics map[string]int64, count *int, util *stackdriverUtil) { err := p(client, metrics) if err != nil { *count = (*count) + 1 util.reportError(err) } } func executeSpannerProbers() { metrics := make(map[string]int64) client := createClient() failureCount := 0 util := newStackdriverUtil("Spanner") defer util.closeErrClient() executeSpannerProber(sessionManagementProber, client, metrics, &failureCount, util) executeSpannerProber(executeSqlProber, client, metrics, &failureCount, util) executeSpannerProber(readProber, client, metrics, &failureCount, util) executeSpannerProber(transactionProber, client, metrics, &failureCount, util) executeSpannerProber(partitionProber, client, metrics, &failureCount, util) if failureCount == 0 { util.setSuccess() } util.addMetricsDict(metrics) util.outputMetrics() } func main() { vars := parseArgs() if vars[0] { executeSpannerProbers() } } grpc-gcp-go-grpcgcp-v1.5.0/cloudprober/spannerprobers.go000066400000000000000000000203231457366620600233640ustar00rootroot00000000000000/* * Copyright 2019 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 main import ( "context" "errors" "io" "log" "os" "time" "google.golang.org/api/iterator" spanner "cloud.google.com/go/spanner/apiv1" spannerpb "google.golang.org/genproto/googleapis/spanner/v1" ) const ( database = "projects/grpc-prober-testing/instances/test-instance/databases/test-db" table = "users" testUsername = "test_username" ) func createClient() *spanner.Client { ctx := context.Background() client, _ := spanner.NewClient(ctx) if client == nil { log.Fatal("Fail to create the client.") os.Exit(1) } return client } func sessionManagementProber(client *spanner.Client, metrics map[string]int64) error { ctx := context.Background() reqCreate := &spannerpb.CreateSessionRequest{ Database: database, } start := time.Now() session, err := client.CreateSession(ctx, reqCreate) if err != nil { return err } if session == nil { return errors.New("failded to create a new session") } metrics["create_session_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) // DeleteSession defer func() { start = time.Now() reqDelete := &spannerpb.DeleteSessionRequest{ Name: session.Name, } client.DeleteSession(ctx, reqDelete) metrics["delete_session_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) }() // GetSession reqGet := &spannerpb.GetSessionRequest{ Name: session.Name, } start = time.Now() respGet, err := client.GetSession(ctx, reqGet) if err != nil { return err } if reqGet == nil || respGet.Name != session.Name { return errors.New("fail to get the session") } metrics["get_session_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) // ListSessions reqList := &spannerpb.ListSessionsRequest{ Database: database, } start = time.Now() it := client.ListSessions(ctx, reqList) inList := false for { resp, err := it.Next() if err == iterator.Done { break } if err != nil { return err } if resp.Name == session.Name { inList = true break } } metrics["list_sessions_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) if !inList { return errors.New("list sessions failed") } return nil } func executeSqlProber(client *spanner.Client, metrics map[string]int64) error { ctx := context.Background() session := createSession(client) defer deleteSession(client, session) reqSql := &spannerpb.ExecuteSqlRequest{ Sql: "select * FROM " + table, Session: session.Name, } // ExecuteSql start := time.Now() respSql, err1 := client.ExecuteSql(ctx, reqSql) if err1 != nil { return err1 } if respSql == nil || len(respSql.Rows) != 1 || respSql.Rows[0].Values[0].GetStringValue() != testUsername { return errors.New("execute sql failed") } metrics["execute_sql_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) // ExecuteStreamingSql start = time.Now() stream, err2 := client.ExecuteStreamingSql(ctx, reqSql) if err2 != nil { return err2 } for { resp, err := stream.Recv() if err == io.EOF { break } if err != nil { return err } if resp == nil || resp.Values[0].GetStringValue() != testUsername { return errors.New("execute streaming sql failed") } } metrics["execute_streaming_sql_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) return nil } func readProber(client *spanner.Client, metrics map[string]int64) error { ctx := context.Background() session := createSession(client) defer deleteSession(client, session) reqRead := &spannerpb.ReadRequest{ Session: session.Name, Table: table, KeySet: &spannerpb.KeySet{ All: true, }, Columns: []string{"username", "firstname", "lastname"}, } // Read start := time.Now() respRead, err1 := client.Read(ctx, reqRead) if err1 != nil { return err1 } if respRead == nil || len(respRead.Rows) != 1 || respRead.Rows[0].Values[0].GetStringValue() != testUsername { return errors.New("execute read failed") } metrics["read_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) // StreamingRead start = time.Now() stream, err2 := client.StreamingRead(ctx, reqRead) if err2 != nil { return err2 } for { resp, err := stream.Recv() if err == io.EOF { break } if err != nil { return err } if resp == nil || resp.Values[0].GetStringValue() != testUsername { return errors.New("streaming read failed") } } metrics["streaming_read_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) return nil } func transactionProber(client *spanner.Client, metrics map[string]int64) error { ctx := context.Background() session := createSession(client) reqBegin := &spannerpb.BeginTransactionRequest{ Session: session.Name, Options: &spannerpb.TransactionOptions{ Mode: &spannerpb.TransactionOptions_ReadWrite_{ ReadWrite: &spannerpb.TransactionOptions_ReadWrite{}, }, }, } // BeginTransaction start := time.Now() txn, err1 := client.BeginTransaction(ctx, reqBegin) if err1 != nil { return err1 } metrics["begin_transaction_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) // Commit reqCommit := &spannerpb.CommitRequest{ Session: session.Name, Transaction: &spannerpb.CommitRequest_TransactionId{ TransactionId: txn.Id, }, } start = time.Now() _, err2 := client.Commit(ctx, reqCommit) if err2 != nil { return err2 } metrics["commit_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) // Rollback txn, err1 = client.BeginTransaction(ctx, reqBegin) if err1 != nil { return err1 } reqRollback := &spannerpb.RollbackRequest{ Session: session.Name, TransactionId: txn.Id, } start = time.Now() err2 = client.Rollback(ctx, reqRollback) if err2 != nil { return err2 } metrics["rollback_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) reqDelete := &spannerpb.DeleteSessionRequest{ Name: session.Name, } client.DeleteSession(ctx, reqDelete) return nil } func partitionProber(client *spanner.Client, metrics map[string]int64) error { ctx := context.Background() session := createSession(client) defer deleteSession(client, session) selector := &spannerpb.TransactionSelector{ Selector: &spannerpb.TransactionSelector_Begin{ Begin: &spannerpb.TransactionOptions{ Mode: &spannerpb.TransactionOptions_ReadOnly_{ ReadOnly: &spannerpb.TransactionOptions_ReadOnly{}, }, }, }, } // PartitionQuery reqQuery := &spannerpb.PartitionQueryRequest{ Session: session.Name, Sql: "select * FROM " + table, Transaction: selector, } start := time.Now() _, err := client.PartitionQuery(ctx, reqQuery) if err != nil { return err } metrics["partition_query_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) // PartitionRead reqRead := &spannerpb.PartitionReadRequest{ Session: session.Name, Table: table, KeySet: &spannerpb.KeySet{ All: true, }, Columns: []string{"username", "firstname", "lastname"}, Transaction: selector, } start = time.Now() _, err = client.PartitionRead(ctx, reqRead) if err != nil { return err } metrics["partition_read_latency_ms"] = int64(time.Now().Sub(start) / time.Millisecond) return nil } func createSession(client *spanner.Client) *spannerpb.Session { ctx := context.Background() reqCreate := &spannerpb.CreateSessionRequest{ Database: database, } session, err := client.CreateSession(ctx, reqCreate) if err != nil { log.Fatal(err.Error()) return nil } if session == nil { log.Fatal("Failded to create a new session.") return nil } return session } func deleteSession(client *spanner.Client, session *spannerpb.Session) { if client == nil { return } ctx := context.Background() reqDelete := &spannerpb.DeleteSessionRequest{ Name: session.Name, } client.DeleteSession(ctx, reqDelete) } grpc-gcp-go-grpcgcp-v1.5.0/cloudprober/stackdriverutils.go000066400000000000000000000043211457366620600237230ustar00rootroot00000000000000/* * * Copyright 2019 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 main import ( "context" "fmt" "os" "cloud.google.com/go/errorreporting" ) const ( projectID = "grpc-prober-testing" ) type stackdriverUtil struct { metrics map[string]int64 apiName string success bool errClient *errorreporting.Client } func newStackdriverUtil(name string) *stackdriverUtil { m := make(map[string]int64) ctx := context.Background() errorClient, err := errorreporting.NewClient(ctx, projectID, errorreporting.Config{ ServiceName: "grpc-go-cloudprober", OnError: func(err error) { fmt.Fprintln(os.Stderr, "Could not log error: %v", err) }, }) if err != nil { fmt.Fprintln(os.Stderr, err.Error()) return &stackdriverUtil{m, name, false, nil} } return &stackdriverUtil{m, name, false, errorClient} } func (util *stackdriverUtil) closeErrClient() { if util.errClient != nil { util.errClient.Close() } } func (util *stackdriverUtil) reportError(err error) { // Report to the stderr. fmt.Fprintln(os.Stderr, err.Error()) //Report to the stackdriver error log. util.errClient.Report(errorreporting.Entry{ Error: err, }) } func (util *stackdriverUtil) addMetric(key string, value int64) { (util.metrics)[key] = value } func (util *stackdriverUtil) setSuccess() { util.success = true } func (util *stackdriverUtil) addMetricsDict(metrics map[string]int64) { for key, value := range metrics { (util.metrics)[key] = value } } func (util *stackdriverUtil) outputMetrics() { if util.success { fmt.Printf("%s_success 1\n", util.apiName) } else { fmt.Printf("%s_success 0\n", util.apiName) } for key, value := range util.metrics { fmt.Printf("%s %d\n", key, value) } } grpc-gcp-go-grpcgcp-v1.5.0/doc/000077500000000000000000000000001457366620600162175ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/doc/gRPC-client-user-guide.md000066400000000000000000000117201457366620600226600ustar00rootroot00000000000000# Instructions for create a gRPC client for google cloud services ## Overview This instruction includes a step by step guide for creating a gRPC client to test the google cloud service from an empty linux VM, using GCE ubuntu 16.04 TLS instance. The main steps are followed as steps below: - Environment prerequisite - Install gRPC-go, plugin, protobuf and oauth2 - Generate client API from .proto files - Create the client and send/receive RPC. ## Environment Prerequisite **Golang** ```sh $ wget https://dl.google.com/go/go1.9.3.linux-amd64.tar.gz $ [sudo] tar -C /usr/local -xzf go1.9.3.linux-amd64.tar.gz $ echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc $ source ~/.bashrc $ mkdir $HOME/go ``` ## Install gRPC-go, plugin, protobuf and oauth2 - gRPC-go, plugin and pauth2 ```sh $ cd $HOME/go $ go get -u google.golang.org/grpc $ go get -u github.com/golang/protobuf/protoc-gen-go $ go get golang.org/x/oauth2/google ``` - protobuf ```sh $ cd $HOME $ git clone https://github.com/google/protobuf.git $ cd $HOME/protobuf $ ./autogen.sh && ./configure && make -j8 $ [sudo] make install $ [sudo] ldconfig ``` ## Generate client API from .proto files Please check files under `$HOME/go/src/google.golang.org/genproto/googleapis` to see whether you service client API **has already been generated**. If they are already there, you can skip this step. For most google cloud APIs, all client APIs are already generated in the [go-genproto repo](https://github.com/google/go-genproto) under `googleapis/`. **If they have not already been generated**, the common way to use the plugin looks like ```sh $ mkdir $HOME/go/src/project-golang && cd $HOME/go/src/project-golang $ protoc --proto_path=/path/to/proto_dir --go_out=./\ path/to/your/proto_dependency_directory1/*.proto \ path/to/your/proto_dependency_directory2/*.proto \ path/to/your/proto_service_directory/*.proto ``` Assume that you don't need to generate pb files because you find them generated under `$HOME/go/src/google.golang.org/genproto/googleapis`. They are installing during installing the gRPC. Take [`Firestore`](https://github.com/googleapis/googleapis/blob/master/google/firestore/v1beta1/firestore.proto) as example, the Client API is under `$HOME/go/src/google.golang.org/genproto/googleapis/firestore/v1beta1/firestore.pb.go` depends on your package namespace inside .proto file. An easy way to find your client is ```sh $ cd $HOME/go $ find ./ -name [service_name: eg, firestore, cluster_service]* ``` The one under `genproto` directory is what you need. ## Create the client and send/receive RPC. Now it's time to use the client API to send and receive RPCs. Here I assume that you don't need to generate pb files from the last step and use files under `$HOME/go/src/google.golang.org/genproto/googleapis` directly. If you generate them by your own, the difference is change the import path. **Set credentials file** This is important otherwise your RPC response will be a permission error. ``` sh $ vim $HOME/key.json ## Paste you credential file downloaded from your cloud project ## which you can find in APIs&Services => credentials => create credentials ## => Service account key => your credentials $ export GOOGLE_APPLICATION_CREDENTIALS=$HOME/key.json ``` **Implement Service Client** Take a unary-unary RPC `listDocument` from `FirestoreClient` as example. Create a file name `$HOME/src/main.go`. - Import library ``` package main import ( "context" "fmt" "log" "os" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" firestore "google.golang.org/genproto/googleapis/firestore/v1beta1" ) ``` - Set Google Auth. Please see the referece for [authenticate with Google using an Oauth2 token](https://grpc.io/docs/guides/auth.html#authenticate-with-google) for the use of 'googleauth' library. ``` keyFile := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") perRPC, err := oauth.NewServiceAccountFromFile(keyFile, "https://www.googleapis.com/auth/datastore") if err != nil { log.Fatalf("Failed to create credentials: %v", err) } address := "firestore.googleapis.com:443" conn, err := grpc.Dial(address, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(perRPC)) defer conn.Close() ``` - Create Client ``` client := firestore.NewFirestoreClient(conn) ``` - Make and receive RPC call ``` listDocsRequest := firestore.ListDocumentsRequest{ Parent: "projects/ddyihai-firestore/databases/(default)", } resp, err := client.ListDocuments(context.Background(), &listDocsRequest) if err != nil { fmt.Println(err) } ``` - Print RPC response ``` for _, doc := range resp.Documents { fmt.Printf("%+v\n", doc) } ``` - Run the script ```sh $ cd $HOME/go $ go run src/main.go ``` For different kinds of RPC(unary-unary, unary-stream, stream-unary, stream-stream), please check [grpc.io Golang part](https://grpc.io/docs/tutorials/basic/go.html#simple-rpcc) for reference. grpc-gcp-go-grpcgcp-v1.5.0/e2e-checksum/000077500000000000000000000000001457366620600177255ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-checksum/README.md000066400000000000000000000006571457366620600212140ustar00rootroot00000000000000# End to End Checksum Client This is an example datastore client applying end to end checksum for data integrity. ## Usage For this client, you can choose to use the production datastore target ("datastore.googleapis.com"), or use a test server running behind GFE. ## Run client Override datastore endpoint. ```sh export DATASTORE_EMULATOR_HOST=my-test-service.sandbox.googleapis.com:443 ``` Run: ```sh go run main.go ``` grpc-gcp-go-grpcgcp-v1.5.0/e2e-checksum/go.mod000066400000000000000000000020461457366620600210350ustar00rootroot00000000000000module github.com/GoogleCloudPlatform/grpc-gcp-go/e2e-checksum go 1.19 require ( cloud.google.com/go/datastore v1.11.0 github.com/golang/protobuf v1.5.3 google.golang.org/api v0.114.0 google.golang.org/grpc v1.56.3 ) require ( cloud.google.com/go v0.110.0 // indirect cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.1 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/protobuf v1.30.0 // indirect ) grpc-gcp-go-grpcgcp-v1.5.0/e2e-checksum/go.sum000066400000000000000000000316451457366620600210710ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= 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/datastore v1.11.0 h1:iF6I/HaLs3Ado8uRKMvZRvF/ZLkWaWE9i8AiHzbC774= cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 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/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/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= 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/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.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.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 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/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.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 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/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= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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/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-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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/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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= 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.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/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-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-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= 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.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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= grpc-gcp-go-grpcgcp-v1.5.0/e2e-checksum/main.go000066400000000000000000000043001457366620600211750ustar00rootroot00000000000000package main import ( "context" "hash/crc32" "log" "cloud.google.com/go/datastore" "github.com/golang/protobuf/proto" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/encoding" protoCodec "google.golang.org/grpc/encoding/proto" ) const ( checksumField = 2047 checksumWireType = 5 // wire type is a 32-bit ) type myCodec struct { protoCodec encoding.Codec } func (c *myCodec) Marshal(v interface{}) ([]byte, error) { bytes, err := c.protoCodec.Marshal(v) if err != nil { return bytes, err } crc32c := crc32.MakeTable(crc32.Castagnoli) checksum := crc32.Checksum(bytes, crc32c) buffer := proto.NewBuffer([]byte{}) // calculate checksum tag (field & wire type) tag := (checksumField << 3) | checksumWireType if err = buffer.EncodeVarint(uint64(tag)); err != nil { return bytes, err } if err = buffer.EncodeFixed32(uint64(checksum)); err != nil { return bytes, err } log.Printf("encoded checksum field and value: %+v\n", buffer.Bytes()) newBytes := append(buffer.Bytes(), bytes...) // prepend //newBytes := append(bytes, buffer.Bytes()...) // append log.Printf("Marshalled bytes: %+v\n", bytes) return newBytes, err } func (c *myCodec) Unmarshal(data []byte, v interface{}) error { return c.protoCodec.Unmarshal(data, v) } func (c *myCodec) String() string { return "MyCodec" } func main() { type Entity struct { Firstname string Lastname string } ctx := context.Background() projectID := "grpc-gcp" opts := []option.ClientOption{ option.WithGRPCDialOption(grpc.WithCodec(&myCodec{protoCodec: encoding.GetCodec(protoCodec.Name)})), option.WithGRPCDialOption(grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, ""))), //option.WithEndpoint("stubby-e2e-generic-service-test.sandbox.googleapis.com:443"), } client, err := datastore.NewClient(ctx, projectID, opts...) if err != nil { log.Fatalf("Failed to create firestore client: %v", err) } kind := "Person" name := "weiranf" key := datastore.NameKey(kind, name, nil) e := Entity{ Firstname: "Weiran", Lastname: "Fang", } if _, err := client.Put(ctx, key, &e); err != nil { log.Fatalf("client.Put failed: %v", err) } } grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/000077500000000000000000000000001457366620600177415ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/echo/000077500000000000000000000000001457366620600206575ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/echo/README.md000066400000000000000000000015311457366620600221360ustar00rootroot00000000000000# Echo Client for e2e test Simple echo client for e2e testing against the echo service defined in [echo.proto](echo/echo.proto). ## Usage The client sends out `numRpcs` number of Ping-Pong unary requests sequentially with request size specified by `reqSize` in KB, and response size specified by `rspSize` in KB, test result will be printed in console. ## Generate protobuf code If we need to regenerate pb code for echo grpc service, run: ```sh ./echo/codegen.sh ``` ## Run client Example command for endpoint `some.test.service` with 100 RPCs and 100KB response size: ```sh go run echo-client/main.go -numRpcs=100 -rspSize=100 ``` Example test result ```sh [Number of RPCs: 100, Request size: 1KB, Response size: 100KB] Avg Min p50 p90 p99 Max Time(ms) 76 74 76 78 109 109 ``` grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/echo/echo-client/000077500000000000000000000000001457366620600230515ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/echo/echo-client/main.go000066400000000000000000000047511457366620600243330ustar00rootroot00000000000000package main import ( "context" "flag" "log" "sort" "strings" "sync" "time" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/e2e-examples/echo/echo" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) var ( addr = flag.String("addr", "staging-grpc-cfe-benchmarks.googleapis.com:443", "server address") numRpcs = flag.Int("numRpcs", 1, "number of blocking unary calls") warmup = flag.Int("warmup", 5, "number of warmup calls before test") rspSize = flag.Int("rspSize", 1, "response size in KB") reqSize = flag.Int("reqSize", 1, "request size in KB") async = flag.Bool("async", false, "use async echo calls") ) func printRsts(numRpcs int, rspSize int, reqSize int, rsts []int) { sort.Ints(rsts) n := len(rsts) sum := 0 for _, r := range rsts { sum += r } log.Printf( "\n[Number of RPCs: %v, Request size: %vKB, Response size: %vKB]\n"+ "\t\tAvg\tMin\tp50\tp90\tp99\tMax\n"+ "Time(ms)\t%v\t%v\t%v\t%v\t%v\t%v\n", numRpcs, reqSize, rspSize, sum/n, rsts[0], rsts[int(float64(n)*0.5)], rsts[int(float64(n)*0.9)], rsts[int(float64(n)*0.99)], rsts[n-1], ) } func main() { flag.Parse() conn, err := grpc.Dial( *addr, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithBlock()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() client := pb.NewGrpcCloudapiClient(conn) msg := strings.Repeat("x", *reqSize*1024) req := &pb.EchoWithResponseSizeRequest{EchoMsg: msg, ResponseSize: int32(*rspSize * 1024)} // begin warmup calls for i := 0; i < *warmup; i++ { _, err := client.EchoWithResponseSize(context.Background(), req) if err != nil { log.Fatalf("EchoWithResponseSize failed with error during warmup: %v", err) } } rsts := []int{} if !*async { // begin tests for i := 0; i < *numRpcs; i++ { start := time.Now() _, err := client.EchoWithResponseSize(context.Background(), req) if err != nil { log.Fatalf("EchoWithResponseSize failed with error: %v", err) } rsts = append(rsts, int(time.Since(start).Milliseconds())) } printRsts(*numRpcs, *rspSize, *reqSize, rsts) } else { var wg sync.WaitGroup wg.Add(*numRpcs) for i := 0; i < *numRpcs; i++ { go func(r *pb.EchoWithResponseSizeRequest, n int) { defer wg.Done() _, err := client.EchoWithResponseSize(context.Background(), r) if err != nil { log.Fatalf("EchoWithResponseSize failed with error: %v", err) } log.Printf("Done %vth request", n) }(req, i) } wg.Wait() } } grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/echo/echo/000077500000000000000000000000001457366620600215755ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/echo/echo/codegen.sh000077500000000000000000000002471457366620600235430ustar00rootroot00000000000000#!/usr/bin/env bash cd "$(dirname "$0")" #protoc --plugin=$GOPATH/bin/protoc-gen-go --proto_path=./ --go_out=./ ./echo.proto protoc --go_out=plugins=grpc:. *.proto grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/echo/echo/echo.pb.go000066400000000000000000000364511457366620600234530ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // source: echo.proto package echo import ( context "context" fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" math "math" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package // Request message type for simple echo. type EchoRequest struct { StringToEcho string `protobuf:"bytes,1,opt,name=string_to_echo,json=stringToEcho,proto3" json:"string_to_echo,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *EchoRequest) Reset() { *m = EchoRequest{} } func (m *EchoRequest) String() string { return proto.CompactTextString(m) } func (*EchoRequest) ProtoMessage() {} func (*EchoRequest) Descriptor() ([]byte, []int) { return fileDescriptor_08134aea513e0001, []int{0} } func (m *EchoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EchoRequest.Unmarshal(m, b) } func (m *EchoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_EchoRequest.Marshal(b, m, deterministic) } func (m *EchoRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_EchoRequest.Merge(m, src) } func (m *EchoRequest) XXX_Size() int { return xxx_messageInfo_EchoRequest.Size(m) } func (m *EchoRequest) XXX_DiscardUnknown() { xxx_messageInfo_EchoRequest.DiscardUnknown(m) } var xxx_messageInfo_EchoRequest proto.InternalMessageInfo func (m *EchoRequest) GetStringToEcho() string { if m != nil { return m.StringToEcho } return "" } // Response message type for simple echo. type EchoResponse struct { EchoedString string `protobuf:"bytes,1,opt,name=echoed_string,json=echoedString,proto3" json:"echoed_string,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *EchoResponse) Reset() { *m = EchoResponse{} } func (m *EchoResponse) String() string { return proto.CompactTextString(m) } func (*EchoResponse) ProtoMessage() {} func (*EchoResponse) Descriptor() ([]byte, []int) { return fileDescriptor_08134aea513e0001, []int{1} } func (m *EchoResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EchoResponse.Unmarshal(m, b) } func (m *EchoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_EchoResponse.Marshal(b, m, deterministic) } func (m *EchoResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_EchoResponse.Merge(m, src) } func (m *EchoResponse) XXX_Size() int { return xxx_messageInfo_EchoResponse.Size(m) } func (m *EchoResponse) XXX_DiscardUnknown() { xxx_messageInfo_EchoResponse.DiscardUnknown(m) } var xxx_messageInfo_EchoResponse proto.InternalMessageInfo func (m *EchoResponse) GetEchoedString() string { if m != nil { return m.EchoedString } return "" } type EchoWithResponseSizeRequest struct { EchoMsg string `protobuf:"bytes,1,opt,name=echo_msg,json=echoMsg,proto3" json:"echo_msg,omitempty"` ResponseSize int32 `protobuf:"varint,2,opt,name=response_size,json=responseSize,proto3" json:"response_size,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *EchoWithResponseSizeRequest) Reset() { *m = EchoWithResponseSizeRequest{} } func (m *EchoWithResponseSizeRequest) String() string { return proto.CompactTextString(m) } func (*EchoWithResponseSizeRequest) ProtoMessage() {} func (*EchoWithResponseSizeRequest) Descriptor() ([]byte, []int) { return fileDescriptor_08134aea513e0001, []int{2} } func (m *EchoWithResponseSizeRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EchoWithResponseSizeRequest.Unmarshal(m, b) } func (m *EchoWithResponseSizeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_EchoWithResponseSizeRequest.Marshal(b, m, deterministic) } func (m *EchoWithResponseSizeRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_EchoWithResponseSizeRequest.Merge(m, src) } func (m *EchoWithResponseSizeRequest) XXX_Size() int { return xxx_messageInfo_EchoWithResponseSizeRequest.Size(m) } func (m *EchoWithResponseSizeRequest) XXX_DiscardUnknown() { xxx_messageInfo_EchoWithResponseSizeRequest.DiscardUnknown(m) } var xxx_messageInfo_EchoWithResponseSizeRequest proto.InternalMessageInfo func (m *EchoWithResponseSizeRequest) GetEchoMsg() string { if m != nil { return m.EchoMsg } return "" } func (m *EchoWithResponseSizeRequest) GetResponseSize() int32 { if m != nil { return m.ResponseSize } return 0 } type StreamEchoRequest struct { MessageCount int32 `protobuf:"varint,1,opt,name=message_count,json=messageCount,proto3" json:"message_count,omitempty"` MessageInterval int32 `protobuf:"varint,2,opt,name=message_interval,json=messageInterval,proto3" json:"message_interval,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *StreamEchoRequest) Reset() { *m = StreamEchoRequest{} } func (m *StreamEchoRequest) String() string { return proto.CompactTextString(m) } func (*StreamEchoRequest) ProtoMessage() {} func (*StreamEchoRequest) Descriptor() ([]byte, []int) { return fileDescriptor_08134aea513e0001, []int{3} } func (m *StreamEchoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamEchoRequest.Unmarshal(m, b) } func (m *StreamEchoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StreamEchoRequest.Marshal(b, m, deterministic) } func (m *StreamEchoRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_StreamEchoRequest.Merge(m, src) } func (m *StreamEchoRequest) XXX_Size() int { return xxx_messageInfo_StreamEchoRequest.Size(m) } func (m *StreamEchoRequest) XXX_DiscardUnknown() { xxx_messageInfo_StreamEchoRequest.DiscardUnknown(m) } var xxx_messageInfo_StreamEchoRequest proto.InternalMessageInfo func (m *StreamEchoRequest) GetMessageCount() int32 { if m != nil { return m.MessageCount } return 0 } func (m *StreamEchoRequest) GetMessageInterval() int32 { if m != nil { return m.MessageInterval } return 0 } func init() { proto.RegisterType((*EchoRequest)(nil), "e2e_service.EchoRequest") proto.RegisterType((*EchoResponse)(nil), "e2e_service.EchoResponse") proto.RegisterType((*EchoWithResponseSizeRequest)(nil), "e2e_service.EchoWithResponseSizeRequest") proto.RegisterType((*StreamEchoRequest)(nil), "e2e_service.StreamEchoRequest") } func init() { proto.RegisterFile("echo.proto", fileDescriptor_08134aea513e0001) } var fileDescriptor_08134aea513e0001 = []byte{ // 322 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xcd, 0x4b, 0xc3, 0x40, 0x10, 0xc5, 0x8d, 0xb4, 0x7e, 0x4c, 0xb7, 0x7e, 0x2c, 0x3d, 0xb4, 0x0a, 0x52, 0x52, 0x0f, 0xf5, 0x12, 0xa4, 0x3d, 0x7b, 0xb1, 0x88, 0x88, 0x78, 0x49, 0x05, 0x41, 0x28, 0x4b, 0xdc, 0x0e, 0xe9, 0x42, 0x9b, 0x8d, 0xbb, 0xdb, 0x1e, 0xfa, 0x9f, 0x7b, 0x93, 0xe9, 0x26, 0x10, 0x69, 0xed, 0x25, 0x90, 0x97, 0xf7, 0x7b, 0x33, 0x79, 0xbb, 0x00, 0x28, 0x67, 0x3a, 0xca, 0x8d, 0x76, 0x9a, 0x37, 0x70, 0x80, 0xc2, 0xa2, 0x59, 0x29, 0x89, 0xe1, 0x10, 0x1a, 0x4f, 0x72, 0xa6, 0x63, 0xfc, 0x5e, 0xa2, 0x75, 0xfc, 0x16, 0xce, 0xac, 0x33, 0x2a, 0x4b, 0x85, 0xd3, 0x82, 0x98, 0x76, 0xd0, 0x0d, 0xfa, 0xa7, 0x31, 0xf3, 0xea, 0xbb, 0x26, 0x73, 0x38, 0x04, 0xe6, 0x21, 0x9b, 0xeb, 0xcc, 0x22, 0xef, 0x41, 0x93, 0xbc, 0x38, 0x15, 0xde, 0x56, 0x42, 0x5e, 0x1c, 0x6f, 0xb4, 0x70, 0x02, 0xd7, 0x04, 0x7d, 0x28, 0x37, 0x2b, 0xc1, 0xb1, 0x5a, 0x63, 0x39, 0xb9, 0x03, 0x27, 0x64, 0x17, 0x0b, 0x5b, 0xe2, 0xc7, 0xf4, 0xfe, 0x66, 0x53, 0x8a, 0x37, 0x05, 0x21, 0xac, 0x5a, 0x63, 0xfb, 0xb0, 0x1b, 0xf4, 0xeb, 0x31, 0x33, 0x95, 0x98, 0x50, 0xc2, 0xe5, 0xd8, 0x19, 0x4c, 0x16, 0xd5, 0xdf, 0xe9, 0x41, 0x73, 0x81, 0xd6, 0x26, 0x29, 0x0a, 0xa9, 0x97, 0x99, 0xdb, 0x24, 0xd7, 0x63, 0x56, 0x88, 0x23, 0xd2, 0xf8, 0x1d, 0x5c, 0x94, 0x26, 0x95, 0x39, 0x34, 0xab, 0x64, 0x5e, 0x4c, 0x38, 0x2f, 0xf4, 0x97, 0x42, 0x1e, 0xfc, 0x04, 0xc0, 0x9e, 0x4d, 0x2e, 0x47, 0x73, 0xbd, 0x9c, 0x26, 0xb9, 0xe2, 0x0f, 0x50, 0xa3, 0x79, 0xbc, 0x1d, 0x55, 0x4a, 0x8d, 0x2a, 0x2b, 0x5c, 0x75, 0x76, 0x7c, 0xf1, 0x6b, 0x87, 0x07, 0x7c, 0x02, 0xad, 0x5d, 0x9d, 0xf0, 0xfe, 0x16, 0xf4, 0x4f, 0x6d, 0xfb, 0xe3, 0x5f, 0x01, 0x48, 0xf1, 0xbd, 0xf0, 0x9b, 0x3f, 0xd6, 0xad, 0xb2, 0xf6, 0x46, 0xdd, 0x07, 0x8f, 0x2d, 0x60, 0x4a, 0x47, 0xa9, 0xc9, 0x65, 0x44, 0x07, 0xf3, 0x59, 0xa3, 0xe7, 0xd7, 0xd1, 0xe6, 0x4e, 0x0d, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x85, 0x80, 0x10, 0x61, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConn // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion4 // GrpcCloudapiClient is the client API for GrpcCloudapi service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type GrpcCloudapiClient interface { // A simple echo RPC returns the input string Echo(ctx context.Context, in *EchoRequest, opts ...grpc.CallOption) (*EchoResponse, error) // A simple echo RPC receives a custom response size EchoWithResponseSize(ctx context.Context, in *EchoWithResponseSizeRequest, opts ...grpc.CallOption) (*EchoResponse, error) // A simple stream endpoint EchoStream(ctx context.Context, in *StreamEchoRequest, opts ...grpc.CallOption) (GrpcCloudapi_EchoStreamClient, error) } type grpcCloudapiClient struct { cc *grpc.ClientConn } func NewGrpcCloudapiClient(cc *grpc.ClientConn) GrpcCloudapiClient { return &grpcCloudapiClient{cc} } func (c *grpcCloudapiClient) Echo(ctx context.Context, in *EchoRequest, opts ...grpc.CallOption) (*EchoResponse, error) { out := new(EchoResponse) err := c.cc.Invoke(ctx, "/e2e_service.GrpcCloudapi/Echo", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *grpcCloudapiClient) EchoWithResponseSize(ctx context.Context, in *EchoWithResponseSizeRequest, opts ...grpc.CallOption) (*EchoResponse, error) { out := new(EchoResponse) err := c.cc.Invoke(ctx, "/e2e_service.GrpcCloudapi/EchoWithResponseSize", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *grpcCloudapiClient) EchoStream(ctx context.Context, in *StreamEchoRequest, opts ...grpc.CallOption) (GrpcCloudapi_EchoStreamClient, error) { stream, err := c.cc.NewStream(ctx, &_GrpcCloudapi_serviceDesc.Streams[0], "/e2e_service.GrpcCloudapi/EchoStream", opts...) if err != nil { return nil, err } x := &grpcCloudapiEchoStreamClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } if err := x.ClientStream.CloseSend(); err != nil { return nil, err } return x, nil } type GrpcCloudapi_EchoStreamClient interface { Recv() (*EchoResponse, error) grpc.ClientStream } type grpcCloudapiEchoStreamClient struct { grpc.ClientStream } func (x *grpcCloudapiEchoStreamClient) Recv() (*EchoResponse, error) { m := new(EchoResponse) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } // GrpcCloudapiServer is the server API for GrpcCloudapi service. type GrpcCloudapiServer interface { // A simple echo RPC returns the input string Echo(context.Context, *EchoRequest) (*EchoResponse, error) // A simple echo RPC receives a custom response size EchoWithResponseSize(context.Context, *EchoWithResponseSizeRequest) (*EchoResponse, error) // A simple stream endpoint EchoStream(*StreamEchoRequest, GrpcCloudapi_EchoStreamServer) error } // UnimplementedGrpcCloudapiServer can be embedded to have forward compatible implementations. type UnimplementedGrpcCloudapiServer struct { } func (*UnimplementedGrpcCloudapiServer) Echo(ctx context.Context, req *EchoRequest) (*EchoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented") } func (*UnimplementedGrpcCloudapiServer) EchoWithResponseSize(ctx context.Context, req *EchoWithResponseSizeRequest) (*EchoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EchoWithResponseSize not implemented") } func (*UnimplementedGrpcCloudapiServer) EchoStream(req *StreamEchoRequest, srv GrpcCloudapi_EchoStreamServer) error { return status.Errorf(codes.Unimplemented, "method EchoStream not implemented") } func RegisterGrpcCloudapiServer(s *grpc.Server, srv GrpcCloudapiServer) { s.RegisterService(&_GrpcCloudapi_serviceDesc, srv) } func _GrpcCloudapi_Echo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(EchoRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GrpcCloudapiServer).Echo(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/e2e_service.GrpcCloudapi/Echo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GrpcCloudapiServer).Echo(ctx, req.(*EchoRequest)) } return interceptor(ctx, in, info, handler) } func _GrpcCloudapi_EchoWithResponseSize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(EchoWithResponseSizeRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GrpcCloudapiServer).EchoWithResponseSize(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/e2e_service.GrpcCloudapi/EchoWithResponseSize", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GrpcCloudapiServer).EchoWithResponseSize(ctx, req.(*EchoWithResponseSizeRequest)) } return interceptor(ctx, in, info, handler) } func _GrpcCloudapi_EchoStream_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(StreamEchoRequest) if err := stream.RecvMsg(m); err != nil { return err } return srv.(GrpcCloudapiServer).EchoStream(m, &grpcCloudapiEchoStreamServer{stream}) } type GrpcCloudapi_EchoStreamServer interface { Send(*EchoResponse) error grpc.ServerStream } type grpcCloudapiEchoStreamServer struct { grpc.ServerStream } func (x *grpcCloudapiEchoStreamServer) Send(m *EchoResponse) error { return x.ServerStream.SendMsg(m) } var _GrpcCloudapi_serviceDesc = grpc.ServiceDesc{ ServiceName: "e2e_service.GrpcCloudapi", HandlerType: (*GrpcCloudapiServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "Echo", Handler: _GrpcCloudapi_Echo_Handler, }, { MethodName: "EchoWithResponseSize", Handler: _GrpcCloudapi_EchoWithResponseSize_Handler, }, }, Streams: []grpc.StreamDesc{ { StreamName: "EchoStream", Handler: _GrpcCloudapi_EchoStream_Handler, ServerStreams: true, }, }, Metadata: "echo.proto", } grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/echo/echo/echo.proto000066400000000000000000000024031457366620600235770ustar00rootroot00000000000000syntax = "proto3"; package e2e_service; option java_package = "io.grpc.echo"; option go_package = "echo"; //import "google/api/annotations.proto"; // Request message type for simple echo. message EchoRequest { string string_to_echo = 1; } // Response message type for simple echo. message EchoResponse { string echoed_string = 1; } message EchoWithResponseSizeRequest { string echo_msg = 1; int32 response_size = 2; } message StreamEchoRequest { int32 message_count = 1; int32 message_interval = 2; } // A simple service to test and debug in an E2E environment // TODO(qixuanl): implement or change to a more complicated service service GrpcCloudapi { // A simple echo RPC returns the input string rpc Echo(EchoRequest) returns (EchoResponse) { // option (google.api.http) = { // get: "/v1/{string_to_echo}" // }; } // A simple echo RPC receives a custom response size rpc EchoWithResponseSize(EchoWithResponseSizeRequest) returns (EchoResponse) { // option (google.api.http) = { // get: "/v1/{response_size}" // }; } // A simple stream endpoint rpc EchoStream(StreamEchoRequest) returns (stream EchoResponse) { // option (google.api.http) = { // get: "/v1/stream/{message_count}/{message_interval}" // }; } } grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/000077500000000000000000000000001457366620600205155ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/.gitignore000066400000000000000000000000151457366620600225010ustar00rootroot00000000000000/googleapis/ grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/README.md000066400000000000000000000016761457366620600220060ustar00rootroot00000000000000## Regenerating protos ```sh git clone git@github.com:googleapis/googleapis.git cd googleapis protoc --go_out=plugins=grpc:.. google/storage/v1/*.proto cd .. ``` ## Example commands Use grpc API for reading a gcs object through CFE: ```sh go run main.go -bkt=gcs-grpc-team-weiranf -obj=200mb -method=media -calls=50 ``` Use grpc API for reading metadata of a gcs object through CFE: ```sh go run main.go -bkt=gcs-grpc-team-weiranf -obj=200mb -method=metadata -calls=50 ``` Use grpc API for writing a 200mb gcs object through CFE: ```sh go run main.go -bkt=gcs-grpc-team-weiranf -obj=grpc-write-200mb -method=write -size=204800 -calls=50 ``` To use DirectPath, add the arg `-dp` (VM needs to be dp enabled), for example: ```sh go run main.go -bkt=gcs-grpc-team-weiranf -obj=200mb -calls=50 -dp ``` To use HTTP JSON API, add the arg `-http`, for example: ```sh go run main.go -bkt=gcs-grpc-team-weiranf -obj=200mb -method=media -calls=50 -http ``` grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/google.golang.org/000077500000000000000000000000001457366620600240255ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/google.golang.org/genproto/000077500000000000000000000000001457366620600256625ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/google.golang.org/genproto/googleapis/000077500000000000000000000000001457366620600300135ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/google.golang.org/genproto/googleapis/storage/000077500000000000000000000000001457366620600314575ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/google.golang.org/genproto/googleapis/storage/v1/000077500000000000000000000000001457366620600320055ustar00rootroot00000000000000storage.pb.go000066400000000000000000012151451457366620600343320ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/google.golang.org/genproto/googleapis/storage/v1// Code generated by protoc-gen-go. DO NOT EDIT. // source: google/storage/v1/storage.proto package storage import ( context "context" fmt "fmt" proto "github.com/golang/protobuf/proto" empty "github.com/golang/protobuf/ptypes/empty" wrappers "github.com/golang/protobuf/ptypes/wrappers" _ "google.golang.org/genproto/googleapis/api/annotations" v1 "google.golang.org/genproto/googleapis/iam/v1" field_mask "google.golang.org/genproto/protobuf/field_mask" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" math "math" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package // A collection of constant values meaningful to the Storage API. type ServiceConstants_Values int32 const ( // Unused. Proto3 requires first enum to be 0. ServiceConstants_SIZE_UNSPECIFIED ServiceConstants_Values = 0 // The maximum size chunk that can will be returned in a single // ReadRequest. // 2 MiB. ServiceConstants_MAX_READ_CHUNK_BYTES ServiceConstants_Values = 2097152 // The maximum size chunk that can be sent in a single InsertObjectRequest. // 2 MiB. ServiceConstants_MAX_WRITE_CHUNK_BYTES ServiceConstants_Values = 2097152 // The maximum size of an object in MB - whether written in a single stream // or composed from multiple other objects. // 5 TiB. ServiceConstants_MAX_OBJECT_SIZE_MB ServiceConstants_Values = 5242880 // The maximum length field name that can be sent in a single // custom metadata field. // 1 KiB. ServiceConstants_MAX_CUSTOM_METADATA_FIELD_NAME_BYTES ServiceConstants_Values = 1024 // The maximum length field value that can be sent in a single // custom_metadata field. // 4 KiB. ServiceConstants_MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES ServiceConstants_Values = 4096 // The maximum total bytes that can be populated into all field names and // values of the custom_metadata for one object. // 8 KiB. ServiceConstants_MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES ServiceConstants_Values = 8192 // The maximum total bytes that can be populated into all bucket metadata // fields. // 20 KiB. ServiceConstants_MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES ServiceConstants_Values = 20480 // The maximum number of NotificationConfigurations that can be registered // for a given bucket. ServiceConstants_MAX_NOTIFICATION_CONFIGS_PER_BUCKET ServiceConstants_Values = 100 // The maximum number of LifecycleRules that can be registered for a given // bucket. ServiceConstants_MAX_LIFECYCLE_RULES_PER_BUCKET ServiceConstants_Values = 100 // The maximum number of custom attributes per NotificationConfig. ServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTES ServiceConstants_Values = 5 // The maximum length of a custom attribute key included in // NotificationConfig. ServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH ServiceConstants_Values = 256 // The maximum length of a custom attribute value included in a // NotificationConfig. ServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH ServiceConstants_Values = 1024 // The maximum number of key/value entries per bucket label. ServiceConstants_MAX_LABELS_ENTRIES_COUNT ServiceConstants_Values = 64 // The maximum character length of the key or value in a bucket // label map. ServiceConstants_MAX_LABELS_KEY_VALUE_LENGTH ServiceConstants_Values = 63 // The maximum byte size of the key or value in a bucket label // map. ServiceConstants_MAX_LABELS_KEY_VALUE_BYTES ServiceConstants_Values = 128 // The maximum number of object IDs that can be included in a // DeleteObjectsRequest. ServiceConstants_MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST ServiceConstants_Values = 1000 // The maximum number of days for which a token returned by the // GetListObjectsSplitPoints RPC is valid. ServiceConstants_SPLIT_TOKEN_MAX_VALID_DAYS ServiceConstants_Values = 14 ) var ServiceConstants_Values_name = map[int32]string{ 0: "SIZE_UNSPECIFIED", 2097152: "MAX_READ_CHUNK_BYTES", // Duplicate value: 2097152: "MAX_WRITE_CHUNK_BYTES", 5242880: "MAX_OBJECT_SIZE_MB", 1024: "MAX_CUSTOM_METADATA_FIELD_NAME_BYTES", 4096: "MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES", 8192: "MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES", 20480: "MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES", 100: "MAX_NOTIFICATION_CONFIGS_PER_BUCKET", // Duplicate value: 100: "MAX_LIFECYCLE_RULES_PER_BUCKET", 5: "MAX_NOTIFICATION_CUSTOM_ATTRIBUTES", 256: "MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH", // Duplicate value: 1024: "MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH", 64: "MAX_LABELS_ENTRIES_COUNT", 63: "MAX_LABELS_KEY_VALUE_LENGTH", 128: "MAX_LABELS_KEY_VALUE_BYTES", 1000: "MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST", 14: "SPLIT_TOKEN_MAX_VALID_DAYS", } var ServiceConstants_Values_value = map[string]int32{ "SIZE_UNSPECIFIED": 0, "MAX_READ_CHUNK_BYTES": 2097152, "MAX_WRITE_CHUNK_BYTES": 2097152, "MAX_OBJECT_SIZE_MB": 5242880, "MAX_CUSTOM_METADATA_FIELD_NAME_BYTES": 1024, "MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES": 4096, "MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES": 8192, "MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES": 20480, "MAX_NOTIFICATION_CONFIGS_PER_BUCKET": 100, "MAX_LIFECYCLE_RULES_PER_BUCKET": 100, "MAX_NOTIFICATION_CUSTOM_ATTRIBUTES": 5, "MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH": 256, "MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH": 1024, "MAX_LABELS_ENTRIES_COUNT": 64, "MAX_LABELS_KEY_VALUE_LENGTH": 63, "MAX_LABELS_KEY_VALUE_BYTES": 128, "MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST": 1000, "SPLIT_TOKEN_MAX_VALID_DAYS": 14, } func (x ServiceConstants_Values) String() string { return proto.EnumName(ServiceConstants_Values_name, int32(x)) } func (ServiceConstants_Values) EnumDescriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{50, 0} } // Request message for DeleteBucketAccessControl. type DeleteBucketAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // The project to be billed for this request. Required for Requester Pays // buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *DeleteBucketAccessControlRequest) Reset() { *m = DeleteBucketAccessControlRequest{} } func (m *DeleteBucketAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*DeleteBucketAccessControlRequest) ProtoMessage() {} func (*DeleteBucketAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{0} } func (m *DeleteBucketAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteBucketAccessControlRequest.Unmarshal(m, b) } func (m *DeleteBucketAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteBucketAccessControlRequest.Marshal(b, m, deterministic) } func (m *DeleteBucketAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_DeleteBucketAccessControlRequest.Merge(m, src) } func (m *DeleteBucketAccessControlRequest) XXX_Size() int { return xxx_messageInfo_DeleteBucketAccessControlRequest.Size(m) } func (m *DeleteBucketAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_DeleteBucketAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_DeleteBucketAccessControlRequest proto.InternalMessageInfo func (m *DeleteBucketAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *DeleteBucketAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *DeleteBucketAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *DeleteBucketAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for GetBucketAccessControl. type GetBucketAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // The project to be billed for this request. Required for Requester Pays // buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetBucketAccessControlRequest) Reset() { *m = GetBucketAccessControlRequest{} } func (m *GetBucketAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*GetBucketAccessControlRequest) ProtoMessage() {} func (*GetBucketAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{1} } func (m *GetBucketAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetBucketAccessControlRequest.Unmarshal(m, b) } func (m *GetBucketAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetBucketAccessControlRequest.Marshal(b, m, deterministic) } func (m *GetBucketAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_GetBucketAccessControlRequest.Merge(m, src) } func (m *GetBucketAccessControlRequest) XXX_Size() int { return xxx_messageInfo_GetBucketAccessControlRequest.Size(m) } func (m *GetBucketAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_GetBucketAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_GetBucketAccessControlRequest proto.InternalMessageInfo func (m *GetBucketAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *GetBucketAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *GetBucketAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *GetBucketAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for InsertBucketAccessControl. type InsertBucketAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The project to be billed for this request. Required for Requester Pays // buckets. UserProject string `protobuf:"bytes,2,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Properties of the new bucket access control being inserted. BucketAccessControl *BucketAccessControl `protobuf:"bytes,3,opt,name=bucket_access_control,json=bucketAccessControl,proto3" json:"bucket_access_control,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *InsertBucketAccessControlRequest) Reset() { *m = InsertBucketAccessControlRequest{} } func (m *InsertBucketAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*InsertBucketAccessControlRequest) ProtoMessage() {} func (*InsertBucketAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{2} } func (m *InsertBucketAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InsertBucketAccessControlRequest.Unmarshal(m, b) } func (m *InsertBucketAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InsertBucketAccessControlRequest.Marshal(b, m, deterministic) } func (m *InsertBucketAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_InsertBucketAccessControlRequest.Merge(m, src) } func (m *InsertBucketAccessControlRequest) XXX_Size() int { return xxx_messageInfo_InsertBucketAccessControlRequest.Size(m) } func (m *InsertBucketAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_InsertBucketAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_InsertBucketAccessControlRequest proto.InternalMessageInfo func (m *InsertBucketAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *InsertBucketAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *InsertBucketAccessControlRequest) GetBucketAccessControl() *BucketAccessControl { if m != nil { return m.BucketAccessControl } return nil } func (m *InsertBucketAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for ListBucketAccessControl. type ListBucketAccessControlsRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The project to be billed for this request. Required for Requester Pays // buckets. UserProject string `protobuf:"bytes,2,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,3,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListBucketAccessControlsRequest) Reset() { *m = ListBucketAccessControlsRequest{} } func (m *ListBucketAccessControlsRequest) String() string { return proto.CompactTextString(m) } func (*ListBucketAccessControlsRequest) ProtoMessage() {} func (*ListBucketAccessControlsRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{3} } func (m *ListBucketAccessControlsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListBucketAccessControlsRequest.Unmarshal(m, b) } func (m *ListBucketAccessControlsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListBucketAccessControlsRequest.Marshal(b, m, deterministic) } func (m *ListBucketAccessControlsRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_ListBucketAccessControlsRequest.Merge(m, src) } func (m *ListBucketAccessControlsRequest) XXX_Size() int { return xxx_messageInfo_ListBucketAccessControlsRequest.Size(m) } func (m *ListBucketAccessControlsRequest) XXX_DiscardUnknown() { xxx_messageInfo_ListBucketAccessControlsRequest.DiscardUnknown(m) } var xxx_messageInfo_ListBucketAccessControlsRequest proto.InternalMessageInfo func (m *ListBucketAccessControlsRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *ListBucketAccessControlsRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *ListBucketAccessControlsRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request for PatchBucketAccessControl. type PatchBucketAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // The project to be billed for this request. Required for Requester Pays // buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The BucketAccessControl for updating. BucketAccessControl *BucketAccessControl `protobuf:"bytes,4,opt,name=bucket_access_control,json=bucketAccessControl,proto3" json:"bucket_access_control,omitempty"` // List of fields to be updated. // // To specify ALL fields, equivalent to the JSON API's "update" function, // specify a single field with the value `*`. // // (!-- UpdateMask *field_mask.FieldMask `protobuf:"bytes,5,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,6,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *PatchBucketAccessControlRequest) Reset() { *m = PatchBucketAccessControlRequest{} } func (m *PatchBucketAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*PatchBucketAccessControlRequest) ProtoMessage() {} func (*PatchBucketAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{4} } func (m *PatchBucketAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PatchBucketAccessControlRequest.Unmarshal(m, b) } func (m *PatchBucketAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_PatchBucketAccessControlRequest.Marshal(b, m, deterministic) } func (m *PatchBucketAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_PatchBucketAccessControlRequest.Merge(m, src) } func (m *PatchBucketAccessControlRequest) XXX_Size() int { return xxx_messageInfo_PatchBucketAccessControlRequest.Size(m) } func (m *PatchBucketAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_PatchBucketAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_PatchBucketAccessControlRequest proto.InternalMessageInfo func (m *PatchBucketAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *PatchBucketAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *PatchBucketAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *PatchBucketAccessControlRequest) GetBucketAccessControl() *BucketAccessControl { if m != nil { return m.BucketAccessControl } return nil } func (m *PatchBucketAccessControlRequest) GetUpdateMask() *field_mask.FieldMask { if m != nil { return m.UpdateMask } return nil } func (m *PatchBucketAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request for UpdateBucketAccessControl. type UpdateBucketAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // The project to be billed for this request. Required for Requester Pays // buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The BucketAccessControl for updating. BucketAccessControl *BucketAccessControl `protobuf:"bytes,4,opt,name=bucket_access_control,json=bucketAccessControl,proto3" json:"bucket_access_control,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,5,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *UpdateBucketAccessControlRequest) Reset() { *m = UpdateBucketAccessControlRequest{} } func (m *UpdateBucketAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*UpdateBucketAccessControlRequest) ProtoMessage() {} func (*UpdateBucketAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{5} } func (m *UpdateBucketAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateBucketAccessControlRequest.Unmarshal(m, b) } func (m *UpdateBucketAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateBucketAccessControlRequest.Marshal(b, m, deterministic) } func (m *UpdateBucketAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_UpdateBucketAccessControlRequest.Merge(m, src) } func (m *UpdateBucketAccessControlRequest) XXX_Size() int { return xxx_messageInfo_UpdateBucketAccessControlRequest.Size(m) } func (m *UpdateBucketAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_UpdateBucketAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_UpdateBucketAccessControlRequest proto.InternalMessageInfo func (m *UpdateBucketAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *UpdateBucketAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *UpdateBucketAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *UpdateBucketAccessControlRequest) GetBucketAccessControl() *BucketAccessControl { if m != nil { return m.BucketAccessControl } return nil } func (m *UpdateBucketAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for DeleteBucket. type DeleteBucketRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // If set, only deletes the bucket if its metageneration matches this value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // If set, only deletes the bucket if its metageneration does not match this // value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // The project to be billed for this request. Required for Requester Pays // buckets. UserProject string `protobuf:"bytes,4,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,5,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *DeleteBucketRequest) Reset() { *m = DeleteBucketRequest{} } func (m *DeleteBucketRequest) String() string { return proto.CompactTextString(m) } func (*DeleteBucketRequest) ProtoMessage() {} func (*DeleteBucketRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{6} } func (m *DeleteBucketRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteBucketRequest.Unmarshal(m, b) } func (m *DeleteBucketRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteBucketRequest.Marshal(b, m, deterministic) } func (m *DeleteBucketRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_DeleteBucketRequest.Merge(m, src) } func (m *DeleteBucketRequest) XXX_Size() int { return xxx_messageInfo_DeleteBucketRequest.Size(m) } func (m *DeleteBucketRequest) XXX_DiscardUnknown() { xxx_messageInfo_DeleteBucketRequest.DiscardUnknown(m) } var xxx_messageInfo_DeleteBucketRequest proto.InternalMessageInfo func (m *DeleteBucketRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *DeleteBucketRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *DeleteBucketRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *DeleteBucketRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *DeleteBucketRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for GetBucket. type GetBucketRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Makes the return of the bucket metadata conditional on whether the bucket's // current metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the return of the bucket metadata conditional on whether the bucket's // current metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Set of properties to return. Defaults to NO_ACL. Projection CommonEnums_Projection `protobuf:"varint,4,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. Required for Requester Pays // buckets. UserProject string `protobuf:"bytes,5,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,6,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetBucketRequest) Reset() { *m = GetBucketRequest{} } func (m *GetBucketRequest) String() string { return proto.CompactTextString(m) } func (*GetBucketRequest) ProtoMessage() {} func (*GetBucketRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{7} } func (m *GetBucketRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetBucketRequest.Unmarshal(m, b) } func (m *GetBucketRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetBucketRequest.Marshal(b, m, deterministic) } func (m *GetBucketRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_GetBucketRequest.Merge(m, src) } func (m *GetBucketRequest) XXX_Size() int { return xxx_messageInfo_GetBucketRequest.Size(m) } func (m *GetBucketRequest) XXX_DiscardUnknown() { xxx_messageInfo_GetBucketRequest.DiscardUnknown(m) } var xxx_messageInfo_GetBucketRequest proto.InternalMessageInfo func (m *GetBucketRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *GetBucketRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *GetBucketRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *GetBucketRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *GetBucketRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *GetBucketRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for InsertBucket. type InsertBucketRequest struct { // Apply a predefined set of access controls to this bucket. PredefinedAcl CommonEnums_PredefinedBucketAcl `protobuf:"varint,1,opt,name=predefined_acl,json=predefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedBucketAcl" json:"predefined_acl,omitempty"` // Apply a predefined set of default object access controls to this bucket. PredefinedDefaultObjectAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,2,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"predefined_default_object_acl,omitempty"` // A valid API project identifier. // Required. Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` // Set of properties to return. Defaults to NO_ACL, unless the // bucket resource specifies acl or defaultObjectAcl // properties, when it defaults to FULL. Projection CommonEnums_Projection `protobuf:"varint,4,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. UserProject string `protobuf:"bytes,5,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Properties of the new bucket being inserted, including its name. Bucket *Bucket `protobuf:"bytes,6,opt,name=bucket,proto3" json:"bucket,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,7,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *InsertBucketRequest) Reset() { *m = InsertBucketRequest{} } func (m *InsertBucketRequest) String() string { return proto.CompactTextString(m) } func (*InsertBucketRequest) ProtoMessage() {} func (*InsertBucketRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{8} } func (m *InsertBucketRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InsertBucketRequest.Unmarshal(m, b) } func (m *InsertBucketRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InsertBucketRequest.Marshal(b, m, deterministic) } func (m *InsertBucketRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_InsertBucketRequest.Merge(m, src) } func (m *InsertBucketRequest) XXX_Size() int { return xxx_messageInfo_InsertBucketRequest.Size(m) } func (m *InsertBucketRequest) XXX_DiscardUnknown() { xxx_messageInfo_InsertBucketRequest.DiscardUnknown(m) } var xxx_messageInfo_InsertBucketRequest proto.InternalMessageInfo func (m *InsertBucketRequest) GetPredefinedAcl() CommonEnums_PredefinedBucketAcl { if m != nil { return m.PredefinedAcl } return CommonEnums_PREDEFINED_BUCKET_ACL_UNSPECIFIED } func (m *InsertBucketRequest) GetPredefinedDefaultObjectAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.PredefinedDefaultObjectAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *InsertBucketRequest) GetProject() string { if m != nil { return m.Project } return "" } func (m *InsertBucketRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *InsertBucketRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *InsertBucketRequest) GetBucket() *Bucket { if m != nil { return m.Bucket } return nil } func (m *InsertBucketRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for ListBuckets. type ListBucketsRequest struct { // Maximum number of buckets to return in a single response. The service will // use this parameter or 1,000 items, whichever is smaller. MaxResults int32 `protobuf:"varint,1,opt,name=max_results,json=maxResults,proto3" json:"max_results,omitempty"` // A previously-returned page token representing part of the larger set of // results to view. PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // Filter results to buckets whose names begin with this prefix. Prefix string `protobuf:"bytes,3,opt,name=prefix,proto3" json:"prefix,omitempty"` // A valid API project identifier. // Required. Project string `protobuf:"bytes,4,opt,name=project,proto3" json:"project,omitempty"` // Set of properties to return. Defaults to NO_ACL. Projection CommonEnums_Projection `protobuf:"varint,5,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. UserProject string `protobuf:"bytes,6,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,7,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListBucketsRequest) Reset() { *m = ListBucketsRequest{} } func (m *ListBucketsRequest) String() string { return proto.CompactTextString(m) } func (*ListBucketsRequest) ProtoMessage() {} func (*ListBucketsRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{9} } func (m *ListBucketsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListBucketsRequest.Unmarshal(m, b) } func (m *ListBucketsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListBucketsRequest.Marshal(b, m, deterministic) } func (m *ListBucketsRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_ListBucketsRequest.Merge(m, src) } func (m *ListBucketsRequest) XXX_Size() int { return xxx_messageInfo_ListBucketsRequest.Size(m) } func (m *ListBucketsRequest) XXX_DiscardUnknown() { xxx_messageInfo_ListBucketsRequest.DiscardUnknown(m) } var xxx_messageInfo_ListBucketsRequest proto.InternalMessageInfo func (m *ListBucketsRequest) GetMaxResults() int32 { if m != nil { return m.MaxResults } return 0 } func (m *ListBucketsRequest) GetPageToken() string { if m != nil { return m.PageToken } return "" } func (m *ListBucketsRequest) GetPrefix() string { if m != nil { return m.Prefix } return "" } func (m *ListBucketsRequest) GetProject() string { if m != nil { return m.Project } return "" } func (m *ListBucketsRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *ListBucketsRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *ListBucketsRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for LockRetentionPolicy. type LockRetentionPolicyRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Makes the operation conditional on whether bucket's current metageneration // matches the given value. Must be positive. IfMetagenerationMatch int64 `protobuf:"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *LockRetentionPolicyRequest) Reset() { *m = LockRetentionPolicyRequest{} } func (m *LockRetentionPolicyRequest) String() string { return proto.CompactTextString(m) } func (*LockRetentionPolicyRequest) ProtoMessage() {} func (*LockRetentionPolicyRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{10} } func (m *LockRetentionPolicyRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LockRetentionPolicyRequest.Unmarshal(m, b) } func (m *LockRetentionPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_LockRetentionPolicyRequest.Marshal(b, m, deterministic) } func (m *LockRetentionPolicyRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_LockRetentionPolicyRequest.Merge(m, src) } func (m *LockRetentionPolicyRequest) XXX_Size() int { return xxx_messageInfo_LockRetentionPolicyRequest.Size(m) } func (m *LockRetentionPolicyRequest) XXX_DiscardUnknown() { xxx_messageInfo_LockRetentionPolicyRequest.DiscardUnknown(m) } var xxx_messageInfo_LockRetentionPolicyRequest proto.InternalMessageInfo func (m *LockRetentionPolicyRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *LockRetentionPolicyRequest) GetIfMetagenerationMatch() int64 { if m != nil { return m.IfMetagenerationMatch } return 0 } func (m *LockRetentionPolicyRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *LockRetentionPolicyRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request for PatchBucket method. type PatchBucketRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Makes the return of the bucket metadata conditional on whether the bucket's // current metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the return of the bucket metadata conditional on whether the bucket's // current metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Apply a predefined set of access controls to this bucket. PredefinedAcl CommonEnums_PredefinedBucketAcl `protobuf:"varint,4,opt,name=predefined_acl,json=predefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedBucketAcl" json:"predefined_acl,omitempty"` // Apply a predefined set of default object access controls to this bucket. PredefinedDefaultObjectAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,5,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"predefined_default_object_acl,omitempty"` // Set of properties to return. Defaults to FULL. Projection CommonEnums_Projection `protobuf:"varint,6,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,7,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The Bucket metadata for updating. Metadata *Bucket `protobuf:"bytes,8,opt,name=metadata,proto3" json:"metadata,omitempty"` // List of fields to be updated. // // To specify ALL fields, equivalent to the JSON API's "update" function, // specify a single field with the value `*`. Note: not recommended. If a new // field is introduced at a later time, an older client updating with the `*` // may accidentally reset the new field's value. // // Not specifying any fields is an error. // Not specifying a field while setting that field to a non-default value is // an error. UpdateMask *field_mask.FieldMask `protobuf:"bytes,9,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,10,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *PatchBucketRequest) Reset() { *m = PatchBucketRequest{} } func (m *PatchBucketRequest) String() string { return proto.CompactTextString(m) } func (*PatchBucketRequest) ProtoMessage() {} func (*PatchBucketRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{11} } func (m *PatchBucketRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PatchBucketRequest.Unmarshal(m, b) } func (m *PatchBucketRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_PatchBucketRequest.Marshal(b, m, deterministic) } func (m *PatchBucketRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_PatchBucketRequest.Merge(m, src) } func (m *PatchBucketRequest) XXX_Size() int { return xxx_messageInfo_PatchBucketRequest.Size(m) } func (m *PatchBucketRequest) XXX_DiscardUnknown() { xxx_messageInfo_PatchBucketRequest.DiscardUnknown(m) } var xxx_messageInfo_PatchBucketRequest proto.InternalMessageInfo func (m *PatchBucketRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *PatchBucketRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *PatchBucketRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *PatchBucketRequest) GetPredefinedAcl() CommonEnums_PredefinedBucketAcl { if m != nil { return m.PredefinedAcl } return CommonEnums_PREDEFINED_BUCKET_ACL_UNSPECIFIED } func (m *PatchBucketRequest) GetPredefinedDefaultObjectAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.PredefinedDefaultObjectAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *PatchBucketRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *PatchBucketRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *PatchBucketRequest) GetMetadata() *Bucket { if m != nil { return m.Metadata } return nil } func (m *PatchBucketRequest) GetUpdateMask() *field_mask.FieldMask { if m != nil { return m.UpdateMask } return nil } func (m *PatchBucketRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request for UpdateBucket method. type UpdateBucketRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Makes the return of the bucket metadata conditional on whether the bucket's // current metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the return of the bucket metadata conditional on whether the bucket's // current metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Apply a predefined set of access controls to this bucket. PredefinedAcl CommonEnums_PredefinedBucketAcl `protobuf:"varint,4,opt,name=predefined_acl,json=predefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedBucketAcl" json:"predefined_acl,omitempty"` // Apply a predefined set of default object access controls to this bucket. PredefinedDefaultObjectAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,5,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"predefined_default_object_acl,omitempty"` // Set of properties to return. Defaults to FULL. Projection CommonEnums_Projection `protobuf:"varint,6,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,7,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The Bucket metadata for updating. Metadata *Bucket `protobuf:"bytes,8,opt,name=metadata,proto3" json:"metadata,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,9,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *UpdateBucketRequest) Reset() { *m = UpdateBucketRequest{} } func (m *UpdateBucketRequest) String() string { return proto.CompactTextString(m) } func (*UpdateBucketRequest) ProtoMessage() {} func (*UpdateBucketRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{12} } func (m *UpdateBucketRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateBucketRequest.Unmarshal(m, b) } func (m *UpdateBucketRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateBucketRequest.Marshal(b, m, deterministic) } func (m *UpdateBucketRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_UpdateBucketRequest.Merge(m, src) } func (m *UpdateBucketRequest) XXX_Size() int { return xxx_messageInfo_UpdateBucketRequest.Size(m) } func (m *UpdateBucketRequest) XXX_DiscardUnknown() { xxx_messageInfo_UpdateBucketRequest.DiscardUnknown(m) } var xxx_messageInfo_UpdateBucketRequest proto.InternalMessageInfo func (m *UpdateBucketRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *UpdateBucketRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *UpdateBucketRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *UpdateBucketRequest) GetPredefinedAcl() CommonEnums_PredefinedBucketAcl { if m != nil { return m.PredefinedAcl } return CommonEnums_PREDEFINED_BUCKET_ACL_UNSPECIFIED } func (m *UpdateBucketRequest) GetPredefinedDefaultObjectAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.PredefinedDefaultObjectAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *UpdateBucketRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *UpdateBucketRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *UpdateBucketRequest) GetMetadata() *Bucket { if m != nil { return m.Metadata } return nil } func (m *UpdateBucketRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for StopChannel. type StopChannelRequest struct { // The channel to be stopped. Channel *Channel `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,2,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *StopChannelRequest) Reset() { *m = StopChannelRequest{} } func (m *StopChannelRequest) String() string { return proto.CompactTextString(m) } func (*StopChannelRequest) ProtoMessage() {} func (*StopChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{13} } func (m *StopChannelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopChannelRequest.Unmarshal(m, b) } func (m *StopChannelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StopChannelRequest.Marshal(b, m, deterministic) } func (m *StopChannelRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_StopChannelRequest.Merge(m, src) } func (m *StopChannelRequest) XXX_Size() int { return xxx_messageInfo_StopChannelRequest.Size(m) } func (m *StopChannelRequest) XXX_DiscardUnknown() { xxx_messageInfo_StopChannelRequest.DiscardUnknown(m) } var xxx_messageInfo_StopChannelRequest proto.InternalMessageInfo func (m *StopChannelRequest) GetChannel() *Channel { if m != nil { return m.Channel } return nil } func (m *StopChannelRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for DeleteDefaultObjectAccessControl. type DeleteDefaultObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *DeleteDefaultObjectAccessControlRequest) Reset() { *m = DeleteDefaultObjectAccessControlRequest{} } func (m *DeleteDefaultObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*DeleteDefaultObjectAccessControlRequest) ProtoMessage() {} func (*DeleteDefaultObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{14} } func (m *DeleteDefaultObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteDefaultObjectAccessControlRequest.Unmarshal(m, b) } func (m *DeleteDefaultObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteDefaultObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *DeleteDefaultObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_DeleteDefaultObjectAccessControlRequest.Merge(m, src) } func (m *DeleteDefaultObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_DeleteDefaultObjectAccessControlRequest.Size(m) } func (m *DeleteDefaultObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_DeleteDefaultObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_DeleteDefaultObjectAccessControlRequest proto.InternalMessageInfo func (m *DeleteDefaultObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *DeleteDefaultObjectAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *DeleteDefaultObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *DeleteDefaultObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for GetDefaultObjectAccessControl. type GetDefaultObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetDefaultObjectAccessControlRequest) Reset() { *m = GetDefaultObjectAccessControlRequest{} } func (m *GetDefaultObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*GetDefaultObjectAccessControlRequest) ProtoMessage() {} func (*GetDefaultObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{15} } func (m *GetDefaultObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetDefaultObjectAccessControlRequest.Unmarshal(m, b) } func (m *GetDefaultObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetDefaultObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *GetDefaultObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_GetDefaultObjectAccessControlRequest.Merge(m, src) } func (m *GetDefaultObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_GetDefaultObjectAccessControlRequest.Size(m) } func (m *GetDefaultObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_GetDefaultObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_GetDefaultObjectAccessControlRequest proto.InternalMessageInfo func (m *GetDefaultObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *GetDefaultObjectAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *GetDefaultObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *GetDefaultObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for InsertDefaultObjectAccessControl. type InsertDefaultObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,2,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Properties of the object access control being inserted. ObjectAccessControl *ObjectAccessControl `protobuf:"bytes,3,opt,name=object_access_control,json=objectAccessControl,proto3" json:"object_access_control,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *InsertDefaultObjectAccessControlRequest) Reset() { *m = InsertDefaultObjectAccessControlRequest{} } func (m *InsertDefaultObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*InsertDefaultObjectAccessControlRequest) ProtoMessage() {} func (*InsertDefaultObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{16} } func (m *InsertDefaultObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InsertDefaultObjectAccessControlRequest.Unmarshal(m, b) } func (m *InsertDefaultObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InsertDefaultObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *InsertDefaultObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_InsertDefaultObjectAccessControlRequest.Merge(m, src) } func (m *InsertDefaultObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_InsertDefaultObjectAccessControlRequest.Size(m) } func (m *InsertDefaultObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_InsertDefaultObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_InsertDefaultObjectAccessControlRequest proto.InternalMessageInfo func (m *InsertDefaultObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *InsertDefaultObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *InsertDefaultObjectAccessControlRequest) GetObjectAccessControl() *ObjectAccessControl { if m != nil { return m.ObjectAccessControl } return nil } func (m *InsertDefaultObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for ListDefaultObjectAccessControls. type ListDefaultObjectAccessControlsRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // If present, only return default ACL listing if the bucket's current // metageneration matches this value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // If present, only return default ACL listing if the bucket's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,4,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,5,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListDefaultObjectAccessControlsRequest) Reset() { *m = ListDefaultObjectAccessControlsRequest{} } func (m *ListDefaultObjectAccessControlsRequest) String() string { return proto.CompactTextString(m) } func (*ListDefaultObjectAccessControlsRequest) ProtoMessage() {} func (*ListDefaultObjectAccessControlsRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{17} } func (m *ListDefaultObjectAccessControlsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListDefaultObjectAccessControlsRequest.Unmarshal(m, b) } func (m *ListDefaultObjectAccessControlsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListDefaultObjectAccessControlsRequest.Marshal(b, m, deterministic) } func (m *ListDefaultObjectAccessControlsRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_ListDefaultObjectAccessControlsRequest.Merge(m, src) } func (m *ListDefaultObjectAccessControlsRequest) XXX_Size() int { return xxx_messageInfo_ListDefaultObjectAccessControlsRequest.Size(m) } func (m *ListDefaultObjectAccessControlsRequest) XXX_DiscardUnknown() { xxx_messageInfo_ListDefaultObjectAccessControlsRequest.DiscardUnknown(m) } var xxx_messageInfo_ListDefaultObjectAccessControlsRequest proto.InternalMessageInfo func (m *ListDefaultObjectAccessControlsRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *ListDefaultObjectAccessControlsRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *ListDefaultObjectAccessControlsRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *ListDefaultObjectAccessControlsRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *ListDefaultObjectAccessControlsRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for PatchDefaultObjectAccessControl. type PatchDefaultObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The ObjectAccessControl for updating. ObjectAccessControl *ObjectAccessControl `protobuf:"bytes,4,opt,name=object_access_control,json=objectAccessControl,proto3" json:"object_access_control,omitempty"` // List of fields to be updated. // // To specify ALL fields, equivalent to the JSON API's "update" function, // specify a single field with the value `*`. Note: not recommended. If a new // field is introduced at a later time, an older client updating with the `*` // may accidentally reset the new field's value. // // Not specifying any fields is an error. // Not specifying a field while setting that field to a non-default value is // an error. UpdateMask *field_mask.FieldMask `protobuf:"bytes,5,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,6,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *PatchDefaultObjectAccessControlRequest) Reset() { *m = PatchDefaultObjectAccessControlRequest{} } func (m *PatchDefaultObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*PatchDefaultObjectAccessControlRequest) ProtoMessage() {} func (*PatchDefaultObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{18} } func (m *PatchDefaultObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PatchDefaultObjectAccessControlRequest.Unmarshal(m, b) } func (m *PatchDefaultObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_PatchDefaultObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *PatchDefaultObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_PatchDefaultObjectAccessControlRequest.Merge(m, src) } func (m *PatchDefaultObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_PatchDefaultObjectAccessControlRequest.Size(m) } func (m *PatchDefaultObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_PatchDefaultObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_PatchDefaultObjectAccessControlRequest proto.InternalMessageInfo func (m *PatchDefaultObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *PatchDefaultObjectAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *PatchDefaultObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *PatchDefaultObjectAccessControlRequest) GetObjectAccessControl() *ObjectAccessControl { if m != nil { return m.ObjectAccessControl } return nil } func (m *PatchDefaultObjectAccessControlRequest) GetUpdateMask() *field_mask.FieldMask { if m != nil { return m.UpdateMask } return nil } func (m *PatchDefaultObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for UpdateDefaultObjectAccessControl. type UpdateDefaultObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The ObjectAccessControl for updating. ObjectAccessControl *ObjectAccessControl `protobuf:"bytes,4,opt,name=object_access_control,json=objectAccessControl,proto3" json:"object_access_control,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,5,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *UpdateDefaultObjectAccessControlRequest) Reset() { *m = UpdateDefaultObjectAccessControlRequest{} } func (m *UpdateDefaultObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*UpdateDefaultObjectAccessControlRequest) ProtoMessage() {} func (*UpdateDefaultObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{19} } func (m *UpdateDefaultObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateDefaultObjectAccessControlRequest.Unmarshal(m, b) } func (m *UpdateDefaultObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateDefaultObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *UpdateDefaultObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_UpdateDefaultObjectAccessControlRequest.Merge(m, src) } func (m *UpdateDefaultObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_UpdateDefaultObjectAccessControlRequest.Size(m) } func (m *UpdateDefaultObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_UpdateDefaultObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_UpdateDefaultObjectAccessControlRequest proto.InternalMessageInfo func (m *UpdateDefaultObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *UpdateDefaultObjectAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *UpdateDefaultObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *UpdateDefaultObjectAccessControlRequest) GetObjectAccessControl() *ObjectAccessControl { if m != nil { return m.ObjectAccessControl } return nil } func (m *UpdateDefaultObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for DeleteNotification. type DeleteNotificationRequest struct { // The parent bucket of the notification. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // ID of the notification to delete. // Required. Notification string `protobuf:"bytes,2,opt,name=notification,proto3" json:"notification,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *DeleteNotificationRequest) Reset() { *m = DeleteNotificationRequest{} } func (m *DeleteNotificationRequest) String() string { return proto.CompactTextString(m) } func (*DeleteNotificationRequest) ProtoMessage() {} func (*DeleteNotificationRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{20} } func (m *DeleteNotificationRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteNotificationRequest.Unmarshal(m, b) } func (m *DeleteNotificationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteNotificationRequest.Marshal(b, m, deterministic) } func (m *DeleteNotificationRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_DeleteNotificationRequest.Merge(m, src) } func (m *DeleteNotificationRequest) XXX_Size() int { return xxx_messageInfo_DeleteNotificationRequest.Size(m) } func (m *DeleteNotificationRequest) XXX_DiscardUnknown() { xxx_messageInfo_DeleteNotificationRequest.DiscardUnknown(m) } var xxx_messageInfo_DeleteNotificationRequest proto.InternalMessageInfo func (m *DeleteNotificationRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *DeleteNotificationRequest) GetNotification() string { if m != nil { return m.Notification } return "" } func (m *DeleteNotificationRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *DeleteNotificationRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for GetNotification. type GetNotificationRequest struct { // The parent bucket of the notification. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Notification ID. // Required. Notification string `protobuf:"bytes,2,opt,name=notification,proto3" json:"notification,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,3,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetNotificationRequest) Reset() { *m = GetNotificationRequest{} } func (m *GetNotificationRequest) String() string { return proto.CompactTextString(m) } func (*GetNotificationRequest) ProtoMessage() {} func (*GetNotificationRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{21} } func (m *GetNotificationRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetNotificationRequest.Unmarshal(m, b) } func (m *GetNotificationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetNotificationRequest.Marshal(b, m, deterministic) } func (m *GetNotificationRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_GetNotificationRequest.Merge(m, src) } func (m *GetNotificationRequest) XXX_Size() int { return xxx_messageInfo_GetNotificationRequest.Size(m) } func (m *GetNotificationRequest) XXX_DiscardUnknown() { xxx_messageInfo_GetNotificationRequest.DiscardUnknown(m) } var xxx_messageInfo_GetNotificationRequest proto.InternalMessageInfo func (m *GetNotificationRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *GetNotificationRequest) GetNotification() string { if m != nil { return m.Notification } return "" } func (m *GetNotificationRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *GetNotificationRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for InsertNotification. type InsertNotificationRequest struct { // The parent bucket of the notification. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,2,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Properties of the notification to be inserted. Notification *Notification `protobuf:"bytes,3,opt,name=notification,proto3" json:"notification,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *InsertNotificationRequest) Reset() { *m = InsertNotificationRequest{} } func (m *InsertNotificationRequest) String() string { return proto.CompactTextString(m) } func (*InsertNotificationRequest) ProtoMessage() {} func (*InsertNotificationRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{22} } func (m *InsertNotificationRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InsertNotificationRequest.Unmarshal(m, b) } func (m *InsertNotificationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InsertNotificationRequest.Marshal(b, m, deterministic) } func (m *InsertNotificationRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_InsertNotificationRequest.Merge(m, src) } func (m *InsertNotificationRequest) XXX_Size() int { return xxx_messageInfo_InsertNotificationRequest.Size(m) } func (m *InsertNotificationRequest) XXX_DiscardUnknown() { xxx_messageInfo_InsertNotificationRequest.DiscardUnknown(m) } var xxx_messageInfo_InsertNotificationRequest proto.InternalMessageInfo func (m *InsertNotificationRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *InsertNotificationRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *InsertNotificationRequest) GetNotification() *Notification { if m != nil { return m.Notification } return nil } func (m *InsertNotificationRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for ListNotifications. type ListNotificationsRequest struct { // Name of a Google Cloud Storage bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,2,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,3,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListNotificationsRequest) Reset() { *m = ListNotificationsRequest{} } func (m *ListNotificationsRequest) String() string { return proto.CompactTextString(m) } func (*ListNotificationsRequest) ProtoMessage() {} func (*ListNotificationsRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{23} } func (m *ListNotificationsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListNotificationsRequest.Unmarshal(m, b) } func (m *ListNotificationsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListNotificationsRequest.Marshal(b, m, deterministic) } func (m *ListNotificationsRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_ListNotificationsRequest.Merge(m, src) } func (m *ListNotificationsRequest) XXX_Size() int { return xxx_messageInfo_ListNotificationsRequest.Size(m) } func (m *ListNotificationsRequest) XXX_DiscardUnknown() { xxx_messageInfo_ListNotificationsRequest.DiscardUnknown(m) } var xxx_messageInfo_ListNotificationsRequest proto.InternalMessageInfo func (m *ListNotificationsRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *ListNotificationsRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *ListNotificationsRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for DeleteObjectAccessControl. type DeleteObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // Name of the object. // Required. Object string `protobuf:"bytes,3,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,4,opt,name=generation,proto3" json:"generation,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,5,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,6,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *DeleteObjectAccessControlRequest) Reset() { *m = DeleteObjectAccessControlRequest{} } func (m *DeleteObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*DeleteObjectAccessControlRequest) ProtoMessage() {} func (*DeleteObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{24} } func (m *DeleteObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteObjectAccessControlRequest.Unmarshal(m, b) } func (m *DeleteObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *DeleteObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_DeleteObjectAccessControlRequest.Merge(m, src) } func (m *DeleteObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_DeleteObjectAccessControlRequest.Size(m) } func (m *DeleteObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_DeleteObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_DeleteObjectAccessControlRequest proto.InternalMessageInfo func (m *DeleteObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *DeleteObjectAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *DeleteObjectAccessControlRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *DeleteObjectAccessControlRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *DeleteObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *DeleteObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for GetObjectAccessControl. type GetObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // Name of the object. // Required. Object string `protobuf:"bytes,3,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,4,opt,name=generation,proto3" json:"generation,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,5,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,6,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetObjectAccessControlRequest) Reset() { *m = GetObjectAccessControlRequest{} } func (m *GetObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*GetObjectAccessControlRequest) ProtoMessage() {} func (*GetObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{25} } func (m *GetObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetObjectAccessControlRequest.Unmarshal(m, b) } func (m *GetObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *GetObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_GetObjectAccessControlRequest.Merge(m, src) } func (m *GetObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_GetObjectAccessControlRequest.Size(m) } func (m *GetObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_GetObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_GetObjectAccessControlRequest proto.InternalMessageInfo func (m *GetObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *GetObjectAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *GetObjectAccessControlRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *GetObjectAccessControlRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *GetObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *GetObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for InsertObjectAccessControl. type InsertObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Name of the object. // Required. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,4,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Properties of the object access control to be inserted. ObjectAccessControl *ObjectAccessControl `protobuf:"bytes,5,opt,name=object_access_control,json=objectAccessControl,proto3" json:"object_access_control,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,6,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *InsertObjectAccessControlRequest) Reset() { *m = InsertObjectAccessControlRequest{} } func (m *InsertObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*InsertObjectAccessControlRequest) ProtoMessage() {} func (*InsertObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{26} } func (m *InsertObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InsertObjectAccessControlRequest.Unmarshal(m, b) } func (m *InsertObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InsertObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *InsertObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_InsertObjectAccessControlRequest.Merge(m, src) } func (m *InsertObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_InsertObjectAccessControlRequest.Size(m) } func (m *InsertObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_InsertObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_InsertObjectAccessControlRequest proto.InternalMessageInfo func (m *InsertObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *InsertObjectAccessControlRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *InsertObjectAccessControlRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *InsertObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *InsertObjectAccessControlRequest) GetObjectAccessControl() *ObjectAccessControl { if m != nil { return m.ObjectAccessControl } return nil } func (m *InsertObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for ListObjectAccessControls. type ListObjectAccessControlsRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Name of the object. // Required. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,4,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,5,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListObjectAccessControlsRequest) Reset() { *m = ListObjectAccessControlsRequest{} } func (m *ListObjectAccessControlsRequest) String() string { return proto.CompactTextString(m) } func (*ListObjectAccessControlsRequest) ProtoMessage() {} func (*ListObjectAccessControlsRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{27} } func (m *ListObjectAccessControlsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListObjectAccessControlsRequest.Unmarshal(m, b) } func (m *ListObjectAccessControlsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListObjectAccessControlsRequest.Marshal(b, m, deterministic) } func (m *ListObjectAccessControlsRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_ListObjectAccessControlsRequest.Merge(m, src) } func (m *ListObjectAccessControlsRequest) XXX_Size() int { return xxx_messageInfo_ListObjectAccessControlsRequest.Size(m) } func (m *ListObjectAccessControlsRequest) XXX_DiscardUnknown() { xxx_messageInfo_ListObjectAccessControlsRequest.DiscardUnknown(m) } var xxx_messageInfo_ListObjectAccessControlsRequest proto.InternalMessageInfo func (m *ListObjectAccessControlsRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *ListObjectAccessControlsRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *ListObjectAccessControlsRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *ListObjectAccessControlsRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *ListObjectAccessControlsRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for UpdateObjetAccessControl. type UpdateObjectAccessControlRequest struct { // Name of a bucket. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission. Can be // user-userId, // user-emailAddress, // group-groupId, // group-emailAddress, allUsers, or // allAuthenticatedUsers. // Required. Entity string `protobuf:"bytes,2,opt,name=entity,proto3" json:"entity,omitempty"` // Name of the object. // Required. Object string `protobuf:"bytes,3,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,4,opt,name=generation,proto3" json:"generation,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,5,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The ObjectAccessControl for updating. ObjectAccessControl *ObjectAccessControl `protobuf:"bytes,6,opt,name=object_access_control,json=objectAccessControl,proto3" json:"object_access_control,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,7,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` // List of fields to be updated. // // To specify ALL fields, equivalent to the JSON API's "update" function, // specify a single field with the value `*`. Note: not recommended. If a new // field is introduced at a later time, an older client updating with the `*` // may accidentally reset the new field's value. // // Not specifying any fields is an error. // Not specifying a field while setting that field to a non-default value is // an error. UpdateMask *field_mask.FieldMask `protobuf:"bytes,8,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *UpdateObjectAccessControlRequest) Reset() { *m = UpdateObjectAccessControlRequest{} } func (m *UpdateObjectAccessControlRequest) String() string { return proto.CompactTextString(m) } func (*UpdateObjectAccessControlRequest) ProtoMessage() {} func (*UpdateObjectAccessControlRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{28} } func (m *UpdateObjectAccessControlRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateObjectAccessControlRequest.Unmarshal(m, b) } func (m *UpdateObjectAccessControlRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateObjectAccessControlRequest.Marshal(b, m, deterministic) } func (m *UpdateObjectAccessControlRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_UpdateObjectAccessControlRequest.Merge(m, src) } func (m *UpdateObjectAccessControlRequest) XXX_Size() int { return xxx_messageInfo_UpdateObjectAccessControlRequest.Size(m) } func (m *UpdateObjectAccessControlRequest) XXX_DiscardUnknown() { xxx_messageInfo_UpdateObjectAccessControlRequest.DiscardUnknown(m) } var xxx_messageInfo_UpdateObjectAccessControlRequest proto.InternalMessageInfo func (m *UpdateObjectAccessControlRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *UpdateObjectAccessControlRequest) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *UpdateObjectAccessControlRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *UpdateObjectAccessControlRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *UpdateObjectAccessControlRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *UpdateObjectAccessControlRequest) GetObjectAccessControl() *ObjectAccessControl { if m != nil { return m.ObjectAccessControl } return nil } func (m *UpdateObjectAccessControlRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } func (m *UpdateObjectAccessControlRequest) GetUpdateMask() *field_mask.FieldMask { if m != nil { return m.UpdateMask } return nil } // Request message for ComposeObject. type ComposeObjectRequest struct { // Name of the bucket containing the source objects. The destination object is // stored in this bucket. // Required. DestinationBucket string `protobuf:"bytes,1,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"` // Name of the new object. // Required. DestinationObject string `protobuf:"bytes,2,opt,name=destination_object,json=destinationObject,proto3" json:"destination_object,omitempty"` // Apply a predefined set of access controls to the destination object. DestinationPredefinedAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,3,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"destination_predefined_acl,omitempty"` // Properties of the resulting object. Destination *Object `protobuf:"bytes,11,opt,name=destination,proto3" json:"destination,omitempty"` // The list of source objects that will be concatenated into a single object. SourceObjects []*ComposeObjectRequest_SourceObjects `protobuf:"bytes,12,rep,name=source_objects,json=sourceObjects,proto3" json:"source_objects,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,5,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Resource name of the Cloud KMS key, of the form // projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key, // that will be used to encrypt the object. Overrides the object // metadata's kms_key_name value, if any. KmsKeyName string `protobuf:"bytes,6,opt,name=kms_key_name,json=kmsKeyName,proto3" json:"kms_key_name,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,7,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,9,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,10,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ComposeObjectRequest) Reset() { *m = ComposeObjectRequest{} } func (m *ComposeObjectRequest) String() string { return proto.CompactTextString(m) } func (*ComposeObjectRequest) ProtoMessage() {} func (*ComposeObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{29} } func (m *ComposeObjectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ComposeObjectRequest.Unmarshal(m, b) } func (m *ComposeObjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ComposeObjectRequest.Marshal(b, m, deterministic) } func (m *ComposeObjectRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_ComposeObjectRequest.Merge(m, src) } func (m *ComposeObjectRequest) XXX_Size() int { return xxx_messageInfo_ComposeObjectRequest.Size(m) } func (m *ComposeObjectRequest) XXX_DiscardUnknown() { xxx_messageInfo_ComposeObjectRequest.DiscardUnknown(m) } var xxx_messageInfo_ComposeObjectRequest proto.InternalMessageInfo func (m *ComposeObjectRequest) GetDestinationBucket() string { if m != nil { return m.DestinationBucket } return "" } func (m *ComposeObjectRequest) GetDestinationObject() string { if m != nil { return m.DestinationObject } return "" } func (m *ComposeObjectRequest) GetDestinationPredefinedAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.DestinationPredefinedAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *ComposeObjectRequest) GetDestination() *Object { if m != nil { return m.Destination } return nil } func (m *ComposeObjectRequest) GetSourceObjects() []*ComposeObjectRequest_SourceObjects { if m != nil { return m.SourceObjects } return nil } func (m *ComposeObjectRequest) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *ComposeObjectRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *ComposeObjectRequest) GetKmsKeyName() string { if m != nil { return m.KmsKeyName } return "" } func (m *ComposeObjectRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *ComposeObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *ComposeObjectRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Description of a source object for a composition request. type ComposeObjectRequest_SourceObjects struct { // The source object's name. All source objects must reside in the same // bucket. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The generation of this object to use as the source. Generation int64 `protobuf:"varint,2,opt,name=generation,proto3" json:"generation,omitempty"` // Conditions that must be met for this operation to execute. ObjectPreconditions *ComposeObjectRequest_SourceObjects_ObjectPreconditions `protobuf:"bytes,3,opt,name=object_preconditions,json=objectPreconditions,proto3" json:"object_preconditions,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ComposeObjectRequest_SourceObjects) Reset() { *m = ComposeObjectRequest_SourceObjects{} } func (m *ComposeObjectRequest_SourceObjects) String() string { return proto.CompactTextString(m) } func (*ComposeObjectRequest_SourceObjects) ProtoMessage() {} func (*ComposeObjectRequest_SourceObjects) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{29, 0} } func (m *ComposeObjectRequest_SourceObjects) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ComposeObjectRequest_SourceObjects.Unmarshal(m, b) } func (m *ComposeObjectRequest_SourceObjects) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ComposeObjectRequest_SourceObjects.Marshal(b, m, deterministic) } func (m *ComposeObjectRequest_SourceObjects) XXX_Merge(src proto.Message) { xxx_messageInfo_ComposeObjectRequest_SourceObjects.Merge(m, src) } func (m *ComposeObjectRequest_SourceObjects) XXX_Size() int { return xxx_messageInfo_ComposeObjectRequest_SourceObjects.Size(m) } func (m *ComposeObjectRequest_SourceObjects) XXX_DiscardUnknown() { xxx_messageInfo_ComposeObjectRequest_SourceObjects.DiscardUnknown(m) } var xxx_messageInfo_ComposeObjectRequest_SourceObjects proto.InternalMessageInfo func (m *ComposeObjectRequest_SourceObjects) GetName() string { if m != nil { return m.Name } return "" } func (m *ComposeObjectRequest_SourceObjects) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *ComposeObjectRequest_SourceObjects) GetObjectPreconditions() *ComposeObjectRequest_SourceObjects_ObjectPreconditions { if m != nil { return m.ObjectPreconditions } return nil } // Preconditions for a source object of a composition request. type ComposeObjectRequest_SourceObjects_ObjectPreconditions struct { // Only perform the composition if the generation of the source object // that would be used matches this value. If this value and a generation // are both specified, they must be the same value or the call will fail. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,1,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ComposeObjectRequest_SourceObjects_ObjectPreconditions) Reset() { *m = ComposeObjectRequest_SourceObjects_ObjectPreconditions{} } func (m *ComposeObjectRequest_SourceObjects_ObjectPreconditions) String() string { return proto.CompactTextString(m) } func (*ComposeObjectRequest_SourceObjects_ObjectPreconditions) ProtoMessage() {} func (*ComposeObjectRequest_SourceObjects_ObjectPreconditions) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{29, 0, 0} } func (m *ComposeObjectRequest_SourceObjects_ObjectPreconditions) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ComposeObjectRequest_SourceObjects_ObjectPreconditions.Unmarshal(m, b) } func (m *ComposeObjectRequest_SourceObjects_ObjectPreconditions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ComposeObjectRequest_SourceObjects_ObjectPreconditions.Marshal(b, m, deterministic) } func (m *ComposeObjectRequest_SourceObjects_ObjectPreconditions) XXX_Merge(src proto.Message) { xxx_messageInfo_ComposeObjectRequest_SourceObjects_ObjectPreconditions.Merge(m, src) } func (m *ComposeObjectRequest_SourceObjects_ObjectPreconditions) XXX_Size() int { return xxx_messageInfo_ComposeObjectRequest_SourceObjects_ObjectPreconditions.Size(m) } func (m *ComposeObjectRequest_SourceObjects_ObjectPreconditions) XXX_DiscardUnknown() { xxx_messageInfo_ComposeObjectRequest_SourceObjects_ObjectPreconditions.DiscardUnknown(m) } var xxx_messageInfo_ComposeObjectRequest_SourceObjects_ObjectPreconditions proto.InternalMessageInfo func (m *ComposeObjectRequest_SourceObjects_ObjectPreconditions) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } // Request message for CopyObject. type CopyObjectRequest struct { // Name of the bucket in which to store the new object. Overrides the provided // object // metadata's bucket value, if any. // Required. DestinationBucket string `protobuf:"bytes,1,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"` // Name of the new object. // Required when the object metadata is not otherwise provided. Overrides the // object metadata's name value, if any. // Required. DestinationObject string `protobuf:"bytes,2,opt,name=destination_object,json=destinationObject,proto3" json:"destination_object,omitempty"` // Apply a predefined set of access controls to the destination object. DestinationPredefinedAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,3,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"destination_predefined_acl,omitempty"` // Makes the operation conditional on whether the destination object's current // generation matches the given value. Setting to 0 makes the operation // succeed only if there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the destination object's current // generation does not match the given value. If no live object exists, the // precondition fails. Setting to 0 makes the operation succeed only if there // is a live version of the object. IfGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the destination object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the destination object's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Makes the operation conditional on whether the source object's current // generation matches the given value. IfSourceGenerationMatch *wrappers.Int64Value `protobuf:"bytes,8,opt,name=if_source_generation_match,json=ifSourceGenerationMatch,proto3" json:"if_source_generation_match,omitempty"` // Makes the operation conditional on whether the source object's current // generation does not match the given value. IfSourceGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,9,opt,name=if_source_generation_not_match,json=ifSourceGenerationNotMatch,proto3" json:"if_source_generation_not_match,omitempty"` // Makes the operation conditional on whether the source object's current // metageneration matches the given value. IfSourceMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,10,opt,name=if_source_metageneration_match,json=ifSourceMetagenerationMatch,proto3" json:"if_source_metageneration_match,omitempty"` // Makes the operation conditional on whether the source object's current // metageneration does not match the given value. IfSourceMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,11,opt,name=if_source_metageneration_not_match,json=ifSourceMetagenerationNotMatch,proto3" json:"if_source_metageneration_not_match,omitempty"` // Set of properties to return. Defaults to NO_ACL, unless the // object resource specifies the acl property, when it defaults // to full. Projection CommonEnums_Projection `protobuf:"varint,12,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // Name of the bucket in which to find the source object. // Required. SourceBucket string `protobuf:"bytes,13,opt,name=source_bucket,json=sourceBucket,proto3" json:"source_bucket,omitempty"` // Name of the source object. // Required. SourceObject string `protobuf:"bytes,14,opt,name=source_object,json=sourceObject,proto3" json:"source_object,omitempty"` // If present, selects a specific revision of the source object (as opposed to // the latest version, the default). SourceGeneration int64 `protobuf:"varint,15,opt,name=source_generation,json=sourceGeneration,proto3" json:"source_generation,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,16,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Properties of the resulting object. If not set, duplicate properties of // source object. Destination *Object `protobuf:"bytes,17,opt,name=destination,proto3" json:"destination,omitempty"` // Resource name of the Cloud KMS key, of the form // projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key, // that will be used to encrypt the object. Overrides the object // metadata's kms_key_name value, if any. DestinationKmsKeyName string `protobuf:"bytes,20,opt,name=destination_kms_key_name,json=destinationKmsKeyName,proto3" json:"destination_kms_key_name,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,18,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,19,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *CopyObjectRequest) Reset() { *m = CopyObjectRequest{} } func (m *CopyObjectRequest) String() string { return proto.CompactTextString(m) } func (*CopyObjectRequest) ProtoMessage() {} func (*CopyObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{30} } func (m *CopyObjectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CopyObjectRequest.Unmarshal(m, b) } func (m *CopyObjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CopyObjectRequest.Marshal(b, m, deterministic) } func (m *CopyObjectRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_CopyObjectRequest.Merge(m, src) } func (m *CopyObjectRequest) XXX_Size() int { return xxx_messageInfo_CopyObjectRequest.Size(m) } func (m *CopyObjectRequest) XXX_DiscardUnknown() { xxx_messageInfo_CopyObjectRequest.DiscardUnknown(m) } var xxx_messageInfo_CopyObjectRequest proto.InternalMessageInfo func (m *CopyObjectRequest) GetDestinationBucket() string { if m != nil { return m.DestinationBucket } return "" } func (m *CopyObjectRequest) GetDestinationObject() string { if m != nil { return m.DestinationObject } return "" } func (m *CopyObjectRequest) GetDestinationPredefinedAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.DestinationPredefinedAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *CopyObjectRequest) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *CopyObjectRequest) GetIfGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationNotMatch } return nil } func (m *CopyObjectRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *CopyObjectRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *CopyObjectRequest) GetIfSourceGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfSourceGenerationMatch } return nil } func (m *CopyObjectRequest) GetIfSourceGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfSourceGenerationNotMatch } return nil } func (m *CopyObjectRequest) GetIfSourceMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfSourceMetagenerationMatch } return nil } func (m *CopyObjectRequest) GetIfSourceMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfSourceMetagenerationNotMatch } return nil } func (m *CopyObjectRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *CopyObjectRequest) GetSourceBucket() string { if m != nil { return m.SourceBucket } return "" } func (m *CopyObjectRequest) GetSourceObject() string { if m != nil { return m.SourceObject } return "" } func (m *CopyObjectRequest) GetSourceGeneration() int64 { if m != nil { return m.SourceGeneration } return 0 } func (m *CopyObjectRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *CopyObjectRequest) GetDestination() *Object { if m != nil { return m.Destination } return nil } func (m *CopyObjectRequest) GetDestinationKmsKeyName() string { if m != nil { return m.DestinationKmsKeyName } return "" } func (m *CopyObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *CopyObjectRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Message for deleting an object. // Either `bucket` and `object` *or* `upload_id` **must** be set (but not both). type DeleteObjectRequest struct { // Name of the bucket in which the object resides. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The name of the object to delete (when not using a resumable write). // Required. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // The resumable upload_id of the object to delete (when using a // resumable write). This should be copied from the `upload_id` field of // `StartResumableWriteResponse`. UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` // If present, permanently deletes a specific revision of this object (as // opposed to the latest version, the default). Generation int64 `protobuf:"varint,4,opt,name=generation,proto3" json:"generation,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,5,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,6,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,7,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,8,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,9,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,11,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *DeleteObjectRequest) Reset() { *m = DeleteObjectRequest{} } func (m *DeleteObjectRequest) String() string { return proto.CompactTextString(m) } func (*DeleteObjectRequest) ProtoMessage() {} func (*DeleteObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{31} } func (m *DeleteObjectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteObjectRequest.Unmarshal(m, b) } func (m *DeleteObjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DeleteObjectRequest.Marshal(b, m, deterministic) } func (m *DeleteObjectRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_DeleteObjectRequest.Merge(m, src) } func (m *DeleteObjectRequest) XXX_Size() int { return xxx_messageInfo_DeleteObjectRequest.Size(m) } func (m *DeleteObjectRequest) XXX_DiscardUnknown() { xxx_messageInfo_DeleteObjectRequest.DiscardUnknown(m) } var xxx_messageInfo_DeleteObjectRequest proto.InternalMessageInfo func (m *DeleteObjectRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *DeleteObjectRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *DeleteObjectRequest) GetUploadId() string { if m != nil { return m.UploadId } return "" } func (m *DeleteObjectRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *DeleteObjectRequest) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *DeleteObjectRequest) GetIfGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationNotMatch } return nil } func (m *DeleteObjectRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *DeleteObjectRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *DeleteObjectRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *DeleteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *DeleteObjectRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for GetObjectMedia. type GetObjectMediaRequest struct { // The name of the bucket containing the object to read. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // The name of the object to read. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed // to the latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // The offset for the first byte to return in the read, relative to the start // of the object. // // A `read_offset` that is negative or greater than the size of the object // will cause an `OUT_OF_RANGE` error. ReadOffset int64 `protobuf:"varint,4,opt,name=read_offset,json=readOffset,proto3" json:"read_offset,omitempty"` // The maximum number of `data` bytes the server is allowed to return in the // sum of all `Object` messages. A `read_limit` of zero indicates that there // is no limit, and a negative `read_limit` will cause an error. // // If the stream returns fewer bytes than allowed by the `read_limit` and no // error occurred, the stream includes all data from the `read_offset` to the // end of the resource. ReadLimit int64 `protobuf:"varint,5,opt,name=read_limit,json=readLimit,proto3" json:"read_limit,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,6,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,7,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,8,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,9,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,10,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,11,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,12,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetObjectMediaRequest) Reset() { *m = GetObjectMediaRequest{} } func (m *GetObjectMediaRequest) String() string { return proto.CompactTextString(m) } func (*GetObjectMediaRequest) ProtoMessage() {} func (*GetObjectMediaRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{32} } func (m *GetObjectMediaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetObjectMediaRequest.Unmarshal(m, b) } func (m *GetObjectMediaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetObjectMediaRequest.Marshal(b, m, deterministic) } func (m *GetObjectMediaRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_GetObjectMediaRequest.Merge(m, src) } func (m *GetObjectMediaRequest) XXX_Size() int { return xxx_messageInfo_GetObjectMediaRequest.Size(m) } func (m *GetObjectMediaRequest) XXX_DiscardUnknown() { xxx_messageInfo_GetObjectMediaRequest.DiscardUnknown(m) } var xxx_messageInfo_GetObjectMediaRequest proto.InternalMessageInfo func (m *GetObjectMediaRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *GetObjectMediaRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *GetObjectMediaRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *GetObjectMediaRequest) GetReadOffset() int64 { if m != nil { return m.ReadOffset } return 0 } func (m *GetObjectMediaRequest) GetReadLimit() int64 { if m != nil { return m.ReadLimit } return 0 } func (m *GetObjectMediaRequest) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *GetObjectMediaRequest) GetIfGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationNotMatch } return nil } func (m *GetObjectMediaRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *GetObjectMediaRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *GetObjectMediaRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *GetObjectMediaRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *GetObjectMediaRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for GetObject. type GetObjectRequest struct { // Name of the bucket in which the object resides. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Name of the object. // Required. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Set of properties to return. Defaults to NO_ACL. Projection CommonEnums_Projection `protobuf:"varint,8,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,9,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,11,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetObjectRequest) Reset() { *m = GetObjectRequest{} } func (m *GetObjectRequest) String() string { return proto.CompactTextString(m) } func (*GetObjectRequest) ProtoMessage() {} func (*GetObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{33} } func (m *GetObjectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetObjectRequest.Unmarshal(m, b) } func (m *GetObjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetObjectRequest.Marshal(b, m, deterministic) } func (m *GetObjectRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_GetObjectRequest.Merge(m, src) } func (m *GetObjectRequest) XXX_Size() int { return xxx_messageInfo_GetObjectRequest.Size(m) } func (m *GetObjectRequest) XXX_DiscardUnknown() { xxx_messageInfo_GetObjectRequest.DiscardUnknown(m) } var xxx_messageInfo_GetObjectRequest proto.InternalMessageInfo func (m *GetObjectRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *GetObjectRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *GetObjectRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *GetObjectRequest) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *GetObjectRequest) GetIfGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationNotMatch } return nil } func (m *GetObjectRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *GetObjectRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *GetObjectRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *GetObjectRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *GetObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *GetObjectRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Response message for GetObject. type GetObjectMediaResponse struct { // A portion of the data for the object. The service **may** leave `data` // empty for any given `ReadResponse`. This enables the service to inform the // client that the request is still live while it is running an operation to // generate more data. ChecksummedData *ChecksummedData `protobuf:"bytes,1,opt,name=checksummed_data,json=checksummedData,proto3" json:"checksummed_data,omitempty"` // The checksums of the complete object. The client should compute one of // these checksums over the downloaded object and compare it against the value // provided here. ObjectChecksums *ObjectChecksums `protobuf:"bytes,2,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"` // If read_offset and or read_limit was specified on the // GetObjectMediaRequest, ContentRange will be populated on the first // GetObjectMediaResponse message of the read stream. ContentRange *ContentRange `protobuf:"bytes,3,opt,name=content_range,json=contentRange,proto3" json:"content_range,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetObjectMediaResponse) Reset() { *m = GetObjectMediaResponse{} } func (m *GetObjectMediaResponse) String() string { return proto.CompactTextString(m) } func (*GetObjectMediaResponse) ProtoMessage() {} func (*GetObjectMediaResponse) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{34} } func (m *GetObjectMediaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetObjectMediaResponse.Unmarshal(m, b) } func (m *GetObjectMediaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetObjectMediaResponse.Marshal(b, m, deterministic) } func (m *GetObjectMediaResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_GetObjectMediaResponse.Merge(m, src) } func (m *GetObjectMediaResponse) XXX_Size() int { return xxx_messageInfo_GetObjectMediaResponse.Size(m) } func (m *GetObjectMediaResponse) XXX_DiscardUnknown() { xxx_messageInfo_GetObjectMediaResponse.DiscardUnknown(m) } var xxx_messageInfo_GetObjectMediaResponse proto.InternalMessageInfo func (m *GetObjectMediaResponse) GetChecksummedData() *ChecksummedData { if m != nil { return m.ChecksummedData } return nil } func (m *GetObjectMediaResponse) GetObjectChecksums() *ObjectChecksums { if m != nil { return m.ObjectChecksums } return nil } func (m *GetObjectMediaResponse) GetContentRange() *ContentRange { if m != nil { return m.ContentRange } return nil } // Describes an attempt to insert an object, possibly over multiple requests. type InsertObjectSpec struct { // Destination object, including its name and its metadata. Resource *Object `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` // Apply a predefined set of access controls to this object. PredefinedAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,2,opt,name=predefined_acl,json=predefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"predefined_acl,omitempty"` // Makes the operation conditional on whether the object's current // generation matches the given value. Setting to 0 makes the operation // succeed only if there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,3,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current // generation does not match the given value. If no live object exists, the // precondition fails. Setting to 0 makes the operation succeed only if // there is a live version of the object. IfGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,4,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,5,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,6,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Set of properties to return. Defaults to NO_ACL, unless the // object resource specifies the acl property, when it defaults // to full. Projection CommonEnums_Projection `protobuf:"varint,7,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,8,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *InsertObjectSpec) Reset() { *m = InsertObjectSpec{} } func (m *InsertObjectSpec) String() string { return proto.CompactTextString(m) } func (*InsertObjectSpec) ProtoMessage() {} func (*InsertObjectSpec) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{35} } func (m *InsertObjectSpec) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InsertObjectSpec.Unmarshal(m, b) } func (m *InsertObjectSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InsertObjectSpec.Marshal(b, m, deterministic) } func (m *InsertObjectSpec) XXX_Merge(src proto.Message) { xxx_messageInfo_InsertObjectSpec.Merge(m, src) } func (m *InsertObjectSpec) XXX_Size() int { return xxx_messageInfo_InsertObjectSpec.Size(m) } func (m *InsertObjectSpec) XXX_DiscardUnknown() { xxx_messageInfo_InsertObjectSpec.DiscardUnknown(m) } var xxx_messageInfo_InsertObjectSpec proto.InternalMessageInfo func (m *InsertObjectSpec) GetResource() *Object { if m != nil { return m.Resource } return nil } func (m *InsertObjectSpec) GetPredefinedAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.PredefinedAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *InsertObjectSpec) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *InsertObjectSpec) GetIfGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationNotMatch } return nil } func (m *InsertObjectSpec) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *InsertObjectSpec) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *InsertObjectSpec) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *InsertObjectSpec) GetUserProject() string { if m != nil { return m.UserProject } return "" } // Message for writing an object. type InsertObjectRequest struct { // The first message of each stream should set one of the following. // // Types that are valid to be assigned to FirstMessage: // *InsertObjectRequest_UploadId // *InsertObjectRequest_InsertObjectSpec FirstMessage isInsertObjectRequest_FirstMessage `protobuf_oneof:"first_message"` // The offset from the beginning of the object at which the data should be // written. // Required. // // In the first `InsertObjectRequest` of a `InsertObject()` action, it // indicates the initial offset for the `Insert()` call. The value **must** be // equal to the `committed_size` that a call to `QueryWriteStatus()` would // return (0 if this is the first write to the object). // // On subsequent calls, this value **must** be no larger than the sum of the // first `write_offset` and the sizes of all `data` chunks sent previously on // this stream. // // An incorrect value will cause an error. WriteOffset int64 `protobuf:"varint,3,opt,name=write_offset,json=writeOffset,proto3" json:"write_offset,omitempty"` // A portion of the data for the object. // // Types that are valid to be assigned to Data: // *InsertObjectRequest_ChecksummedData // *InsertObjectRequest_Reference Data isInsertObjectRequest_Data `protobuf_oneof:"data"` // Checksums for the complete object. If the checksums computed by the service // don't match the specifified checksums the call will fail. May only be // provided in the first or last request (either with first_message, or // finish_write set). ObjectChecksums *ObjectChecksums `protobuf:"bytes,6,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"` // If `true`, this indicates that the write is complete. Sending any // `InsertObjectRequest`s subsequent to one in which `finish_write` is `true` // will cause an error. // For a non-resumable write (where the upload_id was not set in the first // message), it is an error not to set this field in the final message of the // stream. FinishWrite bool `protobuf:"varint,7,opt,name=finish_write,json=finishWrite,proto3" json:"finish_write,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,9,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *InsertObjectRequest) Reset() { *m = InsertObjectRequest{} } func (m *InsertObjectRequest) String() string { return proto.CompactTextString(m) } func (*InsertObjectRequest) ProtoMessage() {} func (*InsertObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{36} } func (m *InsertObjectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InsertObjectRequest.Unmarshal(m, b) } func (m *InsertObjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InsertObjectRequest.Marshal(b, m, deterministic) } func (m *InsertObjectRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_InsertObjectRequest.Merge(m, src) } func (m *InsertObjectRequest) XXX_Size() int { return xxx_messageInfo_InsertObjectRequest.Size(m) } func (m *InsertObjectRequest) XXX_DiscardUnknown() { xxx_messageInfo_InsertObjectRequest.DiscardUnknown(m) } var xxx_messageInfo_InsertObjectRequest proto.InternalMessageInfo type isInsertObjectRequest_FirstMessage interface { isInsertObjectRequest_FirstMessage() } type InsertObjectRequest_UploadId struct { UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3,oneof"` } type InsertObjectRequest_InsertObjectSpec struct { InsertObjectSpec *InsertObjectSpec `protobuf:"bytes,2,opt,name=insert_object_spec,json=insertObjectSpec,proto3,oneof"` } func (*InsertObjectRequest_UploadId) isInsertObjectRequest_FirstMessage() {} func (*InsertObjectRequest_InsertObjectSpec) isInsertObjectRequest_FirstMessage() {} func (m *InsertObjectRequest) GetFirstMessage() isInsertObjectRequest_FirstMessage { if m != nil { return m.FirstMessage } return nil } func (m *InsertObjectRequest) GetUploadId() string { if x, ok := m.GetFirstMessage().(*InsertObjectRequest_UploadId); ok { return x.UploadId } return "" } func (m *InsertObjectRequest) GetInsertObjectSpec() *InsertObjectSpec { if x, ok := m.GetFirstMessage().(*InsertObjectRequest_InsertObjectSpec); ok { return x.InsertObjectSpec } return nil } func (m *InsertObjectRequest) GetWriteOffset() int64 { if m != nil { return m.WriteOffset } return 0 } type isInsertObjectRequest_Data interface { isInsertObjectRequest_Data() } type InsertObjectRequest_ChecksummedData struct { ChecksummedData *ChecksummedData `protobuf:"bytes,4,opt,name=checksummed_data,json=checksummedData,proto3,oneof"` } type InsertObjectRequest_Reference struct { Reference *GetObjectMediaRequest `protobuf:"bytes,5,opt,name=reference,proto3,oneof"` } func (*InsertObjectRequest_ChecksummedData) isInsertObjectRequest_Data() {} func (*InsertObjectRequest_Reference) isInsertObjectRequest_Data() {} func (m *InsertObjectRequest) GetData() isInsertObjectRequest_Data { if m != nil { return m.Data } return nil } func (m *InsertObjectRequest) GetChecksummedData() *ChecksummedData { if x, ok := m.GetData().(*InsertObjectRequest_ChecksummedData); ok { return x.ChecksummedData } return nil } func (m *InsertObjectRequest) GetReference() *GetObjectMediaRequest { if x, ok := m.GetData().(*InsertObjectRequest_Reference); ok { return x.Reference } return nil } func (m *InsertObjectRequest) GetObjectChecksums() *ObjectChecksums { if m != nil { return m.ObjectChecksums } return nil } func (m *InsertObjectRequest) GetFinishWrite() bool { if m != nil { return m.FinishWrite } return false } func (m *InsertObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *InsertObjectRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // XXX_OneofWrappers is for the internal use of the proto package. func (*InsertObjectRequest) XXX_OneofWrappers() []interface{} { return []interface{}{ (*InsertObjectRequest_UploadId)(nil), (*InsertObjectRequest_InsertObjectSpec)(nil), (*InsertObjectRequest_ChecksummedData)(nil), (*InsertObjectRequest_Reference)(nil), } } // Request message for ListObjects. type ListObjectsRequest struct { // Name of the bucket in which to look for objects. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Returns results in a directory-like mode. items will contain // only objects whose names, aside from the prefix, do not // contain delimiter. Objects whose names, aside from the // prefix, contain delimiter will have their name, // truncated after the delimiter, returned in // prefixes. Duplicate prefixes are omitted. Delimiter string `protobuf:"bytes,2,opt,name=delimiter,proto3" json:"delimiter,omitempty"` // If true, objects that end in exactly one instance of delimiter // will have their metadata included in items in addition to // prefixes. IncludeTrailingDelimiter bool `protobuf:"varint,3,opt,name=include_trailing_delimiter,json=includeTrailingDelimiter,proto3" json:"include_trailing_delimiter,omitempty"` // Maximum number of items plus prefixes to return // in a single page of responses. As duplicate prefixes are // omitted, fewer total results may be returned than requested. The service // will use this parameter or 1,000 items, whichever is smaller. MaxResults int32 `protobuf:"varint,4,opt,name=max_results,json=maxResults,proto3" json:"max_results,omitempty"` // A previously-returned page token representing part of the larger set of // results to view. PageToken string `protobuf:"bytes,5,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // Filter results to objects whose names begin with this prefix. Prefix string `protobuf:"bytes,6,opt,name=prefix,proto3" json:"prefix,omitempty"` // Set of properties to return. Defaults to NO_ACL. Projection CommonEnums_Projection `protobuf:"varint,7,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,8,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // If true, lists all versions of an object as distinct results. // The default is false. For more information, see Object Versioning. Versions bool `protobuf:"varint,9,opt,name=versions,proto3" json:"versions,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,10,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListObjectsRequest) Reset() { *m = ListObjectsRequest{} } func (m *ListObjectsRequest) String() string { return proto.CompactTextString(m) } func (*ListObjectsRequest) ProtoMessage() {} func (*ListObjectsRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{37} } func (m *ListObjectsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListObjectsRequest.Unmarshal(m, b) } func (m *ListObjectsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListObjectsRequest.Marshal(b, m, deterministic) } func (m *ListObjectsRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_ListObjectsRequest.Merge(m, src) } func (m *ListObjectsRequest) XXX_Size() int { return xxx_messageInfo_ListObjectsRequest.Size(m) } func (m *ListObjectsRequest) XXX_DiscardUnknown() { xxx_messageInfo_ListObjectsRequest.DiscardUnknown(m) } var xxx_messageInfo_ListObjectsRequest proto.InternalMessageInfo func (m *ListObjectsRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *ListObjectsRequest) GetDelimiter() string { if m != nil { return m.Delimiter } return "" } func (m *ListObjectsRequest) GetIncludeTrailingDelimiter() bool { if m != nil { return m.IncludeTrailingDelimiter } return false } func (m *ListObjectsRequest) GetMaxResults() int32 { if m != nil { return m.MaxResults } return 0 } func (m *ListObjectsRequest) GetPageToken() string { if m != nil { return m.PageToken } return "" } func (m *ListObjectsRequest) GetPrefix() string { if m != nil { return m.Prefix } return "" } func (m *ListObjectsRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *ListObjectsRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *ListObjectsRequest) GetVersions() bool { if m != nil { return m.Versions } return false } func (m *ListObjectsRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request object for `ByteStream.QueryWriteStatus`. type QueryWriteStatusRequest struct { // The name of the resume token for the object whose write status is being // requested. // Required. UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,2,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,3,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *QueryWriteStatusRequest) Reset() { *m = QueryWriteStatusRequest{} } func (m *QueryWriteStatusRequest) String() string { return proto.CompactTextString(m) } func (*QueryWriteStatusRequest) ProtoMessage() {} func (*QueryWriteStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{38} } func (m *QueryWriteStatusRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_QueryWriteStatusRequest.Unmarshal(m, b) } func (m *QueryWriteStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_QueryWriteStatusRequest.Marshal(b, m, deterministic) } func (m *QueryWriteStatusRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryWriteStatusRequest.Merge(m, src) } func (m *QueryWriteStatusRequest) XXX_Size() int { return xxx_messageInfo_QueryWriteStatusRequest.Size(m) } func (m *QueryWriteStatusRequest) XXX_DiscardUnknown() { xxx_messageInfo_QueryWriteStatusRequest.DiscardUnknown(m) } var xxx_messageInfo_QueryWriteStatusRequest proto.InternalMessageInfo func (m *QueryWriteStatusRequest) GetUploadId() string { if m != nil { return m.UploadId } return "" } func (m *QueryWriteStatusRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *QueryWriteStatusRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Response object for `ByteStream.QueryWriteStatus`. type QueryWriteStatusResponse struct { // The number of bytes that have been processed for the given object. CommittedSize int64 `protobuf:"varint,1,opt,name=committed_size,json=committedSize,proto3" json:"committed_size,omitempty"` // `complete` is `true` only if the client has sent a `InsertObjectRequest` // with `finish_write` set to true, and the server has processed that request. Complete bool `protobuf:"varint,2,opt,name=complete,proto3" json:"complete,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *QueryWriteStatusResponse) Reset() { *m = QueryWriteStatusResponse{} } func (m *QueryWriteStatusResponse) String() string { return proto.CompactTextString(m) } func (*QueryWriteStatusResponse) ProtoMessage() {} func (*QueryWriteStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{39} } func (m *QueryWriteStatusResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_QueryWriteStatusResponse.Unmarshal(m, b) } func (m *QueryWriteStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_QueryWriteStatusResponse.Marshal(b, m, deterministic) } func (m *QueryWriteStatusResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_QueryWriteStatusResponse.Merge(m, src) } func (m *QueryWriteStatusResponse) XXX_Size() int { return xxx_messageInfo_QueryWriteStatusResponse.Size(m) } func (m *QueryWriteStatusResponse) XXX_DiscardUnknown() { xxx_messageInfo_QueryWriteStatusResponse.DiscardUnknown(m) } var xxx_messageInfo_QueryWriteStatusResponse proto.InternalMessageInfo func (m *QueryWriteStatusResponse) GetCommittedSize() int64 { if m != nil { return m.CommittedSize } return 0 } func (m *QueryWriteStatusResponse) GetComplete() bool { if m != nil { return m.Complete } return false } // Request message for RewriteObject. type RewriteObjectRequest struct { // Name of the bucket in which to store the new object. Overrides the provided // object metadata's bucket value, if any. // Required. DestinationBucket string `protobuf:"bytes,1,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"` // Name of the new object. // Required when the object metadata is not otherwise provided. Overrides the // object metadata's name value, if any. // Required. // (!-- This should probably be specified in object.name --!) DestinationObject string `protobuf:"bytes,2,opt,name=destination_object,json=destinationObject,proto3" json:"destination_object,omitempty"` // Resource name of the Cloud KMS key, of the form // projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key, // that will be used to encrypt the object. Overrides the object // metadata's kms_key_name value, if any. DestinationKmsKeyName string `protobuf:"bytes,3,opt,name=destination_kms_key_name,json=destinationKmsKeyName,proto3" json:"destination_kms_key_name,omitempty"` // Apply a predefined set of access controls to the destination object. DestinationPredefinedAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,4,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"destination_predefined_acl,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,5,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,6,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the destination object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,7,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the destination object's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,8,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Makes the operation conditional on whether the source object's current // generation matches the given value. IfSourceGenerationMatch *wrappers.Int64Value `protobuf:"bytes,9,opt,name=if_source_generation_match,json=ifSourceGenerationMatch,proto3" json:"if_source_generation_match,omitempty"` // Makes the operation conditional on whether the source object's current // generation does not match the given value. IfSourceGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,10,opt,name=if_source_generation_not_match,json=ifSourceGenerationNotMatch,proto3" json:"if_source_generation_not_match,omitempty"` // Makes the operation conditional on whether the source object's current // metageneration matches the given value. IfSourceMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,11,opt,name=if_source_metageneration_match,json=ifSourceMetagenerationMatch,proto3" json:"if_source_metageneration_match,omitempty"` // Makes the operation conditional on whether the source object's current // metageneration does not match the given value. IfSourceMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,12,opt,name=if_source_metageneration_not_match,json=ifSourceMetagenerationNotMatch,proto3" json:"if_source_metageneration_not_match,omitempty"` // The maximum number of bytes that will be rewritten per rewrite request. // Most callers // shouldn't need to specify this parameter - it is primarily in place to // support testing. If specified the value must be an integral multiple of // 1 MiB (1048576). Also, this only applies to requests where the source and // destination span locations and/or storage classes. Finally, this value must // not change across rewrite calls else you'll get an error that the // rewriteToken is invalid. MaxBytesRewrittenPerCall int64 `protobuf:"varint,13,opt,name=max_bytes_rewritten_per_call,json=maxBytesRewrittenPerCall,proto3" json:"max_bytes_rewritten_per_call,omitempty"` // Set of properties to return. Defaults to NO_ACL, unless the // object resource specifies the acl property, when it defaults // to full. Projection CommonEnums_Projection `protobuf:"varint,14,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // Include this field (from the previous rewrite response) on each rewrite // request after the first one, until the rewrite response 'done' flag is // true. Calls that provide a rewriteToken can omit all other request fields, // but if included those fields must match the values provided in the first // rewrite request. RewriteToken string `protobuf:"bytes,15,opt,name=rewrite_token,json=rewriteToken,proto3" json:"rewrite_token,omitempty"` // Name of the bucket in which to find the source object. // Required. SourceBucket string `protobuf:"bytes,16,opt,name=source_bucket,json=sourceBucket,proto3" json:"source_bucket,omitempty"` // Name of the source object. // Required. SourceObject string `protobuf:"bytes,17,opt,name=source_object,json=sourceObject,proto3" json:"source_object,omitempty"` // If present, selects a specific revision of the source object (as opposed to // the latest version, the default). SourceGeneration int64 `protobuf:"varint,18,opt,name=source_generation,json=sourceGeneration,proto3" json:"source_generation,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,19,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Properties of the destination, post-rewrite object. Object *Object `protobuf:"bytes,20,opt,name=object,proto3" json:"object,omitempty"` // The algorithm used to encrypt the source object, if any. CopySourceEncryptionAlgorithm string `protobuf:"bytes,21,opt,name=copy_source_encryption_algorithm,json=copySourceEncryptionAlgorithm,proto3" json:"copy_source_encryption_algorithm,omitempty"` // The encryption key used to encrypt the source object, if any. CopySourceEncryptionKey string `protobuf:"bytes,22,opt,name=copy_source_encryption_key,json=copySourceEncryptionKey,proto3" json:"copy_source_encryption_key,omitempty"` // The SHA-256 hash of the key used to encrypt the source object, if any. CopySourceEncryptionKeySha256 string `protobuf:"bytes,23,opt,name=copy_source_encryption_key_sha256,json=copySourceEncryptionKeySha256,proto3" json:"copy_source_encryption_key_sha256,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,24,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,25,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *RewriteObjectRequest) Reset() { *m = RewriteObjectRequest{} } func (m *RewriteObjectRequest) String() string { return proto.CompactTextString(m) } func (*RewriteObjectRequest) ProtoMessage() {} func (*RewriteObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{40} } func (m *RewriteObjectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RewriteObjectRequest.Unmarshal(m, b) } func (m *RewriteObjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RewriteObjectRequest.Marshal(b, m, deterministic) } func (m *RewriteObjectRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_RewriteObjectRequest.Merge(m, src) } func (m *RewriteObjectRequest) XXX_Size() int { return xxx_messageInfo_RewriteObjectRequest.Size(m) } func (m *RewriteObjectRequest) XXX_DiscardUnknown() { xxx_messageInfo_RewriteObjectRequest.DiscardUnknown(m) } var xxx_messageInfo_RewriteObjectRequest proto.InternalMessageInfo func (m *RewriteObjectRequest) GetDestinationBucket() string { if m != nil { return m.DestinationBucket } return "" } func (m *RewriteObjectRequest) GetDestinationObject() string { if m != nil { return m.DestinationObject } return "" } func (m *RewriteObjectRequest) GetDestinationKmsKeyName() string { if m != nil { return m.DestinationKmsKeyName } return "" } func (m *RewriteObjectRequest) GetDestinationPredefinedAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.DestinationPredefinedAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *RewriteObjectRequest) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *RewriteObjectRequest) GetIfGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationNotMatch } return nil } func (m *RewriteObjectRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *RewriteObjectRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *RewriteObjectRequest) GetIfSourceGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfSourceGenerationMatch } return nil } func (m *RewriteObjectRequest) GetIfSourceGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfSourceGenerationNotMatch } return nil } func (m *RewriteObjectRequest) GetIfSourceMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfSourceMetagenerationMatch } return nil } func (m *RewriteObjectRequest) GetIfSourceMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfSourceMetagenerationNotMatch } return nil } func (m *RewriteObjectRequest) GetMaxBytesRewrittenPerCall() int64 { if m != nil { return m.MaxBytesRewrittenPerCall } return 0 } func (m *RewriteObjectRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *RewriteObjectRequest) GetRewriteToken() string { if m != nil { return m.RewriteToken } return "" } func (m *RewriteObjectRequest) GetSourceBucket() string { if m != nil { return m.SourceBucket } return "" } func (m *RewriteObjectRequest) GetSourceObject() string { if m != nil { return m.SourceObject } return "" } func (m *RewriteObjectRequest) GetSourceGeneration() int64 { if m != nil { return m.SourceGeneration } return 0 } func (m *RewriteObjectRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *RewriteObjectRequest) GetObject() *Object { if m != nil { return m.Object } return nil } func (m *RewriteObjectRequest) GetCopySourceEncryptionAlgorithm() string { if m != nil { return m.CopySourceEncryptionAlgorithm } return "" } func (m *RewriteObjectRequest) GetCopySourceEncryptionKey() string { if m != nil { return m.CopySourceEncryptionKey } return "" } func (m *RewriteObjectRequest) GetCopySourceEncryptionKeySha256() string { if m != nil { return m.CopySourceEncryptionKeySha256 } return "" } func (m *RewriteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *RewriteObjectRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // A rewrite response. type RewriteResponse struct { // The total bytes written so far, which can be used to provide a waiting user // with a progress indicator. This property is always present in the response. TotalBytesRewritten int64 `protobuf:"varint,1,opt,name=total_bytes_rewritten,json=totalBytesRewritten,proto3" json:"total_bytes_rewritten,omitempty"` // The total size of the object being copied in bytes. This property is always // present in the response. ObjectSize int64 `protobuf:"varint,2,opt,name=object_size,json=objectSize,proto3" json:"object_size,omitempty"` // true if the copy is finished; otherwise, false if // the copy is in progress. This property is always present in the response. Done bool `protobuf:"varint,3,opt,name=done,proto3" json:"done,omitempty"` // A token to use in subsequent requests to continue copying data. This token // is present in the response only when there is more data to copy. RewriteToken string `protobuf:"bytes,4,opt,name=rewrite_token,json=rewriteToken,proto3" json:"rewrite_token,omitempty"` // A resource containing the metadata for the copied-to object. This property // is present in the response only when copying completes. Resource *Object `protobuf:"bytes,5,opt,name=resource,proto3" json:"resource,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *RewriteResponse) Reset() { *m = RewriteResponse{} } func (m *RewriteResponse) String() string { return proto.CompactTextString(m) } func (*RewriteResponse) ProtoMessage() {} func (*RewriteResponse) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{41} } func (m *RewriteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RewriteResponse.Unmarshal(m, b) } func (m *RewriteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RewriteResponse.Marshal(b, m, deterministic) } func (m *RewriteResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_RewriteResponse.Merge(m, src) } func (m *RewriteResponse) XXX_Size() int { return xxx_messageInfo_RewriteResponse.Size(m) } func (m *RewriteResponse) XXX_DiscardUnknown() { xxx_messageInfo_RewriteResponse.DiscardUnknown(m) } var xxx_messageInfo_RewriteResponse proto.InternalMessageInfo func (m *RewriteResponse) GetTotalBytesRewritten() int64 { if m != nil { return m.TotalBytesRewritten } return 0 } func (m *RewriteResponse) GetObjectSize() int64 { if m != nil { return m.ObjectSize } return 0 } func (m *RewriteResponse) GetDone() bool { if m != nil { return m.Done } return false } func (m *RewriteResponse) GetRewriteToken() string { if m != nil { return m.RewriteToken } return "" } func (m *RewriteResponse) GetResource() *Object { if m != nil { return m.Resource } return nil } // Request message StartResumableWrite. type StartResumableWriteRequest struct { // The destination bucket, object, and metadata, as well as any preconditions. InsertObjectSpec *InsertObjectSpec `protobuf:"bytes,1,opt,name=insert_object_spec,json=insertObjectSpec,proto3" json:"insert_object_spec,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,3,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,4,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *StartResumableWriteRequest) Reset() { *m = StartResumableWriteRequest{} } func (m *StartResumableWriteRequest) String() string { return proto.CompactTextString(m) } func (*StartResumableWriteRequest) ProtoMessage() {} func (*StartResumableWriteRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{42} } func (m *StartResumableWriteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StartResumableWriteRequest.Unmarshal(m, b) } func (m *StartResumableWriteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StartResumableWriteRequest.Marshal(b, m, deterministic) } func (m *StartResumableWriteRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_StartResumableWriteRequest.Merge(m, src) } func (m *StartResumableWriteRequest) XXX_Size() int { return xxx_messageInfo_StartResumableWriteRequest.Size(m) } func (m *StartResumableWriteRequest) XXX_DiscardUnknown() { xxx_messageInfo_StartResumableWriteRequest.DiscardUnknown(m) } var xxx_messageInfo_StartResumableWriteRequest proto.InternalMessageInfo func (m *StartResumableWriteRequest) GetInsertObjectSpec() *InsertObjectSpec { if m != nil { return m.InsertObjectSpec } return nil } func (m *StartResumableWriteRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *StartResumableWriteRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Response object for ByteStream.StartResumableWrite. type StartResumableWriteResponse struct { // The upload_id of the newly started resumable write operation. This // value should be copied into the `InsertObjectRequest.upload_id` field. UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *StartResumableWriteResponse) Reset() { *m = StartResumableWriteResponse{} } func (m *StartResumableWriteResponse) String() string { return proto.CompactTextString(m) } func (*StartResumableWriteResponse) ProtoMessage() {} func (*StartResumableWriteResponse) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{43} } func (m *StartResumableWriteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StartResumableWriteResponse.Unmarshal(m, b) } func (m *StartResumableWriteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StartResumableWriteResponse.Marshal(b, m, deterministic) } func (m *StartResumableWriteResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_StartResumableWriteResponse.Merge(m, src) } func (m *StartResumableWriteResponse) XXX_Size() int { return xxx_messageInfo_StartResumableWriteResponse.Size(m) } func (m *StartResumableWriteResponse) XXX_DiscardUnknown() { xxx_messageInfo_StartResumableWriteResponse.DiscardUnknown(m) } var xxx_messageInfo_StartResumableWriteResponse proto.InternalMessageInfo func (m *StartResumableWriteResponse) GetUploadId() string { if m != nil { return m.UploadId } return "" } // Request message for PatchObject. type PatchObjectRequest struct { // Name of the bucket in which the object resides. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Name of the object. // Required. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Apply a predefined set of access controls to this object. PredefinedAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,8,opt,name=predefined_acl,json=predefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"predefined_acl,omitempty"` // Set of properties to return. Defaults to FULL. Projection CommonEnums_Projection `protobuf:"varint,9,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,10,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The Object metadata for updating. Metadata *Object `protobuf:"bytes,11,opt,name=metadata,proto3" json:"metadata,omitempty"` // List of fields to be updated. // // To specify ALL fields, equivalent to the JSON API's "update" function, // specify a single field with the value `*`. Note: not recommended. If a new // field is introduced at a later time, an older client updating with the `*` // may accidentally reset the new field's value. // // Not specifying any fields is an error. // Not specifying a field while setting that field to a non-default value is // an error. UpdateMask *field_mask.FieldMask `protobuf:"bytes,12,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,13,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,14,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *PatchObjectRequest) Reset() { *m = PatchObjectRequest{} } func (m *PatchObjectRequest) String() string { return proto.CompactTextString(m) } func (*PatchObjectRequest) ProtoMessage() {} func (*PatchObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{44} } func (m *PatchObjectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PatchObjectRequest.Unmarshal(m, b) } func (m *PatchObjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_PatchObjectRequest.Marshal(b, m, deterministic) } func (m *PatchObjectRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_PatchObjectRequest.Merge(m, src) } func (m *PatchObjectRequest) XXX_Size() int { return xxx_messageInfo_PatchObjectRequest.Size(m) } func (m *PatchObjectRequest) XXX_DiscardUnknown() { xxx_messageInfo_PatchObjectRequest.DiscardUnknown(m) } var xxx_messageInfo_PatchObjectRequest proto.InternalMessageInfo func (m *PatchObjectRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *PatchObjectRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *PatchObjectRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *PatchObjectRequest) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *PatchObjectRequest) GetIfGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationNotMatch } return nil } func (m *PatchObjectRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *PatchObjectRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *PatchObjectRequest) GetPredefinedAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.PredefinedAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *PatchObjectRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *PatchObjectRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *PatchObjectRequest) GetMetadata() *Object { if m != nil { return m.Metadata } return nil } func (m *PatchObjectRequest) GetUpdateMask() *field_mask.FieldMask { if m != nil { return m.UpdateMask } return nil } func (m *PatchObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *PatchObjectRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for UpdateObject. type UpdateObjectRequest struct { // Name of the bucket in which the object resides. // Required. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Name of the object. // Required. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *wrappers.Int64Value `protobuf:"bytes,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *wrappers.Int64Value `protobuf:"bytes,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *wrappers.Int64Value `protobuf:"bytes,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3" json:"if_metageneration_not_match,omitempty"` // Apply a predefined set of access controls to this object. PredefinedAcl CommonEnums_PredefinedObjectAcl `protobuf:"varint,8,opt,name=predefined_acl,json=predefinedAcl,proto3,enum=google.storage.v1.CommonEnums_PredefinedObjectAcl" json:"predefined_acl,omitempty"` // Set of properties to return. Defaults to FULL. Projection CommonEnums_Projection `protobuf:"varint,9,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,10,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // The Object metadata for updating. Metadata *Object `protobuf:"bytes,11,opt,name=metadata,proto3" json:"metadata,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,12,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,13,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *UpdateObjectRequest) Reset() { *m = UpdateObjectRequest{} } func (m *UpdateObjectRequest) String() string { return proto.CompactTextString(m) } func (*UpdateObjectRequest) ProtoMessage() {} func (*UpdateObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{45} } func (m *UpdateObjectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateObjectRequest.Unmarshal(m, b) } func (m *UpdateObjectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_UpdateObjectRequest.Marshal(b, m, deterministic) } func (m *UpdateObjectRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_UpdateObjectRequest.Merge(m, src) } func (m *UpdateObjectRequest) XXX_Size() int { return xxx_messageInfo_UpdateObjectRequest.Size(m) } func (m *UpdateObjectRequest) XXX_DiscardUnknown() { xxx_messageInfo_UpdateObjectRequest.DiscardUnknown(m) } var xxx_messageInfo_UpdateObjectRequest proto.InternalMessageInfo func (m *UpdateObjectRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *UpdateObjectRequest) GetObject() string { if m != nil { return m.Object } return "" } func (m *UpdateObjectRequest) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *UpdateObjectRequest) GetIfGenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationMatch } return nil } func (m *UpdateObjectRequest) GetIfGenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfGenerationNotMatch } return nil } func (m *UpdateObjectRequest) GetIfMetagenerationMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationMatch } return nil } func (m *UpdateObjectRequest) GetIfMetagenerationNotMatch() *wrappers.Int64Value { if m != nil { return m.IfMetagenerationNotMatch } return nil } func (m *UpdateObjectRequest) GetPredefinedAcl() CommonEnums_PredefinedObjectAcl { if m != nil { return m.PredefinedAcl } return CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED } func (m *UpdateObjectRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *UpdateObjectRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *UpdateObjectRequest) GetMetadata() *Object { if m != nil { return m.Metadata } return nil } func (m *UpdateObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if m != nil { return m.CommonObjectRequestParams } return nil } func (m *UpdateObjectRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for WatchAllObjects. type WatchAllObjectsRequest struct { // Name of the bucket in which to look for objects. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // If true, lists all versions of an object as distinct results. // The default is false. For more information, see Object Versioning. Versions bool `protobuf:"varint,2,opt,name=versions,proto3" json:"versions,omitempty"` // Returns results in a directory-like mode. items will contain // only objects whose names, aside from the prefix, do not // contain delimiter. Objects whose names, aside from the // prefix, contain delimiter will have their name, // truncated after the delimiter, returned in // prefixes. Duplicate prefixes are omitted. Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` // Maximum number of items plus prefixes to return // in a single page of responses. As duplicate prefixes are // omitted, fewer total results may be returned than requested. The service // will use this parameter or 1,000 items, whichever is smaller. MaxResults int32 `protobuf:"varint,4,opt,name=max_results,json=maxResults,proto3" json:"max_results,omitempty"` // Filter results to objects whose names begin with this prefix. Prefix string `protobuf:"bytes,5,opt,name=prefix,proto3" json:"prefix,omitempty"` // If true, objects that end in exactly one instance of delimiter // will have their metadata included in items in addition to // prefixes. IncludeTrailingDelimiter bool `protobuf:"varint,6,opt,name=include_trailing_delimiter,json=includeTrailingDelimiter,proto3" json:"include_trailing_delimiter,omitempty"` // A previously-returned page token representing part of the larger set of // results to view. PageToken string `protobuf:"bytes,7,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // Set of properties to return. Defaults to NO_ACL. Projection CommonEnums_Projection `protobuf:"varint,8,opt,name=projection,proto3,enum=google.storage.v1.CommonEnums_Projection" json:"projection,omitempty"` // The project to be billed for this request. // Required for Requester Pays buckets. UserProject string `protobuf:"bytes,9,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Properties of the channel to be inserted. Channel *Channel `protobuf:"bytes,10,opt,name=channel,proto3" json:"channel,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,11,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *WatchAllObjectsRequest) Reset() { *m = WatchAllObjectsRequest{} } func (m *WatchAllObjectsRequest) String() string { return proto.CompactTextString(m) } func (*WatchAllObjectsRequest) ProtoMessage() {} func (*WatchAllObjectsRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{46} } func (m *WatchAllObjectsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_WatchAllObjectsRequest.Unmarshal(m, b) } func (m *WatchAllObjectsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_WatchAllObjectsRequest.Marshal(b, m, deterministic) } func (m *WatchAllObjectsRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_WatchAllObjectsRequest.Merge(m, src) } func (m *WatchAllObjectsRequest) XXX_Size() int { return xxx_messageInfo_WatchAllObjectsRequest.Size(m) } func (m *WatchAllObjectsRequest) XXX_DiscardUnknown() { xxx_messageInfo_WatchAllObjectsRequest.DiscardUnknown(m) } var xxx_messageInfo_WatchAllObjectsRequest proto.InternalMessageInfo func (m *WatchAllObjectsRequest) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *WatchAllObjectsRequest) GetVersions() bool { if m != nil { return m.Versions } return false } func (m *WatchAllObjectsRequest) GetDelimiter() string { if m != nil { return m.Delimiter } return "" } func (m *WatchAllObjectsRequest) GetMaxResults() int32 { if m != nil { return m.MaxResults } return 0 } func (m *WatchAllObjectsRequest) GetPrefix() string { if m != nil { return m.Prefix } return "" } func (m *WatchAllObjectsRequest) GetIncludeTrailingDelimiter() bool { if m != nil { return m.IncludeTrailingDelimiter } return false } func (m *WatchAllObjectsRequest) GetPageToken() string { if m != nil { return m.PageToken } return "" } func (m *WatchAllObjectsRequest) GetProjection() CommonEnums_Projection { if m != nil { return m.Projection } return CommonEnums_PROJECTION_UNSPECIFIED } func (m *WatchAllObjectsRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *WatchAllObjectsRequest) GetChannel() *Channel { if m != nil { return m.Channel } return nil } func (m *WatchAllObjectsRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Request message for GetProjectServiceAccount. type GetProjectServiceAccountRequest struct { // Project ID. // Required. ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // The project to be billed for this request. UserProject string `protobuf:"bytes,2,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // A set of parameters common to all Storage API requests. CommonRequestParams *CommonRequestParams `protobuf:"bytes,3,opt,name=common_request_params,json=commonRequestParams,proto3" json:"common_request_params,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *GetProjectServiceAccountRequest) Reset() { *m = GetProjectServiceAccountRequest{} } func (m *GetProjectServiceAccountRequest) String() string { return proto.CompactTextString(m) } func (*GetProjectServiceAccountRequest) ProtoMessage() {} func (*GetProjectServiceAccountRequest) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{47} } func (m *GetProjectServiceAccountRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetProjectServiceAccountRequest.Unmarshal(m, b) } func (m *GetProjectServiceAccountRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetProjectServiceAccountRequest.Marshal(b, m, deterministic) } func (m *GetProjectServiceAccountRequest) XXX_Merge(src proto.Message) { xxx_messageInfo_GetProjectServiceAccountRequest.Merge(m, src) } func (m *GetProjectServiceAccountRequest) XXX_Size() int { return xxx_messageInfo_GetProjectServiceAccountRequest.Size(m) } func (m *GetProjectServiceAccountRequest) XXX_DiscardUnknown() { xxx_messageInfo_GetProjectServiceAccountRequest.DiscardUnknown(m) } var xxx_messageInfo_GetProjectServiceAccountRequest proto.InternalMessageInfo func (m *GetProjectServiceAccountRequest) GetProjectId() string { if m != nil { return m.ProjectId } return "" } func (m *GetProjectServiceAccountRequest) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *GetProjectServiceAccountRequest) GetCommonRequestParams() *CommonRequestParams { if m != nil { return m.CommonRequestParams } return nil } // Parameters that can be passed to any object request. type CommonObjectRequestParams struct { // Encryption algorithm used with Customer-Supplied Encryption Keys feature. EncryptionAlgorithm string `protobuf:"bytes,1,opt,name=encryption_algorithm,json=encryptionAlgorithm,proto3" json:"encryption_algorithm,omitempty"` // Encryption key used with Customer-Supplied Encryption Keys feature. EncryptionKey string `protobuf:"bytes,2,opt,name=encryption_key,json=encryptionKey,proto3" json:"encryption_key,omitempty"` // SHA256 hash of encryption key used with Customer-Supplied Encryption Keys // feature. EncryptionKeySha256 string `protobuf:"bytes,3,opt,name=encryption_key_sha256,json=encryptionKeySha256,proto3" json:"encryption_key_sha256,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *CommonObjectRequestParams) Reset() { *m = CommonObjectRequestParams{} } func (m *CommonObjectRequestParams) String() string { return proto.CompactTextString(m) } func (*CommonObjectRequestParams) ProtoMessage() {} func (*CommonObjectRequestParams) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{48} } func (m *CommonObjectRequestParams) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CommonObjectRequestParams.Unmarshal(m, b) } func (m *CommonObjectRequestParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CommonObjectRequestParams.Marshal(b, m, deterministic) } func (m *CommonObjectRequestParams) XXX_Merge(src proto.Message) { xxx_messageInfo_CommonObjectRequestParams.Merge(m, src) } func (m *CommonObjectRequestParams) XXX_Size() int { return xxx_messageInfo_CommonObjectRequestParams.Size(m) } func (m *CommonObjectRequestParams) XXX_DiscardUnknown() { xxx_messageInfo_CommonObjectRequestParams.DiscardUnknown(m) } var xxx_messageInfo_CommonObjectRequestParams proto.InternalMessageInfo func (m *CommonObjectRequestParams) GetEncryptionAlgorithm() string { if m != nil { return m.EncryptionAlgorithm } return "" } func (m *CommonObjectRequestParams) GetEncryptionKey() string { if m != nil { return m.EncryptionKey } return "" } func (m *CommonObjectRequestParams) GetEncryptionKeySha256() string { if m != nil { return m.EncryptionKeySha256 } return "" } // Parameters that can be passed to any request. type CommonRequestParams struct { // Required when using buckets with Requestor Pays feature enabled. UserProject string `protobuf:"bytes,1,opt,name=user_project,json=userProject,proto3" json:"user_project,omitempty"` // Lets you enforce per-user quotas from a server-side application even in // cases when the user's IP address is unknown. This can occur, for example, // with applications that run cron jobs on App Engine on a user's behalf. // You can choose any arbitrary string that uniquely identifies a user, but it // is limited to 40 characters. // Overrides user_ip if both are provided. // (!-- QuotaUser string `protobuf:"bytes,2,opt,name=quota_user,json=quotaUser,proto3" json:"quota_user,omitempty"` // IP address of the end user for whom the API call is being made. // Lets you enforce per-user quotas when calling the API from a server-side // application. // (!-- UserIp string `protobuf:"bytes,3,opt,name=user_ip,json=userIp,proto3" json:"user_ip,omitempty"` // Subset of fields to include in the response. Fields *field_mask.FieldMask `protobuf:"bytes,4,opt,name=fields,proto3" json:"fields,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *CommonRequestParams) Reset() { *m = CommonRequestParams{} } func (m *CommonRequestParams) String() string { return proto.CompactTextString(m) } func (*CommonRequestParams) ProtoMessage() {} func (*CommonRequestParams) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{49} } func (m *CommonRequestParams) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CommonRequestParams.Unmarshal(m, b) } func (m *CommonRequestParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CommonRequestParams.Marshal(b, m, deterministic) } func (m *CommonRequestParams) XXX_Merge(src proto.Message) { xxx_messageInfo_CommonRequestParams.Merge(m, src) } func (m *CommonRequestParams) XXX_Size() int { return xxx_messageInfo_CommonRequestParams.Size(m) } func (m *CommonRequestParams) XXX_DiscardUnknown() { xxx_messageInfo_CommonRequestParams.DiscardUnknown(m) } var xxx_messageInfo_CommonRequestParams proto.InternalMessageInfo func (m *CommonRequestParams) GetUserProject() string { if m != nil { return m.UserProject } return "" } func (m *CommonRequestParams) GetQuotaUser() string { if m != nil { return m.QuotaUser } return "" } func (m *CommonRequestParams) GetUserIp() string { if m != nil { return m.UserIp } return "" } func (m *CommonRequestParams) GetFields() *field_mask.FieldMask { if m != nil { return m.Fields } return nil } // Shared constants. type ServiceConstants struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ServiceConstants) Reset() { *m = ServiceConstants{} } func (m *ServiceConstants) String() string { return proto.CompactTextString(m) } func (*ServiceConstants) ProtoMessage() {} func (*ServiceConstants) Descriptor() ([]byte, []int) { return fileDescriptor_cfff1fb85921a0a4, []int{50} } func (m *ServiceConstants) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ServiceConstants.Unmarshal(m, b) } func (m *ServiceConstants) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ServiceConstants.Marshal(b, m, deterministic) } func (m *ServiceConstants) XXX_Merge(src proto.Message) { xxx_messageInfo_ServiceConstants.Merge(m, src) } func (m *ServiceConstants) XXX_Size() int { return xxx_messageInfo_ServiceConstants.Size(m) } func (m *ServiceConstants) XXX_DiscardUnknown() { xxx_messageInfo_ServiceConstants.DiscardUnknown(m) } var xxx_messageInfo_ServiceConstants proto.InternalMessageInfo func init() { proto.RegisterEnum("google.storage.v1.ServiceConstants_Values", ServiceConstants_Values_name, ServiceConstants_Values_value) proto.RegisterType((*DeleteBucketAccessControlRequest)(nil), "google.storage.v1.DeleteBucketAccessControlRequest") proto.RegisterType((*GetBucketAccessControlRequest)(nil), "google.storage.v1.GetBucketAccessControlRequest") proto.RegisterType((*InsertBucketAccessControlRequest)(nil), "google.storage.v1.InsertBucketAccessControlRequest") proto.RegisterType((*ListBucketAccessControlsRequest)(nil), "google.storage.v1.ListBucketAccessControlsRequest") proto.RegisterType((*PatchBucketAccessControlRequest)(nil), "google.storage.v1.PatchBucketAccessControlRequest") proto.RegisterType((*UpdateBucketAccessControlRequest)(nil), "google.storage.v1.UpdateBucketAccessControlRequest") proto.RegisterType((*DeleteBucketRequest)(nil), "google.storage.v1.DeleteBucketRequest") proto.RegisterType((*GetBucketRequest)(nil), "google.storage.v1.GetBucketRequest") proto.RegisterType((*InsertBucketRequest)(nil), "google.storage.v1.InsertBucketRequest") proto.RegisterType((*ListBucketsRequest)(nil), "google.storage.v1.ListBucketsRequest") proto.RegisterType((*LockRetentionPolicyRequest)(nil), "google.storage.v1.LockRetentionPolicyRequest") proto.RegisterType((*PatchBucketRequest)(nil), "google.storage.v1.PatchBucketRequest") proto.RegisterType((*UpdateBucketRequest)(nil), "google.storage.v1.UpdateBucketRequest") proto.RegisterType((*StopChannelRequest)(nil), "google.storage.v1.StopChannelRequest") proto.RegisterType((*DeleteDefaultObjectAccessControlRequest)(nil), "google.storage.v1.DeleteDefaultObjectAccessControlRequest") proto.RegisterType((*GetDefaultObjectAccessControlRequest)(nil), "google.storage.v1.GetDefaultObjectAccessControlRequest") proto.RegisterType((*InsertDefaultObjectAccessControlRequest)(nil), "google.storage.v1.InsertDefaultObjectAccessControlRequest") proto.RegisterType((*ListDefaultObjectAccessControlsRequest)(nil), "google.storage.v1.ListDefaultObjectAccessControlsRequest") proto.RegisterType((*PatchDefaultObjectAccessControlRequest)(nil), "google.storage.v1.PatchDefaultObjectAccessControlRequest") proto.RegisterType((*UpdateDefaultObjectAccessControlRequest)(nil), "google.storage.v1.UpdateDefaultObjectAccessControlRequest") proto.RegisterType((*DeleteNotificationRequest)(nil), "google.storage.v1.DeleteNotificationRequest") proto.RegisterType((*GetNotificationRequest)(nil), "google.storage.v1.GetNotificationRequest") proto.RegisterType((*InsertNotificationRequest)(nil), "google.storage.v1.InsertNotificationRequest") proto.RegisterType((*ListNotificationsRequest)(nil), "google.storage.v1.ListNotificationsRequest") proto.RegisterType((*DeleteObjectAccessControlRequest)(nil), "google.storage.v1.DeleteObjectAccessControlRequest") proto.RegisterType((*GetObjectAccessControlRequest)(nil), "google.storage.v1.GetObjectAccessControlRequest") proto.RegisterType((*InsertObjectAccessControlRequest)(nil), "google.storage.v1.InsertObjectAccessControlRequest") proto.RegisterType((*ListObjectAccessControlsRequest)(nil), "google.storage.v1.ListObjectAccessControlsRequest") proto.RegisterType((*UpdateObjectAccessControlRequest)(nil), "google.storage.v1.UpdateObjectAccessControlRequest") proto.RegisterType((*ComposeObjectRequest)(nil), "google.storage.v1.ComposeObjectRequest") proto.RegisterType((*ComposeObjectRequest_SourceObjects)(nil), "google.storage.v1.ComposeObjectRequest.SourceObjects") proto.RegisterType((*ComposeObjectRequest_SourceObjects_ObjectPreconditions)(nil), "google.storage.v1.ComposeObjectRequest.SourceObjects.ObjectPreconditions") proto.RegisterType((*CopyObjectRequest)(nil), "google.storage.v1.CopyObjectRequest") proto.RegisterType((*DeleteObjectRequest)(nil), "google.storage.v1.DeleteObjectRequest") proto.RegisterType((*GetObjectMediaRequest)(nil), "google.storage.v1.GetObjectMediaRequest") proto.RegisterType((*GetObjectRequest)(nil), "google.storage.v1.GetObjectRequest") proto.RegisterType((*GetObjectMediaResponse)(nil), "google.storage.v1.GetObjectMediaResponse") proto.RegisterType((*InsertObjectSpec)(nil), "google.storage.v1.InsertObjectSpec") proto.RegisterType((*InsertObjectRequest)(nil), "google.storage.v1.InsertObjectRequest") proto.RegisterType((*ListObjectsRequest)(nil), "google.storage.v1.ListObjectsRequest") proto.RegisterType((*QueryWriteStatusRequest)(nil), "google.storage.v1.QueryWriteStatusRequest") proto.RegisterType((*QueryWriteStatusResponse)(nil), "google.storage.v1.QueryWriteStatusResponse") proto.RegisterType((*RewriteObjectRequest)(nil), "google.storage.v1.RewriteObjectRequest") proto.RegisterType((*RewriteResponse)(nil), "google.storage.v1.RewriteResponse") proto.RegisterType((*StartResumableWriteRequest)(nil), "google.storage.v1.StartResumableWriteRequest") proto.RegisterType((*StartResumableWriteResponse)(nil), "google.storage.v1.StartResumableWriteResponse") proto.RegisterType((*PatchObjectRequest)(nil), "google.storage.v1.PatchObjectRequest") proto.RegisterType((*UpdateObjectRequest)(nil), "google.storage.v1.UpdateObjectRequest") proto.RegisterType((*WatchAllObjectsRequest)(nil), "google.storage.v1.WatchAllObjectsRequest") proto.RegisterType((*GetProjectServiceAccountRequest)(nil), "google.storage.v1.GetProjectServiceAccountRequest") proto.RegisterType((*CommonObjectRequestParams)(nil), "google.storage.v1.CommonObjectRequestParams") proto.RegisterType((*CommonRequestParams)(nil), "google.storage.v1.CommonRequestParams") proto.RegisterType((*ServiceConstants)(nil), "google.storage.v1.ServiceConstants") } func init() { proto.RegisterFile("google/storage/v1/storage.proto", fileDescriptor_cfff1fb85921a0a4) } var fileDescriptor_cfff1fb85921a0a4 = []byte{ // 4097 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3d, 0x4b, 0x6c, 0x24, 0x49, 0x56, 0xae, 0xaf, 0xab, 0x5e, 0xd9, 0xee, 0x72, 0xd8, 0xee, 0xae, 0x2e, 0x77, 0xb7, 0xdd, 0xd5, 0xd3, 0xbf, 0x99, 0x1e, 0x7b, 0xdb, 0xb3, 0x33, 0xcb, 0xce, 0x20, 0xd8, 0x72, 0xb9, 0xda, 0x5d, 0xf8, 0xdb, 0x59, 0xe5, 0x99, 0xed, 0xd6, 0xb2, 0x49, 0x76, 0x56, 0x94, 0x9d, 0xeb, 0xca, 0xcc, 0x9a, 0xcc, 0xac, 0xee, 0xf6, 0x88, 0x43, 0xb3, 0x12, 0x2b, 0xe0, 0xc2, 0x01, 0x71, 0x03, 0x09, 0x21, 0x16, 0xc4, 0x81, 0xc3, 0x0a, 0x0e, 0x88, 0x03, 0x20, 0x0e, 0x08, 0xad, 0x04, 0xe2, 0x23, 0x10, 0x12, 0xe2, 0x80, 0x84, 0x04, 0x08, 0x21, 0xed, 0x8d, 0x0b, 0x42, 0xab, 0xcc, 0xc8, 0x4c, 0xe7, 0x27, 0x32, 0xb3, 0xca, 0xf5, 0xe9, 0x69, 0xcb, 0xb7, 0xca, 0x88, 0x17, 0x2f, 0x22, 0x5e, 0xbc, 0x5f, 0xbc, 0x88, 0x78, 0x05, 0x4b, 0x87, 0xb2, 0x7c, 0xd8, 0xc6, 0xab, 0xaa, 0x26, 0x2b, 0xdc, 0x21, 0x5e, 0x7d, 0xf1, 0xd0, 0xfa, 0xb9, 0xd2, 0x51, 0x64, 0x4d, 0x46, 0xb3, 0x04, 0x60, 0xc5, 0x2a, 0x7d, 0xf1, 0xb0, 0x78, 0xc3, 0x6c, 0x23, 0x70, 0xa2, 0x0e, 0x2f, 0x70, 0x22, 0xdb, 0x91, 0xdb, 0x02, 0x7f, 0x42, 0x9a, 0x14, 0x8b, 0xee, 0x7a, 0x57, 0xdd, 0xa2, 0x59, 0x67, 0x7c, 0x3d, 0xef, 0xb6, 0x56, 0xb1, 0xd8, 0xd1, 0xac, 0xca, 0x65, 0x6f, 0x65, 0x4b, 0xc0, 0xed, 0x26, 0x2b, 0x72, 0xea, 0xb1, 0x09, 0x71, 0xc3, 0x0b, 0xf1, 0x52, 0xe1, 0x3a, 0x1d, 0xac, 0xa8, 0x66, 0xfd, 0xfd, 0xc0, 0xe9, 0xb0, 0x0a, 0x56, 0xe5, 0xae, 0xc2, 0x63, 0x0b, 0xf4, 0x8a, 0x09, 0xca, 0x75, 0x84, 0x55, 0xbe, 0x2d, 0x60, 0x49, 0x23, 0x15, 0xa5, 0xbf, 0x8b, 0xc1, 0xf2, 0x06, 0x6e, 0x63, 0x0d, 0xaf, 0x77, 0xf9, 0x63, 0xac, 0x95, 0x79, 0x1e, 0xab, 0x6a, 0x45, 0x96, 0x34, 0x45, 0x6e, 0x33, 0xf8, 0xf3, 0x2e, 0x56, 0x35, 0x74, 0x19, 0xd2, 0xcf, 0x8d, 0xda, 0x42, 0x6c, 0x39, 0x76, 0x2f, 0xcb, 0x98, 0x5f, 0x7a, 0x39, 0x96, 0x34, 0x41, 0x3b, 0x29, 0xc4, 0x49, 0x39, 0xf9, 0x42, 0x37, 0x61, 0xaa, 0xab, 0x62, 0x85, 0xed, 0x28, 0xf2, 0x77, 0x30, 0xaf, 0x15, 0x12, 0x46, 0x6d, 0x4e, 0x2f, 0xdb, 0x27, 0x45, 0xe8, 0x19, 0x2c, 0xf0, 0xb2, 0x28, 0xca, 0x12, 0xab, 0x90, 0x4e, 0xd8, 0x0e, 0xa7, 0x70, 0xa2, 0x5a, 0x48, 0x2e, 0xc7, 0xee, 0xe5, 0xd6, 0xee, 0xac, 0xf8, 0x56, 0x62, 0xa5, 0x62, 0xc0, 0x9b, 0x63, 0xda, 0x37, 0xa0, 0x99, 0x39, 0xde, 0x5f, 0x58, 0xfa, 0x9b, 0x18, 0x5c, 0xdf, 0xc4, 0xda, 0xf9, 0x99, 0xd0, 0xaf, 0xc7, 0x61, 0xb9, 0x26, 0xa9, 0x58, 0x39, 0xcb, 0x9c, 0xbc, 0x63, 0x8f, 0x53, 0xc7, 0x4e, 0x80, 0x59, 0xce, 0xc0, 0xcc, 0xf2, 0x04, 0xb5, 0x31, 0x4f, 0xfa, 0xd8, 0x69, 0x03, 0x99, 0x7b, 0xee, 0x2f, 0x1c, 0x29, 0x5d, 0xfe, 0x38, 0x06, 0x4b, 0xdb, 0x82, 0x4a, 0xa3, 0x8a, 0x3a, 0x1c, 0xb2, 0xd0, 0x87, 0x9e, 0x18, 0x7c, 0xe8, 0xff, 0x15, 0x87, 0xa5, 0x7d, 0x4e, 0xe3, 0x8f, 0xc6, 0xce, 0xa5, 0xf4, 0x95, 0x4e, 0x0e, 0xbe, 0xd2, 0x9f, 0x40, 0xae, 0xdb, 0x69, 0x72, 0x1a, 0x36, 0x74, 0x58, 0x21, 0x65, 0x60, 0x2c, 0x5a, 0x18, 0x2d, 0x25, 0xb6, 0xf2, 0x48, 0x57, 0x73, 0x3b, 0x9c, 0x7a, 0xcc, 0x00, 0x01, 0xd7, 0x7f, 0x07, 0xd3, 0x3a, 0x3d, 0x38, 0xad, 0xff, 0x20, 0x0e, 0xcb, 0x07, 0x46, 0x57, 0xe7, 0x87, 0xd8, 0x81, 0xf4, 0x4a, 0x0d, 0x4e, 0xaf, 0x7f, 0x8d, 0xc3, 0x9c, 0xd3, 0x26, 0x44, 0x91, 0xa8, 0x0e, 0x57, 0x84, 0x16, 0x2b, 0x62, 0x8d, 0x3b, 0xc4, 0x12, 0x56, 0x38, 0x4d, 0x90, 0x25, 0x56, 0xd4, 0x99, 0xdb, 0xa0, 0x59, 0x6e, 0x6d, 0xd1, 0xc7, 0x04, 0x35, 0x49, 0xfb, 0xe8, 0xab, 0x9f, 0x72, 0xed, 0x2e, 0x66, 0x16, 0x84, 0xd6, 0x8e, 0xab, 0xe9, 0x8e, 0xde, 0x12, 0x3d, 0x83, 0x45, 0x3f, 0x52, 0x49, 0xd6, 0x4c, 0xc4, 0x89, 0x68, 0xc4, 0x05, 0x2f, 0xe2, 0x5d, 0x59, 0x23, 0xb8, 0xbd, 0x6b, 0x97, 0xec, 0x43, 0xf6, 0x87, 0x40, 0xdf, 0xef, 0x27, 0x20, 0x6f, 0xdb, 0xa7, 0x73, 0x47, 0xdc, 0x1a, 0x80, 0x49, 0x57, 0x41, 0x96, 0x0c, 0xd2, 0xce, 0xac, 0xdd, 0x0f, 0x24, 0x57, 0x55, 0xea, 0x8a, 0xea, 0xca, 0xbe, 0xdd, 0x80, 0x71, 0x34, 0xf6, 0xad, 0x53, 0xaa, 0x8f, 0x75, 0x1a, 0x82, 0xde, 0xf8, 0xff, 0x04, 0xcc, 0x39, 0xcd, 0xae, 0xb5, 0x54, 0x4f, 0x61, 0xa6, 0xa3, 0xe0, 0x26, 0x6e, 0x09, 0x12, 0x6e, 0xb2, 0x1c, 0xdf, 0x36, 0x96, 0x6c, 0x66, 0x6d, 0x2d, 0x72, 0x96, 0x56, 0x23, 0x4b, 0xcc, 0xdb, 0xcc, 0xf4, 0x29, 0xa6, 0x32, 0xdf, 0x46, 0x5d, 0xb8, 0xee, 0x40, 0xdd, 0xc4, 0x2d, 0xae, 0xdb, 0xd6, 0x58, 0xf9, 0xb9, 0x3e, 0x57, 0xa3, 0xa7, 0x78, 0x9f, 0x3d, 0xed, 0x19, 0x4d, 0xf5, 0x9e, 0x8a, 0xa7, 0x88, 0x37, 0x08, 0x5e, 0xbb, 0x0e, 0x15, 0x60, 0xd2, 0xad, 0xc7, 0xac, 0xcf, 0x31, 0xaf, 0xe6, 0x43, 0x5b, 0x08, 0xc8, 0xf2, 0x5d, 0x0d, 0x54, 0x91, 0xb6, 0x7c, 0x04, 0x32, 0xc0, 0xe4, 0xe0, 0x0c, 0xf0, 0xb7, 0x71, 0x40, 0xa7, 0xfe, 0x85, 0xed, 0x52, 0x2c, 0x41, 0x4e, 0xe4, 0x5e, 0xe9, 0x3e, 0x76, 0xb7, 0xad, 0xa9, 0xc6, 0xe2, 0xa7, 0x18, 0x10, 0xb9, 0x57, 0x0c, 0x29, 0x41, 0xd7, 0x01, 0x3a, 0xba, 0x17, 0xae, 0xc9, 0xc7, 0x58, 0x32, 0xed, 0x46, 0x56, 0x2f, 0x69, 0xe8, 0x05, 0xba, 0xa8, 0x77, 0x14, 0xdc, 0x12, 0x5e, 0x99, 0xc4, 0x36, 0xbf, 0x9c, 0xab, 0x90, 0x0c, 0x5b, 0x85, 0xd4, 0x30, 0x57, 0x21, 0xdd, 0x87, 0x4c, 0x0d, 0x81, 0xa4, 0xff, 0x1d, 0x83, 0xe2, 0xb6, 0xcc, 0x1f, 0x33, 0x58, 0xd3, 0x0d, 0xa9, 0x2c, 0xed, 0x1b, 0x1b, 0xa6, 0x28, 0x2d, 0xf8, 0x51, 0xb8, 0x16, 0x4c, 0x04, 0x29, 0xba, 0x37, 0xec, 0xb8, 0xff, 0x4f, 0x0a, 0x90, 0xc3, 0xcb, 0x3b, 0x77, 0xba, 0xde, 0xaf, 0x09, 0x93, 0x63, 0xd3, 0x84, 0xa9, 0x91, 0x68, 0x42, 0xb7, 0xa4, 0xa5, 0x87, 0x29, 0x69, 0x93, 0x7e, 0xde, 0xfb, 0x10, 0x32, 0xfa, 0xc2, 0x34, 0x39, 0x8d, 0x2b, 0x64, 0xa2, 0x34, 0x9e, 0x0d, 0xea, 0xf5, 0xb4, 0xb3, 0xc3, 0xf1, 0xb4, 0x61, 0x70, 0x7e, 0xff, 0x41, 0x0a, 0xe6, 0x9c, 0x9e, 0xf6, 0x05, 0xc3, 0x5f, 0x30, 0xfc, 0x30, 0x18, 0x3e, 0x90, 0x67, 0xb3, 0x83, 0xf3, 0xec, 0xef, 0xc6, 0x00, 0xd5, 0x35, 0xb9, 0x53, 0x39, 0xe2, 0x24, 0x09, 0xdb, 0xfb, 0xc1, 0xaf, 0xc2, 0x24, 0x4f, 0x4a, 0x0c, 0x9e, 0x75, 0xc8, 0x97, 0xb3, 0x13, 0xb3, 0x8d, 0x05, 0x1a, 0x3c, 0xd0, 0xf8, 0xe0, 0x03, 0xfd, 0xe7, 0x18, 0xdc, 0x25, 0xdb, 0x32, 0xcf, 0x22, 0xbe, 0xfd, 0x01, 0xae, 0x7f, 0x8c, 0xc1, 0x3b, 0x9b, 0x58, 0x3b, 0x77, 0xf3, 0xfa, 0x8d, 0x38, 0xdc, 0x25, 0x3b, 0x88, 0xb3, 0x4f, 0xad, 0xb7, 0x40, 0x95, 0xad, 0x27, 0x7a, 0x8c, 0xdf, 0xd1, 0x06, 0x32, 0x27, 0xfb, 0x0b, 0x47, 0x4a, 0x9e, 0x1f, 0xc5, 0xe1, 0x8e, 0xee, 0x5f, 0x07, 0x13, 0x47, 0xbd, 0x88, 0x3d, 0x0c, 0x37, 0xf6, 0xa0, 0x93, 0xdc, 0xf0, 0x48, 0xdf, 0x94, 0xac, 0xd1, 0x19, 0x35, 0x39, 0x38, 0xa3, 0x7e, 0x69, 0xc3, 0x8f, 0x7f, 0x14, 0x87, 0xbb, 0xc4, 0x29, 0x3a, 0x77, 0x34, 0x1f, 0x25, 0xa7, 0xfe, 0x53, 0x0c, 0xae, 0x12, 0x73, 0xb7, 0x2b, 0x6b, 0x42, 0x4b, 0xe0, 0x0d, 0x39, 0x8a, 0x22, 0x54, 0x09, 0xa6, 0x24, 0x07, 0xb8, 0x49, 0x2e, 0x57, 0xd9, 0x9b, 0x36, 0x0a, 0xff, 0x10, 0x83, 0xcb, 0x9b, 0x58, 0x3b, 0x67, 0xb3, 0xfa, 0xdf, 0x18, 0x5c, 0x25, 0xa6, 0xae, 0x9f, 0x89, 0xf5, 0x60, 0xdc, 0x2a, 0x9e, 0xb9, 0x13, 0xed, 0xbb, 0x44, 0x19, 0xab, 0xab, 0x63, 0x37, 0x71, 0x46, 0x39, 0xf3, 0x1f, 0xc4, 0xa0, 0xa0, 0x5b, 0x31, 0x67, 0xf7, 0x5f, 0xf6, 0xe3, 0xa7, 0x5f, 0x8e, 0x5b, 0xc7, 0xbe, 0x43, 0x54, 0x46, 0x97, 0x21, 0x4d, 0x94, 0x84, 0x15, 0xd7, 0x22, 0x5f, 0xe8, 0x06, 0xc0, 0xa9, 0x21, 0x34, 0x28, 0x9e, 0x60, 0x1c, 0x25, 0x6f, 0x3a, 0xcc, 0xfb, 0xbd, 0xb8, 0x71, 0x5c, 0x7c, 0x41, 0x88, 0xbf, 0xb6, 0x8f, 0x99, 0xcf, 0x46, 0x0b, 0x73, 0xce, 0xf1, 0x90, 0x39, 0x27, 0x22, 0xe7, 0x9c, 0xec, 0xc3, 0x82, 0xa5, 0x46, 0x68, 0xc1, 0x86, 0x40, 0xcf, 0x1f, 0x99, 0xc7, 0xd3, 0x67, 0xf1, 0x6b, 0x47, 0x4b, 0xce, 0x91, 0x19, 0xed, 0xdf, 0x4e, 0x58, 0x47, 0xad, 0x6f, 0x8d, 0x38, 0xd1, 0x59, 0x2b, 0x3d, 0x42, 0xd6, 0x1a, 0x3c, 0x8c, 0xee, 0x75, 0x76, 0x33, 0xfd, 0x38, 0xbb, 0xa5, 0x7f, 0xc9, 0xc0, 0x7c, 0x45, 0x16, 0x3b, 0xb2, 0x6a, 0xae, 0x92, 0xb5, 0x30, 0xef, 0x03, 0x6a, 0x62, 0x55, 0x13, 0x24, 0xb2, 0xe3, 0x71, 0x2d, 0xd2, 0xac, 0xa3, 0x86, 0xc4, 0x67, 0xbc, 0xe0, 0x2e, 0x7e, 0x75, 0x82, 0x93, 0x4e, 0x50, 0x07, 0x8a, 0x4e, 0x70, 0x4f, 0x1c, 0x2d, 0x71, 0xe6, 0xe8, 0x56, 0xc1, 0x81, 0x75, 0xdf, 0x15, 0x52, 0xfb, 0x04, 0x72, 0x8e, 0xba, 0x42, 0x2e, 0x30, 0xe0, 0x64, 0x92, 0xc1, 0x09, 0x8d, 0xbe, 0x05, 0x33, 0xe4, 0x0e, 0x95, 0x39, 0x31, 0xb5, 0x30, 0xb5, 0x9c, 0xb8, 0x97, 0x5b, 0xfb, 0x90, 0x3e, 0x44, 0x1f, 0x35, 0x57, 0xea, 0x46, 0x6b, 0x52, 0xa6, 0x32, 0xd3, 0xaa, 0xf3, 0x13, 0x6d, 0xc1, 0x9c, 0xd0, 0x62, 0x7d, 0x7b, 0xd6, 0x64, 0xf4, 0xd6, 0x72, 0x56, 0x68, 0x6d, 0x7a, 0xf6, 0xab, 0x21, 0x9b, 0xe0, 0xd4, 0x99, 0x37, 0xc1, 0xcb, 0x30, 0x75, 0x2c, 0xaa, 0xec, 0x31, 0x3e, 0x61, 0x25, 0x4e, 0xc4, 0xe6, 0x41, 0x11, 0x1c, 0x8b, 0xea, 0x16, 0x3e, 0xd9, 0xe5, 0x44, 0xdc, 0x4b, 0xbc, 0x4f, 0x84, 0x6b, 0xa6, 0x0c, 0x98, 0x62, 0x46, 0x8d, 0xdf, 0x3d, 0x08, 0x5c, 0x75, 0x17, 0x45, 0x4d, 0x81, 0xb8, 0xca, 0x07, 0x55, 0x8d, 0x32, 0xb6, 0x5d, 0xfc, 0x7e, 0x1c, 0xa6, 0x5d, 0x4b, 0x8a, 0x10, 0x24, 0x0d, 0xca, 0x10, 0x01, 0x31, 0x7e, 0x7b, 0x74, 0x52, 0xdc, 0xa7, 0x93, 0x7e, 0x1e, 0xe6, 0x4d, 0x4a, 0x74, 0x14, 0xcc, 0xcb, 0x52, 0x53, 0x30, 0xdc, 0x45, 0xd3, 0xa7, 0xab, 0x9d, 0x89, 0xb7, 0x4c, 0xf6, 0xdd, 0x77, 0x22, 0xb4, 0x54, 0x92, 0xab, 0xb0, 0xf8, 0x1c, 0xe6, 0x28, 0xb0, 0x41, 0xcc, 0x18, 0x3b, 0x0b, 0x33, 0x96, 0xfe, 0x2d, 0x07, 0xb3, 0x15, 0xb9, 0x73, 0x72, 0xbe, 0x55, 0xcb, 0x50, 0xe5, 0x97, 0x31, 0xe4, 0x97, 0x1a, 0x6b, 0xea, 0x41, 0x7e, 0xe7, 0x9d, 0x08, 0xed, 0x38, 0x53, 0x88, 0x4e, 0x48, 0x8f, 0x2a, 0x30, 0x36, 0x39, 0x48, 0x60, 0xec, 0x9b, 0x50, 0x14, 0x5a, 0xac, 0xa9, 0x72, 0x7d, 0x63, 0xce, 0x44, 0xa3, 0xbe, 0x22, 0xb4, 0x88, 0x58, 0x78, 0xc9, 0xcb, 0xc2, 0x0d, 0x2a, 0xe6, 0xd3, 0x81, 0x67, 0xa3, 0xb1, 0x17, 0xfd, 0xd8, 0xed, 0xa1, 0xff, 0x9c, 0xb3, 0x03, 0x2a, 0xc9, 0x21, 0xba, 0x83, 0x45, 0xab, 0x03, 0x1a, 0xe1, 0x0f, 0xa1, 0x14, 0xd8, 0xc3, 0xe9, 0x34, 0x72, 0xd1, 0xbd, 0xdc, 0xa0, 0xf7, 0x12, 0x70, 0x7b, 0x67, 0x6a, 0x90, 0xe3, 0xa0, 0x5b, 0x60, 0xda, 0x3c, 0x4b, 0xda, 0xa7, 0x49, 0xd4, 0x82, 0x14, 0x9a, 0x82, 0x7e, 0x0a, 0x64, 0xca, 0xf8, 0x8c, 0x13, 0xc8, 0x14, 0xef, 0xf7, 0x60, 0xd6, 0xb7, 0x7a, 0x85, 0x4b, 0x86, 0x6e, 0xcd, 0xab, 0x9e, 0x45, 0xf1, 0x59, 0xa5, 0xbc, 0xdf, 0x2a, 0x79, 0xfc, 0x82, 0xd9, 0xbe, 0xfc, 0x82, 0xaf, 0x81, 0x53, 0x2b, 0xb0, 0x2e, 0x1b, 0x39, 0x6f, 0xf4, 0xb5, 0xe0, 0xa8, 0xdf, 0x3a, 0x35, 0x97, 0x51, 0xb6, 0x10, 0x8d, 0xc9, 0x16, 0xce, 0x0d, 0xee, 0xe6, 0xff, 0x45, 0xca, 0xba, 0x21, 0xe8, 0xd6, 0xf2, 0xfd, 0xee, 0x66, 0x16, 0x21, 0xdb, 0xed, 0xb4, 0x65, 0xae, 0xc9, 0x0a, 0x4d, 0xd3, 0xb9, 0xcf, 0x90, 0x82, 0x5a, 0x33, 0xd2, 0xbd, 0x0f, 0x50, 0xc1, 0xa9, 0x61, 0xab, 0xe0, 0xf4, 0x08, 0x54, 0xf0, 0xe4, 0xa8, 0x54, 0x70, 0x66, 0x98, 0x67, 0x13, 0xd9, 0xfe, 0x1d, 0x3a, 0x18, 0x13, 0x13, 0xe7, 0x06, 0x67, 0xe2, 0xff, 0x48, 0xc1, 0x82, 0x1d, 0xf7, 0xd9, 0xc1, 0x4d, 0x81, 0x1b, 0xd5, 0xa6, 0x7c, 0x09, 0x72, 0x0a, 0xe6, 0x9a, 0xac, 0xdc, 0x6a, 0xa9, 0x58, 0xb3, 0x58, 0x59, 0x2f, 0xda, 0x33, 0x4a, 0xd0, 0x75, 0x30, 0xbe, 0xd8, 0xb6, 0x20, 0x0a, 0x64, 0x9f, 0x9a, 0x60, 0xb2, 0x7a, 0xc9, 0xb6, 0x5e, 0x10, 0xc4, 0xe9, 0xe9, 0x61, 0x73, 0xfa, 0xe4, 0x08, 0x38, 0x3d, 0x33, 0x2a, 0x4e, 0xcf, 0x0e, 0x93, 0xd3, 0xa1, 0x7f, 0x4e, 0xcf, 0x8d, 0x89, 0xd3, 0xa7, 0x86, 0x72, 0x0d, 0x2d, 0x6f, 0x73, 0xfa, 0xa8, 0x98, 0xfc, 0xc2, 0x23, 0x1e, 0xb6, 0x47, 0xec, 0xf6, 0xc5, 0x32, 0xc3, 0xbc, 0x9a, 0x73, 0xbe, 0x35, 0xfb, 0xff, 0x91, 0x13, 0x36, 0x97, 0x66, 0x57, 0x3b, 0xb2, 0xa4, 0x62, 0xb4, 0x03, 0x79, 0xfe, 0x08, 0xf3, 0xc7, 0x6a, 0x57, 0x14, 0x71, 0x93, 0x35, 0x2e, 0x22, 0x91, 0x7d, 0x6e, 0x89, 0x7a, 0xbf, 0xc7, 0x06, 0xdd, 0xe0, 0x34, 0x8e, 0xb9, 0xc4, 0xbb, 0x0b, 0x74, 0x74, 0x26, 0xb5, 0xac, 0x1a, 0xeb, 0xaa, 0x4f, 0x29, 0xd0, 0x9d, 0xb4, 0x90, 0xaa, 0xcc, 0x25, 0xd9, 0x5d, 0x80, 0x36, 0x60, 0x9a, 0x97, 0x25, 0x0d, 0x4b, 0x1a, 0xab, 0x70, 0xd2, 0x21, 0x0e, 0x39, 0xec, 0xaa, 0x10, 0x38, 0x46, 0x07, 0x63, 0xa6, 0x78, 0xc7, 0x57, 0xe9, 0xdf, 0x93, 0x90, 0x77, 0xc6, 0xf1, 0xeb, 0x1d, 0xcc, 0xa3, 0x0f, 0x21, 0x63, 0x3d, 0x0a, 0x34, 0x27, 0x1c, 0xe2, 0xf0, 0xda, 0xa0, 0x94, 0x0b, 0x6f, 0x67, 0xbf, 0x81, 0xee, 0xb9, 0xf0, 0x16, 0xa0, 0x30, 0x12, 0xc3, 0x56, 0x18, 0xc9, 0x11, 0x28, 0x8c, 0xd4, 0xa8, 0x14, 0x46, 0x7a, 0x78, 0x0a, 0x63, 0x72, 0x98, 0x0a, 0x23, 0xe3, 0x53, 0x18, 0xa5, 0xdf, 0x4c, 0x59, 0xcf, 0x23, 0xdc, 0x86, 0xe5, 0xba, 0xd3, 0xa9, 0x37, 0x6c, 0xcb, 0xe3, 0x09, 0x87, 0x5b, 0x5f, 0x07, 0x24, 0x18, 0xad, 0x2c, 0x3d, 0xa3, 0x76, 0x30, 0x6f, 0x0a, 0xcd, 0x2d, 0xca, 0x60, 0xbd, 0x9c, 0xfc, 0x78, 0x82, 0xc9, 0x0b, 0x5e, 0xee, 0xbe, 0x09, 0x53, 0x2f, 0x15, 0x41, 0xc3, 0x96, 0x8b, 0x45, 0xcc, 0x53, 0xce, 0x28, 0x33, 0x7d, 0xac, 0x3d, 0x8a, 0xe4, 0x27, 0x7b, 0x95, 0xfc, 0xc7, 0x31, 0xbf, 0xec, 0x3f, 0x86, 0xac, 0x82, 0x5b, 0x58, 0xc1, 0x12, 0x8f, 0x4d, 0x86, 0xb8, 0x47, 0xc1, 0x44, 0x75, 0x31, 0x1f, 0xc7, 0x98, 0xd3, 0xc6, 0x54, 0x2d, 0x92, 0x3e, 0xbb, 0x16, 0xb9, 0x09, 0x53, 0x2d, 0x41, 0x12, 0xd4, 0x23, 0xd6, 0x98, 0xbf, 0xc1, 0x08, 0x19, 0x26, 0x47, 0xca, 0x3e, 0xd3, 0x8b, 0x22, 0x95, 0x7d, 0x66, 0x4c, 0xca, 0x7e, 0xf0, 0xfb, 0x9b, 0xeb, 0x97, 0x60, 0xba, 0x25, 0x28, 0xaa, 0xc6, 0x8a, 0x58, 0x55, 0xb9, 0x43, 0xbc, 0x9e, 0x86, 0xa4, 0xbe, 0xb8, 0xa5, 0xbf, 0x4c, 0x90, 0xd7, 0x1b, 0x56, 0x04, 0x3e, 0xc2, 0xef, 0xb9, 0x06, 0xd9, 0x26, 0x36, 0x1c, 0x70, 0xac, 0x58, 0x6f, 0x36, 0xec, 0x02, 0xf4, 0x93, 0x50, 0x14, 0x24, 0xbe, 0xdd, 0x6d, 0x62, 0x56, 0x53, 0x38, 0xa1, 0x2d, 0x48, 0x87, 0xec, 0x29, 0x78, 0xc2, 0xa0, 0x70, 0xc1, 0x84, 0x68, 0x98, 0x00, 0x1b, 0x76, 0x6b, 0xcf, 0x8b, 0x91, 0x64, 0xc4, 0x8b, 0x91, 0x54, 0xf0, 0x8b, 0x91, 0xb4, 0xeb, 0xc5, 0xc8, 0x58, 0x05, 0x1e, 0x15, 0x21, 0xf3, 0x02, 0x2b, 0xaa, 0x11, 0xaf, 0xce, 0x1a, 0x33, 0xb6, 0xbf, 0x47, 0x7a, 0xab, 0xfc, 0x17, 0xe2, 0x70, 0xe5, 0x49, 0x17, 0x2b, 0x27, 0x06, 0xef, 0xd6, 0x35, 0x4e, 0xeb, 0xda, 0xab, 0xb9, 0xe8, 0x53, 0x36, 0x0e, 0x55, 0x13, 0xc5, 0xe5, 0xf1, 0x31, 0x71, 0xf9, 0x10, 0x2e, 0x6c, 0xfc, 0x2c, 0x14, 0xfc, 0x24, 0x30, 0x7d, 0x9a, 0xdb, 0x30, 0xa3, 0x37, 0x11, 0x34, 0x0d, 0x37, 0x59, 0x55, 0xf8, 0x82, 0x18, 0xf8, 0x04, 0x33, 0x6d, 0x97, 0xd6, 0x85, 0x2f, 0xb0, 0xbe, 0x7c, 0xbc, 0x2c, 0x76, 0xda, 0x58, 0xc3, 0xc6, 0xcc, 0x33, 0x8c, 0xfd, 0x5d, 0xfa, 0xd5, 0x19, 0x98, 0x67, 0x30, 0x51, 0x97, 0x63, 0x8c, 0xdb, 0x87, 0xc5, 0xd2, 0x12, 0x61, 0xb1, 0xb4, 0xf0, 0x80, 0x7f, 0x72, 0x7c, 0x01, 0xff, 0x8b, 0x68, 0xd3, 0x88, 0x02, 0xfe, 0xd9, 0x91, 0x06, 0xfc, 0x61, 0xd4, 0x01, 0xff, 0xdc, 0x58, 0x02, 0xfe, 0x53, 0x83, 0x07, 0xfc, 0x7f, 0x0a, 0xae, 0xe9, 0xa6, 0xe9, 0xf9, 0x89, 0x86, 0x55, 0x56, 0x31, 0x54, 0x80, 0x86, 0x25, 0xb6, 0x83, 0x15, 0x96, 0xe7, 0xda, 0x6d, 0x23, 0x68, 0x9f, 0x60, 0x0a, 0x22, 0xf7, 0x6a, 0x5d, 0x07, 0x61, 0x2c, 0x88, 0x7d, 0xac, 0x54, 0xb8, 0xb6, 0xf7, 0xfd, 0xc8, 0xcc, 0x80, 0x07, 0x06, 0x64, 0x00, 0x96, 0x1d, 0xbc, 0x44, 0xce, 0x02, 0xcc, 0x42, 0x62, 0x0a, 0x7d, 0xa7, 0x0a, 0xf9, 0x5e, 0x4e, 0x15, 0x66, 0x7b, 0x3d, 0x55, 0x40, 0x3d, 0x9e, 0x2a, 0xcc, 0x51, 0x1f, 0xaf, 0x9a, 0xbd, 0xcd, 0x47, 0xed, 0xaf, 0xac, 0x98, 0xca, 0x26, 0x2c, 0xf3, 0x72, 0xe7, 0xc4, 0x5a, 0x67, 0x2c, 0xf1, 0xca, 0x49, 0xc7, 0x58, 0x63, 0xae, 0x7d, 0x28, 0x2b, 0x82, 0x76, 0x24, 0x16, 0x16, 0x8c, 0x9e, 0xae, 0xeb, 0x70, 0x64, 0x21, 0xab, 0x36, 0x54, 0xd9, 0x02, 0x42, 0x9f, 0x40, 0x31, 0x00, 0xd1, 0x31, 0x3e, 0x29, 0x5c, 0x36, 0x50, 0x5c, 0xa1, 0xa1, 0xd8, 0xc2, 0x27, 0xe8, 0x31, 0xdc, 0x0c, 0x6e, 0xcc, 0xaa, 0x47, 0xdc, 0xda, 0x87, 0x1f, 0x15, 0xae, 0x04, 0x0f, 0x63, 0x0b, 0x9f, 0xd4, 0x0d, 0xa0, 0x48, 0x83, 0x5b, 0x18, 0x93, 0xc1, 0xbd, 0x3a, 0x94, 0xeb, 0xc7, 0x97, 0x4c, 0x8b, 0x68, 0x1b, 0xda, 0x35, 0x58, 0xd0, 0x64, 0x8d, 0x6b, 0x7b, 0xa5, 0xc5, 0xb4, 0xb7, 0x73, 0x46, 0xa5, 0x5b, 0x4c, 0x74, 0xd7, 0xcf, 0xda, 0xe7, 0xe8, 0x96, 0xd9, 0xbc, 0x11, 0x40, 0x8a, 0x0c, 0xb3, 0x8c, 0x20, 0xd9, 0x94, 0x25, 0x6c, 0xfa, 0x90, 0xc6, 0x6f, 0xbf, 0x24, 0x24, 0x29, 0x92, 0xe0, 0xdc, 0xd1, 0xa7, 0x7a, 0xde, 0xd1, 0x97, 0xfe, 0x24, 0x0e, 0xc5, 0xba, 0xc6, 0x29, 0x9a, 0xee, 0x7b, 0x8a, 0xdc, 0xf3, 0x36, 0xfe, 0x8c, 0x4c, 0x92, 0x18, 0xfc, 0x27, 0xd4, 0xed, 0x59, 0xac, 0xe7, 0xed, 0x19, 0x65, 0x73, 0x16, 0xc5, 0x15, 0x89, 0x31, 0x71, 0xc5, 0x10, 0xee, 0xfa, 0x7e, 0x0c, 0x8b, 0x54, 0xda, 0x99, 0x0c, 0x12, 0xe6, 0x8d, 0x96, 0xfe, 0x74, 0xd2, 0x7c, 0x0c, 0x7c, 0x11, 0x87, 0x7d, 0xbb, 0xe2, 0xb0, 0xfe, 0x18, 0x58, 0x66, 0x58, 0x31, 0x30, 0xb7, 0xf5, 0xcc, 0x0e, 0x73, 0x03, 0x07, 0xe1, 0xaf, 0x2f, 0x23, 0x2f, 0xc3, 0x05, 0x3e, 0x37, 0x9e, 0xea, 0xeb, 0x65, 0x4d, 0x94, 0xf0, 0x4f, 0x8f, 0x49, 0xf8, 0x67, 0x06, 0x17, 0xfe, 0xef, 0x4e, 0x5a, 0xaf, 0x9b, 0x2f, 0x24, 0xf8, 0x42, 0x82, 0xdf, 0x26, 0x09, 0x8e, 0x12, 0xc2, 0xa9, 0x31, 0x09, 0xe1, 0xf4, 0xe0, 0x42, 0xf8, 0x3a, 0x09, 0x97, 0x3f, 0xd3, 0x17, 0xb5, 0xdc, 0x6e, 0xf7, 0x18, 0xd9, 0x73, 0xc6, 0xad, 0xe2, 0x9e, 0xb8, 0x95, 0x2b, 0xea, 0x97, 0xf0, 0x46, 0xfd, 0x22, 0xe3, 0x76, 0xa7, 0x81, 0xb9, 0x94, 0x2b, 0x30, 0x17, 0x1e, 0x2e, 0x4c, 0x47, 0x84, 0x0b, 0xdd, 0xd1, 0xc0, 0x49, 0x6f, 0x34, 0x70, 0xbc, 0xe7, 0x82, 0x8e, 0x87, 0xf0, 0x30, 0x84, 0x87, 0xf0, 0x43, 0x38, 0xde, 0xfb, 0xb3, 0x18, 0x2c, 0x6d, 0x62, 0xcd, 0x1c, 0x60, 0x1d, 0x2b, 0x2f, 0x04, 0x1e, 0x97, 0x79, 0x5e, 0xee, 0x4a, 0x8e, 0x43, 0x08, 0x6b, 0x9a, 0xa7, 0xae, 0x58, 0xd6, 0x2c, 0xa9, 0x35, 0xdf, 0xf4, 0xf3, 0xab, 0xdf, 0x8f, 0xc1, 0xd5, 0x40, 0xc9, 0x42, 0x0f, 0x61, 0x9e, 0xba, 0x13, 0x24, 0xb3, 0x98, 0xc3, 0x94, 0xfd, 0xdf, 0x6d, 0x98, 0xf1, 0xec, 0xf9, 0xc8, 0x8c, 0xa6, 0xb1, 0x6b, 0xa7, 0xb7, 0x06, 0x0b, 0xf4, 0xdd, 0x5d, 0xc2, 0x8b, 0xda, 0xde, 0xd3, 0x95, 0x7e, 0x27, 0x06, 0x73, 0x94, 0x89, 0xf9, 0x48, 0x18, 0xf3, 0x93, 0xf0, 0x3a, 0xc0, 0xe7, 0x5d, 0x59, 0xe3, 0x58, 0xbd, 0xd0, 0x8a, 0xa9, 0x1b, 0x25, 0x07, 0x2a, 0x56, 0xd0, 0x15, 0x98, 0x34, 0x30, 0x08, 0x1d, 0xeb, 0x61, 0x87, 0xfe, 0x59, 0xeb, 0xa0, 0x35, 0x48, 0x1b, 0xc9, 0x50, 0x2d, 0x97, 0x3d, 0xcc, 0xd7, 0x30, 0x21, 0x4b, 0x7f, 0x95, 0x82, 0xbc, 0xc9, 0x0a, 0x15, 0x59, 0x52, 0x35, 0x4e, 0xd2, 0xd4, 0xd2, 0x1f, 0xa6, 0x20, 0x6d, 0xd8, 0x06, 0x15, 0xcd, 0x43, 0xbe, 0x5e, 0x7b, 0x56, 0x65, 0x0f, 0x76, 0xeb, 0xfb, 0xd5, 0x4a, 0xed, 0x51, 0xad, 0xba, 0x91, 0x9f, 0x40, 0x8b, 0x30, 0xbf, 0x53, 0xfe, 0x26, 0xcb, 0x54, 0xcb, 0x1b, 0x6c, 0xe5, 0xf1, 0xc1, 0xee, 0x16, 0xbb, 0xfe, 0xb4, 0x51, 0xad, 0xe7, 0x5f, 0xbf, 0x7e, 0x1d, 0x43, 0xd7, 0x60, 0x41, 0xaf, 0xfc, 0x8c, 0xa9, 0x35, 0xaa, 0xfe, 0xda, 0xab, 0x80, 0xf4, 0xda, 0xbd, 0xf5, 0x9f, 0xa9, 0x56, 0x1a, 0xac, 0x81, 0x7b, 0x67, 0x3d, 0xff, 0xfa, 0xf5, 0x9f, 0xc7, 0xd1, 0x7d, 0x78, 0x47, 0xaf, 0xaa, 0x1c, 0xd4, 0x1b, 0x7b, 0x3b, 0xec, 0x4e, 0xb5, 0x51, 0xde, 0x28, 0x37, 0xca, 0xec, 0xa3, 0x5a, 0x75, 0x7b, 0x83, 0xdd, 0x2d, 0xef, 0x54, 0x2d, 0x3c, 0x19, 0xf4, 0x2e, 0xdc, 0x0e, 0x06, 0xfd, 0xb4, 0xbc, 0x7d, 0x60, 0xc3, 0x2e, 0x07, 0xa1, 0x6d, 0xec, 0x35, 0xca, 0xdb, 0x64, 0x00, 0x26, 0xe8, 0x37, 0xd0, 0xbb, 0x04, 0x74, 0xfd, 0xa0, 0xb2, 0x55, 0x6d, 0x84, 0x81, 0xfe, 0x56, 0x0c, 0xdd, 0x85, 0x5b, 0x3a, 0xec, 0xee, 0x5e, 0xa3, 0xf6, 0xa8, 0x56, 0x29, 0x37, 0x6a, 0x7b, 0xbb, 0x6c, 0x65, 0x6f, 0xf7, 0x51, 0x6d, 0xb3, 0xce, 0xee, 0x57, 0x19, 0x13, 0x49, 0xbe, 0x89, 0x4a, 0x70, 0x43, 0x07, 0xdc, 0xae, 0x3d, 0xaa, 0x56, 0x9e, 0x56, 0xb6, 0xab, 0x2c, 0x73, 0xb0, 0x5d, 0xf5, 0xc0, 0xdc, 0x81, 0x92, 0x1f, 0x19, 0x19, 0x70, 0xb9, 0xd1, 0x60, 0x6a, 0xeb, 0x07, 0x7a, 0xb7, 0x29, 0xf4, 0x10, 0x1e, 0x44, 0xc2, 0xb1, 0x5b, 0xd5, 0xa7, 0xec, 0x76, 0x75, 0x77, 0xb3, 0xf1, 0x38, 0xff, 0x3a, 0x8e, 0x3e, 0x80, 0x95, 0xe8, 0x26, 0x84, 0x64, 0x56, 0xa3, 0x0c, 0xba, 0x06, 0x05, 0x63, 0xcc, 0xe5, 0xf5, 0xea, 0x76, 0x9d, 0xad, 0xee, 0x36, 0x98, 0x5a, 0xb5, 0xce, 0x56, 0xf6, 0x0e, 0x76, 0x1b, 0xf9, 0x6f, 0xa0, 0x25, 0x58, 0x74, 0xd4, 0xea, 0xdd, 0xb9, 0xda, 0xff, 0x34, 0x5a, 0x82, 0x22, 0x15, 0xc0, 0xa4, 0x5e, 0x0c, 0xad, 0xc0, 0x7d, 0x07, 0x17, 0xd4, 0x36, 0x08, 0x39, 0x36, 0xaa, 0xdb, 0xd5, 0x46, 0xd5, 0x2c, 0xad, 0xb3, 0x4c, 0xf5, 0xc9, 0x41, 0xb5, 0xde, 0xc8, 0xff, 0xe7, 0x24, 0xba, 0x01, 0xc5, 0xfa, 0xfe, 0x76, 0xad, 0xc1, 0x36, 0xf6, 0xb6, 0xaa, 0xbb, 0xac, 0xde, 0xf6, 0xd3, 0xf2, 0x76, 0x6d, 0x83, 0xdd, 0x28, 0x3f, 0xad, 0xe7, 0x67, 0x8a, 0xf1, 0x7c, 0x6c, 0xed, 0x87, 0xef, 0xc2, 0x64, 0x9d, 0x68, 0x15, 0xf4, 0x1d, 0xeb, 0x11, 0x34, 0x25, 0x33, 0x24, 0xfa, 0x80, 0xa2, 0x83, 0xa2, 0x92, 0xf9, 0x16, 0x2f, 0xfb, 0x84, 0xa9, 0x2a, 0x76, 0xb4, 0x93, 0xd2, 0x04, 0xd2, 0x8c, 0x5b, 0x13, 0xb4, 0x8e, 0xbe, 0x42, 0x3f, 0xd7, 0x0c, 0xe9, 0xa5, 0xc7, 0xe4, 0x96, 0xa5, 0x09, 0xf4, 0x85, 0xf5, 0x6e, 0xb8, 0xd7, 0x19, 0x46, 0x65, 0xc2, 0xed, 0xa3, 0xef, 0x5f, 0x34, 0x9f, 0xee, 0xd2, 0x12, 0xc8, 0x22, 0x9a, 0x73, 0x18, 0x91, 0x6d, 0xb6, 0xf8, 0x41, 0x5f, 0x6d, 0x48, 0xd4, 0x80, 0xd0, 0x20, 0x30, 0x41, 0x29, 0x95, 0x06, 0x51, 0xe9, 0x4c, 0xfb, 0xa0, 0xc1, 0x2b, 0x28, 0x04, 0x25, 0xa2, 0xa5, 0x92, 0x20, 0x22, 0x6b, 0x6d, 0x1f, 0x3d, 0xef, 0xc3, 0x94, 0x93, 0x5b, 0xd1, 0x9d, 0x08, 0x76, 0x8e, 0xe6, 0xe0, 0x1d, 0xc8, 0xda, 0x6c, 0x89, 0x6e, 0x85, 0x31, 0xad, 0x85, 0x2b, 0x38, 0xfd, 0x50, 0x69, 0x02, 0xd5, 0x61, 0xca, 0xc9, 0x6c, 0xd4, 0x01, 0x52, 0x12, 0x44, 0x86, 0x23, 0xfd, 0x36, 0xe4, 0x1c, 0x39, 0x05, 0xd1, 0xed, 0x50, 0x8e, 0x51, 0xc3, 0xa8, 0xea, 0x02, 0xb3, 0x79, 0xe9, 0x10, 0xae, 0x6e, 0xcb, 0xfc, 0xb1, 0x35, 0x22, 0x57, 0x9a, 0x3d, 0xf4, 0x3e, 0x0d, 0x4d, 0x60, 0x3a, 0xbe, 0xf0, 0x89, 0x3c, 0x01, 0x64, 0x93, 0xb3, 0xc6, 0x89, 0x66, 0x0f, 0xf6, 0x8d, 0x05, 0x81, 0x13, 0x4d, 0x8a, 0xdb, 0x95, 0x16, 0xda, 0x05, 0x0f, 0x0c, 0xa9, 0x25, 0x28, 0xeb, 0xd1, 0x28, 0xeb, 0xfd, 0xa0, 0xfc, 0x1c, 0x0a, 0x0d, 0xac, 0x3a, 0x70, 0x62, 0x45, 0x14, 0x54, 0xe2, 0xfc, 0xdf, 0xf3, 0x34, 0xd2, 0x01, 0xdd, 0x20, 0x16, 0xfa, 0xfb, 0x3d, 0x40, 0xda, 0x2b, 0xf0, 0x04, 0x72, 0x0e, 0x21, 0xa1, 0xae, 0xb0, 0x3f, 0x29, 0x60, 0x24, 0x27, 0x3a, 0x45, 0x9e, 0xca, 0x89, 0x94, 0xc4, 0x6b, 0xe1, 0x48, 0x77, 0x21, 0xe7, 0x48, 0x7c, 0x45, 0x1d, 0xa7, 0x3f, 0x31, 0x56, 0x88, 0xf4, 0xbd, 0xb2, 0x72, 0x0a, 0x04, 0xe7, 0x39, 0x41, 0x1f, 0x07, 0xca, 0x78, 0x64, 0x72, 0x94, 0x90, 0x9e, 0xbf, 0x4b, 0x32, 0xbe, 0x87, 0xf4, 0xfb, 0x35, 0xba, 0x32, 0x88, 0xee, 0xb4, 0xc7, 0x27, 0xc0, 0xa5, 0x09, 0xf4, 0x4b, 0x31, 0xeb, 0xf9, 0x7c, 0x9f, 0xf3, 0xef, 0x31, 0x43, 0x54, 0x1f, 0x43, 0xf9, 0x35, 0xf3, 0xe5, 0x79, 0x48, 0x62, 0x25, 0xf4, 0xf5, 0x00, 0x8d, 0x12, 0x9d, 0x8c, 0x29, 0xd0, 0xca, 0xd1, 0xdb, 0xd8, 0x72, 0xf1, 0xbd, 0x98, 0x99, 0xf3, 0x3c, 0x84, 0x3e, 0x5f, 0x0f, 0x12, 0x96, 0x61, 0xaf, 0x54, 0x54, 0x46, 0x1e, 0xea, 0x4a, 0xf5, 0x98, 0xc6, 0xa7, 0x8f, 0xa1, 0x7c, 0x0b, 0x90, 0x3f, 0xc9, 0x0d, 0x7a, 0x10, 0x28, 0x25, 0x94, 0xe4, 0x2a, 0x21, 0x72, 0xc1, 0xc2, 0x25, 0x4f, 0xa6, 0x19, 0x74, 0x9f, 0x2e, 0x08, 0x34, 0xbc, 0x51, 0x39, 0x56, 0x4a, 0x13, 0x08, 0x03, 0xf2, 0x27, 0x7d, 0xa1, 0x0e, 0x3f, 0x30, 0x37, 0x4c, 0x2f, 0xdd, 0x74, 0x60, 0xd6, 0x97, 0x61, 0x05, 0xbd, 0x17, 0xc0, 0x85, 0xb4, 0x3c, 0x2c, 0xc5, 0x07, 0xbd, 0x01, 0xdb, 0xbc, 0x6a, 0xfb, 0xdd, 0x34, 0xd6, 0x08, 0xf6, 0xbb, 0xcf, 0xa4, 0xbd, 0x34, 0xc7, 0x6d, 0xe5, 0x9e, 0xfc, 0xee, 0xa1, 0x70, 0x9e, 0xed, 0x77, 0xf7, 0x3a, 0xc3, 0xa8, 0xd4, 0x20, 0x7d, 0xf4, 0x6d, 0xf9, 0xdd, 0x54, 0xc5, 0xb4, 0xd6, 0x97, 0x76, 0x19, 0x48, 0x23, 0xd9, 0x7e, 0x77, 0xaf, 0x34, 0x88, 0xca, 0x6d, 0xd1, 0x07, 0x0d, 0x0e, 0x60, 0xda, 0xf5, 0xb4, 0x1b, 0xdd, 0xed, 0xf1, 0xf1, 0x77, 0x31, 0x38, 0xe4, 0x5b, 0x9a, 0x40, 0x7b, 0x00, 0xa7, 0xaf, 0xaf, 0xd1, 0x3b, 0x54, 0x9c, 0x9e, 0xc7, 0xd9, 0xe1, 0x08, 0x6d, 0x2f, 0xdd, 0x44, 0x79, 0x27, 0x82, 0xf9, 0x7b, 0xf5, 0xd2, 0x4d, 0x74, 0xb7, 0xc2, 0x58, 0xbc, 0xa7, 0x01, 0x0a, 0x30, 0xe3, 0xbe, 0x63, 0x8b, 0x7a, 0xbe, 0x86, 0x5b, 0xbc, 0xdf, 0x03, 0xa4, 0xc5, 0x2d, 0x5f, 0x89, 0xa1, 0x03, 0x6b, 0x43, 0x10, 0x42, 0x0b, 0xca, 0x95, 0xe8, 0xd0, 0xf1, 0xdf, 0x8b, 0x59, 0x5b, 0x02, 0x2b, 0xaf, 0xc0, 0xed, 0x50, 0x66, 0x8e, 0xdc, 0x12, 0xd8, 0x60, 0x36, 0x9b, 0x7f, 0x1b, 0xa6, 0x5d, 0x97, 0xfb, 0xa8, 0xac, 0x46, 0xbb, 0xfe, 0x57, 0x2c, 0x05, 0x03, 0x3a, 0xf0, 0xbf, 0x80, 0x39, 0xca, 0xa9, 0x38, 0x75, 0xb3, 0x11, 0x7c, 0xf3, 0xa0, 0xb8, 0xd2, 0x2b, 0xb8, 0xdd, 0xaf, 0x08, 0x79, 0xef, 0xa5, 0x48, 0xf4, 0x2e, 0x05, 0x4b, 0xc0, 0xe5, 0xd1, 0xe2, 0x7b, 0x3d, 0xc1, 0xfa, 0xfc, 0x7a, 0x93, 0x88, 0x81, 0x7e, 0x7d, 0x1f, 0xbc, 0x6b, 0xfb, 0xf5, 0x21, 0x0c, 0x45, 0x39, 0x72, 0x0c, 0x47, 0x4a, 0x36, 0x66, 0xe4, 0x73, 0xa8, 0x1b, 0xb3, 0x28, 0x94, 0x67, 0xd9, 0x98, 0x9d, 0xe2, 0x1c, 0xfd, 0xc6, 0xec, 0x19, 0x5c, 0xf2, 0x1c, 0x1d, 0x51, 0xdd, 0x21, 0xfa, 0xf1, 0x52, 0x31, 0xe4, 0xdc, 0xa3, 0x34, 0x81, 0xda, 0x30, 0xbb, 0x89, 0x3d, 0x87, 0x11, 0x54, 0x53, 0x16, 0x71, 0x72, 0x51, 0xbc, 0x49, 0x13, 0x03, 0x17, 0x64, 0x69, 0xa2, 0xf8, 0x7b, 0xf1, 0x1f, 0x96, 0x2f, 0x5b, 0x00, 0x04, 0x9e, 0xeb, 0x08, 0xea, 0x0a, 0x2f, 0x8b, 0x7f, 0x5f, 0xfe, 0x95, 0xf8, 0x91, 0xa6, 0x75, 0xd4, 0x8f, 0x57, 0x57, 0x5f, 0xbe, 0x7c, 0xe9, 0xa9, 0x5d, 0xe5, 0xba, 0xda, 0xd1, 0x2a, 0xdf, 0x96, 0xbb, 0xcd, 0xf7, 0x3b, 0x6d, 0x4e, 0x6b, 0xc9, 0x8a, 0xf8, 0xa0, 0x3f, 0xf0, 0x15, 0x05, 0x73, 0xcd, 0xf7, 0x65, 0xa9, 0x7d, 0x12, 0xd9, 0xb0, 0x89, 0x5f, 0x58, 0x83, 0x6c, 0x75, 0xdb, 0x6d, 0x2b, 0xbb, 0x52, 0x3f, 0xed, 0xc8, 0xc3, 0xd9, 0x3e, 0x3b, 0x33, 0x1a, 0x19, 0x5a, 0x6a, 0xfd, 0x99, 0x71, 0xf4, 0x69, 0xd1, 0xd4, 0x47, 0xda, 0xfd, 0xd8, 0xb3, 0x9f, 0xb0, 0xeb, 0xda, 0x9c, 0x74, 0xb8, 0x22, 0x2b, 0x87, 0xab, 0x87, 0x58, 0x32, 0xac, 0xd6, 0xea, 0x69, 0x3f, 0x8e, 0x7f, 0x59, 0xfb, 0xc4, 0xfc, 0xf9, 0x3c, 0x6d, 0x00, 0x7d, 0xf0, 0xe3, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x66, 0xe2, 0x5b, 0x58, 0x6e, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConn // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion4 // StorageClient is the client API for Storage service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type StorageClient interface { // Permanently deletes the ACL entry for the specified entity on the specified // bucket. DeleteBucketAccessControl(ctx context.Context, in *DeleteBucketAccessControlRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Returns the ACL entry for the specified entity on the specified bucket. GetBucketAccessControl(ctx context.Context, in *GetBucketAccessControlRequest, opts ...grpc.CallOption) (*BucketAccessControl, error) // Creates a new ACL entry on the specified bucket. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertBucketAccessControl(ctx context.Context, in *InsertBucketAccessControlRequest, opts ...grpc.CallOption) (*BucketAccessControl, error) // Retrieves ACL entries on the specified bucket. ListBucketAccessControls(ctx context.Context, in *ListBucketAccessControlsRequest, opts ...grpc.CallOption) (*ListBucketAccessControlsResponse, error) // Updates an ACL entry on the specified bucket. Equivalent to // PatchBucketAccessControl, but all unspecified fields will be // reset to their default values. UpdateBucketAccessControl(ctx context.Context, in *UpdateBucketAccessControlRequest, opts ...grpc.CallOption) (*BucketAccessControl, error) // Updates an ACL entry on the specified bucket. // (!-- aip-dev/not-precedent: This should be "Update", and the existing // Update method should not exist, but we keep this to match our // existing API. --!) PatchBucketAccessControl(ctx context.Context, in *PatchBucketAccessControlRequest, opts ...grpc.CallOption) (*BucketAccessControl, error) // Permanently deletes an empty bucket. DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Returns metadata for the specified bucket. GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) // Creates a new bucket. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertBucket(ctx context.Context, in *InsertBucketRequest, opts ...grpc.CallOption) (*Bucket, error) // Retrieves a list of buckets for a given project. ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) // Locks retention policy on a bucket. LockBucketRetentionPolicy(ctx context.Context, in *LockRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) // Gets the IAM policy for the specified bucket. GetBucketIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) // Updates an IAM policy for the specified bucket. SetBucketIamPolicy(ctx context.Context, in *v1.SetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) // Tests a set of permissions on the given bucket to see which, if // any, are held by the caller. TestBucketIamPermissions(ctx context.Context, in *v1.TestIamPermissionsRequest, opts ...grpc.CallOption) (*v1.TestIamPermissionsResponse, error) // Updates a bucket. Changes to the bucket will be readable immediately after // writing, but configuration changes may take time to propagate. // (!-- aip-dev/not-precedent: This should be "Update", and the existing // Update method should not exist, but we keep this to match our // existing API. --!) PatchBucket(ctx context.Context, in *PatchBucketRequest, opts ...grpc.CallOption) (*Bucket, error) // Updates a bucket. Equivalent to PatchBucket, but always replaces all // mutatable fields of the bucket with new values, reverting all // unspecified fields to their default values. // Like PatchBucket, Changes to the bucket will be readable immediately after // writing, but configuration changes may take time to propagate. UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) // Halts "Object Change Notification" push messagages. // See https://cloud.google.com/storage/docs/object-change-notification // Note: this is not related to the newer "Notifications" resource, which // are stopped using DeleteNotification. StopChannel(ctx context.Context, in *StopChannelRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Permanently deletes the default object ACL entry for the specified entity // on the specified bucket. DeleteDefaultObjectAccessControl(ctx context.Context, in *DeleteDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Returns the default object ACL entry for the specified entity on the // specified bucket. GetDefaultObjectAccessControl(ctx context.Context, in *GetDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) // Creates a new default object ACL entry on the specified bucket. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertDefaultObjectAccessControl(ctx context.Context, in *InsertDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) // Retrieves default object ACL entries on the specified bucket. ListDefaultObjectAccessControls(ctx context.Context, in *ListDefaultObjectAccessControlsRequest, opts ...grpc.CallOption) (*ListObjectAccessControlsResponse, error) // Updates a default object ACL entry on the specified bucket. // (!-- aip-dev/not-precedent: This should be "Update", and the existing // Update method should not exist, but we keep this to match our // existing API. --!) PatchDefaultObjectAccessControl(ctx context.Context, in *PatchDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) // Updates a default object ACL entry on the specified bucket. Equivalent to // PatchDefaultObjectAccessControl, but modifies all unspecified fields to // their default values. UpdateDefaultObjectAccessControl(ctx context.Context, in *UpdateDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) // Permanently deletes a notification subscription. // Note: Older, "Object Change Notification" push subscriptions should be // deleted using StopChannel instead. DeleteNotification(ctx context.Context, in *DeleteNotificationRequest, opts ...grpc.CallOption) (*empty.Empty, error) // View a notification configuration. GetNotification(ctx context.Context, in *GetNotificationRequest, opts ...grpc.CallOption) (*Notification, error) // Creates a notification subscription for a given bucket. // These notifications, when triggered, publish messages to the specified // Cloud Pub/Sub topics. // See https://cloud.google.com/storage/docs/pubsub-notifications. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertNotification(ctx context.Context, in *InsertNotificationRequest, opts ...grpc.CallOption) (*Notification, error) // Retrieves a list of notification subscriptions for a given bucket. ListNotifications(ctx context.Context, in *ListNotificationsRequest, opts ...grpc.CallOption) (*ListNotificationsResponse, error) // Permanently deletes the ACL entry for the specified entity on the specified // object. DeleteObjectAccessControl(ctx context.Context, in *DeleteObjectAccessControlRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Returns the ACL entry for the specified entity on the specified object. GetObjectAccessControl(ctx context.Context, in *GetObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) // Creates a new ACL entry on the specified object. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertObjectAccessControl(ctx context.Context, in *InsertObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) // Retrieves ACL entries on the specified object. ListObjectAccessControls(ctx context.Context, in *ListObjectAccessControlsRequest, opts ...grpc.CallOption) (*ListObjectAccessControlsResponse, error) // Updates an ACL entry on the specified object. UpdateObjectAccessControl(ctx context.Context, in *UpdateObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) // Concatenates a list of existing objects into a new object in the same // bucket. ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) // Copies a source object to a destination object. Optionally overrides // metadata. CopyObject(ctx context.Context, in *CopyObjectRequest, opts ...grpc.CallOption) (*Object, error) // Deletes an object and its metadata. Deletions are permanent if versioning // is not enabled for the bucket, or if the generation parameter // is used. DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Retrieves an object's metadata. GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) // Reads an object's data. GetObjectMedia(ctx context.Context, in *GetObjectMediaRequest, opts ...grpc.CallOption) (Storage_GetObjectMediaClient, error) // Stores a new object and metadata. // // An object can be written either in a single message stream or in a // resumable sequence of message streams. To write using a single stream, // the client should include in the first message of the stream an // `InsertObjectSpec` describing the destination bucket, object, and any // preconditions. Additionally, the final message must set 'finish_write' to // true, or else it is an error. // // For a resumable write, the client should instead call // `StartResumableWrite()` and provide that method an `InsertObjectSpec.` // They should then attach the returned `upload_id` to the first message of // each following call to `Insert`. If there is an error or the connection is // broken during the resumable `Insert()`, the client should check the status // of the `Insert()` by calling `QueryWriteStatus()` and continue writing from // the returned `committed_size`. This may be less than the amount of data the // client previously sent. // // The service will not view the object as complete until the client has // sent an `Insert` with `finish_write` set to `true`. Sending any // requests on a stream after sending a request with `finish_write` set to // `true` will cause an error. The client **should** check the // `Object` it receives to determine how much data the service was // able to commit and whether the service views the object as complete. InsertObject(ctx context.Context, opts ...grpc.CallOption) (Storage_InsertObjectClient, error) // Retrieves a list of objects matching the criteria. ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) // Rewrites a source object to a destination object. Optionally overrides // metadata. RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) // Starts a resumable write. How long the write operation remains valid, and // what happens when the write operation becomes invalid, are // service-dependent. StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) // Determines the `committed_size` for an object that is being written, which // can then be used as the `write_offset` for the next `Write()` call. // // If the object does not exist (i.e., the object has been deleted, or the // first `Write()` has not yet reached the service), this method returns the // error `NOT_FOUND`. // // The client **may** call `QueryWriteStatus()` at any time to determine how // much data has been processed for this object. This is useful if the // client is buffering data and needs to know which data can be safely // evicted. For any sequence of `QueryWriteStatus()` calls for a given // object name, the sequence of returned `committed_size` values will be // non-decreasing. QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) // Updates an object's metadata. // (!-- aip-dev/not-precedent: This should be "Update", and the existing // Update method should not exist, but we keep this to match our // existing API. --!) PatchObject(ctx context.Context, in *PatchObjectRequest, opts ...grpc.CallOption) (*Object, error) // Updates an object's metadata. Equivalent to PatchObject, but always // replaces all mutatable fields of the bucket with new values, reverting all // unspecified fields to their default values. UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) // Gets the IAM policy for the specified object. GetObjectIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) // Updates an IAM policy for the specified object. SetObjectIamPolicy(ctx context.Context, in *v1.SetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) // Tests a set of permissions on the given object to see which, if // any, are held by the caller. TestObjectIamPermissions(ctx context.Context, in *v1.TestIamPermissionsRequest, opts ...grpc.CallOption) (*v1.TestIamPermissionsResponse, error) // Watch for changes on all objects in a bucket. WatchAllObjects(ctx context.Context, in *WatchAllObjectsRequest, opts ...grpc.CallOption) (*Channel, error) // Retrieves the name of a project's Google Cloud Storage service account. GetServiceAccount(ctx context.Context, in *GetProjectServiceAccountRequest, opts ...grpc.CallOption) (*ServiceAccount, error) } type storageClient struct { cc *grpc.ClientConn } func NewStorageClient(cc *grpc.ClientConn) StorageClient { return &storageClient{cc} } func (c *storageClient) DeleteBucketAccessControl(ctx context.Context, in *DeleteBucketAccessControlRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/DeleteBucketAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetBucketAccessControl(ctx context.Context, in *GetBucketAccessControlRequest, opts ...grpc.CallOption) (*BucketAccessControl, error) { out := new(BucketAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetBucketAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) InsertBucketAccessControl(ctx context.Context, in *InsertBucketAccessControlRequest, opts ...grpc.CallOption) (*BucketAccessControl, error) { out := new(BucketAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/InsertBucketAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ListBucketAccessControls(ctx context.Context, in *ListBucketAccessControlsRequest, opts ...grpc.CallOption) (*ListBucketAccessControlsResponse, error) { out := new(ListBucketAccessControlsResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/ListBucketAccessControls", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) UpdateBucketAccessControl(ctx context.Context, in *UpdateBucketAccessControlRequest, opts ...grpc.CallOption) (*BucketAccessControl, error) { out := new(BucketAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/UpdateBucketAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) PatchBucketAccessControl(ctx context.Context, in *PatchBucketAccessControlRequest, opts ...grpc.CallOption) (*BucketAccessControl, error) { out := new(BucketAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/PatchBucketAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/DeleteBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) InsertBucket(ctx context.Context, in *InsertBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/InsertBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) { out := new(ListBucketsResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/ListBuckets", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) LockBucketRetentionPolicy(ctx context.Context, in *LockRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/LockBucketRetentionPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetBucketIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) { out := new(v1.Policy) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetBucketIamPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) SetBucketIamPolicy(ctx context.Context, in *v1.SetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) { out := new(v1.Policy) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/SetBucketIamPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) TestBucketIamPermissions(ctx context.Context, in *v1.TestIamPermissionsRequest, opts ...grpc.CallOption) (*v1.TestIamPermissionsResponse, error) { out := new(v1.TestIamPermissionsResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/TestBucketIamPermissions", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) PatchBucket(ctx context.Context, in *PatchBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/PatchBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/UpdateBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) StopChannel(ctx context.Context, in *StopChannelRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/StopChannel", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) DeleteDefaultObjectAccessControl(ctx context.Context, in *DeleteDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/DeleteDefaultObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetDefaultObjectAccessControl(ctx context.Context, in *GetDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) { out := new(ObjectAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetDefaultObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) InsertDefaultObjectAccessControl(ctx context.Context, in *InsertDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) { out := new(ObjectAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/InsertDefaultObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ListDefaultObjectAccessControls(ctx context.Context, in *ListDefaultObjectAccessControlsRequest, opts ...grpc.CallOption) (*ListObjectAccessControlsResponse, error) { out := new(ListObjectAccessControlsResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/ListDefaultObjectAccessControls", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) PatchDefaultObjectAccessControl(ctx context.Context, in *PatchDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) { out := new(ObjectAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/PatchDefaultObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) UpdateDefaultObjectAccessControl(ctx context.Context, in *UpdateDefaultObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) { out := new(ObjectAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/UpdateDefaultObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) DeleteNotification(ctx context.Context, in *DeleteNotificationRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/DeleteNotification", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetNotification(ctx context.Context, in *GetNotificationRequest, opts ...grpc.CallOption) (*Notification, error) { out := new(Notification) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetNotification", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) InsertNotification(ctx context.Context, in *InsertNotificationRequest, opts ...grpc.CallOption) (*Notification, error) { out := new(Notification) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/InsertNotification", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ListNotifications(ctx context.Context, in *ListNotificationsRequest, opts ...grpc.CallOption) (*ListNotificationsResponse, error) { out := new(ListNotificationsResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/ListNotifications", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) DeleteObjectAccessControl(ctx context.Context, in *DeleteObjectAccessControlRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/DeleteObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetObjectAccessControl(ctx context.Context, in *GetObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) { out := new(ObjectAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) InsertObjectAccessControl(ctx context.Context, in *InsertObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) { out := new(ObjectAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/InsertObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ListObjectAccessControls(ctx context.Context, in *ListObjectAccessControlsRequest, opts ...grpc.CallOption) (*ListObjectAccessControlsResponse, error) { out := new(ListObjectAccessControlsResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/ListObjectAccessControls", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) UpdateObjectAccessControl(ctx context.Context, in *UpdateObjectAccessControlRequest, opts ...grpc.CallOption) (*ObjectAccessControl, error) { out := new(ObjectAccessControl) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/UpdateObjectAccessControl", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/ComposeObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) CopyObject(ctx context.Context, in *CopyObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/CopyObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/DeleteObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetObjectMedia(ctx context.Context, in *GetObjectMediaRequest, opts ...grpc.CallOption) (Storage_GetObjectMediaClient, error) { stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[0], "/google.storage.v1.Storage/GetObjectMedia", opts...) if err != nil { return nil, err } x := &storageGetObjectMediaClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } if err := x.ClientStream.CloseSend(); err != nil { return nil, err } return x, nil } type Storage_GetObjectMediaClient interface { Recv() (*GetObjectMediaResponse, error) grpc.ClientStream } type storageGetObjectMediaClient struct { grpc.ClientStream } func (x *storageGetObjectMediaClient) Recv() (*GetObjectMediaResponse, error) { m := new(GetObjectMediaResponse) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func (c *storageClient) InsertObject(ctx context.Context, opts ...grpc.CallOption) (Storage_InsertObjectClient, error) { stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[1], "/google.storage.v1.Storage/InsertObject", opts...) if err != nil { return nil, err } x := &storageInsertObjectClient{stream} return x, nil } type Storage_InsertObjectClient interface { Send(*InsertObjectRequest) error CloseAndRecv() (*Object, error) grpc.ClientStream } type storageInsertObjectClient struct { grpc.ClientStream } func (x *storageInsertObjectClient) Send(m *InsertObjectRequest) error { return x.ClientStream.SendMsg(m) } func (x *storageInsertObjectClient) CloseAndRecv() (*Object, error) { if err := x.ClientStream.CloseSend(); err != nil { return nil, err } m := new(Object) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func (c *storageClient) ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) { out := new(ListObjectsResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/ListObjects", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) { out := new(RewriteResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/RewriteObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) { out := new(StartResumableWriteResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/StartResumableWrite", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) { out := new(QueryWriteStatusResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/QueryWriteStatus", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) PatchObject(ctx context.Context, in *PatchObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/PatchObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/UpdateObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetObjectIamPolicy(ctx context.Context, in *v1.GetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) { out := new(v1.Policy) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetObjectIamPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) SetObjectIamPolicy(ctx context.Context, in *v1.SetIamPolicyRequest, opts ...grpc.CallOption) (*v1.Policy, error) { out := new(v1.Policy) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/SetObjectIamPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) TestObjectIamPermissions(ctx context.Context, in *v1.TestIamPermissionsRequest, opts ...grpc.CallOption) (*v1.TestIamPermissionsResponse, error) { out := new(v1.TestIamPermissionsResponse) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/TestObjectIamPermissions", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) WatchAllObjects(ctx context.Context, in *WatchAllObjectsRequest, opts ...grpc.CallOption) (*Channel, error) { out := new(Channel) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/WatchAllObjects", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetServiceAccount(ctx context.Context, in *GetProjectServiceAccountRequest, opts ...grpc.CallOption) (*ServiceAccount, error) { out := new(ServiceAccount) err := c.cc.Invoke(ctx, "/google.storage.v1.Storage/GetServiceAccount", in, out, opts...) if err != nil { return nil, err } return out, nil } // StorageServer is the server API for Storage service. type StorageServer interface { // Permanently deletes the ACL entry for the specified entity on the specified // bucket. DeleteBucketAccessControl(context.Context, *DeleteBucketAccessControlRequest) (*empty.Empty, error) // Returns the ACL entry for the specified entity on the specified bucket. GetBucketAccessControl(context.Context, *GetBucketAccessControlRequest) (*BucketAccessControl, error) // Creates a new ACL entry on the specified bucket. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertBucketAccessControl(context.Context, *InsertBucketAccessControlRequest) (*BucketAccessControl, error) // Retrieves ACL entries on the specified bucket. ListBucketAccessControls(context.Context, *ListBucketAccessControlsRequest) (*ListBucketAccessControlsResponse, error) // Updates an ACL entry on the specified bucket. Equivalent to // PatchBucketAccessControl, but all unspecified fields will be // reset to their default values. UpdateBucketAccessControl(context.Context, *UpdateBucketAccessControlRequest) (*BucketAccessControl, error) // Updates an ACL entry on the specified bucket. // (!-- aip-dev/not-precedent: This should be "Update", and the existing // Update method should not exist, but we keep this to match our // existing API. --!) PatchBucketAccessControl(context.Context, *PatchBucketAccessControlRequest) (*BucketAccessControl, error) // Permanently deletes an empty bucket. DeleteBucket(context.Context, *DeleteBucketRequest) (*empty.Empty, error) // Returns metadata for the specified bucket. GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) // Creates a new bucket. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertBucket(context.Context, *InsertBucketRequest) (*Bucket, error) // Retrieves a list of buckets for a given project. ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) // Locks retention policy on a bucket. LockBucketRetentionPolicy(context.Context, *LockRetentionPolicyRequest) (*Bucket, error) // Gets the IAM policy for the specified bucket. GetBucketIamPolicy(context.Context, *v1.GetIamPolicyRequest) (*v1.Policy, error) // Updates an IAM policy for the specified bucket. SetBucketIamPolicy(context.Context, *v1.SetIamPolicyRequest) (*v1.Policy, error) // Tests a set of permissions on the given bucket to see which, if // any, are held by the caller. TestBucketIamPermissions(context.Context, *v1.TestIamPermissionsRequest) (*v1.TestIamPermissionsResponse, error) // Updates a bucket. Changes to the bucket will be readable immediately after // writing, but configuration changes may take time to propagate. // (!-- aip-dev/not-precedent: This should be "Update", and the existing // Update method should not exist, but we keep this to match our // existing API. --!) PatchBucket(context.Context, *PatchBucketRequest) (*Bucket, error) // Updates a bucket. Equivalent to PatchBucket, but always replaces all // mutatable fields of the bucket with new values, reverting all // unspecified fields to their default values. // Like PatchBucket, Changes to the bucket will be readable immediately after // writing, but configuration changes may take time to propagate. UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) // Halts "Object Change Notification" push messagages. // See https://cloud.google.com/storage/docs/object-change-notification // Note: this is not related to the newer "Notifications" resource, which // are stopped using DeleteNotification. StopChannel(context.Context, *StopChannelRequest) (*empty.Empty, error) // Permanently deletes the default object ACL entry for the specified entity // on the specified bucket. DeleteDefaultObjectAccessControl(context.Context, *DeleteDefaultObjectAccessControlRequest) (*empty.Empty, error) // Returns the default object ACL entry for the specified entity on the // specified bucket. GetDefaultObjectAccessControl(context.Context, *GetDefaultObjectAccessControlRequest) (*ObjectAccessControl, error) // Creates a new default object ACL entry on the specified bucket. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertDefaultObjectAccessControl(context.Context, *InsertDefaultObjectAccessControlRequest) (*ObjectAccessControl, error) // Retrieves default object ACL entries on the specified bucket. ListDefaultObjectAccessControls(context.Context, *ListDefaultObjectAccessControlsRequest) (*ListObjectAccessControlsResponse, error) // Updates a default object ACL entry on the specified bucket. // (!-- aip-dev/not-precedent: This should be "Update", and the existing // Update method should not exist, but we keep this to match our // existing API. --!) PatchDefaultObjectAccessControl(context.Context, *PatchDefaultObjectAccessControlRequest) (*ObjectAccessControl, error) // Updates a default object ACL entry on the specified bucket. Equivalent to // PatchDefaultObjectAccessControl, but modifies all unspecified fields to // their default values. UpdateDefaultObjectAccessControl(context.Context, *UpdateDefaultObjectAccessControlRequest) (*ObjectAccessControl, error) // Permanently deletes a notification subscription. // Note: Older, "Object Change Notification" push subscriptions should be // deleted using StopChannel instead. DeleteNotification(context.Context, *DeleteNotificationRequest) (*empty.Empty, error) // View a notification configuration. GetNotification(context.Context, *GetNotificationRequest) (*Notification, error) // Creates a notification subscription for a given bucket. // These notifications, when triggered, publish messages to the specified // Cloud Pub/Sub topics. // See https://cloud.google.com/storage/docs/pubsub-notifications. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertNotification(context.Context, *InsertNotificationRequest) (*Notification, error) // Retrieves a list of notification subscriptions for a given bucket. ListNotifications(context.Context, *ListNotificationsRequest) (*ListNotificationsResponse, error) // Permanently deletes the ACL entry for the specified entity on the specified // object. DeleteObjectAccessControl(context.Context, *DeleteObjectAccessControlRequest) (*empty.Empty, error) // Returns the ACL entry for the specified entity on the specified object. GetObjectAccessControl(context.Context, *GetObjectAccessControlRequest) (*ObjectAccessControl, error) // Creates a new ACL entry on the specified object. // (!-- aip-dev/not-precedent: This should be "Create" per aip.dev/133. // We use "Insert" to be like our preceding API. --!) InsertObjectAccessControl(context.Context, *InsertObjectAccessControlRequest) (*ObjectAccessControl, error) // Retrieves ACL entries on the specified object. ListObjectAccessControls(context.Context, *ListObjectAccessControlsRequest) (*ListObjectAccessControlsResponse, error) // Updates an ACL entry on the specified object. UpdateObjectAccessControl(context.Context, *UpdateObjectAccessControlRequest) (*ObjectAccessControl, error) // Concatenates a list of existing objects into a new object in the same // bucket. ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) // Copies a source object to a destination object. Optionally overrides // metadata. CopyObject(context.Context, *CopyObjectRequest) (*Object, error) // Deletes an object and its metadata. Deletions are permanent if versioning // is not enabled for the bucket, or if the generation parameter // is used. DeleteObject(context.Context, *DeleteObjectRequest) (*empty.Empty, error) // Retrieves an object's metadata. GetObject(context.Context, *GetObjectRequest) (*Object, error) // Reads an object's data. GetObjectMedia(*GetObjectMediaRequest, Storage_GetObjectMediaServer) error // Stores a new object and metadata. // // An object can be written either in a single message stream or in a // resumable sequence of message streams. To write using a single stream, // the client should include in the first message of the stream an // `InsertObjectSpec` describing the destination bucket, object, and any // preconditions. Additionally, the final message must set 'finish_write' to // true, or else it is an error. // // For a resumable write, the client should instead call // `StartResumableWrite()` and provide that method an `InsertObjectSpec.` // They should then attach the returned `upload_id` to the first message of // each following call to `Insert`. If there is an error or the connection is // broken during the resumable `Insert()`, the client should check the status // of the `Insert()` by calling `QueryWriteStatus()` and continue writing from // the returned `committed_size`. This may be less than the amount of data the // client previously sent. // // The service will not view the object as complete until the client has // sent an `Insert` with `finish_write` set to `true`. Sending any // requests on a stream after sending a request with `finish_write` set to // `true` will cause an error. The client **should** check the // `Object` it receives to determine how much data the service was // able to commit and whether the service views the object as complete. InsertObject(Storage_InsertObjectServer) error // Retrieves a list of objects matching the criteria. ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) // Rewrites a source object to a destination object. Optionally overrides // metadata. RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) // Starts a resumable write. How long the write operation remains valid, and // what happens when the write operation becomes invalid, are // service-dependent. StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) // Determines the `committed_size` for an object that is being written, which // can then be used as the `write_offset` for the next `Write()` call. // // If the object does not exist (i.e., the object has been deleted, or the // first `Write()` has not yet reached the service), this method returns the // error `NOT_FOUND`. // // The client **may** call `QueryWriteStatus()` at any time to determine how // much data has been processed for this object. This is useful if the // client is buffering data and needs to know which data can be safely // evicted. For any sequence of `QueryWriteStatus()` calls for a given // object name, the sequence of returned `committed_size` values will be // non-decreasing. QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) // Updates an object's metadata. // (!-- aip-dev/not-precedent: This should be "Update", and the existing // Update method should not exist, but we keep this to match our // existing API. --!) PatchObject(context.Context, *PatchObjectRequest) (*Object, error) // Updates an object's metadata. Equivalent to PatchObject, but always // replaces all mutatable fields of the bucket with new values, reverting all // unspecified fields to their default values. UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) // Gets the IAM policy for the specified object. GetObjectIamPolicy(context.Context, *v1.GetIamPolicyRequest) (*v1.Policy, error) // Updates an IAM policy for the specified object. SetObjectIamPolicy(context.Context, *v1.SetIamPolicyRequest) (*v1.Policy, error) // Tests a set of permissions on the given object to see which, if // any, are held by the caller. TestObjectIamPermissions(context.Context, *v1.TestIamPermissionsRequest) (*v1.TestIamPermissionsResponse, error) // Watch for changes on all objects in a bucket. WatchAllObjects(context.Context, *WatchAllObjectsRequest) (*Channel, error) // Retrieves the name of a project's Google Cloud Storage service account. GetServiceAccount(context.Context, *GetProjectServiceAccountRequest) (*ServiceAccount, error) } // UnimplementedStorageServer can be embedded to have forward compatible implementations. type UnimplementedStorageServer struct { } func (*UnimplementedStorageServer) DeleteBucketAccessControl(ctx context.Context, req *DeleteBucketAccessControlRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteBucketAccessControl not implemented") } func (*UnimplementedStorageServer) GetBucketAccessControl(ctx context.Context, req *GetBucketAccessControlRequest) (*BucketAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method GetBucketAccessControl not implemented") } func (*UnimplementedStorageServer) InsertBucketAccessControl(ctx context.Context, req *InsertBucketAccessControlRequest) (*BucketAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method InsertBucketAccessControl not implemented") } func (*UnimplementedStorageServer) ListBucketAccessControls(ctx context.Context, req *ListBucketAccessControlsRequest) (*ListBucketAccessControlsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListBucketAccessControls not implemented") } func (*UnimplementedStorageServer) UpdateBucketAccessControl(ctx context.Context, req *UpdateBucketAccessControlRequest) (*BucketAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateBucketAccessControl not implemented") } func (*UnimplementedStorageServer) PatchBucketAccessControl(ctx context.Context, req *PatchBucketAccessControlRequest) (*BucketAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method PatchBucketAccessControl not implemented") } func (*UnimplementedStorageServer) DeleteBucket(ctx context.Context, req *DeleteBucketRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteBucket not implemented") } func (*UnimplementedStorageServer) GetBucket(ctx context.Context, req *GetBucketRequest) (*Bucket, error) { return nil, status.Errorf(codes.Unimplemented, "method GetBucket not implemented") } func (*UnimplementedStorageServer) InsertBucket(ctx context.Context, req *InsertBucketRequest) (*Bucket, error) { return nil, status.Errorf(codes.Unimplemented, "method InsertBucket not implemented") } func (*UnimplementedStorageServer) ListBuckets(ctx context.Context, req *ListBucketsRequest) (*ListBucketsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListBuckets not implemented") } func (*UnimplementedStorageServer) LockBucketRetentionPolicy(ctx context.Context, req *LockRetentionPolicyRequest) (*Bucket, error) { return nil, status.Errorf(codes.Unimplemented, "method LockBucketRetentionPolicy not implemented") } func (*UnimplementedStorageServer) GetBucketIamPolicy(ctx context.Context, req *v1.GetIamPolicyRequest) (*v1.Policy, error) { return nil, status.Errorf(codes.Unimplemented, "method GetBucketIamPolicy not implemented") } func (*UnimplementedStorageServer) SetBucketIamPolicy(ctx context.Context, req *v1.SetIamPolicyRequest) (*v1.Policy, error) { return nil, status.Errorf(codes.Unimplemented, "method SetBucketIamPolicy not implemented") } func (*UnimplementedStorageServer) TestBucketIamPermissions(ctx context.Context, req *v1.TestIamPermissionsRequest) (*v1.TestIamPermissionsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TestBucketIamPermissions not implemented") } func (*UnimplementedStorageServer) PatchBucket(ctx context.Context, req *PatchBucketRequest) (*Bucket, error) { return nil, status.Errorf(codes.Unimplemented, "method PatchBucket not implemented") } func (*UnimplementedStorageServer) UpdateBucket(ctx context.Context, req *UpdateBucketRequest) (*Bucket, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateBucket not implemented") } func (*UnimplementedStorageServer) StopChannel(ctx context.Context, req *StopChannelRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method StopChannel not implemented") } func (*UnimplementedStorageServer) DeleteDefaultObjectAccessControl(ctx context.Context, req *DeleteDefaultObjectAccessControlRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteDefaultObjectAccessControl not implemented") } func (*UnimplementedStorageServer) GetDefaultObjectAccessControl(ctx context.Context, req *GetDefaultObjectAccessControlRequest) (*ObjectAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDefaultObjectAccessControl not implemented") } func (*UnimplementedStorageServer) InsertDefaultObjectAccessControl(ctx context.Context, req *InsertDefaultObjectAccessControlRequest) (*ObjectAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method InsertDefaultObjectAccessControl not implemented") } func (*UnimplementedStorageServer) ListDefaultObjectAccessControls(ctx context.Context, req *ListDefaultObjectAccessControlsRequest) (*ListObjectAccessControlsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListDefaultObjectAccessControls not implemented") } func (*UnimplementedStorageServer) PatchDefaultObjectAccessControl(ctx context.Context, req *PatchDefaultObjectAccessControlRequest) (*ObjectAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method PatchDefaultObjectAccessControl not implemented") } func (*UnimplementedStorageServer) UpdateDefaultObjectAccessControl(ctx context.Context, req *UpdateDefaultObjectAccessControlRequest) (*ObjectAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDefaultObjectAccessControl not implemented") } func (*UnimplementedStorageServer) DeleteNotification(ctx context.Context, req *DeleteNotificationRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteNotification not implemented") } func (*UnimplementedStorageServer) GetNotification(ctx context.Context, req *GetNotificationRequest) (*Notification, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNotification not implemented") } func (*UnimplementedStorageServer) InsertNotification(ctx context.Context, req *InsertNotificationRequest) (*Notification, error) { return nil, status.Errorf(codes.Unimplemented, "method InsertNotification not implemented") } func (*UnimplementedStorageServer) ListNotifications(ctx context.Context, req *ListNotificationsRequest) (*ListNotificationsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListNotifications not implemented") } func (*UnimplementedStorageServer) DeleteObjectAccessControl(ctx context.Context, req *DeleteObjectAccessControlRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteObjectAccessControl not implemented") } func (*UnimplementedStorageServer) GetObjectAccessControl(ctx context.Context, req *GetObjectAccessControlRequest) (*ObjectAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method GetObjectAccessControl not implemented") } func (*UnimplementedStorageServer) InsertObjectAccessControl(ctx context.Context, req *InsertObjectAccessControlRequest) (*ObjectAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method InsertObjectAccessControl not implemented") } func (*UnimplementedStorageServer) ListObjectAccessControls(ctx context.Context, req *ListObjectAccessControlsRequest) (*ListObjectAccessControlsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjectAccessControls not implemented") } func (*UnimplementedStorageServer) UpdateObjectAccessControl(ctx context.Context, req *UpdateObjectAccessControlRequest) (*ObjectAccessControl, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateObjectAccessControl not implemented") } func (*UnimplementedStorageServer) ComposeObject(ctx context.Context, req *ComposeObjectRequest) (*Object, error) { return nil, status.Errorf(codes.Unimplemented, "method ComposeObject not implemented") } func (*UnimplementedStorageServer) CopyObject(ctx context.Context, req *CopyObjectRequest) (*Object, error) { return nil, status.Errorf(codes.Unimplemented, "method CopyObject not implemented") } func (*UnimplementedStorageServer) DeleteObject(ctx context.Context, req *DeleteObjectRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented") } func (*UnimplementedStorageServer) GetObject(ctx context.Context, req *GetObjectRequest) (*Object, error) { return nil, status.Errorf(codes.Unimplemented, "method GetObject not implemented") } func (*UnimplementedStorageServer) GetObjectMedia(req *GetObjectMediaRequest, srv Storage_GetObjectMediaServer) error { return status.Errorf(codes.Unimplemented, "method GetObjectMedia not implemented") } func (*UnimplementedStorageServer) InsertObject(srv Storage_InsertObjectServer) error { return status.Errorf(codes.Unimplemented, "method InsertObject not implemented") } func (*UnimplementedStorageServer) ListObjects(ctx context.Context, req *ListObjectsRequest) (*ListObjectsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented") } func (*UnimplementedStorageServer) RewriteObject(ctx context.Context, req *RewriteObjectRequest) (*RewriteResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RewriteObject not implemented") } func (*UnimplementedStorageServer) StartResumableWrite(ctx context.Context, req *StartResumableWriteRequest) (*StartResumableWriteResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method StartResumableWrite not implemented") } func (*UnimplementedStorageServer) QueryWriteStatus(ctx context.Context, req *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryWriteStatus not implemented") } func (*UnimplementedStorageServer) PatchObject(ctx context.Context, req *PatchObjectRequest) (*Object, error) { return nil, status.Errorf(codes.Unimplemented, "method PatchObject not implemented") } func (*UnimplementedStorageServer) UpdateObject(ctx context.Context, req *UpdateObjectRequest) (*Object, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateObject not implemented") } func (*UnimplementedStorageServer) GetObjectIamPolicy(ctx context.Context, req *v1.GetIamPolicyRequest) (*v1.Policy, error) { return nil, status.Errorf(codes.Unimplemented, "method GetObjectIamPolicy not implemented") } func (*UnimplementedStorageServer) SetObjectIamPolicy(ctx context.Context, req *v1.SetIamPolicyRequest) (*v1.Policy, error) { return nil, status.Errorf(codes.Unimplemented, "method SetObjectIamPolicy not implemented") } func (*UnimplementedStorageServer) TestObjectIamPermissions(ctx context.Context, req *v1.TestIamPermissionsRequest) (*v1.TestIamPermissionsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TestObjectIamPermissions not implemented") } func (*UnimplementedStorageServer) WatchAllObjects(ctx context.Context, req *WatchAllObjectsRequest) (*Channel, error) { return nil, status.Errorf(codes.Unimplemented, "method WatchAllObjects not implemented") } func (*UnimplementedStorageServer) GetServiceAccount(ctx context.Context, req *GetProjectServiceAccountRequest) (*ServiceAccount, error) { return nil, status.Errorf(codes.Unimplemented, "method GetServiceAccount not implemented") } func RegisterStorageServer(s *grpc.Server, srv StorageServer) { s.RegisterService(&_Storage_serviceDesc, srv) } func _Storage_DeleteBucketAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteBucketAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).DeleteBucketAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/DeleteBucketAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).DeleteBucketAccessControl(ctx, req.(*DeleteBucketAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetBucketAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetBucketAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetBucketAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetBucketAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetBucketAccessControl(ctx, req.(*GetBucketAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_InsertBucketAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(InsertBucketAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).InsertBucketAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/InsertBucketAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).InsertBucketAccessControl(ctx, req.(*InsertBucketAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ListBucketAccessControls_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListBucketAccessControlsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ListBucketAccessControls(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/ListBucketAccessControls", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ListBucketAccessControls(ctx, req.(*ListBucketAccessControlsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_UpdateBucketAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateBucketAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).UpdateBucketAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/UpdateBucketAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).UpdateBucketAccessControl(ctx, req.(*UpdateBucketAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_PatchBucketAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PatchBucketAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).PatchBucketAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/PatchBucketAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).PatchBucketAccessControl(ctx, req.(*PatchBucketAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_DeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).DeleteBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/DeleteBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).DeleteBucket(ctx, req.(*DeleteBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetBucket(ctx, req.(*GetBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_InsertBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(InsertBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).InsertBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/InsertBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).InsertBucket(ctx, req.(*InsertBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ListBuckets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListBucketsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ListBuckets(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/ListBuckets", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ListBuckets(ctx, req.(*ListBucketsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_LockBucketRetentionPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(LockRetentionPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).LockBucketRetentionPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/LockBucketRetentionPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).LockBucketRetentionPolicy(ctx, req.(*LockRetentionPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetBucketIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(v1.GetIamPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetBucketIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetBucketIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetBucketIamPolicy(ctx, req.(*v1.GetIamPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_SetBucketIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(v1.SetIamPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).SetBucketIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/SetBucketIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).SetBucketIamPolicy(ctx, req.(*v1.SetIamPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_TestBucketIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(v1.TestIamPermissionsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).TestBucketIamPermissions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/TestBucketIamPermissions", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).TestBucketIamPermissions(ctx, req.(*v1.TestIamPermissionsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_PatchBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PatchBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).PatchBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/PatchBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).PatchBucket(ctx, req.(*PatchBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_UpdateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).UpdateBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/UpdateBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).UpdateBucket(ctx, req.(*UpdateBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_StopChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(StopChannelRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).StopChannel(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/StopChannel", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).StopChannel(ctx, req.(*StopChannelRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_DeleteDefaultObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteDefaultObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).DeleteDefaultObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/DeleteDefaultObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).DeleteDefaultObjectAccessControl(ctx, req.(*DeleteDefaultObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetDefaultObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetDefaultObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetDefaultObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetDefaultObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetDefaultObjectAccessControl(ctx, req.(*GetDefaultObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_InsertDefaultObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(InsertDefaultObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).InsertDefaultObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/InsertDefaultObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).InsertDefaultObjectAccessControl(ctx, req.(*InsertDefaultObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ListDefaultObjectAccessControls_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListDefaultObjectAccessControlsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ListDefaultObjectAccessControls(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/ListDefaultObjectAccessControls", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ListDefaultObjectAccessControls(ctx, req.(*ListDefaultObjectAccessControlsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_PatchDefaultObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PatchDefaultObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).PatchDefaultObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/PatchDefaultObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).PatchDefaultObjectAccessControl(ctx, req.(*PatchDefaultObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_UpdateDefaultObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateDefaultObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).UpdateDefaultObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/UpdateDefaultObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).UpdateDefaultObjectAccessControl(ctx, req.(*UpdateDefaultObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_DeleteNotification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteNotificationRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).DeleteNotification(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/DeleteNotification", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).DeleteNotification(ctx, req.(*DeleteNotificationRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetNotification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetNotificationRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetNotification(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetNotification", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetNotification(ctx, req.(*GetNotificationRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_InsertNotification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(InsertNotificationRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).InsertNotification(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/InsertNotification", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).InsertNotification(ctx, req.(*InsertNotificationRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ListNotifications_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListNotificationsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ListNotifications(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/ListNotifications", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ListNotifications(ctx, req.(*ListNotificationsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_DeleteObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).DeleteObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/DeleteObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).DeleteObjectAccessControl(ctx, req.(*DeleteObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetObjectAccessControl(ctx, req.(*GetObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_InsertObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(InsertObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).InsertObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/InsertObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).InsertObjectAccessControl(ctx, req.(*InsertObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ListObjectAccessControls_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListObjectAccessControlsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ListObjectAccessControls(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/ListObjectAccessControls", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ListObjectAccessControls(ctx, req.(*ListObjectAccessControlsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_UpdateObjectAccessControl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateObjectAccessControlRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).UpdateObjectAccessControl(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/UpdateObjectAccessControl", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).UpdateObjectAccessControl(ctx, req.(*UpdateObjectAccessControlRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ComposeObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ComposeObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ComposeObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/ComposeObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ComposeObject(ctx, req.(*ComposeObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_CopyObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CopyObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).CopyObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/CopyObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).CopyObject(ctx, req.(*CopyObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).DeleteObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/DeleteObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).DeleteObject(ctx, req.(*DeleteObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetObject(ctx, req.(*GetObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetObjectMedia_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(GetObjectMediaRequest) if err := stream.RecvMsg(m); err != nil { return err } return srv.(StorageServer).GetObjectMedia(m, &storageGetObjectMediaServer{stream}) } type Storage_GetObjectMediaServer interface { Send(*GetObjectMediaResponse) error grpc.ServerStream } type storageGetObjectMediaServer struct { grpc.ServerStream } func (x *storageGetObjectMediaServer) Send(m *GetObjectMediaResponse) error { return x.ServerStream.SendMsg(m) } func _Storage_InsertObject_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(StorageServer).InsertObject(&storageInsertObjectServer{stream}) } type Storage_InsertObjectServer interface { SendAndClose(*Object) error Recv() (*InsertObjectRequest, error) grpc.ServerStream } type storageInsertObjectServer struct { grpc.ServerStream } func (x *storageInsertObjectServer) SendAndClose(m *Object) error { return x.ServerStream.SendMsg(m) } func (x *storageInsertObjectServer) Recv() (*InsertObjectRequest, error) { m := new(InsertObjectRequest) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func _Storage_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListObjectsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ListObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/ListObjects", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ListObjects(ctx, req.(*ListObjectsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_RewriteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RewriteObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).RewriteObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/RewriteObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).RewriteObject(ctx, req.(*RewriteObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_StartResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(StartResumableWriteRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).StartResumableWrite(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/StartResumableWrite", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).StartResumableWrite(ctx, req.(*StartResumableWriteRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_QueryWriteStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryWriteStatusRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).QueryWriteStatus(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/QueryWriteStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).QueryWriteStatus(ctx, req.(*QueryWriteStatusRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_PatchObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PatchObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).PatchObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/PatchObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).PatchObject(ctx, req.(*PatchObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_UpdateObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).UpdateObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/UpdateObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).UpdateObject(ctx, req.(*UpdateObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetObjectIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(v1.GetIamPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetObjectIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetObjectIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetObjectIamPolicy(ctx, req.(*v1.GetIamPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_SetObjectIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(v1.SetIamPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).SetObjectIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/SetObjectIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).SetObjectIamPolicy(ctx, req.(*v1.SetIamPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_TestObjectIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(v1.TestIamPermissionsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).TestObjectIamPermissions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/TestObjectIamPermissions", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).TestObjectIamPermissions(ctx, req.(*v1.TestIamPermissionsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_WatchAllObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(WatchAllObjectsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).WatchAllObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/WatchAllObjects", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).WatchAllObjects(ctx, req.(*WatchAllObjectsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetServiceAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetProjectServiceAccountRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetServiceAccount(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v1.Storage/GetServiceAccount", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetServiceAccount(ctx, req.(*GetProjectServiceAccountRequest)) } return interceptor(ctx, in, info, handler) } var _Storage_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.storage.v1.Storage", HandlerType: (*StorageServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "DeleteBucketAccessControl", Handler: _Storage_DeleteBucketAccessControl_Handler, }, { MethodName: "GetBucketAccessControl", Handler: _Storage_GetBucketAccessControl_Handler, }, { MethodName: "InsertBucketAccessControl", Handler: _Storage_InsertBucketAccessControl_Handler, }, { MethodName: "ListBucketAccessControls", Handler: _Storage_ListBucketAccessControls_Handler, }, { MethodName: "UpdateBucketAccessControl", Handler: _Storage_UpdateBucketAccessControl_Handler, }, { MethodName: "PatchBucketAccessControl", Handler: _Storage_PatchBucketAccessControl_Handler, }, { MethodName: "DeleteBucket", Handler: _Storage_DeleteBucket_Handler, }, { MethodName: "GetBucket", Handler: _Storage_GetBucket_Handler, }, { MethodName: "InsertBucket", Handler: _Storage_InsertBucket_Handler, }, { MethodName: "ListBuckets", Handler: _Storage_ListBuckets_Handler, }, { MethodName: "LockBucketRetentionPolicy", Handler: _Storage_LockBucketRetentionPolicy_Handler, }, { MethodName: "GetBucketIamPolicy", Handler: _Storage_GetBucketIamPolicy_Handler, }, { MethodName: "SetBucketIamPolicy", Handler: _Storage_SetBucketIamPolicy_Handler, }, { MethodName: "TestBucketIamPermissions", Handler: _Storage_TestBucketIamPermissions_Handler, }, { MethodName: "PatchBucket", Handler: _Storage_PatchBucket_Handler, }, { MethodName: "UpdateBucket", Handler: _Storage_UpdateBucket_Handler, }, { MethodName: "StopChannel", Handler: _Storage_StopChannel_Handler, }, { MethodName: "DeleteDefaultObjectAccessControl", Handler: _Storage_DeleteDefaultObjectAccessControl_Handler, }, { MethodName: "GetDefaultObjectAccessControl", Handler: _Storage_GetDefaultObjectAccessControl_Handler, }, { MethodName: "InsertDefaultObjectAccessControl", Handler: _Storage_InsertDefaultObjectAccessControl_Handler, }, { MethodName: "ListDefaultObjectAccessControls", Handler: _Storage_ListDefaultObjectAccessControls_Handler, }, { MethodName: "PatchDefaultObjectAccessControl", Handler: _Storage_PatchDefaultObjectAccessControl_Handler, }, { MethodName: "UpdateDefaultObjectAccessControl", Handler: _Storage_UpdateDefaultObjectAccessControl_Handler, }, { MethodName: "DeleteNotification", Handler: _Storage_DeleteNotification_Handler, }, { MethodName: "GetNotification", Handler: _Storage_GetNotification_Handler, }, { MethodName: "InsertNotification", Handler: _Storage_InsertNotification_Handler, }, { MethodName: "ListNotifications", Handler: _Storage_ListNotifications_Handler, }, { MethodName: "DeleteObjectAccessControl", Handler: _Storage_DeleteObjectAccessControl_Handler, }, { MethodName: "GetObjectAccessControl", Handler: _Storage_GetObjectAccessControl_Handler, }, { MethodName: "InsertObjectAccessControl", Handler: _Storage_InsertObjectAccessControl_Handler, }, { MethodName: "ListObjectAccessControls", Handler: _Storage_ListObjectAccessControls_Handler, }, { MethodName: "UpdateObjectAccessControl", Handler: _Storage_UpdateObjectAccessControl_Handler, }, { MethodName: "ComposeObject", Handler: _Storage_ComposeObject_Handler, }, { MethodName: "CopyObject", Handler: _Storage_CopyObject_Handler, }, { MethodName: "DeleteObject", Handler: _Storage_DeleteObject_Handler, }, { MethodName: "GetObject", Handler: _Storage_GetObject_Handler, }, { MethodName: "ListObjects", Handler: _Storage_ListObjects_Handler, }, { MethodName: "RewriteObject", Handler: _Storage_RewriteObject_Handler, }, { MethodName: "StartResumableWrite", Handler: _Storage_StartResumableWrite_Handler, }, { MethodName: "QueryWriteStatus", Handler: _Storage_QueryWriteStatus_Handler, }, { MethodName: "PatchObject", Handler: _Storage_PatchObject_Handler, }, { MethodName: "UpdateObject", Handler: _Storage_UpdateObject_Handler, }, { MethodName: "GetObjectIamPolicy", Handler: _Storage_GetObjectIamPolicy_Handler, }, { MethodName: "SetObjectIamPolicy", Handler: _Storage_SetObjectIamPolicy_Handler, }, { MethodName: "TestObjectIamPermissions", Handler: _Storage_TestObjectIamPermissions_Handler, }, { MethodName: "WatchAllObjects", Handler: _Storage_WatchAllObjects_Handler, }, { MethodName: "GetServiceAccount", Handler: _Storage_GetServiceAccount_Handler, }, }, Streams: []grpc.StreamDesc{ { StreamName: "GetObjectMedia", Handler: _Storage_GetObjectMedia_Handler, ServerStreams: true, }, { StreamName: "InsertObject", Handler: _Storage_InsertObject_Handler, ClientStreams: true, }, }, Metadata: "google/storage/v1/storage.proto", } storage_resources.pb.go000066400000000000000000003247771457366620600364370ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/google.golang.org/genproto/googleapis/storage/v1// Code generated by protoc-gen-go. DO NOT EDIT. // source: google/storage/v1/storage_resources.proto package storage import ( fmt "fmt" proto "github.com/golang/protobuf/proto" timestamp "github.com/golang/protobuf/ptypes/timestamp" wrappers "github.com/golang/protobuf/ptypes/wrappers" math "math" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package // A set of properties to return in a response. type CommonEnums_Projection int32 const ( // No specified projection. CommonEnums_PROJECTION_UNSPECIFIED CommonEnums_Projection = 0 // Omit `owner`, `acl`, and `defaultObjectAcl` properties. CommonEnums_NO_ACL CommonEnums_Projection = 1 // Include all properties. CommonEnums_FULL CommonEnums_Projection = 2 ) var CommonEnums_Projection_name = map[int32]string{ 0: "PROJECTION_UNSPECIFIED", 1: "NO_ACL", 2: "FULL", } var CommonEnums_Projection_value = map[string]int32{ "PROJECTION_UNSPECIFIED": 0, "NO_ACL": 1, "FULL": 2, } func (x CommonEnums_Projection) String() string { return proto.EnumName(CommonEnums_Projection_name, int32(x)) } func (CommonEnums_Projection) EnumDescriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{7, 0} } // Predefined or "canned" aliases for sets of specific bucket ACL entries. type CommonEnums_PredefinedBucketAcl int32 const ( // No predefined ACL. CommonEnums_PREDEFINED_BUCKET_ACL_UNSPECIFIED CommonEnums_PredefinedBucketAcl = 0 // Project team owners get `OWNER` access, and // `allAuthenticatedUsers` get `READER` access. CommonEnums_BUCKET_ACL_AUTHENTICATED_READ CommonEnums_PredefinedBucketAcl = 1 // Project team owners get `OWNER` access. CommonEnums_BUCKET_ACL_PRIVATE CommonEnums_PredefinedBucketAcl = 2 // Project team members get access according to their roles. CommonEnums_BUCKET_ACL_PROJECT_PRIVATE CommonEnums_PredefinedBucketAcl = 3 // Project team owners get `OWNER` access, and // `allUsers` get `READER` access. CommonEnums_BUCKET_ACL_PUBLIC_READ CommonEnums_PredefinedBucketAcl = 4 // Project team owners get `OWNER` access, and // `allUsers` get `WRITER` access. CommonEnums_BUCKET_ACL_PUBLIC_READ_WRITE CommonEnums_PredefinedBucketAcl = 5 ) var CommonEnums_PredefinedBucketAcl_name = map[int32]string{ 0: "PREDEFINED_BUCKET_ACL_UNSPECIFIED", 1: "BUCKET_ACL_AUTHENTICATED_READ", 2: "BUCKET_ACL_PRIVATE", 3: "BUCKET_ACL_PROJECT_PRIVATE", 4: "BUCKET_ACL_PUBLIC_READ", 5: "BUCKET_ACL_PUBLIC_READ_WRITE", } var CommonEnums_PredefinedBucketAcl_value = map[string]int32{ "PREDEFINED_BUCKET_ACL_UNSPECIFIED": 0, "BUCKET_ACL_AUTHENTICATED_READ": 1, "BUCKET_ACL_PRIVATE": 2, "BUCKET_ACL_PROJECT_PRIVATE": 3, "BUCKET_ACL_PUBLIC_READ": 4, "BUCKET_ACL_PUBLIC_READ_WRITE": 5, } func (x CommonEnums_PredefinedBucketAcl) String() string { return proto.EnumName(CommonEnums_PredefinedBucketAcl_name, int32(x)) } func (CommonEnums_PredefinedBucketAcl) EnumDescriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{7, 1} } // Predefined or "canned" aliases for sets of specific object ACL entries. type CommonEnums_PredefinedObjectAcl int32 const ( // No predefined ACL. CommonEnums_PREDEFINED_OBJECT_ACL_UNSPECIFIED CommonEnums_PredefinedObjectAcl = 0 // Object owner gets `OWNER` access, and // `allAuthenticatedUsers` get `READER` access. CommonEnums_OBJECT_ACL_AUTHENTICATED_READ CommonEnums_PredefinedObjectAcl = 1 // Object owner gets `OWNER` access, and project team owners get // `OWNER` access. CommonEnums_OBJECT_ACL_BUCKET_OWNER_FULL_CONTROL CommonEnums_PredefinedObjectAcl = 2 // Object owner gets `OWNER` access, and project team owners get // `READER` access. CommonEnums_OBJECT_ACL_BUCKET_OWNER_READ CommonEnums_PredefinedObjectAcl = 3 // Object owner gets `OWNER` access. CommonEnums_OBJECT_ACL_PRIVATE CommonEnums_PredefinedObjectAcl = 4 // Object owner gets `OWNER` access, and project team members get // access according to their roles. CommonEnums_OBJECT_ACL_PROJECT_PRIVATE CommonEnums_PredefinedObjectAcl = 5 // Object owner gets `OWNER` access, and `allUsers` // get `READER` access. CommonEnums_OBJECT_ACL_PUBLIC_READ CommonEnums_PredefinedObjectAcl = 6 ) var CommonEnums_PredefinedObjectAcl_name = map[int32]string{ 0: "PREDEFINED_OBJECT_ACL_UNSPECIFIED", 1: "OBJECT_ACL_AUTHENTICATED_READ", 2: "OBJECT_ACL_BUCKET_OWNER_FULL_CONTROL", 3: "OBJECT_ACL_BUCKET_OWNER_READ", 4: "OBJECT_ACL_PRIVATE", 5: "OBJECT_ACL_PROJECT_PRIVATE", 6: "OBJECT_ACL_PUBLIC_READ", } var CommonEnums_PredefinedObjectAcl_value = map[string]int32{ "PREDEFINED_OBJECT_ACL_UNSPECIFIED": 0, "OBJECT_ACL_AUTHENTICATED_READ": 1, "OBJECT_ACL_BUCKET_OWNER_FULL_CONTROL": 2, "OBJECT_ACL_BUCKET_OWNER_READ": 3, "OBJECT_ACL_PRIVATE": 4, "OBJECT_ACL_PROJECT_PRIVATE": 5, "OBJECT_ACL_PUBLIC_READ": 6, } func (x CommonEnums_PredefinedObjectAcl) String() string { return proto.EnumName(CommonEnums_PredefinedObjectAcl_name, int32(x)) } func (CommonEnums_PredefinedObjectAcl) EnumDescriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{7, 2} } // A bucket. type Bucket struct { // Access controls on the bucket. Acl []*BucketAccessControl `protobuf:"bytes,1,rep,name=acl,proto3" json:"acl,omitempty"` // Default access controls to apply to new objects when no ACL is provided. DefaultObjectAcl []*ObjectAccessControl `protobuf:"bytes,2,rep,name=default_object_acl,json=defaultObjectAcl,proto3" json:"default_object_acl,omitempty"` // The bucket's lifecycle configuration. See // [https://developers.google.com/storage/docs/lifecycle]Lifecycle Management] // for more information. Lifecycle *Bucket_Lifecycle `protobuf:"bytes,3,opt,name=lifecycle,proto3" json:"lifecycle,omitempty"` // The creation time of the bucket in // [https://tools.ietf.org/html/rfc3339][RFC 3339] format. // Attempting to set this field will result in an error. TimeCreated *timestamp.Timestamp `protobuf:"bytes,4,opt,name=time_created,json=timeCreated,proto3" json:"time_created,omitempty"` // The ID of the bucket. For buckets, the `id` and `name` properties are the // same. // Attempting to update this field after the bucket is created will result in // an error. Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"` // The name of the bucket. // Attempting to update this field after the bucket is created will result in // an error. Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` // The project number of the project the bucket belongs to. // Attempting to set this field will result in an error. ProjectNumber int64 `protobuf:"varint,7,opt,name=project_number,json=projectNumber,proto3" json:"project_number,omitempty"` // The metadata generation of this bucket. // Attempting to set this field will result in an error. Metageneration int64 `protobuf:"varint,8,opt,name=metageneration,proto3" json:"metageneration,omitempty"` // The bucket's [https://www.w3.org/TR/cors/][Cross-Origin Resource Sharing] // (CORS) configuration. Cors []*Bucket_Cors `protobuf:"bytes,9,rep,name=cors,proto3" json:"cors,omitempty"` // The location of the bucket. Object data for objects in the bucket resides // in physical storage within this region. Defaults to `US`. See the // [https://developers.google.com/storage/docs/concepts-techniques#specifyinglocations"][developer's // guide] for the authoritative list. Attempting to update this field after // the bucket is created will result in an error. Location string `protobuf:"bytes,10,opt,name=location,proto3" json:"location,omitempty"` // The bucket's default storage class, used whenever no storageClass is // specified for a newly-created object. This defines how objects in the // bucket are stored and determines the SLA and the cost of storage. // If this value is not specified when the bucket is created, it will default // to `STANDARD`. For more information, see // https://developers.google.com/storage/docs/storage-classes. StorageClass string `protobuf:"bytes,11,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` // HTTP 1.1 [https://tools.ietf.org/html/rfc7232#section-2.3"]Entity tag] // for the bucket. // Attempting to set this field will result in an error. Etag string `protobuf:"bytes,12,opt,name=etag,proto3" json:"etag,omitempty"` // The modification time of the bucket. // Attempting to set this field will result in an error. Updated *timestamp.Timestamp `protobuf:"bytes,13,opt,name=updated,proto3" json:"updated,omitempty"` // The default value for event-based hold on newly created objects in this // bucket. Event-based hold is a way to retain objects indefinitely until an // event occurs, signified by the // hold's release. After being released, such objects will be subject to // bucket-level retention (if any). One sample use case of this flag is for // banks to hold loan documents for at least 3 years after loan is paid in // full. Here, bucket-level retention is 3 years and the event is loan being // paid in full. In this example, these objects will be held intact for any // number of years until the event has occurred (event-based hold on the // object is released) and then 3 more years after that. That means retention // duration of the objects begins from the moment event-based hold // transitioned from true to false. Objects under event-based hold cannot be // deleted, overwritten or archived until the hold is removed. DefaultEventBasedHold bool `protobuf:"varint,14,opt,name=default_event_based_hold,json=defaultEventBasedHold,proto3" json:"default_event_based_hold,omitempty"` // User-provided labels, in key/value pairs. Labels map[string]string `protobuf:"bytes,15,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The bucket's website configuration, controlling how the service behaves // when accessing bucket contents as a web site. See the // [https://cloud.google.com/storage/docs/static-website][Static Website // Examples] for more information. Website *Bucket_Website `protobuf:"bytes,16,opt,name=website,proto3" json:"website,omitempty"` // The bucket's versioning configuration. Versioning *Bucket_Versioning `protobuf:"bytes,17,opt,name=versioning,proto3" json:"versioning,omitempty"` // The bucket's logging configuration, which defines the destination bucket // and optional name prefix for the current bucket's logs. Logging *Bucket_Logging `protobuf:"bytes,18,opt,name=logging,proto3" json:"logging,omitempty"` // The owner of the bucket. This is always the project team's owner group. Owner *Owner `protobuf:"bytes,19,opt,name=owner,proto3" json:"owner,omitempty"` // Encryption configuration for a bucket. Encryption *Bucket_Encryption `protobuf:"bytes,20,opt,name=encryption,proto3" json:"encryption,omitempty"` // The bucket's billing configuration. Billing *Bucket_Billing `protobuf:"bytes,21,opt,name=billing,proto3" json:"billing,omitempty"` // The bucket's retention policy. The retention policy enforces a minimum // retention time for all objects contained in the bucket, based on their // creation time. Any attempt to overwrite or delete objects younger than the // retention period will result in a PERMISSION_DENIED error. An unlocked // retention policy can be modified or removed from the bucket via a // storage.buckets.update operation. A locked retention policy cannot be // removed or shortened in duration for the lifetime of the bucket. // Attempting to remove or decrease period of a locked retention policy will // result in a PERMISSION_DENIED error. RetentionPolicy *Bucket_RetentionPolicy `protobuf:"bytes,22,opt,name=retention_policy,json=retentionPolicy,proto3" json:"retention_policy,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket) Reset() { *m = Bucket{} } func (m *Bucket) String() string { return proto.CompactTextString(m) } func (*Bucket) ProtoMessage() {} func (*Bucket) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0} } func (m *Bucket) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket.Unmarshal(m, b) } func (m *Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket.Marshal(b, m, deterministic) } func (m *Bucket) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket.Merge(m, src) } func (m *Bucket) XXX_Size() int { return xxx_messageInfo_Bucket.Size(m) } func (m *Bucket) XXX_DiscardUnknown() { xxx_messageInfo_Bucket.DiscardUnknown(m) } var xxx_messageInfo_Bucket proto.InternalMessageInfo func (m *Bucket) GetAcl() []*BucketAccessControl { if m != nil { return m.Acl } return nil } func (m *Bucket) GetDefaultObjectAcl() []*ObjectAccessControl { if m != nil { return m.DefaultObjectAcl } return nil } func (m *Bucket) GetLifecycle() *Bucket_Lifecycle { if m != nil { return m.Lifecycle } return nil } func (m *Bucket) GetTimeCreated() *timestamp.Timestamp { if m != nil { return m.TimeCreated } return nil } func (m *Bucket) GetId() string { if m != nil { return m.Id } return "" } func (m *Bucket) GetName() string { if m != nil { return m.Name } return "" } func (m *Bucket) GetProjectNumber() int64 { if m != nil { return m.ProjectNumber } return 0 } func (m *Bucket) GetMetageneration() int64 { if m != nil { return m.Metageneration } return 0 } func (m *Bucket) GetCors() []*Bucket_Cors { if m != nil { return m.Cors } return nil } func (m *Bucket) GetLocation() string { if m != nil { return m.Location } return "" } func (m *Bucket) GetStorageClass() string { if m != nil { return m.StorageClass } return "" } func (m *Bucket) GetEtag() string { if m != nil { return m.Etag } return "" } func (m *Bucket) GetUpdated() *timestamp.Timestamp { if m != nil { return m.Updated } return nil } func (m *Bucket) GetDefaultEventBasedHold() bool { if m != nil { return m.DefaultEventBasedHold } return false } func (m *Bucket) GetLabels() map[string]string { if m != nil { return m.Labels } return nil } func (m *Bucket) GetWebsite() *Bucket_Website { if m != nil { return m.Website } return nil } func (m *Bucket) GetVersioning() *Bucket_Versioning { if m != nil { return m.Versioning } return nil } func (m *Bucket) GetLogging() *Bucket_Logging { if m != nil { return m.Logging } return nil } func (m *Bucket) GetOwner() *Owner { if m != nil { return m.Owner } return nil } func (m *Bucket) GetEncryption() *Bucket_Encryption { if m != nil { return m.Encryption } return nil } func (m *Bucket) GetBilling() *Bucket_Billing { if m != nil { return m.Billing } return nil } func (m *Bucket) GetRetentionPolicy() *Bucket_RetentionPolicy { if m != nil { return m.RetentionPolicy } return nil } // Billing properties of a bucket. type Bucket_Billing struct { // When set to true, Requester Pays is enabled for this bucket. RequesterPays bool `protobuf:"varint,1,opt,name=requester_pays,json=requesterPays,proto3" json:"requester_pays,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Billing) Reset() { *m = Bucket_Billing{} } func (m *Bucket_Billing) String() string { return proto.CompactTextString(m) } func (*Bucket_Billing) ProtoMessage() {} func (*Bucket_Billing) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 0} } func (m *Bucket_Billing) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Billing.Unmarshal(m, b) } func (m *Bucket_Billing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Billing.Marshal(b, m, deterministic) } func (m *Bucket_Billing) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Billing.Merge(m, src) } func (m *Bucket_Billing) XXX_Size() int { return xxx_messageInfo_Bucket_Billing.Size(m) } func (m *Bucket_Billing) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Billing.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Billing proto.InternalMessageInfo func (m *Bucket_Billing) GetRequesterPays() bool { if m != nil { return m.RequesterPays } return false } // Cross-Origin Response sharing (CORS) properties for a bucket. // For more on GCS and CORS, see // https://cloud.google.com/storage/docs/cross-origin. // For more on CORS in general, see https://tools.ietf.org/html/rfc6454. type Bucket_Cors struct { // The list of Origins eligible to receive CORS response headers. See // [https://tools.ietf.org/html/rfc6454][RFC 6454] for more on origins. // Note: "*" is permitted in the list of origins, and means "any Origin". Origin []string `protobuf:"bytes,1,rep,name=origin,proto3" json:"origin,omitempty"` // The list of HTTP methods on which to include CORS response headers, // (`GET`, `OPTIONS`, `POST`, etc) Note: "*" is permitted in the list of // methods, and means "any method". Method []string `protobuf:"bytes,2,rep,name=method,proto3" json:"method,omitempty"` // The list of HTTP headers other than the // [https://www.w3.org/TR/cors/#simple-response-header][simple response // headers] to give permission for the user-agent to share across domains. ResponseHeader []string `protobuf:"bytes,3,rep,name=response_header,json=responseHeader,proto3" json:"response_header,omitempty"` // The value, in seconds, to return in the // [https://www.w3.org/TR/cors/#access-control-max-age-response-header][Access-Control-Max-Age // header] used in preflight responses. MaxAgeSeconds int32 `protobuf:"varint,4,opt,name=max_age_seconds,json=maxAgeSeconds,proto3" json:"max_age_seconds,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Cors) Reset() { *m = Bucket_Cors{} } func (m *Bucket_Cors) String() string { return proto.CompactTextString(m) } func (*Bucket_Cors) ProtoMessage() {} func (*Bucket_Cors) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 1} } func (m *Bucket_Cors) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Cors.Unmarshal(m, b) } func (m *Bucket_Cors) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Cors.Marshal(b, m, deterministic) } func (m *Bucket_Cors) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Cors.Merge(m, src) } func (m *Bucket_Cors) XXX_Size() int { return xxx_messageInfo_Bucket_Cors.Size(m) } func (m *Bucket_Cors) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Cors.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Cors proto.InternalMessageInfo func (m *Bucket_Cors) GetOrigin() []string { if m != nil { return m.Origin } return nil } func (m *Bucket_Cors) GetMethod() []string { if m != nil { return m.Method } return nil } func (m *Bucket_Cors) GetResponseHeader() []string { if m != nil { return m.ResponseHeader } return nil } func (m *Bucket_Cors) GetMaxAgeSeconds() int32 { if m != nil { return m.MaxAgeSeconds } return 0 } // Encryption properties of a bucket. type Bucket_Encryption struct { // A Cloud KMS key that will be used to encrypt objects inserted into this // bucket, if no encryption method is specified. DefaultKmsKeyName string `protobuf:"bytes,1,opt,name=default_kms_key_name,json=defaultKmsKeyName,proto3" json:"default_kms_key_name,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Encryption) Reset() { *m = Bucket_Encryption{} } func (m *Bucket_Encryption) String() string { return proto.CompactTextString(m) } func (*Bucket_Encryption) ProtoMessage() {} func (*Bucket_Encryption) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 2} } func (m *Bucket_Encryption) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Encryption.Unmarshal(m, b) } func (m *Bucket_Encryption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Encryption.Marshal(b, m, deterministic) } func (m *Bucket_Encryption) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Encryption.Merge(m, src) } func (m *Bucket_Encryption) XXX_Size() int { return xxx_messageInfo_Bucket_Encryption.Size(m) } func (m *Bucket_Encryption) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Encryption.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Encryption proto.InternalMessageInfo func (m *Bucket_Encryption) GetDefaultKmsKeyName() string { if m != nil { return m.DefaultKmsKeyName } return "" } // Lifecycle properties of a bucket. // For more information, see https://cloud.google.com/storage/docs/lifecycle. type Bucket_Lifecycle struct { // A lifecycle management rule, which is made of an action to take and the // condition(s) under which the action will be taken. Rule []*Bucket_Lifecycle_Rule `protobuf:"bytes,1,rep,name=rule,proto3" json:"rule,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Lifecycle) Reset() { *m = Bucket_Lifecycle{} } func (m *Bucket_Lifecycle) String() string { return proto.CompactTextString(m) } func (*Bucket_Lifecycle) ProtoMessage() {} func (*Bucket_Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 3} } func (m *Bucket_Lifecycle) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Lifecycle.Unmarshal(m, b) } func (m *Bucket_Lifecycle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Lifecycle.Marshal(b, m, deterministic) } func (m *Bucket_Lifecycle) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Lifecycle.Merge(m, src) } func (m *Bucket_Lifecycle) XXX_Size() int { return xxx_messageInfo_Bucket_Lifecycle.Size(m) } func (m *Bucket_Lifecycle) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Lifecycle.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Lifecycle proto.InternalMessageInfo func (m *Bucket_Lifecycle) GetRule() []*Bucket_Lifecycle_Rule { if m != nil { return m.Rule } return nil } // A lifecycle Rule, combining an action to take on an object and a // condition which will trigger that action. type Bucket_Lifecycle_Rule struct { // The action to take. Action *Bucket_Lifecycle_Rule_Action `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` // The condition(s) under which the action will be taken. Condition *Bucket_Lifecycle_Rule_Condition `protobuf:"bytes,2,opt,name=condition,proto3" json:"condition,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Lifecycle_Rule) Reset() { *m = Bucket_Lifecycle_Rule{} } func (m *Bucket_Lifecycle_Rule) String() string { return proto.CompactTextString(m) } func (*Bucket_Lifecycle_Rule) ProtoMessage() {} func (*Bucket_Lifecycle_Rule) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 3, 0} } func (m *Bucket_Lifecycle_Rule) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Lifecycle_Rule.Unmarshal(m, b) } func (m *Bucket_Lifecycle_Rule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Lifecycle_Rule.Marshal(b, m, deterministic) } func (m *Bucket_Lifecycle_Rule) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Lifecycle_Rule.Merge(m, src) } func (m *Bucket_Lifecycle_Rule) XXX_Size() int { return xxx_messageInfo_Bucket_Lifecycle_Rule.Size(m) } func (m *Bucket_Lifecycle_Rule) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Lifecycle_Rule.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Lifecycle_Rule proto.InternalMessageInfo func (m *Bucket_Lifecycle_Rule) GetAction() *Bucket_Lifecycle_Rule_Action { if m != nil { return m.Action } return nil } func (m *Bucket_Lifecycle_Rule) GetCondition() *Bucket_Lifecycle_Rule_Condition { if m != nil { return m.Condition } return nil } // An action to take on an object. type Bucket_Lifecycle_Rule_Action struct { // Type of the action. Currently, only `Delete` and // `SetStorageClass` are supported. Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Target storage class. Required iff the type of the action is // SetStorageClass. StorageClass string `protobuf:"bytes,2,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Lifecycle_Rule_Action) Reset() { *m = Bucket_Lifecycle_Rule_Action{} } func (m *Bucket_Lifecycle_Rule_Action) String() string { return proto.CompactTextString(m) } func (*Bucket_Lifecycle_Rule_Action) ProtoMessage() {} func (*Bucket_Lifecycle_Rule_Action) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 3, 0, 0} } func (m *Bucket_Lifecycle_Rule_Action) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Lifecycle_Rule_Action.Unmarshal(m, b) } func (m *Bucket_Lifecycle_Rule_Action) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Lifecycle_Rule_Action.Marshal(b, m, deterministic) } func (m *Bucket_Lifecycle_Rule_Action) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Lifecycle_Rule_Action.Merge(m, src) } func (m *Bucket_Lifecycle_Rule_Action) XXX_Size() int { return xxx_messageInfo_Bucket_Lifecycle_Rule_Action.Size(m) } func (m *Bucket_Lifecycle_Rule_Action) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Lifecycle_Rule_Action.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Lifecycle_Rule_Action proto.InternalMessageInfo func (m *Bucket_Lifecycle_Rule_Action) GetType() string { if m != nil { return m.Type } return "" } func (m *Bucket_Lifecycle_Rule_Action) GetStorageClass() string { if m != nil { return m.StorageClass } return "" } // A condition of an object which triggers some action. type Bucket_Lifecycle_Rule_Condition struct { // Age of an object (in days). This condition is satisfied when an // object reaches the specified age. Age int32 `protobuf:"varint,1,opt,name=age,proto3" json:"age,omitempty"` // A date in [RFC 3339][1] format with only the date part (for // instance, "2013-01-15"). This condition is satisfied when an // object is created before midnight of the specified date in UTC. // [1]: https://tools.ietf.org/html/rfc3339 CreatedBefore *timestamp.Timestamp `protobuf:"bytes,2,opt,name=created_before,json=createdBefore,proto3" json:"created_before,omitempty"` // Relevant only for versioned objects. If the value is // `true`, this condition matches live objects; if the value // is `false`, it matches archived objects. IsLive *wrappers.BoolValue `protobuf:"bytes,3,opt,name=is_live,json=isLive,proto3" json:"is_live,omitempty"` // Relevant only for versioned objects. If the value is N, this // condition is satisfied when there are at least N versions (including // the live version) newer than this version of the object. NumNewerVersions int32 `protobuf:"varint,4,opt,name=num_newer_versions,json=numNewerVersions,proto3" json:"num_newer_versions,omitempty"` // Objects having any of the storage classes specified by this condition // will be matched. Values include `MULTI_REGIONAL`, `REGIONAL`, // `NEARLINE`, `COLDLINE`, `STANDARD`, and // `DURABLE_REDUCED_AVAILABILITY`. MatchesStorageClass []string `protobuf:"bytes,5,rep,name=matches_storage_class,json=matchesStorageClass,proto3" json:"matches_storage_class,omitempty"` // A regular expression that satisfies the RE2 syntax. This condition is // satisfied when the name of the object matches the RE2 pattern. Note: // This feature is currently in the "Early Access" launch stage and is // only available to a whitelisted set of users; that means that this // feature may be changed in backward-incompatible ways and that it is // not guaranteed to be released. MatchesPattern string `protobuf:"bytes,6,opt,name=matches_pattern,json=matchesPattern,proto3" json:"matches_pattern,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Lifecycle_Rule_Condition) Reset() { *m = Bucket_Lifecycle_Rule_Condition{} } func (m *Bucket_Lifecycle_Rule_Condition) String() string { return proto.CompactTextString(m) } func (*Bucket_Lifecycle_Rule_Condition) ProtoMessage() {} func (*Bucket_Lifecycle_Rule_Condition) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 3, 0, 1} } func (m *Bucket_Lifecycle_Rule_Condition) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Lifecycle_Rule_Condition.Unmarshal(m, b) } func (m *Bucket_Lifecycle_Rule_Condition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Lifecycle_Rule_Condition.Marshal(b, m, deterministic) } func (m *Bucket_Lifecycle_Rule_Condition) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Lifecycle_Rule_Condition.Merge(m, src) } func (m *Bucket_Lifecycle_Rule_Condition) XXX_Size() int { return xxx_messageInfo_Bucket_Lifecycle_Rule_Condition.Size(m) } func (m *Bucket_Lifecycle_Rule_Condition) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Lifecycle_Rule_Condition.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Lifecycle_Rule_Condition proto.InternalMessageInfo func (m *Bucket_Lifecycle_Rule_Condition) GetAge() int32 { if m != nil { return m.Age } return 0 } func (m *Bucket_Lifecycle_Rule_Condition) GetCreatedBefore() *timestamp.Timestamp { if m != nil { return m.CreatedBefore } return nil } func (m *Bucket_Lifecycle_Rule_Condition) GetIsLive() *wrappers.BoolValue { if m != nil { return m.IsLive } return nil } func (m *Bucket_Lifecycle_Rule_Condition) GetNumNewerVersions() int32 { if m != nil { return m.NumNewerVersions } return 0 } func (m *Bucket_Lifecycle_Rule_Condition) GetMatchesStorageClass() []string { if m != nil { return m.MatchesStorageClass } return nil } func (m *Bucket_Lifecycle_Rule_Condition) GetMatchesPattern() string { if m != nil { return m.MatchesPattern } return "" } // Logging-related properties of a bucket. type Bucket_Logging struct { // The destination bucket where the current bucket's logs should be placed. LogBucket string `protobuf:"bytes,1,opt,name=log_bucket,json=logBucket,proto3" json:"log_bucket,omitempty"` // A prefix for log object names. LogObjectPrefix string `protobuf:"bytes,2,opt,name=log_object_prefix,json=logObjectPrefix,proto3" json:"log_object_prefix,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Logging) Reset() { *m = Bucket_Logging{} } func (m *Bucket_Logging) String() string { return proto.CompactTextString(m) } func (*Bucket_Logging) ProtoMessage() {} func (*Bucket_Logging) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 4} } func (m *Bucket_Logging) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Logging.Unmarshal(m, b) } func (m *Bucket_Logging) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Logging.Marshal(b, m, deterministic) } func (m *Bucket_Logging) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Logging.Merge(m, src) } func (m *Bucket_Logging) XXX_Size() int { return xxx_messageInfo_Bucket_Logging.Size(m) } func (m *Bucket_Logging) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Logging.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Logging proto.InternalMessageInfo func (m *Bucket_Logging) GetLogBucket() string { if m != nil { return m.LogBucket } return "" } func (m *Bucket_Logging) GetLogObjectPrefix() string { if m != nil { return m.LogObjectPrefix } return "" } // Retention policy properties of a bucket. type Bucket_RetentionPolicy struct { // Server-determined value that indicates the time from which policy was // enforced and effective. This value is in // [https://tools.ietf.org/html/rfc3339][RFC 3339] format. EffectiveTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=effective_time,json=effectiveTime,proto3" json:"effective_time,omitempty"` // Once locked, an object retention policy cannot be modified. IsLocked bool `protobuf:"varint,2,opt,name=is_locked,json=isLocked,proto3" json:"is_locked,omitempty"` // The duration in seconds that objects need to be retained. Retention // duration must be greater than zero and less than 100 years. Note that // enforcement of retention periods less than a day is not guaranteed. Such // periods should only be used for testing purposes. RetentionPeriod int64 `protobuf:"varint,3,opt,name=retention_period,json=retentionPeriod,proto3" json:"retention_period,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_RetentionPolicy) Reset() { *m = Bucket_RetentionPolicy{} } func (m *Bucket_RetentionPolicy) String() string { return proto.CompactTextString(m) } func (*Bucket_RetentionPolicy) ProtoMessage() {} func (*Bucket_RetentionPolicy) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 5} } func (m *Bucket_RetentionPolicy) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_RetentionPolicy.Unmarshal(m, b) } func (m *Bucket_RetentionPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_RetentionPolicy.Marshal(b, m, deterministic) } func (m *Bucket_RetentionPolicy) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_RetentionPolicy.Merge(m, src) } func (m *Bucket_RetentionPolicy) XXX_Size() int { return xxx_messageInfo_Bucket_RetentionPolicy.Size(m) } func (m *Bucket_RetentionPolicy) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_RetentionPolicy.DiscardUnknown(m) } var xxx_messageInfo_Bucket_RetentionPolicy proto.InternalMessageInfo func (m *Bucket_RetentionPolicy) GetEffectiveTime() *timestamp.Timestamp { if m != nil { return m.EffectiveTime } return nil } func (m *Bucket_RetentionPolicy) GetIsLocked() bool { if m != nil { return m.IsLocked } return false } func (m *Bucket_RetentionPolicy) GetRetentionPeriod() int64 { if m != nil { return m.RetentionPeriod } return 0 } // Properties of a bucket related to versioning. // For more on GCS versioning, see // https://cloud.google.com/storage/docs/object-versioning. type Bucket_Versioning struct { // While set to true, versioning is fully enabled for this bucket. Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Versioning) Reset() { *m = Bucket_Versioning{} } func (m *Bucket_Versioning) String() string { return proto.CompactTextString(m) } func (*Bucket_Versioning) ProtoMessage() {} func (*Bucket_Versioning) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 6} } func (m *Bucket_Versioning) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Versioning.Unmarshal(m, b) } func (m *Bucket_Versioning) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Versioning.Marshal(b, m, deterministic) } func (m *Bucket_Versioning) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Versioning.Merge(m, src) } func (m *Bucket_Versioning) XXX_Size() int { return xxx_messageInfo_Bucket_Versioning.Size(m) } func (m *Bucket_Versioning) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Versioning.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Versioning proto.InternalMessageInfo func (m *Bucket_Versioning) GetEnabled() bool { if m != nil { return m.Enabled } return false } // Properties of a bucket related to accessing the contents as a static // website. For more on hosting a static website via GCS, see // https://cloud.google.com/storage/docs/hosting-static-website. type Bucket_Website struct { // If the requested object path is missing, the service will ensure the path // has a trailing '/', append this suffix, and attempt to retrieve the // resulting object. This allows the creation of `index.html` // objects to represent directory pages. MainPageSuffix string `protobuf:"bytes,1,opt,name=main_page_suffix,json=mainPageSuffix,proto3" json:"main_page_suffix,omitempty"` // If the requested object path is missing, and any // `mainPageSuffix` object is missing, if applicable, the service // will return the named object from this bucket as the content for a // [https://tools.ietf.org/html/rfc7231#section-6.5.4][404 Not Found] // result. NotFoundPage string `protobuf:"bytes,2,opt,name=not_found_page,json=notFoundPage,proto3" json:"not_found_page,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Bucket_Website) Reset() { *m = Bucket_Website{} } func (m *Bucket_Website) String() string { return proto.CompactTextString(m) } func (*Bucket_Website) ProtoMessage() {} func (*Bucket_Website) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{0, 7} } func (m *Bucket_Website) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket_Website.Unmarshal(m, b) } func (m *Bucket_Website) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket_Website.Marshal(b, m, deterministic) } func (m *Bucket_Website) XXX_Merge(src proto.Message) { xxx_messageInfo_Bucket_Website.Merge(m, src) } func (m *Bucket_Website) XXX_Size() int { return xxx_messageInfo_Bucket_Website.Size(m) } func (m *Bucket_Website) XXX_DiscardUnknown() { xxx_messageInfo_Bucket_Website.DiscardUnknown(m) } var xxx_messageInfo_Bucket_Website proto.InternalMessageInfo func (m *Bucket_Website) GetMainPageSuffix() string { if m != nil { return m.MainPageSuffix } return "" } func (m *Bucket_Website) GetNotFoundPage() string { if m != nil { return m.NotFoundPage } return "" } // An access-control entry. type BucketAccessControl struct { // The access permission for the entity. Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` // HTTP 1.1 ["https://tools.ietf.org/html/rfc7232#section-2.3][Entity tag] // for the access-control entry. Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` // The ID of the access-control entry. Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` // The name of the bucket. Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` // The entity holding the permission, in one of the following forms: // * `user-{userid}` // * `user-{email}` // * `group-{groupid}` // * `group-{email}` // * `domain-{domain}` // * `project-{team-projectid}` // * `allUsers` // * `allAuthenticatedUsers` // Examples: // * The user `liz@example.com` would be `user-liz@example.com`. // * The group `example@googlegroups.com` would be // `group-example@googlegroups.com` // * All members of the Google Apps for Business domain `example.com` would be // `domain-example.com` Entity string `protobuf:"bytes,6,opt,name=entity,proto3" json:"entity,omitempty"` // The ID for the entity, if any. EntityId string `protobuf:"bytes,7,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"` // The email address associated with the entity, if any. Email string `protobuf:"bytes,8,opt,name=email,proto3" json:"email,omitempty"` // The domain associated with the entity, if any. Domain string `protobuf:"bytes,9,opt,name=domain,proto3" json:"domain,omitempty"` // The project team associated with the entity, if any. ProjectTeam *ProjectTeam `protobuf:"bytes,10,opt,name=project_team,json=projectTeam,proto3" json:"project_team,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *BucketAccessControl) Reset() { *m = BucketAccessControl{} } func (m *BucketAccessControl) String() string { return proto.CompactTextString(m) } func (*BucketAccessControl) ProtoMessage() {} func (*BucketAccessControl) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{1} } func (m *BucketAccessControl) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BucketAccessControl.Unmarshal(m, b) } func (m *BucketAccessControl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_BucketAccessControl.Marshal(b, m, deterministic) } func (m *BucketAccessControl) XXX_Merge(src proto.Message) { xxx_messageInfo_BucketAccessControl.Merge(m, src) } func (m *BucketAccessControl) XXX_Size() int { return xxx_messageInfo_BucketAccessControl.Size(m) } func (m *BucketAccessControl) XXX_DiscardUnknown() { xxx_messageInfo_BucketAccessControl.DiscardUnknown(m) } var xxx_messageInfo_BucketAccessControl proto.InternalMessageInfo func (m *BucketAccessControl) GetRole() string { if m != nil { return m.Role } return "" } func (m *BucketAccessControl) GetEtag() string { if m != nil { return m.Etag } return "" } func (m *BucketAccessControl) GetId() string { if m != nil { return m.Id } return "" } func (m *BucketAccessControl) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *BucketAccessControl) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *BucketAccessControl) GetEntityId() string { if m != nil { return m.EntityId } return "" } func (m *BucketAccessControl) GetEmail() string { if m != nil { return m.Email } return "" } func (m *BucketAccessControl) GetDomain() string { if m != nil { return m.Domain } return "" } func (m *BucketAccessControl) GetProjectTeam() *ProjectTeam { if m != nil { return m.ProjectTeam } return nil } // The response to a call to BucketAccessControls.ListBucketAccessControls. type ListBucketAccessControlsResponse struct { // The list of items. Items []*BucketAccessControl `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListBucketAccessControlsResponse) Reset() { *m = ListBucketAccessControlsResponse{} } func (m *ListBucketAccessControlsResponse) String() string { return proto.CompactTextString(m) } func (*ListBucketAccessControlsResponse) ProtoMessage() {} func (*ListBucketAccessControlsResponse) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{2} } func (m *ListBucketAccessControlsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListBucketAccessControlsResponse.Unmarshal(m, b) } func (m *ListBucketAccessControlsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListBucketAccessControlsResponse.Marshal(b, m, deterministic) } func (m *ListBucketAccessControlsResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_ListBucketAccessControlsResponse.Merge(m, src) } func (m *ListBucketAccessControlsResponse) XXX_Size() int { return xxx_messageInfo_ListBucketAccessControlsResponse.Size(m) } func (m *ListBucketAccessControlsResponse) XXX_DiscardUnknown() { xxx_messageInfo_ListBucketAccessControlsResponse.DiscardUnknown(m) } var xxx_messageInfo_ListBucketAccessControlsResponse proto.InternalMessageInfo func (m *ListBucketAccessControlsResponse) GetItems() []*BucketAccessControl { if m != nil { return m.Items } return nil } // The result of a call to Buckets.ListBuckets type ListBucketsResponse struct { // The list of items. Items []*Bucket `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` // The continuation token, used to page through large result sets. Provide // this value in a subsequent request to return the next page of results. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListBucketsResponse) Reset() { *m = ListBucketsResponse{} } func (m *ListBucketsResponse) String() string { return proto.CompactTextString(m) } func (*ListBucketsResponse) ProtoMessage() {} func (*ListBucketsResponse) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{3} } func (m *ListBucketsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListBucketsResponse.Unmarshal(m, b) } func (m *ListBucketsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListBucketsResponse.Marshal(b, m, deterministic) } func (m *ListBucketsResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_ListBucketsResponse.Merge(m, src) } func (m *ListBucketsResponse) XXX_Size() int { return xxx_messageInfo_ListBucketsResponse.Size(m) } func (m *ListBucketsResponse) XXX_DiscardUnknown() { xxx_messageInfo_ListBucketsResponse.DiscardUnknown(m) } var xxx_messageInfo_ListBucketsResponse proto.InternalMessageInfo func (m *ListBucketsResponse) GetItems() []*Bucket { if m != nil { return m.Items } return nil } func (m *ListBucketsResponse) GetNextPageToken() string { if m != nil { return m.NextPageToken } return "" } // An notification channel used to watch for resource changes. type Channel struct { // A UUID or similar unique string that identifies this channel. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // An opaque ID that identifies the resource being watched on this channel. // Stable across different API versions. ResourceId string `protobuf:"bytes,2,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` // A version-specific identifier for the watched resource. ResourceUri string `protobuf:"bytes,3,opt,name=resource_uri,json=resourceUri,proto3" json:"resource_uri,omitempty"` // An arbitrary string delivered to the target address with each notification // delivered over this channel. Optional. Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` // Date and time of notification channel expiration. Optional. Expiration *timestamp.Timestamp `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` // The type of delivery mechanism used for this channel. Type string `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty"` // The address where notifications are delivered for this channel. Address string `protobuf:"bytes,7,opt,name=address,proto3" json:"address,omitempty"` // Additional parameters controlling delivery channel behavior. Optional. Params map[string]string `protobuf:"bytes,8,rep,name=params,proto3" json:"params,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // A Boolean value to indicate whether payload is wanted. Optional. Payload bool `protobuf:"varint,9,opt,name=payload,proto3" json:"payload,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Channel) Reset() { *m = Channel{} } func (m *Channel) String() string { return proto.CompactTextString(m) } func (*Channel) ProtoMessage() {} func (*Channel) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{4} } func (m *Channel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Channel.Unmarshal(m, b) } func (m *Channel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Channel.Marshal(b, m, deterministic) } func (m *Channel) XXX_Merge(src proto.Message) { xxx_messageInfo_Channel.Merge(m, src) } func (m *Channel) XXX_Size() int { return xxx_messageInfo_Channel.Size(m) } func (m *Channel) XXX_DiscardUnknown() { xxx_messageInfo_Channel.DiscardUnknown(m) } var xxx_messageInfo_Channel proto.InternalMessageInfo func (m *Channel) GetId() string { if m != nil { return m.Id } return "" } func (m *Channel) GetResourceId() string { if m != nil { return m.ResourceId } return "" } func (m *Channel) GetResourceUri() string { if m != nil { return m.ResourceUri } return "" } func (m *Channel) GetToken() string { if m != nil { return m.Token } return "" } func (m *Channel) GetExpiration() *timestamp.Timestamp { if m != nil { return m.Expiration } return nil } func (m *Channel) GetType() string { if m != nil { return m.Type } return "" } func (m *Channel) GetAddress() string { if m != nil { return m.Address } return "" } func (m *Channel) GetParams() map[string]string { if m != nil { return m.Params } return nil } func (m *Channel) GetPayload() bool { if m != nil { return m.Payload } return false } // Message used to convey content being read or written, along with its // checksum. type ChecksummedData struct { // The data. Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` // CRC32C digest of the contents. Crc32C *wrappers.UInt32Value `protobuf:"bytes,2,opt,name=crc32c,proto3" json:"crc32c,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ChecksummedData) Reset() { *m = ChecksummedData{} } func (m *ChecksummedData) String() string { return proto.CompactTextString(m) } func (*ChecksummedData) ProtoMessage() {} func (*ChecksummedData) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{5} } func (m *ChecksummedData) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChecksummedData.Unmarshal(m, b) } func (m *ChecksummedData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ChecksummedData.Marshal(b, m, deterministic) } func (m *ChecksummedData) XXX_Merge(src proto.Message) { xxx_messageInfo_ChecksummedData.Merge(m, src) } func (m *ChecksummedData) XXX_Size() int { return xxx_messageInfo_ChecksummedData.Size(m) } func (m *ChecksummedData) XXX_DiscardUnknown() { xxx_messageInfo_ChecksummedData.DiscardUnknown(m) } var xxx_messageInfo_ChecksummedData proto.InternalMessageInfo func (m *ChecksummedData) GetContent() []byte { if m != nil { return m.Content } return nil } func (m *ChecksummedData) GetCrc32C() *wrappers.UInt32Value { if m != nil { return m.Crc32C } return nil } // Message used for storing full (not subrange) object checksums. type ObjectChecksums struct { // CRC32C digest of the object data. Computed by the GCS service for // all written objects, and validated by the GCS service against // client-supplied values if present in an InsertObjectRequest. Crc32C *wrappers.UInt32Value `protobuf:"bytes,1,opt,name=crc32c,proto3" json:"crc32c,omitempty"` // Hex-encoded MD5 hash of the object data (hexdigest). Whether/how this // checksum is provided and validated is service-dependent. Md5Hash string `protobuf:"bytes,2,opt,name=md5_hash,json=md5Hash,proto3" json:"md5_hash,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ObjectChecksums) Reset() { *m = ObjectChecksums{} } func (m *ObjectChecksums) String() string { return proto.CompactTextString(m) } func (*ObjectChecksums) ProtoMessage() {} func (*ObjectChecksums) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{6} } func (m *ObjectChecksums) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectChecksums.Unmarshal(m, b) } func (m *ObjectChecksums) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ObjectChecksums.Marshal(b, m, deterministic) } func (m *ObjectChecksums) XXX_Merge(src proto.Message) { xxx_messageInfo_ObjectChecksums.Merge(m, src) } func (m *ObjectChecksums) XXX_Size() int { return xxx_messageInfo_ObjectChecksums.Size(m) } func (m *ObjectChecksums) XXX_DiscardUnknown() { xxx_messageInfo_ObjectChecksums.DiscardUnknown(m) } var xxx_messageInfo_ObjectChecksums proto.InternalMessageInfo func (m *ObjectChecksums) GetCrc32C() *wrappers.UInt32Value { if m != nil { return m.Crc32C } return nil } func (m *ObjectChecksums) GetMd5Hash() string { if m != nil { return m.Md5Hash } return "" } // A collection of enums used in multiple places throughout the API. type CommonEnums struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *CommonEnums) Reset() { *m = CommonEnums{} } func (m *CommonEnums) String() string { return proto.CompactTextString(m) } func (*CommonEnums) ProtoMessage() {} func (*CommonEnums) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{7} } func (m *CommonEnums) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CommonEnums.Unmarshal(m, b) } func (m *CommonEnums) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CommonEnums.Marshal(b, m, deterministic) } func (m *CommonEnums) XXX_Merge(src proto.Message) { xxx_messageInfo_CommonEnums.Merge(m, src) } func (m *CommonEnums) XXX_Size() int { return xxx_messageInfo_CommonEnums.Size(m) } func (m *CommonEnums) XXX_DiscardUnknown() { xxx_messageInfo_CommonEnums.DiscardUnknown(m) } var xxx_messageInfo_CommonEnums proto.InternalMessageInfo // Specifies a requested range of bytes to download. type ContentRange struct { // The starting offset of the object data. Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"` // The ending offset of the object data. End int64 `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"` // The complete length of the object data. CompleteLength int64 `protobuf:"varint,3,opt,name=complete_length,json=completeLength,proto3" json:"complete_length,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ContentRange) Reset() { *m = ContentRange{} } func (m *ContentRange) String() string { return proto.CompactTextString(m) } func (*ContentRange) ProtoMessage() {} func (*ContentRange) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{8} } func (m *ContentRange) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ContentRange.Unmarshal(m, b) } func (m *ContentRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ContentRange.Marshal(b, m, deterministic) } func (m *ContentRange) XXX_Merge(src proto.Message) { xxx_messageInfo_ContentRange.Merge(m, src) } func (m *ContentRange) XXX_Size() int { return xxx_messageInfo_ContentRange.Size(m) } func (m *ContentRange) XXX_DiscardUnknown() { xxx_messageInfo_ContentRange.DiscardUnknown(m) } var xxx_messageInfo_ContentRange proto.InternalMessageInfo func (m *ContentRange) GetStart() int64 { if m != nil { return m.Start } return 0 } func (m *ContentRange) GetEnd() int64 { if m != nil { return m.End } return 0 } func (m *ContentRange) GetCompleteLength() int64 { if m != nil { return m.CompleteLength } return 0 } // A subscription to receive Google PubSub notifications. type Notification struct { // The Cloud PubSub topic to which this subscription publishes. Formatted as: // '//pubsub.googleapis.com/projects/{project-identifier}/topics/{my-topic}' Topic string `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"` // If present, only send notifications about listed event types. If empty, // sent notifications for all event types. EventTypes []string `protobuf:"bytes,2,rep,name=event_types,json=eventTypes,proto3" json:"event_types,omitempty"` // An optional list of additional attributes to attach to each Cloud PubSub // message published for this notification subscription. CustomAttributes map[string]string `protobuf:"bytes,3,rep,name=custom_attributes,json=customAttributes,proto3" json:"custom_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // HTTP 1.1 [https://tools.ietf.org/html/rfc7232#section-2.3][Entity tag] // for this subscription notification. Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` // If present, only apply this notification configuration to object names that // begin with this prefix. ObjectNamePrefix string `protobuf:"bytes,5,opt,name=object_name_prefix,json=objectNamePrefix,proto3" json:"object_name_prefix,omitempty"` // The desired content of the Payload. PayloadFormat string `protobuf:"bytes,6,opt,name=payload_format,json=payloadFormat,proto3" json:"payload_format,omitempty"` // The ID of the notification. Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Notification) Reset() { *m = Notification{} } func (m *Notification) String() string { return proto.CompactTextString(m) } func (*Notification) ProtoMessage() {} func (*Notification) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{9} } func (m *Notification) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Notification.Unmarshal(m, b) } func (m *Notification) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Notification.Marshal(b, m, deterministic) } func (m *Notification) XXX_Merge(src proto.Message) { xxx_messageInfo_Notification.Merge(m, src) } func (m *Notification) XXX_Size() int { return xxx_messageInfo_Notification.Size(m) } func (m *Notification) XXX_DiscardUnknown() { xxx_messageInfo_Notification.DiscardUnknown(m) } var xxx_messageInfo_Notification proto.InternalMessageInfo func (m *Notification) GetTopic() string { if m != nil { return m.Topic } return "" } func (m *Notification) GetEventTypes() []string { if m != nil { return m.EventTypes } return nil } func (m *Notification) GetCustomAttributes() map[string]string { if m != nil { return m.CustomAttributes } return nil } func (m *Notification) GetEtag() string { if m != nil { return m.Etag } return "" } func (m *Notification) GetObjectNamePrefix() string { if m != nil { return m.ObjectNamePrefix } return "" } func (m *Notification) GetPayloadFormat() string { if m != nil { return m.PayloadFormat } return "" } func (m *Notification) GetId() string { if m != nil { return m.Id } return "" } // The result of a call to Notifications.ListNotifications type ListNotificationsResponse struct { // The list of items. Items []*Notification `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListNotificationsResponse) Reset() { *m = ListNotificationsResponse{} } func (m *ListNotificationsResponse) String() string { return proto.CompactTextString(m) } func (*ListNotificationsResponse) ProtoMessage() {} func (*ListNotificationsResponse) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{10} } func (m *ListNotificationsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListNotificationsResponse.Unmarshal(m, b) } func (m *ListNotificationsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListNotificationsResponse.Marshal(b, m, deterministic) } func (m *ListNotificationsResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_ListNotificationsResponse.Merge(m, src) } func (m *ListNotificationsResponse) XXX_Size() int { return xxx_messageInfo_ListNotificationsResponse.Size(m) } func (m *ListNotificationsResponse) XXX_DiscardUnknown() { xxx_messageInfo_ListNotificationsResponse.DiscardUnknown(m) } var xxx_messageInfo_ListNotificationsResponse proto.InternalMessageInfo func (m *ListNotificationsResponse) GetItems() []*Notification { if m != nil { return m.Items } return nil } // An object. type Object struct { // Content-Encoding of the object data, matching // [https://tools.ietf.org/html/rfc7231#section-3.1.2.2][RFC 7231 §3.1.2.2] ContentEncoding string `protobuf:"bytes,1,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` // Content-Disposition of the object data, matching // [https://tools.ietf.org/html/rfc6266][RFC 6266]. ContentDisposition string `protobuf:"bytes,2,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` // Cache-Control directive for the object data, matching // [https://tools.ietf.org/html/rfc7234#section-5.2"][RFC 7234 §5.2]. // If omitted, and the object is accessible to all anonymous users, the // default will be `public, max-age=3600`. CacheControl string `protobuf:"bytes,3,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` // Access controls on the object. Acl []*ObjectAccessControl `protobuf:"bytes,4,rep,name=acl,proto3" json:"acl,omitempty"` // Content-Language of the object data, matching // [https://tools.ietf.org/html/rfc7231#section-3.1.3.2][RFC 7231 §3.1.3.2]. ContentLanguage string `protobuf:"bytes,5,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` // The version of the metadata for this object at this generation. Used for // preconditions and for detecting changes in metadata. A metageneration // number is only meaningful in the context of a particular generation of a // particular object. // Attempting to set this field will result in an error. Metageneration int64 `protobuf:"varint,6,opt,name=metageneration,proto3" json:"metageneration,omitempty"` // The deletion time of the object. Will be returned if and only if this // version of the object has been deleted. // Attempting to set this field will result in an error. TimeDeleted *timestamp.Timestamp `protobuf:"bytes,7,opt,name=time_deleted,json=timeDeleted,proto3" json:"time_deleted,omitempty"` // Content-Type of the object data, matching // [https://tools.ietf.org/html/rfc7231#section-3.1.1.5][RFC 7231 §3.1.1.5]. // If an object is stored without a Content-Type, it is served as // `application/octet-stream`. ContentType string `protobuf:"bytes,8,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` // Content-Length of the object data in bytes, matching // [https://tools.ietf.org/html/rfc7230#section-3.3.2][RFC 7230 §3.3.2]. // Attempting to set this field will result in an error. Size int64 `protobuf:"varint,9,opt,name=size,proto3" json:"size,omitempty"` // The creation time of the object. // Attempting to set this field will result in an error. TimeCreated *timestamp.Timestamp `protobuf:"bytes,10,opt,name=time_created,json=timeCreated,proto3" json:"time_created,omitempty"` // CRC32c checksum. For more information about using the CRC32c // checksum, see // [https://cloud.google.com/storage/docs/hashes-etags#_JSONAPI][Hashes and // ETags: Best Practices]. This is a server determined value and should not be // supplied by the user when sending an Object. The server will ignore any // value provided. Users should instead use the object_checksums field on the // InsertObjectRequest when uploading an object. Crc32C *wrappers.UInt32Value `protobuf:"bytes,11,opt,name=crc32c,proto3" json:"crc32c,omitempty"` // Number of underlying components that make up this object. Components are // accumulated by compose operations. // Attempting to set this field will result in an error. ComponentCount int32 `protobuf:"varint,12,opt,name=component_count,json=componentCount,proto3" json:"component_count,omitempty"` // MD5 hash of the data; encoded using base64 as per // [https://tools.ietf.org/html/rfc4648#section-4][RFC 4648 §4]. For more // information about using the MD5 hash, see // [https://cloud.google.com/storage/docs/hashes-etags#_JSONAPI][Hashes and // ETags: Best Practices]. This is a server determined value and should not be // supplied by the user when sending an Object. The server will ignore any // value provided. Users should instead use the object_checksums field on the // InsertObjectRequest when uploading an object. Md5Hash string `protobuf:"bytes,13,opt,name=md5_hash,json=md5Hash,proto3" json:"md5_hash,omitempty"` // HTTP 1.1 Entity tag for the object. See // [https://tools.ietf.org/html/rfc7232#section-2.3][RFC 7232 §2.3]. // Attempting to set this field will result in an error. Etag string `protobuf:"bytes,14,opt,name=etag,proto3" json:"etag,omitempty"` // The modification time of the object metadata. // Attempting to set this field will result in an error. Updated *timestamp.Timestamp `protobuf:"bytes,15,opt,name=updated,proto3" json:"updated,omitempty"` // Storage class of the object. StorageClass string `protobuf:"bytes,16,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` // Cloud KMS Key used to encrypt this object, if the object is encrypted by // such a key. KmsKeyName string `protobuf:"bytes,17,opt,name=kms_key_name,json=kmsKeyName,proto3" json:"kms_key_name,omitempty"` // The time at which the object's storage class was last changed. When the // object is initially created, it will be set to time_created. // Attempting to set this field will result in an error. TimeStorageClassUpdated *timestamp.Timestamp `protobuf:"bytes,18,opt,name=time_storage_class_updated,json=timeStorageClassUpdated,proto3" json:"time_storage_class_updated,omitempty"` // Whether an object is under temporary hold. While this flag is set to true, // the object is protected against deletion and overwrites. A common use case // of this flag is regulatory investigations where objects need to be retained // while the investigation is ongoing. Note that unlike event-based hold, // temporary hold does not impact retention expiration time of an object. TemporaryHold bool `protobuf:"varint,19,opt,name=temporary_hold,json=temporaryHold,proto3" json:"temporary_hold,omitempty"` // A server-determined value that specifies the earliest time that the // object's retention period expires. This value is in // [https://tools.ietf.org/html/rfc3339][RFC 3339] format. // Note 1: This field is not provided for objects with an active event-based // hold, since retention expiration is unknown until the hold is removed. // Note 2: This value can be provided even when temporary hold is set (so that // the user can reason about policy without having to first unset the // temporary hold). RetentionExpirationTime *timestamp.Timestamp `protobuf:"bytes,20,opt,name=retention_expiration_time,json=retentionExpirationTime,proto3" json:"retention_expiration_time,omitempty"` // User-provided metadata, in key/value pairs. Metadata map[string]string `protobuf:"bytes,21,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Whether an object is under event-based hold. Event-based hold is a way to // retain objects until an event occurs, which is signified by the // hold's release (i.e. this value is set to false). After being released (set // to false), such objects will be subject to bucket-level retention (if any). // One sample use case of this flag is for banks to hold loan documents for at // least 3 years after loan is paid in full. Here, bucket-level retention is 3 // years and the event is the loan being paid in full. In this example, these // objects will be held intact for any number of years until the event has // occurred (event-based hold on the object is released) and then 3 more years // after that. That means retention duration of the objects begins from the // moment event-based hold transitioned from true to false. EventBasedHold *wrappers.BoolValue `protobuf:"bytes,29,opt,name=event_based_hold,json=eventBasedHold,proto3" json:"event_based_hold,omitempty"` // The name of the object. Required if not specified by URL parameter. // Attempting to update this field after the object is created will result in // an error. Name string `protobuf:"bytes,23,opt,name=name,proto3" json:"name,omitempty"` // The ID of the object, including the bucket name, object name, and // generation number. // Attempting to update this field after the object is created will result in // an error. Id string `protobuf:"bytes,24,opt,name=id,proto3" json:"id,omitempty"` // The name of the bucket containing this object. // Attempting to update this field after the object is created will result in // an error. Bucket string `protobuf:"bytes,25,opt,name=bucket,proto3" json:"bucket,omitempty"` // The content generation of this object. Used for object versioning. // Attempting to set this field will result in an error. Generation int64 `protobuf:"varint,26,opt,name=generation,proto3" json:"generation,omitempty"` // The owner of the object. This will always be the uploader of the object. // Attempting to set this field will result in an error. Owner *Owner `protobuf:"bytes,27,opt,name=owner,proto3" json:"owner,omitempty"` // Metadata of customer-supplied encryption key, if the object is encrypted by // such a key. CustomerEncryption *Object_CustomerEncryption `protobuf:"bytes,28,opt,name=customer_encryption,json=customerEncryption,proto3" json:"customer_encryption,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Object) Reset() { *m = Object{} } func (m *Object) String() string { return proto.CompactTextString(m) } func (*Object) ProtoMessage() {} func (*Object) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{11} } func (m *Object) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Object.Unmarshal(m, b) } func (m *Object) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Object.Marshal(b, m, deterministic) } func (m *Object) XXX_Merge(src proto.Message) { xxx_messageInfo_Object.Merge(m, src) } func (m *Object) XXX_Size() int { return xxx_messageInfo_Object.Size(m) } func (m *Object) XXX_DiscardUnknown() { xxx_messageInfo_Object.DiscardUnknown(m) } var xxx_messageInfo_Object proto.InternalMessageInfo func (m *Object) GetContentEncoding() string { if m != nil { return m.ContentEncoding } return "" } func (m *Object) GetContentDisposition() string { if m != nil { return m.ContentDisposition } return "" } func (m *Object) GetCacheControl() string { if m != nil { return m.CacheControl } return "" } func (m *Object) GetAcl() []*ObjectAccessControl { if m != nil { return m.Acl } return nil } func (m *Object) GetContentLanguage() string { if m != nil { return m.ContentLanguage } return "" } func (m *Object) GetMetageneration() int64 { if m != nil { return m.Metageneration } return 0 } func (m *Object) GetTimeDeleted() *timestamp.Timestamp { if m != nil { return m.TimeDeleted } return nil } func (m *Object) GetContentType() string { if m != nil { return m.ContentType } return "" } func (m *Object) GetSize() int64 { if m != nil { return m.Size } return 0 } func (m *Object) GetTimeCreated() *timestamp.Timestamp { if m != nil { return m.TimeCreated } return nil } func (m *Object) GetCrc32C() *wrappers.UInt32Value { if m != nil { return m.Crc32C } return nil } func (m *Object) GetComponentCount() int32 { if m != nil { return m.ComponentCount } return 0 } func (m *Object) GetMd5Hash() string { if m != nil { return m.Md5Hash } return "" } func (m *Object) GetEtag() string { if m != nil { return m.Etag } return "" } func (m *Object) GetUpdated() *timestamp.Timestamp { if m != nil { return m.Updated } return nil } func (m *Object) GetStorageClass() string { if m != nil { return m.StorageClass } return "" } func (m *Object) GetKmsKeyName() string { if m != nil { return m.KmsKeyName } return "" } func (m *Object) GetTimeStorageClassUpdated() *timestamp.Timestamp { if m != nil { return m.TimeStorageClassUpdated } return nil } func (m *Object) GetTemporaryHold() bool { if m != nil { return m.TemporaryHold } return false } func (m *Object) GetRetentionExpirationTime() *timestamp.Timestamp { if m != nil { return m.RetentionExpirationTime } return nil } func (m *Object) GetMetadata() map[string]string { if m != nil { return m.Metadata } return nil } func (m *Object) GetEventBasedHold() *wrappers.BoolValue { if m != nil { return m.EventBasedHold } return nil } func (m *Object) GetName() string { if m != nil { return m.Name } return "" } func (m *Object) GetId() string { if m != nil { return m.Id } return "" } func (m *Object) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *Object) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *Object) GetOwner() *Owner { if m != nil { return m.Owner } return nil } func (m *Object) GetCustomerEncryption() *Object_CustomerEncryption { if m != nil { return m.CustomerEncryption } return nil } // Describes the customer-specified mechanism used to store the data at rest. type Object_CustomerEncryption struct { // The encryption algorithm. EncryptionAlgorithm string `protobuf:"bytes,1,opt,name=encryption_algorithm,json=encryptionAlgorithm,proto3" json:"encryption_algorithm,omitempty"` // SHA256 hash value of the encryption key. KeySha256 string `protobuf:"bytes,2,opt,name=key_sha256,json=keySha256,proto3" json:"key_sha256,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Object_CustomerEncryption) Reset() { *m = Object_CustomerEncryption{} } func (m *Object_CustomerEncryption) String() string { return proto.CompactTextString(m) } func (*Object_CustomerEncryption) ProtoMessage() {} func (*Object_CustomerEncryption) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{11, 0} } func (m *Object_CustomerEncryption) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Object_CustomerEncryption.Unmarshal(m, b) } func (m *Object_CustomerEncryption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Object_CustomerEncryption.Marshal(b, m, deterministic) } func (m *Object_CustomerEncryption) XXX_Merge(src proto.Message) { xxx_messageInfo_Object_CustomerEncryption.Merge(m, src) } func (m *Object_CustomerEncryption) XXX_Size() int { return xxx_messageInfo_Object_CustomerEncryption.Size(m) } func (m *Object_CustomerEncryption) XXX_DiscardUnknown() { xxx_messageInfo_Object_CustomerEncryption.DiscardUnknown(m) } var xxx_messageInfo_Object_CustomerEncryption proto.InternalMessageInfo func (m *Object_CustomerEncryption) GetEncryptionAlgorithm() string { if m != nil { return m.EncryptionAlgorithm } return "" } func (m *Object_CustomerEncryption) GetKeySha256() string { if m != nil { return m.KeySha256 } return "" } // An access-control entry. type ObjectAccessControl struct { // The access permission for the entity. Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` // HTTP 1.1 Entity tag for the access-control entry. // See [https://tools.ietf.org/html/rfc7232#section-2.3][RFC 7232 §2.3]. Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` // The ID of the access-control entry. Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` // The name of the bucket. Bucket string `protobuf:"bytes,4,opt,name=bucket,proto3" json:"bucket,omitempty"` // The name of the object, if applied to an object. Object string `protobuf:"bytes,5,opt,name=object,proto3" json:"object,omitempty"` // The content generation of the object, if applied to an object. Generation int64 `protobuf:"varint,6,opt,name=generation,proto3" json:"generation,omitempty"` // The entity holding the permission, in one of the following forms: // * `user-{userid}` // * `user-{email}` // * `group-{groupid}` // * `group-{email}` // * `domain-{domain}` // * `project-{team-projectid}` // * `allUsers` // * `allAuthenticatedUsers` // Examples: // * The user `liz@example.com` would be `user-liz@example.com`. // * The group `example@googlegroups.com` would be // `group-example@googlegroups.com`. // * All members of the Google Apps for Business domain `example.com` would be // `domain-example.com`. Entity string `protobuf:"bytes,7,opt,name=entity,proto3" json:"entity,omitempty"` // The ID for the entity, if any. EntityId string `protobuf:"bytes,8,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"` // The email address associated with the entity, if any. Email string `protobuf:"bytes,9,opt,name=email,proto3" json:"email,omitempty"` // The domain associated with the entity, if any. Domain string `protobuf:"bytes,10,opt,name=domain,proto3" json:"domain,omitempty"` // The project team associated with the entity, if any. ProjectTeam *ProjectTeam `protobuf:"bytes,11,opt,name=project_team,json=projectTeam,proto3" json:"project_team,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ObjectAccessControl) Reset() { *m = ObjectAccessControl{} } func (m *ObjectAccessControl) String() string { return proto.CompactTextString(m) } func (*ObjectAccessControl) ProtoMessage() {} func (*ObjectAccessControl) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{12} } func (m *ObjectAccessControl) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ObjectAccessControl.Unmarshal(m, b) } func (m *ObjectAccessControl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ObjectAccessControl.Marshal(b, m, deterministic) } func (m *ObjectAccessControl) XXX_Merge(src proto.Message) { xxx_messageInfo_ObjectAccessControl.Merge(m, src) } func (m *ObjectAccessControl) XXX_Size() int { return xxx_messageInfo_ObjectAccessControl.Size(m) } func (m *ObjectAccessControl) XXX_DiscardUnknown() { xxx_messageInfo_ObjectAccessControl.DiscardUnknown(m) } var xxx_messageInfo_ObjectAccessControl proto.InternalMessageInfo func (m *ObjectAccessControl) GetRole() string { if m != nil { return m.Role } return "" } func (m *ObjectAccessControl) GetEtag() string { if m != nil { return m.Etag } return "" } func (m *ObjectAccessControl) GetId() string { if m != nil { return m.Id } return "" } func (m *ObjectAccessControl) GetBucket() string { if m != nil { return m.Bucket } return "" } func (m *ObjectAccessControl) GetObject() string { if m != nil { return m.Object } return "" } func (m *ObjectAccessControl) GetGeneration() int64 { if m != nil { return m.Generation } return 0 } func (m *ObjectAccessControl) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *ObjectAccessControl) GetEntityId() string { if m != nil { return m.EntityId } return "" } func (m *ObjectAccessControl) GetEmail() string { if m != nil { return m.Email } return "" } func (m *ObjectAccessControl) GetDomain() string { if m != nil { return m.Domain } return "" } func (m *ObjectAccessControl) GetProjectTeam() *ProjectTeam { if m != nil { return m.ProjectTeam } return nil } // The result of a call to ObjectAccessControls.ListObjectAccessControls. type ListObjectAccessControlsResponse struct { // The list of items. Items []*ObjectAccessControl `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListObjectAccessControlsResponse) Reset() { *m = ListObjectAccessControlsResponse{} } func (m *ListObjectAccessControlsResponse) String() string { return proto.CompactTextString(m) } func (*ListObjectAccessControlsResponse) ProtoMessage() {} func (*ListObjectAccessControlsResponse) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{13} } func (m *ListObjectAccessControlsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListObjectAccessControlsResponse.Unmarshal(m, b) } func (m *ListObjectAccessControlsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListObjectAccessControlsResponse.Marshal(b, m, deterministic) } func (m *ListObjectAccessControlsResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_ListObjectAccessControlsResponse.Merge(m, src) } func (m *ListObjectAccessControlsResponse) XXX_Size() int { return xxx_messageInfo_ListObjectAccessControlsResponse.Size(m) } func (m *ListObjectAccessControlsResponse) XXX_DiscardUnknown() { xxx_messageInfo_ListObjectAccessControlsResponse.DiscardUnknown(m) } var xxx_messageInfo_ListObjectAccessControlsResponse proto.InternalMessageInfo func (m *ListObjectAccessControlsResponse) GetItems() []*ObjectAccessControl { if m != nil { return m.Items } return nil } // The result of a call to Objects.ListObjects type ListObjectsResponse struct { // The list of prefixes of objects matching-but-not-listed up to and including // the requested delimiter. Prefixes []string `protobuf:"bytes,1,rep,name=prefixes,proto3" json:"prefixes,omitempty"` // The list of items. Items []*Object `protobuf:"bytes,2,rep,name=items,proto3" json:"items,omitempty"` // The continuation token, used to page through large result sets. Provide // this value in a subsequent request to return the next page of results. NextPageToken string `protobuf:"bytes,3,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ListObjectsResponse) Reset() { *m = ListObjectsResponse{} } func (m *ListObjectsResponse) String() string { return proto.CompactTextString(m) } func (*ListObjectsResponse) ProtoMessage() {} func (*ListObjectsResponse) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{14} } func (m *ListObjectsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListObjectsResponse.Unmarshal(m, b) } func (m *ListObjectsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListObjectsResponse.Marshal(b, m, deterministic) } func (m *ListObjectsResponse) XXX_Merge(src proto.Message) { xxx_messageInfo_ListObjectsResponse.Merge(m, src) } func (m *ListObjectsResponse) XXX_Size() int { return xxx_messageInfo_ListObjectsResponse.Size(m) } func (m *ListObjectsResponse) XXX_DiscardUnknown() { xxx_messageInfo_ListObjectsResponse.DiscardUnknown(m) } var xxx_messageInfo_ListObjectsResponse proto.InternalMessageInfo func (m *ListObjectsResponse) GetPrefixes() []string { if m != nil { return m.Prefixes } return nil } func (m *ListObjectsResponse) GetItems() []*Object { if m != nil { return m.Items } return nil } func (m *ListObjectsResponse) GetNextPageToken() string { if m != nil { return m.NextPageToken } return "" } // Represents the Viewers, Editors, or Owners of a given project. type ProjectTeam struct { // The project number. ProjectNumber string `protobuf:"bytes,1,opt,name=project_number,json=projectNumber,proto3" json:"project_number,omitempty"` // The team. Team string `protobuf:"bytes,2,opt,name=team,proto3" json:"team,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ProjectTeam) Reset() { *m = ProjectTeam{} } func (m *ProjectTeam) String() string { return proto.CompactTextString(m) } func (*ProjectTeam) ProtoMessage() {} func (*ProjectTeam) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{15} } func (m *ProjectTeam) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ProjectTeam.Unmarshal(m, b) } func (m *ProjectTeam) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ProjectTeam.Marshal(b, m, deterministic) } func (m *ProjectTeam) XXX_Merge(src proto.Message) { xxx_messageInfo_ProjectTeam.Merge(m, src) } func (m *ProjectTeam) XXX_Size() int { return xxx_messageInfo_ProjectTeam.Size(m) } func (m *ProjectTeam) XXX_DiscardUnknown() { xxx_messageInfo_ProjectTeam.DiscardUnknown(m) } var xxx_messageInfo_ProjectTeam proto.InternalMessageInfo func (m *ProjectTeam) GetProjectNumber() string { if m != nil { return m.ProjectNumber } return "" } func (m *ProjectTeam) GetTeam() string { if m != nil { return m.Team } return "" } // A subscription to receive Google PubSub notifications. type ServiceAccount struct { // The ID of the notification. EmailAddress string `protobuf:"bytes,1,opt,name=email_address,json=emailAddress,proto3" json:"email_address,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (m *ServiceAccount) String() string { return proto.CompactTextString(m) } func (*ServiceAccount) ProtoMessage() {} func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{16} } func (m *ServiceAccount) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ServiceAccount.Unmarshal(m, b) } func (m *ServiceAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ServiceAccount.Marshal(b, m, deterministic) } func (m *ServiceAccount) XXX_Merge(src proto.Message) { xxx_messageInfo_ServiceAccount.Merge(m, src) } func (m *ServiceAccount) XXX_Size() int { return xxx_messageInfo_ServiceAccount.Size(m) } func (m *ServiceAccount) XXX_DiscardUnknown() { xxx_messageInfo_ServiceAccount.DiscardUnknown(m) } var xxx_messageInfo_ServiceAccount proto.InternalMessageInfo func (m *ServiceAccount) GetEmailAddress() string { if m != nil { return m.EmailAddress } return "" } // The owner of a specific resource. type Owner struct { // The entity, in the form `user-`*userId*. Entity string `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` // The ID for the entity. EntityId string `protobuf:"bytes,2,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Owner) Reset() { *m = Owner{} } func (m *Owner) String() string { return proto.CompactTextString(m) } func (*Owner) ProtoMessage() {} func (*Owner) Descriptor() ([]byte, []int) { return fileDescriptor_303b257d2554d792, []int{17} } func (m *Owner) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Owner.Unmarshal(m, b) } func (m *Owner) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Owner.Marshal(b, m, deterministic) } func (m *Owner) XXX_Merge(src proto.Message) { xxx_messageInfo_Owner.Merge(m, src) } func (m *Owner) XXX_Size() int { return xxx_messageInfo_Owner.Size(m) } func (m *Owner) XXX_DiscardUnknown() { xxx_messageInfo_Owner.DiscardUnknown(m) } var xxx_messageInfo_Owner proto.InternalMessageInfo func (m *Owner) GetEntity() string { if m != nil { return m.Entity } return "" } func (m *Owner) GetEntityId() string { if m != nil { return m.EntityId } return "" } func init() { proto.RegisterEnum("google.storage.v1.CommonEnums_Projection", CommonEnums_Projection_name, CommonEnums_Projection_value) proto.RegisterEnum("google.storage.v1.CommonEnums_PredefinedBucketAcl", CommonEnums_PredefinedBucketAcl_name, CommonEnums_PredefinedBucketAcl_value) proto.RegisterEnum("google.storage.v1.CommonEnums_PredefinedObjectAcl", CommonEnums_PredefinedObjectAcl_name, CommonEnums_PredefinedObjectAcl_value) proto.RegisterType((*Bucket)(nil), "google.storage.v1.Bucket") proto.RegisterMapType((map[string]string)(nil), "google.storage.v1.Bucket.LabelsEntry") proto.RegisterType((*Bucket_Billing)(nil), "google.storage.v1.Bucket.Billing") proto.RegisterType((*Bucket_Cors)(nil), "google.storage.v1.Bucket.Cors") proto.RegisterType((*Bucket_Encryption)(nil), "google.storage.v1.Bucket.Encryption") proto.RegisterType((*Bucket_Lifecycle)(nil), "google.storage.v1.Bucket.Lifecycle") proto.RegisterType((*Bucket_Lifecycle_Rule)(nil), "google.storage.v1.Bucket.Lifecycle.Rule") proto.RegisterType((*Bucket_Lifecycle_Rule_Action)(nil), "google.storage.v1.Bucket.Lifecycle.Rule.Action") proto.RegisterType((*Bucket_Lifecycle_Rule_Condition)(nil), "google.storage.v1.Bucket.Lifecycle.Rule.Condition") proto.RegisterType((*Bucket_Logging)(nil), "google.storage.v1.Bucket.Logging") proto.RegisterType((*Bucket_RetentionPolicy)(nil), "google.storage.v1.Bucket.RetentionPolicy") proto.RegisterType((*Bucket_Versioning)(nil), "google.storage.v1.Bucket.Versioning") proto.RegisterType((*Bucket_Website)(nil), "google.storage.v1.Bucket.Website") proto.RegisterType((*BucketAccessControl)(nil), "google.storage.v1.BucketAccessControl") proto.RegisterType((*ListBucketAccessControlsResponse)(nil), "google.storage.v1.ListBucketAccessControlsResponse") proto.RegisterType((*ListBucketsResponse)(nil), "google.storage.v1.ListBucketsResponse") proto.RegisterType((*Channel)(nil), "google.storage.v1.Channel") proto.RegisterMapType((map[string]string)(nil), "google.storage.v1.Channel.ParamsEntry") proto.RegisterType((*ChecksummedData)(nil), "google.storage.v1.ChecksummedData") proto.RegisterType((*ObjectChecksums)(nil), "google.storage.v1.ObjectChecksums") proto.RegisterType((*CommonEnums)(nil), "google.storage.v1.CommonEnums") proto.RegisterType((*ContentRange)(nil), "google.storage.v1.ContentRange") proto.RegisterType((*Notification)(nil), "google.storage.v1.Notification") proto.RegisterMapType((map[string]string)(nil), "google.storage.v1.Notification.CustomAttributesEntry") proto.RegisterType((*ListNotificationsResponse)(nil), "google.storage.v1.ListNotificationsResponse") proto.RegisterType((*Object)(nil), "google.storage.v1.Object") proto.RegisterMapType((map[string]string)(nil), "google.storage.v1.Object.MetadataEntry") proto.RegisterType((*Object_CustomerEncryption)(nil), "google.storage.v1.Object.CustomerEncryption") proto.RegisterType((*ObjectAccessControl)(nil), "google.storage.v1.ObjectAccessControl") proto.RegisterType((*ListObjectAccessControlsResponse)(nil), "google.storage.v1.ListObjectAccessControlsResponse") proto.RegisterType((*ListObjectsResponse)(nil), "google.storage.v1.ListObjectsResponse") proto.RegisterType((*ProjectTeam)(nil), "google.storage.v1.ProjectTeam") proto.RegisterType((*ServiceAccount)(nil), "google.storage.v1.ServiceAccount") proto.RegisterType((*Owner)(nil), "google.storage.v1.Owner") } func init() { proto.RegisterFile("google/storage/v1/storage_resources.proto", fileDescriptor_303b257d2554d792) } var fileDescriptor_303b257d2554d792 = []byte{ // 2591 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x4d, 0x6f, 0xdb, 0xc8, 0xb5, 0xfa, 0x96, 0x9e, 0x6c, 0x59, 0x1e, 0x27, 0x59, 0x86, 0x9b, 0xcd, 0x3a, 0xda, 0x4d, 0xd6, 0x5b, 0x04, 0x72, 0xe3, 0xac, 0xdb, 0x74, 0x93, 0x2c, 0x20, 0xcb, 0x4a, 0xe3, 0x46, 0xb5, 0x05, 0x5a, 0x4e, 0xd0, 0x02, 0x05, 0x3b, 0x22, 0x47, 0x12, 0x6b, 0x92, 0xc3, 0x72, 0x28, 0x27, 0xea, 0x1f, 0x58, 0xa0, 0x3d, 0xf5, 0xde, 0x43, 0x6f, 0xfd, 0x21, 0x3d, 0xf5, 0x5c, 0xf4, 0x37, 0xf4, 0xde, 0x3f, 0xd0, 0x62, 0x3e, 0x48, 0x51, 0x96, 0x14, 0xdb, 0x05, 0x7a, 0xe3, 0xbc, 0x79, 0xef, 0xcd, 0x9b, 0x37, 0xef, 0x9b, 0xf0, 0xf5, 0x88, 0xd2, 0x91, 0x4b, 0x76, 0x59, 0x44, 0x43, 0x3c, 0x22, 0xbb, 0x17, 0x4f, 0xe2, 0x4f, 0x33, 0x24, 0x8c, 0x4e, 0x42, 0x8b, 0xb0, 0x66, 0x10, 0xd2, 0x88, 0xa2, 0x4d, 0x89, 0xda, 0x54, 0xfb, 0xcd, 0x8b, 0x27, 0xfa, 0xe7, 0x8a, 0x5a, 0x20, 0x0c, 0x26, 0xc3, 0xdd, 0xc8, 0xf1, 0x08, 0x8b, 0xb0, 0x17, 0x48, 0x1a, 0xfd, 0xfe, 0x65, 0x84, 0xf7, 0x21, 0x0e, 0x02, 0x12, 0x2a, 0x9e, 0x8d, 0x3f, 0x6d, 0x41, 0xf1, 0x60, 0x62, 0x9d, 0x93, 0x08, 0x3d, 0x83, 0x1c, 0xb6, 0x5c, 0x2d, 0xb3, 0x9d, 0xdb, 0xa9, 0xee, 0x3d, 0x6a, 0x2e, 0x1c, 0xd6, 0x94, 0x78, 0x2d, 0xcb, 0x22, 0x8c, 0xb5, 0xa9, 0x1f, 0x85, 0xd4, 0x35, 0x38, 0x09, 0xea, 0x03, 0xb2, 0xc9, 0x10, 0x4f, 0xdc, 0xc8, 0xa4, 0x83, 0xdf, 0x12, 0x2b, 0x32, 0x39, 0xa3, 0xec, 0x4a, 0x46, 0x27, 0x02, 0x69, 0x9e, 0x51, 0x5d, 0x71, 0x88, 0xf7, 0x5c, 0xd4, 0x82, 0x8a, 0xeb, 0x0c, 0x89, 0x35, 0xb5, 0x5c, 0xa2, 0xe5, 0xb6, 0x33, 0x3b, 0xd5, 0xbd, 0x2f, 0x56, 0x4a, 0xd5, 0xec, 0xc6, 0xa8, 0xc6, 0x8c, 0x0a, 0xbd, 0x84, 0x35, 0xae, 0x10, 0xd3, 0x0a, 0x09, 0x8e, 0x88, 0xad, 0xe5, 0x05, 0x17, 0x3d, 0xe6, 0x12, 0x2b, 0xa5, 0xd9, 0x8f, 0xb5, 0x66, 0x54, 0x39, 0x7e, 0x5b, 0xa2, 0xa3, 0x1a, 0x64, 0x1d, 0x5b, 0x2b, 0x6c, 0x67, 0x76, 0x2a, 0x46, 0xd6, 0xb1, 0x11, 0x82, 0xbc, 0x8f, 0x3d, 0xa2, 0x15, 0x05, 0x44, 0x7c, 0xa3, 0x87, 0x50, 0x0b, 0x42, 0x2a, 0x2e, 0xed, 0x4f, 0xbc, 0x01, 0x09, 0xb5, 0xd2, 0x76, 0x66, 0x27, 0x67, 0xac, 0x2b, 0xe8, 0xb1, 0x00, 0xa2, 0x47, 0x50, 0xf3, 0x48, 0x84, 0x47, 0xc4, 0x27, 0x21, 0x8e, 0x1c, 0xea, 0x6b, 0x65, 0x81, 0x76, 0x09, 0x8a, 0xf6, 0x20, 0x6f, 0xd1, 0x90, 0x69, 0x15, 0xa1, 0xbc, 0xfb, 0xab, 0xef, 0xdb, 0xa6, 0x21, 0x33, 0x04, 0x2e, 0xd2, 0xa1, 0xec, 0x52, 0x4b, 0x72, 0x05, 0x21, 0x5a, 0xb2, 0x46, 0x5f, 0xc0, 0x7a, 0x6c, 0x4e, 0x96, 0x8b, 0x19, 0xd3, 0xaa, 0x02, 0x61, 0x4d, 0x01, 0xdb, 0x1c, 0xc6, 0xef, 0xc5, 0xa5, 0xd0, 0xd6, 0xe4, 0xbd, 0xf8, 0x37, 0xfa, 0x06, 0x4a, 0x93, 0xc0, 0x16, 0x5a, 0x5b, 0xbf, 0x52, 0x6b, 0x31, 0x2a, 0xfa, 0x09, 0x68, 0xb1, 0x25, 0x90, 0x0b, 0xe2, 0x47, 0xe6, 0x00, 0x33, 0x62, 0x9b, 0x63, 0xea, 0xda, 0x5a, 0x6d, 0x3b, 0xb3, 0x53, 0x36, 0x6e, 0xab, 0xfd, 0x0e, 0xdf, 0x3e, 0xe0, 0xbb, 0xaf, 0xa9, 0x6b, 0xa3, 0x97, 0x50, 0x74, 0xf1, 0x80, 0xb8, 0x4c, 0xdb, 0x10, 0x37, 0x7f, 0xf8, 0x91, 0x97, 0x16, 0x78, 0x1d, 0x3f, 0x0a, 0xa7, 0x86, 0x22, 0x42, 0xcf, 0xa1, 0xf4, 0x9e, 0x0c, 0x98, 0x13, 0x11, 0xad, 0x2e, 0xa4, 0x7d, 0xb0, 0x9a, 0xfe, 0x9d, 0x44, 0x34, 0x62, 0x0a, 0x74, 0x08, 0x70, 0x41, 0x42, 0xe6, 0x50, 0xdf, 0xf1, 0x47, 0xda, 0xa6, 0xa0, 0xff, 0x72, 0x35, 0xfd, 0xdb, 0x04, 0xd7, 0x48, 0xd1, 0x71, 0x11, 0x5c, 0x3a, 0x1a, 0x71, 0x16, 0xe8, 0x2a, 0x11, 0xba, 0x12, 0xd1, 0x88, 0x29, 0x50, 0x13, 0x0a, 0xf4, 0xbd, 0x4f, 0x42, 0x6d, 0x4b, 0x90, 0x6a, 0xcb, 0x9c, 0x86, 0xef, 0x1b, 0x12, 0x8d, 0x8b, 0x4c, 0x7c, 0x2b, 0x9c, 0x06, 0xe2, 0xd1, 0x6f, 0x5d, 0x25, 0x72, 0x27, 0xc1, 0x35, 0x52, 0x74, 0x5c, 0xe4, 0x81, 0xe3, 0xba, 0x5c, 0xe4, 0xdb, 0x57, 0x89, 0x7c, 0x20, 0x11, 0x8d, 0x98, 0x02, 0xf5, 0xa1, 0x1e, 0x92, 0x88, 0xf8, 0x9c, 0x93, 0x19, 0x50, 0xd7, 0xb1, 0xa6, 0xda, 0x1d, 0xc1, 0xe5, 0xeb, 0xd5, 0x5c, 0x8c, 0x98, 0xa2, 0x27, 0x08, 0x8c, 0x8d, 0x70, 0x1e, 0xa0, 0xff, 0x08, 0x4a, 0xea, 0x24, 0xee, 0x59, 0x21, 0xf9, 0xdd, 0x84, 0xb0, 0x88, 0x84, 0x66, 0x80, 0xa7, 0x4c, 0xcb, 0x08, 0x0b, 0x5a, 0x4f, 0xa0, 0x3d, 0x3c, 0x65, 0xfa, 0xf7, 0x19, 0xc8, 0x73, 0x67, 0x40, 0x77, 0xa0, 0x48, 0x43, 0x67, 0xe4, 0xf8, 0x22, 0x84, 0x55, 0x0c, 0xb5, 0xe2, 0x70, 0x8f, 0x44, 0x63, 0x6a, 0x8b, 0x88, 0x54, 0x31, 0xd4, 0x0a, 0x7d, 0x05, 0x1b, 0x21, 0x61, 0x01, 0xf5, 0x19, 0x31, 0xc7, 0x04, 0xdb, 0x24, 0xd4, 0x72, 0x02, 0xa1, 0x16, 0x83, 0x5f, 0x0b, 0x28, 0x7a, 0x04, 0x1b, 0x1e, 0xfe, 0x60, 0x72, 0x1f, 0x62, 0xc4, 0xa2, 0xbe, 0xcd, 0x44, 0x20, 0x29, 0x18, 0xeb, 0x1e, 0xfe, 0xd0, 0x1a, 0x91, 0x53, 0x09, 0xd4, 0x5f, 0x02, 0xcc, 0x14, 0x8d, 0x76, 0xe1, 0x56, 0xec, 0x0a, 0xe7, 0x1e, 0x33, 0xcf, 0xc9, 0xd4, 0x14, 0xc1, 0x23, 0x23, 0x9c, 0x6c, 0x53, 0xed, 0xbd, 0xf1, 0xd8, 0x1b, 0x32, 0x3d, 0xc6, 0x1e, 0xd1, 0xff, 0x91, 0x87, 0x4a, 0x12, 0xc5, 0xd0, 0x0b, 0xc8, 0x87, 0x13, 0x97, 0xa8, 0x70, 0xbc, 0x73, 0x8d, 0xc0, 0xd7, 0x34, 0x26, 0x2e, 0x31, 0x04, 0x95, 0xfe, 0x7d, 0x1e, 0xf2, 0x7c, 0x89, 0x7e, 0x06, 0x45, 0x6c, 0x09, 0x23, 0xc9, 0x88, 0xb7, 0xd9, 0xbd, 0x2e, 0xa3, 0x66, 0x4b, 0x90, 0x19, 0x8a, 0x1c, 0xf5, 0xa0, 0xc2, 0x6f, 0xe9, 0x08, 0x5e, 0x59, 0xc1, 0x6b, 0xef, 0xda, 0xbc, 0xda, 0x31, 0xa5, 0x31, 0x63, 0xa2, 0xb7, 0xa0, 0x28, 0xcf, 0xe0, 0xf1, 0x27, 0x9a, 0x06, 0xb1, 0x6a, 0xc4, 0xf7, 0x62, 0xe0, 0xca, 0x2e, 0x06, 0x2e, 0xfd, 0x2f, 0x59, 0xa8, 0x24, 0xbc, 0x51, 0x1d, 0x72, 0x78, 0x24, 0xb9, 0x14, 0x0c, 0xfe, 0x89, 0x5a, 0x50, 0x53, 0xa1, 0xdf, 0x1c, 0x90, 0x21, 0x0d, 0x89, 0x92, 0xfc, 0x63, 0xb1, 0x6c, 0x5d, 0x51, 0x1c, 0x08, 0x02, 0xf4, 0x14, 0x4a, 0x0e, 0x33, 0x5d, 0xe7, 0x22, 0xce, 0x41, 0x8b, 0xb4, 0x07, 0x94, 0xba, 0x6f, 0xb1, 0x3b, 0x21, 0x46, 0xd1, 0x61, 0x5d, 0xe7, 0x82, 0xa0, 0xc7, 0x80, 0xfc, 0x89, 0x67, 0xfa, 0xe4, 0x3d, 0x09, 0x4d, 0x15, 0x23, 0x62, 0xa3, 0xa9, 0xfb, 0x13, 0xef, 0x98, 0x6f, 0xa8, 0x38, 0xc2, 0xd0, 0x1e, 0xdc, 0xf6, 0x70, 0x64, 0x8d, 0x09, 0x33, 0xe7, 0xaf, 0x5c, 0x10, 0xe6, 0xb8, 0xa5, 0x36, 0x4f, 0xd3, 0x21, 0xfb, 0x2b, 0x6e, 0x93, 0x92, 0x26, 0xc0, 0x51, 0x44, 0x42, 0x5f, 0x65, 0xa5, 0x9a, 0x02, 0xf7, 0x24, 0x54, 0xef, 0x43, 0x49, 0x45, 0x1b, 0xf4, 0x19, 0x80, 0x4b, 0x47, 0xe6, 0x40, 0x3c, 0x91, 0x52, 0x76, 0xc5, 0xa5, 0x23, 0x95, 0xff, 0x7f, 0x08, 0x9b, 0x7c, 0x5b, 0x65, 0xf0, 0x20, 0x24, 0x43, 0xe7, 0x83, 0xd2, 0xfa, 0x86, 0x4b, 0x47, 0x32, 0x31, 0xf7, 0x04, 0x58, 0xff, 0x73, 0x06, 0x36, 0x2e, 0xf9, 0x32, 0x57, 0x36, 0x19, 0x0e, 0x89, 0x15, 0x39, 0x17, 0xc4, 0xe4, 0x69, 0x54, 0x99, 0xdc, 0x47, 0x95, 0x9d, 0x50, 0x70, 0x18, 0xfa, 0x14, 0x2a, 0x5c, 0xd9, 0xd4, 0x3a, 0x27, 0xb6, 0x38, 0xba, 0x6c, 0x94, 0x1d, 0xd6, 0x15, 0x6b, 0xf4, 0xf5, 0x5c, 0xc0, 0x21, 0xa1, 0x43, 0x6d, 0xf1, 0x24, 0xb9, 0x74, 0x14, 0x11, 0x60, 0xfd, 0x11, 0xc0, 0x2c, 0x4a, 0x23, 0x0d, 0x4a, 0xc4, 0xc7, 0x03, 0x97, 0xd8, 0x2a, 0x82, 0xc4, 0x4b, 0xfd, 0x97, 0x50, 0x52, 0xd9, 0x00, 0xed, 0x40, 0xdd, 0xc3, 0x8e, 0x6f, 0x06, 0xc2, 0xcd, 0x27, 0x43, 0x7e, 0xf9, 0x4c, 0xac, 0x51, 0xc7, 0xef, 0xe1, 0x11, 0x39, 0x15, 0x50, 0xf4, 0x25, 0xd4, 0x7c, 0x1a, 0x99, 0x43, 0x3a, 0xf1, 0x6d, 0x81, 0x1e, 0x9b, 0xa6, 0x4f, 0xa3, 0x57, 0x1c, 0xc8, 0x71, 0xf5, 0x9f, 0x42, 0x35, 0x95, 0xa8, 0xb8, 0x6d, 0x9e, 0x93, 0xa9, 0xe2, 0xc8, 0x3f, 0xd1, 0x2d, 0x28, 0x5c, 0x70, 0xa3, 0x51, 0xd4, 0x72, 0xf1, 0x6d, 0xf6, 0x59, 0xa6, 0xf1, 0xc7, 0x2c, 0x6c, 0x2d, 0xa9, 0xb5, 0xb8, 0x9b, 0x84, 0xd4, 0x4d, 0xdc, 0x84, 0x7f, 0x27, 0xa9, 0x3b, 0x9b, 0x4a, 0xdd, 0xb2, 0x6c, 0xc9, 0x25, 0x65, 0xcb, 0x1d, 0x28, 0xaa, 0x37, 0xcf, 0x0b, 0x98, 0x5a, 0x71, 0x38, 0xd7, 0x5a, 0x34, 0x55, 0xa6, 0xa3, 0x56, 0xfc, 0x15, 0xe4, 0x97, 0xe9, 0xd8, 0xa2, 0x9a, 0xa9, 0x18, 0x65, 0x09, 0x38, 0xb2, 0xb9, 0xd8, 0xc4, 0xc3, 0x8e, 0x2b, 0xea, 0x97, 0x8a, 0x21, 0x17, 0x9c, 0x95, 0x4d, 0xb9, 0x9e, 0xb4, 0x8a, 0x64, 0x25, 0x57, 0xa8, 0x05, 0x6b, 0x71, 0x75, 0x14, 0x11, 0xec, 0x89, 0xf2, 0x64, 0x79, 0x59, 0xd3, 0x93, 0x68, 0x7d, 0x82, 0x3d, 0xa3, 0x1a, 0xcc, 0x16, 0x8d, 0xdf, 0xc0, 0x76, 0xd7, 0x61, 0xd1, 0x12, 0x85, 0x30, 0x43, 0xc5, 0x69, 0xf4, 0x02, 0x0a, 0x4e, 0x44, 0x3c, 0x76, 0xc3, 0xe2, 0x55, 0x12, 0x35, 0x7c, 0xd8, 0x9a, 0x9d, 0x30, 0x63, 0xba, 0x3b, 0xcf, 0xf4, 0xee, 0x4a, 0xa6, 0x8a, 0x0f, 0xcf, 0x13, 0x3e, 0xf9, 0x10, 0x49, 0x13, 0x8a, 0xe8, 0x39, 0xf1, 0xd5, 0xb3, 0xac, 0x73, 0x30, 0xb7, 0x8a, 0x3e, 0x07, 0x36, 0xfe, 0x9d, 0x85, 0x52, 0x7b, 0x8c, 0x7d, 0x9f, 0xb8, 0xea, 0xad, 0x32, 0xc9, 0x5b, 0x7d, 0x0e, 0xd5, 0xb8, 0xec, 0xe7, 0xda, 0x97, 0xf4, 0x10, 0x83, 0x8e, 0x6c, 0xf4, 0x00, 0xd6, 0x12, 0x84, 0x49, 0xe8, 0xa8, 0x67, 0x4e, 0x88, 0xce, 0x42, 0x87, 0x3f, 0x91, 0x3c, 0x5d, 0x3e, 0xb7, 0x5c, 0xa0, 0x6f, 0x01, 0xc8, 0x87, 0xc0, 0x51, 0xd5, 0x67, 0xe1, 0x4a, 0xd7, 0x4c, 0x61, 0x27, 0x01, 0xba, 0x98, 0x0a, 0xd0, 0x1a, 0x94, 0xb0, 0x6d, 0x87, 0x84, 0x31, 0x65, 0x23, 0xf1, 0x12, 0x7d, 0x07, 0xc5, 0x00, 0x87, 0xd8, 0x63, 0x5a, 0x79, 0xe5, 0x73, 0xa8, 0xfb, 0x37, 0x7b, 0x02, 0x51, 0x15, 0x73, 0x92, 0x8a, 0x73, 0x0e, 0xf0, 0xd4, 0xa5, 0xd8, 0x16, 0xd6, 0x54, 0x36, 0xe2, 0x25, 0x77, 0xaa, 0x14, 0xc1, 0x8d, 0x9c, 0x0a, 0xc3, 0x46, 0x7b, 0x4c, 0xac, 0x73, 0x36, 0xf1, 0x3c, 0x62, 0x1f, 0xe2, 0x08, 0xf3, 0x73, 0x2c, 0xea, 0xf3, 0xc8, 0x21, 0x58, 0xac, 0x19, 0xf1, 0x12, 0x7d, 0x03, 0x45, 0x2b, 0xb4, 0x9e, 0xee, 0x59, 0x2a, 0x5f, 0xdc, 0x5b, 0xd0, 0xd3, 0xd9, 0x91, 0x1f, 0x3d, 0xdd, 0x53, 0x51, 0x5f, 0xe2, 0x36, 0x06, 0xb0, 0x21, 0x83, 0x64, 0x7c, 0x10, 0x4b, 0x31, 0xca, 0x5c, 0x9f, 0x11, 0xba, 0x0b, 0x65, 0xcf, 0xde, 0x37, 0xc7, 0x98, 0x8d, 0xd5, 0x45, 0x4a, 0x9e, 0xbd, 0xff, 0x1a, 0xb3, 0x71, 0xe3, 0xaf, 0x79, 0xa8, 0xb6, 0xa9, 0xe7, 0x51, 0xbf, 0xe3, 0x4f, 0x3c, 0xd6, 0xf8, 0x0e, 0x40, 0x79, 0x0e, 0x7f, 0x27, 0x1d, 0xee, 0xf4, 0x8c, 0x93, 0x9f, 0x77, 0xda, 0xfd, 0xa3, 0x93, 0x63, 0xf3, 0xec, 0xf8, 0xb4, 0xd7, 0x69, 0x1f, 0xbd, 0x3a, 0xea, 0x1c, 0xd6, 0x7f, 0x80, 0x00, 0x8a, 0xc7, 0x27, 0x66, 0xab, 0xdd, 0xad, 0x67, 0x50, 0x19, 0xf2, 0xaf, 0xce, 0xba, 0xdd, 0x7a, 0xb6, 0xf1, 0xcf, 0x0c, 0x6c, 0xf5, 0x42, 0x62, 0x93, 0xa1, 0xe3, 0x13, 0x3b, 0x76, 0x12, 0x17, 0x3d, 0x84, 0x07, 0x3d, 0xa3, 0x73, 0xd8, 0x79, 0x75, 0x74, 0xdc, 0x39, 0x34, 0x0f, 0xce, 0xda, 0x6f, 0x3a, 0x7d, 0x4e, 0x7c, 0x89, 0xe9, 0x03, 0xf8, 0x2c, 0xb5, 0xd7, 0x3a, 0xeb, 0xbf, 0xee, 0x1c, 0xf7, 0x8f, 0xda, 0xad, 0x7e, 0xe7, 0xd0, 0x34, 0x3a, 0xad, 0xc3, 0x7a, 0x06, 0xdd, 0x01, 0x94, 0x42, 0xe9, 0x19, 0x47, 0x6f, 0x5b, 0xfd, 0x4e, 0x3d, 0x8b, 0xee, 0x83, 0x3e, 0x07, 0x17, 0x62, 0x27, 0xfb, 0x39, 0x7e, 0x97, 0xf4, 0xfe, 0xd9, 0x41, 0xf7, 0xa8, 0x2d, 0x79, 0xe6, 0xd1, 0x36, 0xdc, 0x5b, 0xbe, 0x67, 0xbe, 0x33, 0x8e, 0xfa, 0x9d, 0x7a, 0xa1, 0xf1, 0x9f, 0xb9, 0x7b, 0xcd, 0x9a, 0xca, 0xf9, 0x7b, 0x9d, 0x1c, 0x88, 0x43, 0x97, 0xde, 0x2b, 0xb5, 0xb7, 0xf4, 0x5e, 0x3b, 0xf0, 0x65, 0x0a, 0x45, 0x89, 0x73, 0xf2, 0xee, 0xb8, 0x63, 0x98, 0x5c, 0xb7, 0x66, 0xfb, 0xe4, 0xb8, 0x6f, 0x9c, 0x74, 0xeb, 0x59, 0x2e, 0xed, 0x2a, 0x4c, 0xc1, 0x2b, 0xc7, 0x75, 0x94, 0xc2, 0x88, 0x75, 0x90, 0xe7, 0x3a, 0x9a, 0x83, 0xcf, 0xeb, 0xa8, 0xc0, 0x75, 0x94, 0xde, 0x4f, 0xe9, 0xa8, 0xd8, 0x30, 0x61, 0xad, 0x2d, 0xcd, 0xd9, 0xc0, 0xfe, 0x88, 0x70, 0xd7, 0x60, 0x11, 0x0e, 0xa5, 0xad, 0xe7, 0x0c, 0xb9, 0xe0, 0x2e, 0x44, 0x7c, 0x19, 0x67, 0x72, 0x06, 0xff, 0xe4, 0x95, 0x85, 0x45, 0xbd, 0xc0, 0x25, 0x11, 0x31, 0x5d, 0xe2, 0x8f, 0xa2, 0xb1, 0xca, 0xb2, 0xb5, 0x18, 0xdc, 0x15, 0xd0, 0xc6, 0xbf, 0xb2, 0xb0, 0x76, 0x4c, 0x23, 0x67, 0xe8, 0xa8, 0x5e, 0x53, 0xc4, 0x9d, 0xc0, 0xb1, 0x94, 0x43, 0xca, 0x05, 0x8f, 0x68, 0xb2, 0x15, 0xe4, 0x51, 0x83, 0xa9, 0x1a, 0x1c, 0x04, 0xa8, 0xcf, 0x21, 0x68, 0x00, 0x9b, 0xd6, 0x84, 0x45, 0xd4, 0x33, 0x71, 0x14, 0x85, 0xce, 0x60, 0x12, 0x11, 0x26, 0x2a, 0xf1, 0xea, 0xde, 0xfe, 0x92, 0xc8, 0x91, 0x3e, 0xb2, 0xd9, 0x16, 0x84, 0xad, 0x84, 0x4e, 0x06, 0x92, 0xba, 0x75, 0x09, 0x9c, 0xa4, 0xc9, 0x7c, 0x2a, 0x4d, 0x3e, 0x06, 0xa4, 0x6a, 0x1d, 0x5e, 0x97, 0xc7, 0x05, 0x8f, 0xec, 0xf6, 0xeb, 0x72, 0x87, 0xd7, 0xe5, 0xb2, 0xe2, 0x11, 0x7d, 0xbe, 0x8c, 0x42, 0xe6, 0x90, 0x86, 0x1e, 0x8e, 0x54, 0x30, 0x5c, 0x57, 0xd0, 0x57, 0x02, 0xa8, 0xe2, 0x79, 0x29, 0x8e, 0xe7, 0x7a, 0x1b, 0x6e, 0x2f, 0x95, 0xf1, 0x46, 0xb1, 0xcb, 0x80, 0xbb, 0x3c, 0x41, 0xa5, 0x6f, 0x3e, 0x4b, 0x53, 0xfb, 0xf3, 0x69, 0xea, 0xf3, 0x2b, 0x54, 0x16, 0x27, 0xbd, 0xbf, 0x57, 0xa1, 0x28, 0xdd, 0x82, 0x17, 0x56, 0x2a, 0xf0, 0x99, 0xc4, 0xb7, 0xa8, 0xcd, 0xfb, 0x41, 0x29, 0xd7, 0x86, 0x82, 0x77, 0x14, 0x18, 0xed, 0xc2, 0x56, 0x8c, 0x6a, 0x3b, 0x2c, 0xa0, 0x6c, 0xd6, 0x0f, 0x54, 0x0c, 0xa4, 0xb6, 0x0e, 0x67, 0x3b, 0xbc, 0x8c, 0xb7, 0xb0, 0x35, 0x26, 0xa6, 0x25, 0x73, 0xae, 0xca, 0x57, 0x6b, 0x02, 0x18, 0x17, 0x36, 0x6a, 0xf2, 0x94, 0xbf, 0xd1, 0xc0, 0x48, 0x4c, 0x9e, 0x52, 0xa2, 0xbb, 0xd8, 0x1f, 0x4d, 0x78, 0x35, 0x56, 0x98, 0x13, 0xbd, 0xab, 0xc0, 0x4b, 0x26, 0x30, 0xc5, 0xa5, 0x13, 0x98, 0x78, 0x66, 0x64, 0x13, 0x6e, 0xeb, 0xf2, 0x2d, 0xaf, 0x31, 0x33, 0x3a, 0x94, 0xe8, 0x3c, 0x3f, 0xc7, 0x12, 0x89, 0x94, 0x29, 0xcb, 0xa4, 0xaa, 0x82, 0x71, 0x8b, 0xe7, 0xc6, 0xc8, 0x9c, 0xdf, 0x13, 0x91, 0xdc, 0x72, 0x86, 0xf8, 0x5e, 0x98, 0x54, 0xc1, 0xcd, 0x26, 0x55, 0xb3, 0x3c, 0x53, 0xbd, 0x41, 0x9e, 0x51, 0xae, 0x4e, 0x7d, 0x2e, 0xad, 0x45, 0x27, 0x7e, 0x24, 0x46, 0x40, 0x05, 0xe9, 0xea, 0x02, 0xdc, 0xe6, 0xd0, 0xb9, 0x84, 0xb4, 0x3e, 0x97, 0x90, 0x12, 0xcf, 0xaa, 0x2d, 0x9f, 0x1d, 0x6d, 0x5c, 0x7f, 0x76, 0xb4, 0xd0, 0xf1, 0xd5, 0x97, 0x8c, 0xaa, 0xb6, 0x61, 0x6d, 0xae, 0x9b, 0xde, 0x94, 0x05, 0xd2, 0x79, 0xd2, 0x46, 0xa3, 0x77, 0xa0, 0x0b, 0x4d, 0xce, 0xf1, 0x32, 0x63, 0x79, 0xd0, 0x95, 0xf2, 0x7c, 0xc2, 0xa9, 0xd3, 0xbd, 0xd6, 0x99, 0x92, 0xef, 0x21, 0xd4, 0x22, 0xe2, 0x05, 0x34, 0xc4, 0xe1, 0x54, 0x4e, 0xb4, 0xb6, 0xe4, 0x3c, 0x22, 0x81, 0x8a, 0x49, 0xd6, 0x5b, 0xb8, 0x3b, 0x6b, 0x53, 0x66, 0x35, 0x94, 0xec, 0x88, 0x6e, 0x5d, 0x7d, 0x7c, 0x42, 0xdc, 0x49, 0x68, 0x45, 0x6f, 0xd4, 0x86, 0x32, 0xb7, 0x54, 0x1b, 0x47, 0x58, 0xbb, 0x2d, 0x3c, 0xe5, 0xab, 0x95, 0x9e, 0xd2, 0xfc, 0x85, 0xc2, 0x94, 0xf1, 0x30, 0x21, 0x44, 0x87, 0x50, 0x5f, 0x98, 0xcb, 0x7d, 0x76, 0x65, 0x5b, 0x5b, 0x23, 0xf3, 0xc3, 0xba, 0x78, 0x0e, 0xfa, 0x49, 0x6a, 0x0e, 0x2a, 0x03, 0x9f, 0xb6, 0xa4, 0xe9, 0xb8, 0x3b, 0xd7, 0x74, 0xdc, 0x07, 0x48, 0xb9, 0xa0, 0x2e, 0x5c, 0x20, 0x05, 0x99, 0x4d, 0xc2, 0x3e, 0xbd, 0xde, 0x24, 0xec, 0xd7, 0xb0, 0x25, 0xa3, 0x3d, 0x09, 0xcd, 0xd4, 0x48, 0xec, 0x9e, 0xa0, 0x7e, 0xbc, 0x5a, 0x43, 0x6d, 0x45, 0x94, 0x1a, 0x8d, 0x21, 0x6b, 0x01, 0xa6, 0x0f, 0x01, 0x2d, 0x62, 0xa2, 0x27, 0x70, 0x6b, 0x76, 0x96, 0x89, 0xdd, 0x11, 0x0d, 0x9d, 0x68, 0xec, 0xa9, 0xa8, 0xb9, 0x35, 0xdb, 0x6b, 0xc5, 0x5b, 0xbc, 0xf9, 0xe6, 0x46, 0xcb, 0xc6, 0x78, 0x6f, 0xff, 0xc7, 0x2a, 0x60, 0x56, 0xce, 0xc9, 0xf4, 0x54, 0x00, 0xf4, 0xe7, 0xb0, 0x3e, 0xf7, 0x66, 0x37, 0xca, 0x0f, 0x7f, 0xcb, 0xc2, 0xd6, 0x92, 0x10, 0xf9, 0xff, 0x68, 0x18, 0x65, 0x5e, 0x54, 0x31, 0x56, 0xad, 0x2e, 0xbd, 0x69, 0x71, 0xe1, 0x4d, 0x67, 0x8d, 0x66, 0x69, 0x75, 0xa3, 0x59, 0x5e, 0xd5, 0x68, 0x56, 0x96, 0x37, 0x9a, 0xf0, 0xd1, 0x46, 0xb3, 0xfa, 0x3f, 0x37, 0x9a, 0x4b, 0x14, 0x79, 0xa3, 0x46, 0x73, 0x59, 0xae, 0x52, 0x39, 0xf7, 0x0f, 0x19, 0xd9, 0x69, 0x4a, 0x94, 0x19, 0x57, 0x1d, 0xca, 0xb2, 0xfa, 0x20, 0x4c, 0xcd, 0x2e, 0x93, 0xf5, 0xac, 0x0b, 0xcd, 0xae, 0xec, 0x42, 0x25, 0xbb, 0x8f, 0x74, 0xa1, 0xb9, 0x65, 0x5d, 0xe8, 0x6b, 0xa8, 0xa6, 0x54, 0xb1, 0xe4, 0x3f, 0x46, 0x46, 0xd5, 0x37, 0x73, 0xff, 0x31, 0x78, 0x27, 0xc8, 0xf5, 0xab, 0xcc, 0x87, 0x7f, 0x37, 0xf6, 0xa1, 0x76, 0x4a, 0xc2, 0x0b, 0xc7, 0x22, 0x2d, 0x4b, 0x64, 0x11, 0x1e, 0xca, 0xc5, 0x73, 0x99, 0x71, 0x87, 0x28, 0x79, 0xad, 0x09, 0x60, 0x4b, 0xc2, 0x1a, 0x2f, 0xa0, 0x20, 0x3c, 0x39, 0x65, 0x1e, 0x99, 0xd5, 0xe6, 0x91, 0x9d, 0x37, 0x8f, 0x83, 0x0b, 0xb8, 0x67, 0x51, 0x2f, 0xd6, 0xc6, 0x82, 0x52, 0x0e, 0xf4, 0xb6, 0x4b, 0x27, 0xb6, 0x8a, 0xe3, 0x46, 0xfc, 0x27, 0xad, 0xc7, 0x83, 0x5b, 0x2f, 0xf3, 0xab, 0x67, 0x09, 0x1d, 0x2f, 0x1b, 0x9a, 0x34, 0x1c, 0xed, 0x8e, 0x88, 0x2f, 0x42, 0xdf, 0xae, 0xdc, 0xc2, 0x81, 0xc3, 0x52, 0x3f, 0xe5, 0x9e, 0xab, 0xcf, 0x41, 0x51, 0x20, 0x3d, 0xfd, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x43, 0x62, 0xd1, 0xd7, 0xb8, 0x1b, 0x00, 0x00, } grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/gcs/main.go000066400000000000000000000216241457366620600217750ustar00rootroot00000000000000package main import ( "context" "flag" "fmt" "hash/crc32" "io" "io/ioutil" "os" "sort" "strings" "time" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "cloud.google.com/go/storage" gcspb "github.com/GoogleCloudPlatform/grpc-gcp-go/e2e-examples/gcs/google.golang.org/genproto/googleapis/storage/v1" wrappers "github.com/golang/protobuf/ptypes/wrappers" _ "google.golang.org/grpc/balancer/grpclb" grpcgoogle "google.golang.org/grpc/credentials/google" "google.golang.org/grpc/credentials/oauth" ) const ( target = "storage.googleapis.com:443" scope = "https://www.googleapis.com/auth/cloud-platform" ) var ( dp = flag.Bool("dp", false, "whether use directpath") corp = flag.Bool("corp", false, "whether calling from corp machine") useHttp = flag.Bool("http", false, "whether to use http client") objectName = flag.String("obj", "a", "gcs object name") bucketName = flag.String("bkt", "gcs-grpc-team-weiranf", "gcs bucket name") numCalls = flag.Int("calls", 1, "num of calls") uploadSize = flag.Int("upload", 0, "upload size in kb") cookie = flag.String("cookie", "", "cookie header") method = flag.String("method", "media", "method names") size = flag.Int("size", 0, "write size in kb") ) func upload(client *storage.Client, kb int) { ctx := context.Background() obj := client.Bucket(*bucketName).Object(*objectName) w := obj.NewWriter(ctx) msg := strings.Repeat("x", kb*1024) if _, err := fmt.Fprint(w, msg); err != nil { fmt.Println("Failed to write message to object: %v", err) } if err := w.Close(); err != nil { fmt.Println("object writer failed closing: %v", err) os.Exit(1) } } func getGrpcClient() gcspb.StorageClient { var grpcOpts []grpc.DialOption endpoint := target if *dp { endpoint = "dns:///" + target grpcOpts = []grpc.DialOption{ grpc.WithCredentialsBundle( grpcgoogle.NewComputeEngineCredentials(), ), grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig(`{"loadBalancingConfig":[{"grpclb":{"childPolicy":[{"pick_first":{}}]}}]}`), } } else if *corp { // client is calling from corp machine keyFile := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") perRPC, err := oauth.NewServiceAccountFromFile(keyFile, scope) if err != nil { fmt.Println("Failed to create credentials: %v", err) os.Exit(1) } grpcOpts = []grpc.DialOption{ grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(perRPC), } } else { // client is calling from GCE grpcOpts = []grpc.DialOption{ grpc.WithCredentialsBundle( grpcgoogle.NewComputeEngineCredentials(), ), } } cc, err := grpc.Dial(endpoint, grpcOpts...) if err != nil { fmt.Println("Failed to create clientconn: %v", err) os.Exit(1) } return gcspb.NewStorageClient(cc) } func getHttpClient() *storage.Client { ctx := context.Background() httpClient, err := storage.NewClient(ctx) if err != nil { fmt.Println("Failed to create http client: %v", err) os.Exit(1) } return httpClient } func makeGrpcRequest(client gcspb.StorageClient) []int { fmt.Println("========================== start grpc calls ===============================") res := []int{} switch *method { case "media": req := gcspb.GetObjectMediaRequest{ Bucket: *bucketName, Object: *objectName, } for i := 0; i < *numCalls; i++ { ctx := context.Background() if i == *numCalls-1 { md := metadata.Pairs("cookie", *cookie) ctx = metadata.NewOutgoingContext(ctx, md) } start := time.Now() stream, err := client.GetObjectMedia(ctx, &req) if err != nil { fmt.Println("GetObjectMedia got error: ", err) os.Exit(1) } for { _, err := stream.Recv() if err == io.EOF { break } if err != nil { fmt.Println("stream.Recv() got error: ", err) os.Exit(1) } //fmt.Printf("rsp: %+v\n", rsp) } total := time.Since(start).Milliseconds() res = append(res, int(total)) fmt.Println("total time in ms for GetObjectMedia: ", total) } case "metadata": req := gcspb.GetObjectRequest{ Bucket: *bucketName, Object: *objectName, } for i := 0; i < *numCalls; i++ { ctx := context.Background() start := time.Now() _, err := client.GetObject(ctx, &req) if err != nil { fmt.Println("GetObject got error: ", err) os.Exit(1) } //fmt.Printf("-----> GetObject result: %+v\n", obj) total := time.Since(start).Milliseconds() res = append(res, int(total)) fmt.Println("total time in ms for GetObjectMedia: ", total) } case "write": totalBytes := *size * 1024 for i := 0; i < *numCalls; i++ { ctx := context.Background() start := time.Now() stream, err := client.InsertObject(ctx) if err != nil { fmt.Println("InsertObject got error: ", err) os.Exit(1) } offset := 0 isFirst := true isLast := false for offset < totalBytes { //fmt.Printf("-----> offset: %v\n", offset) var add int if offset+int(gcspb.ServiceConstants_MAX_WRITE_CHUNK_BYTES) <= totalBytes { add = int(gcspb.ServiceConstants_MAX_WRITE_CHUNK_BYTES) } else { add = totalBytes - offset } if offset+add == totalBytes { isLast = true } buf := make([]byte, add, add) //fmt.Printf("-----> buf: %v\n", buf) req := getInsertRequest(isFirst, isLast, int64(offset), buf) //fmt.Printf("-----> req: %+v\n", req) if err := stream.Send(req); err != nil { fmt.Println("stream.Send got error: ", err) } isFirst = false offset += add } stream.CloseAndRecv() total := time.Since(start).Milliseconds() //fmt.Printf("-----> GetObject result: %+v\n", obj) res = append(res, int(total)) fmt.Println("total time in ms for streaming write: ", total) } } return res } func getInsertRequest(isFirst bool, isLast bool, offset int64, buf []byte) *gcspb.InsertObjectRequest { req := &gcspb.InsertObjectRequest{} if isFirst { req.FirstMessage = &gcspb.InsertObjectRequest_InsertObjectSpec{ InsertObjectSpec: &gcspb.InsertObjectSpec{ Resource: &gcspb.Object{ Bucket: *bucketName, Name: *objectName, }, }, } } crc32c := crc32.MakeTable(crc32.Castagnoli) req.Data = &gcspb.InsertObjectRequest_ChecksummedData{ ChecksummedData: &gcspb.ChecksummedData{ Content: buf, Crc32C: &wrappers.UInt32Value{ Value: crc32.Checksum(buf, crc32c), }, }, } req.WriteOffset = offset if isLast { req.FinishWrite = true } return req } func makeJsonRequest(client *storage.Client) []int { fmt.Println("========================== start http calls ===============================") res := []int{} switch *method { case "media": for i := 0; i < *numCalls; i++ { start := time.Now() obj := client.Bucket(*bucketName).Object(*objectName) rc, err := obj.NewReader(context.Background()) if err != nil { fmt.Println("Failed to create object reader: %v", err) os.Exit(1) } defer rc.Close() _, err = ioutil.ReadAll(rc) if err != nil { fmt.Println("Failed to read data from object: %v", err) os.Exit(1) } total := time.Since(start).Milliseconds() res = append(res, int(total)) //fmt.Printf("http object data: %s\n", data) fmt.Println("total time in ms for read: ", total) } case "metadata": for i := 0; i < *numCalls; i++ { ctx := context.Background() start := time.Now() obj := client.Bucket(*bucketName).Object(*objectName) _, err := obj.Attrs(ctx) if err != nil { fmt.Println("obj.Attrs() got error: ", err) os.Exit(1) } //fmt.Printf("-----> obj.Attrs() result: %+v\n", attr) total := time.Since(start).Milliseconds() res = append(res, int(total)) fmt.Println("total time in ms for read attributes: ", total) } case "write": for i := 0; i < *numCalls; i++ { ctx := context.Background() start := time.Now() msg := strings.Repeat("x", *size*1024) obj := client.Bucket(*bucketName).Object(*objectName) w := obj.NewWriter(ctx) if _, err := fmt.Fprint(w, msg); err != nil { fmt.Println("Failed to write message to object: %v", err) } if err := w.Close(); err != nil { fmt.Println("object writer failed closing: %v", err) os.Exit(1) } total := time.Since(start).Milliseconds() res = append(res, int(total)) fmt.Println("total time in ms for http write: ", total) } } return res } func printResult(res []int) { sort.Ints(res) n := len(res) sum := 0 for _, r := range res { sum += r } fmt.Printf( "\n\t\tAvg\tMin\tp50\tp90\tp99\tMax\n"+ "Time(ms)\t%v\t%v\t%v\t%v\t%v\t%v\n", sum/n, res[0], res[int(float64(n)*0.5)], res[int(float64(n)*0.9)], res[int(float64(n)*0.99)], res[n-1], ) } func main() { flag.Parse() if *uploadSize > 0 { httpClient := getHttpClient() upload(httpClient, *uploadSize) return } var res []int if *useHttp { httpClient := getHttpClient() res = makeJsonRequest(httpClient) } else { grpcClient := getGrpcClient() res = makeGrpcRequest(grpcClient) } printResult(res) } grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/go.mod000066400000000000000000000003741457366620600210530ustar00rootroot00000000000000module github.com/GoogleCloudPlatform/grpc-gcp-go/e2e-examples go 1.13 require ( cloud.google.com/go/storage v1.29.0 github.com/golang/protobuf v1.5.3 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 google.golang.org/grpc v1.56.3 ) grpc-gcp-go-grpcgcp-v1.5.0/e2e-examples/go.sum000066400000000000000000004447411457366620600211120ustar00rootroot00000000000000cloud.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 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= 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/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= 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/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= 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/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= 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/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/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= 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.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= 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/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= 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/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= 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.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/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= 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 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= 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/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.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= 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 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= 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/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/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= 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/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= 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 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= 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/video v1.15.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/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/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 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/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= 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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= 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 v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 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/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/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/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 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/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/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/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= 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.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= 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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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-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-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/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 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/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 h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= 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/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/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.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/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/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.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 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= 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 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= 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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.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 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= 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 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= 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/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/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/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/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/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/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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/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-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= 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/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/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/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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= 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.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 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/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/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/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/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= 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/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= 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/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/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/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/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-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-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-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-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.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.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.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= 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.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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/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-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-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-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-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-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-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.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.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.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.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= 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 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 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/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-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-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-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-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-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/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 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= 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 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= 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/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-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-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-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= 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.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.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.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= 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.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 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.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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-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= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.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/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/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/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/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/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= 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/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= 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= grpc-gcp-go-grpcgcp-v1.5.0/examples/000077500000000000000000000000001457366620600172705ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/examples/spanner_grpcgcp/000077500000000000000000000000001457366620600224435ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/examples/spanner_grpcgcp/Readme.md000066400000000000000000000005231457366620600241620ustar00rootroot00000000000000### Spanner client using gRPC-GCP channel pool example You'll need a Spanner database to test connectivity via gRPC-GCP channel pool. Run ``` go run spanner_grpcgcp.go --project=your-gcp-project --instance=your-spanner-instance --database=your-spanner-database ``` The output should look like: ``` 2023/01/18 19:28:10 Returned: 1 ``` grpc-gcp-go-grpcgcp-v1.5.0/examples/spanner_grpcgcp/go.mod000066400000000000000000000030131457366620600235460ustar00rootroot00000000000000module github.com/GoogleCloudPlatform/grpc-gcp-go/examples/spanner_grpcgcp go 1.20 require ( cloud.google.com/go/spanner v1.45.0 github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.3.0 google.golang.org/api v0.114.0 google.golang.org/grpc v1.56.3 google.golang.org/protobuf v1.30.0 ) require ( cloud.google.com/go v0.110.0 // indirect cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f // indirect github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.1 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect ) grpc-gcp-go-grpcgcp-v1.5.0/examples/spanner_grpcgcp/go.sum000066400000000000000000000401261457366620600236010ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= 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/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= cloud.google.com/go/spanner v1.45.0 h1:7VdjZ8zj4sHbDw55atp5dfY6kn1j9sam9DRNpPQhqR4= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.3.0 h1:yScvuUlp0OCoVmQrTJT7STF3oCvEzeMOssBptsFXwc8= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.3.0/go.mod h1:1Wf1JYYux+dPFhc5leiM56neIMK+faJUJAaeOxhAotc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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/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-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= 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-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 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/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.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f h1:7T++XKzy4xg7PKy+bM+Sa9/oe1OC88yz2hXQUISoXfA= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= 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.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= 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.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.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 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.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 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/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 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= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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-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-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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/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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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/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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= 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.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/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-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-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= 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.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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/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= grpc-gcp-go-grpcgcp-v1.5.0/examples/spanner_grpcgcp/spanner_grpcgcp.go000066400000000000000000000152401457366620600261470ustar00rootroot00000000000000// Test program to try Spanner client with gRPC-GCP channel pool. package main import ( "context" "flag" "fmt" "log" "os" "cloud.google.com/go/spanner" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" "google.golang.org/protobuf/encoding/protojson" gpb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" ) const ( // Spanner client uses a fixed-size channel pool and relies on the pool size // when issuing BatchCreateSessions calls to create new sessions. // This constant helps keep in line our replacement channel pool size // and what is communicated to the Spanner client. poolSize = 4 endpoint = "spanner.googleapis.com:443" scope = "https://www.googleapis.com/auth/cloud-platform" ) var ( project = flag.String("project", "", "GCP project for Cloud Spanner.") instance_name = flag.String("instance", "test1", "Target instance") database_name = flag.String("database", "test1", "Target database") grpcGcpConfig = &gpb.ApiConfig{ ChannelPool: &gpb.ChannelPoolConfig{ // Creates a fixed-size gRPC-GCP channel pool. MinSize: poolSize, MaxSize: poolSize, // This option repeats(preserves) the strategy used by the Spanner // client to distribute BatchCreateSessions calls across channels. BindPickStrategy: gpb.ChannelPoolConfig_ROUND_ROBIN, // When issuing RPC call within Spanner session fallback to a ready // channel if the channel mapped to the session is not ready. FallbackToReady: true, // Establish a new connection for a channel where // no response/messages were received within last 1 second and // at least 3 RPC calls (started after the last response/message // received) timed out (deadline_exceeded). UnresponsiveDetectionMs: 1000, UnresponsiveCalls: 3, }, // Configuration for all Spanner RPCs that create, use or remove // Spanner sessions. gRPC-GCP channel pool uses this configuration // to provide session to channel affinity. If Spanner introduces any new // method that creates/uses/removes sessions, it must be added here. Method: []*gpb.MethodConfig{ { Name: []string{"/google.spanner.v1.Spanner/CreateSession"}, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_BIND, AffinityKey: "name", }, }, { Name: []string{"/google.spanner.v1.Spanner/BatchCreateSessions"}, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_BIND, AffinityKey: "session.name", }, }, { Name: []string{"/google.spanner.v1.Spanner/DeleteSession"}, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_UNBIND, AffinityKey: "name", }, }, { Name: []string{"/google.spanner.v1.Spanner/GetSession"}, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_BOUND, AffinityKey: "name", }, }, { Name: []string{ "/google.spanner.v1.Spanner/BeginTransaction", "/google.spanner.v1.Spanner/Commit", "/google.spanner.v1.Spanner/ExecuteBatchDml", "/google.spanner.v1.Spanner/ExecuteSql", "/google.spanner.v1.Spanner/ExecuteStreamingSql", "/google.spanner.v1.Spanner/PartitionQuery", "/google.spanner.v1.Spanner/PartitionRead", "/google.spanner.v1.Spanner/Read", "/google.spanner.v1.Spanner/Rollback", "/google.spanner.v1.Spanner/StreamingRead", }, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_BOUND, AffinityKey: "session", }, }, }, } ) // ConnPool wrapper for gRPC-GCP channel pool. gtransport.ConnPool is the // interface Spanner client accepts as a replacement channel pool. type grpcGcpConnPool struct { gtransport.ConnPool cc *grpc.ClientConn size int } func (cp *grpcGcpConnPool) Conn() *grpc.ClientConn { return cp.cc } // Spanner client uses this function to get channel pool size. func (cp *grpcGcpConnPool) Num() int { return cp.size } func (cp *grpcGcpConnPool) Close() error { return cp.cc.Close() } func databaseURI() string { return fmt.Sprintf("projects/%s/instances/%s/databases/%s", *project, *instance_name, *database_name) } func spannerClient() (*spanner.Client, error) { var perRPC credentials.PerRPCCredentials var err error keyFile := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") if keyFile == "" { perRPC, err = oauth.NewApplicationDefault(context.Background(), scope) } else { perRPC, err = oauth.NewServiceAccountFromFile(keyFile, scope) } // Converting gRPC-GCP config to JSON because grpc.Dial only accepts JSON // config for configuring load balancers. grpcGcpJsonConfig, err := protojson.Marshal(grpcGcpConfig) if err != nil { return nil, err } conn, err := grpc.Dial( // Spanner endpoint. Replace this with your custom endpoint if not using // the default endpoint. endpoint, // Application default or service account credentials set up above. grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(perRPC), // Do not look up load balancer (gRPC-GCP) config via DNS. grpc.WithDisableServiceConfig(), // Instead use this static config. grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingConfig": [{"%s":%s}]}`, grpcgcp.Name, string(grpcGcpJsonConfig))), // gRPC-GCP interceptors required for proper operation of gRPC-GCP // channel pool. Add your interceptors as next arguments if needed. grpc.WithChainUnaryInterceptor(grpcgcp.GCPUnaryClientInterceptor), grpc.WithChainStreamInterceptor(grpcgcp.GCPStreamClientInterceptor), // Add more DialOption options if needed but make sure not to overwrite // the interceptors above. ) if err != nil { return nil, err } pool := &grpcGcpConnPool{ cc: conn, // Set the pool size on ConnPool to communicate it to Spanner client. size: poolSize, } // Create spanner client. gtransport.WithConnPool is one of the available // Spanner client options. Keep other Spanner-related options here if any // and move channel pool and dial option to the grpc.Dial above. return spanner.NewClient(context.Background(), databaseURI(), gtransport.WithConnPool(pool)) } func main() { flag.Parse() client, err := spannerClient() if err != nil { log.Fatalf("Could not create Spanner client: %v", err) } stmt := spanner.Statement{ SQL: `select 1`, } iter := client.Single().Query(context.Background(), stmt) defer iter.Stop() row, err := iter.Next() if err != nil { log.Fatalf("Could not execute query: %v", err) } var num int64 if err := row.Columns(&num); err != nil { log.Fatalf("Could not parse result: %v", err) } // Should print "Returned: 1". log.Printf("Returned: %v\n", num) } grpc-gcp-go-grpcgcp-v1.5.0/firestore/000077500000000000000000000000001457366620600174545ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/000077500000000000000000000000001457366620600212725ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/000077500000000000000000000000001457366620600226115ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/doc/000077500000000000000000000000001457366620600233565ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/doc/.gitignore000066400000000000000000000000001457366620600253340ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/000077500000000000000000000000001457366620600234005ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/.gitignore000066400000000000000000000000001457366620600253560ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/LICENSE000066400000000000000000000261361457366620600244150ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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. grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/000077500000000000000000000000001457366620600255355ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/batchgetdocuments.go000066400000000000000000000020331457366620600315650ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" "io" "userutil" firestore "go-genproto/googleapis/firestore/v1beta1" ) //BatchGetDocuments ... Retrieve all documents from database func BatchGetDocuments() { fmt.Println("\n:: Batch Retreive Documents ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() docList := []string{} for { fmt.Print("Enter Document Id (blank when finished): ") inp := userutil.ReadFromConsole() if inp != "" { docList = append(docList, "projects/firestoretestclient/databases/(default)/documents/GrpcTestData/"+inp) } else { break } } batchGetDocsReq := firestore.BatchGetDocumentsRequest{ Database: "projects/firestoretestclient/databases/(default)", Documents: docList, } stream, err := client.BatchGetDocuments(context.Background(), &batchGetDocsReq) if err != nil { fmt.Println(err) return } for { resp, err := stream.Recv() if err == io.EOF { break } if err != nil { fmt.Println(err) } userutil.DrawDocument(*resp.GetFound()) } } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/begintransaction.go000066400000000000000000000014301457366620600314140ustar00rootroot00000000000000package apimethods import ( "context" "environment" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" ) //BeginTransaction ... Use BeginTransaction API func BeginTransaction() { fmt.Println("\n:: Starting New Transaction ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() options := firestore.TransactionOptions{} beginTransactionReq := firestore.BeginTransactionRequest{ Database: "projects/firestoretestclient/databases/(default)", Options: &options, } resp, err := client.BeginTransaction(context.Background(), &beginTransactionReq) if err != nil { fmt.Println(err) return } transactionId := resp.GetTransaction() fmt.Println("Successfully began new transaction", transactionId) environment.SetEnvironment(transactionId) } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/commit.go000066400000000000000000000014071457366620600273560ustar00rootroot00000000000000package apimethods import ( "context" "environment" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" ) //Commit ... Hitting Commit API func Commit() { fmt.Println("\n:: Hitting Commit API ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() env := environment.GetEnvironment() if env == nil { fmt.Println("\nNo transaction to commit, returning...") return } transactionId := env.TransactionId commitReq := firestore.CommitRequest{ Database: "projects/firestoretestclient/databases/(default)", Transaction: transactionId, } resp, err := client.Commit(context.Background(), &commitReq) if err != nil { fmt.Println(err) return } environment.ClearEnvironment() fmt.Println("Successful commit! ", resp) } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/createdocument.go000066400000000000000000000023641457366620600310730ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" "userutil" ) //CreateDocument ... Create a New Document func CreateDocument() { fmt.Println("\n:: Creating a New Document ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() fields := make(map[string]*firestore.Value) fmt.Print("Enter Document Name: ") docId := userutil.ReadFromConsole() for { fmt.Print("Enter Field Name (blank when finished): ") fieldName := userutil.ReadFromConsole() if fieldName != "" { fmt.Print("Enter Field Value: ") fieldValString := userutil.ReadFromConsole() fields[fieldName] = &firestore.Value{ ValueType: &firestore.Value_StringValue{ StringValue: fieldValString, }, } } else { break } } doc := firestore.Document{ Fields: fields, } createDocRequest := firestore.CreateDocumentRequest{ Parent: "projects/firestoretestclient/databases/(default)/documents", CollectionId: "GrpcTestData", DocumentId: docId, Document: &doc, } resp, err := client.CreateDocument(context.Background(), &createDocRequest) if err != nil { fmt.Println(err) return } fmt.Println("Successfully created document!") userutil.DrawDocument(*resp) } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/createindex.go000066400000000000000000000025231457366620600303610ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" admin "go-genproto/googleapis/firestore/admin/v1beta1" "userutil" ) //CreateIndex ... Create a New Index func CreateIndex() { fmt.Println("\n:: Creating a New Index ::\n") client, conn := fsutils.MakeFSAdminClient() defer conn.Close() indexFields := []*admin.IndexField{} for { fmt.Print("Enter Field Name (blank when finished): ") indFieldName := userutil.ReadFromConsole() if indFieldName != "" { fmt.Print("Enter Mode (*ASCENDING*/DESCENDING): ") indFieldMode := userutil.ReadFromConsole() indexFields = append(indexFields, &admin.IndexField{ FieldPath: indFieldName, Mode: chooseIndexMode(indFieldMode), }) } else { break } } newIndex := admin.Index{ CollectionId: "GrpcTestData", Fields: indexFields, } createIndexReq := admin.CreateIndexRequest{ Parent: "projects/firestoretestclient/databases/(default)", Index: &newIndex, } _, err := client.CreateIndex(context.Background(), &createIndexReq) if err != nil { fmt.Println(err) return } fmt.Println("Successfully created index! ") } func chooseIndexMode(indexMode string) admin.IndexField_Mode { if indexMode == "ASCENDING" || (indexMode != "ASCENDING" && indexMode != "DESCENDING") { return admin.IndexField_ASCENDING } return admin.IndexField_DESCENDING } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/deletedocument.go000066400000000000000000000013031457366620600310620ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" "userutil" ) //DeleteDocument ... Delete a document from database func DeleteDocument() { fmt.Println("\n:: Deleting a Document ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() fmt.Print("Enter Document Name: ") docName := "projects/firestoretestclient/databases/(default)/documents/GrpcTestData/" + userutil.ReadFromConsole() delDocRequest := firestore.DeleteDocumentRequest{ Name: docName, } _, err := client.DeleteDocument(context.Background(), &delDocRequest) if err != nil { fmt.Println(err) return } fmt.Println("Successfully Deleted ", docName) } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/deleteindex.go000066400000000000000000000012501457366620600303540ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" admin "go-genproto/googleapis/firestore/admin/v1beta1" "userutil" ) //DeleteIndex ... Delete an Index from the database func DeleteIndex() { fmt.Println("\n:: Deleting an Index ::\n") client, conn := fsutils.MakeFSAdminClient() defer conn.Close() fmt.Print("Enter Index Name: ") indexName := "projects/firestoretestclient/databases/(default)/indexes/" + userutil.ReadFromConsole() delIndexReq := admin.DeleteIndexRequest{ Name: indexName, } _, err := client.DeleteIndex(context.Background(), &delIndexReq) if err != nil { fmt.Println(err) return } fmt.Println("\nFinished deleting index!\n") } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/getdocument.go000066400000000000000000000012461457366620600304050ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" "userutil" ) //GetDocument ... Retrieve a specific Document func GetDocument() { fmt.Println("\n:: Getting A Document ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() fmt.Print("Enter Document Name: ") docName := "projects/firestoretestclient/databases/(default)/documents/GrpcTestData/" + userutil.ReadFromConsole() getDocRequest := firestore.GetDocumentRequest{ Name: docName, } resp, err := client.GetDocument(context.Background(), &getDocRequest) if err != nil { fmt.Println(err) } userutil.DrawDocument(*resp) return } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/getindex.go000066400000000000000000000012641457366620600276760ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" admin "go-genproto/googleapis/firestore/admin/v1beta1" "userutil" ) //GetIndex ... Get a Specific Index func GetIndex() { fmt.Println("\n:: Getting a Specfic Index ::]\n") client, conn := fsutils.MakeFSAdminClient() defer conn.Close() fmt.Print("Enter Index Name: ") indexName := "projects/firestoretestclient/databases/(default)/indexes/" + userutil.ReadFromConsole() getIndexReq := admin.GetIndexRequest{ Name: indexName, } resp, err := client.GetIndex(context.Background(), &getIndexReq) if err != nil { fmt.Println(err) return } userutil.DrawIndex(*resp) fmt.Println("\nFinished getting index!\n") } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/listcollectionids.go000066400000000000000000000012211457366620600316070ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" ) //ListCollectionIds ... List all collection IDs from a database func ListCollectionIds() { fmt.Println("\n:: Listing All Collection Ids ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() listCollectionIdReq := firestore.ListCollectionIdsRequest{ Parent: "projects/firestoretestclient/databases/(default)", } resp, err := client.ListCollectionIds(context.Background(), &listCollectionIdReq) if err != nil { fmt.Println(err) return } for _, cid := range resp.CollectionIds { fmt.Println(cid) } return } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/listdocuments.go000066400000000000000000000013411457366620600307600ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" "userutil" ) //ListDocuments ... List all Documents from a Database func ListDocuments() { fmt.Println("\n:: Listing All Documents ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() listDocsRequest := firestore.ListDocumentsRequest{ Parent: "projects/firestoretestclient/databases/(default)", } //bgd_client, err := client.BatchGetDocuments(context.Background(), &getDocsRequest, grpc.FailFast(true)) resp, err := client.ListDocuments(context.Background(), &listDocsRequest) if err != nil { fmt.Println(err) } for _, doc := range resp.Documents { userutil.DrawDocument(*doc) } return } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/listindexes.go000066400000000000000000000011561457366620600304220ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" admin "go-genproto/googleapis/firestore/admin/v1beta1" "userutil" ) //ListIndexes ... List All indexes in a Database func ListIndexes() { fmt.Println("\n:: Listing All Indexes ::\n") client, conn := fsutils.MakeFSAdminClient() defer conn.Close() listIndexesReq := admin.ListIndexesRequest{ Parent: "projects/firestoretestclient/databases/(default)", } resp, err := client.ListIndexes(context.Background(), &listIndexesReq) if err != nil { fmt.Println(err) return } for _, ind := range resp.Indexes { userutil.DrawIndex(*ind) } return } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/rollback.go000066400000000000000000000014331457366620600276560ustar00rootroot00000000000000package apimethods import ( "context" "environment" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" ) //Rollback ... Call the Rollback API func Rollback() { fmt.Println("\n:: Calling Rollback API ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() env := environment.GetEnvironment() if env == nil { fmt.Println("\nNo transaction to rollback, returning...") return } transactionId := env.TransactionId rollbackReq := firestore.RollbackRequest{ Database: "projects/firestoretestclient/databases/(default)", Transaction: transactionId, } resp, err := client.Rollback(context.Background(), &rollbackReq) if err != nil { fmt.Println(err) return } environment.ClearEnvironment() fmt.Println("Successful rollback! ", resp) } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/runquery.go000066400000000000000000000023001457366620600277510ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" "io" "userutil" ) //RunQuery ... Run a Structured Query func RunQuery() { fmt.Println("\n:: Running a Query ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() fmt.Print("Enter field to query: ") fieldPath := userutil.ReadFromConsole() runQueryQuery := firestore.StructuredQuery{ Select: &firestore.StructuredQuery_Projection{ Fields: []*firestore.StructuredQuery_FieldReference{ &firestore.StructuredQuery_FieldReference{ FieldPath: fieldPath, }, }, }, } runStructQueryReq := firestore.RunQueryRequest_StructuredQuery{ StructuredQuery: &runQueryQuery, } runQueryReq := firestore.RunQueryRequest{ Parent: "projects/firestoretestclient/databases/(default)/documents", QueryType: &runStructQueryReq, } call, err := client.RunQuery(context.Background(), &runQueryReq) if err != nil { fmt.Println("Error getting QueryClient: ", err) } for { results, err := call.Recv() if err == io.EOF { break } if err != nil { fmt.Println("Error received from QueryClient: ", err) } userutil.DrawDocument(*results.Document) } } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/updatedocument.go000066400000000000000000000030311457366620600311020ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" "userutil" ) //UpdateDocument ... Update a Document in the Database func UpdateDocument() { fmt.Println("\n:: Updating a Document ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() fields := make(map[string]*firestore.Value) fieldPaths := []string{} fmt.Print("Enter Document Name: ") docId := userutil.ReadFromConsole() docName := "projects/firestoretestclient/databases/(default)/documents/GrpcTestData/" + docId getDocRequest := firestore.GetDocumentRequest{ Name: docName, } doc, err := client.GetDocument(context.Background(), &getDocRequest) if err != nil { fmt.Println(err) return } for { fmt.Print("Enter Field Name (blank when finished): ") fieldName := userutil.ReadFromConsole() if fieldName != "" { fieldPaths = append(fieldPaths, fieldName) fmt.Print("Enter Field Value: ") fieldValString := userutil.ReadFromConsole() fields[fieldName] = &firestore.Value{ ValueType: &firestore.Value_StringValue{ StringValue: fieldValString, }, } } else { break } } doc.Fields = fields docMask := firestore.DocumentMask{ FieldPaths: fieldPaths, } updateDocRequest := firestore.UpdateDocumentRequest{ Document: doc, UpdateMask: &docMask, } resp, err := client.UpdateDocument(context.Background(), &updateDocRequest) if err != nil { fmt.Println(err) return } fmt.Println("Successfully updated document!") userutil.DrawDocument(*resp) } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/apimethods/write.go000066400000000000000000000046451457366620600272270ustar00rootroot00000000000000package apimethods import ( "context" "fmt" "fsutils" firestore "go-genproto/googleapis/firestore/v1beta1" "userutil" ) //Write ... Stream writes to a document func Write() { fmt.Println("\n:: Streaming Writes to a Document ::\n") client, conn := fsutils.MakeFSClient() defer conn.Close() // Get initial stream ID and stream token writeReq := firestore.WriteRequest{ Database: "projects/firestoretestclient/databases/(default)", } writeClient, err := client.Write(context.Background()) if err != nil { fmt.Println(err) return } err = writeClient.Send(&writeReq) if err != nil { fmt.Println(err) return } writeResp, err := writeClient.Recv() streamId := writeResp.GetStreamId() streamToken := writeResp.GetStreamToken() fieldPaths := []string{} fields := make(map[string]*firestore.Value) fmt.Print("Enter Document Name: ") docId := userutil.ReadFromConsole() docName := "projects/firestoretestclient/databases/(default)/documents/GrpcTestData/" + docId getDocRequest := firestore.GetDocumentRequest{ Name: docName, } doc, err := client.GetDocument(context.Background(), &getDocRequest) fmt.Println("\n.... Streaming writes to " + docId + "\n") for { fmt.Print("Enter Field Name (blank when finished): ") fieldName := userutil.ReadFromConsole() if fieldName != "" { fieldPaths := append(fieldPaths, fieldName) fmt.Print("Enter Field Value: ") fieldValString := userutil.ReadFromConsole() fields[fieldName] = &firestore.Value{ ValueType: &firestore.Value_StringValue{ StringValue: fieldValString, }, } doc.Fields = fields docMask := firestore.DocumentMask{ FieldPaths: fieldPaths, } fsWrites := []*firestore.Write{} fsWrites = append(fsWrites, &firestore.Write{ Operation: &firestore.Write_Update{ Update: doc, }, UpdateMask: &docMask, }) writeReq = firestore.WriteRequest{ Database: "projects/firestoretestclient/databases/(default)", Writes: fsWrites, //Write StreamId: streamId, StreamToken: streamToken, } err = writeClient.Send(&writeReq) if err != nil { fmt.Println(err) return } writeResp, err = writeClient.Recv() if err != nil { fmt.Println(err) return } streamToken = writeResp.GetStreamToken() } else { break } } //for err = writeClient.CloseSend() if err != nil { fmt.Println(err) return } fmt.Println("\nFinished writing stream!") } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/environment/000077500000000000000000000000001457366620600257445ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/environment/environment.go000066400000000000000000000011141457366620600306340ustar00rootroot00000000000000package environment //Env ... Current environment // Contents: // transactionId - track transaction ids for commits and rollbacks // type Env struct { TransactionId []byte } var ( env *Env ) //SetEnvironment ... Update current environment func SetEnvironment(transactionId []byte) *Env { env = &Env{ TransactionId: transactionId, } return env } //GetEnvironment ... Return current environment func GetEnvironment() *Env { if env != nil { return env } return nil } //ClearEnvironment ... Clean up environment func ClearEnvironment() *Env { env = nil return env } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/fsutils/000077500000000000000000000000001457366620600250715ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/fsutils/getfsclient.go000066400000000000000000000032231457366620600277270ustar00rootroot00000000000000package fsutils import ( "log" "os" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" admin "go-genproto/googleapis/firestore/admin/v1beta1" firestore "go-genproto/googleapis/firestore/v1beta1" ) // MakeFSClient ... Create a new Firestore Client using JWT credentials func MakeFSClient() (firestore.FirestoreClient, grpc.ClientConn) { keyFile := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") jwtCreds, err := oauth.NewServiceAccountFromFile(keyFile, "https://www.googleapis.com/auth/datastore") address := "firestore.googleapis.com:443" if err != nil { log.Fatalf("Failed to create JWT credentials: %v", err) } conn, err := grpc.Dial(address, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(jwtCreds)) if err != nil { log.Fatalf("did not connect: %v", err) } client := firestore.NewFirestoreClient(conn) return client, *conn } // MakeFSAdminClient ... Create a new Firestore Admin Client using JWT credentials func MakeFSAdminClient() (admin.FirestoreAdminClient, grpc.ClientConn) { keyFile := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") jwtCreds, err := oauth.NewServiceAccountFromFile(keyFile, "https://www.googleapis.com/auth/datastore") address := "firestore.googleapis.com:443" if err != nil { log.Fatalf("Failed to create JWT credentials: %v", err) } conn, err := grpc.Dial(address, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(jwtCreds)) if err != nil { log.Fatalf("did not connect: %v", err) } client := admin.NewFirestoreAdminClient(conn) return client, *conn } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/gfx/000077500000000000000000000000001457366620600241645ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/gfx/choosefirestoremethod.go000066400000000000000000000026221457366620600311210ustar00rootroot00000000000000package gfx import ( "apimethods" "fmt" ) //ChooseAPIMethod ... Pick a method call based on menu entry func ChooseAPIMethod(api string) { switch api { case "batchgetdocuments": fallthrough case "1": apimethods.BatchGetDocuments() case "begintransaction": fallthrough case "2": apimethods.BeginTransaction() case "commit": fallthrough case "3": apimethods.Commit() case "createdocument": fallthrough case "4": apimethods.CreateDocument() case "deletedocument": fallthrough case "5": apimethods.DeleteDocument() case "getdocument": fallthrough case "6": apimethods.GetDocument() case "listcollectionids": fallthrough case "7": apimethods.ListCollectionIds() case "listdocuments": fallthrough case "8": apimethods.ListDocuments() case "rollback": fallthrough case "9": apimethods.Rollback() case "runquery": fallthrough case "10": apimethods.RunQuery() case "updatedocument": fallthrough case "11": apimethods.UpdateDocument() case "write": fallthrough case "12": apimethods.Write() case "createindex": fallthrough case "13": apimethods.CreateIndex() case "deleteindex": fallthrough case "14": apimethods.DeleteIndex() case "getindex": fallthrough case "15": apimethods.GetIndex() case "listindexes": fallthrough case "16": apimethods.ListIndexes() default: fmt.Println("Unknown option '", api, "'") } } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/gfx/drawmenu.go000066400000000000000000000024371457366620600263430ustar00rootroot00000000000000package gfx import ( "fmt" "os" "userutil" ) // DrawMenu ... Draw the system menu func DrawMenu() { fmt.Println("\n Google Firestore RPC Menu\n") fmt.Println("1|batchgetdocuments ......... BatchGetDocuments") fmt.Println("2|begintransaction ......... BeginTransaction") fmt.Println("3|commit .................... Commit") fmt.Println("4|createdocument ............ CreateDocument") fmt.Println("5|deletedocument ............ DeleteDocument") fmt.Println("6|getdocument ............... GetDocument") fmt.Println("7|listcollectionids ......... ListCollectionIds") fmt.Println("8|listdocuments ............. ListDocuments") fmt.Println("9|rollback .................. Rollback") fmt.Println("10|runquery ................. RunQuery") fmt.Println("11|updatedocument ........... UpdateDocument") fmt.Println("12|write .................... Write") fmt.Println("\n Firestore Admin RPC's \n") fmt.Println("13|createindex .............. CreateIndex") fmt.Println("14|deleteindex .............. DeleteIndex") fmt.Println("15|getindex ................. GetIndex") fmt.Println("16|listindexes .............. ListIndex") fmt.Print("\n\nEnter an option ('quit' to exit): ") text := userutil.ReadFromConsole() if text == "quit" { os.Exit(0) } else { ChooseAPIMethod(text) } } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/main.go000066400000000000000000000001751457366620600246560ustar00rootroot00000000000000package main import ( //"apimethods" "gfx" ) var ( transactionId []byte ) func main() { for { gfx.DrawMenu() } } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/userutil/000077500000000000000000000000001457366620600252545ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/userutil/drawdocument.go000066400000000000000000000005541457366620600303030ustar00rootroot00000000000000package userutil import ( "fmt" firestore "go-genproto/googleapis/firestore/v1beta1" ) //DrawDocument ... Draw Document Name and Fields func DrawDocument(doc firestore.Document) { fmt.Println("\n\nDocument Name:", doc.Name) fmt.Println(" Fields: ") for field, value := range doc.Fields { fmt.Printf(" %v : %v\n", field, value.GetStringValue()) } } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/userutil/drawindex.go000066400000000000000000000006301457366620600275670ustar00rootroot00000000000000package userutil import ( "fmt" admin "go-genproto/googleapis/firestore/admin/v1beta1" ) //DrawIndex ... Draw a single index instance func DrawIndex(ind admin.Index) { fmt.Println("Index Name: " + ind.Name + "\nIndex State: " + ind.State.String()) for _, indFields := range ind.Fields { fmt.Println(" Field: " + indFields.FieldPath + " Mode: " + indFields.Mode.String()) } fmt.Print("\n") } grpc-gcp-go-grpcgcp-v1.5.0/firestore/examples/end2end/src/userutil/readfromconsole.go000066400000000000000000000005021457366620600307620ustar00rootroot00000000000000package userutil import ( "bufio" "fmt" "os" "strings" ) // ReadFromConsole ... Read user input from console func ReadFromConsole() string { reader := bufio.NewReader(os.Stdin) text, err := reader.ReadString('\n') text = strings.TrimSpace(text) if err != nil { fmt.Println(err) return "" } return text } grpc-gcp-go-grpcgcp-v1.5.0/firestore/go.mod000066400000000000000000000000001457366620600205500ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/000077500000000000000000000000001457366620600170775ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/README.md000066400000000000000000000006421457366620600203600ustar00rootroot00000000000000 ## How to test Spanner integration 1. Set GCP project id with GCP_PROJECT_ID environment variable. export GCP_PROJECT_ID=test-project 1. Set service key credentials file using GOOGLE_APPLICATION_CREDENTIALS env variable. export GOOGLE_APPLICATION_CREDENTIALS=/service/account/credentials.json 1. Run the tests. go test -v To skip Spanner setup run SKIP_SPANNER=true go test -v grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/doc.go000066400000000000000000000065401457366620600202000ustar00rootroot00000000000000/* * * Copyright 2019 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 grpcgcp provides grpc supports for Google Cloud APIs. For now it provides connection management with affinity support. Note: "channel" is analagous to "connection" in our context. Usage: 1. First, initialize the api configuration. There are two ways: 1a. Create a json file defining the configuration and read it. // Create some_api_config.json { "channelPool": { "maxSize": 4, "maxConcurrentStreamsLowWatermark": 50 }, "method": [ { "name": [ "/some.api.v1/Method1" ], "affinity": { "command": "BIND", "affinityKey": "key1" } }, { "name": [ "/some.api.v1/Method2" ], "affinity": { "command": "BOUND", "affinityKey": "key2" } }, { "name": [ "/some.api.v1/Method3" ], "affinity": { "command": "UNBIND", "affinityKey": "key3" } } ] } jsonFile, err := ioutil.ReadFile("some_api_config.json") if err != nil { t.Fatalf("Failed to read config file: %v", err) } jsonCfg := string(jsonFile) 1b. Create apiConfig directly and convert it to json. // import ( // configpb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" // ) apiConfig := &configpb.ApiConfig{ ChannelPool: &configpb.ChannelPoolConfig{ MaxSize: 4, MaxConcurrentStreamsLowWatermark: 50, }, Method: []*configpb.MethodConfig{ &configpb.MethodConfig{ Name: []string{"/some.api.v1/Method1"}, Affinity: &configpb.AffinityConfig{ Command: configpb.AffinityConfig_BIND, AffinityKey: "key1", }, }, &configpb.MethodConfig{ Name: []string{"/some.api.v1/Method2"}, Affinity: &configpb.AffinityConfig{ Command: configpb.AffinityConfig_BOUND, AffinityKey: "key2", }, }, &configpb.MethodConfig{ Name: []string{"/some.api.v1/Method3"}, Affinity: &configpb.AffinityConfig{ Command: configpb.AffinityConfig_UNBIND, AffinityKey: "key3", }, }, }, } c, err := protojson.Marshal(apiConfig) if err != nil { t.Fatalf("cannot json encode config: %v", err) } jsonCfg := string(c) 2. Make ClientConn with specific DialOptions to enable grpc_gcp load balancer with provided configuration. And specify gRPC-GCP interceptors. conn, err := grpc.Dial( target, // Register and specify the grpc-gcp load balancer. grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig( fmt.Sprintf( `{"loadBalancingConfig": [{"%s":%s}]}`, grpcgcp.Name, jsonCfg, ), ), // Set grpcgcp interceptors. grpc.WithUnaryInterceptor(grpcgcp.GCPUnaryClientInterceptor), grpc.WithStreamInterceptor(grpcgcp.GCPStreamClientInterceptor), ) */ package grpcgcp // import "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp" grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/gcp_balancer.go000066400000000000000000000403371457366620600220350ustar00rootroot00000000000000/* * * Copyright 2018 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 grpcgcp import ( "context" "encoding/json" "fmt" "sync" "sync/atomic" "time" "google.golang.org/grpc/balancer" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" ) var _ balancer.Balancer = (*gcpBalancer)(nil) // Ensure gcpBalancer implements Balancer const ( // Name is the name of grpc_gcp balancer. Name = "grpc_gcp" healthCheckEnabled = true defaultMinSize = 1 defaultMaxSize = 4 defaultMaxStreams = 100 ) func init() { balancer.Register(newBuilder()) } type gcpBalancerBuilder struct { balancer.ConfigParser } type GCPBalancerConfig struct { serviceconfig.LoadBalancingConfig *pb.ApiConfig } func (bb *gcpBalancerBuilder) Build( cc balancer.ClientConn, opt balancer.BuildOptions, ) balancer.Balancer { gb := &gcpBalancer{ cc: cc, methodCfg: make(map[string]*pb.AffinityConfig), affinityMap: make(map[string]balancer.SubConn), fallbackMap: make(map[string]balancer.SubConn), scRefs: make(map[balancer.SubConn]*subConnRef), scStates: make(map[balancer.SubConn]connectivity.State), refreshingScRefs: make(map[balancer.SubConn]*subConnRef), scRefList: []*subConnRef{}, rrRefId: ^uint32(0), csEvltr: &connectivityStateEvaluator{}, // Initialize picker to a picker that always return // ErrNoSubConnAvailable, because when state of a SubConn changes, we // may call UpdateBalancerState with this picker. picker: newErrPicker(balancer.ErrNoSubConnAvailable), } gb.log = NewGCPLogger(compLogger, fmt.Sprintf("[gcpBalancer %p]", gb)) return gb } func (*gcpBalancerBuilder) Name() string { return Name } // ParseConfig converts raw json config into GCPBalancerConfig. // This is called by ClientConn on any load balancer config update. // After parsing the config, ClientConn calls UpdateClientConnState passing the config. func (*gcpBalancerBuilder) ParseConfig(j json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { c := &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{}, } err := protojson.Unmarshal(j, c) return c, err } // newBuilder creates a new grpcgcp balancer builder. func newBuilder() balancer.Builder { return &gcpBalancerBuilder{} } // connectivityStateEvaluator gets updated by addrConns when their // states transition, based on which it evaluates the state of // ClientConn. type connectivityStateEvaluator struct { numReady uint64 // Number of addrConns in ready state. numConnecting uint64 // Number of addrConns in connecting state. numTransientFailure uint64 // Number of addrConns in transientFailure. } // recordTransition records state change happening in every subConn and based on // that it evaluates what aggregated state should be. // It can only transition between Ready, Connecting and TransientFailure. Other states, // Idle and Shutdown are transitioned into by ClientConn; in the beginning of the connection // before any subConn is created ClientConn is in idle state. In the end when ClientConn // closes it is in Shutdown state. // // recordTransition should only be called synchronously from the same goroutine. func (cse *connectivityStateEvaluator) recordTransition( oldState, newState connectivity.State, ) connectivity.State { // Update counters. for idx, state := range []connectivity.State{oldState, newState} { updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new. switch state { case connectivity.Ready: cse.numReady += updateVal case connectivity.Connecting: cse.numConnecting += updateVal case connectivity.TransientFailure: cse.numTransientFailure += updateVal } } // Evaluate. if cse.numReady > 0 { return connectivity.Ready } if cse.numConnecting > 0 { return connectivity.Connecting } return connectivity.TransientFailure } // subConnRef keeps reference to the real SubConn with its // connectivity state, affinity count and streams count. type subConnRef struct { subConn balancer.SubConn stateSignal chan struct{} // This channel is closed and re-created when subConn or its state changes. affinityCnt int32 // Keeps track of the number of keys bound to the subConn. streamsCnt int32 // Keeps track of the number of streams opened on the subConn. lastResp time.Time // Timestamp of the last response from the server. deCalls uint32 // Keeps track of deadline exceeded calls since last response. refreshing bool // If this subconn is in the process of refreshing. refreshCnt uint32 // Number of refreshes since last response. } func (ref *subConnRef) getAffinityCnt() int32 { return atomic.LoadInt32(&ref.affinityCnt) } func (ref *subConnRef) getStreamsCnt() int32 { return atomic.LoadInt32(&ref.streamsCnt) } func (ref *subConnRef) affinityIncr() { atomic.AddInt32(&ref.affinityCnt, 1) } func (ref *subConnRef) affinityDecr() { atomic.AddInt32(&ref.affinityCnt, -1) } func (ref *subConnRef) streamsIncr() { atomic.AddInt32(&ref.streamsCnt, 1) } func (ref *subConnRef) streamsDecr() { atomic.AddInt32(&ref.streamsCnt, -1) } func (ref *subConnRef) deCallsInc() uint32 { return atomic.AddUint32(&ref.deCalls, 1) } func (ref *subConnRef) gotResp() { ref.lastResp = time.Now() atomic.StoreUint32(&ref.deCalls, 0) ref.refreshCnt = 0 } type gcpBalancer struct { cfg *GCPBalancerConfig methodCfg map[string]*pb.AffinityConfig addrs []resolver.Address cc balancer.ClientConn csEvltr *connectivityStateEvaluator state connectivity.State mu sync.RWMutex affinityMap map[string]balancer.SubConn fallbackMap map[string]balancer.SubConn scStates map[balancer.SubConn]connectivity.State scRefs map[balancer.SubConn]*subConnRef scRefList []*subConnRef rrRefId uint32 // Map from a fresh SubConn to the subConnRef where we want to refresh subConn. refreshingScRefs map[balancer.SubConn]*subConnRef // Unresponsive detection enabled flag. unresponsiveDetection bool picker balancer.Picker log grpclog.LoggerV2 } func (gb *gcpBalancer) initializeConfig(cfg *GCPBalancerConfig) { gb.cfg = &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{}, }, } if cfg != nil && cfg.ApiConfig != nil { gb.cfg = &GCPBalancerConfig{ ApiConfig: proto.Clone(cfg.ApiConfig).(*pb.ApiConfig), } } if gb.cfg.GetChannelPool() == nil { gb.cfg.ChannelPool = &pb.ChannelPoolConfig{} } cp := gb.cfg.GetChannelPool() if cp.GetMinSize() == 0 { cp.MinSize = defaultMinSize } if cp.GetMaxSize() == 0 { cp.MaxSize = defaultMaxSize } if cp.GetMaxConcurrentStreamsLowWatermark() == 0 { cp.MaxConcurrentStreamsLowWatermark = defaultMaxStreams } mp := make(map[string]*pb.AffinityConfig) methodCfgs := gb.cfg.GetMethod() for _, methodCfg := range methodCfgs { methodNames := methodCfg.GetName() affinityCfg := methodCfg.GetAffinity() if methodNames != nil && affinityCfg != nil { for _, method := range methodNames { mp[method] = affinityCfg } } } gb.methodCfg = mp gb.unresponsiveDetection = cp.GetUnresponsiveCalls() > 0 && cp.GetUnresponsiveDetectionMs() > 0 gb.enforceMinSize() } func (gb *gcpBalancer) enforceMinSize() { for len(gb.scRefs) < int(gb.cfg.GetChannelPool().GetMinSize()) { gb.addSubConn() } } func (gb *gcpBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error { gb.mu.Lock() defer gb.mu.Unlock() addrs := ccs.ResolverState.Addresses if gb.log.V(FINE) { gb.log.Infoln("got new resolved addresses: ", addrs, " and balancer config: ", ccs.BalancerConfig) } gb.addrs = addrs if gb.cfg == nil { cfg, ok := ccs.BalancerConfig.(*GCPBalancerConfig) if !ok && ccs.BalancerConfig != nil { return fmt.Errorf("provided config is not GCPBalancerConfig: %v", ccs.BalancerConfig) } gb.initializeConfig(cfg) } if len(gb.scRefs) == 0 { gb.newSubConn() return nil } for _, scRef := range gb.scRefs { // TODO(weiranf): update streams count when new addrs resolved? scRef.subConn.UpdateAddresses(addrs) scRef.subConn.Connect() } return nil } func (gb *gcpBalancer) ResolverError(err error) { gb.log.Warningf("ResolverError: %v", err) } // check current connection pool size func (gb *gcpBalancer) getConnectionPoolSize() int { // TODO(golobokov): replace this with locked increase of subconns. gb.mu.Lock() defer gb.mu.Unlock() return len(gb.scRefs) } // newSubConn creates a new SubConn using cc.NewSubConn and initialize the subConnRef // if none of the subconns are in the Connecting state. func (gb *gcpBalancer) newSubConn() { gb.mu.Lock() defer gb.mu.Unlock() // there are chances the newly created subconns are still connecting, // we can wait on those new subconns. for _, scState := range gb.scStates { if scState == connectivity.Connecting || scState == connectivity.Idle { return } } gb.addSubConn() } // addSubConn creates a new SubConn using cc.NewSubConn and initialize the subConnRef. // Must be called holding the mutex lock. func (gb *gcpBalancer) addSubConn() { sc, err := gb.cc.NewSubConn( gb.addrs, balancer.NewSubConnOptions{HealthCheckEnabled: healthCheckEnabled}, ) if err != nil { gb.log.Errorf("failed to NewSubConn: %v", err) return } gb.scRefs[sc] = &subConnRef{ subConn: sc, stateSignal: make(chan struct{}), lastResp: time.Now(), } gb.scStates[sc] = connectivity.Idle gb.scRefList = append(gb.scRefList, gb.scRefs[sc]) sc.Connect() } // getReadySubConnRef returns a subConnRef and a bool. The bool indicates whether // the boundKey exists in the affinityMap. If returned subConnRef is a nil, it // means the underlying subconn is not READY yet. func (gb *gcpBalancer) getReadySubConnRef(boundKey string) (*subConnRef, bool) { gb.mu.Lock() defer gb.mu.Unlock() if sc, ok := gb.affinityMap[boundKey]; ok { if gb.scStates[sc] != connectivity.Ready { // It's possible that the bound subconn is not in the readySubConns list, // If it's not ready, we throw ErrNoSubConnAvailable or // fallback to a previously mapped ready subconn or the least busy. if gb.cfg.GetChannelPool().GetFallbackToReady() { if sc, ok := gb.fallbackMap[boundKey]; ok { return gb.scRefs[sc], true } // Try to create fallback mapping. if scRef, err := gb.picker.(*gcpPicker).getLeastBusySubConnRef(); err == nil { gb.fallbackMap[boundKey] = scRef.subConn return scRef, true } } return nil, true } return gb.scRefs[sc], true } return nil, false } func (gb *gcpBalancer) getSubConnRoundRobin(ctx context.Context) *subConnRef { if len(gb.scRefList) == 0 { gb.newSubConn() } scRef := gb.scRefList[atomic.AddUint32(&gb.rrRefId, 1)%uint32(len(gb.scRefList))] gb.mu.RLock() if state := gb.scStates[scRef.subConn]; state == connectivity.Ready { gb.mu.RUnlock() return scRef } else { grpclog.Infof("grpcgcp.gcpBalancer: scRef is not ready: %v", state) } ticker := time.NewTicker(time.Millisecond * 100) defer ticker.Stop() // Wait until SubConn is ready or call context is done. for gb.scStates[scRef.subConn] != connectivity.Ready { sigChan := scRef.stateSignal gb.mu.RUnlock() select { case <-ctx.Done(): return scRef case <-ticker.C: case <-sigChan: } gb.mu.RLock() } gb.mu.RUnlock() return scRef } // bindSubConn binds the given affinity key to an existing subConnRef. func (gb *gcpBalancer) bindSubConn(bindKey string, sc balancer.SubConn) { gb.mu.Lock() defer gb.mu.Unlock() _, ok := gb.affinityMap[bindKey] if !ok { gb.affinityMap[bindKey] = sc } gb.scRefs[sc].affinityIncr() } // unbindSubConn removes the existing binding associated with the key. func (gb *gcpBalancer) unbindSubConn(boundKey string) { gb.mu.Lock() defer gb.mu.Unlock() boundSC, ok := gb.affinityMap[boundKey] if ok { gb.scRefs[boundSC].affinityDecr() delete(gb.affinityMap, boundKey) } } // regeneratePicker takes a snapshot of the balancer, and generates a picker // from it. The picker is // - errPicker with ErrTransientFailure if the balancer is in TransientFailure, // - built by the pickerBuilder with all READY SubConns otherwise. func (gb *gcpBalancer) regeneratePicker() { if gb.state == connectivity.TransientFailure { gb.picker = newErrPicker(balancer.ErrTransientFailure) return } readyRefs := []*subConnRef{} // Select ready subConns from subConn map. for sc, scState := range gb.scStates { if scState == connectivity.Ready { readyRefs = append(readyRefs, gb.scRefs[sc]) } } gb.picker = newGCPPicker(readyRefs, gb) } func (gb *gcpBalancer) UpdateSubConnState(sc balancer.SubConn, scs balancer.SubConnState) { gb.mu.Lock() defer gb.mu.Unlock() s := scs.ConnectivityState if scRef, found := gb.refreshingScRefs[sc]; found { if gb.log.V(FINE) { gb.log.Infof("handle replacement SubConn state change: %p, %v", sc, s) } if s != connectivity.Ready { // Ignore the replacement sc until it's ready. return } // Replace SubConn of the scRef with the fresh SubConn (sc) concluding // the refresh process initiated by refresh(*subConnRef). oldSc := scRef.subConn gb.scStates[sc] = gb.scStates[oldSc] delete(gb.refreshingScRefs, sc) delete(gb.scRefs, oldSc) delete(gb.scStates, oldSc) gb.scRefs[sc] = scRef scRef.subConn = sc scRef.deCalls = 0 scRef.lastResp = time.Now() scRef.refreshing = false scRef.refreshCnt++ gb.cc.RemoveSubConn(oldSc) } if gb.log.V(FINE) { gb.log.Infof("handle SubConn state change: %p, %v", sc, s) } oldS, ok := gb.scStates[sc] if !ok { if gb.log.V(FINE) { gb.log.Infof( "got state changes for an unknown/replaced SubConn: %p, %v", sc, s, ) } return } gb.scStates[sc] = s switch s { case connectivity.Idle: sc.Connect() case connectivity.Shutdown: delete(gb.scRefs, sc) delete(gb.scStates, sc) } if oldS == connectivity.Ready && s != oldS { // Subconn is broken. Remove fallback mapping to this subconn. for k, v := range gb.fallbackMap { if v == sc { delete(gb.fallbackMap, k) } } } if oldS != connectivity.Ready && s == connectivity.Ready { // Remove fallback mapping for the keys of recovered subconn. for k := range gb.fallbackMap { if gb.affinityMap[k] == sc { delete(gb.fallbackMap, k) } } } oldAggrState := gb.state gb.state = gb.csEvltr.recordTransition(oldS, s) // Regenerate picker when one of the following happens: // - this sc became ready from not-ready // - this sc became not-ready from ready // - the aggregated state of balancer became TransientFailure from non-TransientFailure // - the aggregated state of balancer became non-TransientFailure from TransientFailure if (s == connectivity.Ready) != (oldS == connectivity.Ready) || (gb.state == connectivity.TransientFailure) != (oldAggrState == connectivity.TransientFailure) { gb.regeneratePicker() gb.cc.UpdateState(balancer.State{ ConnectivityState: gb.state, Picker: gb.picker, }) } if scRef := gb.scRefs[sc]; scRef != nil { // Inform of the state change. close(scRef.stateSignal) scRef.stateSignal = make(chan struct{}) } } // refresh initiates a new SubConn for a specific subConnRef and starts connecting. // If the refresh is already initiated for the ref, then this is a no-op. func (gb *gcpBalancer) refresh(ref *subConnRef) { if ref.refreshing { return } gb.mu.Lock() defer gb.mu.Unlock() if ref.refreshing { return } ref.refreshing = true sc, err := gb.cc.NewSubConn( gb.addrs, balancer.NewSubConnOptions{HealthCheckEnabled: healthCheckEnabled}, ) if err != nil { gb.log.Errorf("failed to create a replacement SubConn with NewSubConn: %v", err) return } gb.refreshingScRefs[sc] = ref sc.Connect() } func (gb *gcpBalancer) Close() { } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/gcp_balancer_test.go000066400000000000000000001035301457366620600230670ustar00rootroot00000000000000package grpcgcp import ( "context" "encoding/json" "fmt" "sync" "testing" "time" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/mocks" "github.com/golang/mock/gomock" "github.com/google/go-cmp/cmp" "google.golang.org/grpc" "google.golang.org/grpc/balancer" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/testing/protocmp" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" ) var testApiConfig = &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: uint32(5), MaxSize: uint32(10), MaxConcurrentStreamsLowWatermark: uint32(50), FallbackToReady: true, }, Method: []*pb.MethodConfig{ { Name: []string{"method1", "method2"}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BOUND, AffinityKey: "boundKey", }, }, { Name: []string{"method3"}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BIND, AffinityKey: "bindKey", }, }, }, } var currBalancer *gcpBalancer // testBuilderWrapper wraps the real gcpBalancerBuilder // so it can cache the created balancer object type testBuilderWrapper struct { balancer.ConfigParser name string realBuilder *gcpBalancerBuilder } func (tb *testBuilderWrapper) Build( cc balancer.ClientConn, opt balancer.BuildOptions, ) balancer.Balancer { currBalancer = tb.realBuilder.Build(cc, opt).(*gcpBalancer) return currBalancer } func (*testBuilderWrapper) Name() string { return Name } func (tb *testBuilderWrapper) ParseConfig(j json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { return tb.realBuilder.ParseConfig(j) } func TestDefaultConfig(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { sc := mocks.NewMockSubConn(mockCtrl) sc.EXPECT().Connect().AnyTimes() sc.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() return sc, nil }).AnyTimes() wantCfg := &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: defaultMinSize, MaxSize: defaultMaxSize, MaxConcurrentStreamsLowWatermark: defaultMaxStreams, FallbackToReady: false, }, Method: []*pb.MethodConfig{}, } b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with no config. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, }) if diff := cmp.Diff(wantCfg, b.cfg.ApiConfig, protocmp.Transform()); diff != "" { t.Errorf("gcp_balancer config has unexpected difference (-want +got):\n%v", diff) } b = newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with empty config. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{}, }) if diff := cmp.Diff(wantCfg, b.cfg.ApiConfig, protocmp.Transform()); diff != "" { t.Errorf("gcp_balancer config has unexpected difference (-want +got):\n%v", diff) } } func TestConfig(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { sc := mocks.NewMockSubConn(mockCtrl) sc.EXPECT().Connect().AnyTimes() sc.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() return sc, nil }).AnyTimes() b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: testApiConfig, }, }) if diff := cmp.Diff(testApiConfig, b.cfg.ApiConfig, protocmp.Transform()); diff != "" { t.Errorf("gcp_balancer config has unexpected difference (-want +got):\n%v", diff) } } func TestParseConfig(t *testing.T) { json, err := protojson.Marshal(testApiConfig) if err != nil { t.Fatalf("cannot encode ApiConfig: %v", err) } cfg, err := newBuilder().(balancer.ConfigParser).ParseConfig(json) if err != nil { t.Fatalf("ParseConfig returns error: %v, want: nil", err) } if diff := cmp.Diff(testApiConfig, cfg, protocmp.Transform()); diff != "" { t.Errorf("ParseConfig() result has unexpected difference (-want +got):\n%v", diff) } } func TestParseConfigFromDial(t *testing.T) { // Register test builder wrapper. balancer.Register(&testBuilderWrapper{ name: Name, realBuilder: newBuilder().(*gcpBalancerBuilder), }) json, err := protojson.Marshal(testApiConfig) if err != nil { t.Fatalf("cannot encode ApiConfig: %v", err) } conn, err := grpc.Dial( "localhost:433", grpc.WithInsecure(), grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingConfig": [{"%s":%s}]}`, Name, string(json))), grpc.WithUnaryInterceptor(GCPUnaryClientInterceptor), grpc.WithStreamInterceptor(GCPStreamClientInterceptor), ) if err != nil { t.Errorf("Creation of ClientConn failed due to error: %s", err.Error()) } defer conn.Close() if diff := cmp.Diff(testApiConfig, currBalancer.cfg.ApiConfig, protocmp.Transform()); diff != "" { t.Errorf("gcp_balancer config has unexpected difference (-want +got):\n%v", diff) } } func TestCreatesMinSubConns(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockCC := mocks.NewMockClientConn(mockCtrl) newSCs := []*mocks.MockSubConn{} mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().Times(2) newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() newSCs = append(newSCs, newSC) return newSC, nil }).Times(3) b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: 3, MaxSize: 10, MaxConcurrentStreamsLowWatermark: 100, }, }, }, }) if want := 3; len(b.scRefs) != want { t.Fatalf("gcpBalancer scRefs length is %v, want %v", len(b.scRefs), want) } for _, v := range newSCs { if _, ok := b.scRefs[v]; !ok { t.Fatalf("Created SubConn is not stored in gcpBalancer.scRefs") } } } func TestCreatesUpToMaxSubConns(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockCC := mocks.NewMockClientConn(mockCtrl) newSCs := []*mocks.MockSubConn{} mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().AnyTimes() newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() newSCs = append(newSCs, newSC) return newSC, nil }).Times(5) b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. minSize := 3 maxSize := 5 b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: uint32(minSize), MaxSize: uint32(maxSize), MaxConcurrentStreamsLowWatermark: 1, }, }, }, }) if want := minSize; len(b.scRefs) != want { t.Fatalf("gcpBalancer scRefs length is %v, want %v", len(b.scRefs), want) } for _, v := range newSCs { if _, ok := b.scRefs[v]; !ok { t.Fatalf("Created SubConn is not stored in gcpBalancer.scRefs") } // Simulate ready. b.UpdateSubConnState(v, balancer.SubConnState{ConnectivityState: connectivity.Ready}) } // Simulate more than MaxSize calls. for i := 0; i < maxSize*2; i++ { b.picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: context.TODO()}) } // Should create only one new subconn because we skip new subconn creation while any is still connecting. // This is done to prevent scaling up the pool prematurely. if want := minSize + 1; len(b.scRefs) != want { t.Fatalf("gcpBalancer scRefs length is %v, want %v", len(b.scRefs), want) } // Simulate more than MaxSize calls. Now with simulating any new subconn moving to ready state. for i := 0; i < maxSize*2; i++ { if _, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: context.TODO()}); err != nil { // Simulate a new subconn is ready. for _, v := range newSCs { if b.scStates[v] != connectivity.Ready { b.UpdateSubConnState(v, balancer.SubConnState{ConnectivityState: connectivity.Ready}) } } } } if want := maxSize; len(b.scRefs) != want { t.Fatalf("gcpBalancer scRefs length is %v, want %v", len(b.scRefs), want) } for _, v := range newSCs { if _, ok := b.scRefs[v]; !ok { t.Fatalf("Created SubConn is not stored in gcpBalancer.scRefs") } } } func TestRefreshesSubConnsWhenUnresponsive(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() // A slice to store all SubConns created by gcpBalancer's ClientConn. newSCs := []*mocks.MockSubConn{} mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mockCC.EXPECT().RemoveSubConn(gomock.Any()).Times(2) mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().MinTimes(1) newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() newSCs = append(newSCs, newSC) return newSC, nil }).Times(6) b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: 3, MaxSize: 10, MaxConcurrentStreamsLowWatermark: 50, UnresponsiveDetectionMs: 100, UnresponsiveCalls: 3, }, }, }, }) // Make subConn 0 ready. b.UpdateSubConnState(newSCs[0], balancer.SubConnState{ConnectivityState: connectivity.Ready}) call := func(expSC balancer.SubConn, errOnDone error) { ctx := context.TODO() var cancel context.CancelFunc if errOnDone == deErr { ctx, cancel = context.WithTimeout(ctx, 0) defer cancel() } pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: ctx}) if pr.SubConn != expSC || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, expSC) } pr.Done(balancer.DoneInfo{Err: errOnDone}) } // First deadline exceeded call. call(newSCs[0], deErr) time.Sleep(time.Millisecond * 50) // Successful call. call(newSCs[0], nil) time.Sleep(time.Millisecond * 60) // Deadline exceeded calls. call(newSCs[0], deErr) call(newSCs[0], deErr) // Should not trigger new subconn as only ~60ms passed since last response. call(newSCs[0], deErr) if got, want := len(newSCs), 3; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } time.Sleep(time.Millisecond * 50) // ~110ms since last response and >= 3 deadline exceeded calls. Should trigger new subconn. call(newSCs[0], deErr) if got, want := len(newSCs), 4; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } // Until the fresh SubConn is ready, the old SubConn should be used. dlCtx, cancel := context.WithTimeout(context.TODO(), 0) defer cancel() pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: dlCtx}) if want := newSCs[0]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } doneOnOld := pr.Done // Make replacement subConn 3 ready. b.UpdateSubConnState(newSCs[3], balancer.SubConnState{ConnectivityState: connectivity.Ready}) // Fresh subConn should be picked. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: context.Background()}) if want := newSCs[3]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } // A call on the old subconn is finished. Should not panic. doneOnOld(balancer.DoneInfo{Err: deErr}) time.Sleep(time.Millisecond * 110) call(newSCs[3], deErr) call(newSCs[3], deErr) // Should not trigger new subconn as unresponsiveTimeMs should've been doubled when still no response on the fresh subconn. call(newSCs[3], deErr) if got, want := len(newSCs), 4; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } time.Sleep(time.Millisecond * 110) // After doubled unresponsiveTimeMs has passed, should trigger new subconn. call(newSCs[3], deErr) if got, want := len(newSCs), 5; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } // Make replacement subConn 4 ready. b.UpdateSubConnState(newSCs[4], balancer.SubConnState{ConnectivityState: connectivity.Ready}) // Successful call to reset refresh counter. call(newSCs[4], nil) time.Sleep(time.Millisecond * 110) call(newSCs[4], deErr) // Only second deadline exceeded call since last response, should not trigger new subconn. call(newSCs[4], deErr) if got, want := len(newSCs), 5; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } // Third call should trigger new subconn. call(newSCs[4], deErr) if got, want := len(newSCs), 6; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } } func TestRefreshingSubConnsDoesNotAffectConnState(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() connState := connectivity.Idle // A slice to store all SubConns created by gcpBalancer's ClientConn. newSCs := []*mocks.MockSubConn{} mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).Do(func(s balancer.State) { connState = s.ConnectivityState }).AnyTimes() mockCC.EXPECT().RemoveSubConn(gomock.Any()).Times(2) mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().MinTimes(1) newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() newSCs = append(newSCs, newSC) return newSC, nil }).Times(4) b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: 2, MaxSize: 2, MaxConcurrentStreamsLowWatermark: 50, UnresponsiveDetectionMs: 100, UnresponsiveCalls: 3, }, }, }, }) // Make subConn 0, 1 ready. b.UpdateSubConnState(newSCs[0], balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(newSCs[1], balancer.SubConnState{ConnectivityState: connectivity.Ready}) calls := make(map[balancer.SubConn][]func(balancer.DoneInfo), 0) time.Sleep(time.Millisecond * 110) addCall := func() { ctx, _ := context.WithTimeout(context.TODO(), 0) pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: ctx}) if err != nil { t.Fatalf("gcpPicker.Pick returns error %v, want: nil", err) } calls[pr.SubConn] = append(calls[pr.SubConn], pr.Done) } // Add 3 calls to subConn 0. for len(calls[newSCs[0]]) < 3 { addCall() } // Deadline exceeded on all calls for subConn 0. for i := 0; i < len(calls[newSCs[0]]); i++ { calls[newSCs[0]][i](balancer.DoneInfo{Err: deErr}) } // ~110ms since last response and >= 3 deadline exceeded calls. Should trigger new subconn. if got, want := len(newSCs), 3; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } // Make new subConn ready. b.UpdateSubConnState(newSCs[2], balancer.SubConnState{ConnectivityState: connectivity.Ready}) // Confirm shutdown of the old subConn. b.UpdateSubConnState(newSCs[0], balancer.SubConnState{ConnectivityState: connectivity.Shutdown}) // Add 3 calls to subConn 1. for len(calls[newSCs[1]]) < 3 { addCall() } // Deadline exceeded on all calls for subConn 1. for i := 0; i < len(calls[newSCs[1]]); i++ { calls[newSCs[1]][i](balancer.DoneInfo{Err: deErr}) } // ~110ms since last response and >= 3 deadline exceeded calls. Should trigger new subconn. if got, want := len(newSCs), 4; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } // Make new subConn ready. b.UpdateSubConnState(newSCs[3], balancer.SubConnState{ConnectivityState: connectivity.Ready}) // Confirm shutdown of the old subConn. b.UpdateSubConnState(newSCs[1], balancer.SubConnState{ConnectivityState: connectivity.Shutdown}) if connState != connectivity.Ready { t.Fatalf("gcpBalancer state changes to %v, want: %v", connState, connectivity.Ready) } } func TestShutdownWhileRefreshing(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() // A slice to store all SubConns created by gcpBalancer's ClientConn. newSCs := []*mocks.MockSubConn{} mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mockCC.EXPECT().RemoveSubConn(gomock.Any()).Times(1) mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().MinTimes(1) newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() newSCs = append(newSCs, newSC) return newSC, nil }).Times(3) b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: 2, MaxSize: 2, MaxConcurrentStreamsLowWatermark: 50, UnresponsiveDetectionMs: 100, UnresponsiveCalls: 3, }, }, }, }) // Make subConn 0, 1 ready. b.UpdateSubConnState(newSCs[0], balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(newSCs[1], balancer.SubConnState{ConnectivityState: connectivity.Ready}) calls := make(map[balancer.SubConn][]func(balancer.DoneInfo), 0) time.Sleep(time.Millisecond * 110) addCall := func() { ctx, _ := context.WithTimeout(context.TODO(), 0) pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: ctx}) if err != nil { t.Fatalf("gcpPicker.Pick returns error %v, want: nil", err) } calls[pr.SubConn] = append(calls[pr.SubConn], pr.Done) } // Add 3 calls to subConn 0. for len(calls[newSCs[0]]) < 3 { addCall() } // Deadline exceeded on all calls for subConn 0. for i := 0; i < len(calls[newSCs[0]]); i++ { calls[newSCs[0]][i](balancer.DoneInfo{Err: deErr}) } // ~110ms since last response and >= 3 deadline exceeded calls. Should trigger new subconn. if got, want := len(newSCs), 3; got != want { t.Fatalf("Unexpected number of subConns: %d, want %d", got, want) } // Before the new subConn is ready we shutdown so all subConns shutdown. b.UpdateSubConnState(newSCs[0], balancer.SubConnState{ConnectivityState: connectivity.Shutdown}) b.UpdateSubConnState(newSCs[1], balancer.SubConnState{ConnectivityState: connectivity.Shutdown}) // The new subConn becomes briefly ready before shutdown. b.UpdateSubConnState(newSCs[2], balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(newSCs[2], balancer.SubConnState{ConnectivityState: connectivity.Shutdown}) } func TestRoundRobinForBind(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() // A slice to store all SubConns created by gcpBalancer's ClientConn. scs := []*mocks.MockSubConn{} mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mockCC.EXPECT().RemoveSubConn(gomock.Any()).Times(1) mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().MinTimes(1) newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() scs = append(scs, newSC) return newSC, nil }).Times(5) b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. minSize := 3 streamsWatermark := 10 b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: uint32(minSize), MaxSize: 10, MaxConcurrentStreamsLowWatermark: uint32(streamsWatermark), BindPickStrategy: pb.ChannelPoolConfig_ROUND_ROBIN, }, Method: []*pb.MethodConfig{ { Name: []string{"dummyService/createSession"}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BIND, AffinityKey: "dummykey", }, }, }, }, }, }) if want := minSize; len(b.scRefs) != want { t.Fatalf("gcpBalancer scRefs length is %v, want %v", len(b.scRefs), want) } // Make subConn 1 ready. b.UpdateSubConnState(scs[1], balancer.SubConnState{ConnectivityState: connectivity.Ready}) // Expect picker will pick the only ready subconn for non-binding call. This call will increment the counter for // active streams on subconn 1 which helps us test round-robin for binging calls below. pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/noAffinity", Ctx: context.TODO()}) if want := scs[1]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } start := time.Now() delay := time.Millisecond * 345 margin := time.Millisecond * 50 // Bring other subconns to ready with some delay. go func() { time.Sleep(delay) b.UpdateSubConnState(scs[0], balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(scs[2], balancer.SubConnState{ConnectivityState: connectivity.Ready}) }() // Expect 0 subconn because the picker should pick even non-ready subcons for binding calls in a round-robin manner. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[0]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } // Also, when round-robin for bind operations is enabled, the picker must wait until subconn became ready. elapsed := time.Now().Sub(start) if elapsed < delay { t.Fatalf("gcpPicker.Pick returns before subconn became active") } if elapsed > delay+margin { t.Fatalf("gcpPicker.Pick waited too long after subcon became active: %v, want <=%v", delay+margin-elapsed, margin) } pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[1]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[2]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } // Cycles to the first subconn. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[0]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[1]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } // Create more regular calls to reach the limit (watermark*subconns - 6 calls initiated above) to spawn new subconn. for i := 0; i < streamsWatermark*minSize-6; i++ { _, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/noAffinity", Ctx: context.TODO()}) if err != nil { t.Fatalf("gcpPicker.Pick returns error: %v, want: nil", err) } } // This call triggers new subconn creation. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/noAffinity", Ctx: context.TODO()}) if wantErr := balancer.ErrNoSubConnAvailable; err != wantErr { t.Fatalf("gcpPicker.Pick returns %v, _, %v, want: nil, _, %v", pr.SubConn, err, wantErr) } // The first binding call shifts to 1 because the divisor for the counter changes from 3 to 4. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[1]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[2]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } // Instead of moving subconn 3 to ready, we replace that with subconn 4 and make that ready // to test that we catch replaced subconn state change. All this happens after Pick is called. go func() { start = time.Now() time.Sleep(delay) b.refresh(b.scRefs[scs[3]]) b.UpdateSubConnState(scs[4], balancer.SubConnState{ConnectivityState: connectivity.Ready}) }() // Extends to newly created subconn. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[4]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } elapsed = time.Now().Sub(start) if elapsed < delay { t.Fatalf("gcpPicker.Pick returns before subconn became active") } if elapsed > delay+margin { t.Fatalf("gcpPicker.Pick waited too long after subcon became active: %v, want <=%v", delay+margin-elapsed, margin) } // Cycles to the first subconn. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.TODO()}) if want := scs[0]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } } func TestRoundRobinBindShouldNotBlockOtherCalls(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() // A slice to store all SubConns created by gcpBalancer's ClientConn. scs := []*mocks.MockSubConn{} mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().MinTimes(1) newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() scs = append(scs, newSC) return newSC, nil }).Times(3) b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. minSize := 3 streamsWatermark := 10 b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: uint32(minSize), MaxSize: 10, MaxConcurrentStreamsLowWatermark: uint32(streamsWatermark), BindPickStrategy: pb.ChannelPoolConfig_ROUND_ROBIN, }, Method: []*pb.MethodConfig{ { Name: []string{"dummyService/createSession"}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BIND, AffinityKey: "dummykey", }, }, }, }, }, }) if want := minSize; len(b.scRefs) != want { t.Fatalf("gcpBalancer scRefs length is %v, want %v", len(b.scRefs), want) } // Make subConn 1 ready. b.UpdateSubConnState(scs[1], balancer.SubConnState{ConnectivityState: connectivity.Ready}) delay := time.Millisecond * 345 // Bring other subconns to ready with some delay. This should block picking for the bind call // below for at least that amount of time. go func() { time.Sleep(delay) b.UpdateSubConnState(scs[0], balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(scs[2], balancer.SubConnState{ConnectivityState: connectivity.Ready}) }() affinityPickComplete := false wg := &sync.WaitGroup{} wg.Add(1) go func() { wg.Done() // Expect 0 subconn because the picker should pick even non-ready subcons for binding calls in a round-robin manner. // This is expected to wait until the subconn 0 is ready. pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: context.Background()}) if want := scs[0]; pr.SubConn != want || err != nil { t.Errorf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } affinityPickComplete = true }() wg.Wait() // This pick should not wait and return subconn 1 immediately. // Expect picker will pick the only ready subconn for non-binding call. pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/noAffinity", Ctx: context.Background()}) if want := scs[1]; pr.SubConn != want || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } // Expect the pick for no affinity call is made before createSession pick is made. I.e., without waiting. if affinityPickComplete { t.Fatalf("gcpPicker.Pick waited for previous bind pick to be made. No delay expected.") } } func TestRoundRobinBindShouldRespectDeadlineAndCancellation(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() // A slice to store all SubConns created by gcpBalancer's ClientConn. scs := []*mocks.MockSubConn{} mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().MinTimes(1) newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() scs = append(scs, newSC) return newSC, nil }).Times(3) b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate ClientConn calls UpdateClientConnState with the config provided to Dial. minSize := 3 streamsWatermark := 10 b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{}, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: uint32(minSize), MaxSize: 10, MaxConcurrentStreamsLowWatermark: uint32(streamsWatermark), BindPickStrategy: pb.ChannelPoolConfig_ROUND_ROBIN, }, Method: []*pb.MethodConfig{ { Name: []string{"dummyService/createSession"}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BIND, AffinityKey: "dummykey", }, }, }, }, }, }) if want := minSize; len(b.scRefs) != want { t.Fatalf("gcpBalancer scRefs length is %v, want %v", len(b.scRefs), want) } // Make subConn 1 ready so that we don't end up with errPicker. b.UpdateSubConnState(scs[2], balancer.SubConnState{ConnectivityState: connectivity.Ready}) timeout := time.Millisecond * 30 margin := time.Millisecond * 10 delay := time.Millisecond * 345 // Bring other subconns to ready with some delay. This should block picking for the bind call // below for at least that amount of time. We need to make subconns ready so that the picks // below don't hang forever. go func() { time.Sleep(delay) b.UpdateSubConnState(scs[0], balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(scs[1], balancer.SubConnState{ConnectivityState: connectivity.Ready}) }() start := time.Now() cCtx, cCancel := context.WithCancel(context.Background()) defer cCancel() go func() { time.Sleep(timeout) cCancel() }() pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: cCtx}) if want := scs[0]; pr.SubConn != want || err != nil { t.Errorf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } if elapsed := time.Now().Sub(start); elapsed > timeout+margin { t.Fatalf("gcpPicker.Pick did not respect cancellation, took: %v, want <=%v", elapsed, timeout+margin) } start = time.Now() dCtx, dCancel := context.WithTimeout(context.Background(), timeout) defer dCancel() pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: "dummyService/createSession", Ctx: dCtx}) if want := scs[1]; pr.SubConn != want || err != nil { t.Errorf("gcpPicker.Pick returns %v, %v, want: %v, nil", pr.SubConn, err, want) } if elapsed := time.Now().Sub(start); elapsed > timeout+margin { t.Fatalf("gcpPicker.Pick did not respect deadline, took: %v, want <=%v", elapsed, timeout+margin) } } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/gcp_interceptor.go000066400000000000000000000062341457366620600226220ustar00rootroot00000000000000/* * * Copyright 2019 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 grpcgcp import ( "context" "sync" "google.golang.org/grpc" ) type key int var gcpKey key type gcpContext struct { // request message used for pre-process of an affinity call reqMsg interface{} // response message used for post-process of an affinity call replyMsg interface{} } // GCPUnaryClientInterceptor intercepts the execution of a unary RPC // and injects necessary information to be used by the picker. func GCPUnaryClientInterceptor( ctx context.Context, method string, req interface{}, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption, ) error { gcpCtx := &gcpContext{ reqMsg: req, replyMsg: reply, } ctx = context.WithValue(ctx, gcpKey, gcpCtx) return invoker(ctx, method, req, reply, cc, opts...) } // GCPStreamClientInterceptor intercepts the execution of a client streaming RPC // and injects necessary information to be used by the picker. func GCPStreamClientInterceptor( ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption, ) (grpc.ClientStream, error) { // This constructor does not create a real ClientStream, // it only stores all parameters and let SendMsg() to create ClientStream. cs := &gcpClientStream{ ctx: ctx, desc: desc, cc: cc, method: method, streamer: streamer, opts: opts, } cs.cond = sync.NewCond(cs) return cs, nil } type gcpClientStream struct { sync.Mutex grpc.ClientStream cond *sync.Cond initStreamErr error ctx context.Context desc *grpc.StreamDesc cc *grpc.ClientConn method string streamer grpc.Streamer opts []grpc.CallOption } func (cs *gcpClientStream) SendMsg(m interface{}) error { cs.Lock() // Initialize underlying ClientStream when getting the first request. if cs.ClientStream == nil { ctx := context.WithValue(cs.ctx, gcpKey, &gcpContext{reqMsg: m}) realCS, err := cs.streamer(ctx, cs.desc, cs.cc, cs.method, cs.opts...) if err != nil { cs.initStreamErr = err cs.Unlock() cs.cond.Broadcast() return err } cs.ClientStream = realCS } cs.Unlock() cs.cond.Broadcast() return cs.ClientStream.SendMsg(m) } func (cs *gcpClientStream) RecvMsg(m interface{}) error { // If RecvMsg is called before SendMsg, it should wait until cs.ClientStream // is initialized or the initialization failed. cs.Lock() for cs.initStreamErr == nil && cs.ClientStream == nil { cs.cond.Wait() } if cs.initStreamErr != nil { cs.Unlock() return cs.initStreamErr } cs.Unlock() return cs.ClientStream.RecvMsg(m) } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/gcp_interceptor_test.go000066400000000000000000000177201457366620600236630ustar00rootroot00000000000000/* * * Copyright 2019 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 grpcgcp import ( "context" "fmt" "sync" "testing" "time" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/mocks" "github.com/golang/mock/gomock" "github.com/google/go-cmp/cmp" "google.golang.org/grpc" ) func TestGCPUnaryClientInterceptor(t *testing.T) { ctx := context.TODO() wantMethod := "someMethod" wantReq := "requestMessage" wantRepl := "replyMessage" wantGCPCtx := &gcpContext{ reqMsg: wantReq, replyMsg: wantRepl, } wantCC := &grpc.ClientConn{} wantOpts := []grpc.CallOption{grpc.CallContentSubtype("someSubtype"), grpc.MaxCallRecvMsgSize(42)} invCalled := false var gotCtx context.Context gotMethod := "" var gotReq, gotRepl interface{} var gotCC *grpc.ClientConn gotOpts := []grpc.CallOption{} inv := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, opts ...grpc.CallOption) error { invCalled = true gotCtx = ctx gotMethod = method gotReq = req gotRepl = reply gotCC = cc gotOpts = opts return nil } if err := GCPUnaryClientInterceptor(ctx, wantMethod, wantReq, wantRepl, wantCC, inv, wantOpts...); err != nil { t.Fatalf("GCPUnaryClientInterceptor(...) returned error: %v, want: nil", err) } if !invCalled { t.Fatalf("provided grpc.UnaryInvoker function was not called") } gotGCPCtx, hasGCPCtx := gotCtx.Value(gcpKey).(*gcpContext) if !hasGCPCtx { t.Errorf("provided grpc.UnaryInvoker function was called with context without gcpContext") } else if diff := cmp.Diff(wantGCPCtx, gotGCPCtx, cmp.AllowUnexported(gcpContext{})); diff != "" { t.Errorf("provided grpc.UnaryInvoker function was called with unexpected gcpContext (-want, +got):\n%s", diff) } if gotMethod != wantMethod { t.Errorf("provided grpc.UnaryInvoker function was called with unexpected method: %s, want: %s", gotMethod, wantMethod) } if gotReq != wantReq { t.Errorf("provided grpc.UnaryInvoker function was called with unexpected request: %s, want: %s", gotReq, wantReq) } if gotRepl != wantRepl { t.Errorf("provided grpc.UnaryInvoker function was called with unexpected response: %s, want: %s", gotRepl, wantRepl) } if gotCC != wantCC { t.Errorf("provided grpc.UnaryInvoker function was called with unexpected ClientConn: %v, want: %v", gotCC, wantCC) } if diff := cmp.Diff(wantOpts, gotOpts); diff != "" { t.Errorf("provided grpc.UnaryInvoker function was called with unexpected options (-want, +got):\n%s", diff) } } type strictMatcher struct { gomock.Matcher matchWith interface{} } func (sm *strictMatcher) Matches(x interface{}) bool { return sm.matchWith == x } func (sm *strictMatcher) String() string { return fmt.Sprintf("at address %p: %v", &sm.matchWith, sm.matchWith) } type fakeResp struct{} func TestGCPStreamClientInterceptor(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() ctx := context.TODO() wantMethod := "someMethod" wantReq := "someRequest" wantRes := &fakeResp{} wantGCPCtx := &gcpContext{ reqMsg: wantReq, } wantSD := &grpc.StreamDesc{} wantCC := &grpc.ClientConn{} wantOpts := []grpc.CallOption{grpc.CallContentSubtype("someSubtype"), grpc.MaxCallRecvMsgSize(42)} streamerCalled := false streamer := func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { streamerCalled = true gotGCPCtx, hasGCPCtx := ctx.Value(gcpKey).(*gcpContext) if !hasGCPCtx { t.Errorf("grpc.Streamer called with context without gcpContext") } else if diff := cmp.Diff(wantGCPCtx, gotGCPCtx, cmp.AllowUnexported(gcpContext{})); diff != "" { t.Errorf("grpc.Streamer called with unexpected gcpContext (-want, +got):\n%s", diff) } if desc != wantSD { t.Errorf("grpc.Streamer called with unexpected StreamDesc: %v, want: %v", desc, wantSD) } if cc != wantCC { t.Errorf("grpc.Streamer called with unexpected ClientConn: %v, want: %v", cc, wantCC) } if method != wantMethod { t.Errorf("grpc.Streamer called with unexpected method: %v, want: %v", method, wantMethod) } if diff := cmp.Diff(wantOpts, opts); diff != "" { t.Errorf("grpc.Streamer called with unexpected options (-want, +got):\n%s", diff) } mockCS := mocks.NewMockClientStream(mockCtrl) mockCS.EXPECT().SendMsg(gomock.Eq(wantReq)).Times(1) mockCS.EXPECT().RecvMsg(&strictMatcher{matchWith: wantRes}).Times(1) return mockCS, nil } cs, err := GCPStreamClientInterceptor( ctx, wantSD, wantCC, wantMethod, streamer, wantOpts..., ) if err != nil { t.Fatalf("GCPStreamClientInterceptor(...) returned error: %v, want: nil", err) } if streamerCalled { t.Fatalf("GCPStreamClientInterceptor(...) unexpectedly called grpc.Streamer on init") } if err := cs.SendMsg(wantReq); err != nil { t.Fatalf("SendMsg(wantReq) returned error: %v, want: nil", err) } if !streamerCalled { t.Fatalf("SendMsg(wantReq) must have been called grpc.Streamer") } if err := cs.RecvMsg(wantRes); err != nil { t.Fatalf("RecvMsg() returned error: %v, want: nil", err) } } func TestGCPStreamClientInterceptorCallingReadBeforeSend(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() ctx := context.TODO() wantMethod := "someMethod" wantReq := "someRequest" wantRes := &fakeResp{} wantGCPCtx := &gcpContext{ reqMsg: wantReq, } wantSD := &grpc.StreamDesc{} wantCC := &grpc.ClientConn{} wantOpts := []grpc.CallOption{grpc.CallContentSubtype("someSubtype"), grpc.MaxCallRecvMsgSize(42)} streamerCalled := false streamer := func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { streamerCalled = true gotGCPCtx, hasGCPCtx := ctx.Value(gcpKey).(*gcpContext) if !hasGCPCtx { t.Errorf("grpc.Streamer called with context without gcpContext") } else if diff := cmp.Diff(wantGCPCtx, gotGCPCtx, cmp.AllowUnexported(gcpContext{})); diff != "" { t.Errorf("grpc.Streamer called with unexpected gcpContext (-want, +got):\n%s", diff) } if desc != wantSD { t.Errorf("grpc.Streamer called with unexpected StreamDesc: %v, want: %v", desc, wantSD) } if cc != wantCC { t.Errorf("grpc.Streamer called with unexpected ClientConn: %v, want: %v", cc, wantCC) } if method != wantMethod { t.Errorf("grpc.Streamer called with unexpected method: %v, want: %v", method, wantMethod) } if diff := cmp.Diff(wantOpts, opts); diff != "" { t.Errorf("grpc.Streamer called with unexpected options (-want, +got):\n%s", diff) } mockCS := mocks.NewMockClientStream(mockCtrl) mockCS.EXPECT().SendMsg(gomock.Eq(wantReq)).Times(1) mockCS.EXPECT().RecvMsg(&strictMatcher{matchWith: wantRes}).Times(1) return mockCS, nil } cs, err := GCPStreamClientInterceptor( ctx, wantSD, wantCC, wantMethod, streamer, wantOpts..., ) if err != nil { t.Fatalf("GCPStreamClientInterceptor(...) returned error: %v, want: nil", err) } if streamerCalled { t.Fatalf("GCPStreamClientInterceptor(...) unexpectedly called grpc.Streamer on init") } wg := &sync.WaitGroup{} wg.Add(1) received := &sync.WaitGroup{} received.Add(1) go func() { wg.Done() if err := cs.RecvMsg(wantRes); err != nil { t.Errorf("RecvMsg() returned error: %v, want: nil", err) } received.Done() }() wg.Wait() time.Sleep(time.Millisecond) if err := cs.SendMsg(wantReq); err != nil { t.Fatalf("SendMsg(wantReq) returned error: %v, want: nil", err) } if !streamerCalled { t.Fatalf("SendMsg(wantReq) must have been called grpc.Streamer") } received.Wait() } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/gcp_logger.go000066400000000000000000000045711457366620600215450ustar00rootroot00000000000000package grpcgcp import ( "strings" "google.golang.org/grpc/grpclog" ) const ( FINE = 90 FINEST = 99 ) var compLogger = grpclog.Component("grpcgcp") type gcpLogger struct { logger grpclog.LoggerV2 prefix string } // Make sure gcpLogger implements grpclog.LoggerV2. var _ grpclog.LoggerV2 = (*gcpLogger)(nil) func NewGCPLogger(logger grpclog.LoggerV2, prefix string) *gcpLogger { p := prefix if !strings.HasSuffix(p, " ") { p = p + " " } return &gcpLogger{ logger: logger, prefix: p, } } // Error implements grpclog.LoggerV2. func (l *gcpLogger) Error(args ...interface{}) { l.logger.Error(append([]interface{}{l.prefix}, args)...) } // Errorf implements grpclog.LoggerV2. func (l *gcpLogger) Errorf(format string, args ...interface{}) { l.logger.Errorf(l.prefix+format, args...) } // Errorln implements grpclog.LoggerV2. func (l *gcpLogger) Errorln(args ...interface{}) { l.logger.Errorln(append([]interface{}{l.prefix}, args)...) } // Fatal implements grpclog.LoggerV2. func (l *gcpLogger) Fatal(args ...interface{}) { l.logger.Fatal(append([]interface{}{l.prefix}, args)...) } // Fatalf implements grpclog.LoggerV2. func (l *gcpLogger) Fatalf(format string, args ...interface{}) { l.logger.Fatalf(l.prefix+format, args...) } // Fatalln implements grpclog.LoggerV2. func (l *gcpLogger) Fatalln(args ...interface{}) { l.Fatalln(append([]interface{}{l.prefix}, args)...) } // Info implements grpclog.LoggerV2. func (l *gcpLogger) Info(args ...interface{}) { l.logger.Info(append([]interface{}{l.prefix}, args)...) } // Infof implements grpclog.LoggerV2. func (l *gcpLogger) Infof(format string, args ...interface{}) { l.logger.Infof(l.prefix+format, args...) } // Infoln implements grpclog.LoggerV2. func (l *gcpLogger) Infoln(args ...interface{}) { l.logger.Infoln(append([]interface{}{l.prefix}, args)...) } // V implements grpclog.LoggerV2. func (l *gcpLogger) V(level int) bool { return l.logger.V(level) } // Warning implements grpclog.LoggerV2. func (l *gcpLogger) Warning(args ...interface{}) { l.logger.Warning(append([]interface{}{l.prefix}, args)...) } // Warningf implements grpclog.LoggerV2. func (l *gcpLogger) Warningf(format string, args ...interface{}) { l.logger.Warningf(l.prefix+format, args...) } // Warningln implements grpclog.LoggerV2. func (l *gcpLogger) Warningln(args ...interface{}) { l.logger.Warningln(append([]interface{}{l.prefix}, args)...) } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/gcp_multiendpoint.go000066400000000000000000000312611457366620600231550ustar00rootroot00000000000000/* * * Copyright 2023 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 grpcgcp import ( "context" "fmt" "sync" "sync/atomic" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/grpclog" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" ) var gmeCounter uint32 type contextMEKey int var meKey contextMEKey // NewMEContext returns a new Context that carries Multiendpoint name. func NewMEContext(ctx context.Context, name string) context.Context { return context.WithValue(ctx, meKey, name) } // FromMEContext returns the MultiEndpoint name stored in ctx, if any. func FromMEContext(ctx context.Context) (string, bool) { name, ok := ctx.Value(meKey).(string) return name, ok } // GCPMultiEndpoint holds the state of MultiEndpoints-enabled gRPC client connection. // // The purposes of GCPMultiEndpoint are: // // - Fallback to an alternative endpoint (host:port) of a gRPC service when the original // endpoint is completely unavailable. // - Be able to route an RPC call to a specific group of endpoints. // - Be able to reconfigure endpoints in runtime. // // A group of endpoints is called a [multiendpoint.MultiEndpoint] and is essentially a list of endpoints // where priority is defined by the position in the list with the first endpoint having top // priority. A MultiEndpoint tracks endpoints' availability. When a MultiEndpoint is picked for an // RPC call, it picks the top priority endpoint that is currently available. More information on the // [multiendpoint.MultiEndpoint]. // // GCPMultiEndpoint can have one or more MultiEndpoint identified by its name -- arbitrary // string provided in the [GCPMultiEndpointOptions] when configuring MultiEndpoints. This name // can be used to route an RPC call to this MultiEndpoint by using the [NewMEContext]. // // GCPMultiEndpoint uses [GCPMultiEndpointOptions] for initial configuration. // An updated configuration can be provided at any time later using [UpdateMultiEndpoints]. // // Example: // // Let's assume we have a service with read and write operations and the following backends: // // - service.example.com -- the main set of backends supporting all operations // - service-fallback.example.com -- read-write replica supporting all operations // - ro-service.example.com -- read-only replica supporting only read operations // // Example configuration: // // - MultiEndpoint named "default" with endpoints: // // 1. service.example.com:443 // // 2. service-fallback.example.com:443 // // - MultiEndpoint named "read" with endpoints: // // 1. ro-service.example.com:443 // // 2. service-fallback.example.com:443 // // 3. service.example.com:443 // // With the configuration above GCPMultiEndpoint will use the "default" MultiEndpoint by // default. It means that RPC calls by default will use the main endpoint and if it is not available // then the read-write replica. // // To offload some read calls to the read-only replica we can specify "read" MultiEndpoint in the // context. Then these calls will use the read-only replica endpoint and if it is not available // then the read-write replica and if it is also not available then the main endpoint. // // GCPMultiEndpoint creates a [grpcgcp] connection pool for every unique // endpoint. For the example above three connection pools will be created. // // [GCPMultiEndpoint] implements [grpc.ClientConnInterface] and can be used // as a [grpc.ClientConn] when creating gRPC clients. type GCPMultiEndpoint struct { mu sync.RWMutex defaultName string mes map[string]multiendpoint.MultiEndpoint pools map[string]*monitoredConn opts []grpc.DialOption gcpConfig *pb.ApiConfig dialFunc func(ctx context.Context, target string, dopts ...grpc.DialOption) (*grpc.ClientConn, error) log grpclog.LoggerV2 grpc.ClientConnInterface } // Make sure GCPMultiEndpoint implements grpc.ClientConnInterface. var _ grpc.ClientConnInterface = (*GCPMultiEndpoint)(nil) func (gme *GCPMultiEndpoint) Invoke(ctx context.Context, method string, args interface{}, reply interface{}, opts ...grpc.CallOption) error { return gme.pickConn(ctx).Invoke(ctx, method, args, reply, opts...) } func (gme *GCPMultiEndpoint) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { return gme.pickConn(ctx).NewStream(ctx, desc, method, opts...) } func (gme *GCPMultiEndpoint) pickConn(ctx context.Context) *grpc.ClientConn { name, ok := FromMEContext(ctx) me, ook := gme.mes[name] if !ok || !ook { me = gme.mes[gme.defaultName] } return gme.pools[me.Current()].conn } func (gme *GCPMultiEndpoint) Close() error { var errs multiError for e, mc := range gme.pools { mc.stopMonitoring() if err := mc.conn.Close(); err != nil { errs = append(errs, err) gme.log.Errorf("error while closing the pool for %q endpoint: %v", e, err) } if gme.log.V(FINE) { gme.log.Infof("closed channel pool for %q endpoint.", e) } } return errs.Combine() } func (gme *GCPMultiEndpoint) GCPConfig() *pb.ApiConfig { return proto.Clone(gme.gcpConfig).(*pb.ApiConfig) } // GCPMultiEndpointOptions holds options to construct a MultiEndpoints-enabled gRPC client // connection. type GCPMultiEndpointOptions struct { // Regular gRPC-GCP configuration to be applied to every endpoint. GRPCgcpConfig *pb.ApiConfig // Map of MultiEndpoints where key is the MultiEndpoint name. MultiEndpoints map[string]*multiendpoint.MultiEndpointOptions // Name of the default MultiEndpoint. Default string // Func to dial grpc ClientConn. DialFunc func(ctx context.Context, target string, dopts ...grpc.DialOption) (*grpc.ClientConn, error) } // NewGCPMultiEndpoint creates new [GCPMultiEndpoint] -- MultiEndpoints-enabled gRPC client // connection. // // Deprecated: use NewGCPMultiEndpoint. func NewGcpMultiEndpoint(meOpts *GCPMultiEndpointOptions, opts ...grpc.DialOption) (*GCPMultiEndpoint, error) { return NewGCPMultiEndpoint(meOpts, opts...) } // NewGCPMultiEndpoint creates new [GCPMultiEndpoint] -- MultiEndpoints-enabled gRPC client // connection. // // [GCPMultiEndpoint] implements [grpc.ClientConnInterface] and can be used // as a [grpc.ClientConn] when creating gRPC clients. func NewGCPMultiEndpoint(meOpts *GCPMultiEndpointOptions, opts ...grpc.DialOption) (*GCPMultiEndpoint, error) { // Read config, create multiendpoints and pools. o, err := makeOpts(meOpts, opts) if err != nil { return nil, err } gme := &GCPMultiEndpoint{ mes: make(map[string]multiendpoint.MultiEndpoint), pools: make(map[string]*monitoredConn), defaultName: meOpts.Default, opts: o, gcpConfig: proto.Clone(meOpts.GRPCgcpConfig).(*pb.ApiConfig), dialFunc: meOpts.DialFunc, log: NewGCPLogger(compLogger, fmt.Sprintf("[GCPMultiEndpoint #%d]", atomic.AddUint32(&gmeCounter, 1))), } if gme.dialFunc == nil { gme.dialFunc = func(_ context.Context, target string, opts ...grpc.DialOption) (*grpc.ClientConn, error) { return grpc.Dial(target, opts...) } } if err := gme.UpdateMultiEndpoints(meOpts); err != nil { return nil, err } return gme, nil } func makeOpts(meOpts *GCPMultiEndpointOptions, opts []grpc.DialOption) ([]grpc.DialOption, error) { grpcGCPjsonConfig, err := protojson.Marshal(meOpts.GRPCgcpConfig) if err != nil { return nil, err } o := append([]grpc.DialOption{}, opts...) o = append(o, []grpc.DialOption{ grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingConfig": [{"%s":%s}]}`, Name, string(grpcGCPjsonConfig))), grpc.WithChainUnaryInterceptor(GCPUnaryClientInterceptor), grpc.WithChainStreamInterceptor(GCPStreamClientInterceptor), }...) return o, nil } type monitoredConn struct { endpoint string conn *grpc.ClientConn gme *GCPMultiEndpoint cancel context.CancelFunc } func newMonitoredConn(endpoint string, conn *grpc.ClientConn, gme *GCPMultiEndpoint) (mc *monitoredConn) { ctx, cancel := context.WithCancel(context.Background()) mc = &monitoredConn{ endpoint: endpoint, conn: conn, gme: gme, cancel: cancel, } go mc.monitor(ctx) return } func (mc *monitoredConn) notify(state connectivity.State) { if mc.gme.log.V(FINE) { mc.gme.log.Infof("%q endpoint state changed to %v", mc.endpoint, state) } // Inform all multiendpoints. mc.gme.mu.RLock() for _, me := range mc.gme.mes { me.SetEndpointAvailability(mc.endpoint, state == connectivity.Ready) } mc.gme.mu.RUnlock() } func (mc *monitoredConn) monitor(ctx context.Context) { for { currentState := mc.conn.GetState() mc.notify(currentState) if !mc.conn.WaitForStateChange(ctx, currentState) { break } } } func (mc *monitoredConn) stopMonitoring() { mc.cancel() } // UpdateMultiEndpoints reconfigures MultiEndpoints. // // MultiEndpoints are matched with the current ones by name. // // - If a current MultiEndpoint is missing in the updated list, the MultiEndpoint will be // removed. // - A new MultiEndpoint will be created for every new name in the list. // - For an existing MultiEndpoint only its endpoints will be updated (no recovery timeout // change). // // Endpoints are matched by the endpoint address (usually in the form of address:port). // // - If an existing endpoint is not used by any MultiEndpoint in the updated list, then the // connection poll for this endpoint will be shutdown. // - A connection pool will be created for every new endpoint. // - For an existing endpoint nothing will change (the connection pool will not be re-created, // thus no connection credentials change, nor connection configuration change). func (gme *GCPMultiEndpoint) UpdateMultiEndpoints(meOpts *GCPMultiEndpointOptions) error { gme.mu.Lock() defer gme.mu.Unlock() if _, ok := meOpts.MultiEndpoints[meOpts.Default]; !ok { return fmt.Errorf("default MultiEndpoint %q missing options", meOpts.Default) } validPools := make(map[string]bool) for _, meo := range meOpts.MultiEndpoints { for _, e := range meo.Endpoints { validPools[e] = true } } // Add missing pools. for e := range validPools { if _, ok := gme.pools[e]; !ok { // This creates a ClientConn with the gRPC-GCP balancer managing connection pool. conn, err := gme.dialFunc(context.Background(), e, gme.opts...) if err != nil { return err } if gme.log.V(FINE) { gme.log.Infof("created new channel pool for %q endpoint.", e) } gme.pools[e] = newMonitoredConn(e, conn, gme) } } // Add new multi-endpoints and update existing. for name, meo := range meOpts.MultiEndpoints { if me, ok := gme.mes[name]; ok { // Updating existing MultiEndpoint. me.SetEndpoints(meo.Endpoints) continue } // Add new MultiEndpoint. if gme.log.V(FINE) { gme.log.Infof("creating new %q multiendpoint.", name) } me, err := multiendpoint.NewMultiEndpoint(meo) if err != nil { return err } gme.mes[name] = me } gme.defaultName = meOpts.Default // Remove obsolete MultiEndpoints. for name := range gme.mes { if _, ok := meOpts.MultiEndpoints[name]; !ok { delete(gme.mes, name) if gme.log.V(FINE) { gme.log.Infof("removed obsolete %q multiendpoint.", name) } } } // Remove obsolete pools. for e, mc := range gme.pools { if _, ok := validPools[e]; !ok { if err := mc.conn.Close(); err != nil { gme.log.Errorf("error while closing the pool for %q endpoint: %v", e, err) } if gme.log.V(FINE) { gme.log.Infof("closed channel pool for %q endpoint.", e) } mc.stopMonitoring() delete(gme.pools, e) } } // Trigger status update. for e, mc := range gme.pools { s := mc.conn.GetState() for _, me := range gme.mes { me.SetEndpointAvailability(e, s == connectivity.Ready) } } return nil } type multiError []error func (m multiError) Error() string { s, n := "", 0 for _, e := range m { if e != nil { if n == 0 { s = e.Error() } n++ } } switch n { case 0: return "(0 errors)" case 1: return s case 2: return s + " (and 1 other error)" } return fmt.Sprintf("%s (and %d other errors)", s, n-1) } func (m multiError) Combine() error { if len(m) == 0 { return nil } return m } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/gcp_picker.go000066400000000000000000000205011457366620600215320ustar00rootroot00000000000000/* * * Copyright 2019 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 grpcgcp import ( "context" "fmt" "reflect" "strings" "sync" "time" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" "google.golang.org/grpc/balancer" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/status" ) // Deadline exceeded gRPC error caused by client-side context reached deadline. var deErr = status.Error(codes.DeadlineExceeded, context.DeadlineExceeded.Error()) func newGCPPicker(readySCRefs []*subConnRef, gb *gcpBalancer) balancer.Picker { gp := &gcpPicker{ gb: gb, scRefs: readySCRefs, } gp.log = NewGCPLogger(gb.log, fmt.Sprintf("[gcpPicker %p]", gp)) return gp } type gcpPicker struct { gb *gcpBalancer mu sync.Mutex scRefs []*subConnRef log grpclog.LoggerV2 } func (p *gcpPicker) Pick(info balancer.PickInfo) (balancer.PickResult, error) { if len(p.scRefs) <= 0 { if p.log.V(FINEST) { p.log.Info("returning balancer.ErrNoSubConnAvailable as no subconns are available.") } return balancer.PickResult{}, balancer.ErrNoSubConnAvailable } ctx := info.Ctx gcpCtx, hasGCPCtx := ctx.Value(gcpKey).(*gcpContext) boundKey := "" locator := "" var cmd grpc_gcp.AffinityConfig_Command if mcfg, ok := p.gb.methodCfg[info.FullMethodName]; ok { locator = mcfg.GetAffinityKey() cmd = mcfg.GetCommand() if hasGCPCtx && (cmd == grpc_gcp.AffinityConfig_BOUND || cmd == grpc_gcp.AffinityConfig_UNBIND) { a, err := getAffinityKeysFromMessage(locator, gcpCtx.reqMsg) if err != nil { return balancer.PickResult{}, fmt.Errorf( "failed to retrieve affinity key from request message: %v", err) } boundKey = a[0] } } scRef, err := p.getAndIncrementSubConnRef(info.Ctx, boundKey, cmd) if err != nil { return balancer.PickResult{}, err } if scRef == nil { if p.log.V(FINEST) { p.log.Info("returning balancer.ErrNoSubConnAvailable as no SubConn was picked.") } return balancer.PickResult{}, balancer.ErrNoSubConnAvailable } callStarted := time.Now() // define callback for post process once call is done callback := func(info balancer.DoneInfo) { scRef.streamsDecr() p.detectUnresponsive(ctx, scRef, callStarted, info.Err) if info.Err != nil { return } switch cmd { case grpc_gcp.AffinityConfig_BIND: bindKeys, err := getAffinityKeysFromMessage(locator, gcpCtx.replyMsg) if err == nil { for _, bk := range bindKeys { p.gb.bindSubConn(bk, scRef.subConn) } } case grpc_gcp.AffinityConfig_UNBIND: p.gb.unbindSubConn(boundKey) } } if p.log.V(FINEST) { p.log.Infof("picked SubConn: %p", scRef.subConn) } return balancer.PickResult{SubConn: scRef.subConn, Done: callback}, nil } // unresponsiveWindow returns channel pool's unresponsiveDetectionMs multiplied // by 2^(refresh count since last response) as a time.Duration. This provides // exponential backoff when RPCs keep deadline exceeded after consecutive reconnections. func (p *gcpPicker) unresponsiveWindow(scRef *subConnRef) time.Duration { factor := uint32(1 << scRef.refreshCnt) return time.Millisecond * time.Duration(factor*p.gb.cfg.GetChannelPool().GetUnresponsiveDetectionMs()) } func (p *gcpPicker) detectUnresponsive(ctx context.Context, scRef *subConnRef, callStarted time.Time, rpcErr error) { if !p.gb.unresponsiveDetection { return } // Treat as a response from the server if deadline exceeded was not caused by client side context reached deadline. if dl, ok := ctx.Deadline(); rpcErr == nil || status.Code(rpcErr) != codes.DeadlineExceeded || rpcErr.Error() != deErr.Error() || !ok || dl.After(time.Now()) { scRef.gotResp() return } if callStarted.Before(scRef.lastResp) { return } // Increment deadline exceeded calls and check if there were enough deadline // exceeded calls and enough time passed since last response to trigger refresh. if scRef.deCallsInc() >= p.gb.cfg.GetChannelPool().GetUnresponsiveCalls() && scRef.lastResp.Before(time.Now().Add(-p.unresponsiveWindow(scRef))) { p.gb.refresh(scRef) } } func (p *gcpPicker) getAndIncrementSubConnRef(ctx context.Context, boundKey string, cmd grpc_gcp.AffinityConfig_Command) (*subConnRef, error) { if cmd == grpc_gcp.AffinityConfig_BIND && p.gb.cfg.GetChannelPool().GetBindPickStrategy() == grpc_gcp.ChannelPoolConfig_ROUND_ROBIN { scRef := p.gb.getSubConnRoundRobin(ctx) if p.log.V(FINEST) { p.log.Infof("picking SubConn for round-robin bind: %p", scRef.subConn) } scRef.streamsIncr() return scRef, nil } p.mu.Lock() defer p.mu.Unlock() scRef, err := p.getSubConnRef(boundKey) if err != nil { return nil, err } if scRef != nil { scRef.streamsIncr() } return scRef, nil } // getSubConnRef returns the subConnRef object that contains the subconn // ready to be used by picker. // Must be called holding the picker mutex lock. func (p *gcpPicker) getSubConnRef(boundKey string) (*subConnRef, error) { if boundKey != "" { if ref, ok := p.gb.getReadySubConnRef(boundKey); ok { return ref, nil } } return p.getLeastBusySubConnRef() } // Must be called holding the picker mutex lock. func (p *gcpPicker) getLeastBusySubConnRef() (*subConnRef, error) { minScRef := p.scRefs[0] minStreamsCnt := minScRef.getStreamsCnt() for _, scRef := range p.scRefs { if scRef.getStreamsCnt() < minStreamsCnt { minStreamsCnt = scRef.getStreamsCnt() minScRef = scRef } } // If the least busy connection still has capacity, use it if minStreamsCnt < int32(p.gb.cfg.GetChannelPool().GetMaxConcurrentStreamsLowWatermark()) { return minScRef, nil } if p.gb.cfg.GetChannelPool().GetMaxSize() == 0 || p.gb.getConnectionPoolSize() < int(p.gb.cfg.GetChannelPool().GetMaxSize()) { // Ask balancer to create new subconn when all current subconns are busy and // the connection pool still has capacity (either unlimited or maxSize is not reached). p.gb.newSubConn() // Let this picker return ErrNoSubConnAvailable because it needs some time // for the subconn to be READY. return nil, balancer.ErrNoSubConnAvailable } // If no capacity for the pool size and every connection reachs the soft limit, // Then picks the least busy one anyway. return minScRef, nil } func keysFromMessage(val reflect.Value, path []string, start int) ([]string, error) { if val.Kind() == reflect.Pointer || val.Kind() == reflect.Interface { val = val.Elem() } if len(path) == start { if val.Kind() != reflect.String { return nil, fmt.Errorf("cannot get string value from %q which is %q", strings.Join(path, "."), val.Kind()) } return []string{val.String()}, nil } if val.Kind() != reflect.Struct { return nil, fmt.Errorf("path %q traversal error: cannot lookup field %q (index %d in the path) in a %q value", strings.Join(path, "."), path[start], start, val.Kind()) } valField := val.FieldByName(strings.Title(path[start])) if valField.Kind() != reflect.Slice { return keysFromMessage(valField, path, start+1) } keys := []string{} for i := 0; i < valField.Len(); i++ { kk, err := keysFromMessage(valField.Index(i), path, start+1) if err != nil { return keys, err } keys = append(keys, kk...) } return keys, nil } // getAffinityKeysFromMessage retrieves the affinity key(s) from proto message using // the key locator defined in the affinity config. func getAffinityKeysFromMessage( locator string, msg interface{}, ) (affinityKeys []string, err error) { names := strings.Split(locator, ".") if len(names) == 0 { return nil, fmt.Errorf("empty affinityKey locator") } return keysFromMessage(reflect.ValueOf(msg), names, 0) } // NewErrPicker returns a picker that always returns err on Pick(). func newErrPicker(err error) balancer.Picker { return &errPicker{err: err} } type errPicker struct { err error // Pick() always returns this err. } func (p *errPicker) Pick(info balancer.PickInfo) (balancer.PickResult, error) { return balancer.PickResult{}, p.err } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/gcp_picker_test.go000066400000000000000000000525151457366620600226030ustar00rootroot00000000000000/* * * Copyright 2019 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 grpcgcp import ( "context" "fmt" "math/rand" "sync" "testing" "time" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/mocks" "github.com/golang/mock/gomock" "github.com/google/go-cmp/cmp" "google.golang.org/grpc/balancer" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/resolver" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" ) type testMsg struct { Key string NestedField *nestedField RepeatedField []*nestedField RepeatedString []string RepeatedInt []int } type nestedField struct { Key string RepeatedString []string } func TestGetKeyFromMessage(t *testing.T) { expectedRes := []string{"test_key"} msg := &testMsg{ Key: "test_key", NestedField: &nestedField{ Key: "test_nested_key", }, } locator := "key" res, err := getAffinityKeysFromMessage(locator, msg) if err != nil { t.Fatalf("getAffinityKeysFromMessage failed: %v", err) } if diff := cmp.Diff(expectedRes, res); diff != "" { t.Fatalf("getAffinityKeysFromMessage returns unexpected diff (-want, +got):\n%s", diff) } } func TestGetNestedKeyFromMessage(t *testing.T) { expectedRes := []string{"test_nested_key"} msg := &testMsg{ Key: "test_key", NestedField: &nestedField{ Key: "test_nested_key", }, } locator := "nestedField.key" res, err := getAffinityKeysFromMessage(locator, msg) if err != nil { t.Fatalf("getAffinityKeysFromMessage failed: %v", err) } if diff := cmp.Diff(expectedRes, res); diff != "" { t.Fatalf("getAffinityKeysFromMessage returns unexpected diff (-want, +got):\n%s", diff) } } func TestGetListOfKeysFromRepeatedStruct(t *testing.T) { msg := &testMsg{ Key: "test_key", RepeatedField: []*nestedField{ { Key: "key1", }, { Key: "key2", }, }, } expected := []string{"key1", "key2"} locator := "repeatedField.key" res, err := getAffinityKeysFromMessage(locator, msg) if err != nil { t.Fatalf("getAffinityKeysFromMessage failed: %v", err) } if diff := cmp.Diff(expected, res); diff != "" { t.Fatalf("getAffinityKeysFromMessage returns unexpected diff (-want, +got):\n%s", diff) } } func TestGetListOfKeysFromRepeatedString(t *testing.T) { msg := &testMsg{ Key: "test_key", RepeatedString: []string{ "key1", "key2", }, } expected := []string{"key1", "key2"} locator := "repeatedString" res, err := getAffinityKeysFromMessage(locator, msg) if err != nil { t.Fatalf("getAffinityKeysFromMessage failed: %v", err) } if diff := cmp.Diff(expected, res); diff != "" { t.Fatalf("getAffinityKeysFromMessage returns unexpected diff (-want, +got):\n%s", diff) } } func TestGetListOfKeysFromRepeatedStringInRepeatedStruct(t *testing.T) { msg := &testMsg{ Key: "test_key", RepeatedField: []*nestedField{ { RepeatedString: []string{"key1", "key2"}, }, { RepeatedString: []string{"key3", "key4"}, }, }, } expected := []string{"key1", "key2", "key3", "key4"} locator := "repeatedField.repeatedString" res, err := getAffinityKeysFromMessage(locator, msg) if err != nil { t.Fatalf("getAffinityKeysFromMessage failed: %v", err) } if diff := cmp.Diff(expected, res); diff != "" { t.Fatalf("getAffinityKeysFromMessage returns unexpected diff (-want, +got):\n%s", diff) } } func TestGetListOfKeysFromRepeatedInt(t *testing.T) { msg := &testMsg{ Key: "test_key", RepeatedInt: []int{42, 43}, } locator := "repeatedInt" expectedErr := fmt.Sprintf("cannot get string value from %q which is \"int\"", locator) _, err := getAffinityKeysFromMessage(locator, msg) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } } func TestGetKeyFromNilMessage(t *testing.T) { expectedErr := "path \"key\" traversal error: cannot lookup field \"key\" (index 0 in the path) in a \"invalid\" value" _, err := getAffinityKeysFromMessage("key", nil) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } } func TestGetKeyFromNonStructMessage(t *testing.T) { expectedErr := "path \"key\" traversal error: cannot lookup field \"key\" (index 0 in the path) in a \"int\" value" _, err := getAffinityKeysFromMessage("key", 42) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } } func TestInvalidKeyLocator(t *testing.T) { msg := &testMsg{ Key: "test_key", NestedField: &nestedField{ Key: "test_nested_key", }, RepeatedField: []*nestedField{ { Key: "test_nested_repeated_key1", RepeatedString: []string{"test_nested_repeated_key2"}, }, }, } locator := "invalidLocator" expectedErr := fmt.Sprintf("cannot get string value from %q which is \"invalid\"", locator) _, err := getAffinityKeysFromMessage(locator, msg) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } locator = "nestedField.invalidLocator" expectedErr = fmt.Sprintf("cannot get string value from %q which is \"invalid\"", locator) _, err = getAffinityKeysFromMessage(locator, msg) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } locator = "repeatedField.invalidLocator" expectedErr = fmt.Sprintf("cannot get string value from %q which is \"invalid\"", locator) _, err = getAffinityKeysFromMessage(locator, msg) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } locator = "repeatedField.repeatedString.invalidLocator" expectedErr = fmt.Sprintf("path %q traversal error: cannot lookup field \"invalidLocator\" (index 2 in the path) in a \"string\" value", locator) _, err = getAffinityKeysFromMessage(locator, msg) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } locator = "key.invalidLocator" expectedErr = fmt.Sprintf("path %q traversal error: cannot lookup field \"invalidLocator\" (index 1 in the path) in a \"string\" value", locator) _, err = getAffinityKeysFromMessage(locator, msg) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } locator = "nestedField.key.invalidLocator" expectedErr = fmt.Sprintf("path %q traversal error: cannot lookup field \"invalidLocator\" (index 2 in the path) in a \"string\" value", locator) _, err = getAffinityKeysFromMessage(locator, msg) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } locator = "repeatedField.key.invalidLocator" expectedErr = fmt.Sprintf("path %q traversal error: cannot lookup field \"invalidLocator\" (index 2 in the path) in a \"string\" value", locator) _, err = getAffinityKeysFromMessage(locator, msg) if err == nil || err.Error() != expectedErr { t.Fatalf("getAffinityKeysFromMessage returns wrong err: %v, want: %v", err, expectedErr) } } func TestPickSubConnWithLeastStreams(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() okSC := mocks.NewMockSubConn(mockCtrl) var scRefs = []*subConnRef{ { subConn: mocks.NewMockSubConn(mockCtrl), stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 1, }, { subConn: okSC, stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 0, }, { subConn: mocks.NewMockSubConn(mockCtrl), stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 3, }, { subConn: mocks.NewMockSubConn(mockCtrl), stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 5, }, } picker := newGCPPicker(scRefs, &gcpBalancer{ cfg: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MaxSize: 10, MaxConcurrentStreamsLowWatermark: 100, }, }, }, log: compLogger, }) ctx := context.Background() pr, err := picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: ctx}) sc := pr.SubConn if err != nil { t.Fatalf("gcpPicker.Pick returns err: %v", err) } if sc != okSC { t.Fatalf("gcpPicker.Pick returns wrong SubConn: %v, want: %v", sc, okSC) } } func TestPickNewSubConn(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockSC := mocks.NewMockSubConn(mockCtrl) var scRefs = []*subConnRef{ { subConn: mockSC, stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 100, }, } mockCC := mocks.NewMockClientConn(mockCtrl) newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().Times(1) mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).Return(newSC, nil).Times(1) mp := make(map[balancer.SubConn]*subConnRef) mp[mockSC] = scRefs[0] b := &gcpBalancer{ cc: mockCC, scRefs: mp, scStates: make(map[balancer.SubConn]connectivity.State), cfg: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MaxSize: 10, MaxConcurrentStreamsLowWatermark: 100, }, }, }, log: compLogger, } picker := newGCPPicker(scRefs, b) ctx := context.Background() pr, err := picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: ctx}) sc := pr.SubConn wantErr := balancer.ErrNoSubConnAvailable if sc != nil || err != wantErr { t.Fatalf("gcpPicker.Pick returns %v, _, %v, want: nil, _, %v", sc, err, wantErr) } if _, ok := b.scRefs[newSC]; !ok { t.Fatalf("Created SubConn is not stored in gcpBalancer.scRefs") } } func TestBindSubConn(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() scBusy := mocks.NewMockSubConn(mockCtrl) scIdle := mocks.NewMockSubConn(mockCtrl) scBusy.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() scIdle.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() scBusy.EXPECT().Connect().AnyTimes() scIdle.EXPECT().Connect().AnyTimes() mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mp := make(map[balancer.SubConn]*subConnRef) mp[scBusy] = &subConnRef{ subConn: scBusy, stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 5, } mp[scIdle] = &subConnRef{ subConn: scIdle, stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 0, } testMethod := "testBindMethod" gcpcfg := &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MaxSize: 2, MaxConcurrentStreamsLowWatermark: 100, }, Method: []*pb.MethodConfig{ { Name: []string{testMethod}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BIND, AffinityKey: "key", }, }, }, }, } // Simulate a pool with two connections. b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) b.scRefs = mp b.scStates[scBusy] = connectivity.Idle b.scStates[scIdle] = connectivity.Idle // Simulate resolver. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{ Addresses: b.addrs, }, BalancerConfig: gcpcfg, }) // Simulate connections moved to the ready state. b.UpdateSubConnState(scBusy, balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(scIdle, balancer.SubConnState{ConnectivityState: connectivity.Ready}) // Prepare a bind call context. ctx := context.Background() gcpCtx := &gcpContext{ reqMsg: &testMsg{}, } ctx = context.WithValue(ctx, gcpKey, gcpCtx) // Idle subconn shoud be returned. pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: testMethod, Ctx: ctx}) sc := pr.SubConn if sc != scIdle || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", sc, err, scIdle) } testKey := "test_key" // Simulate bind call completion. gcpCtx.replyMsg = &testMsg{ Key: testKey, } pr.Done(balancer.DoneInfo{}) // Make sure the key is mapped to the subconn. if mappedSc, ok := b.affinityMap[testKey]; !ok || mappedSc != scIdle { t.Fatalf("b.affinityMap[testKey] returned: %v, %v, want: %v, %v", mappedSc, ok, scIdle, true) } } func TestPickMappedSubConn(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockSCnotmapped := mocks.NewMockSubConn(mockCtrl) mockSCmapped := mocks.NewMockSubConn(mockCtrl) mockSCnotmapped.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() mockSCmapped.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() mockSCnotmapped.EXPECT().Connect().AnyTimes() mockSCmapped.EXPECT().Connect().AnyTimes() mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mp := make(map[balancer.SubConn]*subConnRef) mp[mockSCnotmapped] = &subConnRef{ subConn: mockSCnotmapped, stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 0, } mp[mockSCmapped] = &subConnRef{ subConn: mockSCmapped, stateSignal: make(chan struct{}), affinityCnt: 0, streamsCnt: 5, } testMethod := "testMethod" gcpcfg := &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MaxSize: 2, MaxConcurrentStreamsLowWatermark: 100, }, Method: []*pb.MethodConfig{ { Name: []string{testMethod}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BOUND, AffinityKey: "key", }, }, }, }, } // Simulate a pool with two connections. b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) b.scRefs = mp b.scStates[mockSCnotmapped] = connectivity.Idle b.scStates[mockSCmapped] = connectivity.Idle // Simulate resolver. b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{ Addresses: b.addrs, }, BalancerConfig: gcpcfg, }) // Simulate connections moved to the ready state. b.UpdateSubConnState(mockSCnotmapped, balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(mockSCmapped, balancer.SubConnState{ConnectivityState: connectivity.Ready}) // Bind the key to the SubConn. theKey := "key-for-not-ready" b.bindSubConn(theKey, mockSCmapped) // Prepare call context with the mapped key. ctx := context.Background() gcpCtx := &gcpContext{ reqMsg: &testMsg{ Key: theKey, }, } ctx = context.WithValue(ctx, gcpKey, gcpCtx) // The mapped connection shoud be returned. pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: testMethod, Ctx: ctx}) sc := pr.SubConn if sc != mockSCmapped || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", sc, err, mockSCmapped) } // Simulate the mapped connection moved to the error state. b.UpdateSubConnState( mockSCmapped, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure}, ) // The picker should return ErrNoSubConnAvailable for the same context // because the connection mapped to the key is not in the ready state. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: testMethod, Ctx: ctx}) sc = pr.SubConn wantErr := balancer.ErrNoSubConnAvailable if sc != nil || err != wantErr { t.Fatalf("gcpPicker.Pick returns %v, _, %v, want: nil, _, %v", sc, err, wantErr) } } func TestPickSubConnWithFallback(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() scs := []*mocks.MockSubConn{} mockCC := mocks.NewMockClientConn(mockCtrl) mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { sc := mocks.NewMockSubConn(mockCtrl) sc.EXPECT().Connect().AnyTimes() sc.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() scs = append(scs, sc) return sc, nil }).Times(3) // Create new pool. b := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) // Simulate resolver. testMethod := "testMethod" b.UpdateClientConnState(balancer.ClientConnState{ ResolverState: resolver.State{ Addresses: b.addrs, }, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: 3, MaxSize: 3, MaxConcurrentStreamsLowWatermark: 100, FallbackToReady: true, }, Method: []*pb.MethodConfig{ { Name: []string{testMethod}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BOUND, AffinityKey: "key", }, }, }, }, }, }) // Move first two subconn to ready. b.UpdateSubConnState(scs[0], balancer.SubConnState{ConnectivityState: connectivity.Ready}) b.UpdateSubConnState(scs[1], balancer.SubConnState{ConnectivityState: connectivity.Ready}) // Bind the key to the subconn 2, which is not ready. theKey := "key-for-not-ready" b.bindSubConn(theKey, scs[2]) ctx := context.Background() // Prepare call context with the mapped key. gcpCtx := &gcpContext{ reqMsg: &testMsg{ Key: theKey, }, } ctx = context.WithValue(ctx, gcpKey, gcpCtx) // Increase active streams on subconn 0 so that the pick below will be forced to subconn 1. b.scRefs[scs[0]].streamsIncr() // Despite subconn 2 is mapped to the key, subconn 1 shoud be returned as a fallback // because it has less active streams than subconn 0. pr, err := b.picker.Pick(balancer.PickInfo{FullMethodName: testMethod, Ctx: ctx}) sc := pr.SubConn if sc != scs[1] || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", sc, err, scs[1]) } // Should stick to subconn 1 even when it has more active streams. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: testMethod, Ctx: ctx}) sc = pr.SubConn if sc != scs[1] || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", sc, err, scs[1]) } pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: testMethod, Ctx: ctx}) sc = pr.SubConn if sc != scs[1] || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", sc, err, scs[1]) } // Simulate subconn 1 moved to the error state. b.UpdateSubConnState(scs[1], balancer.SubConnState{ConnectivityState: connectivity.TransientFailure}) // Subconn 0 shoud be returned, because now subconn 1 (temporary fallback) is also not ready. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: testMethod, Ctx: ctx}) sc = pr.SubConn if sc != scs[0] || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", sc, err, scs[0]) } // Simulate subconn 2 recovered. b.UpdateSubConnState(scs[2], balancer.SubConnState{ConnectivityState: connectivity.Ready}) // As originally mapped subconn 2 is recovered, it shoud be returned. pr, err = b.picker.Pick(balancer.PickInfo{FullMethodName: testMethod, Ctx: ctx}) sc = pr.SubConn if sc != scs[2] || err != nil { t.Fatalf("gcpPicker.Pick returns %v, %v, want: %v, nil", sc, err, scs[2]) } } func BenchmarkPick(b *testing.B) { for _, poolSize := range []int{4, 8, 16, 32, 64} { mockCtrl := gomock.NewController(b) mockCC := mocks.NewMockClientConn(mockCtrl) subconns := []*mocks.MockSubConn{} mockCC.EXPECT().UpdateState(gomock.Any()).AnyTimes() mockCC.EXPECT().NewSubConn(gomock.Any(), gomock.Any()).DoAndReturn(func(_, _ interface{}) (*mocks.MockSubConn, error) { newSC := mocks.NewMockSubConn(mockCtrl) newSC.EXPECT().Connect().AnyTimes() newSC.EXPECT().UpdateAddresses(gomock.Any()).AnyTimes() subconns = append(subconns, newSC) return newSC, nil }).Times(poolSize) bal := newBuilder().Build(mockCC, balancer.BuildOptions{}).(*gcpBalancer) bal.UpdateClientConnState( balancer.ClientConnState{ ResolverState: resolver.State{ Addresses: []resolver.Address{{Addr: "127.0.0.1"}}, }, BalancerConfig: &GCPBalancerConfig{ ApiConfig: &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: uint32(poolSize), MaxSize: uint32(poolSize), MaxConcurrentStreamsLowWatermark: 100, FallbackToReady: true, }, }, }, }, ) // Move all subconns to ready state. for _, sc := range subconns { bal.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Ready}) } cwg := sync.WaitGroup{} b.Run(fmt.Sprintf("pool_size_%d", poolSize), func(b *testing.B) { wg := sync.WaitGroup{} n := b.N / poolSize // Call Pick concurrently from poolSize parallel jobs. for i := 0; i < poolSize; i++ { wg.Add(1) go func() { for j := 0; j < n; j++ { pr, _ := bal.picker.Pick(balancer.PickInfo{FullMethodName: "", Ctx: context.Background()}) cwg.Add(1) go func() { time.Sleep((5 + time.Duration(rand.Intn(15))) * time.Millisecond) pr.Done(balancer.DoneInfo{}) cwg.Done() }() } wg.Done() }() } wg.Wait() }) // Wait for all Done callbacks. cwg.Wait() mockCtrl.Finish() } } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/go.mod000066400000000000000000000003241457366620600202040ustar00rootroot00000000000000module github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp go 1.12 require ( github.com/golang/mock v1.6.0 github.com/google/go-cmp v0.5.9 google.golang.org/grpc v1.56.3 google.golang.org/protobuf v1.30.0 ) grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/go.sum000066400000000000000000004420301457366620600202350ustar00rootroot00000000000000cloud.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/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/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= 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/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= 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/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= 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/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/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= 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.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= 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/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/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= 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/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= 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.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/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= 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/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/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.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= 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/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/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= 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/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= 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/video v1.15.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/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/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 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/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= 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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= 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 v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 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/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/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/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 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/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/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/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= 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.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= 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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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-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-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/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 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/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= 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/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.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/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.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 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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/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/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/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/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/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/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/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/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/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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/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-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= 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/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/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/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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= 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.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 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/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/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/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/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= 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/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 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= 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/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/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/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/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-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-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-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-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.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.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.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= 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.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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/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-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-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-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-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-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-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.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.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.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.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= 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 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 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/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-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-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-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-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-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/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= 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/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/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-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-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-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= 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.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.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.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= 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.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 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.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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-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= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.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/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/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/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/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/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= 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/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= 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= grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/grpc_gcp/000077500000000000000000000000001457366620600206635ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/grpc_gcp/codegen.sh000077500000000000000000000002351457366620600226260ustar00rootroot00000000000000#!/usr/bin/env bash cd "$(dirname "$0")" rm grpc_gcp.pb.go protoc --plugin=$(go env GOPATH)/bin/protoc-gen-go --proto_path=./ --go_out=.. ./grpc_gcp.proto grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/grpc_gcp/grpc_gcp.pb.go000066400000000000000000000611511457366620600234020ustar00rootroot00000000000000// Copyright 2018 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. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 // protoc v3.12.4 // source: grpc_gcp.proto package grpc_gcp import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // A selection of strategies for picking a channel for a call with BIND command. type ChannelPoolConfig_BindPickStrategy int32 const ( // No preference -- picking a channel for a BIND call will be no different // than for any other calls. ChannelPoolConfig_UNSPECIFIED ChannelPoolConfig_BindPickStrategy = 0 // A channel with the least active streams at the moment of a BIND call // initiation will be picked. ChannelPoolConfig_LEAST_ACTIVE_STREAMS ChannelPoolConfig_BindPickStrategy = 1 // Cycle through channels created by the BIND call initiation. I. e. pick // a channel in a round-robin manner. Note that some channels may be // skipped during channel pool resize. ChannelPoolConfig_ROUND_ROBIN ChannelPoolConfig_BindPickStrategy = 2 ) // Enum value maps for ChannelPoolConfig_BindPickStrategy. var ( ChannelPoolConfig_BindPickStrategy_name = map[int32]string{ 0: "UNSPECIFIED", 1: "LEAST_ACTIVE_STREAMS", 2: "ROUND_ROBIN", } ChannelPoolConfig_BindPickStrategy_value = map[string]int32{ "UNSPECIFIED": 0, "LEAST_ACTIVE_STREAMS": 1, "ROUND_ROBIN": 2, } ) func (x ChannelPoolConfig_BindPickStrategy) Enum() *ChannelPoolConfig_BindPickStrategy { p := new(ChannelPoolConfig_BindPickStrategy) *p = x return p } func (x ChannelPoolConfig_BindPickStrategy) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ChannelPoolConfig_BindPickStrategy) Descriptor() protoreflect.EnumDescriptor { return file_grpc_gcp_proto_enumTypes[0].Descriptor() } func (ChannelPoolConfig_BindPickStrategy) Type() protoreflect.EnumType { return &file_grpc_gcp_proto_enumTypes[0] } func (x ChannelPoolConfig_BindPickStrategy) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use ChannelPoolConfig_BindPickStrategy.Descriptor instead. func (ChannelPoolConfig_BindPickStrategy) EnumDescriptor() ([]byte, []int) { return file_grpc_gcp_proto_rawDescGZIP(), []int{1, 0} } type AffinityConfig_Command int32 const ( // The annotated method will be required to be bound to an existing session // to execute the RPC. The corresponding will be // used to find the affinity key from the request message. AffinityConfig_BOUND AffinityConfig_Command = 0 // The annotated method will establish the channel affinity with the // channel which is used to execute the RPC. The corresponding // will be used to find the affinity key from the // response message. AffinityConfig_BIND AffinityConfig_Command = 1 // The annotated method will remove the channel affinity with the // channel which is used to execute the RPC. The corresponding // will be used to find the affinity key from the // request message. AffinityConfig_UNBIND AffinityConfig_Command = 2 ) // Enum value maps for AffinityConfig_Command. var ( AffinityConfig_Command_name = map[int32]string{ 0: "BOUND", 1: "BIND", 2: "UNBIND", } AffinityConfig_Command_value = map[string]int32{ "BOUND": 0, "BIND": 1, "UNBIND": 2, } ) func (x AffinityConfig_Command) Enum() *AffinityConfig_Command { p := new(AffinityConfig_Command) *p = x return p } func (x AffinityConfig_Command) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AffinityConfig_Command) Descriptor() protoreflect.EnumDescriptor { return file_grpc_gcp_proto_enumTypes[1].Descriptor() } func (AffinityConfig_Command) Type() protoreflect.EnumType { return &file_grpc_gcp_proto_enumTypes[1] } func (x AffinityConfig_Command) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AffinityConfig_Command.Descriptor instead. func (AffinityConfig_Command) EnumDescriptor() ([]byte, []int) { return file_grpc_gcp_proto_rawDescGZIP(), []int{3, 0} } type ApiConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The channel pool configurations. ChannelPool *ChannelPoolConfig `protobuf:"bytes,2,opt,name=channel_pool,json=channelPool,proto3" json:"channel_pool,omitempty"` // The method configurations. Method []*MethodConfig `protobuf:"bytes,1001,rep,name=method,proto3" json:"method,omitempty"` } func (x *ApiConfig) Reset() { *x = ApiConfig{} if protoimpl.UnsafeEnabled { mi := &file_grpc_gcp_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ApiConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ApiConfig) ProtoMessage() {} func (x *ApiConfig) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ApiConfig.ProtoReflect.Descriptor instead. func (*ApiConfig) Descriptor() ([]byte, []int) { return file_grpc_gcp_proto_rawDescGZIP(), []int{0} } func (x *ApiConfig) GetChannelPool() *ChannelPoolConfig { if x != nil { return x.ChannelPool } return nil } func (x *ApiConfig) GetMethod() []*MethodConfig { if x != nil { return x.Method } return nil } // ChannelPoolConfig are options for configuring the channel pool. // RPCs will be scheduled onto existing channels in the pool until all channels // have number of streams. At this point // a new channel is spun out. Once channels have been spun out and // each has streams, subsequent RPCs will // hang until any of the in-flight RPCs is finished, freeing up a channel. type ChannelPoolConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The max number of channels in the pool. // Default value is 0, meaning 'unlimited' size. MaxSize uint32 `protobuf:"varint,1,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` // The idle timeout (seconds) of channels without bound affinity sessions. IdleTimeout uint64 `protobuf:"varint,2,opt,name=idle_timeout,json=idleTimeout,proto3" json:"idle_timeout,omitempty"` // The low watermark of max number of concurrent streams in a channel. // New channel will be created once it get hit, until we reach the max size of the channel pool. // Default value is 100. The valid range is [1, 100]. Any value outside the range will be ignored and the default value will be used. // Note: It is not recommended that users adjust this value, since a single channel should generally have no trouble managing the default (maximum) number of streams. MaxConcurrentStreamsLowWatermark uint32 `protobuf:"varint,3,opt,name=max_concurrent_streams_low_watermark,json=maxConcurrentStreamsLowWatermark,proto3" json:"max_concurrent_streams_low_watermark,omitempty"` // The minimum number of channels in the pool. MinSize uint32 `protobuf:"varint,4,opt,name=min_size,json=minSize,proto3" json:"min_size,omitempty"` // If a channel mapped to an affinity key is not ready, temporarily fallback // to another ready channel. // Enabling this fallback is beneficial in scenarios with short RPC timeouts // and rather slow connection establishing or during incidents when new // connections fail but existing connections still operate. FallbackToReady bool `protobuf:"varint,5,opt,name=fallback_to_ready,json=fallbackToReady,proto3" json:"fallback_to_ready,omitempty"` // Enables per channel unresponsive connection detection if > 0 and unresponsive_calls > 0. // If enabled and more than unresponsive_detection_ms passed since the last response from the server, // and >= unresponsive_calls RPC calls (started after last response from the server) timed-out on the client side, // then the connection of that channel will be gracefully refreshed. I.e., a new connection will be created for // that channel and after the new connection is ready it will replace the old connection. The calls on the old // connection will not be interrupted. The unresponsive_detection_ms will be doubled every consecutive refresh // if no response from the server is received. UnresponsiveDetectionMs uint32 `protobuf:"varint,6,opt,name=unresponsive_detection_ms,json=unresponsiveDetectionMs,proto3" json:"unresponsive_detection_ms,omitempty"` // Enables per channel unresponsive connection detection if > 0 and unresponsive_detection_ms > 0. // If enabled and more than unresponsive_detection_ms passed since the last response from the server, // and >= unresponsive_calls RPC calls (started after last response from the server) timed-out on the client side, // then the connection of that channel will be gracefully refreshed. I.e., a new connection will be created for // that channel and after the new connection is ready it will replace the old connection. The calls on the old // connection will not be interrupted. The unresponsive_detection_ms will be doubled every consecutive refresh // if no response from the server is received. UnresponsiveCalls uint32 `protobuf:"varint,7,opt,name=unresponsive_calls,json=unresponsiveCalls,proto3" json:"unresponsive_calls,omitempty"` // The strategy for picking a channel for a call with BIND command. BindPickStrategy ChannelPoolConfig_BindPickStrategy `protobuf:"varint,8,opt,name=bind_pick_strategy,json=bindPickStrategy,proto3,enum=grpc.gcp.ChannelPoolConfig_BindPickStrategy" json:"bind_pick_strategy,omitempty"` } func (x *ChannelPoolConfig) Reset() { *x = ChannelPoolConfig{} if protoimpl.UnsafeEnabled { mi := &file_grpc_gcp_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ChannelPoolConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ChannelPoolConfig) ProtoMessage() {} func (x *ChannelPoolConfig) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ChannelPoolConfig.ProtoReflect.Descriptor instead. func (*ChannelPoolConfig) Descriptor() ([]byte, []int) { return file_grpc_gcp_proto_rawDescGZIP(), []int{1} } func (x *ChannelPoolConfig) GetMaxSize() uint32 { if x != nil { return x.MaxSize } return 0 } func (x *ChannelPoolConfig) GetIdleTimeout() uint64 { if x != nil { return x.IdleTimeout } return 0 } func (x *ChannelPoolConfig) GetMaxConcurrentStreamsLowWatermark() uint32 { if x != nil { return x.MaxConcurrentStreamsLowWatermark } return 0 } func (x *ChannelPoolConfig) GetMinSize() uint32 { if x != nil { return x.MinSize } return 0 } func (x *ChannelPoolConfig) GetFallbackToReady() bool { if x != nil { return x.FallbackToReady } return false } func (x *ChannelPoolConfig) GetUnresponsiveDetectionMs() uint32 { if x != nil { return x.UnresponsiveDetectionMs } return 0 } func (x *ChannelPoolConfig) GetUnresponsiveCalls() uint32 { if x != nil { return x.UnresponsiveCalls } return 0 } func (x *ChannelPoolConfig) GetBindPickStrategy() ChannelPoolConfig_BindPickStrategy { if x != nil { return x.BindPickStrategy } return ChannelPoolConfig_UNSPECIFIED } type MethodConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A fully qualified name of a gRPC method, or a wildcard pattern ending // with .*, such as foo.bar.A, foo.bar.*. Method configs are evaluated // sequentially, and the first one takes precedence. Name []string `protobuf:"bytes,1,rep,name=name,proto3" json:"name,omitempty"` // The channel affinity configurations. Affinity *AffinityConfig `protobuf:"bytes,1001,opt,name=affinity,proto3" json:"affinity,omitempty"` } func (x *MethodConfig) Reset() { *x = MethodConfig{} if protoimpl.UnsafeEnabled { mi := &file_grpc_gcp_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MethodConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*MethodConfig) ProtoMessage() {} func (x *MethodConfig) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use MethodConfig.ProtoReflect.Descriptor instead. func (*MethodConfig) Descriptor() ([]byte, []int) { return file_grpc_gcp_proto_rawDescGZIP(), []int{2} } func (x *MethodConfig) GetName() []string { if x != nil { return x.Name } return nil } func (x *MethodConfig) GetAffinity() *AffinityConfig { if x != nil { return x.Affinity } return nil } type AffinityConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The affinity command applies on the selected gRPC methods. Command AffinityConfig_Command `protobuf:"varint,2,opt,name=command,proto3,enum=grpc.gcp.AffinityConfig_Command" json:"command,omitempty"` // The field path of the affinity key in the request/response message. // For example: "f.a", "f.b.d", etc. AffinityKey string `protobuf:"bytes,3,opt,name=affinity_key,json=affinityKey,proto3" json:"affinity_key,omitempty"` } func (x *AffinityConfig) Reset() { *x = AffinityConfig{} if protoimpl.UnsafeEnabled { mi := &file_grpc_gcp_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AffinityConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*AffinityConfig) ProtoMessage() {} func (x *AffinityConfig) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AffinityConfig.ProtoReflect.Descriptor instead. func (*AffinityConfig) Descriptor() ([]byte, []int) { return file_grpc_gcp_proto_rawDescGZIP(), []int{3} } func (x *AffinityConfig) GetCommand() AffinityConfig_Command { if x != nil { return x.Command } return AffinityConfig_BOUND } func (x *AffinityConfig) GetAffinityKey() string { if x != nil { return x.AffinityKey } return "" } var File_grpc_gcp_proto protoreflect.FileDescriptor var file_grpc_gcp_proto_rawDesc = []byte{ 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x63, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x22, 0x7c, 0x0a, 0x09, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3e, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0xff, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x69, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4e, 0x0a, 0x24, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x20, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x4c, 0x6f, 0x77, 0x57, 0x61, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x3a, 0x0a, 0x19, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x17, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x5a, 0x0a, 0x12, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x70, 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x50, 0x69, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x10, 0x62, 0x69, 0x6e, 0x64, 0x50, 0x69, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x4e, 0x0a, 0x10, 0x42, 0x69, 0x6e, 0x64, 0x50, 0x69, 0x63, 0x6b, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x42, 0x49, 0x4e, 0x10, 0x02, 0x22, 0x59, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x22, 0x9b, 0x01, 0x0a, 0x0e, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x2a, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x49, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x4e, 0x42, 0x49, 0x4e, 0x44, 0x10, 0x02, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x63, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_grpc_gcp_proto_rawDescOnce sync.Once file_grpc_gcp_proto_rawDescData = file_grpc_gcp_proto_rawDesc ) func file_grpc_gcp_proto_rawDescGZIP() []byte { file_grpc_gcp_proto_rawDescOnce.Do(func() { file_grpc_gcp_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_gcp_proto_rawDescData) }) return file_grpc_gcp_proto_rawDescData } var file_grpc_gcp_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_grpc_gcp_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_grpc_gcp_proto_goTypes = []interface{}{ (ChannelPoolConfig_BindPickStrategy)(0), // 0: grpc.gcp.ChannelPoolConfig.BindPickStrategy (AffinityConfig_Command)(0), // 1: grpc.gcp.AffinityConfig.Command (*ApiConfig)(nil), // 2: grpc.gcp.ApiConfig (*ChannelPoolConfig)(nil), // 3: grpc.gcp.ChannelPoolConfig (*MethodConfig)(nil), // 4: grpc.gcp.MethodConfig (*AffinityConfig)(nil), // 5: grpc.gcp.AffinityConfig } var file_grpc_gcp_proto_depIdxs = []int32{ 3, // 0: grpc.gcp.ApiConfig.channel_pool:type_name -> grpc.gcp.ChannelPoolConfig 4, // 1: grpc.gcp.ApiConfig.method:type_name -> grpc.gcp.MethodConfig 0, // 2: grpc.gcp.ChannelPoolConfig.bind_pick_strategy:type_name -> grpc.gcp.ChannelPoolConfig.BindPickStrategy 5, // 3: grpc.gcp.MethodConfig.affinity:type_name -> grpc.gcp.AffinityConfig 1, // 4: grpc.gcp.AffinityConfig.command:type_name -> grpc.gcp.AffinityConfig.Command 5, // [5:5] is the sub-list for method output_type 5, // [5:5] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name 5, // [5:5] is the sub-list for extension extendee 0, // [0:5] is the sub-list for field type_name } func init() { file_grpc_gcp_proto_init() } func file_grpc_gcp_proto_init() { if File_grpc_gcp_proto != nil { return } if !protoimpl.UnsafeEnabled { file_grpc_gcp_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApiConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_grpc_gcp_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChannelPoolConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_grpc_gcp_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MethodConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_grpc_gcp_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AffinityConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_grpc_gcp_proto_rawDesc, NumEnums: 2, NumMessages: 4, NumExtensions: 0, NumServices: 0, }, GoTypes: file_grpc_gcp_proto_goTypes, DependencyIndexes: file_grpc_gcp_proto_depIdxs, EnumInfos: file_grpc_gcp_proto_enumTypes, MessageInfos: file_grpc_gcp_proto_msgTypes, }.Build() File_grpc_gcp_proto = out.File file_grpc_gcp_proto_rawDesc = nil file_grpc_gcp_proto_goTypes = nil file_grpc_gcp_proto_depIdxs = nil } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/grpc_gcp/grpc_gcp.proto000066400000000000000000000136771457366620600235520ustar00rootroot00000000000000// Copyright 2018 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. syntax = "proto3"; option go_package = "./grpc_gcp"; package grpc.gcp; message ApiConfig { // The channel pool configurations. ChannelPoolConfig channel_pool = 2; // The method configurations. repeated MethodConfig method = 1001; } // ChannelPoolConfig are options for configuring the channel pool. // RPCs will be scheduled onto existing channels in the pool until all channels // have number of streams. At this point // a new channel is spun out. Once channels have been spun out and // each has streams, subsequent RPCs will // hang until any of the in-flight RPCs is finished, freeing up a channel. message ChannelPoolConfig { // The max number of channels in the pool. // Default value is 0, meaning 'unlimited' size. uint32 max_size = 1; // The idle timeout (seconds) of channels without bound affinity sessions. uint64 idle_timeout = 2; // The low watermark of max number of concurrent streams in a channel. // New channel will be created once it get hit, until we reach the max size of the channel pool. // Default value is 100. The valid range is [1, 100]. Any value outside the range will be ignored and the default value will be used. // Note: It is not recommended that users adjust this value, since a single channel should generally have no trouble managing the default (maximum) number of streams. uint32 max_concurrent_streams_low_watermark = 3; // The minimum number of channels in the pool. uint32 min_size = 4; // If a channel mapped to an affinity key is not ready, temporarily fallback // to another ready channel. // Enabling this fallback is beneficial in scenarios with short RPC timeouts // and rather slow connection establishing or during incidents when new // connections fail but existing connections still operate. bool fallback_to_ready = 5; // Enables per channel unresponsive connection detection if > 0 and unresponsive_calls > 0. // If enabled and more than unresponsive_detection_ms passed since the last response from the server, // and >= unresponsive_calls RPC calls (started after last response from the server) timed-out on the client side, // then the connection of that channel will be gracefully refreshed. I.e., a new connection will be created for // that channel and after the new connection is ready it will replace the old connection. The calls on the old // connection will not be interrupted. The unresponsive_detection_ms will be doubled every consecutive refresh // if no response from the server is received. uint32 unresponsive_detection_ms = 6; // Enables per channel unresponsive connection detection if > 0 and unresponsive_detection_ms > 0. // If enabled and more than unresponsive_detection_ms passed since the last response from the server, // and >= unresponsive_calls RPC calls (started after last response from the server) timed-out on the client side, // then the connection of that channel will be gracefully refreshed. I.e., a new connection will be created for // that channel and after the new connection is ready it will replace the old connection. The calls on the old // connection will not be interrupted. The unresponsive_detection_ms will be doubled every consecutive refresh // if no response from the server is received. uint32 unresponsive_calls = 7; // A selection of strategies for picking a channel for a call with BIND command. enum BindPickStrategy { // No preference -- picking a channel for a BIND call will be no different // than for any other calls. UNSPECIFIED = 0; // A channel with the least active streams at the moment of a BIND call // initiation will be picked. LEAST_ACTIVE_STREAMS = 1; // Cycle through channels created by the BIND call initiation. I. e. pick // a channel in a round-robin manner. Note that some channels may be // skipped during channel pool resize. ROUND_ROBIN = 2; } // The strategy for picking a channel for a call with BIND command. BindPickStrategy bind_pick_strategy = 8; } message MethodConfig { // A fully qualified name of a gRPC method, or a wildcard pattern ending // with .*, such as foo.bar.A, foo.bar.*. Method configs are evaluated // sequentially, and the first one takes precedence. repeated string name = 1; // The channel affinity configurations. AffinityConfig affinity = 1001; } message AffinityConfig { enum Command { // The annotated method will be required to be bound to an existing session // to execute the RPC. The corresponding will be // used to find the affinity key from the request message. BOUND = 0; // The annotated method will establish the channel affinity with the // channel which is used to execute the RPC. The corresponding // will be used to find the affinity key from the // response message. BIND = 1; // The annotated method will remove the channel affinity with the // channel which is used to execute the RPC. The corresponding // will be used to find the affinity key from the // request message. UNBIND = 2; } // The affinity command applies on the selected gRPC methods. Command command = 2; // The field path of the affinity key in the request/response message. // For example: "f.a", "f.b.d", etc. string affinity_key = 3; } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/mockgen.sh000077500000000000000000000003641457366620600210640ustar00rootroot00000000000000#!/usr/bin/env bash cd "$(dirname "$0")" mockgen -destination=mocks/mock_balancer.go -package=mocks google.golang.org/grpc/balancer ClientConn,SubConn mockgen -destination=mocks/mock_stream.go -package=mocks google.golang.org/grpc ClientStream grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/mocks/000077500000000000000000000000001457366620600202135ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/mocks/mock_balancer.go000066400000000000000000000136271457366620600233330ustar00rootroot00000000000000// Code generated by MockGen. DO NOT EDIT. // Source: google.golang.org/grpc/balancer (interfaces: ClientConn,SubConn) // Package mocks is a generated GoMock package. package mocks import ( reflect "reflect" gomock "github.com/golang/mock/gomock" balancer "google.golang.org/grpc/balancer" resolver "google.golang.org/grpc/resolver" ) // MockClientConn is a mock of ClientConn interface. type MockClientConn struct { ctrl *gomock.Controller recorder *MockClientConnMockRecorder } // MockClientConnMockRecorder is the mock recorder for MockClientConn. type MockClientConnMockRecorder struct { mock *MockClientConn } // NewMockClientConn creates a new mock instance. func NewMockClientConn(ctrl *gomock.Controller) *MockClientConn { mock := &MockClientConn{ctrl: ctrl} mock.recorder = &MockClientConnMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. func (m *MockClientConn) EXPECT() *MockClientConnMockRecorder { return m.recorder } // NewSubConn mocks base method. func (m *MockClientConn) NewSubConn(arg0 []resolver.Address, arg1 balancer.NewSubConnOptions) (balancer.SubConn, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NewSubConn", arg0, arg1) ret0, _ := ret[0].(balancer.SubConn) ret1, _ := ret[1].(error) return ret0, ret1 } // NewSubConn indicates an expected call of NewSubConn. func (mr *MockClientConnMockRecorder) NewSubConn(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewSubConn", reflect.TypeOf((*MockClientConn)(nil).NewSubConn), arg0, arg1) } // RemoveSubConn mocks base method. func (m *MockClientConn) RemoveSubConn(arg0 balancer.SubConn) { m.ctrl.T.Helper() m.ctrl.Call(m, "RemoveSubConn", arg0) } // RemoveSubConn indicates an expected call of RemoveSubConn. func (mr *MockClientConnMockRecorder) RemoveSubConn(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveSubConn", reflect.TypeOf((*MockClientConn)(nil).RemoveSubConn), arg0) } // ResolveNow mocks base method. func (m *MockClientConn) ResolveNow(arg0 resolver.ResolveNowOptions) { m.ctrl.T.Helper() m.ctrl.Call(m, "ResolveNow", arg0) } // ResolveNow indicates an expected call of ResolveNow. func (mr *MockClientConnMockRecorder) ResolveNow(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResolveNow", reflect.TypeOf((*MockClientConn)(nil).ResolveNow), arg0) } // Target mocks base method. func (m *MockClientConn) Target() string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Target") ret0, _ := ret[0].(string) return ret0 } // Target indicates an expected call of Target. func (mr *MockClientConnMockRecorder) Target() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Target", reflect.TypeOf((*MockClientConn)(nil).Target)) } // UpdateAddresses mocks base method. func (m *MockClientConn) UpdateAddresses(arg0 balancer.SubConn, arg1 []resolver.Address) { m.ctrl.T.Helper() m.ctrl.Call(m, "UpdateAddresses", arg0, arg1) } // UpdateAddresses indicates an expected call of UpdateAddresses. func (mr *MockClientConnMockRecorder) UpdateAddresses(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAddresses", reflect.TypeOf((*MockClientConn)(nil).UpdateAddresses), arg0, arg1) } // UpdateState mocks base method. func (m *MockClientConn) UpdateState(arg0 balancer.State) { m.ctrl.T.Helper() m.ctrl.Call(m, "UpdateState", arg0) } // UpdateState indicates an expected call of UpdateState. func (mr *MockClientConnMockRecorder) UpdateState(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateState", reflect.TypeOf((*MockClientConn)(nil).UpdateState), arg0) } // MockSubConn is a mock of SubConn interface. type MockSubConn struct { ctrl *gomock.Controller recorder *MockSubConnMockRecorder } // MockSubConnMockRecorder is the mock recorder for MockSubConn. type MockSubConnMockRecorder struct { mock *MockSubConn } // NewMockSubConn creates a new mock instance. func NewMockSubConn(ctrl *gomock.Controller) *MockSubConn { mock := &MockSubConn{ctrl: ctrl} mock.recorder = &MockSubConnMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. func (m *MockSubConn) EXPECT() *MockSubConnMockRecorder { return m.recorder } // Connect mocks base method. func (m *MockSubConn) Connect() { m.ctrl.T.Helper() m.ctrl.Call(m, "Connect") } // Connect indicates an expected call of Connect. func (mr *MockSubConnMockRecorder) Connect() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Connect", reflect.TypeOf((*MockSubConn)(nil).Connect)) } // GetOrBuildProducer mocks base method. func (m *MockSubConn) GetOrBuildProducer(arg0 balancer.ProducerBuilder) (balancer.Producer, func()) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetOrBuildProducer", arg0) ret0, _ := ret[0].(balancer.Producer) ret1, _ := ret[1].(func()) return ret0, ret1 } // GetOrBuildProducer indicates an expected call of GetOrBuildProducer. func (mr *MockSubConnMockRecorder) GetOrBuildProducer(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOrBuildProducer", reflect.TypeOf((*MockSubConn)(nil).GetOrBuildProducer), arg0) } // UpdateAddresses mocks base method. func (m *MockSubConn) UpdateAddresses(arg0 []resolver.Address) { m.ctrl.T.Helper() m.ctrl.Call(m, "UpdateAddresses", arg0) } // UpdateAddresses indicates an expected call of UpdateAddresses. func (mr *MockSubConnMockRecorder) UpdateAddresses(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAddresses", reflect.TypeOf((*MockSubConn)(nil).UpdateAddresses), arg0) } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/mocks/mock_stream.go000066400000000000000000000072661457366620600230610ustar00rootroot00000000000000// Code generated by MockGen. DO NOT EDIT. // Source: google.golang.org/grpc (interfaces: ClientStream) // Package mocks is a generated GoMock package. package mocks import ( context "context" reflect "reflect" gomock "github.com/golang/mock/gomock" metadata "google.golang.org/grpc/metadata" ) // MockClientStream is a mock of ClientStream interface. type MockClientStream struct { ctrl *gomock.Controller recorder *MockClientStreamMockRecorder } // MockClientStreamMockRecorder is the mock recorder for MockClientStream. type MockClientStreamMockRecorder struct { mock *MockClientStream } // NewMockClientStream creates a new mock instance. func NewMockClientStream(ctrl *gomock.Controller) *MockClientStream { mock := &MockClientStream{ctrl: ctrl} mock.recorder = &MockClientStreamMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. func (m *MockClientStream) EXPECT() *MockClientStreamMockRecorder { return m.recorder } // CloseSend mocks base method. func (m *MockClientStream) CloseSend() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CloseSend") ret0, _ := ret[0].(error) return ret0 } // CloseSend indicates an expected call of CloseSend. func (mr *MockClientStreamMockRecorder) CloseSend() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockClientStream)(nil).CloseSend)) } // Context mocks base method. func (m *MockClientStream) Context() context.Context { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Context") ret0, _ := ret[0].(context.Context) return ret0 } // Context indicates an expected call of Context. func (mr *MockClientStreamMockRecorder) Context() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockClientStream)(nil).Context)) } // Header mocks base method. func (m *MockClientStream) Header() (metadata.MD, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Header") ret0, _ := ret[0].(metadata.MD) ret1, _ := ret[1].(error) return ret0, ret1 } // Header indicates an expected call of Header. func (mr *MockClientStreamMockRecorder) Header() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockClientStream)(nil).Header)) } // RecvMsg mocks base method. func (m *MockClientStream) RecvMsg(arg0 interface{}) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RecvMsg", arg0) ret0, _ := ret[0].(error) return ret0 } // RecvMsg indicates an expected call of RecvMsg. func (mr *MockClientStreamMockRecorder) RecvMsg(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockClientStream)(nil).RecvMsg), arg0) } // SendMsg mocks base method. func (m *MockClientStream) SendMsg(arg0 interface{}) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendMsg", arg0) ret0, _ := ret[0].(error) return ret0 } // SendMsg indicates an expected call of SendMsg. func (mr *MockClientStreamMockRecorder) SendMsg(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockClientStream)(nil).SendMsg), arg0) } // Trailer mocks base method. func (m *MockClientStream) Trailer() metadata.MD { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Trailer") ret0, _ := ret[0].(metadata.MD) return ret0 } // Trailer indicates an expected call of Trailer. func (mr *MockClientStreamMockRecorder) Trailer() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockClientStream)(nil).Trailer)) } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/multiendpoint/000077500000000000000000000000001457366620600217725ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/multiendpoint/endpoint.go000066400000000000000000000021201457366620600241340ustar00rootroot00000000000000/* * * Copyright 2023 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 multiendpoint import ( "fmt" "time" ) type status int // Status of an endpoint. const ( unavailable status = iota available recovering ) func (s status) String() string { switch s { case unavailable: return "Unavailable" case available: return "Available" case recovering: return "Recovering" default: return fmt.Sprintf("%d", s) } } type endpoint struct { id string priority int status status lastChange time.Time futureChange timerAlike } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/multiendpoint/multiendpoint.go000066400000000000000000000207611457366620600252220ustar00rootroot00000000000000/* * * Copyright 2023 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 multiendpoint implements multiendpoint feature. See [MultiEndpoint] package multiendpoint import ( "errors" "fmt" "sync" "time" ) type timerAlike interface { Reset(time.Duration) bool Stop() bool } // To be redefined in tests. var ( timeNow = func() time.Time { return time.Now() } timeAfterFunc = func(d time.Duration, f func()) timerAlike { return time.AfterFunc(d, f) } ) // MultiEndpoint holds a list of endpoints, tracks their availability and defines the current // endpoint. An endpoint has a priority defined by its position in the list (first item has top // priority). // // The current endpoint is the highest available endpoint in the list. If no endpoint is available, // MultiEndpoint sticks to the previously current endpoint. // // Sometimes switching between endpoints can be costly, and it is worth waiting for some time // after current endpoint becomes unavailable. For this case, use // [MultiEndpointOptions.RecoveryTimeout] to set the recovery timeout. MultiEndpoint will keep the // current endpoint for up to recovery timeout after it became unavailable to give it some time to // recover. // // The list of endpoints can be changed at any time with [MultiEndpoint.SetEndpoints] function. // MultiEndpoint will: // - remove obsolete endpoints; // - preserve remaining endpoints and their states; // - add new endpoints; // - update all endpoints priority according to the new order; // - change current endpoint if necessary. // // After updating the list of endpoints, MultiEndpoint will switch the current endpoint to the // highest available endpoint in the list. If you have many processes using MultiEndpoint, this may // lead to immediate shift of all traffic which may be undesired. To smooth this transfer, use // [MultiEndpointOptions.SwitchingDelay] with randomized value to introduce a jitter. Each // MultiEndpoint will delay switching from an available endpoint to another endpoint for this amount // of time. This delay is only applicable when switching from a lower priority available endpoint to // a higher priority available endpoint. type MultiEndpoint interface { // Current returns current endpoint. // // Note that the read is not synchronized and in case of a race condition there is a chance of // getting an outdated current endpoint. Current() string // SetEndpointAvailability informs MultiEndpoint when an endpoint becomes available or unavailable. // This may change the current endpoint. SetEndpointAvailability(e string, avail bool) // SetEndpoints updates a list of endpoints: // - remove obsolete endpoints // - preserve remaining endpoints and their states // - add new endpoints // - update all endpoints priority according to the new order // This may change the current endpoint. SetEndpoints(endpoints []string) error } // MultiEndpointOptions is used for configuring [MultiEndpoint]. type MultiEndpointOptions struct { // A list of endpoints ordered by priority (first endpoint has top priority). Endpoints []string // RecoveryTimeout sets the amount of time MultiEndpoint keeps endpoint as current after it // became unavailable. RecoveryTimeout time.Duration // When switching from a lower priority available endpoint to a higher priority available // endpoint the MultiEndpoint will delay the switch for this duration. SwitchingDelay time.Duration } // NewMultiEndpoint validates options and creates a new [MultiEndpoint]. func NewMultiEndpoint(b *MultiEndpointOptions) (MultiEndpoint, error) { if len(b.Endpoints) == 0 { return nil, fmt.Errorf("endpoints list cannot be empty") } me := &multiEndpoint{ recoveryTimeout: b.RecoveryTimeout, switchingDelay: b.SwitchingDelay, current: b.Endpoints[0], } eMap := make(map[string]*endpoint) for i, e := range b.Endpoints { eMap[e] = me.newEndpoint(e, i) } me.endpoints = eMap return me, nil } type multiEndpoint struct { sync.RWMutex endpoints map[string]*endpoint recoveryTimeout time.Duration switchingDelay time.Duration current string future string } // Current returns current endpoint. func (me *multiEndpoint) Current() string { me.RLock() defer me.RUnlock() return me.current } // SetEndpoints updates endpoints list: // - remove obsolete endpoints; // - preserve remaining endpoints and their states; // - add new endpoints; // - update all endpoints priority according to the new order; // - change current endpoint if necessary. func (me *multiEndpoint) SetEndpoints(endpoints []string) error { me.Lock() defer me.Unlock() if len(endpoints) == 0 { return errors.New("endpoints list cannot be empty") } newEndpoints := make(map[string]struct{}) for _, v := range endpoints { newEndpoints[v] = struct{}{} } // Remove obsolete endpoints. for e := range me.endpoints { if _, ok := newEndpoints[e]; !ok { delete(me.endpoints, e) } } // Add new endpoints and update priority. for i, e := range endpoints { if _, ok := me.endpoints[e]; !ok { me.endpoints[e] = me.newEndpoint(e, i) } else { me.endpoints[e].priority = i } } me.maybeUpdateCurrent() return nil } // Updates current to the top-priority available endpoint unless the current endpoint is // recovering. // // Must be run under me.Lock. func (me *multiEndpoint) maybeUpdateCurrent() { c, exists := me.endpoints[me.current] var topA *endpoint var top *endpoint for _, e := range me.endpoints { if e.status == available && (topA == nil || topA.priority > e.priority) { topA = e } if top == nil || top.priority > e.priority { top = e } } if exists && c.status == recovering && (topA == nil || topA.priority > c.priority) { // Let current endpoint recover while no higher priority endpoints available. return } // Always prefer top available endpoint. if topA != nil { me.switchFromTo(c, topA) return } // If no current endpoint exists, resort to the top priority endpoint immediately. if !exists { me.current = top.id } } func (me *multiEndpoint) newEndpoint(id string, priority int) *endpoint { s := unavailable if me.recoveryTimeout > 0 { s = recovering } e := &endpoint{ id: id, priority: priority, status: s, } if e.status == recovering { me.scheduleUnavailable(e) } return e } // Changes or schedules a change of current to the endpoint t. // // Must be run under me.Lock. func (me *multiEndpoint) switchFromTo(f, t *endpoint) { if me.current == t.id { return } if me.switchingDelay == 0 || f == nil || f.status == unavailable { // Switching immediately if no delay or no current or current is unavailable. me.current = t.id return } me.future = t.id timeAfterFunc(me.switchingDelay, func() { me.Lock() defer me.Unlock() if e, ok := me.endpoints[me.future]; ok && e.status == available { me.current = e.id } }) } // SetEndpointAvailability updates the state of an endpoint. func (me *multiEndpoint) SetEndpointAvailability(e string, avail bool) { me.Lock() defer me.Unlock() me.setEndpointAvailability(e, avail) me.maybeUpdateCurrent() } // Must be run under me.Lock. func (me *multiEndpoint) setEndpointAvailability(e string, avail bool) { ee, ok := me.endpoints[e] if !ok { return } if avail { setState(ee, available) return } if ee.status != available { return } if me.recoveryTimeout == 0 { setState(ee, unavailable) return } setState(ee, recovering) me.scheduleUnavailable(ee) } // Change the state of endpoint e to state s. // // Must be run under me.Lock. func setState(e *endpoint, s status) { if e.futureChange != nil { e.futureChange.Stop() } e.status = s e.lastChange = timeNow() } // Schedule endpoint e to become unavailable after recoveryTimeout. func (me *multiEndpoint) scheduleUnavailable(e *endpoint) { stateChange := e.lastChange e.futureChange = timeAfterFunc(me.recoveryTimeout, func() { me.Lock() defer me.Unlock() if e.lastChange != stateChange { // This timer is outdated. return } setState(e, unavailable) me.maybeUpdateCurrent() }) } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/multiendpoint/multiendpoint_test.go000066400000000000000000000536741457366620600262720ustar00rootroot00000000000000/* * * Copyright 2023 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 multiendpoint import ( "math/rand" "sort" "sync" "sync/atomic" "testing" "time" ) const ( recoveryTO = time.Millisecond * 20 switchDelay = time.Millisecond * 40 ) var ( threeEndpoints = []string{"first", "second", "third"} fourEndpoints = []string{"fourth", "first", "third", "second"} now = time.Now() fInd uint32 pendingFns = make(map[time.Time][]uint32) fns = make(map[uint32]func()) ) type FakeTimer struct { time.Timer fnId uint32 } func (ft *FakeTimer) Stop() bool { delete(fns, ft.fnId) return true } func (ft *FakeTimer) Reset(d time.Duration) bool { return true } func init() { timeNow = func() time.Time { return now } timeAfterFunc = func(d time.Duration, f func()) timerAlike { t := now.Add(d) id := atomic.AddUint32(&fInd, 1) if _, ok := pendingFns[t]; !ok { pendingFns[t] = []uint32{id} } pendingFns[t] = append(pendingFns[t], id) fns[id] = f return &FakeTimer{fnId: id} } } func advanceTime(t *testing.T, d time.Duration) { t.Helper() now = now.Add(d) times := make([]time.Time, 0, len(pendingFns)) for t2 := range pendingFns { times = append(times, t2) } sort.Slice(times, func(i, j int) bool { return times[i].Before(times[j]) }) for _, t2 := range times { if t2.After(now) { break } for _, fid := range pendingFns[t2] { if fn, ok := fns[fid]; ok { fn() delete(fns, fid) } } delete(pendingFns, t2) } } func advanceTimeConcurring(t *testing.T, d time.Duration, cfns []func()) { t.Helper() now = now.Add(d) times := make([]time.Time, 0, len(pendingFns)) for t2 := range pendingFns { times = append(times, t2) } sort.Slice(times, func(i, j int) bool { return times[i].Before(times[j]) }) for _, t2 := range times { if t2.After(now) { break } for _, fid := range pendingFns[t2] { if fn, ok := fns[fid]; ok { cfn := func() {} if len(cfns) > 0 { cfn = cfns[0] cfns = cfns[1:] } wg := &sync.WaitGroup{} wg.Add(2) r := rand.Int() go func() { if r%2 == 0 { cfn() } else { fn() } wg.Done() }() go func() { if r%2 == 0 { fn() } else { cfn() } wg.Done() }() wg.Wait() delete(fns, fid) } } delete(pendingFns, t2) } } func initPlain(t *testing.T, es []string) MultiEndpoint { t.Helper() me, err := NewMultiEndpoint(&MultiEndpointOptions{ Endpoints: es, }) if err != nil { t.Fatalf("multiendpointBuilder.Build() returns unexpected error: %v", err) } return me } func initWithDelays(t *testing.T, es []string, r time.Duration, d time.Duration) MultiEndpoint { t.Helper() me, err := NewMultiEndpoint(&MultiEndpointOptions{ Endpoints: es, RecoveryTimeout: r, SwitchingDelay: d, }) if err != nil { t.Fatalf("multiendpointBuilder.Build() returns unexpected error: %v", err) } return me } func TestRestrictEmptyEndpoints(t *testing.T) { b := &MultiEndpointOptions{ RecoveryTimeout: 1, SwitchingDelay: 2, } expectedErr := "endpoints list cannot be empty" if _, err := NewMultiEndpoint(b); err == nil || err.Error() != expectedErr { t.Errorf("multiendpointBuilder.Build() returns wrong err: %v, want: %v", err, expectedErr) } } func TestCurrentIsFirstAfterInit(t *testing.T) { me, err := NewMultiEndpoint(&MultiEndpointOptions{ Endpoints: threeEndpoints, }) if err != nil { t.Fatalf("multiendpointBuilder.Build() returns unexpected error: %v", err) } if c := me.Current(); c != threeEndpoints[0] { t.Errorf("Current() returns %q, want: %q", c, threeEndpoints[0]) } } func TestReturnsTopPriorityAvailableEndpointWithoutRecovery(t *testing.T) { me := initPlain(t, threeEndpoints) // Returns first after creation. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Second becomes available. me.SetEndpointAvailability(threeEndpoints[1], true) // Second is the current as the only available. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Third becomes available. me.SetEndpointAvailability(threeEndpoints[2], true) // Second is still the current because it has higher priority. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // First becomes available. me.SetEndpointAvailability(threeEndpoints[0], true) // First becomes the current because it has higher priority. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Second becomes unavailable. me.SetEndpointAvailability(threeEndpoints[1], false) // Second becoming unavailable should not affect the current first. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // First becomes unavailable. me.SetEndpointAvailability(threeEndpoints[0], false) // Third becomes the current as the only remaining available. if c, want := me.Current(), threeEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Third becomes unavailable. me.SetEndpointAvailability(threeEndpoints[2], false) // After all endpoints became unavailable the multiEndpoint sticks to the last used endpoint. if c, want := me.Current(), threeEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestCurrentReturnsTopPriorityAvailableEndpointWithRecovery(t *testing.T) { me := initWithDelays(t, threeEndpoints, recoveryTO, 0) // Returns first after creation. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Second becomes available. me.SetEndpointAvailability(threeEndpoints[1], true) // First is still the current to allow it to become available within recovery timeout. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // After recovery timeout has passed. advanceTime(t, recoveryTO) // Second becomes current as an available endpoint with top priority. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Third becomes available. me.SetEndpointAvailability(threeEndpoints[2], true) // Second is still the current because it has higher priority. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Second becomes unavailable. me.SetEndpointAvailability(threeEndpoints[1], false) // Second is still current, allowing upto recoveryTimeout to recover. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Halfway through recovery timeout the second recovers. advanceTime(t, recoveryTO/2) me.SetEndpointAvailability(threeEndpoints[1], true) // Second is the current. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // After the initial recovery timeout, the second is still current. advanceTime(t, recoveryTO/2) if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Second becomes unavailable. me.SetEndpointAvailability(threeEndpoints[1], false) // After recovery timeout has passed. advanceTime(t, recoveryTO) // Changes to an available endpoint -- third. if c, want := me.Current(), threeEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // First becomes available. me.SetEndpointAvailability(threeEndpoints[0], true) // First becomes current immediately. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // First becomes unavailable. me.SetEndpointAvailability(threeEndpoints[0], false) // First is still current, allowing upto recoveryTimeout to recover. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // After recovery timeout has passed. advanceTime(t, recoveryTO) // Changes to an available endpoint -- third. if c, want := me.Current(), threeEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Third becomes unavailable me.SetEndpointAvailability(threeEndpoints[2], false) // Third is still current, allowing upto recoveryTimeout to recover. if c, want := me.Current(), threeEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Halfway through recovery timeout the second becomes available. advanceTime(t, recoveryTO/2) me.SetEndpointAvailability(threeEndpoints[1], true) // Second becomes current immediately. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Second becomes unavailable. me.SetEndpointAvailability(threeEndpoints[1], false) // Second is still current, allowing upto recoveryTimeout to recover. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // After recovery timeout has passed. advanceTime(t, recoveryTO) // After all endpoints became unavailable the multiEndpoint sticks to the last used endpoint. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsErrorWhenEmptyEndpoints(t *testing.T) { me := initPlain(t, threeEndpoints) expectedErr := "endpoints list cannot be empty" if err := me.SetEndpoints([]string{}); err == nil || err.Error() != expectedErr { t.Errorf("multiendpointBuilder.Build() returns wrong err: %v, want: %v", err, expectedErr) } } func TestSetEndpointsUpdatesEndpoints(t *testing.T) { me := initPlain(t, threeEndpoints) me.SetEndpoints(fourEndpoints) // "first" which is now under index 1 still current because no other available. if c, want := me.Current(), fourEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsUpdatesEndpointsWithRecovery(t *testing.T) { me := initWithDelays(t, threeEndpoints, recoveryTO, 0) me.SetEndpoints(fourEndpoints) // "first" which is now under index 1 still current because no other available. if c, want := me.Current(), fourEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsUpdatesEndpointsPreservingStates(t *testing.T) { me := initPlain(t, threeEndpoints) // Second is available. me.SetEndpointAvailability(threeEndpoints[1], true) me.SetEndpoints(fourEndpoints) // "second" which is now under index 3 still must remain available. if c, want := me.Current(), fourEndpoints[3]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsUpdatesEndpointsSwitchToTopPriorityAvailable(t *testing.T) { me := initPlain(t, threeEndpoints) // Second and third is available. me.SetEndpointAvailability(threeEndpoints[1], true) me.SetEndpointAvailability(threeEndpoints[2], true) me.SetEndpoints(fourEndpoints) // "third" which is now under index 2 must become current, because "second" has lower priority. if c, want := me.Current(), fourEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsUpdatesEndpointsSwitchToTopPriorityAvailableWithRecovery(t *testing.T) { me := initWithDelays(t, threeEndpoints, recoveryTO, 0) // After recovery timeout has passed. advanceTime(t, recoveryTO) // Second and third is available. me.SetEndpointAvailability(threeEndpoints[1], true) me.SetEndpointAvailability(threeEndpoints[2], true) me.SetEndpoints(fourEndpoints) // "third" which is now under index 2 must become current, because "second" has lower priority. if c, want := me.Current(), fourEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsUpdatesEndpointsRemovesOnlyActiveEndpoint(t *testing.T) { extraEndpoints := append(threeEndpoints, "extra") me := initPlain(t, extraEndpoints) // Extra is available. me.SetEndpointAvailability("extra", true) // Extra is current if c, want := me.Current(), extraEndpoints[3]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Extra is removed. me.SetEndpoints(fourEndpoints) // "fourth" which is under index 0 must become current, because no endpoints are available. if c, want := me.Current(), fourEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsUpdatesEndpointsRemovesOnlyActiveEndpointWithRecovery(t *testing.T) { extraEndpoints := append(threeEndpoints, "extra") me := initWithDelays(t, extraEndpoints, recoveryTO, 0) // After recovery timeout has passed. advanceTime(t, recoveryTO) // Extra is available. me.SetEndpointAvailability("extra", true) // Extra is removed. me.SetEndpoints(fourEndpoints) // "fourth" which is under index 0 must become current, because no endpoints available. if c, want := me.Current(), fourEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsRecoveringEndpointGetsRemoved(t *testing.T) { extraEndpoints := append(threeEndpoints, "extra") me := initWithDelays(t, extraEndpoints, recoveryTO, 0) // After recovery timeout has passed. advanceTime(t, recoveryTO) // Extra is available. me.SetEndpointAvailability("extra", true) // Extra is recovering. me.SetEndpointAvailability("extra", false) // Extra is removed. me.SetEndpoints(fourEndpoints) // "fourth" which is under index 0 must become current, because no endpoints available. if c, want := me.Current(), fourEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // After recovery timeout has passed. advanceTime(t, recoveryTO) // "fourth" is still current. if c, want := me.Current(), fourEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointAvailableSubsequentUnavailableShouldNotExtendRecoveryTimeout(t *testing.T) { // All endpoints are recovering. me := initWithDelays(t, threeEndpoints, recoveryTO, 0) // Before recovery timeout repeat unavailable signal. advanceTime(t, recoveryTO/2) me.SetEndpointAvailability(threeEndpoints[0], false) // After the initial timeout it must become unavailable. advanceTime(t, recoveryTO/2) if c, want := me.(*multiEndpoint).endpoints[threeEndpoints[0]], unavailable; c.status != want { t.Fatalf("%q endpoint state is %q, want: %q", threeEndpoints[0], c.status, want) } } func TestSetEndpointAvailableRecoveringUnavailableRace(t *testing.T) { // All endpoints are recovering. me := initWithDelays(t, threeEndpoints, recoveryTO, 0) // Set "second" available to have something to fallback to. me.SetEndpointAvailability(threeEndpoints[1], true) for i := 0; i < 100; i++ { // Right at the recovery timeout we enable the "first". This should race with the "first" // becoming unavailable from its recovery timer. If this race condition is not covered then // the test will most likely fail or at least be flaky. advanceTimeConcurring(t, recoveryTO, []func(){ func() { me.SetEndpointAvailability(threeEndpoints[0], true) }, }) // It is expected that the scheduled Recovering->Unavailable state change (from the recovery // timeout) and Recovering->Available from the above setEndpointAvailable are guarded by // mutex and cannot run in parallel. Moreover, if Recovering->Unavailable is run after // Recovering->Available, then Recovering->Unavailable has no effect because it was planned // to move the endpoint to Unavailable after recovery timeout but the endpoint became // Availalble a moment earlier. // Thus in any case the "first" endpoint must be current at this moment. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } advanceTime(t, recoveryTO) // Make sure the "first" endpoint is still current after another recovery timeout. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Send it back to recovery state and start recovery timer. me.SetEndpointAvailability(threeEndpoints[0], false) } } func TestSetEndpointAvailableDoNotSwitchToUnavailableFromAvailable(t *testing.T) { me := initWithDelays(t, threeEndpoints, recoveryTO, switchDelay) // Second and third endpoint are available. me.SetEndpointAvailability(threeEndpoints[1], true) me.SetEndpointAvailability(threeEndpoints[2], true) advanceTime(t, recoveryTO) // Second is current after recovery timeout. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // First becomes available. me.SetEndpointAvailability(threeEndpoints[0], true) // Switching is planned to "first" after switching delay. "second" is still current. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Almost at switching delay the "first" endpoint becomes unavailable again. advanceTime(t, switchDelay-(switchDelay/10)) me.SetEndpointAvailability(threeEndpoints[0], false) // After switching delay the current must be "second". No switching to the recovering // "first" should occur. advanceTime(t, switchDelay/5) if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointAvailableDoNotSwitchPreemptively(t *testing.T) { me := initWithDelays(t, threeEndpoints, recoveryTO, switchDelay) // All unavailable after recovery timeout. advanceTime(t, recoveryTO) // Only second endpoint is available. me.SetEndpointAvailability(threeEndpoints[1], true) // After switching delay the second should be current. advanceTime(t, switchDelay) if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Third becomes available. This shouldn't schedule the switch as second is still // the most preferable. me.SetEndpointAvailability(threeEndpoints[2], true) advanceTime(t, switchDelay/2) // Halfway to switch delay the first endpoint becomes available. me.SetEndpointAvailability(threeEndpoints[0], true) advanceTime(t, switchDelay/2) // After complete switching delay since third become available, the second should still be // current because we didn't schedule the switch when third became available. if c, want := me.Current(), threeEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } advanceTime(t, switchDelay/2) // But after switching delay passed since first became available it should become current. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } func TestSetEndpointsSwitchingDelayed(t *testing.T) { me := initWithDelays(t, threeEndpoints, recoveryTO, switchDelay) // All endpoints are available. for _, e := range threeEndpoints { me.SetEndpointAvailability(e, true) } // First is current. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Prepend a new endpoint and make it available. extraEndpoints := []string{"extra"} extraEndpoints = append(extraEndpoints, threeEndpoints...) me.SetEndpoints(extraEndpoints) me.SetEndpointAvailability(extraEndpoints[0], true) // The current endpoint should not change instantly. if c, want := me.Current(), threeEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // But after switching delay it should. advanceTime(t, switchDelay) if c, want := me.Current(), extraEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Make current endpoint unavailable. me.SetEndpointAvailability(extraEndpoints[0], false) // Should wait for recovery timeout. if c, want := me.Current(), extraEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Should switch to a healthy endpoint after recovery timeout and not the switching delay. advanceTime(t, recoveryTO) if c, want := me.Current(), extraEndpoints[1]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Prepend another endpoint. updatedEndpoints := []string{"extra2"} updatedEndpoints = append(updatedEndpoints, extraEndpoints...) me.SetEndpoints(updatedEndpoints) // Now the endpoints are: // 0 extra2 UNAVAILABLE // 1 extra UNAVAILABLE // 2 first AVAILABLE <-- current // 3 second AVAILABLE // 4 third AVAILABLE // Make "extra" endpoint available. me.SetEndpointAvailability("extra", true) // Should wait for the switching delay. // Halfway it should be still "first" endpoint. advanceTime(t, switchDelay/2) if c, want := me.Current(), updatedEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // Now another higher priority endpoint becomes available. me.SetEndpointAvailability("extra2", true) // Still "first" endpoint is current because switching delay has not passed. if c, want := me.Current(), updatedEndpoints[2]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } // After another half of the switching delay has passed it should switch to the "extra2" because // it is a top priority available endpoint at the moment. advanceTime(t, switchDelay/2) if c, want := me.Current(), updatedEndpoints[0]; c != want { t.Fatalf("Current() returns %q, want: %q", c, want) } } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_config.json000066400000000000000000000006431457366620600223010ustar00rootroot00000000000000{ "channelPool": { "maxSize": 10, "maxConcurrentStreamsLowWatermark": 10 }, "method": [ { "name": [ "method1" ], "affinity": { "command": "BIND", "affinityKey": "key1" } }, { "name": [ "method2" ], "affinity": { "command": "BOUND", "affinityKey": "key2" } }, { "name": [ "method3" ], "affinity": { "command": "UNBIND", "affinityKey": "key3" } } ] }grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_grpc/000077500000000000000000000000001457366620600210715ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_grpc/gcp_multiendpoint_test.go000066400000000000000000000562501457366620600262130ustar00rootroot00000000000000/* * * Copyright 2023 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 test_grpc import ( "context" "net" "sync" "sync/atomic" "testing" "time" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/multiendpoint" "github.com/google/go-cmp/cmp" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/testing/protocmp" configpb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/test_grpc/helloworld/helloworld" ) type tempIOError struct{} func (e *tempIOError) Error() string { return "simulated temporary IO error" } func (e *tempIOError) Timeout() bool { return false } func (e *tempIOError) Temporary() bool { return true } var ( tempErr = &tempIOError{} callTO = time.Second waitTO = time.Second * 3 ) type faultyConn struct { es *endpointStats endpoint string conn net.Conn net.Conn } func (f *faultyConn) faulty() bool { return f.es.faulty(f.endpoint) } func (f *faultyConn) Read(b []byte) (n int, err error) { if f.faulty() { f.conn.Close() return f.conn.Read(b) } return f.conn.Read(b) } func (f *faultyConn) Write(b []byte) (n int, err error) { if f.faulty() { f.conn.Close() return f.conn.Write(b) } return f.conn.Write(b) } func (f *faultyConn) Close() error { return f.conn.Close() } func (f *faultyConn) LocalAddr() net.Addr { return f.conn.LocalAddr() } func (f *faultyConn) RemoteAddr() net.Addr { return f.conn.RemoteAddr() } func (f *faultyConn) SetDeadline(t time.Time) error { return f.conn.SetDeadline(t) } func (f *faultyConn) SetReadDeadline(t time.Time) error { return f.conn.SetReadDeadline(t) } func (f *faultyConn) SetWriteDeadline(t time.Time) error { return f.conn.SetWriteDeadline(t) } type endpointStats struct { sync.Map } func (es *endpointStats) faulty(e string) bool { val, _ := es.Load(e) return val == false } func (es *endpointStats) dialer(ctx context.Context, s string) (net.Conn, error) { if es.faulty(s) { return nil, tempErr } fConn := &faultyConn{ endpoint: s, es: es, } var err error fConn.conn, err = net.Dial("tcp", s) return fConn, err } // Verifies that SayHello call is successful and went through the `expectedEndpoint`. func (tc *testingClient) SayHelloWorks(ctx context.Context, expectedEndpoint string) { tc.t.Helper() ctx, cancel := context.WithTimeout(ctx, callTO) defer cancel() var header metadata.MD if _, err := tc.c.SayHello(ctx, &pb.HelloRequest{Name: "world"}, grpc.Header(&header)); err != nil { tc.t.Fatalf("could not greet: %v", err) } if got, want := header["authority-was"][0], expectedEndpoint; got != want { tc.t.Fatalf("endpoint wanted %q, got %q", want, got) } } // Verifies that SayHello call fails with one of the `codes`. func (tc *testingClient) SayHelloFails(ctx context.Context, codes ...codes.Code) { tc.t.Helper() ctx, cancel := context.WithTimeout(ctx, callTO) defer cancel() var header metadata.MD _, err := tc.c.SayHello(ctx, &pb.HelloRequest{Name: "world"}, grpc.Header(&header)) for _, c := range codes { if status.Code(err) == c { return } } tc.t.Fatalf("SayHello() want error with codes: %v, got code: %v, got error: %v", codes, status.Code(err), err) } // Verifies that SayHello call either fails with one of the `codes` or succeeds via the // `expectedEndpoint`. // Returns error if SayHello fails with one of the `codes` and nil if SayHello succeeds. func (tc *testingClient) SayHelloWorksOrFailsWith(ctx context.Context, expectedEndpoint string, codes ...codes.Code) error { tc.t.Helper() ctx, cancel := context.WithTimeout(ctx, callTO) defer cancel() var header metadata.MD _, err := tc.c.SayHello(ctx, &pb.HelloRequest{Name: "world"}, grpc.Header(&header)) if err != nil { for _, c := range codes { if status.Code(err) == c { return err } } tc.t.Fatalf("SayHello() want error with codes: %v, got code: %v, got error: %v", codes, status.Code(err), err) } if got, want := header["authority-was"][0], expectedEndpoint; got != want { tc.t.Fatalf("endpoint wanted %q, got %q", want, got) } return nil } // Calls SayHello until it succeeds via the `expectedEndpoint` or timeouts after `to`. // In the end verifies if SayHello succeeds via the `expectedEndpoint`. func (tc *testingClient) SayHelloWorksWithin(ctx context.Context, expectedEndpoint string, to time.Duration) { tc.t.Helper() toCTX, cancel := context.WithTimeout(context.Background(), to) defer cancel() type sayHelloResult struct { err error endpoint string } c := make(chan *sayHelloResult) defer close(c) go func() { var header metadata.MD for toCTX.Err() != nil { ctx, cancel := context.WithTimeout(ctx, callTO) defer cancel() _, err := tc.c.SayHello(ctx, &pb.HelloRequest{Name: "world"}, grpc.Header(&header)) c <- &sayHelloResult{ err: err, endpoint: header["authority-was"][0], } time.Sleep(time.Millisecond * 50) } }() loop: for { select { case <-toCTX.Done(): break loop case r := <-c: if r.err == nil && r.endpoint == expectedEndpoint { break loop } } } tc.SayHelloWorks(ctx, expectedEndpoint) } // Calls SayHello as long as it fails with one of the `codes` and until it succeds but not longer than `to` // Verifies that the successful call was via the `expectedEndpoint`. func (tc *testingClient) SayHelloFailsThenWorks(ctx context.Context, expectedEndpoint string, to time.Duration, codes ...codes.Code) { tc.t.Helper() toCTX, cancel := context.WithTimeout(context.Background(), to) defer cancel() failedTimes := 0 for toCTX.Err() == nil { time.Sleep(time.Millisecond * 20) ctx, cancel := context.WithTimeout(ctx, callTO) defer cancel() if err := tc.SayHelloWorksOrFailsWith(ctx, expectedEndpoint, codes...); err == nil { // Worked via expectedEndpoint. if failedTimes == 0 { tc.t.Fatalf("SayHello didn't fail. Expected SayHello to fail at least one time with codes %v", codes) } return } failedTimes++ } tc.SayHelloWorks(ctx, expectedEndpoint) } type testingClient struct { c pb.GreeterClient t *testing.T } func TestGCPMultiEndpoint(t *testing.T) { lEndpoint, fEndpoint := "localhost:50051", "127.0.0.3:50051" newE, newE2 := "127.0.0.1:50051", "127.0.0.2:50051" defaultME, followerME := "default", "follower" // We start with leader unavailable. eStats := endpointStats{} eStats.Store(lEndpoint, false) eStats.Store(fEndpoint, true) eStats.Store(newE, true) eStats.Store(newE2, true) apiCfg := &configpb.ApiConfig{ ChannelPool: &configpb.ChannelPoolConfig{ MinSize: 3, MaxSize: 3, }, } conn, err := grpcgcp.NewGCPMultiEndpoint( &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{lEndpoint, fEndpoint}, }, followerME: { Endpoints: []string{fEndpoint, lEndpoint}, }, }, Default: defaultME, }, grpc.WithInsecure(), grpc.WithContextDialer(eStats.dialer), ) if err != nil { t.Fatalf("NewMultiEndpointConn returns unexpected error: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) tc := &testingClient{ c: c, t: t, } // First call to the default endpoint may fail because the leader endpoint is unavailable // or may fallback to the follower if leader connection status is received before this point. tc.SayHelloWorksOrFailsWith(context.Background(), fEndpoint, codes.Unavailable) // But follower-first ME works from the beginning. fCtx := grpcgcp.NewMEContext(context.Background(), followerME) tc.SayHelloWorks(fCtx, fEndpoint) // Make sure default switched to follower in a few moments. tc.SayHelloWorks(context.Background(), fEndpoint) // Enable the leader endpoint. eStats.Store(lEndpoint, true) // Give some time to connect. Should work through leader endpoint. tc.SayHelloWorksWithin(context.Background(), lEndpoint, waitTO) // make sure follower still uses follower endpoint. tc.SayHelloWorks(fCtx, fEndpoint) // Disable follower endpoint. eStats.Store(fEndpoint, false) // Expect first calls (by number of channels) to follower will fail after that. // Give some time to detect breakage. Make sure follower switched to leader endpoint. tc.SayHelloFailsThenWorks(fCtx, lEndpoint, waitTO, codes.Unavailable) // Enable follower endpoint. eStats.Store(fEndpoint, true) // Give some time to connect/switch. Make sure follower switched back to follower endpoint. tc.SayHelloWorksWithin(fCtx, fEndpoint, waitTO) // Add new endpoint newE to the follower ME. newMEs := &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{lEndpoint, fEndpoint}, }, followerME: { Endpoints: []string{newE, fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) // Give some time to connect. Make sure follower uses new endpoint in a few moments. tc.SayHelloWorksWithin(fCtx, newE, waitTO) // Add the same endpoint to the default ME. newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{newE, lEndpoint, fEndpoint}, }, followerME: { Endpoints: []string{newE, fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) // Make sure the new endpoint is used immediately by the default ME // (because it should know it is ready already). tc.SayHelloWorks(context.Background(), newE) // Rearrange endpoints in the default ME, make sure new top endpoint is used immediately. newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{fEndpoint, newE, lEndpoint}, }, followerME: { Endpoints: []string{newE, fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) tc.SayHelloWorks(context.Background(), fEndpoint) // Renaming follower ME. followerME2 := "follower2" newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{fEndpoint, newE, lEndpoint}, }, followerME2: { Endpoints: []string{newE, fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) f2Ctx := grpcgcp.NewMEContext(context.Background(), followerME2) tc.SayHelloWorks(f2Ctx, newE) // Replace follower endpoint with a new endpoint (not connected). newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{newE2, newE, lEndpoint}, }, followerME2: { Endpoints: []string{newE, newE2, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) // Give some time to connect. newE2 must be used. tc.SayHelloWorksWithin(context.Background(), newE2, waitTO) // Let the follower endpoint shutdown. time.Sleep(time.Second) // Replace new endpoints with the follower endpoint. newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{fEndpoint, lEndpoint}, }, followerME2: { Endpoints: []string{fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) // leader should be used as follower was shutdown previously. tc.SayHelloWorks(context.Background(), lEndpoint) // Give some time to connect. Follower must be used. tc.SayHelloWorksWithin(context.Background(), fEndpoint, waitTO) } func TestGCPMultiEndpointWithDelays(t *testing.T) { recoveryTimeout := time.Millisecond * 500 switchingDelay := time.Millisecond * 700 margin := time.Millisecond * 50 lEndpoint, fEndpoint := "localhost:50051", "127.0.0.3:50051" newE, newE2 := "127.0.0.1:50051", "127.0.0.2:50051" defaultME, followerME := "default", "follower" // We start with leader unavailable. eStats := endpointStats{} eStats.Store(lEndpoint, false) eStats.Store(fEndpoint, true) eStats.Store(newE, true) eStats.Store(newE2, true) apiCfg := &configpb.ApiConfig{ ChannelPool: &configpb.ChannelPoolConfig{ MinSize: 3, MaxSize: 3, }, } conn, err := grpcgcp.NewGCPMultiEndpoint( &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{lEndpoint, fEndpoint}, RecoveryTimeout: recoveryTimeout, SwitchingDelay: switchingDelay, }, followerME: { Endpoints: []string{fEndpoint, lEndpoint}, RecoveryTimeout: recoveryTimeout, SwitchingDelay: switchingDelay, }, }, Default: defaultME, }, grpc.WithInsecure(), grpc.WithContextDialer(eStats.dialer), ) if err != nil { t.Fatalf("NewMultiEndpointConn returns unexpected error: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) tc := &testingClient{ c: c, t: t, } start := time.Now() // First call to the default endpoint will fail because the leader endpoint is unavailable. tc.SayHelloFails(context.Background(), codes.Unavailable) // But follower-first ME works from the beginning. fCtx := grpcgcp.NewMEContext(context.Background(), followerME) tc.SayHelloWorks(fCtx, fEndpoint) // Make sure default is not switched to the follower before recovery timeout. time.Sleep(recoveryTimeout - time.Now().Sub(start) - margin) tc.SayHelloWorksOrFailsWith(context.Background(), fEndpoint, codes.Unavailable) // Make sure default switched to follower after recovery timeout. time.Sleep(recoveryTimeout - time.Now().Sub(start) + margin) tc.SayHelloWorks(context.Background(), fEndpoint) // Enable the leader endpoint. eStats.Store(lEndpoint, true) // Give some time to connect. Should work through leader endpoint. tc.SayHelloWorksWithin(context.Background(), lEndpoint, 2*time.Second+switchingDelay) // make sure follower still uses follower endpoint. tc.SayHelloWorks(fCtx, fEndpoint) // Disable follower endpoint. eStats.Store(fEndpoint, false) // Expect first calls (by number of channels) to follower will fail after that. // Give some time to detect breakage. Make sure follower switched to leader endpoint. tc.SayHelloFailsThenWorks(fCtx, lEndpoint, waitTO, codes.Unavailable) // Enable follower endpoint. eStats.Store(fEndpoint, true) // Give some time to connect/switch. Make sure follower switched back to follower endpoint. tc.SayHelloWorksWithin(fCtx, fEndpoint, waitTO+recoveryTimeout) // add new endpoint to follower ME (first) newMEs := &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{lEndpoint, fEndpoint}, }, followerME: { Endpoints: []string{newE, fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) start = time.Now() // Make sure followerME has not switched to the new endpoint before switching delay. time.Sleep(switchingDelay - margin) tc.SayHelloWorks(fCtx, fEndpoint) // Make sure followerME has switched to the new endpoint after switching delay. time.Sleep(switchingDelay - time.Now().Sub(start) + margin) tc.SayHelloWorks(fCtx, newE) // Add the same endpoint to the default ME. newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{newE, lEndpoint, fEndpoint}, }, followerME: { Endpoints: []string{newE, fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) // Even though the new endpoint is ready switching delay must kick in here. start = time.Now() // Make sure defaultME has not switched to the new endpoint before switching delay. time.Sleep(switchingDelay - margin) tc.SayHelloWorks(context.Background(), lEndpoint) // Make sure followerME has switched to the new endpoint after switching delay. time.Sleep(switchingDelay - time.Now().Sub(start) + margin) tc.SayHelloWorks(context.Background(), newE) // Rearrange endpoints in the default ME, make sure new top endpoint is used after switching delay. newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{fEndpoint, newE, lEndpoint}, }, followerME: { Endpoints: []string{newE, fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) start = time.Now() // Make sure defaultME has not switched to the new endpoint before switching delay. time.Sleep(switchingDelay - margin) tc.SayHelloWorks(context.Background(), newE) // Make sure followerME has switched to the new endpoint after switching delay. time.Sleep(switchingDelay - time.Now().Sub(start) + margin) tc.SayHelloWorks(context.Background(), fEndpoint) // Renaming follower ME. followerME2 := "follower2" newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{fEndpoint, newE, lEndpoint}, }, followerME2: { Endpoints: []string{newE, fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) f2Ctx := grpcgcp.NewMEContext(context.Background(), followerME2) tc.SayHelloWorks(f2Ctx, newE) // Replace follower endpoint with a new endpoint (not connected). newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{newE2, newE, lEndpoint}, }, followerME2: { Endpoints: []string{newE, newE2, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) // newE is still used as newE2 is not connected yet. tc.SayHelloWorks(context.Background(), newE) // Give some time to connect. newE2 must be used. tc.SayHelloWorksWithin(context.Background(), newE2, waitTO) // Let the follower endpoint shutdown. time.Sleep(time.Second) // Replace new endpoints with the follower endpoint. newMEs = &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{fEndpoint, lEndpoint}, }, followerME2: { Endpoints: []string{fEndpoint, lEndpoint}, }, }, Default: defaultME, } conn.UpdateMultiEndpoints(newMEs) // leader should be used as follower was shut down previously. tc.SayHelloWorks(context.Background(), lEndpoint) // Give some time to connect and switching delay. Follower must be used. tc.SayHelloWorksWithin(context.Background(), fEndpoint, waitTO+switchingDelay) } func TestGCPMultiEndpointInstantShutdown(t *testing.T) { defer func() { if r := recover(); r != nil { t.Fatalf("Panic: %v", r) } }() defaultME := "default" apiCfg := &configpb.ApiConfig{ ChannelPool: &configpb.ChannelPoolConfig{ MinSize: 3, MaxSize: 3, }, } conn, err := grpcgcp.NewGCPMultiEndpoint( &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{"localhost:50051"}, }, }, Default: defaultME, }, grpc.WithInsecure(), ) if err != nil { t.Fatalf("NewMultiEndpointConn returns unexpected error: %v", err) } // Closing GCPMultiEndpoint immediately should not cause panic. conn.Close() } func TestGCPMultiEndpointDialFunc(t *testing.T) { lEndpoint, fEndpoint := "localhost:50051", "127.0.0.3:50051" defaultME, followerME := "default", "follower" apiCfg := &configpb.ApiConfig{ ChannelPool: &configpb.ChannelPoolConfig{ MinSize: 3, MaxSize: 3, }, } dialUsedFor := make(map[string]*atomic.Int32) dialUsedFor[lEndpoint] = &atomic.Int32{} dialUsedFor[fEndpoint] = &atomic.Int32{} conn, err := grpcgcp.NewGCPMultiEndpoint( &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{lEndpoint, fEndpoint}, }, followerME: { Endpoints: []string{fEndpoint, lEndpoint}, }, }, Default: defaultME, DialFunc: func(ctx context.Context, target string, dopts ...grpc.DialOption) (*grpc.ClientConn, error) { dialUsedFor[target].Add(1) return grpc.DialContext(ctx, target, dopts...) }, }, grpc.WithInsecure(), ) if err != nil { t.Fatalf("NewMultiEndpointConn returns unexpected error: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) tc := &testingClient{ c: c, t: t, } // Make a call to make sure GCPMultiEndpoint is up and running. tc.SayHelloWorks(context.Background(), lEndpoint) if got, want := dialUsedFor[lEndpoint].Load(), int32(1); got != want { t.Fatalf("provided dial function was called for %q endpoint %v times, want %v times", lEndpoint, got, want) } if got, want := dialUsedFor[fEndpoint].Load(), int32(1); got != want { t.Fatalf("provided dial function was called for %q endpoint %v times, want %v times", fEndpoint, got, want) } } func TestGCPMultiEndpointGCPConfig(t *testing.T) { lEndpoint, fEndpoint := "localhost:50051", "127.0.0.3:50051" defaultME, followerME := "default", "follower" apiCfg := &configpb.ApiConfig{ ChannelPool: &configpb.ChannelPoolConfig{ MinSize: 2, MaxSize: 3, }, } dialUsedFor := make(map[string]*atomic.Int32) dialUsedFor[lEndpoint] = &atomic.Int32{} dialUsedFor[fEndpoint] = &atomic.Int32{} conn, err := grpcgcp.NewGCPMultiEndpoint( &grpcgcp.GCPMultiEndpointOptions{ GRPCgcpConfig: apiCfg, MultiEndpoints: map[string]*multiendpoint.MultiEndpointOptions{ defaultME: { Endpoints: []string{lEndpoint, fEndpoint}, }, followerME: { Endpoints: []string{fEndpoint, lEndpoint}, }, }, Default: defaultME, DialFunc: func(ctx context.Context, target string, dopts ...grpc.DialOption) (*grpc.ClientConn, error) { dialUsedFor[target].Add(1) return grpc.DialContext(ctx, target, dopts...) }, }, grpc.WithInsecure(), ) if err != nil { t.Fatalf("NewMultiEndpointConn returns unexpected error: %v", err) } defer conn.Close() wantCfg := proto.Clone(apiCfg) // This change of the initial config should not be reflected in the following comparison. apiCfg.GetChannelPool().MaxSize = 5 if diff := cmp.Diff(wantCfg, conn.GCPConfig(), protocmp.Transform()); diff != "" { t.Fatalf("conn.GCPConfig() returned unexpected difference in protobuf messages (-want +got):\n%s", diff) } } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_grpc/helloworld/000077500000000000000000000000001457366620600232445ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_grpc/helloworld/codegen.sh000077500000000000000000000002511457366620600252050ustar00rootroot00000000000000#!/usr/bin/env bash cd "$(dirname "$0")" rm -r helloworld protoc --plugin=$(go env GOPATH)/bin/protoc-gen-go --proto_path=./ --go_out=plugins=grpc:. ./helloworld.proto grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_grpc/helloworld/helloworld.proto000066400000000000000000000023761457366620600265140ustar00rootroot00000000000000// 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. syntax = "proto3"; option go_package = "./helloworld"; option java_multiple_files = true; option java_package = "io.grpc.examples.helloworld"; option java_outer_classname = "HelloWorldProto"; package helloworld; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} rpc RepeatHello (stream HelloRequest) returns (stream HelloReply) {} rpc InterruptedHello (stream HelloRequest) returns (stream HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_grpc/helloworld/helloworld/000077500000000000000000000000001457366620600254175ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_grpc/helloworld/helloworld/helloworld.pb.go000066400000000000000000000356701457366620600305340ustar00rootroot00000000000000// 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. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.1 // protoc v3.12.4 // source: helloworld.proto package helloworld import ( context "context" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The request message containing the user's name. type HelloRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *HelloRequest) Reset() { *x = HelloRequest{} if protoimpl.UnsafeEnabled { mi := &file_helloworld_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *HelloRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*HelloRequest) ProtoMessage() {} func (x *HelloRequest) ProtoReflect() protoreflect.Message { mi := &file_helloworld_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead. func (*HelloRequest) Descriptor() ([]byte, []int) { return file_helloworld_proto_rawDescGZIP(), []int{0} } func (x *HelloRequest) GetName() string { if x != nil { return x.Name } return "" } // The response message containing the greetings type HelloReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` } func (x *HelloReply) Reset() { *x = HelloReply{} if protoimpl.UnsafeEnabled { mi := &file_helloworld_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *HelloReply) String() string { return protoimpl.X.MessageStringOf(x) } func (*HelloReply) ProtoMessage() {} func (x *HelloReply) ProtoReflect() protoreflect.Message { mi := &file_helloworld_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use HelloReply.ProtoReflect.Descriptor instead. func (*HelloReply) Descriptor() ([]byte, []int) { return file_helloworld_proto_rawDescGZIP(), []int{1} } func (x *HelloReply) GetMessage() string { if x != nil { return x.Message } return "" } var File_helloworld_proto protoreflect.FileDescriptor var file_helloworld_proto_rawDesc = []byte{ 0x0a, 0x10, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 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, 0x26, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 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, 0xdc, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x65, 0x65, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, 0x64, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x3e, 0x0a, 0x1b, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x42, 0x0f, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x2e, 0x2f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_helloworld_proto_rawDescOnce sync.Once file_helloworld_proto_rawDescData = file_helloworld_proto_rawDesc ) func file_helloworld_proto_rawDescGZIP() []byte { file_helloworld_proto_rawDescOnce.Do(func() { file_helloworld_proto_rawDescData = protoimpl.X.CompressGZIP(file_helloworld_proto_rawDescData) }) return file_helloworld_proto_rawDescData } var file_helloworld_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_helloworld_proto_goTypes = []interface{}{ (*HelloRequest)(nil), // 0: helloworld.HelloRequest (*HelloReply)(nil), // 1: helloworld.HelloReply } var file_helloworld_proto_depIdxs = []int32{ 0, // 0: helloworld.Greeter.SayHello:input_type -> helloworld.HelloRequest 0, // 1: helloworld.Greeter.RepeatHello:input_type -> helloworld.HelloRequest 0, // 2: helloworld.Greeter.InterruptedHello:input_type -> helloworld.HelloRequest 1, // 3: helloworld.Greeter.SayHello:output_type -> helloworld.HelloReply 1, // 4: helloworld.Greeter.RepeatHello:output_type -> helloworld.HelloReply 1, // 5: helloworld.Greeter.InterruptedHello:output_type -> helloworld.HelloReply 3, // [3:6] is the sub-list for method output_type 0, // [0:3] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_helloworld_proto_init() } func file_helloworld_proto_init() { if File_helloworld_proto != nil { return } if !protoimpl.UnsafeEnabled { file_helloworld_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HelloRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_helloworld_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HelloReply); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_helloworld_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 1, }, GoTypes: file_helloworld_proto_goTypes, DependencyIndexes: file_helloworld_proto_depIdxs, MessageInfos: file_helloworld_proto_msgTypes, }.Build() File_helloworld_proto = out.File file_helloworld_proto_rawDesc = nil file_helloworld_proto_goTypes = nil file_helloworld_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // GreeterClient is the client API for Greeter service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type GreeterClient interface { // Sends a greeting SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) RepeatHello(ctx context.Context, opts ...grpc.CallOption) (Greeter_RepeatHelloClient, error) InterruptedHello(ctx context.Context, opts ...grpc.CallOption) (Greeter_InterruptedHelloClient, error) } type greeterClient struct { cc grpc.ClientConnInterface } func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient { return &greeterClient{cc} } func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) { out := new(HelloReply) err := c.cc.Invoke(ctx, "/helloworld.Greeter/SayHello", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *greeterClient) RepeatHello(ctx context.Context, opts ...grpc.CallOption) (Greeter_RepeatHelloClient, error) { stream, err := c.cc.NewStream(ctx, &_Greeter_serviceDesc.Streams[0], "/helloworld.Greeter/RepeatHello", opts...) if err != nil { return nil, err } x := &greeterRepeatHelloClient{stream} return x, nil } type Greeter_RepeatHelloClient interface { Send(*HelloRequest) error Recv() (*HelloReply, error) grpc.ClientStream } type greeterRepeatHelloClient struct { grpc.ClientStream } func (x *greeterRepeatHelloClient) Send(m *HelloRequest) error { return x.ClientStream.SendMsg(m) } func (x *greeterRepeatHelloClient) Recv() (*HelloReply, error) { m := new(HelloReply) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func (c *greeterClient) InterruptedHello(ctx context.Context, opts ...grpc.CallOption) (Greeter_InterruptedHelloClient, error) { stream, err := c.cc.NewStream(ctx, &_Greeter_serviceDesc.Streams[1], "/helloworld.Greeter/InterruptedHello", opts...) if err != nil { return nil, err } x := &greeterInterruptedHelloClient{stream} return x, nil } type Greeter_InterruptedHelloClient interface { Send(*HelloRequest) error Recv() (*HelloReply, error) grpc.ClientStream } type greeterInterruptedHelloClient struct { grpc.ClientStream } func (x *greeterInterruptedHelloClient) Send(m *HelloRequest) error { return x.ClientStream.SendMsg(m) } func (x *greeterInterruptedHelloClient) Recv() (*HelloReply, error) { m := new(HelloReply) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } // GreeterServer is the server API for Greeter service. type GreeterServer interface { // Sends a greeting SayHello(context.Context, *HelloRequest) (*HelloReply, error) RepeatHello(Greeter_RepeatHelloServer) error InterruptedHello(Greeter_InterruptedHelloServer) error } // UnimplementedGreeterServer can be embedded to have forward compatible implementations. type UnimplementedGreeterServer struct { } func (*UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) { return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") } func (*UnimplementedGreeterServer) RepeatHello(Greeter_RepeatHelloServer) error { return status.Errorf(codes.Unimplemented, "method RepeatHello not implemented") } func (*UnimplementedGreeterServer) InterruptedHello(Greeter_InterruptedHelloServer) error { return status.Errorf(codes.Unimplemented, "method InterruptedHello not implemented") } func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) { s.RegisterService(&_Greeter_serviceDesc, srv) } func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(HelloRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GreeterServer).SayHello(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/helloworld.Greeter/SayHello", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest)) } return interceptor(ctx, in, info, handler) } func _Greeter_RepeatHello_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(GreeterServer).RepeatHello(&greeterRepeatHelloServer{stream}) } type Greeter_RepeatHelloServer interface { Send(*HelloReply) error Recv() (*HelloRequest, error) grpc.ServerStream } type greeterRepeatHelloServer struct { grpc.ServerStream } func (x *greeterRepeatHelloServer) Send(m *HelloReply) error { return x.ServerStream.SendMsg(m) } func (x *greeterRepeatHelloServer) Recv() (*HelloRequest, error) { m := new(HelloRequest) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func _Greeter_InterruptedHello_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(GreeterServer).InterruptedHello(&greeterInterruptedHelloServer{stream}) } type Greeter_InterruptedHelloServer interface { Send(*HelloReply) error Recv() (*HelloRequest, error) grpc.ServerStream } type greeterInterruptedHelloServer struct { grpc.ServerStream } func (x *greeterInterruptedHelloServer) Send(m *HelloReply) error { return x.ServerStream.SendMsg(m) } func (x *greeterInterruptedHelloServer) Recv() (*HelloRequest, error) { m := new(HelloRequest) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err } return m, nil } var _Greeter_serviceDesc = grpc.ServiceDesc{ ServiceName: "helloworld.Greeter", HandlerType: (*GreeterServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "SayHello", Handler: _Greeter_SayHello_Handler, }, }, Streams: []grpc.StreamDesc{ { StreamName: "RepeatHello", Handler: _Greeter_RepeatHello_Handler, ServerStreams: true, ClientStreams: true, }, { StreamName: "InterruptedHello", Handler: _Greeter_InterruptedHello_Handler, ServerStreams: true, ClientStreams: true, }, }, Metadata: "helloworld.proto", } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp/test_grpc/main_test.go000066400000000000000000000143161457366620600234100ustar00rootroot00000000000000/* * * Copyright 2023 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 test_grpc import ( "context" "fmt" "io" "log" "net" "testing" "time" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/encoding/protojson" configpb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/test_grpc/helloworld/helloworld" ) var ( port = 50051 s = grpc.NewServer() apiConfigNoMethods = &configpb.ApiConfig{ ChannelPool: &configpb.ChannelPoolConfig{ MaxSize: 4, MaxConcurrentStreamsLowWatermark: 1, }, } apiConfig = &configpb.ApiConfig{ ChannelPool: apiConfigNoMethods.ChannelPool, Method: []*configpb.MethodConfig{ { Name: []string{ "/helloworld.Greeter/SayHello", "/helloworld.Greeter/InterruptedHello", "/helloworld.Greeter/RepeatHello", }, Affinity: &configpb.AffinityConfig{ Command: configpb.AffinityConfig_BIND, AffinityKey: "message", }, }, }, } tests = []struct { name string apicfg *configpb.ApiConfig }{ { name: "ApiConfig with methods", apicfg: apiConfig, }, { name: "ApiConfig without methods", apicfg: apiConfigNoMethods, }, } ) func TestMain(m *testing.M) { defer teardown() if err := setup(); err != nil { panic(fmt.Sprintf("Failed to setup: %v\n", err)) } m.Run() } func setup() error { fmt.Println("Setup started.") go func() { lis, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) if err != nil { log.Fatalf("failed to listen: %v", err) } pb.RegisterGreeterServer(s, &server{}) log.Printf("server listening at %v", lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }() fmt.Println("Setup ended.") return nil } func teardown() { fmt.Println("Teardown started.") s.Stop() fmt.Println("Teardown ended.") } type server struct { pb.UnimplementedGreeterServer } func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { m, _ := metadata.FromIncomingContext(ctx) header := metadata.Pairs("authority-was", m[":authority"][0]) grpc.SendHeader(ctx, header) return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil } func (s *server) RepeatHello(srv pb.Greeter_RepeatHelloServer) error { ctx := srv.Context() for { select { case <-ctx.Done(): return ctx.Err() default: } req, err := srv.Recv() if err == io.EOF { return nil } if err != nil { log.Printf("receive error %v", err) continue } if err := srv.Send(&pb.HelloReply{Message: "Hello " + req.GetName()}); err != nil { log.Printf("send error %v", err) } } } func (s *server) InterruptedHello(srv pb.Greeter_InterruptedHelloServer) error { ctx := srv.Context() for { select { case <-ctx.Done(): return ctx.Err() default: } // Receive data from stream and close the stream immediately. srv.Recv() return nil } } func getConn(config *configpb.ApiConfig, t *testing.T) (*grpc.ClientConn, error) { t.Helper() c, err := protojson.Marshal(config) if err != nil { t.Fatalf("cannot parse config: %v", err) } opts := []grpc.DialOption{ grpc.WithInsecure(), grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingConfig": [{"%s":%s}]}`, grpcgcp.Name, string(c))), grpc.WithUnaryInterceptor(grpcgcp.GCPUnaryClientInterceptor), grpc.WithStreamInterceptor(grpcgcp.GCPStreamClientInterceptor), } return grpc.Dial("localhost:50051", opts...) } func TestUnaryCall(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { conn, err := getConn(test.apicfg, t) if err != nil { t.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "world"}) if err != nil { t.Fatalf("could not greet: %v", err) } if r.GetMessage() != "Hello world" { t.Errorf("Expected Hello World, got %v", r.GetMessage()) } }) } } func TestStreamingCall(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { conn, err := getConn(test.apicfg, t) if err != nil { t.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() rhc, err := c.RepeatHello(ctx) if err != nil { t.Fatalf("could not start stream for RepeatHello: %v", err) } rhc.Send(&pb.HelloRequest{Name: "stream"}) r, err := rhc.Recv() if err != nil { t.Fatalf("could not get reply: %v", err) } if r.GetMessage() != "Hello stream" { t.Errorf("Expected Hello stream, got %v", r.GetMessage()) } if err := rhc.CloseSend(); err != nil { t.Fatalf("could not CloseSend: %v", err) } }) } } func TestStreamingCallNoResponse(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { conn, err := getConn(test.apicfg, t) if err != nil { t.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() rhc, err := c.InterruptedHello(ctx) if err != nil { t.Fatalf("could not start stream for InterruptedHello: %v", err) } rhc.Send(&pb.HelloRequest{Name: "stream"}) _, err = rhc.Recv() wantErr := "EOF" if err == nil || err.Error() != wantErr { t.Fatalf("Recv() got err %v, want err %v", err, wantErr) } }) } } grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp_tests/000077500000000000000000000000001457366620600203215ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp_tests/go.mod000066400000000000000000000032461457366620600214340ustar00rootroot00000000000000module github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp_tests go 1.20 require ( cloud.google.com/go/spanner v1.45.0 github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.2.0 google.golang.org/api v0.114.0 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 google.golang.org/grpc v1.56.3 google.golang.org/protobuf v1.30.0 ) require ( cloud.google.com/go v0.110.0 // indirect cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v0.13.0 // indirect cloud.google.com/go/longrunning v0.4.1 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f // indirect github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.1 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect ) replace github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.2.0 => ../grpcgcp grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp_tests/go.sum000066400000000000000000000400601457366620600214540ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= 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/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/spanner v1.45.0 h1:7VdjZ8zj4sHbDw55atp5dfY6kn1j9sam9DRNpPQhqR4= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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/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-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= 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-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 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/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.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f h1:7T++XKzy4xg7PKy+bM+Sa9/oe1OC88yz2hXQUISoXfA= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= 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.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= 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.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.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 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.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 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/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 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= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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-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-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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/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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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/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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= 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.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/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-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-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= 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.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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/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= grpc-gcp-go-grpcgcp-v1.5.0/grpcgcp_tests/spanner_api_test.go000066400000000000000000000263211457366620600242120ustar00rootroot00000000000000/* * * Copyright 2019 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 grpcgcp_tests import ( "context" "crypto/rand" "fmt" "io" "math/big" "os" "regexp" "strconv" "sync" "testing" "time" "cloud.google.com/go/spanner" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/protobuf/encoding/protojson" dbapi "cloud.google.com/go/spanner/admin/database/apiv1" instapi "cloud.google.com/go/spanner/admin/instance/apiv1" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" apb "google.golang.org/genproto/googleapis/spanner/admin/database/v1" ipb "google.golang.org/genproto/googleapis/spanner/admin/instance/v1" ) var ( randId, _ = rand.Int(rand.Reader, big.NewInt(900000)) skipSpanner = os.Getenv("SKIP_SPANNER") gcpProjectId = os.Getenv("GCP_PROJECT_ID") spannerInstanceId = "test-instance-" + strconv.FormatInt(100000+randId.Int64(), 10) spannerInstancePath = fmt.Sprintf("projects/%s/instances/%s", gcpProjectId, spannerInstanceId) spannerDbId = "test-db" database = "projects/" + gcpProjectId + "/instances/" + spannerInstanceId + "/databases/" + spannerDbId ) const ( regionName = "regional-us-east1" tableName = "storage" column = "id" testSQL = "select id from storage" testColumnData = "payload" setupTimeoutSec = 300 ) func TestMain(m *testing.M) { defer teardown() if err := setup(); err != nil { panic(fmt.Sprintf("Failed to setup: %v\n", err)) } m.Run() } func setup() error { fmt.Println("Setup started.") if skipSpanner != "" { fmt.Println("Setup skipped.") return nil } if gcpProjectId == "" { panic("GCP_PROJECT_ID env variable is empty. Please provide a valid GCP_PROJECT_ID.") } fmt.Printf("Creating Spanner instance %s in project %s...\n", spannerInstanceId, gcpProjectId) ctx, cancel := context.WithTimeout(context.Background(), time.Second*setupTimeoutSec) defer cancel() if err := createTestInstance(ctx, os.Stdout, gcpProjectId, spannerInstanceId); err != nil { return fmt.Errorf("failed to create the instance: %w", err) } fmt.Println("Instance created.") fmt.Printf("Creating Spanner database %s...\n", database) if err := createTestDatabase(ctx, database); err != nil { return fmt.Errorf("failed to create the database: %w", err) } fmt.Println("Database created.") fmt.Printf("Inserting record to the test table...\n") if err := insertTestRecord(ctx); err != nil { return fmt.Errorf("failed to insert test record: %w", err) } fmt.Println("Record inserted.") fmt.Println("Setup ended.") return nil } func teardown() { fmt.Println("Teardown started.") if skipSpanner != "" { fmt.Println("Teardown skipped.") return } ctx, cancel := context.WithTimeout(context.Background(), time.Second*setupTimeoutSec) defer cancel() fmt.Printf("Dropping Spanner instance %s...\n", spannerInstancePath) if err := dropTestInstance(ctx, spannerInstancePath); err != nil { fmt.Printf("Failed to drop Spanner instance: %v\n", err) } else { fmt.Println("Instance dropped.") } fmt.Println("Teardown ended.") } func createTestInstance(ctx context.Context, w io.Writer, projectID, instanceID string) error { instanceAdmin, err := instapi.NewInstanceAdminClient(ctx) if err != nil { return err } defer instanceAdmin.Close() created_at := strconv.FormatInt(time.Now().UTC().Unix(), 10) op, err := instanceAdmin.CreateInstance(ctx, &ipb.CreateInstanceRequest{ Parent: fmt.Sprintf("projects/%s", projectID), InstanceId: instanceID, Instance: &ipb.Instance{ Config: fmt.Sprintf("projects/%s/instanceConfigs/%s", projectID, regionName), DisplayName: instanceID, NodeCount: 1, Labels: map[string]string{ "grpc_gcp_go_tests": "true", "created": created_at, }, }, }) if err != nil { return fmt.Errorf("could not create instance %s: %v", fmt.Sprintf("projects/%s/instances/%s", projectID, instanceID), err) } // Wait for the instance creation to finish. i, err := op.Wait(ctx) if err != nil { return fmt.Errorf("waiting for instance creation to finish failed: %v", err) } // The instance may not be ready to serve yet. if i.State != ipb.Instance_READY { fmt.Fprintf(w, "instance state is not READY yet. Got state %v\n", i.State) } return nil } func dropTestInstance(ctx context.Context, name string) error { instanceAdmin, err := instapi.NewInstanceAdminClient(ctx) if err != nil { return err } defer instanceAdmin.Close() return instanceAdmin.DeleteInstance(ctx, &ipb.DeleteInstanceRequest{Name: name}) } func createTestDatabase(ctx context.Context, db string) error { matches := regexp.MustCompile("^(.*)/databases/(.*)$").FindStringSubmatch(db) if matches == nil || len(matches) != 3 { return fmt.Errorf("Invalid database id %s", db) } adminClient, err := dbapi.NewDatabaseAdminClient(ctx) if err != nil { return err } defer adminClient.Close() sql := fmt.Sprintf("CREATE TABLE %s (%s STRING(1024)) PRIMARY KEY(%[2]s)", tableName, column) op, err := adminClient.CreateDatabase(ctx, &apb.CreateDatabaseRequest{ Parent: matches[1], CreateStatement: "CREATE DATABASE `" + matches[2] + "`", ExtraStatements: []string{sql}, }) if err != nil { return err } if _, err := op.Wait(ctx); err != nil { return err } return nil } func insertTestRecord(ctx context.Context) error { client, err := spanner.NewClient(ctx, database) defer client.Close() if err != nil { return err } m := spanner.InsertOrUpdate(tableName, []string{column}, []interface{}{testColumnData}) _, err = client.Apply(ctx, []*spanner.Mutation{m}) return err } func initSpannerClient(t *testing.T, ctx context.Context) *spanner.Client { apiConfig := &pb.ApiConfig{ ChannelPool: &pb.ChannelPoolConfig{ MinSize: 4, MaxSize: 4, BindPickStrategy: pb.ChannelPoolConfig_ROUND_ROBIN, }, Method: []*pb.MethodConfig{ { Name: []string{"/google.spanner.v1.Spanner/CreateSession"}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BIND, AffinityKey: "name", }, }, { Name: []string{"/google.spanner.v1.Spanner/GetSession"}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BOUND, AffinityKey: "name", }, }, { Name: []string{"/google.spanner.v1.Spanner/DeleteSession"}, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_UNBIND, AffinityKey: "name", }, }, { Name: []string{ "/google.spanner.v1.Spanner/ExecuteSql", "/google.spanner.v1.Spanner/ExecuteStreamingSql", "/google.spanner.v1.Spanner/Read", "/google.spanner.v1.Spanner/StreamingRead", "/google.spanner.v1.Spanner/BeginTransaction", "/google.spanner.v1.Spanner/Commit", "/google.spanner.v1.Spanner/Rollback", "/google.spanner.v1.Spanner/PartitionQuery", "/google.spanner.v1.Spanner/PartitionRead", }, Affinity: &pb.AffinityConfig{ Command: pb.AffinityConfig_BOUND, AffinityKey: "session", }, }, }, } c, err := protojson.Marshal(apiConfig) if err != nil { t.Fatalf("cannot json encode config: %v", err) } opts := []option.ClientOption{ option.WithGRPCDialOption(grpc.WithDisableServiceConfig()), option.WithGRPCDialOption(grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingConfig": [{"%s":%s}]}`, grpcgcp.Name, string(c)))), option.WithGRPCDialOption(grpc.WithUnaryInterceptor(grpcgcp.GCPUnaryClientInterceptor)), option.WithGRPCDialOption(grpc.WithStreamInterceptor(grpcgcp.GCPStreamClientInterceptor)), } // NumChannels in ClientConfig represents the number of ClientConns created by grpc. // We should set it to 1 since we are using one clientconn with pool of subconns. client, err := spanner.NewClientWithConfig(ctx, database, spanner.ClientConfig{NumChannels: 1}, opts...) if err != nil { t.Fatalf("Failed to create client %v", err) } return client } func TestReadRow(t *testing.T) { ctx := context.Background() client := initSpannerClient(t, ctx) defer client.Close() r, err := client.Single().ReadRow(ctx, tableName, spanner.Key{testColumnData}, []string{column}) if err != nil { t.Fatalf("ReadRow failed with %v", err) } var data string if err := r.Column(0, &data); err != nil { t.Fatalf("Failed to read column from row with %v", err) } if data != testColumnData { t.Fatalf("Got incorrect column data %v, want %v", data, testColumnData) } } func TestReadRowIterator(t *testing.T) { ctx := context.Background() client := initSpannerClient(t, ctx) defer client.Close() stmt := spanner.Statement{SQL: testSQL} iter := client.Single().Query(ctx, stmt) defer iter.Stop() row, err := iter.Next() if err != nil { t.Fatalf("Query failed with %v", err) } var data string if err := row.Columns(&data); err != nil { t.Fatalf("Failed to parse row with %v", err) } if data != testColumnData { t.Fatalf("Got incorrect column data %v, want %v", data, testColumnData) } } func TestParallelRead(t *testing.T) { ctx := context.Background() client := initSpannerClient(t, ctx) defer client.Close() stmt := spanner.Statement{SQL: testSQL} numThreads := 10 wg := sync.WaitGroup{} for i := 0; i < numThreads; i++ { wg.Add(1) go func(i int, c *spanner.Client) { defer wg.Done() iter := c.Single().Query(ctx, stmt) defer iter.Stop() row, err := iter.Next() if err != nil { t.Fatalf("Query failed with %v", err) } var data string if err := row.Columns(&data); err != nil { t.Fatalf("Failed to parse row with %v", err) } if data != testColumnData { t.Fatalf("Got incorrect column data %v, want %v", data, testColumnData) } }(i, client) } wg.Wait() } func TestMutations(t *testing.T) { ctx := context.Background() client := initSpannerClient(t, ctx) defer client.Close() inserted := "inserted-data" _, err := client.Apply(ctx, []*spanner.Mutation{ spanner.Insert(tableName, []string{column}, []interface{}{inserted}), }) if err != nil { t.Fatalf("Insert row failed with %v", err) } _, err = client.Apply(ctx, []*spanner.Mutation{ spanner.Delete(tableName, spanner.Key{inserted}), }) if err != nil { t.Fatalf("Delete row failed with %v", err) } } func TestParallelMutations(t *testing.T) { ctx := context.Background() client := initSpannerClient(t, ctx) defer client.Close() numThreads := 10 wg := sync.WaitGroup{} for i := 0; i < numThreads; i++ { wg.Add(1) go func(i int, c *spanner.Client) { defer wg.Done() inserted := fmt.Sprintf("inserted-%d", i) _, err := c.Apply(ctx, []*spanner.Mutation{ spanner.Insert(tableName, []string{column}, []interface{}{inserted}), spanner.Delete(tableName, spanner.Key{inserted}), }) if err != nil { t.Fatalf("Insert row failed with %v", err) } }(i, client) } wg.Wait() } grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/000077500000000000000000000000001457366620600204715ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/Dockerfile000066400000000000000000000006761457366620600224740ustar00rootroot00000000000000FROM golang:1.19 WORKDIR /go/src/github.com/GoogleCloudPlatform/grpc-gcp-go/spanner_prober/ COPY . . RUN CGO_ENABLED=0 go build -a -installsuffix cgo -v -o /go/src/github.com/GoogleCloudPlatform/grpc-gcp-go/spanner_prober ./... FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /spanner_prober/ COPY --from=0 /go/src/github.com/GoogleCloudPlatform/grpc-gcp-go/spanner_prober/spanner_prober ./ ENTRYPOINT [ "./spanner_prober" ] grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/Readme.md000066400000000000000000000113211457366620600222060ustar00rootroot00000000000000# gRPC-GCP Go Spanner prober The prober performs an operation (set by `probe_type`) at a stable rate (`qps`). All operations access the "ProbeTarget" table in the `database` in the `instance`. The prober will try to create the instance, database, and the table if any of them doesn't exist. For each operation, the prober picks a random number from 0 to `num_rows` and performs read and/or write operations with the selected number as the primary key. Each write call updates/inserts three columns: a primary key, a `payload_size`-bytes randomly generated payload, and a SHA256 checksum of the payload. ## Usage Build image: docker build -t spanner_prober:latest . Run prober: docker run --rm -v :/gcp-creds.json --env GOOGLE_APPLICATION_CREDENTIALS=/gcp-creds.json spanner_prober:latest --project= --qps=0.5 --probe_type=read_write ## Arguments - enable_cloud_ops - Export metrics to Cloud Operations (former Stackdriver). (Default: true) - project - GCP project for Cloud Spanner. - ops_project - Cloud Operations project if differs from Spanner project. - instance - Target instance. (Default: "test1") - database - Target database. (Default: "test1") - instance_config - Target instance config (Default: "regional-us-central1") - node_count - Node count for the prober. If specified, processing_units must be 0. (Default: 1) - processing_units - Processing units for the prober. If specified, node_count must be 0. (Default: 0) - qps - QPS to probe per prober [1, 1000]. (Default: 1) - num_rows - Number of rows in database to be probed. (Default: 1000) - probe_type - The probe type this prober will run. (Default: "noop") - max_staleness - Maximum staleness for stale queries. (Default: 15s) - payload_size - Size of payload to write to the probe database. (Default: 1024) - probe_deadline - Deadline for probe request. (Default: 10s) - endpoint - Cloud Spanner Endpoint to send request to. ## Disabling automatic resource detection If running on GCE/GKE the metrics will be shipped to corresponding "VM Instance"/"Kubernetes Container" resource in Cloud Monitoring. To disable this and use global resource set environment variable `OC_RESOURCE_TYPE=global`. ## Probe types | probe_type | Description | | ------------ | -------------------------------------------------------------- | | noop | no operation. | | stale_read | read-only txn `Read` with timestamp bound. | | strong_query | read-only txn `Query`. | | stale_query | read-only txn `Query` with timestamp bound. | | dml | read-write txn with `Query` followed by `Update`. | | read_write | read-write txn with `Read` followed by `BufferWrite` mutation. | ## Reported metrics All metrics are prefixed with `custom.googleapis.com/opencensus/grpc_gcp_spanner_prober/` `op_name` label | Metric | Unit | Kind | Value | Decription | ------------ | ---- | ---------- | ------------ | ---------- | **Prober specific** | op_count | 1 | Cumulative | Int64 | Operation count. Labeled by: op_name, result. | op_latency | ms | Cumulative | Distribution | Operation latency. Labeled by: op_name, result. | t4t7_latency | ms | Cumulative | Distribution | GFE latency. Labeled by: rpc_type (unary/streaming), grpc_client_method | **Opencensus default gRPC metrics** | | | | additional prefix `grpc.io/client/` | completed_rpcs | 1 | Cumulative | Int64 | Count of RPCs by method and status. | received_bytes_per_rpc | byte | Cumulative | Distribution | Distribution of bytes received per RPC, by method. | roundtrip_latency | ms | Cumulative | Distribution | Distribution of round-trip latency, by method. | sent_bytes_per_rpc | byte | Cumulative | Distribution | Distribution of bytes sent per RPC, by method. | **From Spanner client** | | | | additional prefix `cloud.google.com/go/spanner/` Labels: client_id, instance_id, database, library_version | max_allowed_sessions | 1 | Gauge | Int64 | The maximum number of sessions allowed. Configurable by the user. | max_in_use_sessions | 1 | Gauge | Int64 | The maximum number of sessions in use during the last 10 minute interval. | num_acquired_sessions | 1 | Cumulative | Int64 | The number of sessions acquired from the session pool. | num_released_sessions | 1 | Cumulative | Int64 | The number of sessions released by the user and pool maintainer. | num_sessions_in_pool | 1 | Gauge | Int64 | The number of sessions currently in use. Labeled by type. | open_session_count | 1 | Gauge | Int64 | Number of sessions currently opened. grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/go.mod000066400000000000000000000036301457366620600216010ustar00rootroot00000000000000module spanner_prober go 1.17 require ( cloud.google.com/go/spanner v1.45.0 contrib.go.opencensus.io/exporter/stackdriver v0.13.14 github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.3.0 github.com/golang/glog v1.1.0 go.opencensus.io v0.24.0 google.golang.org/api v0.114.0 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 google.golang.org/grpc v1.56.3 google.golang.org/protobuf v1.30.0 ) require ( cloud.google.com/go v0.110.0 // indirect cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v0.13.0 // indirect cloud.google.com/go/longrunning v0.4.1 // indirect cloud.google.com/go/monitoring v1.13.0 // indirect cloud.google.com/go/trace v1.9.0 // indirect github.com/aws/aws-sdk-go v1.43.31 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f // indirect github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/prometheus/prometheus v0.35.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect ) grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/go.sum000066400000000000000000010036221457366620600216300ustar00rootroot00000000000000bazil.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 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= 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/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= 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/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= 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/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= 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/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/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= 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.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= 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/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= 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/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= 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/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= 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 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= 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/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.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= 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 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= 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.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= 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 h1:2qsrgXGVoRXpP7otZ14eE1I568zAa92sJSDPyOJvwjM= 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/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/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= 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/spanner v1.45.0 h1:7VdjZ8zj4sHbDw55atp5dfY6kn1j9sam9DRNpPQhqR4= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= 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.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= 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 h1:olxC0QHC59zgJVALtgqfD9tGk0lfeCP5/AGXL3Px/no= 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/video v1.15.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= contrib.go.opencensus.io/exporter/stackdriver v0.13.14 h1:zBakwHardp9Jcb8sQHcHpXy/0+JIb1M8KjigCJzx7+4= contrib.go.opencensus.io/exporter/stackdriver v0.13.14/go.mod h1:5pSSGY0Bhuk7waTHuDf4aQ8D2DrhgETRo9fy6k3Xlzc= 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/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 v63.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= 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/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 v0.11.25/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= 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/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= 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/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= 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/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-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.3.0 h1:yScvuUlp0OCoVmQrTJT7STF3oCvEzeMOssBptsFXwc8= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.3.0/go.mod h1:1Wf1JYYux+dPFhc5leiM56neIMK+faJUJAaeOxhAotc= 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/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= 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/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/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/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/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= 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/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= 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/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.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= 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/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= 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-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/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/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= 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/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.2/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 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= 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 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 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/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 h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= 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/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/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/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/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/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/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-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/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/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/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/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/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/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= 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-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.78.0/go.mod h1:GBmu8MkjZmNARE7IXRPmkbbnocNN8+uBm0xbEVw2LCs= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= 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/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.14+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/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/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/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= 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/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.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= 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.1-0.20230524094728-9239064ad72f h1:7T++XKzy4xg7PKy+bM+Sa9/oe1OC88yz2hXQUISoXfA= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= 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.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= 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/evanphx/json-patch v4.12.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.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2/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/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= 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.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= 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/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-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-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= 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-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 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/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/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= 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/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= github.com/go-openapi/runtime v0.23.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= 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/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= 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-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= 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.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= 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/gofrs/uuid v4.2.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/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= 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 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= 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 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= 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/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/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/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.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 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 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/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-20220318212150-b2ab0324ddda/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.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 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= 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 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= 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/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/gophercloud/gophercloud v0.24.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c= 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/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= 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/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= 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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= 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/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-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/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/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.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 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.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.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 v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 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.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hetznercloud/hcloud-go v1.33.1/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 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/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/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/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= 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/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= 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/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/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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 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/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= 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/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= 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/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/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/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/linode/linodego v1.4.0/go.mod h1:PVsRxSlOiJyvG4/scTszpmZDTdgS+to3X6eS8pRrWI8= 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/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= 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/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/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/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= 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.8/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-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.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= 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-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 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.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= 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/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.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/miekg/pkcs11 v1.0.3/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/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.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3/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/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 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/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/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/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/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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= 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.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= 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/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/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/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/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/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 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.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= 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/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= 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/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/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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/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/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/alertmanager v0.24.0/go.mod h1:r6fy/D7FRuZh5YbnX6J3MBY0eI4Pb5yPYS7/bPSXXqI= 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.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= 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/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= 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.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common/assets v0.1.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/exporter-toolkit v0.7.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= 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/prometheus v0.35.0 h1:N93oX6BrJ2iP3UuE2Uz4Lt+5BkUpaFer3L9CbADzesc= github.com/prometheus/prometheus v0.35.0/go.mod h1:7HaLx5kEPKJ0GDgbODG0fZgXbQ8K/XjZNJXQmbmgQlY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= 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.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 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.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= 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/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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= 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/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/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= 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.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/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 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/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/cast v1.3.1/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/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/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.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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= 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/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/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= 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/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/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/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= 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/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 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= 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.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= 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.31.0/go.mod h1:PFmBsWbldL1kiWZk9+0LBZz2brhByaGsvp6pRICMlPE= 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.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ= go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ= 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/internal/retry v1.6.1/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1/go.mod h1:YJ/JbY5ag/tSQFXzH3mtDmHqzF3aFn3DI/aB1n7pt4w= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1/go.mod h1:UJJXJj0rltNIemDMwkOJyggsvyMG9QHfJeFH0HS5JjM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1/go.mod h1:DAKwdo06hFLc0U88O10x4xnb5sc7dDRDqRuiN+io8JE= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= 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 v1.6.1/go.mod h1:IVYrddmFZ+eJqu2k38qD3WezFR2pymCzm8tdxyh3R4E= 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.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE= go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0= 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.12.1/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= 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.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= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= 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/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/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= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= 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-20200302210943-78000ba7a073/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-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 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-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= 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/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/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.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.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/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/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-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-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-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= 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-20210726213435-c6fcb2dbf985/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.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.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.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 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.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= 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-20190412183630-56d357773e84/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 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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/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-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/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-20190531175056-4c3a928424d2/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-20191008105621-543471e840be/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-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-20210420072515-93ed5bcd2bfe/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-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-20210917161153-d61c044b1678/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-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-20220114195835-da31bd327af9/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-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.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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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.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.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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-20220224211638-0e9765cccd65/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/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/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-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190420181800-aa740d480789/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-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 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.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= 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.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/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 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= 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.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= 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 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= 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-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/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-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-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= 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.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= 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.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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/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/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= 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/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 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/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg= 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/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.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-20200605160147-a5ece683394c/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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 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.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.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8= 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.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= 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.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4= 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 v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= 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/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.40.1/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/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/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= 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/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/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/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/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/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= 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/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= 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/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.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/main.go000066400000000000000000000163431457366620600217530ustar00rootroot00000000000000package main import ( "context" "flag" "fmt" "io/ioutil" "os" "os/signal" "regexp" "strings" "syscall" "time" proberlib "spanner_prober/prober" "cloud.google.com/go/spanner" "contrib.go.opencensus.io/exporter/stackdriver" "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" log "github.com/golang/glog" "go.opencensus.io/plugin/ocgrpc" "go.opencensus.io/resource" "go.opencensus.io/stats/view" "google.golang.org/grpc/grpclog" ) var ( enableCloudOps = flag.Bool("enable_cloud_ops", true, "Export metrics to Cloud Operations (former Stackdriver).") project = flag.String("project", "", "GCP project for Cloud Spanner.") opsProject = flag.String("ops_project", "", "Cloud Operations project if differs from Spanner project.") instance_name = flag.String("instance", "test1", "Target instance.") database_name = flag.String("database", "test1", "Target database.") instanceConfig = flag.String("instance_config", "regional-us-central1", "Target instance config.") nodeCount = flag.Int("node_count", 1, "Node count for the prober. If specified, processing_units must be 0.") processingUnits = flag.Int("processing_units", 0, "Processing units for the prober. If specified, node_count must be 0.") qps = flag.Float64("qps", 1, "QPS to probe per prober [1, 1000].") numRows = flag.Int("num_rows", 1000, "Number of rows in database to be probed.") probeType = flag.String("probe_type", "noop", "The probe type this prober will run.") maxStaleness = flag.Duration("max_staleness", 15*time.Second, "Maximum staleness for stale queries.") payloadSize = flag.Int("payload_size", 1024, "Size of payload to write to the probe database.") probeDeadline = flag.Duration("probe_deadline", 10*time.Second, "Deadline for probe request.") useGrpcGcp = flag.Bool("grpc_gcp", false, "Use gRPC-GCP library.") channelPoolSize = flag.Int("channels", 2, "Number of channels.") endpoint = flag.String("endpoint", "spanner.googleapis.com:443", "Cloud Spanner Endpoint to send request to.") ) func main() { flag.Parse() ctx := context.Background() errs := validateFlags() if len(errs) > 0 { log.Errorf("Flag validation failed with %v errors", len(errs)) for _, err := range errs { log.Errorf("%v", err) } log.Exit("Flag validation failed... exiting.") } fmt.Printf("Prober started with options:\nenable_cloud_ops: %v\nproject: %q\n"+ "ops_project: %q\ninstance: %q\ndatabase: %q\ninstance_config: %q\n"+ "node_count: %d\nprocessing_units: %d\nqps: %0.3f\nnum_rows: %d\n"+ "probe_type: %q\nmax_staleness: %v\npayload_size: %d\nprobe_deadline: %v\n"+ "grpc_gcp: %v\nchannels: %v\nendpoint: %q\n", *enableCloudOps, *project, *opsProject, *instance_name, *database_name, *instanceConfig, *nodeCount, *processingUnits, *qps, *numRows, *probeType, *maxStaleness, *payloadSize, *probeDeadline, *useGrpcGcp, *channelPoolSize, *endpoint) grpclog.SetLoggerV2(grpclog.NewLoggerV2(ioutil.Discard, /* Discard logs at INFO level */ os.Stderr, os.Stderr)) if *enableCloudOps { // Set up the stackdriver exporter for sending metrics. // Register gRPC views. if err := view.Register(ocgrpc.DefaultClientViews...); err != nil { log.Fatalf("Failed to register ocgrpc client views: %v", err) } // Enable all default views for Cloud Spanner. if err := spanner.EnableStatViews(); err != nil { log.Errorf("Failed to export stats view: %v", err) } getPrefix := func(name string) string { if strings.HasPrefix(name, proberlib.MetricPrefix) { return "" } return proberlib.MetricPrefix } exporterOptions := stackdriver.Options{ ProjectID: *project, BundleDelayThreshold: 60 * time.Second, BundleCountThreshold: 3000, GetMetricPrefix: getPrefix, } if *opsProject != "" { exporterOptions.ProjectID = *opsProject } if os.Getenv(resource.EnvVarType) == "" { exporterOptions.MonitoredResource = &MonitoredResource{delegate: monitoredresource.Autodetect()} } sd, err := stackdriver.NewExporter(exporterOptions) if err != nil { log.Fatalf("Failed to create the StackDriver exporter: %v", err) } defer sd.Flush() sd.StartMetricsExporter() defer sd.StopMetricsExporter() } prober, err := proberlib.ParseProbeType(*probeType) if err != nil { log.Exitf("Could not create prober due to %v.", err) } opts := proberlib.ProberOptions{ Project: *project, Instance: *instance_name, Database: *database_name, InstanceConfig: *instanceConfig, QPS: *qps, NumRows: *numRows, Prober: prober, MaxStaleness: *maxStaleness, PayloadSize: *payloadSize, ProbeDeadline: *probeDeadline, Endpoint: *endpoint, NodeCount: *nodeCount, ProcessingUnits: *processingUnits, UseGrpcGcp: *useGrpcGcp, ChannelPoolSize: *channelPoolSize, } p, err := proberlib.NewProber(ctx, opts) if err != nil { log.Exitf("Failed to initialize the cloud prober, %v", err) } p.Start(ctx) cancelChan := make(chan os.Signal, 1) signal.Notify(cancelChan, syscall.SIGTERM, syscall.SIGINT) select { case <-cancelChan: } } type MonitoredResource struct { monitoredresource.Interface delegate monitoredresource.Interface } func (mr *MonitoredResource) MonitoredResource() (resType string, labels map[string]string) { dType, dLabels := mr.delegate.MonitoredResource() resType = dType labels = make(map[string]string) for k, v := range dLabels { if k == "project_id" { // Overwrite project id to satisfy Cloud Monitoring rule. labels[k] = *project if *opsProject != "" { labels[k] = *opsProject } continue } labels[k] = v } return } func validateFlags() []error { var errs []error projectRegex, err := regexp.Compile(`^[-_:.a-zA-Z0-9]*$`) if err != nil { return []error{err} } instanceDBRegex, err := regexp.Compile(`^[-_.a-zA-Z0-9]*$`) if err != nil { return []error{err} } // We limit qps to < 1000 to ensure we don't overload Spanner accidentally. if *qps <= 0 || *qps > 1000 { errs = append(errs, fmt.Errorf("qps must be 1 <= qps <= 1000, was %v", *qps)) } if *numRows <= 0 { errs = append(errs, fmt.Errorf("num_rows must be > 0, was %v", *numRows)) } if *payloadSize <= 0 { errs = append(errs, fmt.Errorf("payload_size must be > 0, was %v", *payloadSize)) } if matched := projectRegex.MatchString(*project); !matched { errs = append(errs, fmt.Errorf("project did not match %v, was %v", projectRegex, *project)) } if matched := projectRegex.MatchString(*opsProject); !matched { errs = append(errs, fmt.Errorf("ops_project did not match %v, was %v", projectRegex, *opsProject)) } if matched := instanceDBRegex.MatchString(*instance_name); !matched { errs = append(errs, fmt.Errorf("instance did not match %v, was %v", instanceDBRegex, *instance_name)) } if matched := instanceDBRegex.MatchString(*database_name); !matched { errs = append(errs, fmt.Errorf("database did not match %v, was %v", instanceDBRegex, *database_name)) } if matched := instanceDBRegex.MatchString(*instanceConfig); !matched { errs = append(errs, fmt.Errorf("instance_config did not match %v, was %v", instanceDBRegex, *instanceConfig)) } if _, err := proberlib.ParseProbeType(*probeType); err != nil { errs = append(errs, err) } return errs } grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/main_test.go000066400000000000000000000053471457366620600230140ustar00rootroot00000000000000package main import ( "reflect" proberlib "spanner_prober/prober" "testing" "time" ) func TestValidFlags(t *testing.T) { var tests = []struct { name string project string instance string database string instanceConfig string qps float64 numRows int probeType string maxStaleness time.Duration payloadSize int expectedErrors int }{ { name: "good flags", project: "google.com:abc", instance: "abc", database: "abc", instanceConfig: "regional-test-1", qps: 1, numRows: 1, probeType: "noop", maxStaleness: 5 * time.Second, payloadSize: 1024, expectedErrors: 0, }, { name: "uris not names", project: "projects/google.com:abc", instance: "projects/google.com:abc/instances/test-instance", database: "projects/google.com:abc/instances/test-instance/databases/test-database", instanceConfig: "projects/google.com:abc/instanceConfigs/regional-test-instance", qps: 1, numRows: 1, probeType: "noop", payloadSize: 1, expectedErrors: 4, }, { name: "invalid options", project: "+abc", instance: "abc!", database: "abc=", instanceConfig: "", qps: 0, numRows: 0, probeType: "notaprobe", payloadSize: -1, expectedErrors: 7, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { *project = tt.project *instance_name = tt.instance *database_name = tt.database *instanceConfig = tt.instanceConfig *qps = tt.qps *numRows = tt.numRows *probeType = tt.probeType *maxStaleness = tt.maxStaleness *payloadSize = tt.payloadSize errs := validateFlags() if len(errs) != tt.expectedErrors { t.Errorf("validateFlags() got %v errors, want %v errors: %q", len(errs), tt.expectedErrors, errs) } }) } } func TestParseProbeType(t *testing.T) { var tests = []struct { name string flag string probeType proberlib.Probe wantErr bool }{ { name: "good type", flag: "stale_read", probeType: proberlib.StaleReadProbe{}, }, { name: "bad type", flag: "not_a_probe", probeType: proberlib.NoopProbe{}, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := proberlib.ParseProbeType(tt.flag) if (err != nil) != tt.wantErr { t.Errorf("parseProbeType(%q) = error %v, wantErr %t", tt.flag, err, tt.wantErr) } if got, want := reflect.TypeOf(result), reflect.TypeOf(tt.probeType); got != want { t.Errorf("parseProbeType(%q) = %v, want %v", tt.flag, got, want) } }) } } grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/prober/000077500000000000000000000000001457366620600217625ustar00rootroot00000000000000grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/prober/interceptors.go000066400000000000000000000067231457366620600250420ustar00rootroot00000000000000// Package prober defines a Cloud Spanner prober with interceptors. package prober import ( "context" "fmt" "strconv" "strings" "time" "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" "google.golang.org/grpc" "google.golang.org/grpc/metadata" ) const gfeT4T7prefix = "gfet4t7; dur=" const serverTimingKey = "server-timing" var ( expDistribution = []float64{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288} methodTag = tag.MustNewKey("grpc_client_method") rpcTypeTag = tag.MustNewKey("rpc_type") t4t7Latency = stats.Int64( "t4t7_latency", "gRPC-GCP Spanner prober GFE latency", stats.UnitMilliseconds, ) t4t7LatencyView = &view.View{ Name: MetricPrefix + t4t7Latency.Name(), Measure: t4t7Latency, Aggregation: view.Distribution(expDistribution...), TagKeys: []tag.Key{opNameTag, methodTag, rpcTypeTag}, } ) func init() { view.Register(t4t7LatencyView) } func recordLatency(ctx context.Context, method string, latency time.Duration) { stats.RecordWithTags( ctx, []tag.Mutator{tag.Insert(methodTag, method)}, t4t7Latency.M(latency.Milliseconds()), ) } // parseT4T7Latency parse the headers and trailers for finding the gfet4t7 latency. func parseT4T7Latency(headers, trailers metadata.MD) (time.Duration, error) { var serverTiming []string if len(headers[serverTimingKey]) > 0 { serverTiming = headers[serverTimingKey] } else if len(trailers[serverTimingKey]) > 0 { serverTiming = trailers[serverTimingKey] } else { return 0, fmt.Errorf("server-timing headers not found") } for _, entry := range serverTiming { if !strings.HasPrefix(entry, gfeT4T7prefix) { continue } durationText := strings.TrimPrefix(entry, gfeT4T7prefix) durationMillis, err := strconv.ParseInt(durationText, 10, 64) if err != nil { return 0, fmt.Errorf("failed to parse gfe latency: %v", err) } return time.Duration(durationMillis) * time.Millisecond, nil } return 0, fmt.Errorf("no gfe latency response available") } // AddGFELatencyUnaryInterceptor intercepts unary client requests (spanner.Commit, spanner.ExecuteSQL) and annotates GFE latency. func AddGFELatencyUnaryInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { var headers, trailers metadata.MD opts = append(opts, grpc.Header(&headers)) opts = append(opts, grpc.Trailer(&trailers)) if err := invoker(ctx, method, req, reply, cc, opts...); err != nil { return err } if gfeLatency, err := parseT4T7Latency(headers, trailers); err == nil { if ctx, err := tag.New(ctx, tag.Insert(rpcTypeTag, "unary")); err == nil { recordLatency(ctx, method, gfeLatency) } } return nil } // AddGFELatencyStreamingInterceptor intercepts streaming requests StreamingSQL and annotates GFE latency. func AddGFELatencyStreamingInterceptor(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { cs, err := streamer(ctx, desc, cc, method, opts...) if err != nil { return cs, err } go func() { headers, err := cs.Header() if err != nil { return } trailers := cs.Trailer() if gfeLatency, err := parseT4T7Latency(headers, trailers); err == nil { if ctx, err := tag.New(ctx, tag.Insert(rpcTypeTag, "streaming")); err == nil { recordLatency(ctx, method, gfeLatency) } } }() return cs, nil } grpc-gcp-go-grpcgcp-v1.5.0/spanner_prober/prober/proberlib.go000066400000000000000000000567371457366620600243130ustar00rootroot00000000000000// Package prober defines a Cloud Spanner prober. package prober import ( "bytes" "context" "crypto/sha256" "errors" "fmt" "math/rand" "os" "sync" "time" "cloud.google.com/go/spanner" database "cloud.google.com/go/spanner/admin/database/apiv1" instance "cloud.google.com/go/spanner/admin/instance/apiv1" "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp" log "github.com/golang/glog" "go.opencensus.io/plugin/ocgrpc" "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" "google.golang.org/api/iterator" "google.golang.org/api/option" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" "google.golang.org/grpc/status" "google.golang.org/protobuf/encoding/protojson" gpb "github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp/grpc_gcp" dbadminpb "google.golang.org/genproto/googleapis/spanner/admin/database/v1" instancepb "google.golang.org/genproto/googleapis/spanner/admin/instance/v1" ) const ( aggregationChannelSize = 1000 // Long running operations retry parameters. baseLRORetryDelay = 200 * time.Millisecond maxLRORetryDelay = 5 * time.Second scope = "https://www.googleapis.com/auth/cloud-platform" ) var ( generatePayload = func(size int) ([]byte, []byte, error) { payload := make([]byte, size) rand.Read(payload) h := sha256.New() if _, err := h.Write(payload); err != nil { return nil, nil, err } return payload, h.Sum(nil), nil } MetricPrefix = "grpc_gcp_spanner_prober/" opNameTag = tag.MustNewKey("op_name") resultTag = tag.MustNewKey("result") withError = tag.Insert(resultTag, "error") withSuccess = tag.Insert(resultTag, "success") opLatency = stats.Int64( "op_latency", "gRPC-GCP Spanner prober operation latency", stats.UnitMilliseconds, ) opLatencyView = &view.View{ Name: MetricPrefix + opLatency.Name(), Measure: opLatency, Aggregation: view.Distribution(expDistribution...), TagKeys: []tag.Key{resultTag, opNameTag}, } opResults = stats.Int64( "op_count", "gRPC-GCP Spanner prober operation count", stats.UnitDimensionless, ) opResultsView = &view.View{ Name: MetricPrefix + opResults.Name(), Measure: opResults, Aggregation: view.Count(), TagKeys: []tag.Key{resultTag, opNameTag}, } ) func (o ProberOptions) grpcGcpConfig() *gpb.ApiConfig { return &gpb.ApiConfig{ ChannelPool: &gpb.ChannelPoolConfig{ // Creates a fixed-size gRPC-GCP channel pool. MinSize: uint32(o.ChannelPoolSize), MaxSize: uint32(o.ChannelPoolSize), // This option repeats(preserves) the strategy used by the Spanner // client to distribute BatchCreateSessions calls across channels. BindPickStrategy: gpb.ChannelPoolConfig_ROUND_ROBIN, // When issuing RPC call within Spanner session fallback to a ready // channel if the channel mapped to the session is not ready. FallbackToReady: true, // Establish a new connection for a channel where // no response/messages were received within last 1 second and // at least 3 RPC calls (started after the last response/message // received) timed out (deadline_exceeded). UnresponsiveDetectionMs: 1000, UnresponsiveCalls: 3, }, // Configuration for all Spanner RPCs that create, use or remove // Spanner sessions. gRPC-GCP channel pool uses this configuration // to provide session to channel affinity. If Spanner introduces any new // method that creates/uses/removes sessions, it must be added here. Method: []*gpb.MethodConfig{ { Name: []string{"/google.spanner.v1.Spanner/CreateSession"}, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_BIND, AffinityKey: "name", }, }, { Name: []string{"/google.spanner.v1.Spanner/BatchCreateSessions"}, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_BIND, AffinityKey: "session.name", }, }, { Name: []string{"/google.spanner.v1.Spanner/DeleteSession"}, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_UNBIND, AffinityKey: "name", }, }, { Name: []string{"/google.spanner.v1.Spanner/GetSession"}, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_BOUND, AffinityKey: "name", }, }, { Name: []string{ "/google.spanner.v1.Spanner/BeginTransaction", "/google.spanner.v1.Spanner/Commit", "/google.spanner.v1.Spanner/ExecuteBatchDml", "/google.spanner.v1.Spanner/ExecuteSql", "/google.spanner.v1.Spanner/ExecuteStreamingSql", "/google.spanner.v1.Spanner/PartitionQuery", "/google.spanner.v1.Spanner/PartitionRead", "/google.spanner.v1.Spanner/Read", "/google.spanner.v1.Spanner/Rollback", "/google.spanner.v1.Spanner/StreamingRead", }, Affinity: &gpb.AffinityConfig{ Command: gpb.AffinityConfig_BOUND, AffinityKey: "session", }, }, }, } } // ConnPool wrapper for gRPC-GCP channel pool. gtransport.ConnPool is the // interface Spanner client accepts as a replacement channel pool. type grpcGcpConnPool struct { gtransport.ConnPool cc *grpc.ClientConn size int } func (cp *grpcGcpConnPool) Conn() *grpc.ClientConn { return cp.cc } // Spanner client uses this function to get channel pool size. func (cp *grpcGcpConnPool) Num() int { return cp.size } func (cp *grpcGcpConnPool) Close() error { return cp.cc.Close() } // Options holds the settings required for creating a prober. type ProberOptions struct { // Cloud Spanner settings in name form, not URI (e.g. an_instance, not projects/a_project/instances/an_instance). Project string Instance string Database string InstanceConfig string // QPS rate to probe at. QPS float64 // NumRows is the number of rows in which which the prober randomly chooses to probe. NumRows int // Prober is type of probe which will be run. Prober Probe // MaxStaleness is the bound of stale reads. MaxStaleness time.Duration // PayloadSize is the number of bytes of random data used as a Payload. PayloadSize int // ProbeDeadline is the deadline for request for probes. ProbeDeadline time.Duration // Cloud Spanner Endpoint to send request. Endpoint string // Node count for Spanner instance. If specified, ProcessingUnits must be 0. NodeCount int // Processing units for the Spanner instance. If specified, NodeCount must be 0. ProcessingUnits int // Use gRPC-GCP library. UseGrpcGcp bool // Number of channels. ChannelPoolSize int } // Prober holds the internal prober state. type Prober struct { instanceAdminClient *instance.InstanceAdminClient spannerClient *spanner.Client deadline time.Duration mu *sync.Mutex opsChannel chan op numRows int qps float64 prober Probe maxStaleness time.Duration payloadSize int generatePayload func(int) ([]byte, []byte, error) opt ProberOptions // add clientOptions here as it contains credentials. clientOpts []option.ClientOption } type op struct { Latency time.Duration Error error } // Probe is the interface for a single type of prober. type Probe interface { name() string probe(context.Context, *Prober) error } // instanceURI returns an instance URI of the form: projects/{project}/instances/{instance name}. // E.g. projects/test-project/instances/test-instance. func (opt *ProberOptions) instanceURI() string { return fmt.Sprintf("projects/%s/instances/%s", opt.Project, opt.Instance) } // instanceName returns an instance name of the form: {instance name}. // E.g. test-instance. func (opt *ProberOptions) instanceName() string { return opt.Instance } // instanceConfigURI returns an instance config URI of the form: projects/{project}/instanceConfigs/{instance config name}. // E.g. projects/test-project/instanceConfigss/regional-test. func (opt *ProberOptions) instanceConfigURI() string { return fmt.Sprintf("projects/%s/instanceConfigs/%s", opt.Project, opt.InstanceConfig) } // projectURI returns a project URI of the form: projects/{project}. // E.g. projects/test-project. func (opt *ProberOptions) projectURI() string { return fmt.Sprintf("projects/%s", opt.Project) } // databaseURI returns a database URI of the form: projects/{project}/instances/{instance name}/databases/{database name}. // E.g. projects/test-project/instances/test-instance/databases/test-database. func (opt *ProberOptions) databaseURI() string { return fmt.Sprintf("projects/%s/instances/%s/databases/%s", opt.Project, opt.Instance, opt.Database) } // databaseName returns a database name of the form: {database name}. // E.g. test-database. func (opt *ProberOptions) databaseName() string { return opt.Database } func init() { view.Register(opLatencyView, opResultsView) } // New initializes Cloud Spanner clients, setup up the database, and return a new CSProber. func NewProber(ctx context.Context, opt ProberOptions, clientOpts ...option.ClientOption) (*Prober, error) { ctx, err := tag.New(ctx, tag.Insert(opNameTag, opt.Prober.name())) if err != nil { return nil, err } // Override Cloud Spanner endpoint if specified. if opt.Endpoint != "" { clientOpts = append(clientOpts, option.WithEndpoint(opt.Endpoint)) } p, err := newSpannerProber(ctx, opt, clientOpts...) if err != nil { return nil, err } go p.backgroundStatsAggregator(ctx) return p, nil } func newSpannerProber(ctx context.Context, opt ProberOptions, clientOpts ...option.ClientOption) (*Prober, error) { if opt.NumRows <= 0 { return nil, fmt.Errorf("NumRows must be at least 1, got %v", opt.NumRows) } if opt.NodeCount > 0 && opt.ProcessingUnits > 0 { return nil, fmt.Errorf("At most one of NodeCount or ProcessingUnits may be specified. NodeCount: %v, ProcessingUnits: %v", opt.NodeCount, opt.ProcessingUnits) } if opt.Prober == nil { return nil, errors.New("Prober must not be nil") } if opt.ChannelPoolSize < 1 { return nil, errors.New("Number of channels must be >= 1") } instanceClient, err := instance.NewInstanceAdminClient(ctx, clientOpts...) if err != nil { return nil, err } if err := createCloudSpannerInstanceIfMissing(ctx, instanceClient, opt); err != nil { return nil, err } databaseClient, err := database.NewDatabaseAdminClient(ctx, clientOpts...) if err != nil { return nil, err } defer databaseClient.Close() if err := createCloudSpannerDatabase(ctx, databaseClient, opt); err != nil { return nil, err } if !opt.UseGrpcGcp { log.Info("Using default channel pool.") clientOpts = append( clientOpts, option.WithGRPCDialOption(grpc.WithUnaryInterceptor(AddGFELatencyUnaryInterceptor)), option.WithGRPCDialOption(grpc.WithStreamInterceptor(AddGFELatencyStreamingInterceptor)), ) } else { log.Info("Using gRPC-GCP channel pool.") var perRPC credentials.PerRPCCredentials var err error keyFile := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") if keyFile == "" { perRPC, err = oauth.NewApplicationDefault(context.Background(), scope) } else { perRPC, err = oauth.NewServiceAccountFromFile(keyFile, scope) } if err != nil { return nil, err } // Converting gRPC-GCP config to JSON because grpc.Dial only accepts JSON // config for configuring load balancers. grpcGcpJsonConfig, err := protojson.Marshal(opt.grpcGcpConfig()) if err != nil { return nil, err } conn, err := grpc.Dial( // Spanner endpoint. Replace this with your custom endpoint if not using // the default endpoint. opt.Endpoint, // Application default or service account credentials set up above. grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(perRPC), // Do not look up load balancer (gRPC-GCP) config via DNS. grpc.WithDisableServiceConfig(), // Instead use this static config. grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingConfig": [{"%s":%s}]}`, grpcgcp.Name, string(grpcGcpJsonConfig))), // gRPC-GCP interceptors required for proper operation of gRPC-GCP // channel pool. Add your interceptors as next arguments if needed. grpc.WithChainUnaryInterceptor(grpcgcp.GCPUnaryClientInterceptor, AddGFELatencyUnaryInterceptor), grpc.WithChainStreamInterceptor(grpcgcp.GCPStreamClientInterceptor, AddGFELatencyStreamingInterceptor), grpc.WithStatsHandler(new(ocgrpc.ClientHandler)), ) if err != nil { return nil, err } pool := &grpcGcpConnPool{ cc: conn, // Set the pool size on ConnPool to communicate it to Spanner client. size: opt.ChannelPoolSize, } clientOpts = append( clientOpts, gtransport.WithConnPool(pool), ) } dataClient, err := spanner.NewClientWithConfig( ctx, opt.databaseURI(), spanner.ClientConfig{ NumChannels: opt.ChannelPoolSize, }, clientOpts..., ) if err != nil { return nil, err } p := &Prober{ instanceAdminClient: instanceClient, spannerClient: dataClient, deadline: time.Duration(opt.ProbeDeadline), opsChannel: make(chan op, aggregationChannelSize), numRows: opt.NumRows, qps: opt.QPS, prober: opt.Prober, maxStaleness: opt.MaxStaleness, payloadSize: opt.PayloadSize, generatePayload: generatePayload, mu: &sync.Mutex{}, opt: opt, clientOpts: clientOpts, } return p, nil } func backoff(baseDelay, maxDelay time.Duration, retries int) time.Duration { backoff, max := float64(baseDelay), float64(maxDelay) for backoff < max && retries > 0 { backoff = backoff * 1.5 retries-- } if backoff > max { backoff = max } return time.Duration(backoff) } // createCloudSpannerInstanceIfMissing creates a one node "Instance" of Cloud Spanner in the specificed project if missing. // Instances are shared across multiple prober tasks running in differenct GCE VMs. // Instances do not get cleaned up in this prober, as we do not support turning down Cloud Spanner regions. func createCloudSpannerInstanceIfMissing(ctx context.Context, instanceClient *instance.InstanceAdminClient, opt ProberOptions) error { // Skip instance creation requests if the instance already exists. if checkInstancePresence(ctx, instanceClient, opt) { return nil } op, err := instanceClient.CreateInstance(ctx, &instancepb.CreateInstanceRequest{ Parent: opt.projectURI(), InstanceId: opt.instanceName(), Instance: &instancepb.Instance{ Name: opt.instanceURI(), Config: opt.instanceConfigURI(), DisplayName: opt.instanceName(), NodeCount: int32(opt.NodeCount), ProcessingUnits: int32(opt.ProcessingUnits), }, }) // If instance create operations fails, check if the instance was already created. If no, return error. if err != nil { if status.Code(err) != codes.AlreadyExists { return err } } else if _, err := op.Wait(ctx); err != nil { return err } // Wait for instance to be ready. var retries int for { var resp *instancepb.Instance resp, err = instanceClient.GetInstance(ctx, &instancepb.GetInstanceRequest{ Name: opt.instanceURI(), }) if err != nil || resp.State == instancepb.Instance_READY { return err } select { case <-time.After(backoff(baseLRORetryDelay, maxLRORetryDelay, retries)): case <-ctx.Done(): return ctx.Err() } retries++ } } // checkInstancePresence checks whether the instance is already created. func checkInstancePresence(ctx context.Context, instanceClient *instance.InstanceAdminClient, opt ProberOptions) bool { resp, err := instanceClient.GetInstance(ctx, &instancepb.GetInstanceRequest{ Name: opt.instanceURI(), }) // If instance is not present or instance is not ready. if err != nil || resp.State != instancepb.Instance_READY { return false } return true } // createCloudSpannerDatabase creates a prober "Database" on an "Instance" of Cloud Spanner in the specificed project. // Databases are shared across multiple prober tasks running in differenct GCE VMs. // Databases do not get cleaned up in this prober, as we do not support turning down Cloud Spanner regions. func createCloudSpannerDatabase(ctx context.Context, databaseClient *database.DatabaseAdminClient, opt ProberOptions) error { op, err := databaseClient.CreateDatabase(ctx, &dbadminpb.CreateDatabaseRequest{ Parent: opt.instanceURI(), CreateStatement: fmt.Sprintf("CREATE DATABASE `%v`", opt.databaseName()), ExtraStatements: []string{ `CREATE TABLE ProbeTarget ( Id INT64 NOT NULL, Payload BYTES(MAX), PayloadHash BYTES(MAX), ) PRIMARY KEY (Id)`, }, }) if err != nil { if code := status.Code(err); code == codes.AlreadyExists { return nil } return err } _, err = op.Wait(ctx) return err } // backgroundStatsAggregator pulls stats from the prober channel. // This avoids the case in which probes are blocked due to the channel being full. func (p *Prober) backgroundStatsAggregator(ctx context.Context) error { for op := range p.opsChannel { mutator := withSuccess if op.Error != nil { mutator = withError } stats.RecordWithTags(ctx, []tag.Mutator{mutator}, opResults.M(1)) stats.RecordWithTags(ctx, []tag.Mutator{mutator}, opLatency.M(op.Latency.Milliseconds())) } return nil } func (p *Prober) probeInterval() time.Duration { // qps must be > 0 as we validate this when constructing a CSProber. // qps is converted to a duration for type reasons, however it does not represent a value duration. // Use granularity of nanosecond to support float division. Useful for supporting probes with QPS < 1. return time.Duration(float64(time.Second) / p.qps) } // Start starts the prober. This will run a goroutinue until ctx is canceled. func (p *Prober) Start(ctx context.Context) { go func() { ticker := time.NewTicker(p.probeInterval()) for { select { case <-ctx.Done(): // Stop probing when the context is canceled. log.Info("Probing stopped as context is done.") return case <-ticker.C: go func() { probeCtx, cancel := context.WithTimeout(ctx, p.deadline) defer cancel() p.runProbe(probeCtx) }() } } }() } func (p *Prober) runProbe(ctx context.Context) { startTime := time.Now() probeErr := p.prober.probe(ctx, p) latency := time.Now().Sub(startTime) p.opsChannel <- op{ Latency: latency, Error: probeErr, } } // validateRows checks that the read did not return an error, and if the row is // present it validates the hash. If the row is not present it completes successfully. // Returns the number of validated rows, and the first error encounted. func validateRows(iter *spanner.RowIterator) (int, error) { rows := 0 for { row, err := iter.Next() if err == iterator.Done { return rows, nil } if err != nil { return rows, err } var id int64 var payload, payloadHash []byte if err := row.Columns(&id, &payload, &payloadHash); err != nil { return rows, err } h := sha256.New() _, err = h.Write(payload) if err != nil { return rows, err } if calculatedHash := h.Sum(nil); !bytes.Equal(calculatedHash, payloadHash) { return rows, fmt.Errorf("hash for row %v did not match, got %v, want %v", id, calculatedHash, payloadHash) } rows++ } } func ParseProbeType(t string) (Probe, error) { switch t { case "noop": return NoopProbe{}, nil case "stale_read": return StaleReadProbe{}, nil case "strong_query": return StrongQueryProbe{}, nil case "stale_query": return StaleQueryProbe{}, nil case "dml": return DMLProbe{}, nil case "read_write": return ReadWriteProbe{}, nil default: return NoopProbe{}, fmt.Errorf("probe_type %q is not a valid probe type", t) } } // NoopProbe is a fake prober which always succeeds. type NoopProbe struct{} func (NoopProbe) name() string { return "noop" } func (NoopProbe) probe(ctx context.Context, p *Prober) error { return nil } // StaleReadProbe performs a stale read of the database. type StaleReadProbe struct{} func (StaleReadProbe) name() string { return "stale_read" } func (StaleReadProbe) probe(ctx context.Context, p *Prober) error { // Random row within the range. k := rand.Intn(p.numRows) txn := p.spannerClient.Single().WithTimestampBound(spanner.MaxStaleness(p.maxStaleness)) iter := txn.Read(ctx, "ProbeTarget", spanner.Key{k}, []string{"Id", "Payload", "PayloadHash"}) defer iter.Stop() _, err := validateRows(iter) return err } // StrongQueryProbe performs a strong query of the database. type StrongQueryProbe struct{} func (StrongQueryProbe) name() string { return "strong_query" } func (StrongQueryProbe) probe(ctx context.Context, p *Prober) error { // Random row within the range. k := rand.Intn(p.numRows) stmt := spanner.Statement{ SQL: `select t.Id, t.Payload, t.PayloadHash from ProbeTarget t where t.Id = @Id`, Params: map[string]interface{}{ "Id": k, }, } iter := p.spannerClient.Single().Query(ctx, stmt) defer iter.Stop() _, err := validateRows(iter) return err } // StaleQueryProbe performs a stale query of the database. type StaleQueryProbe struct{} func (StaleQueryProbe) name() string { return "stale_query" } func (StaleQueryProbe) probe(ctx context.Context, p *Prober) error { // Random row within the range. k := rand.Intn(p.numRows) stmt := spanner.Statement{ SQL: `select t.Id, t.Payload, t.PayloadHash from ProbeTarget t where t.Id = @Id`, Params: map[string]interface{}{ "Id": k, }, } iter := p.spannerClient.Single().WithTimestampBound(spanner.MaxStaleness(p.maxStaleness)).Query(ctx, stmt) defer iter.Stop() _, err := validateRows(iter) return err } // DMLProbe performs a SQL based transaction in the database. type DMLProbe struct{} func (DMLProbe) name() string { return "dml" } func (DMLProbe) probe(ctx context.Context, p *Prober) error { // Random row within the range. k := rand.Intn(p.numRows) payload, payloadHash, err := p.generatePayload(p.payloadSize) if err != nil { return err } _, err = p.spannerClient.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error { readStmt := spanner.Statement{ SQL: `select t.Id, t.Payload, t.PayloadHash from ProbeTarget t where t.Id = @Id`, Params: map[string]interface{}{ "Id": k, }, } iter := txn.Query(ctx, readStmt) defer iter.Stop() rows, err := validateRows(iter) if err != nil { return err } // Update the row with a new random value if the row already exisis, otherwise insert a new row. dmlSQL := `update ProbeTarget t set t.Payload = @payload, t.PayloadHash = @payloadHash where t.Id = @Id` if rows == 0 { dmlSQL = `insert ProbeTarget (Id, Payload, PayloadHash) VALUES(@Id, @payload, @payloadHash)` } dmlStmt := spanner.Statement{ SQL: dmlSQL, Params: map[string]interface{}{ "Id": k, "payload": payload, "payloadHash": payloadHash, }, } _, err = txn.Update(ctx, dmlStmt) return err }) return err } // ReadWriteProbe performs a mutation based transaction in the database. type ReadWriteProbe struct{} func (ReadWriteProbe) name() string { return "read_write" } func (ReadWriteProbe) probe(ctx context.Context, p *Prober) error { // Random row within the range. k := rand.Intn(p.numRows) payload, payloadHash, err := p.generatePayload(p.payloadSize) if err != nil { return err } _, err = p.spannerClient.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error { iter := txn.Read(ctx, "ProbeTarget", spanner.Key{k}, []string{"Id", "Payload", "PayloadHash"}) defer iter.Stop() _, err := validateRows(iter) if err != nil { return err } return txn.BufferWrite([]*spanner.Mutation{ spanner.InsertOrUpdate("ProbeTarget", []string{"Id", "Payload", "PayloadHash"}, []interface{}{k, payload, payloadHash}), }) }) return err }