├── .github └── dependabot.yaml ├── .gitignore ├── LICENCE ├── Makefile ├── README.md ├── buf.gen.yaml ├── buf.yaml ├── deploy.sh ├── gen ├── bidrequest.pb.go └── bidrequest_vtproto.pb.go ├── go.mod ├── go.sum ├── main.go ├── proto └── bidrequest.proto └── quacfka-service.service /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: gomod 4 | directory: / 5 | schedule: 6 | interval: daily 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # If you prefer the allow list template instead of the deny list, see community template: 2 | # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore 3 | # 4 | # Binaries for programs and plugins 5 | *.exe 6 | *.exe~ 7 | *.dll 8 | *.so 9 | *.dylib 10 | 11 | # Test binary, built with `go test -c` 12 | *.test 13 | 14 | # Output of the go coverage tool, specifically when used with LiteIDE 15 | *.out 16 | 17 | # Dependency directories (remove the comment below to include it) 18 | # vendor/ 19 | 20 | # Go workspace file 21 | go.work 22 | go.work.sum 23 | 24 | # env file 25 | .env 26 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | BINARY_NAME=quacfka-service 2 | LDFLAGS="-s -w" 3 | build: 4 | CGO_ENABLED=1 GOARCH=amd64 GOOS=linux go build \ 5 | -o ${BINARY_NAME} \ 6 | -ldflags=${LDFLAGS} 7 | 8 | run: 9 | CGO_ENABLED=1 GOARCH=amd64 GOOS=linux go build \ 10 | -o ${BINARY_NAME} \ 11 | -ldflags=${LDFLAGS} 12 | ./${BINARY_NAME} 13 | 14 | vendor: 15 | go mod vendor 16 | 17 | clean: 18 | go clean 19 | rm ${BINARY_NAME} 20 | 21 | test: 22 | go test ./... 23 | 24 | test_coverage: 25 | go test ./... -coverprofile=coverage.out 26 | 27 | dep: 28 | go mod download 29 | 30 | vet: 31 | go vet 32 | 33 | format: 34 | gofumpt -l -w ./ 35 | 36 | lint: 37 | golangci-lint run --enable-all -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Quacfka-Service 🏹🦆 2 | =================== 3 | High throughput streaming of Protobuf data from Kafka into DuckDB 4 | Read about its initial development on my guest post on the Apache Arrow [blog](https://arrow.apache.org/blog/2025/03/10/fast-streaming-inserts-in-duckdb-with-adbc/). 5 | 6 | Uses generics. Use your protobuf message as a type parameter to autogenerate an Arrow schema, provide a protobuf unmarshaling func, and stream data into DuckDB with a very high throughput. 7 | If using file rotation should be run alongside [Quacfka-Runner](https://github.com/loicalleyne/quacfka-runner). 8 | 9 | See [![Go Reference](https://pkg.go.dev/badge/github.com/loicalleyne/quacfka.svg)](https://pkg.go.dev/github.com/loicalleyne/quacfka) documentation for API usage details. 10 | 11 | 12 | ## Usage 13 | ### Code generation for Protobuf 14 | Place your Kafka message schema proto file in `proto/` and run `buf generate`. 15 | 16 | ### Initialize a quacfka.Orchestrator 17 | Modify/comment out the Normalizer queries 18 | Put the message type as the type parameter for the Quacfka Orchestrator. 19 | ```go 20 | // Defining normalizer fields and aliases - must match 21 | normFields := []string{"id", "site.id", "site.publisher.id", "timestamp.seconds", "imp[0].banner.w", "imp[0].banner.h", "imp[0].pmp.deals.id"} 22 | normAliases := []string{"bidreq_id", "device_id", "pub_id", "event_time", "width", "height", "deal"} 23 | o, err = q.NewOrchestrator[*rr.Bidrequest](q.WithFileRotateThresholdMB(int64(*duckSize)), q.WithNormalizer(normFields, normAliases, false), q.WithDuckPathsChan(3)) 24 | ``` 25 | 26 | ### Configure Kafka client with environment variables or in `.env` 27 | ```go 28 | k := o.NewKafkaConfig() 29 | k.ClientCount.Store(int32(*kafkaRoutines)) 30 | k.MsgChanCap = 122880 * *kCap 31 | k.ConsumerGroup = os.Getenv("CONSUMER_GROUP") 32 | k.Seeds = append(k.Seeds, os.Getenv("KAFKA_SEED")) 33 | k.User = os.Getenv("KAFKA_USER") 34 | k.Password = os.Getenv("KAFKA_PW") 35 | // Use this if consuming from topic produced by Confluence client as it prefixes messages with 6 magic bytes 36 | k.Munger = q.WithMessageCutConfluencePrefix 37 | k.Topic = os.Getenv("KAFKA_TOPIC") 38 | ``` 39 | 40 | ### Configure Processor 41 | ```go 42 | // Protobuf processor configuration 43 | err = o.ConfigureProcessor(*arrowQueueSize, *batchMultiplier, *routines, customProtoUnmarshal) 44 | if err != nil { 45 | log.Println(err) 46 | panic(err) 47 | } 48 | ``` 49 | 50 | ### Configure DuckDB 51 | ```go 52 | var driverPath string 53 | switch runtime.GOOS { 54 | case "darwin": 55 | driverPath = "/usr/local/lib/libduckdb.so.dylib" 56 | case "linux": 57 | driverPath = "/usr/local/lib/libduckdb.so" 58 | case "windows": 59 | h, _ := os.UserHomeDir() 60 | driverPath = h + "\\Downloads\\libduckdb-windows-amd64\\duckdb.dll" 61 | default: 62 | } 63 | err = o.ConfigureDuck(q.WithPathPrefix("bidreq"), q.WithDriverPath(driverPath), q.WithDestinationTable("bidreq"), q.WithDuckConnections(*duckRoutines)) 64 | ``` 65 | 66 | ### Setup RPC 67 | ### RPC Usage 68 | ```go 69 | gorpc.RegisterType(rpc.Request{}) 70 | gorpc.RegisterType(rpc.Response{}) 71 | addr = "./gorpc-sock.unix" 72 | client := gorpc.NewUnixClient(addr) 73 | client.Start() 74 | 75 | // partition query 76 | partitionQuery := `select 77 | datepart('year', epoch_ms(timestamp.seconds * 1000))::STRING as year, 78 | datepart('month', epoch_ms(timestamp.seconds * 1000))::STRING as month, 79 | datepart('day', epoch_ms(timestamp.seconds * 1000))::STRING as day, 80 | datepart('hour', epoch_ms(timestamp.seconds * 1000))::STRING as hour 81 | from bidreq 82 | group by all 83 | ORDER BY 1,2,3,4` 84 | // export_raw.sql 85 | rawQuery := `COPY ( 86 | SELECT * 87 | FROM bidreq 88 | WHERE 89 | datepart('year', epoch_ms(((timestamp.seconds * 1000) + (timestamp.nanos/1000000))::BIGINT)) = {{year}} 90 | and datepart('month', epoch_ms(((timestamp.seconds * 1000) + (timestamp.nanos/1000000))::BIGINT)) = {{month}} 91 | and datepart('day', epoch_ms(((timestamp.seconds * 1000) + (timestamp.nanos/1000000))::BIGINT)) = {{day}} 92 | and datepart('hour', epoch_ms(((timestamp.seconds * 1000) + (timestamp.nanos/1000000))::BIGINT)) = {{hour}} ) TO '{{exportpath}}/{{logname}}/{{queryname}}/year={{year}}/month={{month}}/day={{day}}/hour={{hour}}/bidreq_raw_{{rand}}.parquet' (format PARQUET, compression zstd, ROW_GROUP_SIZE_BYTES 100_000_000, OVERWRITE_OR_IGNORE)` 93 | hourlyRequestsAggQuery := `COPY ( 94 | select 95 | datetrunc('day', epoch_ms(event_time*1000))::DATE date, 96 | extract('hour' FROM epoch_ms(event_time*1000)) as hour, 97 | bidreq_norm.pub_id, 98 | bidreq_norm.device_id, 99 | CONCAT(width::string, 'x', height::string) resolution, 100 | deal, 101 | count(distinct bidreq_id) requests, 102 | from bidreq_norm 103 | where 104 | datepart('year', epoch_ms(event_time * 1000)) = {{year}} 105 | and datepart('month', epoch_ms(event_time * 1000)) = {{month}} 106 | and datepart('day', epoch_ms(event_time * 1000)) = {{day}} 107 | and datepart('hour', epoch_ms(event_time * 1000)) = {{hour}} 108 | group by all) 109 | TO '{{exportpath}}/{{logname}}/{{queryname}}/year={{year}}/month={{month}}/day={{day}}/hour={{hour}}/bidreq_hourly_requests_agg_{{rand}}.parquet' (format PARQUET, compression zstd, ROW_GROUP_SIZE_BYTES 100_000_000, OVERWRITE_OR_IGNORE)` 110 | logName := "ortb.bid-requests" 111 | queries := []string{rawQuery, hourlyRequestsAggQuery} 112 | queriesNames := []string{"raw", "hourly_requests_agg"} 113 | execQueries := []string{"SET threads = 32", "SET allocator_background_threads = true"} 114 | execQueriesNames := []string{"", ""} 115 | wg.Add(1) 116 | go func() { 117 | defer wg.Done() 118 | for dPath := range o.DuckPaths() { 119 | path, err := filepath.Abs(dPath) 120 | if err != nil { 121 | log.Printf("dPath error: %v\n", err) 122 | } 123 | // Requests should be validated first with Call, then the request in the validated Response sent with Send. 124 | resp, err := client.Call(rpc.Request{ 125 | Type: rpc.REQUEST_VALIDATE, 126 | Path: path, 127 | ExportPath: *parquetPath, 128 | LogName: logName, 129 | ExecQueries: execQueries, 130 | ExecQueriesNames: execQueriesNames, 131 | PartitionQuery: partitionQuery, 132 | Queries: queries, 133 | QueriesNames: queriesNames, 134 | }) 135 | if err != nil { 136 | log.Printf(" runner request issue: %v\n", err) 137 | } else { 138 | req := resp.(rpc.Response).Request 139 | req.Type = rpc.REQUEST_RUN 140 | err = client.Send(req) 141 | if err != nil { 142 | log.Printf("rpc send error: %v\n", err) 143 | } 144 | } 145 | // Backpressure 146 | d := 0 147 | for i := 0; i <= 60; i++ { 148 | c, _ := dbFileCount("./") 149 | if c > 3 { 150 | delay := time.NewTimer(1 * time.Second) 151 | <-delay.C 152 | d++ 153 | } else { 154 | if d > 0 { 155 | log.Printf("delayed by %d sec\n", d) 156 | } 157 | break 158 | } 159 | } 160 | } 161 | }() 162 | ``` 163 | 164 | ### Deserializer/Normalizer function example 165 | ```go 166 | func customProtoUnmarshal(m []byte, s any) error { 167 | newMessage := rr.BidrequestFromVTPool() 168 | b := m[len(m)-8:] 169 | event_tm := int64(binary.LittleEndian.Uint64(b)) 170 | err := newMessage.UnmarshalVTUnsafe(m[:len(m)-8]) 171 | if err != nil { 172 | return err 173 | } 174 | rb := s.(*bufarrow.Schema[*rr.Bidrequest]).NormalizerBuilder() 175 | if rb != nil { 176 | b := rb.Fields() 177 | if b != nil { 178 | id := newMessage.GetId() 179 | deviceID := coalesceStringFunc(newMessage.GetUser().GetId, newMessage.GetSite().GetId, newMessage.GetDevice().GetIfa) 180 | publisherID := newMessage.GetSite().GetPublisher().GetId() 181 | timestampSeconds := newMessage.GetTimestamp().GetSeconds() 182 | timestampNanos := newMessage.GetTimestamp().GetNanos() 183 | var width, height int32 184 | if newMessage.GetImp()[0].GetBanner() != nil { 185 | width = newMessage.GetImp()[0].GetBanner().GetW() 186 | } else { 187 | width = newMessage.GetImp()[0].GetVideo().GetW() 188 | } 189 | if newMessage.GetImp()[0].GetBanner() != nil { 190 | height = newMessage.GetImp()[0].GetBanner().GetH() 191 | } else { 192 | height = newMessage.GetImp()[0].GetVideo().GetH() 193 | } 194 | if len(newMessage.GetImp()[0].GetPmp().GetDeals()) == 0 { 195 | b[0].(*array.StringBuilder).Append(id) 196 | b[1].(*array.StringBuilder).Append(deviceID) 197 | b[2].(*array.StringBuilder).Append(publisherID) 198 | b[4].(*array.Int64Builder).Append(timestampSeconds + int64(timestampNanos/1000000000)) 199 | b[5].(*array.Uint32Builder).Append(uint32(width)) 200 | b[6].(*array.Uint32Builder).Append(uint32(height)) 201 | b[7].(*array.StringBuilder).AppendNull() 202 | } 203 | // var deals []string = make([]string, len(newMessage.GetImp()[0].GetPmp().GetDeals())) 204 | for i := 0; i < len(newMessage.GetImp()[0].GetPmp().GetDeals()); i++ { 205 | b[0].(*array.StringBuilder).Append(id) 206 | b[1].(*array.StringBuilder).Append(deviceID) 207 | b[2].(*array.StringBuilder).Append(publisherID) 208 | b[4].(*array.Int64Builder).Append(timestampSeconds + int64(timestampNanos/1000000000)) 209 | b[5].(*array.Uint32Builder).Append(uint32(width)) 210 | b[6].(*array.Uint32Builder).Append(uint32(height)) 211 | b[7].(*array.StringBuilder).Append(newMessage.GetImp()[0].GetPmp().GetDeals()[i].GetId()) 212 | } 213 | } 214 | } 215 | 216 | // Assert s to `*bufarrow.Schema[*your.CustomProtoMessageType]` 217 | err = s.(*bufarrow.Schema[*rr.Bidrequest]).AppendWithCustom(newMessage, event_tm) 218 | newMessage.ReturnToVTPool() 219 | return nil 220 | } 221 | ``` 222 | 223 | ### Run it 🚀 224 | ```go 225 | var wg sync.WaitGroup 226 | ctx, ctxCancelFunc := context.WithCancel(context.Background()) 227 | 228 | wg.Add(1) 229 | go o.Run(ctx, &wg) 230 | wg.Wait() 231 | ``` 232 | 233 | ## 💫 Show your support 234 | 235 | Give a ⭐️ if this project helped you! 236 | Feedback and PRs welcome. 237 | 238 | ## Licence 239 | 240 | Quacfka-Service is released under the Apache 2.0 license. See [LICENCE](LICENCE) -------------------------------------------------------------------------------- /buf.gen.yaml: -------------------------------------------------------------------------------- 1 | version: v2 2 | managed: 3 | enabled: true 4 | override: 5 | - file_option: go_package_prefix 6 | value: quacfka-service/gen 7 | plugins: 8 | - remote: buf.build/protocolbuffers/go 9 | out: gen 10 | opt: paths=source_relative 11 | - remote: buf.build/community/planetscale-vtprotobuf:v0.6.0 12 | out: gen 13 | opt: 14 | - paths=source_relative 15 | - features=marshal+unmarshal+size+pool+unmarshal_unsafe 16 | - pool=quacfka-service/gen.Bidrequest 17 | inputs: 18 | - directory: proto/ -------------------------------------------------------------------------------- /buf.yaml: -------------------------------------------------------------------------------- 1 | # For details on buf.yaml configuration, visit https://buf.build/docs/configuration/v2/buf-yaml 2 | version: v2 3 | modules: 4 | - path: proto/ 5 | lint: 6 | use: 7 | - STANDARD 8 | breaking: 9 | use: 10 | - FILE 11 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | make build 3 | mkdir -p /usr/local/bin/quacfka-service 4 | cp ./quacfka-service /usr/local/bin/quacfka-service/ 5 | mkdir -p /usr/local/bin/quacfka-service/parquet 6 | mkdir -p /usr/local/bin/quacfka-service/config 7 | cp ./config/server.toml /usr/local/bin/quacfka-service/config/ 8 | systemctl stop quacfka-service.service 9 | systemctl disable quacfka-service.service 10 | cp quacfka-service.service /lib/systemd/system/quacfka-service.service 11 | systemctl enable quacfka-service.service && systemctl start quacfka-service.service -------------------------------------------------------------------------------- /gen/bidrequest.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.36.5 4 | // protoc (unknown) 5 | // source: bidrequest.proto 6 | 7 | package gen 8 | 9 | import ( 10 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 11 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 12 | timestamppb "google.golang.org/protobuf/types/known/timestamppb" 13 | reflect "reflect" 14 | sync "sync" 15 | unsafe "unsafe" 16 | ) 17 | 18 | const ( 19 | // Verify that this generated code is sufficiently up-to-date. 20 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 21 | // Verify that runtime/protoimpl is sufficiently up-to-date. 22 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 23 | ) 24 | 25 | type Bidrequest struct { 26 | state protoimpl.MessageState `protogen:"open.v1"` 27 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 28 | Imp []*Imp `protobuf:"bytes,2,rep,name=imp,proto3" json:"imp,omitempty"` 29 | Site *Site `protobuf:"bytes,3,opt,name=site,proto3" json:"site,omitempty"` 30 | App *App `protobuf:"bytes,4,opt,name=app,proto3" json:"app,omitempty"` 31 | Device *Device `protobuf:"bytes,5,opt,name=device,proto3" json:"device,omitempty"` 32 | User *User `protobuf:"bytes,6,opt,name=user,proto3" json:"user,omitempty"` 33 | Test int32 `protobuf:"varint,7,opt,name=test,proto3" json:"test,omitempty"` 34 | At int32 `protobuf:"varint,8,opt,name=at,proto3" json:"at,omitempty"` 35 | Tmax int32 `protobuf:"varint,9,opt,name=tmax,proto3" json:"tmax,omitempty"` 36 | Wseat []string `protobuf:"bytes,10,rep,name=wseat,proto3" json:"wseat,omitempty"` 37 | Bseat []string `protobuf:"bytes,11,rep,name=bseat,proto3" json:"bseat,omitempty"` 38 | Allimps int32 `protobuf:"varint,12,opt,name=allimps,proto3" json:"allimps,omitempty"` 39 | Cur []string `protobuf:"bytes,13,rep,name=cur,proto3" json:"cur,omitempty"` 40 | Wlang []string `protobuf:"bytes,14,rep,name=wlang,proto3" json:"wlang,omitempty"` 41 | Bcat []string `protobuf:"bytes,15,rep,name=bcat,proto3" json:"bcat,omitempty"` 42 | Badv []string `protobuf:"bytes,16,rep,name=badv,proto3" json:"badv,omitempty"` 43 | Bapp []string `protobuf:"bytes,17,rep,name=bapp,proto3" json:"bapp,omitempty"` 44 | Source *Source `protobuf:"bytes,18,opt,name=source,proto3" json:"source,omitempty"` 45 | Regs *Regs `protobuf:"bytes,19,opt,name=regs,proto3" json:"regs,omitempty"` 46 | Timestamp *timestamppb.Timestamp `protobuf:"bytes,20,opt,name=timestamp,proto3" json:"timestamp,omitempty"` 47 | unknownFields protoimpl.UnknownFields 48 | sizeCache protoimpl.SizeCache 49 | } 50 | 51 | func (x *Bidrequest) Reset() { 52 | *x = Bidrequest{} 53 | mi := &file_bidrequest_proto_msgTypes[0] 54 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 55 | ms.StoreMessageInfo(mi) 56 | } 57 | 58 | func (x *Bidrequest) String() string { 59 | return protoimpl.X.MessageStringOf(x) 60 | } 61 | 62 | func (*Bidrequest) ProtoMessage() {} 63 | 64 | func (x *Bidrequest) ProtoReflect() protoreflect.Message { 65 | mi := &file_bidrequest_proto_msgTypes[0] 66 | if x != nil { 67 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 68 | if ms.LoadMessageInfo() == nil { 69 | ms.StoreMessageInfo(mi) 70 | } 71 | return ms 72 | } 73 | return mi.MessageOf(x) 74 | } 75 | 76 | // Deprecated: Use Bidrequest.ProtoReflect.Descriptor instead. 77 | func (*Bidrequest) Descriptor() ([]byte, []int) { 78 | return file_bidrequest_proto_rawDescGZIP(), []int{0} 79 | } 80 | 81 | func (x *Bidrequest) GetId() string { 82 | if x != nil { 83 | return x.Id 84 | } 85 | return "" 86 | } 87 | 88 | func (x *Bidrequest) GetImp() []*Imp { 89 | if x != nil { 90 | return x.Imp 91 | } 92 | return nil 93 | } 94 | 95 | func (x *Bidrequest) GetSite() *Site { 96 | if x != nil { 97 | return x.Site 98 | } 99 | return nil 100 | } 101 | 102 | func (x *Bidrequest) GetApp() *App { 103 | if x != nil { 104 | return x.App 105 | } 106 | return nil 107 | } 108 | 109 | func (x *Bidrequest) GetDevice() *Device { 110 | if x != nil { 111 | return x.Device 112 | } 113 | return nil 114 | } 115 | 116 | func (x *Bidrequest) GetUser() *User { 117 | if x != nil { 118 | return x.User 119 | } 120 | return nil 121 | } 122 | 123 | func (x *Bidrequest) GetTest() int32 { 124 | if x != nil { 125 | return x.Test 126 | } 127 | return 0 128 | } 129 | 130 | func (x *Bidrequest) GetAt() int32 { 131 | if x != nil { 132 | return x.At 133 | } 134 | return 0 135 | } 136 | 137 | func (x *Bidrequest) GetTmax() int32 { 138 | if x != nil { 139 | return x.Tmax 140 | } 141 | return 0 142 | } 143 | 144 | func (x *Bidrequest) GetWseat() []string { 145 | if x != nil { 146 | return x.Wseat 147 | } 148 | return nil 149 | } 150 | 151 | func (x *Bidrequest) GetBseat() []string { 152 | if x != nil { 153 | return x.Bseat 154 | } 155 | return nil 156 | } 157 | 158 | func (x *Bidrequest) GetAllimps() int32 { 159 | if x != nil { 160 | return x.Allimps 161 | } 162 | return 0 163 | } 164 | 165 | func (x *Bidrequest) GetCur() []string { 166 | if x != nil { 167 | return x.Cur 168 | } 169 | return nil 170 | } 171 | 172 | func (x *Bidrequest) GetWlang() []string { 173 | if x != nil { 174 | return x.Wlang 175 | } 176 | return nil 177 | } 178 | 179 | func (x *Bidrequest) GetBcat() []string { 180 | if x != nil { 181 | return x.Bcat 182 | } 183 | return nil 184 | } 185 | 186 | func (x *Bidrequest) GetBadv() []string { 187 | if x != nil { 188 | return x.Badv 189 | } 190 | return nil 191 | } 192 | 193 | func (x *Bidrequest) GetBapp() []string { 194 | if x != nil { 195 | return x.Bapp 196 | } 197 | return nil 198 | } 199 | 200 | func (x *Bidrequest) GetSource() *Source { 201 | if x != nil { 202 | return x.Source 203 | } 204 | return nil 205 | } 206 | 207 | func (x *Bidrequest) GetRegs() *Regs { 208 | if x != nil { 209 | return x.Regs 210 | } 211 | return nil 212 | } 213 | 214 | func (x *Bidrequest) GetTimestamp() *timestamppb.Timestamp { 215 | if x != nil { 216 | return x.Timestamp 217 | } 218 | return nil 219 | } 220 | 221 | type Source struct { 222 | state protoimpl.MessageState `protogen:"open.v1"` 223 | Fd int32 `protobuf:"varint,1,opt,name=fd,proto3" json:"fd,omitempty"` 224 | Tid string `protobuf:"bytes,2,opt,name=tid,proto3" json:"tid,omitempty"` 225 | Pchain string `protobuf:"bytes,3,opt,name=pchain,proto3" json:"pchain,omitempty"` 226 | unknownFields protoimpl.UnknownFields 227 | sizeCache protoimpl.SizeCache 228 | } 229 | 230 | func (x *Source) Reset() { 231 | *x = Source{} 232 | mi := &file_bidrequest_proto_msgTypes[1] 233 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 234 | ms.StoreMessageInfo(mi) 235 | } 236 | 237 | func (x *Source) String() string { 238 | return protoimpl.X.MessageStringOf(x) 239 | } 240 | 241 | func (*Source) ProtoMessage() {} 242 | 243 | func (x *Source) ProtoReflect() protoreflect.Message { 244 | mi := &file_bidrequest_proto_msgTypes[1] 245 | if x != nil { 246 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 247 | if ms.LoadMessageInfo() == nil { 248 | ms.StoreMessageInfo(mi) 249 | } 250 | return ms 251 | } 252 | return mi.MessageOf(x) 253 | } 254 | 255 | // Deprecated: Use Source.ProtoReflect.Descriptor instead. 256 | func (*Source) Descriptor() ([]byte, []int) { 257 | return file_bidrequest_proto_rawDescGZIP(), []int{1} 258 | } 259 | 260 | func (x *Source) GetFd() int32 { 261 | if x != nil { 262 | return x.Fd 263 | } 264 | return 0 265 | } 266 | 267 | func (x *Source) GetTid() string { 268 | if x != nil { 269 | return x.Tid 270 | } 271 | return "" 272 | } 273 | 274 | func (x *Source) GetPchain() string { 275 | if x != nil { 276 | return x.Pchain 277 | } 278 | return "" 279 | } 280 | 281 | type Regs struct { 282 | state protoimpl.MessageState `protogen:"open.v1"` 283 | Coppa int32 `protobuf:"varint,1,opt,name=coppa,proto3" json:"coppa,omitempty"` 284 | unknownFields protoimpl.UnknownFields 285 | sizeCache protoimpl.SizeCache 286 | } 287 | 288 | func (x *Regs) Reset() { 289 | *x = Regs{} 290 | mi := &file_bidrequest_proto_msgTypes[2] 291 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 292 | ms.StoreMessageInfo(mi) 293 | } 294 | 295 | func (x *Regs) String() string { 296 | return protoimpl.X.MessageStringOf(x) 297 | } 298 | 299 | func (*Regs) ProtoMessage() {} 300 | 301 | func (x *Regs) ProtoReflect() protoreflect.Message { 302 | mi := &file_bidrequest_proto_msgTypes[2] 303 | if x != nil { 304 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 305 | if ms.LoadMessageInfo() == nil { 306 | ms.StoreMessageInfo(mi) 307 | } 308 | return ms 309 | } 310 | return mi.MessageOf(x) 311 | } 312 | 313 | // Deprecated: Use Regs.ProtoReflect.Descriptor instead. 314 | func (*Regs) Descriptor() ([]byte, []int) { 315 | return file_bidrequest_proto_rawDescGZIP(), []int{2} 316 | } 317 | 318 | func (x *Regs) GetCoppa() int32 { 319 | if x != nil { 320 | return x.Coppa 321 | } 322 | return 0 323 | } 324 | 325 | type Imp struct { 326 | state protoimpl.MessageState `protogen:"open.v1"` 327 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 328 | Metric []*Metric `protobuf:"bytes,2,rep,name=metric,proto3" json:"metric,omitempty"` 329 | Banner *Banner `protobuf:"bytes,3,opt,name=banner,proto3" json:"banner,omitempty"` 330 | Video *Video `protobuf:"bytes,4,opt,name=video,proto3" json:"video,omitempty"` 331 | Audio *Audio `protobuf:"bytes,5,opt,name=audio,proto3" json:"audio,omitempty"` 332 | Native *Native `protobuf:"bytes,6,opt,name=native,proto3" json:"native,omitempty"` 333 | Pmp *Pmp `protobuf:"bytes,7,opt,name=pmp,proto3" json:"pmp,omitempty"` 334 | Displaymanager string `protobuf:"bytes,8,opt,name=displaymanager,proto3" json:"displaymanager,omitempty"` 335 | Displaymanagerver string `protobuf:"bytes,9,opt,name=displaymanagerver,proto3" json:"displaymanagerver,omitempty"` 336 | Instl int32 `protobuf:"varint,10,opt,name=instl,proto3" json:"instl,omitempty"` 337 | Tagid string `protobuf:"bytes,11,opt,name=tagid,proto3" json:"tagid,omitempty"` 338 | Bidfloor float32 `protobuf:"fixed32,12,opt,name=bidfloor,proto3" json:"bidfloor,omitempty"` 339 | Bidfloorcur string `protobuf:"bytes,13,opt,name=bidfloorcur,proto3" json:"bidfloorcur,omitempty"` 340 | Clickbrowser int32 `protobuf:"varint,14,opt,name=clickbrowser,proto3" json:"clickbrowser,omitempty"` 341 | Secure int32 `protobuf:"varint,15,opt,name=secure,proto3" json:"secure,omitempty"` 342 | Iframebuster []string `protobuf:"bytes,16,rep,name=iframebuster,proto3" json:"iframebuster,omitempty"` 343 | Exp int32 `protobuf:"varint,17,opt,name=exp,proto3" json:"exp,omitempty"` 344 | unknownFields protoimpl.UnknownFields 345 | sizeCache protoimpl.SizeCache 346 | } 347 | 348 | func (x *Imp) Reset() { 349 | *x = Imp{} 350 | mi := &file_bidrequest_proto_msgTypes[3] 351 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 352 | ms.StoreMessageInfo(mi) 353 | } 354 | 355 | func (x *Imp) String() string { 356 | return protoimpl.X.MessageStringOf(x) 357 | } 358 | 359 | func (*Imp) ProtoMessage() {} 360 | 361 | func (x *Imp) ProtoReflect() protoreflect.Message { 362 | mi := &file_bidrequest_proto_msgTypes[3] 363 | if x != nil { 364 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 365 | if ms.LoadMessageInfo() == nil { 366 | ms.StoreMessageInfo(mi) 367 | } 368 | return ms 369 | } 370 | return mi.MessageOf(x) 371 | } 372 | 373 | // Deprecated: Use Imp.ProtoReflect.Descriptor instead. 374 | func (*Imp) Descriptor() ([]byte, []int) { 375 | return file_bidrequest_proto_rawDescGZIP(), []int{3} 376 | } 377 | 378 | func (x *Imp) GetId() string { 379 | if x != nil { 380 | return x.Id 381 | } 382 | return "" 383 | } 384 | 385 | func (x *Imp) GetMetric() []*Metric { 386 | if x != nil { 387 | return x.Metric 388 | } 389 | return nil 390 | } 391 | 392 | func (x *Imp) GetBanner() *Banner { 393 | if x != nil { 394 | return x.Banner 395 | } 396 | return nil 397 | } 398 | 399 | func (x *Imp) GetVideo() *Video { 400 | if x != nil { 401 | return x.Video 402 | } 403 | return nil 404 | } 405 | 406 | func (x *Imp) GetAudio() *Audio { 407 | if x != nil { 408 | return x.Audio 409 | } 410 | return nil 411 | } 412 | 413 | func (x *Imp) GetNative() *Native { 414 | if x != nil { 415 | return x.Native 416 | } 417 | return nil 418 | } 419 | 420 | func (x *Imp) GetPmp() *Pmp { 421 | if x != nil { 422 | return x.Pmp 423 | } 424 | return nil 425 | } 426 | 427 | func (x *Imp) GetDisplaymanager() string { 428 | if x != nil { 429 | return x.Displaymanager 430 | } 431 | return "" 432 | } 433 | 434 | func (x *Imp) GetDisplaymanagerver() string { 435 | if x != nil { 436 | return x.Displaymanagerver 437 | } 438 | return "" 439 | } 440 | 441 | func (x *Imp) GetInstl() int32 { 442 | if x != nil { 443 | return x.Instl 444 | } 445 | return 0 446 | } 447 | 448 | func (x *Imp) GetTagid() string { 449 | if x != nil { 450 | return x.Tagid 451 | } 452 | return "" 453 | } 454 | 455 | func (x *Imp) GetBidfloor() float32 { 456 | if x != nil { 457 | return x.Bidfloor 458 | } 459 | return 0 460 | } 461 | 462 | func (x *Imp) GetBidfloorcur() string { 463 | if x != nil { 464 | return x.Bidfloorcur 465 | } 466 | return "" 467 | } 468 | 469 | func (x *Imp) GetClickbrowser() int32 { 470 | if x != nil { 471 | return x.Clickbrowser 472 | } 473 | return 0 474 | } 475 | 476 | func (x *Imp) GetSecure() int32 { 477 | if x != nil { 478 | return x.Secure 479 | } 480 | return 0 481 | } 482 | 483 | func (x *Imp) GetIframebuster() []string { 484 | if x != nil { 485 | return x.Iframebuster 486 | } 487 | return nil 488 | } 489 | 490 | func (x *Imp) GetExp() int32 { 491 | if x != nil { 492 | return x.Exp 493 | } 494 | return 0 495 | } 496 | 497 | type Metric struct { 498 | state protoimpl.MessageState `protogen:"open.v1"` 499 | Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` 500 | Value float32 `protobuf:"fixed32,2,opt,name=value,proto3" json:"value,omitempty"` 501 | Vendor string `protobuf:"bytes,3,opt,name=vendor,proto3" json:"vendor,omitempty"` 502 | unknownFields protoimpl.UnknownFields 503 | sizeCache protoimpl.SizeCache 504 | } 505 | 506 | func (x *Metric) Reset() { 507 | *x = Metric{} 508 | mi := &file_bidrequest_proto_msgTypes[4] 509 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 510 | ms.StoreMessageInfo(mi) 511 | } 512 | 513 | func (x *Metric) String() string { 514 | return protoimpl.X.MessageStringOf(x) 515 | } 516 | 517 | func (*Metric) ProtoMessage() {} 518 | 519 | func (x *Metric) ProtoReflect() protoreflect.Message { 520 | mi := &file_bidrequest_proto_msgTypes[4] 521 | if x != nil { 522 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 523 | if ms.LoadMessageInfo() == nil { 524 | ms.StoreMessageInfo(mi) 525 | } 526 | return ms 527 | } 528 | return mi.MessageOf(x) 529 | } 530 | 531 | // Deprecated: Use Metric.ProtoReflect.Descriptor instead. 532 | func (*Metric) Descriptor() ([]byte, []int) { 533 | return file_bidrequest_proto_rawDescGZIP(), []int{4} 534 | } 535 | 536 | func (x *Metric) GetType() string { 537 | if x != nil { 538 | return x.Type 539 | } 540 | return "" 541 | } 542 | 543 | func (x *Metric) GetValue() float32 { 544 | if x != nil { 545 | return x.Value 546 | } 547 | return 0 548 | } 549 | 550 | func (x *Metric) GetVendor() string { 551 | if x != nil { 552 | return x.Vendor 553 | } 554 | return "" 555 | } 556 | 557 | type Banner struct { 558 | state protoimpl.MessageState `protogen:"open.v1"` 559 | Format []string `protobuf:"bytes,1,rep,name=format,proto3" json:"format,omitempty"` 560 | W int32 `protobuf:"varint,2,opt,name=w,proto3" json:"w,omitempty"` 561 | H int32 `protobuf:"varint,3,opt,name=h,proto3" json:"h,omitempty"` 562 | Btype []int32 `protobuf:"varint,4,rep,packed,name=btype,proto3" json:"btype,omitempty"` 563 | Battr []int32 `protobuf:"varint,5,rep,packed,name=battr,proto3" json:"battr,omitempty"` 564 | Pos int32 `protobuf:"varint,6,opt,name=pos,proto3" json:"pos,omitempty"` 565 | Mimes []string `protobuf:"bytes,7,rep,name=mimes,proto3" json:"mimes,omitempty"` 566 | Topframe int32 `protobuf:"varint,8,opt,name=topframe,proto3" json:"topframe,omitempty"` 567 | Expdir []int32 `protobuf:"varint,9,rep,packed,name=expdir,proto3" json:"expdir,omitempty"` 568 | Api []int32 `protobuf:"varint,10,rep,packed,name=api,proto3" json:"api,omitempty"` 569 | Id string `protobuf:"bytes,11,opt,name=id,proto3" json:"id,omitempty"` 570 | Vcm int32 `protobuf:"varint,12,opt,name=vcm,proto3" json:"vcm,omitempty"` 571 | unknownFields protoimpl.UnknownFields 572 | sizeCache protoimpl.SizeCache 573 | } 574 | 575 | func (x *Banner) Reset() { 576 | *x = Banner{} 577 | mi := &file_bidrequest_proto_msgTypes[5] 578 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 579 | ms.StoreMessageInfo(mi) 580 | } 581 | 582 | func (x *Banner) String() string { 583 | return protoimpl.X.MessageStringOf(x) 584 | } 585 | 586 | func (*Banner) ProtoMessage() {} 587 | 588 | func (x *Banner) ProtoReflect() protoreflect.Message { 589 | mi := &file_bidrequest_proto_msgTypes[5] 590 | if x != nil { 591 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 592 | if ms.LoadMessageInfo() == nil { 593 | ms.StoreMessageInfo(mi) 594 | } 595 | return ms 596 | } 597 | return mi.MessageOf(x) 598 | } 599 | 600 | // Deprecated: Use Banner.ProtoReflect.Descriptor instead. 601 | func (*Banner) Descriptor() ([]byte, []int) { 602 | return file_bidrequest_proto_rawDescGZIP(), []int{5} 603 | } 604 | 605 | func (x *Banner) GetFormat() []string { 606 | if x != nil { 607 | return x.Format 608 | } 609 | return nil 610 | } 611 | 612 | func (x *Banner) GetW() int32 { 613 | if x != nil { 614 | return x.W 615 | } 616 | return 0 617 | } 618 | 619 | func (x *Banner) GetH() int32 { 620 | if x != nil { 621 | return x.H 622 | } 623 | return 0 624 | } 625 | 626 | func (x *Banner) GetBtype() []int32 { 627 | if x != nil { 628 | return x.Btype 629 | } 630 | return nil 631 | } 632 | 633 | func (x *Banner) GetBattr() []int32 { 634 | if x != nil { 635 | return x.Battr 636 | } 637 | return nil 638 | } 639 | 640 | func (x *Banner) GetPos() int32 { 641 | if x != nil { 642 | return x.Pos 643 | } 644 | return 0 645 | } 646 | 647 | func (x *Banner) GetMimes() []string { 648 | if x != nil { 649 | return x.Mimes 650 | } 651 | return nil 652 | } 653 | 654 | func (x *Banner) GetTopframe() int32 { 655 | if x != nil { 656 | return x.Topframe 657 | } 658 | return 0 659 | } 660 | 661 | func (x *Banner) GetExpdir() []int32 { 662 | if x != nil { 663 | return x.Expdir 664 | } 665 | return nil 666 | } 667 | 668 | func (x *Banner) GetApi() []int32 { 669 | if x != nil { 670 | return x.Api 671 | } 672 | return nil 673 | } 674 | 675 | func (x *Banner) GetId() string { 676 | if x != nil { 677 | return x.Id 678 | } 679 | return "" 680 | } 681 | 682 | func (x *Banner) GetVcm() int32 { 683 | if x != nil { 684 | return x.Vcm 685 | } 686 | return 0 687 | } 688 | 689 | type Video struct { 690 | state protoimpl.MessageState `protogen:"open.v1"` 691 | Mimes []string `protobuf:"bytes,1,rep,name=mimes,proto3" json:"mimes,omitempty"` 692 | Minduration int32 `protobuf:"varint,2,opt,name=minduration,proto3" json:"minduration,omitempty"` 693 | Maxduration int32 `protobuf:"varint,3,opt,name=maxduration,proto3" json:"maxduration,omitempty"` 694 | Protocols []int32 `protobuf:"varint,4,rep,packed,name=protocols,proto3" json:"protocols,omitempty"` 695 | W int32 `protobuf:"varint,5,opt,name=w,proto3" json:"w,omitempty"` 696 | H int32 `protobuf:"varint,6,opt,name=h,proto3" json:"h,omitempty"` 697 | Startdelay int32 `protobuf:"varint,7,opt,name=startdelay,proto3" json:"startdelay,omitempty"` 698 | Placement int32 `protobuf:"varint,8,opt,name=placement,proto3" json:"placement,omitempty"` 699 | Linearity int32 `protobuf:"varint,9,opt,name=linearity,proto3" json:"linearity,omitempty"` 700 | Skip int32 `protobuf:"varint,10,opt,name=skip,proto3" json:"skip,omitempty"` 701 | Skipmin int32 `protobuf:"varint,11,opt,name=skipmin,proto3" json:"skipmin,omitempty"` 702 | Skipafter int32 `protobuf:"varint,12,opt,name=skipafter,proto3" json:"skipafter,omitempty"` 703 | Sequence int32 `protobuf:"varint,13,opt,name=sequence,proto3" json:"sequence,omitempty"` 704 | Battr []int32 `protobuf:"varint,14,rep,packed,name=battr,proto3" json:"battr,omitempty"` 705 | Maxextended int32 `protobuf:"varint,15,opt,name=maxextended,proto3" json:"maxextended,omitempty"` 706 | Minbitrate int32 `protobuf:"varint,16,opt,name=minbitrate,proto3" json:"minbitrate,omitempty"` 707 | Maxbitrate int32 `protobuf:"varint,17,opt,name=maxbitrate,proto3" json:"maxbitrate,omitempty"` 708 | Boxingallowed int32 `protobuf:"varint,18,opt,name=boxingallowed,proto3" json:"boxingallowed,omitempty"` 709 | Playbackmethod []int32 `protobuf:"varint,19,rep,packed,name=playbackmethod,proto3" json:"playbackmethod,omitempty"` 710 | Playbackend int32 `protobuf:"varint,20,opt,name=playbackend,proto3" json:"playbackend,omitempty"` 711 | Delivery []int32 `protobuf:"varint,21,rep,packed,name=delivery,proto3" json:"delivery,omitempty"` 712 | Pos int32 `protobuf:"varint,22,opt,name=pos,proto3" json:"pos,omitempty"` 713 | Companionad []*Banner `protobuf:"bytes,23,rep,name=companionad,proto3" json:"companionad,omitempty"` 714 | Api []int32 `protobuf:"varint,24,rep,packed,name=api,proto3" json:"api,omitempty"` 715 | Companiontype []int32 `protobuf:"varint,25,rep,packed,name=companiontype,proto3" json:"companiontype,omitempty"` 716 | unknownFields protoimpl.UnknownFields 717 | sizeCache protoimpl.SizeCache 718 | } 719 | 720 | func (x *Video) Reset() { 721 | *x = Video{} 722 | mi := &file_bidrequest_proto_msgTypes[6] 723 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 724 | ms.StoreMessageInfo(mi) 725 | } 726 | 727 | func (x *Video) String() string { 728 | return protoimpl.X.MessageStringOf(x) 729 | } 730 | 731 | func (*Video) ProtoMessage() {} 732 | 733 | func (x *Video) ProtoReflect() protoreflect.Message { 734 | mi := &file_bidrequest_proto_msgTypes[6] 735 | if x != nil { 736 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 737 | if ms.LoadMessageInfo() == nil { 738 | ms.StoreMessageInfo(mi) 739 | } 740 | return ms 741 | } 742 | return mi.MessageOf(x) 743 | } 744 | 745 | // Deprecated: Use Video.ProtoReflect.Descriptor instead. 746 | func (*Video) Descriptor() ([]byte, []int) { 747 | return file_bidrequest_proto_rawDescGZIP(), []int{6} 748 | } 749 | 750 | func (x *Video) GetMimes() []string { 751 | if x != nil { 752 | return x.Mimes 753 | } 754 | return nil 755 | } 756 | 757 | func (x *Video) GetMinduration() int32 { 758 | if x != nil { 759 | return x.Minduration 760 | } 761 | return 0 762 | } 763 | 764 | func (x *Video) GetMaxduration() int32 { 765 | if x != nil { 766 | return x.Maxduration 767 | } 768 | return 0 769 | } 770 | 771 | func (x *Video) GetProtocols() []int32 { 772 | if x != nil { 773 | return x.Protocols 774 | } 775 | return nil 776 | } 777 | 778 | func (x *Video) GetW() int32 { 779 | if x != nil { 780 | return x.W 781 | } 782 | return 0 783 | } 784 | 785 | func (x *Video) GetH() int32 { 786 | if x != nil { 787 | return x.H 788 | } 789 | return 0 790 | } 791 | 792 | func (x *Video) GetStartdelay() int32 { 793 | if x != nil { 794 | return x.Startdelay 795 | } 796 | return 0 797 | } 798 | 799 | func (x *Video) GetPlacement() int32 { 800 | if x != nil { 801 | return x.Placement 802 | } 803 | return 0 804 | } 805 | 806 | func (x *Video) GetLinearity() int32 { 807 | if x != nil { 808 | return x.Linearity 809 | } 810 | return 0 811 | } 812 | 813 | func (x *Video) GetSkip() int32 { 814 | if x != nil { 815 | return x.Skip 816 | } 817 | return 0 818 | } 819 | 820 | func (x *Video) GetSkipmin() int32 { 821 | if x != nil { 822 | return x.Skipmin 823 | } 824 | return 0 825 | } 826 | 827 | func (x *Video) GetSkipafter() int32 { 828 | if x != nil { 829 | return x.Skipafter 830 | } 831 | return 0 832 | } 833 | 834 | func (x *Video) GetSequence() int32 { 835 | if x != nil { 836 | return x.Sequence 837 | } 838 | return 0 839 | } 840 | 841 | func (x *Video) GetBattr() []int32 { 842 | if x != nil { 843 | return x.Battr 844 | } 845 | return nil 846 | } 847 | 848 | func (x *Video) GetMaxextended() int32 { 849 | if x != nil { 850 | return x.Maxextended 851 | } 852 | return 0 853 | } 854 | 855 | func (x *Video) GetMinbitrate() int32 { 856 | if x != nil { 857 | return x.Minbitrate 858 | } 859 | return 0 860 | } 861 | 862 | func (x *Video) GetMaxbitrate() int32 { 863 | if x != nil { 864 | return x.Maxbitrate 865 | } 866 | return 0 867 | } 868 | 869 | func (x *Video) GetBoxingallowed() int32 { 870 | if x != nil { 871 | return x.Boxingallowed 872 | } 873 | return 0 874 | } 875 | 876 | func (x *Video) GetPlaybackmethod() []int32 { 877 | if x != nil { 878 | return x.Playbackmethod 879 | } 880 | return nil 881 | } 882 | 883 | func (x *Video) GetPlaybackend() int32 { 884 | if x != nil { 885 | return x.Playbackend 886 | } 887 | return 0 888 | } 889 | 890 | func (x *Video) GetDelivery() []int32 { 891 | if x != nil { 892 | return x.Delivery 893 | } 894 | return nil 895 | } 896 | 897 | func (x *Video) GetPos() int32 { 898 | if x != nil { 899 | return x.Pos 900 | } 901 | return 0 902 | } 903 | 904 | func (x *Video) GetCompanionad() []*Banner { 905 | if x != nil { 906 | return x.Companionad 907 | } 908 | return nil 909 | } 910 | 911 | func (x *Video) GetApi() []int32 { 912 | if x != nil { 913 | return x.Api 914 | } 915 | return nil 916 | } 917 | 918 | func (x *Video) GetCompaniontype() []int32 { 919 | if x != nil { 920 | return x.Companiontype 921 | } 922 | return nil 923 | } 924 | 925 | type Audio struct { 926 | state protoimpl.MessageState `protogen:"open.v1"` 927 | Mimes []string `protobuf:"bytes,1,rep,name=mimes,proto3" json:"mimes,omitempty"` 928 | Minduration int32 `protobuf:"varint,2,opt,name=minduration,proto3" json:"minduration,omitempty"` 929 | Maxduration int32 `protobuf:"varint,3,opt,name=maxduration,proto3" json:"maxduration,omitempty"` 930 | Protocols []int32 `protobuf:"varint,4,rep,packed,name=protocols,proto3" json:"protocols,omitempty"` 931 | Startdelay int32 `protobuf:"varint,5,opt,name=startdelay,proto3" json:"startdelay,omitempty"` 932 | Sequence int32 `protobuf:"varint,6,opt,name=sequence,proto3" json:"sequence,omitempty"` 933 | Battr []int32 `protobuf:"varint,7,rep,packed,name=battr,proto3" json:"battr,omitempty"` 934 | Maxextended int32 `protobuf:"varint,8,opt,name=maxextended,proto3" json:"maxextended,omitempty"` 935 | Minbitrate int32 `protobuf:"varint,9,opt,name=minbitrate,proto3" json:"minbitrate,omitempty"` 936 | Maxbitrate int32 `protobuf:"varint,10,opt,name=maxbitrate,proto3" json:"maxbitrate,omitempty"` 937 | Delivery []int32 `protobuf:"varint,11,rep,packed,name=delivery,proto3" json:"delivery,omitempty"` 938 | Companionad []*Banner `protobuf:"bytes,12,rep,name=companionad,proto3" json:"companionad,omitempty"` 939 | Api []int32 `protobuf:"varint,13,rep,packed,name=api,proto3" json:"api,omitempty"` 940 | Companiontype []int32 `protobuf:"varint,14,rep,packed,name=companiontype,proto3" json:"companiontype,omitempty"` 941 | Maxseq int32 `protobuf:"varint,15,opt,name=maxseq,proto3" json:"maxseq,omitempty"` 942 | Feed int32 `protobuf:"varint,16,opt,name=feed,proto3" json:"feed,omitempty"` 943 | Stitched int32 `protobuf:"varint,17,opt,name=stitched,proto3" json:"stitched,omitempty"` 944 | Nvol int32 `protobuf:"varint,18,opt,name=nvol,proto3" json:"nvol,omitempty"` 945 | unknownFields protoimpl.UnknownFields 946 | sizeCache protoimpl.SizeCache 947 | } 948 | 949 | func (x *Audio) Reset() { 950 | *x = Audio{} 951 | mi := &file_bidrequest_proto_msgTypes[7] 952 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 953 | ms.StoreMessageInfo(mi) 954 | } 955 | 956 | func (x *Audio) String() string { 957 | return protoimpl.X.MessageStringOf(x) 958 | } 959 | 960 | func (*Audio) ProtoMessage() {} 961 | 962 | func (x *Audio) ProtoReflect() protoreflect.Message { 963 | mi := &file_bidrequest_proto_msgTypes[7] 964 | if x != nil { 965 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 966 | if ms.LoadMessageInfo() == nil { 967 | ms.StoreMessageInfo(mi) 968 | } 969 | return ms 970 | } 971 | return mi.MessageOf(x) 972 | } 973 | 974 | // Deprecated: Use Audio.ProtoReflect.Descriptor instead. 975 | func (*Audio) Descriptor() ([]byte, []int) { 976 | return file_bidrequest_proto_rawDescGZIP(), []int{7} 977 | } 978 | 979 | func (x *Audio) GetMimes() []string { 980 | if x != nil { 981 | return x.Mimes 982 | } 983 | return nil 984 | } 985 | 986 | func (x *Audio) GetMinduration() int32 { 987 | if x != nil { 988 | return x.Minduration 989 | } 990 | return 0 991 | } 992 | 993 | func (x *Audio) GetMaxduration() int32 { 994 | if x != nil { 995 | return x.Maxduration 996 | } 997 | return 0 998 | } 999 | 1000 | func (x *Audio) GetProtocols() []int32 { 1001 | if x != nil { 1002 | return x.Protocols 1003 | } 1004 | return nil 1005 | } 1006 | 1007 | func (x *Audio) GetStartdelay() int32 { 1008 | if x != nil { 1009 | return x.Startdelay 1010 | } 1011 | return 0 1012 | } 1013 | 1014 | func (x *Audio) GetSequence() int32 { 1015 | if x != nil { 1016 | return x.Sequence 1017 | } 1018 | return 0 1019 | } 1020 | 1021 | func (x *Audio) GetBattr() []int32 { 1022 | if x != nil { 1023 | return x.Battr 1024 | } 1025 | return nil 1026 | } 1027 | 1028 | func (x *Audio) GetMaxextended() int32 { 1029 | if x != nil { 1030 | return x.Maxextended 1031 | } 1032 | return 0 1033 | } 1034 | 1035 | func (x *Audio) GetMinbitrate() int32 { 1036 | if x != nil { 1037 | return x.Minbitrate 1038 | } 1039 | return 0 1040 | } 1041 | 1042 | func (x *Audio) GetMaxbitrate() int32 { 1043 | if x != nil { 1044 | return x.Maxbitrate 1045 | } 1046 | return 0 1047 | } 1048 | 1049 | func (x *Audio) GetDelivery() []int32 { 1050 | if x != nil { 1051 | return x.Delivery 1052 | } 1053 | return nil 1054 | } 1055 | 1056 | func (x *Audio) GetCompanionad() []*Banner { 1057 | if x != nil { 1058 | return x.Companionad 1059 | } 1060 | return nil 1061 | } 1062 | 1063 | func (x *Audio) GetApi() []int32 { 1064 | if x != nil { 1065 | return x.Api 1066 | } 1067 | return nil 1068 | } 1069 | 1070 | func (x *Audio) GetCompaniontype() []int32 { 1071 | if x != nil { 1072 | return x.Companiontype 1073 | } 1074 | return nil 1075 | } 1076 | 1077 | func (x *Audio) GetMaxseq() int32 { 1078 | if x != nil { 1079 | return x.Maxseq 1080 | } 1081 | return 0 1082 | } 1083 | 1084 | func (x *Audio) GetFeed() int32 { 1085 | if x != nil { 1086 | return x.Feed 1087 | } 1088 | return 0 1089 | } 1090 | 1091 | func (x *Audio) GetStitched() int32 { 1092 | if x != nil { 1093 | return x.Stitched 1094 | } 1095 | return 0 1096 | } 1097 | 1098 | func (x *Audio) GetNvol() int32 { 1099 | if x != nil { 1100 | return x.Nvol 1101 | } 1102 | return 0 1103 | } 1104 | 1105 | type Native struct { 1106 | state protoimpl.MessageState `protogen:"open.v1"` 1107 | Request string `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` 1108 | Ver string `protobuf:"bytes,2,opt,name=ver,proto3" json:"ver,omitempty"` 1109 | Api []int32 `protobuf:"varint,3,rep,packed,name=api,proto3" json:"api,omitempty"` 1110 | Battr []int32 `protobuf:"varint,4,rep,packed,name=battr,proto3" json:"battr,omitempty"` 1111 | unknownFields protoimpl.UnknownFields 1112 | sizeCache protoimpl.SizeCache 1113 | } 1114 | 1115 | func (x *Native) Reset() { 1116 | *x = Native{} 1117 | mi := &file_bidrequest_proto_msgTypes[8] 1118 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1119 | ms.StoreMessageInfo(mi) 1120 | } 1121 | 1122 | func (x *Native) String() string { 1123 | return protoimpl.X.MessageStringOf(x) 1124 | } 1125 | 1126 | func (*Native) ProtoMessage() {} 1127 | 1128 | func (x *Native) ProtoReflect() protoreflect.Message { 1129 | mi := &file_bidrequest_proto_msgTypes[8] 1130 | if x != nil { 1131 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1132 | if ms.LoadMessageInfo() == nil { 1133 | ms.StoreMessageInfo(mi) 1134 | } 1135 | return ms 1136 | } 1137 | return mi.MessageOf(x) 1138 | } 1139 | 1140 | // Deprecated: Use Native.ProtoReflect.Descriptor instead. 1141 | func (*Native) Descriptor() ([]byte, []int) { 1142 | return file_bidrequest_proto_rawDescGZIP(), []int{8} 1143 | } 1144 | 1145 | func (x *Native) GetRequest() string { 1146 | if x != nil { 1147 | return x.Request 1148 | } 1149 | return "" 1150 | } 1151 | 1152 | func (x *Native) GetVer() string { 1153 | if x != nil { 1154 | return x.Ver 1155 | } 1156 | return "" 1157 | } 1158 | 1159 | func (x *Native) GetApi() []int32 { 1160 | if x != nil { 1161 | return x.Api 1162 | } 1163 | return nil 1164 | } 1165 | 1166 | func (x *Native) GetBattr() []int32 { 1167 | if x != nil { 1168 | return x.Battr 1169 | } 1170 | return nil 1171 | } 1172 | 1173 | type Format struct { 1174 | state protoimpl.MessageState `protogen:"open.v1"` 1175 | W int32 `protobuf:"varint,1,opt,name=w,proto3" json:"w,omitempty"` 1176 | H int32 `protobuf:"varint,2,opt,name=h,proto3" json:"h,omitempty"` 1177 | Wratio int32 `protobuf:"varint,3,opt,name=wratio,proto3" json:"wratio,omitempty"` 1178 | Hratio int32 `protobuf:"varint,4,opt,name=hratio,proto3" json:"hratio,omitempty"` 1179 | Wmin int32 `protobuf:"varint,5,opt,name=wmin,proto3" json:"wmin,omitempty"` 1180 | unknownFields protoimpl.UnknownFields 1181 | sizeCache protoimpl.SizeCache 1182 | } 1183 | 1184 | func (x *Format) Reset() { 1185 | *x = Format{} 1186 | mi := &file_bidrequest_proto_msgTypes[9] 1187 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1188 | ms.StoreMessageInfo(mi) 1189 | } 1190 | 1191 | func (x *Format) String() string { 1192 | return protoimpl.X.MessageStringOf(x) 1193 | } 1194 | 1195 | func (*Format) ProtoMessage() {} 1196 | 1197 | func (x *Format) ProtoReflect() protoreflect.Message { 1198 | mi := &file_bidrequest_proto_msgTypes[9] 1199 | if x != nil { 1200 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1201 | if ms.LoadMessageInfo() == nil { 1202 | ms.StoreMessageInfo(mi) 1203 | } 1204 | return ms 1205 | } 1206 | return mi.MessageOf(x) 1207 | } 1208 | 1209 | // Deprecated: Use Format.ProtoReflect.Descriptor instead. 1210 | func (*Format) Descriptor() ([]byte, []int) { 1211 | return file_bidrequest_proto_rawDescGZIP(), []int{9} 1212 | } 1213 | 1214 | func (x *Format) GetW() int32 { 1215 | if x != nil { 1216 | return x.W 1217 | } 1218 | return 0 1219 | } 1220 | 1221 | func (x *Format) GetH() int32 { 1222 | if x != nil { 1223 | return x.H 1224 | } 1225 | return 0 1226 | } 1227 | 1228 | func (x *Format) GetWratio() int32 { 1229 | if x != nil { 1230 | return x.Wratio 1231 | } 1232 | return 0 1233 | } 1234 | 1235 | func (x *Format) GetHratio() int32 { 1236 | if x != nil { 1237 | return x.Hratio 1238 | } 1239 | return 0 1240 | } 1241 | 1242 | func (x *Format) GetWmin() int32 { 1243 | if x != nil { 1244 | return x.Wmin 1245 | } 1246 | return 0 1247 | } 1248 | 1249 | type Pmp struct { 1250 | state protoimpl.MessageState `protogen:"open.v1"` 1251 | PrivateAuction int32 `protobuf:"varint,1,opt,name=private_auction,json=privateAuction,proto3" json:"private_auction,omitempty"` 1252 | Deals []*Deal `protobuf:"bytes,2,rep,name=deals,proto3" json:"deals,omitempty"` 1253 | unknownFields protoimpl.UnknownFields 1254 | sizeCache protoimpl.SizeCache 1255 | } 1256 | 1257 | func (x *Pmp) Reset() { 1258 | *x = Pmp{} 1259 | mi := &file_bidrequest_proto_msgTypes[10] 1260 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1261 | ms.StoreMessageInfo(mi) 1262 | } 1263 | 1264 | func (x *Pmp) String() string { 1265 | return protoimpl.X.MessageStringOf(x) 1266 | } 1267 | 1268 | func (*Pmp) ProtoMessage() {} 1269 | 1270 | func (x *Pmp) ProtoReflect() protoreflect.Message { 1271 | mi := &file_bidrequest_proto_msgTypes[10] 1272 | if x != nil { 1273 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1274 | if ms.LoadMessageInfo() == nil { 1275 | ms.StoreMessageInfo(mi) 1276 | } 1277 | return ms 1278 | } 1279 | return mi.MessageOf(x) 1280 | } 1281 | 1282 | // Deprecated: Use Pmp.ProtoReflect.Descriptor instead. 1283 | func (*Pmp) Descriptor() ([]byte, []int) { 1284 | return file_bidrequest_proto_rawDescGZIP(), []int{10} 1285 | } 1286 | 1287 | func (x *Pmp) GetPrivateAuction() int32 { 1288 | if x != nil { 1289 | return x.PrivateAuction 1290 | } 1291 | return 0 1292 | } 1293 | 1294 | func (x *Pmp) GetDeals() []*Deal { 1295 | if x != nil { 1296 | return x.Deals 1297 | } 1298 | return nil 1299 | } 1300 | 1301 | type Deal struct { 1302 | state protoimpl.MessageState `protogen:"open.v1"` 1303 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 1304 | Bidfloor float32 `protobuf:"fixed32,2,opt,name=bidfloor,proto3" json:"bidfloor,omitempty"` 1305 | Bidfloorcur string `protobuf:"bytes,3,opt,name=bidfloorcur,proto3" json:"bidfloorcur,omitempty"` 1306 | At int32 `protobuf:"varint,4,opt,name=at,proto3" json:"at,omitempty"` 1307 | Wseat []string `protobuf:"bytes,5,rep,name=wseat,proto3" json:"wseat,omitempty"` 1308 | Wadomain []string `protobuf:"bytes,6,rep,name=wadomain,proto3" json:"wadomain,omitempty"` 1309 | unknownFields protoimpl.UnknownFields 1310 | sizeCache protoimpl.SizeCache 1311 | } 1312 | 1313 | func (x *Deal) Reset() { 1314 | *x = Deal{} 1315 | mi := &file_bidrequest_proto_msgTypes[11] 1316 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1317 | ms.StoreMessageInfo(mi) 1318 | } 1319 | 1320 | func (x *Deal) String() string { 1321 | return protoimpl.X.MessageStringOf(x) 1322 | } 1323 | 1324 | func (*Deal) ProtoMessage() {} 1325 | 1326 | func (x *Deal) ProtoReflect() protoreflect.Message { 1327 | mi := &file_bidrequest_proto_msgTypes[11] 1328 | if x != nil { 1329 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1330 | if ms.LoadMessageInfo() == nil { 1331 | ms.StoreMessageInfo(mi) 1332 | } 1333 | return ms 1334 | } 1335 | return mi.MessageOf(x) 1336 | } 1337 | 1338 | // Deprecated: Use Deal.ProtoReflect.Descriptor instead. 1339 | func (*Deal) Descriptor() ([]byte, []int) { 1340 | return file_bidrequest_proto_rawDescGZIP(), []int{11} 1341 | } 1342 | 1343 | func (x *Deal) GetId() string { 1344 | if x != nil { 1345 | return x.Id 1346 | } 1347 | return "" 1348 | } 1349 | 1350 | func (x *Deal) GetBidfloor() float32 { 1351 | if x != nil { 1352 | return x.Bidfloor 1353 | } 1354 | return 0 1355 | } 1356 | 1357 | func (x *Deal) GetBidfloorcur() string { 1358 | if x != nil { 1359 | return x.Bidfloorcur 1360 | } 1361 | return "" 1362 | } 1363 | 1364 | func (x *Deal) GetAt() int32 { 1365 | if x != nil { 1366 | return x.At 1367 | } 1368 | return 0 1369 | } 1370 | 1371 | func (x *Deal) GetWseat() []string { 1372 | if x != nil { 1373 | return x.Wseat 1374 | } 1375 | return nil 1376 | } 1377 | 1378 | func (x *Deal) GetWadomain() []string { 1379 | if x != nil { 1380 | return x.Wadomain 1381 | } 1382 | return nil 1383 | } 1384 | 1385 | type Site struct { 1386 | state protoimpl.MessageState `protogen:"open.v1"` 1387 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 1388 | Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` 1389 | Domain string `protobuf:"bytes,3,opt,name=domain,proto3" json:"domain,omitempty"` 1390 | Cat []string `protobuf:"bytes,4,rep,name=cat,proto3" json:"cat,omitempty"` 1391 | Sectioncat []string `protobuf:"bytes,5,rep,name=sectioncat,proto3" json:"sectioncat,omitempty"` 1392 | Pagecat []string `protobuf:"bytes,6,rep,name=pagecat,proto3" json:"pagecat,omitempty"` 1393 | Page string `protobuf:"bytes,7,opt,name=page,proto3" json:"page,omitempty"` 1394 | Ref string `protobuf:"bytes,8,opt,name=ref,proto3" json:"ref,omitempty"` 1395 | Search string `protobuf:"bytes,9,opt,name=search,proto3" json:"search,omitempty"` 1396 | Mobile int32 `protobuf:"varint,10,opt,name=mobile,proto3" json:"mobile,omitempty"` 1397 | Privacypolicy int32 `protobuf:"varint,11,opt,name=privacypolicy,proto3" json:"privacypolicy,omitempty"` 1398 | Publisher *Publisher `protobuf:"bytes,12,opt,name=publisher,proto3" json:"publisher,omitempty"` 1399 | Content *Content `protobuf:"bytes,13,opt,name=content,proto3" json:"content,omitempty"` 1400 | Keywords string `protobuf:"bytes,14,opt,name=keywords,proto3" json:"keywords,omitempty"` 1401 | unknownFields protoimpl.UnknownFields 1402 | sizeCache protoimpl.SizeCache 1403 | } 1404 | 1405 | func (x *Site) Reset() { 1406 | *x = Site{} 1407 | mi := &file_bidrequest_proto_msgTypes[12] 1408 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1409 | ms.StoreMessageInfo(mi) 1410 | } 1411 | 1412 | func (x *Site) String() string { 1413 | return protoimpl.X.MessageStringOf(x) 1414 | } 1415 | 1416 | func (*Site) ProtoMessage() {} 1417 | 1418 | func (x *Site) ProtoReflect() protoreflect.Message { 1419 | mi := &file_bidrequest_proto_msgTypes[12] 1420 | if x != nil { 1421 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1422 | if ms.LoadMessageInfo() == nil { 1423 | ms.StoreMessageInfo(mi) 1424 | } 1425 | return ms 1426 | } 1427 | return mi.MessageOf(x) 1428 | } 1429 | 1430 | // Deprecated: Use Site.ProtoReflect.Descriptor instead. 1431 | func (*Site) Descriptor() ([]byte, []int) { 1432 | return file_bidrequest_proto_rawDescGZIP(), []int{12} 1433 | } 1434 | 1435 | func (x *Site) GetId() string { 1436 | if x != nil { 1437 | return x.Id 1438 | } 1439 | return "" 1440 | } 1441 | 1442 | func (x *Site) GetName() string { 1443 | if x != nil { 1444 | return x.Name 1445 | } 1446 | return "" 1447 | } 1448 | 1449 | func (x *Site) GetDomain() string { 1450 | if x != nil { 1451 | return x.Domain 1452 | } 1453 | return "" 1454 | } 1455 | 1456 | func (x *Site) GetCat() []string { 1457 | if x != nil { 1458 | return x.Cat 1459 | } 1460 | return nil 1461 | } 1462 | 1463 | func (x *Site) GetSectioncat() []string { 1464 | if x != nil { 1465 | return x.Sectioncat 1466 | } 1467 | return nil 1468 | } 1469 | 1470 | func (x *Site) GetPagecat() []string { 1471 | if x != nil { 1472 | return x.Pagecat 1473 | } 1474 | return nil 1475 | } 1476 | 1477 | func (x *Site) GetPage() string { 1478 | if x != nil { 1479 | return x.Page 1480 | } 1481 | return "" 1482 | } 1483 | 1484 | func (x *Site) GetRef() string { 1485 | if x != nil { 1486 | return x.Ref 1487 | } 1488 | return "" 1489 | } 1490 | 1491 | func (x *Site) GetSearch() string { 1492 | if x != nil { 1493 | return x.Search 1494 | } 1495 | return "" 1496 | } 1497 | 1498 | func (x *Site) GetMobile() int32 { 1499 | if x != nil { 1500 | return x.Mobile 1501 | } 1502 | return 0 1503 | } 1504 | 1505 | func (x *Site) GetPrivacypolicy() int32 { 1506 | if x != nil { 1507 | return x.Privacypolicy 1508 | } 1509 | return 0 1510 | } 1511 | 1512 | func (x *Site) GetPublisher() *Publisher { 1513 | if x != nil { 1514 | return x.Publisher 1515 | } 1516 | return nil 1517 | } 1518 | 1519 | func (x *Site) GetContent() *Content { 1520 | if x != nil { 1521 | return x.Content 1522 | } 1523 | return nil 1524 | } 1525 | 1526 | func (x *Site) GetKeywords() string { 1527 | if x != nil { 1528 | return x.Keywords 1529 | } 1530 | return "" 1531 | } 1532 | 1533 | type App struct { 1534 | state protoimpl.MessageState `protogen:"open.v1"` 1535 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 1536 | Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` 1537 | Bundle string `protobuf:"bytes,3,opt,name=bundle,proto3" json:"bundle,omitempty"` 1538 | Domain string `protobuf:"bytes,4,opt,name=domain,proto3" json:"domain,omitempty"` 1539 | Storeurl string `protobuf:"bytes,5,opt,name=storeurl,proto3" json:"storeurl,omitempty"` 1540 | Cat []string `protobuf:"bytes,6,rep,name=cat,proto3" json:"cat,omitempty"` 1541 | Sectioncat []string `protobuf:"bytes,7,rep,name=sectioncat,proto3" json:"sectioncat,omitempty"` 1542 | Pagecat []string `protobuf:"bytes,8,rep,name=pagecat,proto3" json:"pagecat,omitempty"` 1543 | Ver string `protobuf:"bytes,9,opt,name=ver,proto3" json:"ver,omitempty"` 1544 | Privacypolicy int32 `protobuf:"varint,10,opt,name=privacypolicy,proto3" json:"privacypolicy,omitempty"` 1545 | Paid int32 `protobuf:"varint,11,opt,name=paid,proto3" json:"paid,omitempty"` 1546 | Publisher *Publisher `protobuf:"bytes,12,opt,name=publisher,proto3" json:"publisher,omitempty"` 1547 | Content *Content `protobuf:"bytes,13,opt,name=content,proto3" json:"content,omitempty"` 1548 | Keywords string `protobuf:"bytes,14,opt,name=keywords,proto3" json:"keywords,omitempty"` 1549 | unknownFields protoimpl.UnknownFields 1550 | sizeCache protoimpl.SizeCache 1551 | } 1552 | 1553 | func (x *App) Reset() { 1554 | *x = App{} 1555 | mi := &file_bidrequest_proto_msgTypes[13] 1556 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1557 | ms.StoreMessageInfo(mi) 1558 | } 1559 | 1560 | func (x *App) String() string { 1561 | return protoimpl.X.MessageStringOf(x) 1562 | } 1563 | 1564 | func (*App) ProtoMessage() {} 1565 | 1566 | func (x *App) ProtoReflect() protoreflect.Message { 1567 | mi := &file_bidrequest_proto_msgTypes[13] 1568 | if x != nil { 1569 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1570 | if ms.LoadMessageInfo() == nil { 1571 | ms.StoreMessageInfo(mi) 1572 | } 1573 | return ms 1574 | } 1575 | return mi.MessageOf(x) 1576 | } 1577 | 1578 | // Deprecated: Use App.ProtoReflect.Descriptor instead. 1579 | func (*App) Descriptor() ([]byte, []int) { 1580 | return file_bidrequest_proto_rawDescGZIP(), []int{13} 1581 | } 1582 | 1583 | func (x *App) GetId() string { 1584 | if x != nil { 1585 | return x.Id 1586 | } 1587 | return "" 1588 | } 1589 | 1590 | func (x *App) GetName() string { 1591 | if x != nil { 1592 | return x.Name 1593 | } 1594 | return "" 1595 | } 1596 | 1597 | func (x *App) GetBundle() string { 1598 | if x != nil { 1599 | return x.Bundle 1600 | } 1601 | return "" 1602 | } 1603 | 1604 | func (x *App) GetDomain() string { 1605 | if x != nil { 1606 | return x.Domain 1607 | } 1608 | return "" 1609 | } 1610 | 1611 | func (x *App) GetStoreurl() string { 1612 | if x != nil { 1613 | return x.Storeurl 1614 | } 1615 | return "" 1616 | } 1617 | 1618 | func (x *App) GetCat() []string { 1619 | if x != nil { 1620 | return x.Cat 1621 | } 1622 | return nil 1623 | } 1624 | 1625 | func (x *App) GetSectioncat() []string { 1626 | if x != nil { 1627 | return x.Sectioncat 1628 | } 1629 | return nil 1630 | } 1631 | 1632 | func (x *App) GetPagecat() []string { 1633 | if x != nil { 1634 | return x.Pagecat 1635 | } 1636 | return nil 1637 | } 1638 | 1639 | func (x *App) GetVer() string { 1640 | if x != nil { 1641 | return x.Ver 1642 | } 1643 | return "" 1644 | } 1645 | 1646 | func (x *App) GetPrivacypolicy() int32 { 1647 | if x != nil { 1648 | return x.Privacypolicy 1649 | } 1650 | return 0 1651 | } 1652 | 1653 | func (x *App) GetPaid() int32 { 1654 | if x != nil { 1655 | return x.Paid 1656 | } 1657 | return 0 1658 | } 1659 | 1660 | func (x *App) GetPublisher() *Publisher { 1661 | if x != nil { 1662 | return x.Publisher 1663 | } 1664 | return nil 1665 | } 1666 | 1667 | func (x *App) GetContent() *Content { 1668 | if x != nil { 1669 | return x.Content 1670 | } 1671 | return nil 1672 | } 1673 | 1674 | func (x *App) GetKeywords() string { 1675 | if x != nil { 1676 | return x.Keywords 1677 | } 1678 | return "" 1679 | } 1680 | 1681 | type Publisher struct { 1682 | state protoimpl.MessageState `protogen:"open.v1"` 1683 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 1684 | Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` 1685 | Cat []string `protobuf:"bytes,3,rep,name=cat,proto3" json:"cat,omitempty"` 1686 | Domain string `protobuf:"bytes,4,opt,name=domain,proto3" json:"domain,omitempty"` 1687 | unknownFields protoimpl.UnknownFields 1688 | sizeCache protoimpl.SizeCache 1689 | } 1690 | 1691 | func (x *Publisher) Reset() { 1692 | *x = Publisher{} 1693 | mi := &file_bidrequest_proto_msgTypes[14] 1694 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1695 | ms.StoreMessageInfo(mi) 1696 | } 1697 | 1698 | func (x *Publisher) String() string { 1699 | return protoimpl.X.MessageStringOf(x) 1700 | } 1701 | 1702 | func (*Publisher) ProtoMessage() {} 1703 | 1704 | func (x *Publisher) ProtoReflect() protoreflect.Message { 1705 | mi := &file_bidrequest_proto_msgTypes[14] 1706 | if x != nil { 1707 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1708 | if ms.LoadMessageInfo() == nil { 1709 | ms.StoreMessageInfo(mi) 1710 | } 1711 | return ms 1712 | } 1713 | return mi.MessageOf(x) 1714 | } 1715 | 1716 | // Deprecated: Use Publisher.ProtoReflect.Descriptor instead. 1717 | func (*Publisher) Descriptor() ([]byte, []int) { 1718 | return file_bidrequest_proto_rawDescGZIP(), []int{14} 1719 | } 1720 | 1721 | func (x *Publisher) GetId() string { 1722 | if x != nil { 1723 | return x.Id 1724 | } 1725 | return "" 1726 | } 1727 | 1728 | func (x *Publisher) GetName() string { 1729 | if x != nil { 1730 | return x.Name 1731 | } 1732 | return "" 1733 | } 1734 | 1735 | func (x *Publisher) GetCat() []string { 1736 | if x != nil { 1737 | return x.Cat 1738 | } 1739 | return nil 1740 | } 1741 | 1742 | func (x *Publisher) GetDomain() string { 1743 | if x != nil { 1744 | return x.Domain 1745 | } 1746 | return "" 1747 | } 1748 | 1749 | type Content struct { 1750 | state protoimpl.MessageState `protogen:"open.v1"` 1751 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 1752 | Episode int32 `protobuf:"varint,2,opt,name=episode,proto3" json:"episode,omitempty"` 1753 | Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` 1754 | Series string `protobuf:"bytes,4,opt,name=series,proto3" json:"series,omitempty"` 1755 | Season string `protobuf:"bytes,5,opt,name=season,proto3" json:"season,omitempty"` 1756 | Artist string `protobuf:"bytes,6,opt,name=artist,proto3" json:"artist,omitempty"` 1757 | Genre string `protobuf:"bytes,7,opt,name=genre,proto3" json:"genre,omitempty"` 1758 | Album string `protobuf:"bytes,8,opt,name=album,proto3" json:"album,omitempty"` 1759 | Isrc string `protobuf:"bytes,9,opt,name=isrc,proto3" json:"isrc,omitempty"` 1760 | Producer *Producer `protobuf:"bytes,10,opt,name=producer,proto3" json:"producer,omitempty"` 1761 | Url string `protobuf:"bytes,11,opt,name=url,proto3" json:"url,omitempty"` 1762 | Cat []string `protobuf:"bytes,12,rep,name=cat,proto3" json:"cat,omitempty"` 1763 | Prodq int32 `protobuf:"varint,13,opt,name=prodq,proto3" json:"prodq,omitempty"` 1764 | Context int32 `protobuf:"varint,14,opt,name=context,proto3" json:"context,omitempty"` 1765 | Contentrating string `protobuf:"bytes,15,opt,name=contentrating,proto3" json:"contentrating,omitempty"` 1766 | Userrating string `protobuf:"bytes,16,opt,name=userrating,proto3" json:"userrating,omitempty"` 1767 | Qagmediarating int32 `protobuf:"varint,17,opt,name=qagmediarating,proto3" json:"qagmediarating,omitempty"` 1768 | Keywords string `protobuf:"bytes,18,opt,name=keywords,proto3" json:"keywords,omitempty"` 1769 | Livestream int32 `protobuf:"varint,19,opt,name=livestream,proto3" json:"livestream,omitempty"` 1770 | Sourcerelationship int32 `protobuf:"varint,20,opt,name=sourcerelationship,proto3" json:"sourcerelationship,omitempty"` 1771 | Len int32 `protobuf:"varint,21,opt,name=len,proto3" json:"len,omitempty"` 1772 | Language string `protobuf:"bytes,22,opt,name=language,proto3" json:"language,omitempty"` 1773 | Embeddable int32 `protobuf:"varint,23,opt,name=embeddable,proto3" json:"embeddable,omitempty"` 1774 | Data []*Data `protobuf:"bytes,24,rep,name=data,proto3" json:"data,omitempty"` 1775 | unknownFields protoimpl.UnknownFields 1776 | sizeCache protoimpl.SizeCache 1777 | } 1778 | 1779 | func (x *Content) Reset() { 1780 | *x = Content{} 1781 | mi := &file_bidrequest_proto_msgTypes[15] 1782 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1783 | ms.StoreMessageInfo(mi) 1784 | } 1785 | 1786 | func (x *Content) String() string { 1787 | return protoimpl.X.MessageStringOf(x) 1788 | } 1789 | 1790 | func (*Content) ProtoMessage() {} 1791 | 1792 | func (x *Content) ProtoReflect() protoreflect.Message { 1793 | mi := &file_bidrequest_proto_msgTypes[15] 1794 | if x != nil { 1795 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1796 | if ms.LoadMessageInfo() == nil { 1797 | ms.StoreMessageInfo(mi) 1798 | } 1799 | return ms 1800 | } 1801 | return mi.MessageOf(x) 1802 | } 1803 | 1804 | // Deprecated: Use Content.ProtoReflect.Descriptor instead. 1805 | func (*Content) Descriptor() ([]byte, []int) { 1806 | return file_bidrequest_proto_rawDescGZIP(), []int{15} 1807 | } 1808 | 1809 | func (x *Content) GetId() string { 1810 | if x != nil { 1811 | return x.Id 1812 | } 1813 | return "" 1814 | } 1815 | 1816 | func (x *Content) GetEpisode() int32 { 1817 | if x != nil { 1818 | return x.Episode 1819 | } 1820 | return 0 1821 | } 1822 | 1823 | func (x *Content) GetTitle() string { 1824 | if x != nil { 1825 | return x.Title 1826 | } 1827 | return "" 1828 | } 1829 | 1830 | func (x *Content) GetSeries() string { 1831 | if x != nil { 1832 | return x.Series 1833 | } 1834 | return "" 1835 | } 1836 | 1837 | func (x *Content) GetSeason() string { 1838 | if x != nil { 1839 | return x.Season 1840 | } 1841 | return "" 1842 | } 1843 | 1844 | func (x *Content) GetArtist() string { 1845 | if x != nil { 1846 | return x.Artist 1847 | } 1848 | return "" 1849 | } 1850 | 1851 | func (x *Content) GetGenre() string { 1852 | if x != nil { 1853 | return x.Genre 1854 | } 1855 | return "" 1856 | } 1857 | 1858 | func (x *Content) GetAlbum() string { 1859 | if x != nil { 1860 | return x.Album 1861 | } 1862 | return "" 1863 | } 1864 | 1865 | func (x *Content) GetIsrc() string { 1866 | if x != nil { 1867 | return x.Isrc 1868 | } 1869 | return "" 1870 | } 1871 | 1872 | func (x *Content) GetProducer() *Producer { 1873 | if x != nil { 1874 | return x.Producer 1875 | } 1876 | return nil 1877 | } 1878 | 1879 | func (x *Content) GetUrl() string { 1880 | if x != nil { 1881 | return x.Url 1882 | } 1883 | return "" 1884 | } 1885 | 1886 | func (x *Content) GetCat() []string { 1887 | if x != nil { 1888 | return x.Cat 1889 | } 1890 | return nil 1891 | } 1892 | 1893 | func (x *Content) GetProdq() int32 { 1894 | if x != nil { 1895 | return x.Prodq 1896 | } 1897 | return 0 1898 | } 1899 | 1900 | func (x *Content) GetContext() int32 { 1901 | if x != nil { 1902 | return x.Context 1903 | } 1904 | return 0 1905 | } 1906 | 1907 | func (x *Content) GetContentrating() string { 1908 | if x != nil { 1909 | return x.Contentrating 1910 | } 1911 | return "" 1912 | } 1913 | 1914 | func (x *Content) GetUserrating() string { 1915 | if x != nil { 1916 | return x.Userrating 1917 | } 1918 | return "" 1919 | } 1920 | 1921 | func (x *Content) GetQagmediarating() int32 { 1922 | if x != nil { 1923 | return x.Qagmediarating 1924 | } 1925 | return 0 1926 | } 1927 | 1928 | func (x *Content) GetKeywords() string { 1929 | if x != nil { 1930 | return x.Keywords 1931 | } 1932 | return "" 1933 | } 1934 | 1935 | func (x *Content) GetLivestream() int32 { 1936 | if x != nil { 1937 | return x.Livestream 1938 | } 1939 | return 0 1940 | } 1941 | 1942 | func (x *Content) GetSourcerelationship() int32 { 1943 | if x != nil { 1944 | return x.Sourcerelationship 1945 | } 1946 | return 0 1947 | } 1948 | 1949 | func (x *Content) GetLen() int32 { 1950 | if x != nil { 1951 | return x.Len 1952 | } 1953 | return 0 1954 | } 1955 | 1956 | func (x *Content) GetLanguage() string { 1957 | if x != nil { 1958 | return x.Language 1959 | } 1960 | return "" 1961 | } 1962 | 1963 | func (x *Content) GetEmbeddable() int32 { 1964 | if x != nil { 1965 | return x.Embeddable 1966 | } 1967 | return 0 1968 | } 1969 | 1970 | func (x *Content) GetData() []*Data { 1971 | if x != nil { 1972 | return x.Data 1973 | } 1974 | return nil 1975 | } 1976 | 1977 | type Producer struct { 1978 | state protoimpl.MessageState `protogen:"open.v1"` 1979 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 1980 | Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` 1981 | Cat []string `protobuf:"bytes,3,rep,name=cat,proto3" json:"cat,omitempty"` 1982 | Domain string `protobuf:"bytes,4,opt,name=domain,proto3" json:"domain,omitempty"` 1983 | unknownFields protoimpl.UnknownFields 1984 | sizeCache protoimpl.SizeCache 1985 | } 1986 | 1987 | func (x *Producer) Reset() { 1988 | *x = Producer{} 1989 | mi := &file_bidrequest_proto_msgTypes[16] 1990 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1991 | ms.StoreMessageInfo(mi) 1992 | } 1993 | 1994 | func (x *Producer) String() string { 1995 | return protoimpl.X.MessageStringOf(x) 1996 | } 1997 | 1998 | func (*Producer) ProtoMessage() {} 1999 | 2000 | func (x *Producer) ProtoReflect() protoreflect.Message { 2001 | mi := &file_bidrequest_proto_msgTypes[16] 2002 | if x != nil { 2003 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2004 | if ms.LoadMessageInfo() == nil { 2005 | ms.StoreMessageInfo(mi) 2006 | } 2007 | return ms 2008 | } 2009 | return mi.MessageOf(x) 2010 | } 2011 | 2012 | // Deprecated: Use Producer.ProtoReflect.Descriptor instead. 2013 | func (*Producer) Descriptor() ([]byte, []int) { 2014 | return file_bidrequest_proto_rawDescGZIP(), []int{16} 2015 | } 2016 | 2017 | func (x *Producer) GetId() string { 2018 | if x != nil { 2019 | return x.Id 2020 | } 2021 | return "" 2022 | } 2023 | 2024 | func (x *Producer) GetName() string { 2025 | if x != nil { 2026 | return x.Name 2027 | } 2028 | return "" 2029 | } 2030 | 2031 | func (x *Producer) GetCat() []string { 2032 | if x != nil { 2033 | return x.Cat 2034 | } 2035 | return nil 2036 | } 2037 | 2038 | func (x *Producer) GetDomain() string { 2039 | if x != nil { 2040 | return x.Domain 2041 | } 2042 | return "" 2043 | } 2044 | 2045 | type Device struct { 2046 | state protoimpl.MessageState `protogen:"open.v1"` 2047 | Ua string `protobuf:"bytes,1,opt,name=ua,proto3" json:"ua,omitempty"` 2048 | Geo *Geo `protobuf:"bytes,2,opt,name=geo,proto3" json:"geo,omitempty"` 2049 | Dnt int32 `protobuf:"varint,3,opt,name=dnt,proto3" json:"dnt,omitempty"` 2050 | Lmt int32 `protobuf:"varint,4,opt,name=lmt,proto3" json:"lmt,omitempty"` 2051 | Ip string `protobuf:"bytes,5,opt,name=ip,proto3" json:"ip,omitempty"` 2052 | Ipv6 string `protobuf:"bytes,6,opt,name=ipv6,proto3" json:"ipv6,omitempty"` 2053 | Devicetype int32 `protobuf:"varint,7,opt,name=devicetype,proto3" json:"devicetype,omitempty"` 2054 | Make string `protobuf:"bytes,8,opt,name=make,proto3" json:"make,omitempty"` 2055 | Model string `protobuf:"bytes,9,opt,name=model,proto3" json:"model,omitempty"` 2056 | Os string `protobuf:"bytes,10,opt,name=os,proto3" json:"os,omitempty"` 2057 | Osv string `protobuf:"bytes,11,opt,name=osv,proto3" json:"osv,omitempty"` 2058 | Hwv string `protobuf:"bytes,12,opt,name=hwv,proto3" json:"hwv,omitempty"` 2059 | H int32 `protobuf:"varint,13,opt,name=h,proto3" json:"h,omitempty"` 2060 | W int32 `protobuf:"varint,14,opt,name=w,proto3" json:"w,omitempty"` 2061 | Ppi int32 `protobuf:"varint,15,opt,name=ppi,proto3" json:"ppi,omitempty"` 2062 | Pxratio float32 `protobuf:"fixed32,16,opt,name=pxratio,proto3" json:"pxratio,omitempty"` 2063 | Js int32 `protobuf:"varint,17,opt,name=js,proto3" json:"js,omitempty"` 2064 | Geofetch int32 `protobuf:"varint,18,opt,name=geofetch,proto3" json:"geofetch,omitempty"` 2065 | Flashver string `protobuf:"bytes,19,opt,name=flashver,proto3" json:"flashver,omitempty"` 2066 | Language string `protobuf:"bytes,20,opt,name=language,proto3" json:"language,omitempty"` 2067 | Carrier string `protobuf:"bytes,21,opt,name=carrier,proto3" json:"carrier,omitempty"` 2068 | Mccmnc string `protobuf:"bytes,22,opt,name=mccmnc,proto3" json:"mccmnc,omitempty"` 2069 | Connectiontype int32 `protobuf:"varint,23,opt,name=connectiontype,proto3" json:"connectiontype,omitempty"` 2070 | Ifa string `protobuf:"bytes,24,opt,name=ifa,proto3" json:"ifa,omitempty"` 2071 | Didsha1 string `protobuf:"bytes,25,opt,name=didsha1,proto3" json:"didsha1,omitempty"` 2072 | Didmd5 string `protobuf:"bytes,26,opt,name=didmd5,proto3" json:"didmd5,omitempty"` 2073 | Dpidsha1 string `protobuf:"bytes,27,opt,name=dpidsha1,proto3" json:"dpidsha1,omitempty"` 2074 | Dpidmd5 string `protobuf:"bytes,28,opt,name=dpidmd5,proto3" json:"dpidmd5,omitempty"` 2075 | Macsha1 string `protobuf:"bytes,29,opt,name=macsha1,proto3" json:"macsha1,omitempty"` 2076 | Macmd5 string `protobuf:"bytes,30,opt,name=macmd5,proto3" json:"macmd5,omitempty"` 2077 | unknownFields protoimpl.UnknownFields 2078 | sizeCache protoimpl.SizeCache 2079 | } 2080 | 2081 | func (x *Device) Reset() { 2082 | *x = Device{} 2083 | mi := &file_bidrequest_proto_msgTypes[17] 2084 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2085 | ms.StoreMessageInfo(mi) 2086 | } 2087 | 2088 | func (x *Device) String() string { 2089 | return protoimpl.X.MessageStringOf(x) 2090 | } 2091 | 2092 | func (*Device) ProtoMessage() {} 2093 | 2094 | func (x *Device) ProtoReflect() protoreflect.Message { 2095 | mi := &file_bidrequest_proto_msgTypes[17] 2096 | if x != nil { 2097 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2098 | if ms.LoadMessageInfo() == nil { 2099 | ms.StoreMessageInfo(mi) 2100 | } 2101 | return ms 2102 | } 2103 | return mi.MessageOf(x) 2104 | } 2105 | 2106 | // Deprecated: Use Device.ProtoReflect.Descriptor instead. 2107 | func (*Device) Descriptor() ([]byte, []int) { 2108 | return file_bidrequest_proto_rawDescGZIP(), []int{17} 2109 | } 2110 | 2111 | func (x *Device) GetUa() string { 2112 | if x != nil { 2113 | return x.Ua 2114 | } 2115 | return "" 2116 | } 2117 | 2118 | func (x *Device) GetGeo() *Geo { 2119 | if x != nil { 2120 | return x.Geo 2121 | } 2122 | return nil 2123 | } 2124 | 2125 | func (x *Device) GetDnt() int32 { 2126 | if x != nil { 2127 | return x.Dnt 2128 | } 2129 | return 0 2130 | } 2131 | 2132 | func (x *Device) GetLmt() int32 { 2133 | if x != nil { 2134 | return x.Lmt 2135 | } 2136 | return 0 2137 | } 2138 | 2139 | func (x *Device) GetIp() string { 2140 | if x != nil { 2141 | return x.Ip 2142 | } 2143 | return "" 2144 | } 2145 | 2146 | func (x *Device) GetIpv6() string { 2147 | if x != nil { 2148 | return x.Ipv6 2149 | } 2150 | return "" 2151 | } 2152 | 2153 | func (x *Device) GetDevicetype() int32 { 2154 | if x != nil { 2155 | return x.Devicetype 2156 | } 2157 | return 0 2158 | } 2159 | 2160 | func (x *Device) GetMake() string { 2161 | if x != nil { 2162 | return x.Make 2163 | } 2164 | return "" 2165 | } 2166 | 2167 | func (x *Device) GetModel() string { 2168 | if x != nil { 2169 | return x.Model 2170 | } 2171 | return "" 2172 | } 2173 | 2174 | func (x *Device) GetOs() string { 2175 | if x != nil { 2176 | return x.Os 2177 | } 2178 | return "" 2179 | } 2180 | 2181 | func (x *Device) GetOsv() string { 2182 | if x != nil { 2183 | return x.Osv 2184 | } 2185 | return "" 2186 | } 2187 | 2188 | func (x *Device) GetHwv() string { 2189 | if x != nil { 2190 | return x.Hwv 2191 | } 2192 | return "" 2193 | } 2194 | 2195 | func (x *Device) GetH() int32 { 2196 | if x != nil { 2197 | return x.H 2198 | } 2199 | return 0 2200 | } 2201 | 2202 | func (x *Device) GetW() int32 { 2203 | if x != nil { 2204 | return x.W 2205 | } 2206 | return 0 2207 | } 2208 | 2209 | func (x *Device) GetPpi() int32 { 2210 | if x != nil { 2211 | return x.Ppi 2212 | } 2213 | return 0 2214 | } 2215 | 2216 | func (x *Device) GetPxratio() float32 { 2217 | if x != nil { 2218 | return x.Pxratio 2219 | } 2220 | return 0 2221 | } 2222 | 2223 | func (x *Device) GetJs() int32 { 2224 | if x != nil { 2225 | return x.Js 2226 | } 2227 | return 0 2228 | } 2229 | 2230 | func (x *Device) GetGeofetch() int32 { 2231 | if x != nil { 2232 | return x.Geofetch 2233 | } 2234 | return 0 2235 | } 2236 | 2237 | func (x *Device) GetFlashver() string { 2238 | if x != nil { 2239 | return x.Flashver 2240 | } 2241 | return "" 2242 | } 2243 | 2244 | func (x *Device) GetLanguage() string { 2245 | if x != nil { 2246 | return x.Language 2247 | } 2248 | return "" 2249 | } 2250 | 2251 | func (x *Device) GetCarrier() string { 2252 | if x != nil { 2253 | return x.Carrier 2254 | } 2255 | return "" 2256 | } 2257 | 2258 | func (x *Device) GetMccmnc() string { 2259 | if x != nil { 2260 | return x.Mccmnc 2261 | } 2262 | return "" 2263 | } 2264 | 2265 | func (x *Device) GetConnectiontype() int32 { 2266 | if x != nil { 2267 | return x.Connectiontype 2268 | } 2269 | return 0 2270 | } 2271 | 2272 | func (x *Device) GetIfa() string { 2273 | if x != nil { 2274 | return x.Ifa 2275 | } 2276 | return "" 2277 | } 2278 | 2279 | func (x *Device) GetDidsha1() string { 2280 | if x != nil { 2281 | return x.Didsha1 2282 | } 2283 | return "" 2284 | } 2285 | 2286 | func (x *Device) GetDidmd5() string { 2287 | if x != nil { 2288 | return x.Didmd5 2289 | } 2290 | return "" 2291 | } 2292 | 2293 | func (x *Device) GetDpidsha1() string { 2294 | if x != nil { 2295 | return x.Dpidsha1 2296 | } 2297 | return "" 2298 | } 2299 | 2300 | func (x *Device) GetDpidmd5() string { 2301 | if x != nil { 2302 | return x.Dpidmd5 2303 | } 2304 | return "" 2305 | } 2306 | 2307 | func (x *Device) GetMacsha1() string { 2308 | if x != nil { 2309 | return x.Macsha1 2310 | } 2311 | return "" 2312 | } 2313 | 2314 | func (x *Device) GetMacmd5() string { 2315 | if x != nil { 2316 | return x.Macmd5 2317 | } 2318 | return "" 2319 | } 2320 | 2321 | type Geo struct { 2322 | state protoimpl.MessageState `protogen:"open.v1"` 2323 | Lat float32 `protobuf:"fixed32,1,opt,name=lat,proto3" json:"lat,omitempty"` 2324 | Lon float32 `protobuf:"fixed32,2,opt,name=lon,proto3" json:"lon,omitempty"` 2325 | Type int32 `protobuf:"varint,3,opt,name=type,proto3" json:"type,omitempty"` 2326 | Accuracy int32 `protobuf:"varint,4,opt,name=accuracy,proto3" json:"accuracy,omitempty"` 2327 | Lastfix int32 `protobuf:"varint,5,opt,name=lastfix,proto3" json:"lastfix,omitempty"` 2328 | Ipservice int32 `protobuf:"varint,6,opt,name=ipservice,proto3" json:"ipservice,omitempty"` 2329 | Country string `protobuf:"bytes,7,opt,name=country,proto3" json:"country,omitempty"` 2330 | Region string `protobuf:"bytes,8,opt,name=region,proto3" json:"region,omitempty"` 2331 | Regionfips104 string `protobuf:"bytes,9,opt,name=regionfips104,proto3" json:"regionfips104,omitempty"` 2332 | Metro string `protobuf:"bytes,10,opt,name=metro,proto3" json:"metro,omitempty"` 2333 | City string `protobuf:"bytes,11,opt,name=city,proto3" json:"city,omitempty"` 2334 | Zip string `protobuf:"bytes,12,opt,name=zip,proto3" json:"zip,omitempty"` 2335 | Utcoffset int32 `protobuf:"varint,13,opt,name=utcoffset,proto3" json:"utcoffset,omitempty"` 2336 | unknownFields protoimpl.UnknownFields 2337 | sizeCache protoimpl.SizeCache 2338 | } 2339 | 2340 | func (x *Geo) Reset() { 2341 | *x = Geo{} 2342 | mi := &file_bidrequest_proto_msgTypes[18] 2343 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2344 | ms.StoreMessageInfo(mi) 2345 | } 2346 | 2347 | func (x *Geo) String() string { 2348 | return protoimpl.X.MessageStringOf(x) 2349 | } 2350 | 2351 | func (*Geo) ProtoMessage() {} 2352 | 2353 | func (x *Geo) ProtoReflect() protoreflect.Message { 2354 | mi := &file_bidrequest_proto_msgTypes[18] 2355 | if x != nil { 2356 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2357 | if ms.LoadMessageInfo() == nil { 2358 | ms.StoreMessageInfo(mi) 2359 | } 2360 | return ms 2361 | } 2362 | return mi.MessageOf(x) 2363 | } 2364 | 2365 | // Deprecated: Use Geo.ProtoReflect.Descriptor instead. 2366 | func (*Geo) Descriptor() ([]byte, []int) { 2367 | return file_bidrequest_proto_rawDescGZIP(), []int{18} 2368 | } 2369 | 2370 | func (x *Geo) GetLat() float32 { 2371 | if x != nil { 2372 | return x.Lat 2373 | } 2374 | return 0 2375 | } 2376 | 2377 | func (x *Geo) GetLon() float32 { 2378 | if x != nil { 2379 | return x.Lon 2380 | } 2381 | return 0 2382 | } 2383 | 2384 | func (x *Geo) GetType() int32 { 2385 | if x != nil { 2386 | return x.Type 2387 | } 2388 | return 0 2389 | } 2390 | 2391 | func (x *Geo) GetAccuracy() int32 { 2392 | if x != nil { 2393 | return x.Accuracy 2394 | } 2395 | return 0 2396 | } 2397 | 2398 | func (x *Geo) GetLastfix() int32 { 2399 | if x != nil { 2400 | return x.Lastfix 2401 | } 2402 | return 0 2403 | } 2404 | 2405 | func (x *Geo) GetIpservice() int32 { 2406 | if x != nil { 2407 | return x.Ipservice 2408 | } 2409 | return 0 2410 | } 2411 | 2412 | func (x *Geo) GetCountry() string { 2413 | if x != nil { 2414 | return x.Country 2415 | } 2416 | return "" 2417 | } 2418 | 2419 | func (x *Geo) GetRegion() string { 2420 | if x != nil { 2421 | return x.Region 2422 | } 2423 | return "" 2424 | } 2425 | 2426 | func (x *Geo) GetRegionfips104() string { 2427 | if x != nil { 2428 | return x.Regionfips104 2429 | } 2430 | return "" 2431 | } 2432 | 2433 | func (x *Geo) GetMetro() string { 2434 | if x != nil { 2435 | return x.Metro 2436 | } 2437 | return "" 2438 | } 2439 | 2440 | func (x *Geo) GetCity() string { 2441 | if x != nil { 2442 | return x.City 2443 | } 2444 | return "" 2445 | } 2446 | 2447 | func (x *Geo) GetZip() string { 2448 | if x != nil { 2449 | return x.Zip 2450 | } 2451 | return "" 2452 | } 2453 | 2454 | func (x *Geo) GetUtcoffset() int32 { 2455 | if x != nil { 2456 | return x.Utcoffset 2457 | } 2458 | return 0 2459 | } 2460 | 2461 | type User struct { 2462 | state protoimpl.MessageState `protogen:"open.v1"` 2463 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 2464 | Buyeruid string `protobuf:"bytes,2,opt,name=buyeruid,proto3" json:"buyeruid,omitempty"` 2465 | Yob int32 `protobuf:"varint,3,opt,name=yob,proto3" json:"yob,omitempty"` 2466 | Gender string `protobuf:"bytes,4,opt,name=gender,proto3" json:"gender,omitempty"` 2467 | Keywords string `protobuf:"bytes,5,opt,name=keywords,proto3" json:"keywords,omitempty"` 2468 | Customdata string `protobuf:"bytes,6,opt,name=customdata,proto3" json:"customdata,omitempty"` 2469 | Geo *Geo `protobuf:"bytes,7,opt,name=geo,proto3" json:"geo,omitempty"` 2470 | Data []*Data `protobuf:"bytes,8,rep,name=data,proto3" json:"data,omitempty"` 2471 | unknownFields protoimpl.UnknownFields 2472 | sizeCache protoimpl.SizeCache 2473 | } 2474 | 2475 | func (x *User) Reset() { 2476 | *x = User{} 2477 | mi := &file_bidrequest_proto_msgTypes[19] 2478 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2479 | ms.StoreMessageInfo(mi) 2480 | } 2481 | 2482 | func (x *User) String() string { 2483 | return protoimpl.X.MessageStringOf(x) 2484 | } 2485 | 2486 | func (*User) ProtoMessage() {} 2487 | 2488 | func (x *User) ProtoReflect() protoreflect.Message { 2489 | mi := &file_bidrequest_proto_msgTypes[19] 2490 | if x != nil { 2491 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2492 | if ms.LoadMessageInfo() == nil { 2493 | ms.StoreMessageInfo(mi) 2494 | } 2495 | return ms 2496 | } 2497 | return mi.MessageOf(x) 2498 | } 2499 | 2500 | // Deprecated: Use User.ProtoReflect.Descriptor instead. 2501 | func (*User) Descriptor() ([]byte, []int) { 2502 | return file_bidrequest_proto_rawDescGZIP(), []int{19} 2503 | } 2504 | 2505 | func (x *User) GetId() string { 2506 | if x != nil { 2507 | return x.Id 2508 | } 2509 | return "" 2510 | } 2511 | 2512 | func (x *User) GetBuyeruid() string { 2513 | if x != nil { 2514 | return x.Buyeruid 2515 | } 2516 | return "" 2517 | } 2518 | 2519 | func (x *User) GetYob() int32 { 2520 | if x != nil { 2521 | return x.Yob 2522 | } 2523 | return 0 2524 | } 2525 | 2526 | func (x *User) GetGender() string { 2527 | if x != nil { 2528 | return x.Gender 2529 | } 2530 | return "" 2531 | } 2532 | 2533 | func (x *User) GetKeywords() string { 2534 | if x != nil { 2535 | return x.Keywords 2536 | } 2537 | return "" 2538 | } 2539 | 2540 | func (x *User) GetCustomdata() string { 2541 | if x != nil { 2542 | return x.Customdata 2543 | } 2544 | return "" 2545 | } 2546 | 2547 | func (x *User) GetGeo() *Geo { 2548 | if x != nil { 2549 | return x.Geo 2550 | } 2551 | return nil 2552 | } 2553 | 2554 | func (x *User) GetData() []*Data { 2555 | if x != nil { 2556 | return x.Data 2557 | } 2558 | return nil 2559 | } 2560 | 2561 | type Data struct { 2562 | state protoimpl.MessageState `protogen:"open.v1"` 2563 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 2564 | Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` 2565 | Segment []*Segment `protobuf:"bytes,3,rep,name=segment,proto3" json:"segment,omitempty"` 2566 | unknownFields protoimpl.UnknownFields 2567 | sizeCache protoimpl.SizeCache 2568 | } 2569 | 2570 | func (x *Data) Reset() { 2571 | *x = Data{} 2572 | mi := &file_bidrequest_proto_msgTypes[20] 2573 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2574 | ms.StoreMessageInfo(mi) 2575 | } 2576 | 2577 | func (x *Data) String() string { 2578 | return protoimpl.X.MessageStringOf(x) 2579 | } 2580 | 2581 | func (*Data) ProtoMessage() {} 2582 | 2583 | func (x *Data) ProtoReflect() protoreflect.Message { 2584 | mi := &file_bidrequest_proto_msgTypes[20] 2585 | if x != nil { 2586 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2587 | if ms.LoadMessageInfo() == nil { 2588 | ms.StoreMessageInfo(mi) 2589 | } 2590 | return ms 2591 | } 2592 | return mi.MessageOf(x) 2593 | } 2594 | 2595 | // Deprecated: Use Data.ProtoReflect.Descriptor instead. 2596 | func (*Data) Descriptor() ([]byte, []int) { 2597 | return file_bidrequest_proto_rawDescGZIP(), []int{20} 2598 | } 2599 | 2600 | func (x *Data) GetId() string { 2601 | if x != nil { 2602 | return x.Id 2603 | } 2604 | return "" 2605 | } 2606 | 2607 | func (x *Data) GetName() string { 2608 | if x != nil { 2609 | return x.Name 2610 | } 2611 | return "" 2612 | } 2613 | 2614 | func (x *Data) GetSegment() []*Segment { 2615 | if x != nil { 2616 | return x.Segment 2617 | } 2618 | return nil 2619 | } 2620 | 2621 | type Segment struct { 2622 | state protoimpl.MessageState `protogen:"open.v1"` 2623 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` 2624 | Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` 2625 | Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` 2626 | unknownFields protoimpl.UnknownFields 2627 | sizeCache protoimpl.SizeCache 2628 | } 2629 | 2630 | func (x *Segment) Reset() { 2631 | *x = Segment{} 2632 | mi := &file_bidrequest_proto_msgTypes[21] 2633 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2634 | ms.StoreMessageInfo(mi) 2635 | } 2636 | 2637 | func (x *Segment) String() string { 2638 | return protoimpl.X.MessageStringOf(x) 2639 | } 2640 | 2641 | func (*Segment) ProtoMessage() {} 2642 | 2643 | func (x *Segment) ProtoReflect() protoreflect.Message { 2644 | mi := &file_bidrequest_proto_msgTypes[21] 2645 | if x != nil { 2646 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2647 | if ms.LoadMessageInfo() == nil { 2648 | ms.StoreMessageInfo(mi) 2649 | } 2650 | return ms 2651 | } 2652 | return mi.MessageOf(x) 2653 | } 2654 | 2655 | // Deprecated: Use Segment.ProtoReflect.Descriptor instead. 2656 | func (*Segment) Descriptor() ([]byte, []int) { 2657 | return file_bidrequest_proto_rawDescGZIP(), []int{21} 2658 | } 2659 | 2660 | func (x *Segment) GetId() string { 2661 | if x != nil { 2662 | return x.Id 2663 | } 2664 | return "" 2665 | } 2666 | 2667 | func (x *Segment) GetName() string { 2668 | if x != nil { 2669 | return x.Name 2670 | } 2671 | return "" 2672 | } 2673 | 2674 | func (x *Segment) GetValue() string { 2675 | if x != nil { 2676 | return x.Value 2677 | } 2678 | return "" 2679 | } 2680 | 2681 | var File_bidrequest_proto protoreflect.FileDescriptor 2682 | 2683 | var file_bidrequest_proto_rawDesc = string([]byte{ 2684 | 0x0a, 0x10, 0x62, 0x69, 0x64, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 2685 | 0x74, 0x6f, 0x12, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 2686 | 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 2687 | 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 2688 | 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x87, 0x05, 0x0a, 0x0a, 0x42, 0x69, 0x64, 2689 | 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 2690 | 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x03, 0x69, 0x6d, 0x70, 0x18, 0x02, 2691 | 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 2692 | 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x49, 0x6d, 0x70, 0x52, 0x03, 2693 | 0x69, 0x6d, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x73, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 2694 | 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 2695 | 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x74, 0x65, 0x52, 0x04, 0x73, 0x69, 2696 | 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 2697 | 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 2698 | 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x03, 0x61, 0x70, 0x70, 0x12, 0x33, 2699 | 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 2700 | 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 2701 | 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76, 2702 | 0x69, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 2703 | 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 2704 | 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 2705 | 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 2706 | 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 2707 | 0x28, 0x05, 0x52, 0x02, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x6d, 0x61, 0x78, 0x18, 0x09, 2708 | 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x6d, 0x61, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x73, 2709 | 0x65, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x77, 0x73, 0x65, 0x61, 0x74, 2710 | 0x12, 0x14, 0x0a, 0x05, 0x62, 0x73, 0x65, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 2711 | 0x05, 0x62, 0x73, 0x65, 0x61, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x70, 2712 | 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x70, 0x73, 2713 | 0x12, 0x10, 0x0a, 0x03, 0x63, 0x75, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x63, 2714 | 0x75, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x6c, 0x61, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x03, 0x28, 2715 | 0x09, 0x52, 0x05, 0x77, 0x6c, 0x61, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x63, 0x61, 0x74, 2716 | 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x62, 0x63, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 2717 | 0x62, 0x61, 0x64, 0x76, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x62, 0x61, 0x64, 0x76, 2718 | 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x70, 0x70, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 2719 | 0x62, 0x61, 0x70, 0x70, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x12, 2720 | 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 2721 | 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 2722 | 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x72, 0x65, 0x67, 2723 | 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 2724 | 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x52, 0x65, 2725 | 0x67, 0x73, 0x52, 0x04, 0x72, 0x65, 0x67, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 2726 | 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 2727 | 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 2728 | 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 2729 | 0x6d, 0x70, 0x22, 0x42, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 2730 | 0x66, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x66, 0x64, 0x12, 0x10, 0x0a, 0x03, 2731 | 0x74, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x69, 0x64, 0x12, 0x16, 2732 | 0x0a, 0x06, 0x70, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 2733 | 0x70, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x1c, 0x0a, 0x04, 0x52, 0x65, 0x67, 0x73, 0x12, 0x14, 2734 | 0x0a, 0x05, 0x63, 0x6f, 0x70, 0x70, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 2735 | 0x6f, 0x70, 0x70, 0x61, 0x22, 0xf6, 0x04, 0x0a, 0x03, 0x49, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 2736 | 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x33, 0x0a, 0x06, 2737 | 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 2738 | 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 2739 | 0x65, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 2740 | 0x63, 0x12, 0x33, 0x0a, 0x06, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 2741 | 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 2742 | 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x06, 2743 | 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x18, 2744 | 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 2745 | 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x56, 0x69, 0x64, 0x65, 2746 | 0x6f, 0x52, 0x05, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 2747 | 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 2748 | 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x41, 0x75, 2749 | 0x64, 0x69, 0x6f, 0x52, 0x05, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x33, 0x0a, 0x06, 0x6e, 0x61, 2750 | 0x74, 0x69, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 2751 | 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 2752 | 0x2e, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x52, 0x06, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 2753 | 0x2a, 0x0a, 0x03, 0x70, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 2754 | 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 2755 | 0x65, 0x73, 0x2e, 0x50, 0x6d, 0x70, 0x52, 0x03, 0x70, 0x6d, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x64, 2756 | 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x18, 0x08, 0x20, 2757 | 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x61, 2758 | 0x67, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x6d, 0x61, 2759 | 0x6e, 0x61, 0x67, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 2760 | 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x76, 0x65, 2761 | 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x73, 0x74, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 2762 | 0x52, 0x05, 0x69, 0x6e, 0x73, 0x74, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x69, 0x64, 2763 | 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x67, 0x69, 0x64, 0x12, 0x1a, 0x0a, 2764 | 0x08, 0x62, 0x69, 0x64, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x52, 2765 | 0x08, 0x62, 0x69, 0x64, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x69, 0x64, 2766 | 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x63, 0x75, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 2767 | 0x62, 0x69, 0x64, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x63, 0x75, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x63, 2768 | 0x6c, 0x69, 0x63, 0x6b, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 2769 | 0x05, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x12, 2770 | 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 2771 | 0x06, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x66, 0x72, 0x61, 0x6d, 2772 | 0x65, 0x62, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x69, 2773 | 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x65, 2774 | 0x78, 0x70, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x78, 0x70, 0x22, 0x4a, 0x0a, 2775 | 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 2776 | 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 2777 | 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 2778 | 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 2779 | 0x09, 0x52, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x22, 0xf8, 0x01, 0x0a, 0x06, 0x42, 0x61, 2780 | 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 2781 | 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0c, 0x0a, 0x01, 2782 | 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x77, 0x12, 0x0c, 0x0a, 0x01, 0x68, 0x18, 2783 | 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x74, 0x79, 0x70, 2784 | 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x05, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 2785 | 0x0a, 0x05, 0x62, 0x61, 0x74, 0x74, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x05, 0x62, 2786 | 0x61, 0x74, 0x74, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 2787 | 0x05, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6d, 0x65, 0x73, 0x18, 2788 | 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 2789 | 0x74, 0x6f, 0x70, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 2790 | 0x74, 0x6f, 0x70, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x64, 2791 | 0x69, 0x72, 0x18, 0x09, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x65, 0x78, 0x70, 0x64, 0x69, 0x72, 2792 | 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x05, 0x52, 0x03, 0x61, 2793 | 0x70, 0x69, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 2794 | 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x63, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 2795 | 0x03, 0x76, 0x63, 0x6d, 0x22, 0xec, 0x05, 0x0a, 0x05, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x12, 0x14, 2796 | 0x0a, 0x05, 0x6d, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6d, 2797 | 0x69, 0x6d, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x64, 0x75, 0x72, 0x61, 0x74, 2798 | 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x64, 0x75, 2799 | 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x64, 0x75, 0x72, 2800 | 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 2801 | 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x74, 2802 | 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 2803 | 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x0c, 0x0a, 0x01, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 2804 | 0x05, 0x52, 0x01, 0x77, 0x12, 0x0c, 0x0a, 0x01, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 2805 | 0x01, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x64, 0x65, 0x6c, 0x61, 0x79, 2806 | 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x64, 0x65, 0x6c, 2807 | 0x61, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 2808 | 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 2809 | 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 2810 | 0x01, 0x28, 0x05, 0x52, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 2811 | 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6b, 2812 | 0x69, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x6d, 0x69, 0x6e, 0x18, 0x0b, 0x20, 2813 | 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x6d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 2814 | 0x73, 0x6b, 0x69, 0x70, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 2815 | 0x09, 0x73, 0x6b, 0x69, 0x70, 0x61, 0x66, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 2816 | 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 2817 | 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x74, 0x72, 0x18, 2818 | 0x0e, 0x20, 0x03, 0x28, 0x05, 0x52, 0x05, 0x62, 0x61, 0x74, 0x74, 0x72, 0x12, 0x20, 0x0a, 0x0b, 2819 | 0x6d, 0x61, 0x78, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 2820 | 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x1e, 2821 | 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 2822 | 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x12, 0x1e, 2823 | 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 2824 | 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x12, 0x24, 2825 | 0x0a, 0x0d, 0x62, 0x6f, 0x78, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 2826 | 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x6f, 0x78, 0x69, 0x6e, 0x67, 0x61, 0x6c, 0x6c, 2827 | 0x6f, 0x77, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 2828 | 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x13, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x6c, 2829 | 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x0b, 2830 | 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 2831 | 0x05, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x1a, 2832 | 0x0a, 0x08, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x18, 0x15, 0x20, 0x03, 0x28, 0x05, 2833 | 0x52, 0x08, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x6f, 2834 | 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x3d, 0x0a, 0x0b, 2835 | 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x6f, 0x6e, 0x61, 0x64, 0x18, 0x17, 0x20, 0x03, 0x28, 2836 | 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 2837 | 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x0b, 2838 | 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x6f, 0x6e, 0x61, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 2839 | 0x70, 0x69, 0x18, 0x18, 0x20, 0x03, 0x28, 0x05, 0x52, 0x03, 0x61, 0x70, 0x69, 0x12, 0x24, 0x0a, 2840 | 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x18, 0x19, 2841 | 0x20, 0x03, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x6f, 0x6e, 0x74, 2842 | 0x79, 0x70, 0x65, 0x22, 0xa2, 0x04, 0x0a, 0x05, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x14, 0x0a, 2843 | 0x05, 0x6d, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x69, 2844 | 0x6d, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 2845 | 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x64, 0x75, 0x72, 2846 | 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x64, 0x75, 0x72, 0x61, 2847 | 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x64, 2848 | 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 2849 | 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x74, 2850 | 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x64, 0x65, 2851 | 0x6c, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 2852 | 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 2853 | 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 2854 | 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x74, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x05, 2855 | 0x52, 0x05, 0x62, 0x61, 0x74, 0x74, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x65, 0x78, 2856 | 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 2857 | 0x78, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 2858 | 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 2859 | 0x69, 0x6e, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 2860 | 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 2861 | 0x61, 0x78, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x6c, 2862 | 0x69, 0x76, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x05, 0x52, 0x08, 0x64, 0x65, 0x6c, 2863 | 0x69, 0x76, 0x65, 0x72, 0x79, 0x12, 0x3d, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 2864 | 0x6f, 0x6e, 0x61, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 2865 | 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 2866 | 0x2e, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 2867 | 0x6f, 0x6e, 0x61, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, 0x0d, 0x20, 0x03, 0x28, 2868 | 0x05, 0x52, 0x03, 0x61, 0x70, 0x69, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 2869 | 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0d, 0x63, 2870 | 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 2871 | 0x6d, 0x61, 0x78, 0x73, 0x65, 0x71, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 2872 | 0x78, 0x73, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 2873 | 0x28, 0x05, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x69, 0x74, 2874 | 0x63, 0x68, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x74, 0x69, 0x74, 2875 | 0x63, 0x68, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x76, 0x6f, 0x6c, 0x18, 0x12, 0x20, 0x01, 2876 | 0x28, 0x05, 0x52, 0x04, 0x6e, 0x76, 0x6f, 0x6c, 0x22, 0x5c, 0x0a, 0x06, 0x4e, 0x61, 0x74, 0x69, 2877 | 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 2878 | 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 2879 | 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x65, 0x72, 0x12, 0x10, 2880 | 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x03, 0x61, 0x70, 0x69, 2881 | 0x12, 0x14, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x74, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 2882 | 0x05, 0x62, 0x61, 0x74, 0x74, 0x72, 0x22, 0x68, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 2883 | 0x12, 0x0c, 0x0a, 0x01, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x77, 0x12, 0x0c, 2884 | 0x0a, 0x01, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x68, 0x12, 0x16, 0x0a, 0x06, 2885 | 0x77, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x77, 0x72, 2886 | 0x61, 0x74, 0x69, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x04, 2887 | 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x12, 0x0a, 0x04, 2888 | 0x77, 0x6d, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x77, 0x6d, 0x69, 0x6e, 2889 | 0x22, 0x5f, 0x0a, 0x03, 0x50, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x61, 2890 | 0x74, 0x65, 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 2891 | 0x52, 0x0e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 2892 | 0x12, 0x2f, 0x0a, 0x05, 0x64, 0x65, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 2893 | 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 2894 | 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x61, 0x6c, 0x52, 0x05, 0x64, 0x65, 0x61, 0x6c, 2895 | 0x73, 0x22, 0x96, 0x01, 0x0a, 0x04, 0x44, 0x65, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 2896 | 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x69, 2897 | 0x64, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x62, 0x69, 2898 | 0x64, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x69, 0x64, 0x66, 0x6c, 0x6f, 2899 | 0x6f, 0x72, 0x63, 0x75, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x69, 0x64, 2900 | 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x63, 0x75, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x74, 0x18, 0x04, 2901 | 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x73, 0x65, 0x61, 2902 | 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x77, 0x73, 0x65, 0x61, 0x74, 0x12, 0x1a, 2903 | 0x0a, 0x08, 0x77, 0x61, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 2904 | 0x52, 0x08, 0x77, 0x61, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x9c, 0x03, 0x0a, 0x04, 0x53, 2905 | 0x69, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 2906 | 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 2907 | 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 2908 | 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 2909 | 0x10, 0x0a, 0x03, 0x63, 0x61, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x63, 0x61, 2910 | 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x18, 2911 | 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x61, 2912 | 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x67, 0x65, 0x63, 0x61, 0x74, 0x18, 0x06, 0x20, 0x03, 2913 | 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x67, 0x65, 0x63, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 2914 | 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 2915 | 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 2916 | 0x66, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 2917 | 0x09, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x62, 2918 | 0x69, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 2919 | 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x70, 0x6f, 0x6c, 0x69, 2920 | 0x63, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x63, 2921 | 0x79, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 2922 | 0x73, 0x68, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 2923 | 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 2924 | 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 2925 | 0x69, 0x73, 0x68, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 2926 | 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 2927 | 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 2928 | 0x74, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 2929 | 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 2930 | 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x9f, 0x03, 0x0a, 0x03, 0x41, 0x70, 2931 | 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 2932 | 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 2933 | 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 2934 | 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x16, 0x0a, 2935 | 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 2936 | 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x75, 0x72, 2937 | 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x75, 0x72, 2938 | 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x61, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 2939 | 0x63, 0x61, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x61, 2940 | 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 2941 | 0x63, 0x61, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x67, 0x65, 0x63, 0x61, 0x74, 0x18, 0x08, 2942 | 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x67, 0x65, 0x63, 0x61, 0x74, 0x12, 0x10, 0x0a, 2943 | 0x03, 0x76, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x65, 0x72, 0x12, 2944 | 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 2945 | 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x70, 2946 | 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x69, 0x64, 0x18, 0x0b, 0x20, 2947 | 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x75, 0x62, 2948 | 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 2949 | 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 2950 | 0x65, 0x73, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x52, 0x09, 0x70, 0x75, 2951 | 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 2952 | 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 2953 | 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x43, 2954 | 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 2955 | 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 2956 | 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x50, 2957 | 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 2958 | 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 2959 | 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 2960 | 0x63, 0x61, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x63, 0x61, 0x74, 0x12, 0x16, 2961 | 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 2962 | 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xb7, 0x05, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 2963 | 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 2964 | 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 2965 | 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 2966 | 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 2967 | 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 2968 | 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 2969 | 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x61, 0x73, 2970 | 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 2971 | 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 2972 | 0x6e, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 2973 | 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 2974 | 0x05, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x73, 0x72, 0x63, 0x18, 0x09, 2975 | 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x73, 0x72, 0x63, 0x12, 0x39, 0x0a, 0x08, 0x70, 0x72, 2976 | 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 2977 | 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 2978 | 0x65, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 2979 | 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 2980 | 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x61, 0x74, 0x18, 0x0c, 2981 | 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x63, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 2982 | 0x64, 0x71, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x64, 0x71, 0x12, 2983 | 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 2984 | 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 2985 | 0x74, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 2986 | 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 2987 | 0x1e, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x10, 0x20, 2988 | 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 2989 | 0x26, 0x0a, 0x0e, 0x71, 0x61, 0x67, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6e, 2990 | 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x71, 0x61, 0x67, 0x6d, 0x65, 0x64, 0x69, 2991 | 0x61, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 2992 | 0x72, 0x64, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 2993 | 0x72, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x69, 0x76, 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 2994 | 0x6d, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x76, 0x65, 0x73, 0x74, 0x72, 2995 | 0x65, 0x61, 0x6d, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x72, 0x65, 0x6c, 2996 | 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 2997 | 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 2998 | 0x68, 0x69, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x65, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 2999 | 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 3000 | 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 3001 | 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 3002 | 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x61, 0x62, 0x6c, 3003 | 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 3004 | 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 3005 | 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 3006 | 0x22, 0x58, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 3007 | 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 3008 | 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 3009 | 0x12, 0x10, 0x0a, 0x03, 0x63, 0x61, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x63, 3010 | 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 3011 | 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xbc, 0x05, 0x0a, 0x06, 0x44, 3012 | 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x75, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 3013 | 0x09, 0x52, 0x02, 0x75, 0x61, 0x12, 0x2a, 0x0a, 0x03, 0x67, 0x65, 0x6f, 0x18, 0x02, 0x20, 0x01, 3014 | 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 3015 | 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x6f, 0x52, 0x03, 0x67, 0x65, 3016 | 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 3017 | 0x64, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6d, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 3018 | 0x52, 0x03, 0x6c, 0x6d, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 3019 | 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36, 0x18, 0x06, 0x20, 3020 | 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x70, 0x76, 0x36, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x76, 3021 | 0x69, 0x63, 0x65, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x64, 3022 | 0x65, 0x76, 0x69, 0x63, 0x65, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x61, 0x6b, 3023 | 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x61, 0x6b, 0x65, 0x12, 0x14, 0x0a, 3024 | 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 3025 | 0x64, 0x65, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 3026 | 0x02, 0x6f, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x73, 0x76, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 3027 | 0x52, 0x03, 0x6f, 0x73, 0x76, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x77, 0x76, 0x18, 0x0c, 0x20, 0x01, 3028 | 0x28, 0x09, 0x52, 0x03, 0x68, 0x77, 0x76, 0x12, 0x0c, 0x0a, 0x01, 0x68, 0x18, 0x0d, 0x20, 0x01, 3029 | 0x28, 0x05, 0x52, 0x01, 0x68, 0x12, 0x0c, 0x0a, 0x01, 0x77, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 3030 | 0x52, 0x01, 0x77, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x70, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 3031 | 0x52, 0x03, 0x70, 0x70, 0x69, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x78, 0x72, 0x61, 0x74, 0x69, 0x6f, 3032 | 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x78, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x12, 3033 | 0x0e, 0x0a, 0x02, 0x6a, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x6a, 0x73, 0x12, 3034 | 0x1a, 0x0a, 0x08, 0x67, 0x65, 0x6f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x18, 0x12, 0x20, 0x01, 0x28, 3035 | 0x05, 0x52, 0x08, 0x67, 0x65, 0x6f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x66, 3036 | 0x6c, 0x61, 0x73, 0x68, 0x76, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 3037 | 0x6c, 0x61, 0x73, 0x68, 0x76, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 3038 | 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 3039 | 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x18, 0x15, 3040 | 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, 0x16, 0x0a, 3041 | 0x06, 0x6d, 0x63, 0x63, 0x6d, 0x6e, 0x63, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 3042 | 0x63, 0x63, 0x6d, 0x6e, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 3043 | 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 3044 | 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 3045 | 0x03, 0x69, 0x66, 0x61, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x66, 0x61, 0x12, 3046 | 0x18, 0x0a, 0x07, 0x64, 0x69, 0x64, 0x73, 0x68, 0x61, 0x31, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 3047 | 0x52, 0x07, 0x64, 0x69, 0x64, 0x73, 0x68, 0x61, 0x31, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x64, 3048 | 0x6d, 0x64, 0x35, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x64, 0x6d, 0x64, 3049 | 0x35, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x70, 0x69, 0x64, 0x73, 0x68, 0x61, 0x31, 0x18, 0x1b, 0x20, 3050 | 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x70, 0x69, 0x64, 0x73, 0x68, 0x61, 0x31, 0x12, 0x18, 0x0a, 3051 | 0x07, 0x64, 0x70, 0x69, 0x64, 0x6d, 0x64, 0x35, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 3052 | 0x64, 0x70, 0x69, 0x64, 0x6d, 0x64, 0x35, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x73, 0x68, 3053 | 0x61, 0x31, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x73, 0x68, 0x61, 3054 | 0x31, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x63, 0x6d, 0x64, 0x35, 0x18, 0x1e, 0x20, 0x01, 0x28, 3055 | 0x09, 0x52, 0x06, 0x6d, 0x61, 0x63, 0x6d, 0x64, 0x35, 0x22, 0xc3, 0x02, 0x0a, 0x03, 0x47, 0x65, 3056 | 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 3057 | 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 3058 | 0x52, 0x03, 0x6c, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 3059 | 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 3060 | 0x75, 0x72, 0x61, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x61, 0x63, 0x63, 3061 | 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x66, 0x69, 0x78, 3062 | 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x66, 0x69, 0x78, 0x12, 3063 | 0x1c, 0x0a, 0x09, 0x69, 0x70, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 3064 | 0x28, 0x05, 0x52, 0x09, 0x69, 0x70, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 3065 | 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 3066 | 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 3067 | 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 3068 | 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x66, 0x69, 0x70, 0x73, 0x31, 0x30, 0x34, 3069 | 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x66, 0x69, 3070 | 0x70, 0x73, 0x31, 0x30, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x65, 0x74, 0x72, 0x6f, 0x18, 0x0a, 3071 | 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x65, 0x74, 0x72, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 3072 | 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 3073 | 0x10, 0x0a, 0x03, 0x7a, 0x69, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x7a, 0x69, 3074 | 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x74, 0x63, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0d, 3075 | 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x75, 0x74, 0x63, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 3076 | 0xf3, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 3077 | 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x79, 0x65, 3078 | 0x72, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x79, 0x65, 3079 | 0x72, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x79, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 3080 | 0x05, 0x52, 0x03, 0x79, 0x6f, 0x62, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 3081 | 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 3082 | 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 3083 | 0x52, 0x08, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x75, 3084 | 0x73, 0x74, 0x6f, 0x6d, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 3085 | 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x03, 0x67, 0x65, 3086 | 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 3087 | 0x6d, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x47, 0x65, 3088 | 0x6f, 0x52, 0x03, 0x67, 0x65, 0x6f, 0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 3089 | 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 3090 | 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 3091 | 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x62, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 3092 | 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 3093 | 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 3094 | 0x65, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 3095 | 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x70, 0x72, 3096 | 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 3097 | 0x52, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x43, 0x0a, 0x07, 0x53, 0x65, 0x67, 3098 | 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 3099 | 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 3100 | 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 3101 | 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0xad, 3102 | 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 3103 | 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x0f, 0x42, 0x69, 0x64, 0x72, 3104 | 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x13, 0x71, 3105 | 0x75, 0x61, 0x63, 0x66, 0x6b, 0x61, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x67, 3106 | 0x65, 0x6e, 0xa2, 0x02, 0x03, 0x43, 0x44, 0x50, 0xaa, 0x02, 0x13, 0x43, 0x6f, 0x6d, 0x2e, 0x44, 3107 | 0x65, 0x6d, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0xca, 0x02, 3108 | 0x13, 0x43, 0x6f, 0x6d, 0x5c, 0x44, 0x65, 0x6d, 0x6f, 0x5c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 3109 | 0x69, 0x6c, 0x65, 0x73, 0xe2, 0x02, 0x1f, 0x43, 0x6f, 0x6d, 0x5c, 0x44, 0x65, 0x6d, 0x6f, 0x5c, 3110 | 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 3111 | 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x15, 0x43, 0x6f, 0x6d, 0x3a, 0x3a, 0x44, 0x65, 3112 | 0x6d, 0x6f, 0x3a, 0x3a, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x62, 0x06, 3113 | 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 3114 | }) 3115 | 3116 | var ( 3117 | file_bidrequest_proto_rawDescOnce sync.Once 3118 | file_bidrequest_proto_rawDescData []byte 3119 | ) 3120 | 3121 | func file_bidrequest_proto_rawDescGZIP() []byte { 3122 | file_bidrequest_proto_rawDescOnce.Do(func() { 3123 | file_bidrequest_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_bidrequest_proto_rawDesc), len(file_bidrequest_proto_rawDesc))) 3124 | }) 3125 | return file_bidrequest_proto_rawDescData 3126 | } 3127 | 3128 | var file_bidrequest_proto_msgTypes = make([]protoimpl.MessageInfo, 22) 3129 | var file_bidrequest_proto_goTypes = []any{ 3130 | (*Bidrequest)(nil), // 0: com.demo.protoFiles.Bidrequest 3131 | (*Source)(nil), // 1: com.demo.protoFiles.Source 3132 | (*Regs)(nil), // 2: com.demo.protoFiles.Regs 3133 | (*Imp)(nil), // 3: com.demo.protoFiles.Imp 3134 | (*Metric)(nil), // 4: com.demo.protoFiles.Metric 3135 | (*Banner)(nil), // 5: com.demo.protoFiles.Banner 3136 | (*Video)(nil), // 6: com.demo.protoFiles.Video 3137 | (*Audio)(nil), // 7: com.demo.protoFiles.Audio 3138 | (*Native)(nil), // 8: com.demo.protoFiles.Native 3139 | (*Format)(nil), // 9: com.demo.protoFiles.Format 3140 | (*Pmp)(nil), // 10: com.demo.protoFiles.Pmp 3141 | (*Deal)(nil), // 11: com.demo.protoFiles.Deal 3142 | (*Site)(nil), // 12: com.demo.protoFiles.Site 3143 | (*App)(nil), // 13: com.demo.protoFiles.App 3144 | (*Publisher)(nil), // 14: com.demo.protoFiles.Publisher 3145 | (*Content)(nil), // 15: com.demo.protoFiles.Content 3146 | (*Producer)(nil), // 16: com.demo.protoFiles.Producer 3147 | (*Device)(nil), // 17: com.demo.protoFiles.Device 3148 | (*Geo)(nil), // 18: com.demo.protoFiles.Geo 3149 | (*User)(nil), // 19: com.demo.protoFiles.User 3150 | (*Data)(nil), // 20: com.demo.protoFiles.Data 3151 | (*Segment)(nil), // 21: com.demo.protoFiles.Segment 3152 | (*timestamppb.Timestamp)(nil), // 22: google.protobuf.Timestamp 3153 | } 3154 | var file_bidrequest_proto_depIdxs = []int32{ 3155 | 3, // 0: com.demo.protoFiles.Bidrequest.imp:type_name -> com.demo.protoFiles.Imp 3156 | 12, // 1: com.demo.protoFiles.Bidrequest.site:type_name -> com.demo.protoFiles.Site 3157 | 13, // 2: com.demo.protoFiles.Bidrequest.app:type_name -> com.demo.protoFiles.App 3158 | 17, // 3: com.demo.protoFiles.Bidrequest.device:type_name -> com.demo.protoFiles.Device 3159 | 19, // 4: com.demo.protoFiles.Bidrequest.user:type_name -> com.demo.protoFiles.User 3160 | 1, // 5: com.demo.protoFiles.Bidrequest.source:type_name -> com.demo.protoFiles.Source 3161 | 2, // 6: com.demo.protoFiles.Bidrequest.regs:type_name -> com.demo.protoFiles.Regs 3162 | 22, // 7: com.demo.protoFiles.Bidrequest.timestamp:type_name -> google.protobuf.Timestamp 3163 | 4, // 8: com.demo.protoFiles.Imp.metric:type_name -> com.demo.protoFiles.Metric 3164 | 5, // 9: com.demo.protoFiles.Imp.banner:type_name -> com.demo.protoFiles.Banner 3165 | 6, // 10: com.demo.protoFiles.Imp.video:type_name -> com.demo.protoFiles.Video 3166 | 7, // 11: com.demo.protoFiles.Imp.audio:type_name -> com.demo.protoFiles.Audio 3167 | 8, // 12: com.demo.protoFiles.Imp.native:type_name -> com.demo.protoFiles.Native 3168 | 10, // 13: com.demo.protoFiles.Imp.pmp:type_name -> com.demo.protoFiles.Pmp 3169 | 5, // 14: com.demo.protoFiles.Video.companionad:type_name -> com.demo.protoFiles.Banner 3170 | 5, // 15: com.demo.protoFiles.Audio.companionad:type_name -> com.demo.protoFiles.Banner 3171 | 11, // 16: com.demo.protoFiles.Pmp.deals:type_name -> com.demo.protoFiles.Deal 3172 | 14, // 17: com.demo.protoFiles.Site.publisher:type_name -> com.demo.protoFiles.Publisher 3173 | 15, // 18: com.demo.protoFiles.Site.content:type_name -> com.demo.protoFiles.Content 3174 | 14, // 19: com.demo.protoFiles.App.publisher:type_name -> com.demo.protoFiles.Publisher 3175 | 15, // 20: com.demo.protoFiles.App.content:type_name -> com.demo.protoFiles.Content 3176 | 16, // 21: com.demo.protoFiles.Content.producer:type_name -> com.demo.protoFiles.Producer 3177 | 20, // 22: com.demo.protoFiles.Content.data:type_name -> com.demo.protoFiles.Data 3178 | 18, // 23: com.demo.protoFiles.Device.geo:type_name -> com.demo.protoFiles.Geo 3179 | 18, // 24: com.demo.protoFiles.User.geo:type_name -> com.demo.protoFiles.Geo 3180 | 20, // 25: com.demo.protoFiles.User.data:type_name -> com.demo.protoFiles.Data 3181 | 21, // 26: com.demo.protoFiles.Data.segment:type_name -> com.demo.protoFiles.Segment 3182 | 27, // [27:27] is the sub-list for method output_type 3183 | 27, // [27:27] is the sub-list for method input_type 3184 | 27, // [27:27] is the sub-list for extension type_name 3185 | 27, // [27:27] is the sub-list for extension extendee 3186 | 0, // [0:27] is the sub-list for field type_name 3187 | } 3188 | 3189 | func init() { file_bidrequest_proto_init() } 3190 | func file_bidrequest_proto_init() { 3191 | if File_bidrequest_proto != nil { 3192 | return 3193 | } 3194 | type x struct{} 3195 | out := protoimpl.TypeBuilder{ 3196 | File: protoimpl.DescBuilder{ 3197 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 3198 | RawDescriptor: unsafe.Slice(unsafe.StringData(file_bidrequest_proto_rawDesc), len(file_bidrequest_proto_rawDesc)), 3199 | NumEnums: 0, 3200 | NumMessages: 22, 3201 | NumExtensions: 0, 3202 | NumServices: 0, 3203 | }, 3204 | GoTypes: file_bidrequest_proto_goTypes, 3205 | DependencyIndexes: file_bidrequest_proto_depIdxs, 3206 | MessageInfos: file_bidrequest_proto_msgTypes, 3207 | }.Build() 3208 | File_bidrequest_proto = out.File 3209 | file_bidrequest_proto_goTypes = nil 3210 | file_bidrequest_proto_depIdxs = nil 3211 | } 3212 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/loicalleyne/quacfka-service 2 | 3 | go 1.24.0 4 | 5 | toolchain go1.24.1 6 | 7 | require ( 8 | github.com/TFMV/filewalker v0.0.0-20250224073810-b5e8b71e02ff 9 | github.com/apache/arrow-go/v18 v18.3.0 10 | github.com/joho/godotenv v1.5.1 11 | github.com/loicalleyne/bufarrow v0.5.1 12 | github.com/loicalleyne/quacfka v0.5.14 13 | github.com/loicalleyne/quacfka-runner v0.0.0-20250228200710-f6526a254eb8 14 | github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 15 | github.com/valyala/gorpc v0.0.0-20160519171614-908281bef774 16 | google.golang.org/protobuf v1.36.6 17 | ) 18 | 19 | require ( 20 | github.com/SAP/go-dblib v0.0.0-20230911064405-b779cef8f299 // indirect 21 | github.com/andybalholm/brotli v1.1.1 // indirect 22 | github.com/apache/arrow-adbc/go/adbc v1.4.0 // indirect 23 | github.com/apache/thrift v0.21.0 // indirect 24 | github.com/cespare/xxhash/v2 v2.3.0 // indirect 25 | github.com/goccy/go-json v0.10.5 // indirect 26 | github.com/golang/snappy v1.0.0 // indirect 27 | github.com/google/flatbuffers v25.2.10+incompatible // indirect 28 | github.com/google/uuid v1.6.0 // indirect 29 | github.com/jhump/protoreflect/v2 v2.0.0-beta.2 // indirect 30 | github.com/klauspost/asmfmt v1.3.2 // indirect 31 | github.com/klauspost/compress v1.18.0 // indirect 32 | github.com/klauspost/cpuid/v2 v2.2.10 // indirect 33 | github.com/loicalleyne/couac v0.5.2 // indirect 34 | github.com/loicalleyne/protorand v0.0.0-20250201052828-ef9589bb5a9a // indirect 35 | github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect 36 | github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect 37 | github.com/panjf2000/ants/v2 v2.11.2 // indirect 38 | github.com/pierrec/lz4/v4 v4.1.22 // indirect 39 | github.com/spf13/cast v1.7.1 // indirect 40 | github.com/twmb/franz-go v1.18.1 // indirect 41 | github.com/twmb/franz-go/pkg/kmsg v1.9.0 // indirect 42 | github.com/zeebo/xxh3 v1.0.2 // indirect 43 | go.opentelemetry.io/proto/otlp v1.5.0 // indirect 44 | go.uber.org/multierr v1.10.0 // indirect 45 | go.uber.org/zap v1.27.0 // indirect 46 | golang.org/x/exp v0.0.0-20250207012021-f9890c6ad9f3 // indirect 47 | golang.org/x/mod v0.24.0 // indirect 48 | golang.org/x/net v0.39.0 // indirect 49 | golang.org/x/sync v0.13.0 // indirect 50 | golang.org/x/sys v0.33.0 // indirect 51 | golang.org/x/text v0.24.0 // indirect 52 | golang.org/x/tools v0.32.0 // indirect 53 | golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect 54 | google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect 55 | google.golang.org/grpc v1.72.0 // indirect 56 | ) 57 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/SAP/go-dblib v0.0.0-20230911064405-b779cef8f299 h1:wYLSoEyQC3E8ckHjUOSM9ay9IimmO/VtpiDPQpLm9NU= 2 | github.com/SAP/go-dblib v0.0.0-20230911064405-b779cef8f299/go.mod h1:jdFzhXzanm/uRvjygb+33EYEx17Jd+FywzKMI8x1ChA= 3 | github.com/TFMV/filewalker v0.0.0-20250224073810-b5e8b71e02ff h1:rXofXjMrr6ammc53GRGsFEbQLi1fpFt7Y6FlZB2xCho= 4 | github.com/TFMV/filewalker v0.0.0-20250224073810-b5e8b71e02ff/go.mod h1:FcEhCpdaSSijVSVcG8g3aT3/ablsOhWbozf7trwP9MU= 5 | github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= 6 | github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= 7 | github.com/apache/arrow-adbc/go/adbc v1.4.0 h1:I21y3Pq9ygtsmbwNgDZ3dsWRgtuOVMWIVBTdpWeEOCQ= 8 | github.com/apache/arrow-adbc/go/adbc v1.4.0/go.mod h1:fBbhukk/BpKLGfYquN/ru3ru1Ipl4e+IVqsBtCfWMJc= 9 | github.com/apache/arrow-go/v18 v18.3.0 h1:Xq4A6dZj9Nu33sqZibzn012LNnewkTUlfKVUFD/RX/I= 10 | github.com/apache/arrow-go/v18 v18.3.0/go.mod h1:eEM1DnUTHhgGAjf/ChvOAQbUQ+EPohtDrArffvUjPg8= 11 | github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= 12 | github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= 13 | github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= 14 | github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= 15 | github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 16 | github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 17 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 18 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 19 | github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= 20 | github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 21 | github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= 22 | github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 23 | github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= 24 | github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 25 | github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= 26 | github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= 27 | github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 28 | github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 29 | github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= 30 | github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 31 | github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= 32 | github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 33 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 34 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 35 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 36 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 37 | github.com/jhump/protoreflect/v2 v2.0.0-beta.2 h1:qZU+rEZUOYTz1Bnhi3xbwn+VxdXkLVeEpAeZzVXLY88= 38 | github.com/jhump/protoreflect/v2 v2.0.0-beta.2/go.mod h1:4tnOYkB/mq7QTyS3YKtVtNrJv4Psqout8HA1U+hZtgM= 39 | github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= 40 | github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= 41 | github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= 42 | github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= 43 | github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= 44 | github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= 45 | github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= 46 | github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= 47 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 48 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 49 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 50 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 51 | github.com/loicalleyne/bufarrow v0.5.1 h1:avqZa86ZR4po7jrOdGRtkHBtPd9o/XLa66XqS2ToCGk= 52 | github.com/loicalleyne/bufarrow v0.5.1/go.mod h1:We+f2Af660iNXeS47LNZc1rK+krOXHEM5DSiBwkfMR8= 53 | github.com/loicalleyne/couac v0.5.2 h1:++2AXKYur9/cmQMQWxXdjsmTHMUs7WDwJourGlUgWVE= 54 | github.com/loicalleyne/couac v0.5.2/go.mod h1:QNw/G/YVYkdr9RRNwdlxPY6S8UIfg9aM4UjZXhvyvSQ= 55 | github.com/loicalleyne/protorand v0.0.0-20250201052828-ef9589bb5a9a h1:k+qx2PGZDvrgPxHObjzbHlu9cJJWuscU1/nYk4S3/4Q= 56 | github.com/loicalleyne/protorand v0.0.0-20250201052828-ef9589bb5a9a/go.mod h1:sUGcVJlBsqTSmuYhsS1J8SrgYoBD/l0eWv5metMQKeY= 57 | github.com/loicalleyne/quacfka v0.5.14 h1:1t1T4r6MChSma7yYVffJdaVSZ7wKZBYKJ+LS1q+JKP0= 58 | github.com/loicalleyne/quacfka v0.5.14/go.mod h1:LblHzNe+m79V62MCY+aY+sbtvVifWBxlkYeUf6z4nDE= 59 | github.com/loicalleyne/quacfka-runner v0.0.0-20250228200710-f6526a254eb8 h1:zGwXo3KA40DJjYyjw5AcPoORHbjWZ55A/0oE1rTA8x4= 60 | github.com/loicalleyne/quacfka-runner v0.0.0-20250228200710-f6526a254eb8/go.mod h1:Btzs8lmo/S/XpdhZe8nl2NI2z+NDmSzTPn0jm5BBUSI= 61 | github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= 62 | github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= 63 | github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= 64 | github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= 65 | github.com/panjf2000/ants/v2 v2.11.2 h1:AVGpMSePxUNpcLaBO34xuIgM1ZdKOiGnpxLXixLi5Jo= 66 | github.com/panjf2000/ants/v2 v2.11.2/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= 67 | github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= 68 | github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= 69 | github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= 70 | github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= 71 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 72 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 73 | github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= 74 | github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 75 | github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= 76 | github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= 77 | github.com/sryoya/protorand v0.0.0-20250114120907-8c1a8e3138f2 h1:AG8FApn4FCcByk6/r3QhXd6pzotkM8osGP+cGWpGlko= 78 | github.com/sryoya/protorand v0.0.0-20250114120907-8c1a8e3138f2/go.mod h1:9a23nlv6vzBeVlQq6JQCjljZ6sfzsB6aha1m5Ly1W2Y= 79 | github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= 80 | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 81 | github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 82 | github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 83 | github.com/twmb/franz-go v1.18.1 h1:D75xxCDyvTqBSiImFx2lkPduE39jz1vaD7+FNc+vMkc= 84 | github.com/twmb/franz-go v1.18.1/go.mod h1:Uzo77TarcLTUZeLuGq+9lNpSkfZI+JErv7YJhlDjs9M= 85 | github.com/twmb/franz-go/pkg/kmsg v1.9.0 h1:JojYUph2TKAau6SBtErXpXGC7E3gg4vGZMv9xFU/B6M= 86 | github.com/twmb/franz-go/pkg/kmsg v1.9.0/go.mod h1:CMbfazviCyY6HM0SXuG5t9vOwYDHRCSrJJyBAe5paqg= 87 | github.com/valyala/gorpc v0.0.0-20160519171614-908281bef774 h1:SUHFQHAaySqF0YHCmmm0EIFooFZpDPpi5KTom7YJ07c= 88 | github.com/valyala/gorpc v0.0.0-20160519171614-908281bef774/go.mod h1:8uNqM1i7pr0jO7gdvbNCgsSa8Ki2vMh7JCQxO9BlF90= 89 | github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= 90 | github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= 91 | github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= 92 | github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= 93 | github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= 94 | github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= 95 | go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= 96 | go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= 97 | go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= 98 | go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= 99 | go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= 100 | go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= 101 | go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= 102 | go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= 103 | go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= 104 | go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= 105 | go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= 106 | go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= 107 | go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= 108 | go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= 109 | go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= 110 | go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 111 | go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= 112 | go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= 113 | go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= 114 | go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= 115 | golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= 116 | golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= 117 | golang.org/x/exp v0.0.0-20250207012021-f9890c6ad9f3 h1:qNgPs5exUA+G0C96DrPwNrvLSj7GT/9D+3WMWUcUg34= 118 | golang.org/x/exp v0.0.0-20250207012021-f9890c6ad9f3/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= 119 | golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= 120 | golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= 121 | golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= 122 | golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= 123 | golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= 124 | golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 125 | golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= 126 | golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 127 | golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= 128 | golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= 129 | golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= 130 | golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= 131 | golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= 132 | golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 133 | gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= 134 | gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= 135 | google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4= 136 | google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ= 137 | google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= 138 | google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= 139 | google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= 140 | google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 141 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 142 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 143 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/binary" 5 | "flag" 6 | "io/fs" 7 | "path/filepath" 8 | 9 | "runtime" 10 | "runtime/pprof" 11 | "strings" 12 | "sync" 13 | 14 | "github.com/loicalleyne/quacfka-runner/rpc" 15 | 16 | rr "github.com/loicalleyne/quacfka-service/gen" 17 | 18 | "github.com/apache/arrow-go/v18/arrow/array" 19 | q "github.com/loicalleyne/quacfka" 20 | 21 | "context" 22 | "fmt" 23 | "log" 24 | "os" 25 | "os/signal" 26 | "syscall" 27 | "time" 28 | 29 | "github.com/TFMV/filewalker" 30 | "github.com/joho/godotenv" 31 | "github.com/loicalleyne/bufarrow" 32 | "github.com/valyala/gorpc" 33 | ) 34 | 35 | var ( 36 | err error 37 | addr string 38 | ) 39 | 40 | var ( 41 | cpuprofile = flag.String("cpuprofile", "default.pgo", "write cpu profile to `file`") 42 | batchMultiplier = flag.Int("bs", 1, "122880 * {bs} limit") 43 | kafkaRoutines = flag.Int("kr", 5, "kafka client goroutine count") 44 | kCap = flag.Int("kc", 8, "msg buffer 122880 * *kCap") 45 | routines = flag.Int("gr", 1, "deserializing goroutine count") 46 | duckRoutines = flag.Int("acr", 1, "adbc connections") 47 | arrowQueueSize = flag.Int("q", 5, "arrow queue size") 48 | duckSize = flag.Int("s", 4200, "duckdb file size threshold") 49 | maxProcs = flag.Int("mp", runtime.NumCPU(), "GOMAXPROCS") 50 | verbose = flag.Bool("verbose", false, "verbose logging") 51 | parquetPath = flag.String("pp", "../parquet", "path to parquet folder, without trailing slash") 52 | timeout = flag.Int("t", 0, "timeout") 53 | ) 54 | 55 | func main() { 56 | flag.Parse() 57 | log.Printf("GOMAXPROCS=%d\n", *maxProcs) 58 | runtime.GOMAXPROCS(*maxProcs) 59 | godotenv.Load() 60 | numCPUs := runtime.NumCPU() 61 | log.Printf("CPU count: %d\n", numCPUs) 62 | // Metrics recorded to help tune workloads 63 | metricsFile, err := os.OpenFile("metrics.json", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) 64 | if err != nil { 65 | panic(err) 66 | } 67 | var o *q.Orchestrator[*rr.Bidrequest] 68 | defer func() { 69 | _, err = metricsFile.WriteString(o.ReportJSONL()) 70 | if err != nil { 71 | log.Println(err) 72 | } 73 | metricsFile.Sync() 74 | metricsFile.Close() 75 | }() 76 | // CPU profiling 77 | if *cpuprofile != "" { 78 | log.Printf("profiling to %s\n", strings.TrimSuffix(filepath.Base(*cpuprofile), filepath.Ext(*cpuprofile))+filepath.Ext(*cpuprofile)) 79 | f, err := os.Create(strings.TrimSuffix(filepath.Base(*cpuprofile), filepath.Ext(*cpuprofile)) + filepath.Ext(*cpuprofile)) 80 | if err != nil { 81 | log.Fatal("could not create CPU profile: ", err) 82 | } 83 | defer f.Close() 84 | if err := pprof.StartCPUProfile(f); err != nil { 85 | log.Fatal("could not start CPU profile: ", err) 86 | } 87 | defer pprof.StopCPUProfile() 88 | defer log.Printf("program ended\nto view profile run 'go tool pprof -http localhost:8080 %s'\n", strings.TrimSuffix(filepath.Base(*cpuprofile), filepath.Ext(*cpuprofile))+filepath.Ext(*cpuprofile)) 89 | } 90 | 91 | // partition query 92 | partitionQuery := `select 93 | datepart('year', epoch_ms(timestamp.seconds * 1000))::STRING as year, 94 | datepart('month', epoch_ms(timestamp.seconds * 1000))::STRING as month, 95 | datepart('day', epoch_ms(timestamp.seconds * 1000))::STRING as day, 96 | datepart('hour', epoch_ms(timestamp.seconds * 1000))::STRING as hour 97 | from bidreq 98 | group by all 99 | ORDER BY 1,2,3,4` 100 | // export_raw.sql 101 | rawQuery := `COPY ( 102 | SELECT * 103 | FROM bidreq 104 | WHERE 105 | datepart('year', epoch_ms(((timestamp.seconds * 1000) + (timestamp.nanos/1000000))::BIGINT)) = {{year}} 106 | and datepart('month', epoch_ms(((timestamp.seconds * 1000) + (timestamp.nanos/1000000))::BIGINT)) = {{month}} 107 | and datepart('day', epoch_ms(((timestamp.seconds * 1000) + (timestamp.nanos/1000000))::BIGINT)) = {{day}} 108 | and datepart('hour', epoch_ms(((timestamp.seconds * 1000) + (timestamp.nanos/1000000))::BIGINT)) = {{hour}} ) TO '{{exportpath}}/{{logname}}/{{queryname}}/year={{year}}/month={{month}}/day={{day}}/hour={{hour}}/bidreq_raw_{{rand}}.parquet' (format PARQUET, compression zstd, ROW_GROUP_SIZE_BYTES 100_000_000, OVERWRITE_OR_IGNORE)` 109 | hourlyRequestsAggQuery := `COPY ( 110 | select 111 | datetrunc('day', epoch_ms(event_time*1000))::DATE date, 112 | extract('hour' FROM epoch_ms(event_time*1000)) as hour, 113 | bidreq_norm.pub_id, 114 | bidreq_norm.device_id, 115 | CONCAT(width::string, 'x', height::string) resolution, 116 | deal, 117 | count(distinct bidreq_id) requests, 118 | from bidreq_norm 119 | where 120 | datepart('year', epoch_ms(event_time * 1000)) = {{year}} 121 | and datepart('month', epoch_ms(event_time * 1000)) = {{month}} 122 | and datepart('day', epoch_ms(event_time * 1000)) = {{day}} 123 | and datepart('hour', epoch_ms(event_time * 1000)) = {{hour}} 124 | group by all) 125 | TO '{{exportpath}}/{{logname}}/{{queryname}}/year={{year}}/month={{month}}/day={{day}}/hour={{hour}}/bidreq_hourly_requests_agg_{{rand}}.parquet' (format PARQUET, compression zstd, ROW_GROUP_SIZE_BYTES 100_000_000, OVERWRITE_OR_IGNORE)` 126 | logName := "ortb.bid-requests" 127 | queries := []string{rawQuery, hourlyRequestsAggQuery} 128 | queriesNames := []string{"raw", "hourly_requests_agg"} 129 | execQueries := []string{"SET threads = 32", "SET allocator_background_threads = true"} 130 | execQueriesNames := []string{"", ""} 131 | 132 | // RPC Client setup 133 | gorpc.RegisterType(rpc.Request{}) 134 | gorpc.RegisterType(rpc.Response{}) 135 | 136 | addr = "./gorpc-sock.unix" 137 | client := gorpc.NewUnixClient(addr) 138 | client.Start() 139 | 140 | // Clean up any orphan DBs first 141 | var opt filewalker.WalkOptions 142 | opt.Filter = filewalker.FilterOptions{ 143 | IncludeTypes: []string{".db"}, 144 | } 145 | opt.Filter.ModifiedBefore = time.Now().Add(-5 * time.Second) 146 | err = filewalker.WalkLimitWithOptions(context.Background(), "./", func(path string, info fs.FileInfo, err error) error { 147 | if info.IsDir() { 148 | return nil 149 | } 150 | if filepath.Ext(info.Name()) == ".db" && time.Since(info.ModTime()) > (5*time.Second) { 151 | path, err := filepath.Abs(path) 152 | if err != nil { 153 | log.Printf("path error: %v\n", err) 154 | } 155 | resp, err := client.Call(rpc.Request{ 156 | Type: rpc.REQUEST_VALIDATE, 157 | Path: path, 158 | ExportPath: *parquetPath, 159 | LogName: logName, 160 | ExecQueries: execQueries, 161 | ExecQueriesNames: execQueriesNames, 162 | PartitionQuery: partitionQuery, 163 | Queries: queries, 164 | QueriesNames: queriesNames, 165 | }) 166 | if err != nil { 167 | log.Printf(" runner request issue: %v\n", err) 168 | } else { 169 | req := resp.(rpc.Response).Request 170 | req.Type = rpc.REQUEST_RUN 171 | err = client.Send(req) 172 | if err != nil { 173 | log.Printf("rpc send error: %v\n", err) 174 | } 175 | } 176 | d := 0 177 | for i := 0; i <= 60; i++ { 178 | c, _ := dbFileCount("./") 179 | if c > 3 { 180 | delay := time.NewTimer(1 * time.Second) 181 | <-delay.C 182 | d++ 183 | } else { 184 | if d > 0 { 185 | log.Printf("delayed by %d sec\n", d) 186 | } 187 | break 188 | } 189 | } 190 | } 191 | return nil 192 | }, opt) 193 | if err != nil { 194 | log.Printf("error: %v\n", err) 195 | } 196 | 197 | // Defining normalizer fields and aliases - must match 198 | normFields := []string{"id", "site.id", "site.publisher.id", "timestamp.seconds", "imp[0].banner.w", "imp[0].banner.h", "imp[0].pmp.deals.id"} 199 | normAliases := []string{"bidreq_id", "device_id", "pub_id", "event_time", "width", "height", "deal"} 200 | // Defining custom fields 201 | cf := []q.CustomField{{Name: "event_tm", Type: q.INT64, FieldCardinality: q.Optional, IsPacked: false}} 202 | // Creating quacfka.Orchestrator 203 | o, err = q.NewOrchestrator[*rr.Bidrequest]( 204 | q.WithFileRotateThresholdMB(int64(*duckSize)), 205 | q.WithCustomFields(cf), 206 | q.WithNormalizer(normFields, normAliases, false), 207 | q.WithDuckPathsChan(3)) 208 | 209 | if err != nil { 210 | panic(err) 211 | } 212 | 213 | defer o.Close() 214 | fmt.Println(o.Schema().Schema().String()) 215 | if *verbose { 216 | q.SetDebugLogger(log.Printf) 217 | q.SetErrorLogger(log.Printf) 218 | q.SetFatalLogger(log.Fatalf) 219 | } 220 | q.SetBenchmarkLogger(log.Printf) 221 | k := o.NewKafkaConfig() 222 | k.ClientCount.Store(int32(*kafkaRoutines)) 223 | k.MsgChanCap = 122880 * *kCap 224 | k.ConsumerGroup = os.Getenv("CONSUMER_GROUP") 225 | k.Seeds = append(k.Seeds, os.Getenv("KAFKA_SEED")) 226 | k.User = os.Getenv("KAFKA_USER") 227 | k.Password = os.Getenv("KAFKA_PW") 228 | // Use this to have the Kafka reader append the message timestamp in epoch milliseconds as 8 bytes at the end of the message 229 | k.MsgTimeAppend = true 230 | // Use this if consuming from topic produced by Confluence client as it prefixes messages with 6 magic bytes 231 | k.Munger = q.WithMessageCutConfluencePrefix 232 | k.Topic = os.Getenv("KAFKA_TOPIC") 233 | 234 | // Protobuf processor configuration 235 | err = o.ConfigureProcessor(*arrowQueueSize, *batchMultiplier, *routines, customProtoUnmarshal) 236 | if err != nil { 237 | log.Println(err) 238 | panic(err) 239 | } 240 | 241 | var driverPath string 242 | switch runtime.GOOS { 243 | case "darwin": 244 | driverPath = "/usr/local/lib/libduckdb.so.dylib" 245 | case "linux": 246 | driverPath = "/usr/local/lib/libduckdb.so" 247 | case "windows": 248 | h, _ := os.UserHomeDir() 249 | driverPath = h + "\\Downloads\\libduckdb-windows-amd64\\duckdb.dll" 250 | default: 251 | } 252 | 253 | err = o.ConfigureDuck(q.WithPathPrefix("bidreq"), 254 | q.WithDriverPath(driverPath), 255 | q.WithDestinationTable("bidreq"), 256 | q.WithDuckConnections(*duckRoutines)) 257 | 258 | if err != nil { 259 | panic(err) 260 | } 261 | var wg sync.WaitGroup 262 | ctx_, ctxCancelFunc := context.WithCancel(context.Background()) 263 | ctrlC(ctxCancelFunc, o, metricsFile) 264 | if *timeout != 0 { 265 | ctxT, _ := context.WithTimeout(ctx_, time.Duration(*timeout)*time.Second) 266 | wg.Add(1) 267 | go o.Run(ctxT, &wg) 268 | } else { 269 | wg.Add(1) 270 | go o.Run(ctx_, &wg) 271 | } 272 | 273 | wg.Add(1) 274 | go func() { 275 | defer wg.Done() 276 | for dPath := range o.DuckPaths() { 277 | path, err := filepath.Abs(dPath) 278 | if err != nil { 279 | log.Printf("dPath error: %v\n", err) 280 | } 281 | resp, err := client.Call(rpc.Request{ 282 | Type: rpc.REQUEST_VALIDATE, 283 | Path: path, 284 | ExportPath: *parquetPath, 285 | LogName: logName, 286 | ExecQueries: execQueries, 287 | ExecQueriesNames: execQueriesNames, 288 | PartitionQuery: partitionQuery, 289 | Queries: queries, 290 | QueriesNames: queriesNames, 291 | }) 292 | if err != nil { 293 | log.Printf(" runner request issue: %v\n", err) 294 | } else { 295 | req := resp.(rpc.Response).Request 296 | req.Type = rpc.REQUEST_RUN 297 | err = client.Send(req) 298 | if err != nil { 299 | log.Printf("rpc send error: %v\n", err) 300 | } 301 | } 302 | d := 0 303 | for i := 0; i <= 60; i++ { 304 | c, _ := dbFileCount("./") 305 | if c > 3 { 306 | delay := time.NewTimer(1 * time.Second) 307 | <-delay.C 308 | d++ 309 | } else { 310 | if d > 0 { 311 | log.Printf("delayed by %d sec\n", d) 312 | } 313 | break 314 | } 315 | } 316 | } 317 | }() 318 | 319 | wg.Wait() 320 | if o.Error() != nil { 321 | log.Println(err) 322 | } 323 | 324 | log.Printf("%v\n", o.Report()) 325 | 326 | o.Close() 327 | } 328 | 329 | func customProtoUnmarshal(m []byte, s any) error { 330 | newMessage := rr.BidrequestFromVTPool() 331 | // Extract the 8 byte Unix Milliseconds Kafka message timestamp from the end of the message bytes. 332 | b := m[len(m)-8:] 333 | event_tm := int64(binary.LittleEndian.Uint64(b)) 334 | // Unmarshal the proto.Message from the message bytes without the timestamp bytes. 335 | err := newMessage.UnmarshalVTUnsafe(m[:len(m)-8]) 336 | if err != nil { 337 | return err 338 | } 339 | // Normalizer is for building a flat-schema Arrow record. Unnesting the data at the message 340 | // deserialization level is much better for cache locality, and insertion and aggregation querying 341 | // of flat data is much faster. 342 | rb := s.(*bufarrow.Schema[*rr.Bidrequest]).NormalizerBuilder() 343 | if rb != nil { 344 | b := rb.Fields() 345 | if b != nil { 346 | id := newMessage.GetId() 347 | deviceID := coalesceStringFunc(newMessage.GetUser().GetId, newMessage.GetSite().GetId, newMessage.GetDevice().GetIfa) 348 | publisherID := newMessage.GetSite().GetPublisher().GetId() 349 | timestampSeconds := newMessage.GetTimestamp().GetSeconds() 350 | timestampNanos := newMessage.GetTimestamp().GetNanos() 351 | var width, height int32 352 | if newMessage.GetImp()[0].GetBanner() != nil { 353 | width = newMessage.GetImp()[0].GetBanner().GetW() 354 | } else { 355 | width = newMessage.GetImp()[0].GetVideo().GetW() 356 | } 357 | if newMessage.GetImp()[0].GetBanner() != nil { 358 | height = newMessage.GetImp()[0].GetBanner().GetH() 359 | } else { 360 | height = newMessage.GetImp()[0].GetVideo().GetH() 361 | } 362 | if len(newMessage.GetImp()[0].GetPmp().GetDeals()) == 0 { 363 | b[0].(*array.StringBuilder).Append(id) 364 | b[1].(*array.StringBuilder).Append(deviceID) 365 | b[2].(*array.StringBuilder).Append(publisherID) 366 | b[4].(*array.Int64Builder).Append(timestampSeconds + int64(timestampNanos/1000000000)) 367 | b[5].(*array.Uint32Builder).Append(uint32(width)) 368 | b[6].(*array.Uint32Builder).Append(uint32(height)) 369 | b[7].(*array.StringBuilder).AppendNull() 370 | } 371 | // var deals []string = make([]string, len(newMessage.GetImp()[0].GetPmp().GetDeals())) 372 | for i := 0; i < len(newMessage.GetImp()[0].GetPmp().GetDeals()); i++ { 373 | b[0].(*array.StringBuilder).Append(id) 374 | b[1].(*array.StringBuilder).Append(deviceID) 375 | b[2].(*array.StringBuilder).Append(publisherID) 376 | b[4].(*array.Int64Builder).Append(timestampSeconds + int64(timestampNanos/1000000000)) 377 | b[5].(*array.Uint32Builder).Append(uint32(width)) 378 | b[6].(*array.Uint32Builder).Append(uint32(height)) 379 | b[7].(*array.StringBuilder).Append(newMessage.GetImp()[0].GetPmp().GetDeals()[i].GetId()) 380 | } 381 | } 382 | } 383 | 384 | // Assert s to `*bufarrow.Schema[*your.CustomProtoMessageType]` 385 | err = s.(*bufarrow.Schema[*rr.Bidrequest]).AppendWithCustom(newMessage, event_tm) 386 | if err != nil { 387 | log.Printf("append error: %v\n", err) 388 | } 389 | newMessage.ReturnToVTPool() 390 | return nil 391 | } 392 | 393 | // dbFileCount counts the number of database files in the path. 394 | // Used for back pressure with quacfka-runner. 395 | func dbFileCount(path string) (int, error) { 396 | i := 0 397 | files, err := os.ReadDir(path) 398 | if err != nil { 399 | return 0, err 400 | } 401 | for _, file := range files { 402 | if !file.IsDir() && filepath.Ext(file.Name()) == ".db" { 403 | i++ 404 | } 405 | } 406 | return i, nil 407 | } 408 | 409 | // CtrlC intercepts any Ctrl+C keyboard input and exits to the shell. 410 | func ctrlC(f context.CancelFunc, o *q.Orchestrator[*rr.Bidrequest], metricsFile *os.File) { 411 | c := make(chan os.Signal, 1) 412 | signal.Notify(c, os.Interrupt, syscall.SIGTERM) 413 | go func() { 414 | <-c 415 | f() 416 | o.UpdateMetrics() 417 | log.Printf("%v\n", o.Report()) 418 | _, err = metricsFile.WriteString(o.ReportJSONL()) 419 | if err != nil { 420 | log.Println(err) 421 | } 422 | metricsFile.Sync() 423 | metricsFile.Close() 424 | pprof.StopCPUProfile() 425 | log.Printf("Closing") 426 | fmt.Fprintf(os.Stdout, "Bye👋\n") 427 | os.Exit(2) 428 | }() 429 | } 430 | 431 | func coalesceStringFunc(args ...func() string) string { 432 | for _, arg := range args { 433 | if arg() != "" { 434 | return arg() 435 | } 436 | } 437 | return "" 438 | } 439 | -------------------------------------------------------------------------------- /proto/bidrequest.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | //import "google/protobuf/any.proto"; 3 | 4 | package com.demo.protoFiles; 5 | import "google/protobuf/timestamp.proto"; 6 | 7 | message Bidrequest { 8 | 9 | string id = 1; 10 | repeated Imp imp = 2; 11 | Site site = 3; 12 | App app = 4; 13 | Device device = 5; 14 | User user = 6; 15 | int32 test = 7; 16 | int32 at = 8; 17 | int32 tmax = 9; 18 | repeated string wseat = 10; 19 | repeated string bseat = 11; 20 | int32 allimps = 12; 21 | repeated string cur = 13; 22 | repeated string wlang = 14; 23 | repeated string bcat = 15; 24 | repeated string badv = 16; 25 | repeated string bapp = 17; 26 | Source source = 18; 27 | Regs regs = 19; 28 | google.protobuf.Timestamp timestamp = 20; 29 | } 30 | 31 | message Source { 32 | 33 | int32 fd = 1; 34 | string tid = 2; 35 | string pchain = 3; 36 | 37 | } 38 | 39 | message Regs { 40 | 41 | int32 coppa = 1; 42 | 43 | } 44 | 45 | message Imp { 46 | 47 | string id = 1; 48 | repeated Metric metric = 2; 49 | Banner banner = 3; 50 | Video video = 4; 51 | Audio audio = 5; 52 | Native native = 6; 53 | Pmp pmp = 7; 54 | string displaymanager = 8; 55 | string displaymanagerver = 9; 56 | int32 instl = 10; 57 | string tagid = 11; 58 | float bidfloor = 12; 59 | string bidfloorcur = 13; 60 | int32 clickbrowser = 14; 61 | int32 secure = 15; 62 | repeated string iframebuster = 16; 63 | int32 exp = 17; 64 | 65 | } 66 | 67 | message Metric { 68 | 69 | string type = 1; 70 | float value = 2; 71 | string vendor = 3; 72 | 73 | } 74 | 75 | message Banner { 76 | 77 | repeated string format = 1; 78 | int32 w = 2; 79 | int32 h = 3; 80 | repeated int32 btype = 4; 81 | repeated int32 battr = 5; 82 | int32 pos = 6; 83 | repeated string mimes = 7; 84 | int32 topframe = 8; 85 | repeated int32 expdir = 9; 86 | repeated int32 api = 10; 87 | string id = 11; 88 | int32 vcm = 12; 89 | 90 | } 91 | 92 | message Video { 93 | 94 | repeated string mimes = 1; 95 | int32 minduration = 2; 96 | int32 maxduration = 3; 97 | repeated int32 protocols = 4; 98 | int32 w = 5; 99 | int32 h = 6; 100 | int32 startdelay = 7; 101 | int32 placement = 8; 102 | int32 linearity = 9; 103 | int32 skip = 10; 104 | int32 skipmin = 11; 105 | int32 skipafter = 12; 106 | int32 sequence = 13; 107 | repeated int32 battr = 14; 108 | int32 maxextended = 15; 109 | int32 minbitrate = 16; 110 | int32 maxbitrate = 17; 111 | int32 boxingallowed = 18; 112 | repeated int32 playbackmethod = 19; 113 | int32 playbackend = 20; 114 | repeated int32 delivery = 21; 115 | int32 pos = 22; 116 | repeated Banner companionad = 23; 117 | repeated int32 api = 24; 118 | repeated int32 companiontype = 25; 119 | 120 | } 121 | 122 | message Audio { 123 | 124 | repeated string mimes = 1; 125 | int32 minduration = 2; 126 | int32 maxduration = 3; 127 | repeated int32 protocols = 4; 128 | int32 startdelay = 5; 129 | int32 sequence = 6; 130 | repeated int32 battr = 7; 131 | int32 maxextended = 8; 132 | int32 minbitrate = 9; 133 | int32 maxbitrate = 10; 134 | repeated int32 delivery = 11; 135 | repeated Banner companionad = 12; 136 | repeated int32 api = 13; 137 | repeated int32 companiontype = 14; 138 | int32 maxseq = 15; 139 | int32 feed = 16; 140 | int32 stitched = 17; 141 | int32 nvol = 18; 142 | 143 | } 144 | 145 | message Native { 146 | 147 | string request = 1; 148 | string ver = 2; 149 | repeated int32 api = 3; 150 | repeated int32 battr = 4; 151 | 152 | } 153 | 154 | message Format { 155 | 156 | int32 w = 1; 157 | int32 h = 2; 158 | int32 wratio = 3; 159 | int32 hratio = 4; 160 | int32 wmin = 5; 161 | 162 | } 163 | 164 | message Pmp { 165 | 166 | int32 private_auction = 1; 167 | repeated Deal deals = 2; 168 | 169 | } 170 | 171 | message Deal { 172 | 173 | string id = 1; 174 | float bidfloor = 2; 175 | string bidfloorcur = 3; 176 | int32 at = 4; 177 | repeated string wseat = 5; 178 | repeated string wadomain = 6; 179 | 180 | } 181 | 182 | message Site { 183 | 184 | string id = 1; 185 | string name = 2; 186 | string domain = 3; 187 | repeated string cat = 4; 188 | repeated string sectioncat = 5; 189 | repeated string pagecat = 6; 190 | string page = 7; 191 | string ref = 8; 192 | string search = 9; 193 | int32 mobile = 10; 194 | int32 privacypolicy = 11; 195 | Publisher publisher = 12; 196 | Content content = 13; 197 | string keywords = 14; 198 | 199 | } 200 | 201 | message App { 202 | 203 | string id = 1; 204 | string name = 2; 205 | string bundle = 3; 206 | string domain = 4; 207 | string storeurl = 5; 208 | repeated string cat = 6; 209 | repeated string sectioncat = 7; 210 | repeated string pagecat = 8; 211 | string ver = 9; 212 | int32 privacypolicy = 10; 213 | int32 paid = 11; 214 | Publisher publisher = 12; 215 | Content content = 13; 216 | string keywords = 14; 217 | 218 | } 219 | 220 | message Publisher { 221 | 222 | string id = 1; 223 | string name = 2; 224 | repeated string cat = 3; 225 | string domain = 4; 226 | 227 | } 228 | 229 | message Content { 230 | 231 | string id = 1; 232 | int32 episode = 2; 233 | string title = 3; 234 | string series = 4; 235 | string season = 5; 236 | string artist = 6; 237 | string genre = 7; 238 | string album = 8; 239 | string isrc = 9; 240 | Producer producer = 10; 241 | string url = 11; 242 | repeated string cat = 12; 243 | int32 prodq = 13; 244 | int32 context = 14; 245 | string contentrating = 15; 246 | string userrating = 16; 247 | int32 qagmediarating = 17; 248 | string keywords = 18; 249 | int32 livestream = 19; 250 | int32 sourcerelationship = 20; 251 | int32 len = 21; 252 | string language = 22; 253 | int32 embeddable = 23; 254 | repeated Data data = 24; 255 | 256 | } 257 | 258 | message Producer { 259 | 260 | string id = 1; 261 | string name = 2; 262 | repeated string cat = 3; 263 | string domain = 4; 264 | 265 | } 266 | 267 | message Device { 268 | 269 | string ua = 1; 270 | Geo geo = 2; 271 | int32 dnt = 3; 272 | int32 lmt = 4; 273 | string ip = 5; 274 | string ipv6 = 6; 275 | int32 devicetype = 7; 276 | string make = 8; 277 | string model = 9; 278 | string os = 10; 279 | string osv = 11; 280 | string hwv = 12; 281 | int32 h = 13; 282 | int32 w = 14; 283 | int32 ppi = 15; 284 | float pxratio = 16; 285 | int32 js = 17; 286 | int32 geofetch = 18; 287 | string flashver = 19; 288 | string language = 20; 289 | string carrier = 21; 290 | string mccmnc = 22; 291 | int32 connectiontype = 23; 292 | string ifa = 24; 293 | string didsha1 = 25; 294 | string didmd5 = 26; 295 | string dpidsha1 = 27; 296 | string dpidmd5 = 28; 297 | string macsha1 = 29; 298 | string macmd5 = 30; 299 | 300 | } 301 | 302 | message Geo { 303 | 304 | float lat = 1; 305 | float lon = 2; 306 | int32 type = 3; 307 | int32 accuracy = 4; 308 | int32 lastfix = 5; 309 | int32 ipservice = 6; 310 | string country = 7; 311 | string region = 8; 312 | string regionfips104 = 9; 313 | string metro = 10; 314 | string city = 11; 315 | string zip = 12; 316 | int32 utcoffset = 13; 317 | 318 | } 319 | 320 | message User { 321 | 322 | string id = 1; 323 | string buyeruid = 2; 324 | int32 yob = 3; 325 | string gender = 4; 326 | string keywords = 5; 327 | string customdata = 6; 328 | Geo geo = 7; 329 | repeated Data data = 8; 330 | 331 | } 332 | 333 | message Data { 334 | 335 | string id = 1; 336 | string name = 2; 337 | repeated Segment segment = 3; 338 | 339 | } 340 | 341 | message Segment { 342 | 343 | string id = 1; 344 | string name = 2; 345 | string value = 3; 346 | 347 | } -------------------------------------------------------------------------------- /quacfka-service.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description= 3 | After=network.target 4 | 5 | [Service] 6 | Type=simple 7 | WorkingDirectory=/usr/local/bin/quacfka-service 8 | ExecStart=/usr/local/bin/quacfka-service/quacfka-service 9 | TimeoutStopSec=300 10 | Restart=on-failure 11 | RestartSec=5s 12 | 13 | [Install] 14 | WantedBy=multi-user.target 15 | --------------------------------------------------------------------------------