From da838d679ae5d15236df4608852ae0de19ca116d Mon Sep 17 00:00:00 2001 From: Alex Vanderpot Date: Fri, 29 May 2026 04:14:43 -0400 Subject: [PATCH] Fix ClickHouse int encoding; generate protobuf at build time - adv_timestamp is a uint32 epoch in ClickHouse; type it uint32 (was string, which failed JSON encoding with "expected string, got "). - ClickHouse serializes UInt64/aggregate columns (count(), message_count, packet_count, advert_count) as JSON strings. Coerce every integer field with a num() helper before building int32 proto messages, fixing intermittent "expected number (int32), got \"97\"" errors on GetChat/GetNode/etc. - Stop committing generated code: gitignore src/gen and regenerate it via a `prebuild` (buf generate) step so `npm run build` always produces it. Co-Authored-By: Claude Opus 4.8 (1M context) --- meshexplorer/.gitignore | 3 + meshexplorer/package.json | 1 + meshexplorer/proto/meshexplorer/v1/node.proto | 3 +- .../src/gen/buf/validate/validate_pb.ts | 5028 ----------------- .../src/gen/meshexplorer/v1/chat_pb.ts | 292 - .../src/gen/meshexplorer/v1/common_pb.ts | 90 - .../src/gen/meshexplorer/v1/map_pb.ts | 169 - .../src/gen/meshexplorer/v1/neighbors_pb.ts | 96 - .../src/gen/meshexplorer/v1/node_pb.ts | 654 --- .../src/gen/meshexplorer/v1/packets_pb.ts | 154 - .../src/gen/meshexplorer/v1/stats_pb.ts | 224 - meshexplorer/src/server/connect/chat.ts | 3 +- meshexplorer/src/server/connect/mappers.ts | 13 +- meshexplorer/src/server/connect/node.ts | 45 +- meshexplorer/src/server/connect/packets.ts | 11 +- 15 files changed, 47 insertions(+), 6739 deletions(-) delete mode 100644 meshexplorer/src/gen/buf/validate/validate_pb.ts delete mode 100644 meshexplorer/src/gen/meshexplorer/v1/chat_pb.ts delete mode 100644 meshexplorer/src/gen/meshexplorer/v1/common_pb.ts delete mode 100644 meshexplorer/src/gen/meshexplorer/v1/map_pb.ts delete mode 100644 meshexplorer/src/gen/meshexplorer/v1/neighbors_pb.ts delete mode 100644 meshexplorer/src/gen/meshexplorer/v1/node_pb.ts delete mode 100644 meshexplorer/src/gen/meshexplorer/v1/packets_pb.ts delete mode 100644 meshexplorer/src/gen/meshexplorer/v1/stats_pb.ts diff --git a/meshexplorer/.gitignore b/meshexplorer/.gitignore index 5ef6a52..6b1ef50 100644 --- a/meshexplorer/.gitignore +++ b/meshexplorer/.gitignore @@ -39,3 +39,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# generated protobuf / ConnectRPC code (produced by `npm run generate`, run on build) +/src/gen diff --git a/meshexplorer/package.json b/meshexplorer/package.json index 0e1bfac..f6f3528 100644 --- a/meshexplorer/package.json +++ b/meshexplorer/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "dev": "next dev", + "prebuild": "buf generate --include-imports", "build": "next build", "start": "next start", "lint": "next lint", diff --git a/meshexplorer/proto/meshexplorer/v1/node.proto b/meshexplorer/proto/meshexplorer/v1/node.proto index 053492d..86b7c0d 100644 --- a/meshexplorer/proto/meshexplorer/v1/node.proto +++ b/meshexplorer/proto/meshexplorer/v1/node.proto @@ -30,7 +30,8 @@ message OriginPathPubkeyTuple { // An advert grouped by packet_hash, with all the paths it was heard over. message Advert { - string adv_timestamp = 1; + // Unix epoch seconds from the meshcore advert (uint32 in ClickHouse). + uint32 adv_timestamp = 1; repeated OriginPathPubkeyTuple origin_path_pubkey_tuples = 2; int32 advert_count = 3; string earliest_timestamp = 4; diff --git a/meshexplorer/src/gen/buf/validate/validate_pb.ts b/meshexplorer/src/gen/buf/validate/validate_pb.ts deleted file mode 100644 index 94c02e4..0000000 --- a/meshexplorer/src/gen/buf/validate/validate_pb.ts +++ /dev/null @@ -1,5028 +0,0 @@ -// Copyright 2023-2026 Buf Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none" -// @generated from file buf/validate/validate.proto (package buf.validate, syntax proto2) -/* eslint-disable */ - -// [Protovalidate](https://protovalidate.com/) is the semantic validation library for Protobuf. -// It provides standard annotations to validate common rules on messages and fields, as well as the ability to use [CEL](https://cel.dev) to write custom rules. -// It's the next generation of [protoc-gen-validate](https://github.com/bufbuild/protoc-gen-validate). -// -// This package provides the options, messages, and enums that power Protovalidate. -// Apply its options to messages, fields, and oneofs in your Protobuf schemas to add validation rules: -// -// ```proto -// message User { -// string id = 1 [(buf.validate.field).string.uuid = true]; -// string first_name = 2 [(buf.validate.field).string.max_len = 64]; -// string last_name = 3 [(buf.validate.field).string.max_len = 64]; -// -// option (buf.validate.message).cel = { -// id: "first_name_requires_last_name" -// message: "last_name must be present if first_name is present" -// expression: "!has(this.first_name) || has(this.last_name)" -// }; -// } -// ``` -// -// These rules are enforced at runtime by language-specific libraries. -// See the [developer quickstart](https://protovalidate.com/quickstart/) to get started, or go directly to the runtime library for your language: -// [Go](https://github.com/bufbuild/protovalidate-go), -// [JavaScript/TypeScript](https://github.com/bufbuild/protovalidate-es), -// [Java](https://github.com/bufbuild/protovalidate-java), -// [Python](https://github.com/bufbuild/protovalidate-python), -// or [C++](https://github.com/bufbuild/protovalidate-cc). - -import type { GenEnum, GenExtension, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; -import { enumDesc, extDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; -import type { Duration, FieldDescriptorProto_Type, FieldMask, FieldOptions, MessageOptions, OneofOptions, Timestamp } from "@bufbuild/protobuf/wkt"; -import { file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file buf/validate/validate.proto. - */ -export const file_buf_validate_validate: GenFile = /*@__PURE__*/ - fileDesc("ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSKGAQoMTWVzc2FnZVJ1bGVzEhYKDmNlbF9leHByZXNzaW9uGAUgAygJEh8KA2NlbBgDIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlEi0KBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVKBAgBEAJSCGRpc2FibGVkIjQKEE1lc3NhZ2VPbmVvZlJ1bGUSDgoGZmllbGRzGAEgAygJEhAKCHJlcXVpcmVkGAIgASgIIh4KCk9uZW9mUnVsZXMSEAoIcmVxdWlyZWQYASABKAgiiwkKCkZpZWxkUnVsZXMSFgoOY2VsX2V4cHJlc3Npb24YHSADKAkSHwoDY2VsGBcgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSEAoIcmVxdWlyZWQYGSABKAgSJAoGaWdub3JlGBsgASgOMhQuYnVmLnZhbGlkYXRlLklnbm9yZRIpCgVmbG9hdBgBIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GbG9hdFJ1bGVzSAASKwoGZG91YmxlGAIgASgLMhkuYnVmLnZhbGlkYXRlLkRvdWJsZVJ1bGVzSAASKQoFaW50MzIYAyABKAsyGC5idWYudmFsaWRhdGUuSW50MzJSdWxlc0gAEikKBWludDY0GAQgASgLMhguYnVmLnZhbGlkYXRlLkludDY0UnVsZXNIABIrCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIABIrCgZ1aW50NjQYBiABKAsyGS5idWYudmFsaWRhdGUuVUludDY0UnVsZXNIABIrCgZzaW50MzIYByABKAsyGS5idWYudmFsaWRhdGUuU0ludDMyUnVsZXNIABIrCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIABItCgdmaXhlZDMyGAkgASgLMhouYnVmLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAEi0KB2ZpeGVkNjQYCiABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQ2NFJ1bGVzSAASLwoIc2ZpeGVkMzIYCyABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkMzJSdWxlc0gAEi8KCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIABInCgRib29sGA0gASgLMhcuYnVmLnZhbGlkYXRlLkJvb2xSdWxlc0gAEisKBnN0cmluZxgOIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAEikKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIABInCgRlbnVtGBAgASgLMhcuYnVmLnZhbGlkYXRlLkVudW1SdWxlc0gAEi8KCHJlcGVhdGVkGBIgASgLMhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIABIlCgNtYXAYEyABKAsyFi5idWYudmFsaWRhdGUuTWFwUnVsZXNIABIlCgNhbnkYFCABKAsyFi5idWYudmFsaWRhdGUuQW55UnVsZXNIABIvCghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSAASMgoKZmllbGRfbWFzaxgcIAEoCzIcLmJ1Zi52YWxpZGF0ZS5GaWVsZE1hc2tSdWxlc0gAEjEKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAQgYKBHR5cGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSJVCg9QcmVkZWZpbmVkUnVsZXMSHwoDY2VsGAEgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGVKBAgYEBlKBAgaEBtSB3NraXBwZWRSDGlnbm9yZV9lbXB0eSL4FgoKRmxvYXRSdWxlcxJ9CgVjb25zdBgBIAEoAkJuwkhrCmkKC2Zsb2F0LmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSmQEKAmx0GAIgASgCQooBwkiGAQqDAQoIZmxvYXQubHQadyFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASqQEKA2x0ZRgDIAEoAkKZAcJIlQEKkgEKCWZsb2F0Lmx0ZRqEASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEtAHCgJndBgEIAEoAkLBB8JIvQcKhgEKCGZsb2F0Lmd0GnohaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq9AQoLZmxvYXQuZ3RfbHQarQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrHAQoVZmxvYXQuZ3RfbHRfZXhjbHVzaXZlGq0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzQEKDGZsb2F0Lmd0X2x0ZRq8AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCtcBChZmbG9hdC5ndF9sdGVfZXhjbHVzaXZlGrwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARKcCAoDZ3RlGAUgASgCQowIwkiICAqVAQoJZmxvYXQuZ3RlGocBIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCswBCgxmbG9hdC5ndGVfbHQauwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtYBChZmbG9hdC5ndGVfbHRfZXhjbHVzaXZlGrsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrcAQoNZmxvYXQuZ3RlX2x0ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK5gEKF2Zsb2F0Lmd0ZV9sdGVfZXhjbHVzaXZlGsoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnkKAmluGAYgAygCQm3CSGoKaAoIZmxvYXQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnAKBm5vdF9pbhgHIAMoAkJgwkhdClsKDGZsb2F0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEm8KBmZpbml0ZRgIIAEoCEJfwkhcCloKDGZsb2F0LmZpbml0ZRpKcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAnbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSKwoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIooXCgtEb3VibGVSdWxlcxJ+CgVjb25zdBgBIAEoAUJvwkhsCmoKDGRvdWJsZS5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEpoBCgJsdBgCIAEoAUKLAcJIhwEKhAEKCWRvdWJsZS5sdBp3IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKqAQoDbHRlGAMgASgBQpoBwkiWAQqTAQoKZG91YmxlLmx0ZRqEASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEtUHCgJndBgEIAEoAULGB8JIwgcKhwEKCWRvdWJsZS5ndBp6IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKvgEKDGRvdWJsZS5ndF9sdBqtAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsgBChZkb3VibGUuZ3RfbHRfZXhjbHVzaXZlGq0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzgEKDWRvdWJsZS5ndF9sdGUavAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrYAQoXZG91YmxlLmd0X2x0ZV9leGNsdXNpdmUavAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEqEICgNndGUYBSABKAFCkQjCSI0ICpYBCgpkb3VibGUuZ3RlGocBIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCs0BCg1kb3VibGUuZ3RlX2x0GrsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrXAQoXZG91YmxlLmd0ZV9sdF9leGNsdXNpdmUauwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCt0BCg5kb3VibGUuZ3RlX2x0ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK5wEKGGRvdWJsZS5ndGVfbHRlX2V4Y2x1c2l2ZRrKAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoAUJuwkhrCmkKCWRvdWJsZS5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygBQmHCSF4KXAoNZG91YmxlLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnAKBmZpbml0ZRgIIAEoCEJgwkhdClsKDWRvdWJsZS5maW5pdGUaSnJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ211c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnEiwKB2V4YW1wbGUYCSADKAFCG8JIGAoWCg5kb3VibGUuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4isBQKCkludDMyUnVsZXMSfQoFY29uc3QYASABKAVCbsJIawppCgtpbnQzMi5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEoQBCgJsdBgCIAEoBUJ2wkhzCnEKCGludDMyLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpUBCgNsdGUYAyABKAVChQHCSIEBCn8KCWludDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS+QYKAmd0GAQgASgFQuoGwkjmBgp0CghpbnQzMi5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKrQEKC2ludDMyLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq1AQoVaW50MzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKDGludDMyLmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKxQEKFmludDMyLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsUHCgNndGUYBSABKAVCtQfCSLEHCoIBCglpbnQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq8AQoMaW50MzIuZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsQBChZpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrMAQoNaW50MzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrUAQoXaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESeQoCaW4YBiADKAVCbcJIagpoCghpbnQzMi5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScAoGbm90X2luGAcgAygFQmDCSF0KWwoMaW50MzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKwoHZXhhbXBsZRgIIAMoBUIawkgXChUKDWludDMyLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIrAUCgpJbnQ2NFJ1bGVzEn0KBWNvbnN0GAEgASgDQm7CSGsKaQoLaW50NjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKEAQoCbHQYAiABKANCdsJIcwpxCghpbnQ2NC5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKVAQoDbHRlGAMgASgDQoUBwkiBAQp/CglpbnQ2NC5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEvkGCgJndBgEIAEoA0LqBsJI5gYKdAoIaW50NjQuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCq0BCgtpbnQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtQEKFWludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr0BCgxpbnQ2NC5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCsUBChZpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLFBwoDZ3RlGAUgASgDQrUHwkixBwqCAQoJaW50NjQuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvAEKDGludDY0Lmd0ZV9sdBqrAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrEAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKDWludDY0Lmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1AEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGrgBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnkKAmluGAYgAygDQm3CSGoKaAoIaW50NjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnAKBm5vdF9pbhgHIAMoA0JgwkhdClsKDGludDY0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEisKB2V4YW1wbGUYCSADKANCGsJIFwoVCg1pbnQ2NC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLCFAoLVUludDMyUnVsZXMSfgoFY29uc3QYASABKA1Cb8JIbApqCgx1aW50MzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKFAQoCbHQYAiABKA1Cd8JIdApyCgl1aW50MzIubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASlwEKA2x0ZRgDIAEoDUKHAcJIgwEKgAEKCnVpbnQzMi5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEv4GCgJndBgEIAEoDULvBsJI6wYKdQoJdWludDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwquAQoMdWludDMyLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq2AQoWdWludDMyLmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BCg11aW50MzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrGAQoXdWludDMyLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsoHCgNndGUYBSABKA1CugfCSLYHCoMBCgp1aW50MzIuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvQEKDXVpbnQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxQEKF3VpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoOdWludDMyLmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1QEKGHVpbnQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoDUJuwkhrCmkKCXVpbnQzMi5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygNQmHCSF4KXAoNdWludDMyLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKA1CG8JIGAoWCg51aW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwhQKC1VJbnQ2NFJ1bGVzEn4KBWNvbnN0GAEgASgEQm/CSGwKagoMdWludDY0LmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycShQEKAmx0GAIgASgEQnfCSHQKcgoJdWludDY0Lmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpcBCgNsdGUYAyABKARChwHCSIMBCoABCgp1aW50NjQubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABL+BgoCZ3QYBCABKARC7wbCSOsGCnUKCXVpbnQ2NC5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKrgEKDHVpbnQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtgEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoNdWludDY0Lmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKxgEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLKBwoDZ3RlGAUgASgEQroHwki2BwqDAQoKdWludDY0Lmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr0BCg11aW50NjQuZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsUBChd1aW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKDnVpbnQ2NC5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtUBChh1aW50NjQuZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESegoCaW4YBiADKARCbsJIawppCgl1aW50NjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnEKBm5vdF9pbhgHIAMoBEJhwkheClwKDXVpbnQ2NC5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIsCgdleGFtcGxlGAggAygEQhvCSBgKFgoOdWludDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsIUCgtTSW50MzJSdWxlcxJ+CgVjb25zdBgBIAEoEUJvwkhsCmoKDHNpbnQzMi5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEoUBCgJsdBgCIAEoEUJ3wkh0CnIKCXNpbnQzMi5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKXAQoDbHRlGAMgASgRQocBwkiDAQqAAQoKc2ludDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS/gYKAmd0GAQgASgRQu8GwkjrBgp1CglzaW50MzIuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCq4BCgxzaW50MzIuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrYBChZzaW50MzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKDXNpbnQzMi5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCsYBChdzaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESygcKA2d0ZRgFIAEoEUK6B8JItgcKgwEKCnNpbnQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq9AQoNc2ludDMyLmd0ZV9sdBqrAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrFAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BCg5zaW50MzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrVAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGrgBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEnoKAmluGAYgAygRQm7CSGsKaQoJc2ludDMyLmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJxCgZub3RfaW4YByADKBFCYcJIXgpcCg1zaW50MzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLAoHZXhhbXBsZRgIIAMoEUIbwkgYChYKDnNpbnQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLCFAoLU0ludDY0UnVsZXMSfgoFY29uc3QYASABKBJCb8JIbApqCgxzaW50NjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKFAQoCbHQYAiABKBJCd8JIdApyCglzaW50NjQubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASlwEKA2x0ZRgDIAEoEkKHAcJIgwEKgAEKCnNpbnQ2NC5sdGUaciFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEv4GCgJndBgEIAEoEkLvBsJI6wYKdQoJc2ludDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwquAQoMc2ludDY0Lmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq2AQoWc2ludDY0Lmd0X2x0X2V4Y2x1c2l2ZRqbAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BCg1zaW50NjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrGAQoXc2ludDY0Lmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEsoHCgNndGUYBSABKBJCugfCSLYHCoMBCgpzaW50NjQuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKvQEKDXNpbnQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxQEKF3NpbnQ2NC5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoOc2ludDY0Lmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK1QEKGHNpbnQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ6CgJpbhgGIAMoEkJuwkhrCmkKCXNpbnQ2NC5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAcgAygSQmHCSF4KXAoNc2ludDY0Lm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBJCG8JIGAoWCg5zaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i0xQKDEZpeGVkMzJSdWxlcxJ/CgVjb25zdBgBIAEoB0JwwkhtCmsKDWZpeGVkMzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKGAQoCbHQYAiABKAdCeMJIdQpzCgpmaXhlZDMyLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpgBCgNsdGUYAyABKAdCiAHCSIQBCoEBCgtmaXhlZDMyLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASgwcKAmd0GAQgASgHQvQGwkjwBgp2CgpmaXhlZDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqvAQoNZml4ZWQzMi5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtwEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvwEKDmZpeGVkMzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrHAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLPBwoDZ3RlGAUgASgHQr8Hwki7BwqEAQoLZml4ZWQzMi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq+AQoOZml4ZWQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxgEKGGZpeGVkMzIuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKD2ZpeGVkMzIuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrWAQoZZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ7CgJpbhgGIAMoB0JvwkhsCmoKCmZpeGVkMzIuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnIKBm5vdF9pbhgHIAMoB0JiwkhfCl0KDmZpeGVkMzIubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoB0IcwkgZChcKD2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i0xQKDEZpeGVkNjRSdWxlcxJ/CgVjb25zdBgBIAEoBkJwwkhtCmsKDWZpeGVkNjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKGAQoCbHQYAiABKAZCeMJIdQpzCgpmaXhlZDY0Lmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEpgBCgNsdGUYAyABKAZCiAHCSIQBCoEBCgtmaXhlZDY0Lmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASgwcKAmd0GAQgASgGQvQGwkjwBgp2CgpmaXhlZDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqvAQoNZml4ZWQ2NC5ndF9sdBqdAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKtwEKF2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvwEKDmZpeGVkNjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrHAQoYZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGqoBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLPBwoDZ3RlGAUgASgGQr8Hwki7BwqEAQoLZml4ZWQ2NC5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq+AQoOZml4ZWQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxgEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqpAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKD2ZpeGVkNjQuZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrWAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ7CgJpbhgGIAMoBkJvwkhsCmoKCmZpeGVkNjQuaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnIKBm5vdF9pbhgHIAMoBkJiwkhfCl0KDmZpeGVkNjQubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSLQoHZXhhbXBsZRgIIAMoBkIcwkgZChcKD2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i5RQKDVNGaXhlZDMyUnVsZXMSgAEKBWNvbnN0GAEgASgPQnHCSG4KbAoOc2ZpeGVkMzIuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKHAQoCbHQYAiABKA9CecJIdgp0CgtzZml4ZWQzMi5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKZAQoDbHRlGAMgASgPQokBwkiFAQqCAQoMc2ZpeGVkMzIubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKIBwoCZ3QYBCABKA9C+QbCSPUGCncKC3NmaXhlZDMyLmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqwAQoOc2ZpeGVkMzIuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrgBChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrAAQoPc2ZpeGVkMzIuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrIAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES1AcKA2d0ZRgFIAEoD0LEB8JIwAcKhQEKDHNmaXhlZDMyLmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr8BCg9zZml4ZWQzMi5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxwEKGXNmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs8BChBzZml4ZWQzMi5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtcBChpzZml4ZWQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ8CgJpbhgGIAMoD0JwwkhtCmsKC3NmaXhlZDMyLmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJzCgZub3RfaW4YByADKA9CY8JIYApeCg9zZml4ZWQzMi5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygPQh3CSBoKGAoQc2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i5RQKDVNGaXhlZDY0UnVsZXMSgAEKBWNvbnN0GAEgASgQQnHCSG4KbAoOc2ZpeGVkNjQuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKHAQoCbHQYAiABKBBCecJIdgp0CgtzZml4ZWQ2NC5sdBplIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICdtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKZAQoDbHRlGAMgASgQQokBwkiFAQqCAQoMc2ZpeGVkNjQubHRlGnIhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ211c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKIBwoCZ3QYBCABKBBC+QbCSPUGCncKC3NmaXhlZDY0Lmd0GmghaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqwAQoOc2ZpeGVkNjQuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrgBChhzZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUamwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrAAQoPc2ZpeGVkNjQuZ3RfbHRlGqwBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrIAQoZc2ZpeGVkNjQuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES1AcKA2d0ZRgFIAEoEELEB8JIwAcKhQEKDHNmaXhlZDY0Lmd0ZRp1IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCr8BCg9zZml4ZWQ2NC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKxwEKGXNmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmUaqQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs8BChBzZml4ZWQ2NC5ndGVfbHRlGroBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtcBChpzZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ8CgJpbhgGIAMoEEJwwkhtCmsKC3NmaXhlZDY0LmluGlwhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJzCgZub3RfaW4YByADKBBCY8JIYApeCg9zZml4ZWQ2NC5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iwAEKCUJvb2xSdWxlcxJ8CgVjb25zdBgBIAEoCEJtwkhqCmgKCmJvb2wuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxIqCgdleGFtcGxlGAIgAygIQhnCSBYKFAoMYm9vbC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIi6jwKC1N0cmluZ1J1bGVzEoABCgVjb25zdBgBIAEoCUJxwkhuCmwKDHN0cmluZy5jb25zdBpcdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCBgJXNgJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycScQoDbGVuGBMgASgEQmTCSGEKXwoKc3RyaW5nLmxlbhpRdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ211c3QgYmUgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5sZW5dKSA6ICcnEokBCgdtaW5fbGVuGAIgASgEQnjCSHUKcwoOc3RyaW5nLm1pbl9sZW4aYXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICdtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSiAEKB21heF9sZW4YAyABKARCd8JIdApyCg5zdHJpbmcubWF4X2xlbhpgdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ211c3QgYmUgYXQgbW9zdCAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEosBCglsZW5fYnl0ZXMYFCABKARCeMJIdQpzChBzdHJpbmcubGVuX2J5dGVzGl91aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ211c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuX2J5dGVzXSkgOiAnJxKUAQoJbWluX2J5dGVzGAQgASgEQoABwkh9CnsKEHN0cmluZy5taW5fYnl0ZXMaZ3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9ieXRlcyA/ICdtdXN0IGJlIGF0IGxlYXN0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1pbl9ieXRlc10pIDogJycSkgEKCW1heF9ieXRlcxgFIAEoBEJ/wkh8CnoKEHN0cmluZy5tYXhfYnl0ZXMaZnVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICdtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2J5dGVzXSkgOiAnJxKHAQoHcGF0dGVybhgGIAEoCUJ2wkhzCnEKDnN0cmluZy5wYXR0ZXJuGl8hdGhpcy5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ2RvZXMgbm90IG1hdGNoIHJlZ2V4IHBhdHRlcm4gYCVzYCcuZm9ybWF0KFtydWxlcy5wYXR0ZXJuXSkgOiAnJxJ+CgZwcmVmaXgYByABKAlCbsJIawppCg1zdHJpbmcucHJlZml4GlghdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAnZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEnwKBnN1ZmZpeBgIIAEoCUJswkhpCmcKDXN0cmluZy5zdWZmaXgaViF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAnZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnEooBCghjb250YWlucxgJIAEoCUJ4wkh1CnMKD3N0cmluZy5jb250YWlucxpgIXRoaXMuY29udGFpbnMocnVsZXMuY29udGFpbnMpID8gJ2RvZXMgbm90IGNvbnRhaW4gc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMuY29udGFpbnNdKSA6ICcnEpEBCgxub3RfY29udGFpbnMYFyABKAlCe8JIeAp2ChNzdHJpbmcubm90X2NvbnRhaW5zGl90aGlzLmNvbnRhaW5zKHJ1bGVzLm5vdF9jb250YWlucykgPyAnY29udGFpbnMgc3Vic3RyaW5nIGAlc2AnLmZvcm1hdChbcnVsZXMubm90X2NvbnRhaW5zXSkgOiAnJxJ6CgJpbhgKIAMoCUJuwkhrCmkKCXN0cmluZy5pbhpcISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAnbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycScQoGbm90X2luGAsgAygJQmHCSF4KXAoNc3RyaW5nLm5vdF9pbhpLdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAnbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEtkBCgVlbWFpbBgMIAEoCELHAcJIwwEKWwoMc3RyaW5nLmVtYWlsEh1tdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcxosIXJ1bGVzLmVtYWlsIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0VtYWlsKCkKZAoSc3RyaW5nLmVtYWlsX2VtcHR5EjJ2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcxoaIXJ1bGVzLmVtYWlsIHx8IHRoaXMgIT0gJydIABLhAQoIaG9zdG5hbWUYDSABKAhCzAHCSMgBCl8KD3N0cmluZy5ob3N0bmFtZRIYbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIABLBAQoCaXAYDiABKAhCsgHCSK4BCk8KCXN0cmluZy5pcBIabXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MaJiFydWxlcy5pcCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCgpClsKD3N0cmluZy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaFyFydWxlcy5pcCB8fCB0aGlzICE9ICcnSAAS0AEKBGlwdjQYDyABKAhCvwHCSLsBClYKC3N0cmluZy5pcHY0EhxtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzGikhcnVsZXMuaXB2NCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg0KQphChFzdHJpbmcuaXB2NF9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcxoZIXJ1bGVzLmlwdjQgfHwgdGhpcyAhPSAnJ0gAEtABCgRpcHY2GBAgASgIQr8Bwki7AQpWCgtzdHJpbmcuaXB2NhIcbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxopIXJ1bGVzLmlwdjYgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoNikKYQoRc3RyaW5nLmlwdjZfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MaGSFydWxlcy5pcHY2IHx8IHRoaXMgIT0gJydIABK5AQoDdXJpGBEgASgIQqkBwkilAQpLCgpzdHJpbmcudXJpEhNtdXN0IGJlIGEgdmFsaWQgVVJJGighcnVsZXMudXJpIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc1VyaSgpClYKEHN0cmluZy51cmlfZW1wdHkSKHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVUkkaGCFydWxlcy51cmkgfHwgdGhpcyAhPSAnJ0gAEmoKB3VyaV9yZWYYEiABKAhCV8JIVApSCg5zdHJpbmcudXJpX3JlZhIdbXVzdCBiZSBhIHZhbGlkIFVSSSBSZWZlcmVuY2UaISFydWxlcy51cmlfcmVmIHx8IHRoaXMuaXNVcmlSZWYoKUgAEokCCgdhZGRyZXNzGBUgASgIQvUBwkjxAQp7Cg5zdHJpbmcuYWRkcmVzcxInbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGkAhcnVsZXMuYWRkcmVzcyB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0bmFtZSgpIHx8IHRoaXMuaXNJcCgpCnIKFHN0cmluZy5hZGRyZXNzX2VtcHR5Ejx2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgaG9zdG5hbWUsIG9yIGlwIGFkZHJlc3MaHCFydWxlcy5hZGRyZXNzIHx8IHRoaXMgIT0gJydIABKSAgoEdXVpZBgWIAEoCEKBAsJI/QEKnwEKC3N0cmluZy51dWlkEhRtdXN0IGJlIGEgdmFsaWQgVVVJRBp6IXJ1bGVzLnV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykKWQoRc3RyaW5nLnV1aWRfZW1wdHkSKXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVVUlEGhkhcnVsZXMudXVpZCB8fCB0aGlzICE9ICcnSAAS6gEKBXR1dWlkGCEgASgIQtgBwkjUAQptCgxzdHJpbmcudHV1aWQSHG11c3QgYmUgYSB2YWxpZCB0cmltbWVkIFVVSUQaPyFydWxlcy50dXVpZCB8fCB0aGlzID09ICcnIHx8IHRoaXMubWF0Y2hlcygnXlswLTlhLWZBLUZdezMyfSQnKQpjChJzdHJpbmcudHV1aWRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCB0cmltbWVkIFVVSUQaGiFydWxlcy50dXVpZCB8fCB0aGlzICE9ICcnSAASkAIKEWlwX3dpdGhfcHJlZml4bGVuGBogASgIQvIBwkjuAQpyChhzdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW4SGW11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaOyFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCgpCngKHnN0cmluZy5pcF93aXRoX3ByZWZpeGxlbl9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBomIXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLJAgoTaXB2NF93aXRoX3ByZWZpeGxlbhgbIAEoCEKpAsJIpQIKjQEKGnN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuEi9tdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCkKkgEKIHN0cmluZy5pcHY0X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjRfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEskCChNpcHY2X3dpdGhfcHJlZml4bGVuGBwgASgIQqkCwkilAgqNAQoac3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW4SL211c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGj4hcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2KQqSAQogc3RyaW5nLmlwdjZfd2l0aF9wcmVmaXhsZW5fZW1wdHkSRHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3Mgd2l0aCBwcmVmaXggbGVuZ3RoGighcnVsZXMuaXB2Nl93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAAS7AEKCWlwX3ByZWZpeBgdIAEoCELWAcJI0gEKZgoQc3RyaW5nLmlwX3ByZWZpeBIZbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIABL9AQoLaXB2NF9wcmVmaXgYHiABKAhC5QHCSOEBCm8KEnN0cmluZy5pcHY0X3ByZWZpeBIbbXVzdCBiZSBhIHZhbGlkIElQdjQgcHJlZml4GjwhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNCwgdHJ1ZSkKbgoYc3RyaW5nLmlwdjRfcHJlZml4X2VtcHR5EjB2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBwcmVmaXgaICFydWxlcy5pcHY0X3ByZWZpeCB8fCB0aGlzICE9ICcnSAAS/QEKC2lwdjZfcHJlZml4GB8gASgIQuUBwkjhAQpvChJzdHJpbmcuaXB2Nl9wcmVmaXgSG211c3QgYmUgYSB2YWxpZCBJUHY2IHByZWZpeBo8IXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYsIHRydWUpCm4KGHN0cmluZy5pcHY2X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgcHJlZml4GiAhcnVsZXMuaXB2Nl9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAEq8CCg1ob3N0X2FuZF9wb3J0GCAgASgIQpUCwkiRAgqTAQoUc3RyaW5nLmhvc3RfYW5kX3BvcnQSO211c3QgYmUgYSB2YWxpZCBob3N0IChob3N0bmFtZSBvciBJUCBhZGRyZXNzKSBhbmQgcG9ydCBwYWlyGj4hcnVsZXMuaG9zdF9hbmRfcG9ydCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNIb3N0QW5kUG9ydCh0cnVlKQp5ChpzdHJpbmcuaG9zdF9hbmRfcG9ydF9lbXB0eRI3dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3QgYW5kIHBvcnQgcGFpchoiIXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyAhPSAnJ0gAEu4BCgR1bGlkGCMgASgIQt0BwkjZAQp8CgtzdHJpbmcudWxpZBIUbXVzdCBiZSBhIHZhbGlkIFVMSUQaVyFydWxlcy51bGlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtN11bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI1fSQnKQpZChFzdHJpbmcudWxpZF9lbXB0eRIpdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVMSUQaGSFydWxlcy51bGlkIHx8IHRoaXMgIT0gJydIABLUAgoMcHJvdG9idWZfZnFuGCUgASgIQrsCwki3AgqvAQoTc3RyaW5nLnByb3RvYnVmX2ZxbhItbXVzdCBiZSBhIHZhbGlkIGZ1bGx5LXF1YWxpZmllZCBQcm90b2J1ZiBuYW1lGmkhcnVsZXMucHJvdG9idWZfZnFuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeW0EtWmEtel9dW0EtWmEtel8wLTldKihcXC5bQS1aYS16X11bQS1aYS16XzAtOV0qKSokJykKggEKGXN0cmluZy5wcm90b2J1Zl9mcW5fZW1wdHkSQnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgUHJvdG9idWYgbmFtZRohIXJ1bGVzLnByb3RvYnVmX2ZxbiB8fCB0aGlzICE9ICcnSAASkQMKEHByb3RvYnVmX2RvdF9mcW4YJiABKAhC9ALCSPACCs0BChdzdHJpbmcucHJvdG9idWZfZG90X2ZxbhJAbXVzdCBiZSBhIHZhbGlkIGZ1bGx5LXF1YWxpZmllZCBQcm90b2J1ZiBuYW1lIHdpdGggYSBsZWFkaW5nIGRvdBpwIXJ1bGVzLnByb3RvYnVmX2RvdF9mcW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15cXC5bQS1aYS16X11bQS1aYS16XzAtOV0qKFxcLltBLVphLXpfXVtBLVphLXpfMC05XSopKiQnKQqdAQodc3RyaW5nLnByb3RvYnVmX2RvdF9mcW5fZW1wdHkSVXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgUHJvdG9idWYgbmFtZSB3aXRoIGEgbGVhZGluZyBkb3QaJSFydWxlcy5wcm90b2J1Zl9kb3RfZnFuIHx8IHRoaXMgIT0gJydIABKcBQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QuUEwkjhBArqAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrhAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEiFtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAEg4KBnN0cmljdBgZIAEoCBIsCgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIt0RCgpCeXRlc1J1bGVzEnoKBWNvbnN0GAEgASgMQmvCSGgKZgoLYnl0ZXMuY29uc3QaV3RoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgYmUgJXgnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxJrCgNsZW4YDSABKARCXsJIWwpZCglieXRlcy5sZW4aTHVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICdtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSgwEKB21pbl9sZW4YAiABKARCcsJIbwptCg1ieXRlcy5taW5fbGVuGlx1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAnbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKCAQoHbWF4X2xlbhgDIAEoBEJxwkhuCmwKDWJ5dGVzLm1heF9sZW4aW3VpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICdtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSigEKB3BhdHRlcm4YBCABKAlCecJIdgp0Cg1ieXRlcy5wYXR0ZXJuGmMhc3RyaW5nKHRoaXMpLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAnbXVzdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycSewoGcHJlZml4GAUgASgMQmvCSGgKZgoMYnl0ZXMucHJlZml4GlYhdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAnZG9lcyBub3QgaGF2ZSBwcmVmaXggJXgnLmZvcm1hdChbcnVsZXMucHJlZml4XSkgOiAnJxJ5CgZzdWZmaXgYBiABKAxCacJIZgpkCgxieXRlcy5zdWZmaXgaVCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAnZG9lcyBub3QgaGF2ZSBzdWZmaXggJXgnLmZvcm1hdChbcnVsZXMuc3VmZml4XSkgOiAnJxJ9Cghjb250YWlucxgHIAEoDEJrwkhoCmYKDmJ5dGVzLmNvbnRhaW5zGlQhdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAnZG9lcyBub3QgY29udGFpbiAleCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJycSoQEKAmluGAggAygMQpQBwkiQAQqNAQoIYnl0ZXMuaW4agAFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICdtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJwCgZub3RfaW4YCSADKAxCYMJIXQpbCgxieXRlcy5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxLlAQoCaXAYCiABKAhC1gHCSNIBCm4KCGJ5dGVzLmlwEhptdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcxpGIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNCB8fCB0aGlzLnNpemUoKSA9PSAxNgpgCg5ieXRlcy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaHSFydWxlcy5pcCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS3gEKBGlwdjQYCyABKAhCzQHCSMkBCl8KCmJ5dGVzLmlwdjQSHG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSAAS3wEKBGlwdjYYDCABKAhCzgHCSMoBCmAKCmJ5dGVzLmlwdjYSHG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAEs8BCgR1dWlkGA8gASgIQr4Bwki6AQpYCgpieXRlcy51dWlkEhRtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAEisKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biLBAwoJRW51bVJ1bGVzEnwKBWNvbnN0GAEgASgFQm3CSGoKaAoKZW51bS5jb25zdBpadGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAnbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEhQKDGRlZmluZWRfb25seRgCIAEoCBJ4CgJpbhgDIAMoBUJswkhpCmcKB2VudW0uaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEm8KBm5vdF9pbhgEIAMoBUJfwkhcCloKC2VudW0ubm90X2luGkt0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICdtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKgoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIu0DCg1SZXBlYXRlZFJ1bGVzEpYBCgltaW5faXRlbXMYASABKARCggHCSH8KfQoScmVwZWF0ZWQubWluX2l0ZW1zGmd1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9pdGVtcyA/ICdtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJWQgaXRlbShzKScuZm9ybWF0KFtydWxlcy5taW5faXRlbXNdKSA6ICcnEpwBCgltYXhfaXRlbXMYAiABKARCiAHCSIQBCoEBChJyZXBlYXRlZC5tYXhfaXRlbXMaa3VpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ211c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnEnAKBnVuaXF1ZRgDIAEoCEJgwkhdClsKD3JlcGVhdGVkLnVuaXF1ZRIocmVwZWF0ZWQgdmFsdWUgbXVzdCBjb250YWluIHVuaXF1ZSBpdGVtcxoeIXJ1bGVzLnVuaXF1ZSB8fCB0aGlzLnVuaXF1ZSgpEicKBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiKKAwoITWFwUnVsZXMSjwEKCW1pbl9wYWlycxgBIAEoBEJ8wkh5CncKDW1hcC5taW5fcGFpcnMaZnVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX3BhaXJzID8gJ21hcCBtdXN0IGJlIGF0IGxlYXN0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWluX3BhaXJzXSkgOiAnJxKOAQoJbWF4X3BhaXJzGAIgASgEQnvCSHgKdgoNbWFwLm1heF9wYWlycxpldWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbW9zdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1heF9wYWlyc10pIDogJycSJgoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzEigKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzKgkI6AcQgICAgAIiJgoIQW55UnVsZXMSCgoCaW4YAiADKAkSDgoGbm90X2luGAMgAygJIr8WCg1EdXJhdGlvblJ1bGVzEpsBCgVjb25zdBgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJxwkhuCmwKDmR1cmF0aW9uLmNvbnN0Glp0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICdtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSogEKAmx0GAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnnCSHYKdAoLZHVyYXRpb24ubHQaZSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAnbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAAStAEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKJAcJIhQEKggEKDGR1cmF0aW9uLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASowcKAmd0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQvkGwkj1Bgp3CgtkdXJhdGlvbi5ndBpoIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKsAEKDmR1cmF0aW9uLmd0X2x0Gp0BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq4AQoYZHVyYXRpb24uZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwAEKD2R1cmF0aW9uLmd0X2x0ZRqsAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKyAEKGWR1cmF0aW9uLmd0X2x0ZV9leGNsdXNpdmUaqgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEu8HCgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CxAfCSMAHCoUBCgxkdXJhdGlvbi5ndGUadSFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwq/AQoPZHVyYXRpb24uZ3RlX2x0GqsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCscBChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrPAQoQZHVyYXRpb24uZ3RlX2x0ZRq6AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrXAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUauAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESlwEKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnDCSG0KawoLZHVyYXRpb24uaW4aXCEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ211c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEo4BCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CY8JIYApeCg9kdXJhdGlvbi5ub3RfaW4aS3RoaXMgaW4gcnVsZXMubm90X2luID8gJ211c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxJJCgdleGFtcGxlGAkgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQh3CSBoKGAoQZHVyYXRpb24uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i6wUKDkZpZWxkTWFza1J1bGVzErkBCgVjb25zdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCjQHCSIkBCoYBChBmaWVsZF9tYXNrLmNvbnN0GnJ0aGlzLnBhdGhzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRocyA/ICdtdXN0IGVxdWFsIHBhdGhzICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKS5wYXRoc10pIDogJycS0wEKAmluGAIgAygJQsYBwkjCAQq/AQoNZmllbGRfbWFzay5pbhqtASF0aGlzLnBhdGhzLmFsbChwLCBwIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ2luJykuZXhpc3RzKGYsIHAuc3RhcnRzV2l0aChmKycuJykpKSA/ICdtdXN0IG9ubHkgY29udGFpbiBwYXRocyBpbiAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEu0BCgZub3RfaW4YAyADKAlC3AHCSNgBCtUBChFmaWVsZF9tYXNrLm5vdF9pbhq/ASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ211c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnEkwKB2V4YW1wbGUYBCADKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQh/CSBwKGgoSZmllbGRfbWFzay5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAIisBcKDlRpbWVzdGFtcFJ1bGVzEp0BCgVjb25zdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCcsJIbwptCg90aW1lc3RhbXAuY29uc3QaWnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ211c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKkAQoCbHQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQnrCSHcKdQoMdGltZXN0YW1wLmx0GmUhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ211c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAErYBCgNsdGUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQooBwkiGAQqDAQoNdGltZXN0YW1wLmx0ZRpyIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASZgoGbHRfbm93GAcgASgIQlTCSFEKTwoQdGltZXN0YW1wLmx0X25vdxo7KHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICdtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIABKpBwoCZ3QYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQv4Gwkj6Bgp4Cgx0aW1lc3RhbXAuZ3QaaCFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrEBCg90aW1lc3RhbXAuZ3RfbHQanQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrkBChl0aW1lc3RhbXAuZ3RfbHRfZXhjbHVzaXZlGpsBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwQEKEHRpbWVzdGFtcC5ndF9sdGUarAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICdtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCskBChp0aW1lc3RhbXAuZ3RfbHRlX2V4Y2x1c2l2ZRqqAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES9QcKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCyQfCSMUHCoYBCg10aW1lc3RhbXAuZ3RlGnUhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwAEKEHRpbWVzdGFtcC5ndGVfbHQaqwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKyAEKGnRpbWVzdGFtcC5ndGVfbHRfZXhjbHVzaXZlGqkBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrQAQoRdGltZXN0YW1wLmd0ZV9sdGUaugFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAnbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2AEKG3RpbWVzdGFtcC5ndGVfbHRlX2V4Y2x1c2l2ZRq4AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJpCgZndF9ub3cYCCABKAhCV8JIVApSChB0aW1lc3RhbXAuZ3Rfbm93Gj4ocnVsZXMuZ3Rfbm93ICYmIHRoaXMgPCBub3cpID8gJ211c3QgYmUgZ3JlYXRlciB0aGFuIG5vdycgOiAnJ0gBErEBCgZ3aXRoaW4YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ChQHCSIEBCn8KEHRpbWVzdGFtcC53aXRoaW4aa3RoaXMgPCBub3ctcnVsZXMud2l0aGluIHx8IHRoaXMgPiBub3crcnVsZXMud2l0aGluID8gJ211c3QgYmUgd2l0aGluICVzIG9mIG5vdycuZm9ybWF0KFtydWxlcy53aXRoaW5dKSA6ICcnEksKB2V4YW1wbGUYCiADKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQh7CSBsKGQoRdGltZXN0YW1wLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIjkKClZpb2xhdGlvbnMSKwoKdmlvbGF0aW9ucxgBIAMoCzIXLmJ1Zi52YWxpZGF0ZS5WaW9sYXRpb24inwEKCVZpb2xhdGlvbhImCgVmaWVsZBgFIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGgSJQoEcnVsZRgGIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGgSDwoHcnVsZV9pZBgCIAEoCRIPCgdtZXNzYWdlGAMgASgJEg8KB2Zvcl9rZXkYBCABKAhKBAgBEAJSCmZpZWxkX3BhdGgiPQoJRmllbGRQYXRoEjAKCGVsZW1lbnRzGAEgAygLMh4uYnVmLnZhbGlkYXRlLkZpZWxkUGF0aEVsZW1lbnQi6QIKEEZpZWxkUGF0aEVsZW1lbnQSFAoMZmllbGRfbnVtYmVyGAEgASgFEhIKCmZpZWxkX25hbWUYAiABKAkSPgoKZmllbGRfdHlwZRgDIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEjwKCGtleV90eXBlGAQgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUSPgoKdmFsdWVfdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEg8KBWluZGV4GAYgASgESAASEgoIYm9vbF9rZXkYByABKAhIABIRCgdpbnRfa2V5GAggASgDSAASEgoIdWludF9rZXkYCSABKARIABIUCgpzdHJpbmdfa2V5GAogASgJSABCCwoJc3Vic2NyaXB0KqEBCgZJZ25vcmUSFgoSSUdOT1JFX1VOU1BFQ0lGSUVEEAASGAoUSUdOT1JFX0lGX1pFUk9fVkFMVUUQARIRCg1JR05PUkVfQUxXQVlTEAMiBAgCEAIqDElHTk9SRV9FTVBUWSoOSUdOT1JFX0RFRkFVTFQqF0lHTk9SRV9JRl9ERUZBVUxUX1ZBTFVFKhVJR05PUkVfSUZfVU5QT1BVTEFURUQqbgoKS25vd25SZWdleBIbChdLTk9XTl9SRUdFWF9VTlNQRUNJRklFRBAAEiAKHEtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX05BTUUQARIhCh1LTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9WQUxVRRACOlYKB21lc3NhZ2USHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYhwkgASgLMhouYnVmLnZhbGlkYXRlLk1lc3NhZ2VSdWxlc1IHbWVzc2FnZTpOCgVvbmVvZhIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYhwkgASgLMhguYnVmLnZhbGlkYXRlLk9uZW9mUnVsZXNSBW9uZW9mOk4KBWZpZWxkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuRmllbGRSdWxlc1IFZmllbGQ6XQoKcHJlZGVmaW5lZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYiAkgASgLMh0uYnVmLnZhbGlkYXRlLlByZWRlZmluZWRSdWxlc1IKcHJlZGVmaW5lZEJuChJidWlsZC5idWYudmFsaWRhdGVCDVZhbGlkYXRlUHJvdG9QAVpHYnVmLmJ1aWxkL2dlbi9nby9idWZidWlsZC9wcm90b3ZhbGlkYXRlL3Byb3RvY29sYnVmZmVycy9nby9idWYvdmFsaWRhdGU", [file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); - -/** - * `Rule` represents a validation rule written in the Common Expression - * Language (CEL) syntax. Each Rule includes a unique identifier, an - * optional error message, and the CEL expression to evaluate. For more - * information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/). - * - * ```proto - * message Foo { - * option (buf.validate.message).cel = { - * id: "foo.bar" - * message: "bar must be greater than 0" - * expression: "this.bar > 0" - * }; - * int32 bar = 1; - * } - * ``` - * - * @generated from message buf.validate.Rule - */ -export type Rule = Message<"buf.validate.Rule"> & { - /** - * `id` is a string that serves as a machine-readable name for this Rule. - * It should be unique within its scope, which could be either a message or a field. - * - * @generated from field: optional string id = 1; - */ - id: string; - - /** - * `message` is an optional field that provides a human-readable error message - * for this Rule when the CEL expression evaluates to false. If a - * non-empty message is provided, any strings resulting from the CEL - * expression evaluation are ignored. - * - * @generated from field: optional string message = 2; - */ - message: string; - - /** - * `expression` is the actual CEL expression that will be evaluated for - * validation. This string must resolve to either a boolean or a string - * value. If the expression evaluates to false or a non-empty string, the - * validation is considered failed, and the message is rejected. - * - * @generated from field: optional string expression = 3; - */ - expression: string; -}; - -/** - * Describes the message buf.validate.Rule. - * Use `create(RuleSchema)` to create a new message. - */ -export const RuleSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 0); - -/** - * MessageRules represents validation rules that are applied to the entire message. - * It includes disabling options and a list of Rule messages representing Common Expression Language (CEL) validation rules. - * - * @generated from message buf.validate.MessageRules - */ -export type MessageRules = Message<"buf.validate.MessageRules"> & { - /** - * `cel_expression` is a repeated field CEL expressions. Each expression specifies a validation - * rule to be applied to this message. These rules are written in Common Expression Language (CEL) syntax. - * - * This is a simplified form of the `cel` Rule field, where only `expression` is set. This allows for - * simpler syntax when defining CEL Rules where `id` and `message` derived from the `expression`. `id` will - * be same as the `expression`. - * - * For more information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/). - * - * ```proto - * message MyMessage { - * // The field `foo` must be greater than 42. - * option (buf.validate.message).cel_expression = "this.foo > 42"; - * // The field `foo` must be less than 84. - * option (buf.validate.message).cel_expression = "this.foo < 84"; - * optional int32 foo = 1; - * } - * ``` - * - * @generated from field: repeated string cel_expression = 5; - */ - celExpression: string[]; - - /** - * `cel` is a repeated field of type Rule. Each Rule specifies a validation rule to be applied to this message. - * These rules are written in Common Expression Language (CEL) syntax. For more information, - * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/). - * - * - * ```proto - * message MyMessage { - * // The field `foo` must be greater than 42. - * option (buf.validate.message).cel = { - * id: "my_message.value", - * message: "must be greater than 42", - * expression: "this.foo > 42", - * }; - * optional int32 foo = 1; - * } - * ``` - * - * @generated from field: repeated buf.validate.Rule cel = 3; - */ - cel: Rule[]; - - /** - * `oneof` is a repeated field of type MessageOneofRule that specifies a list of fields - * of which at most one can be present. If `required` is also specified, then exactly one - * of the specified fields _must_ be present. - * - * This will enforce oneof-like constraints with a few features not provided by - * actual Protobuf oneof declarations: - * 1. Repeated and map fields are allowed in this validation. In a Protobuf oneof, - * only scalar fields are allowed. - * 2. Fields with implicit presence are allowed. In a Protobuf oneof, all member - * fields have explicit presence. This means that, for the purpose of determining - * how many fields are set, explicitly setting such a field to its zero value is - * effectively the same as not setting it at all. - * 3. This will always generate validation errors for a message unmarshalled from - * serialized data that sets more than one field. With a Protobuf oneof, when - * multiple fields are present in the serialized form, earlier values are usually - * silently ignored when unmarshalling, with only the last field being set when - * unmarshalling completes. - * - * Note that adding a field to a `oneof` will also set the IGNORE_IF_ZERO_VALUE on the fields. This means - * only the field that is set will be validated and the unset fields are not validated according to the field rules. - * This behavior can be overridden by setting `ignore` against a field. - * - * ```proto - * message MyMessage { - * // Only one of `field1` or `field2` _can_ be present in this message. - * option (buf.validate.message).oneof = { fields: ["field1", "field2"] }; - * // Exactly one of `field3` or `field4` _must_ be present in this message. - * option (buf.validate.message).oneof = { fields: ["field3", "field4"], required: true }; - * string field1 = 1; - * bytes field2 = 2; - * bool field3 = 3; - * int32 field4 = 4; - * } - * ``` - * - * @generated from field: repeated buf.validate.MessageOneofRule oneof = 4; - */ - oneof: MessageOneofRule[]; -}; - -/** - * Describes the message buf.validate.MessageRules. - * Use `create(MessageRulesSchema)` to create a new message. - */ -export const MessageRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 1); - -/** - * @generated from message buf.validate.MessageOneofRule - */ -export type MessageOneofRule = Message<"buf.validate.MessageOneofRule"> & { - /** - * A list of field names to include in the oneof. All field names must be - * defined in the message. At least one field must be specified, and - * duplicates are not permitted. - * - * @generated from field: repeated string fields = 1; - */ - fields: string[]; - - /** - * If true, one of the fields specified _must_ be set. - * - * @generated from field: optional bool required = 2; - */ - required: boolean; -}; - -/** - * Describes the message buf.validate.MessageOneofRule. - * Use `create(MessageOneofRuleSchema)` to create a new message. - */ -export const MessageOneofRuleSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 2); - -/** - * The `OneofRules` message type enables you to manage rules for - * oneof fields in your protobuf messages. - * - * @generated from message buf.validate.OneofRules - */ -export type OneofRules = Message<"buf.validate.OneofRules"> & { - /** - * If `required` is true, exactly one field of the oneof must be set. A - * validation error is returned if no fields in the oneof are set. Further rules - * should be placed on the fields themselves to ensure they are valid values, - * such as `min_len` or `gt`. - * - * ```proto - * message MyMessage { - * oneof value { - * // Either `a` or `b` must be set. If `a` is set, it must also be - * // non-empty; whereas if `b` is set, it can still be an empty string. - * option (buf.validate.oneof).required = true; - * string a = 1 [(buf.validate.field).string.min_len = 1]; - * string b = 2; - * } - * } - * ``` - * - * @generated from field: optional bool required = 1; - */ - required: boolean; -}; - -/** - * Describes the message buf.validate.OneofRules. - * Use `create(OneofRulesSchema)` to create a new message. - */ -export const OneofRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 3); - -/** - * FieldRules encapsulates the rules for each type of field. Depending on - * the field, the correct set should be used to ensure proper validations. - * - * @generated from message buf.validate.FieldRules - */ -export type FieldRules = Message<"buf.validate.FieldRules"> & { - /** - * `cel_expression` is a repeated field CEL expressions. Each expression specifies a validation - * rule to be applied to this message. These rules are written in Common Expression Language (CEL) syntax. - * - * This is a simplified form of the `cel` Rule field, where only `expression` is set. This allows for - * simpler syntax when defining CEL Rules where `id` and `message` derived from the `expression`. `id` will - * be same as the `expression`. - * - * For more information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/). - * - * ```proto - * message MyMessage { - * // The field `value` must be greater than 42. - * optional int32 value = 1 [(buf.validate.field).cel_expression = "this > 42"]; - * } - * ``` - * - * @generated from field: repeated string cel_expression = 29; - */ - celExpression: string[]; - - /** - * `cel` is a repeated field used to represent a textual expression - * in the Common Expression Language (CEL) syntax. For more information, - * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/). - * - * ```proto - * message MyMessage { - * // The field `value` must be greater than 42. - * optional int32 value = 1 [(buf.validate.field).cel = { - * id: "my_message.value", - * message: "must be greater than 42", - * expression: "this > 42", - * }]; - * } - * ``` - * - * @generated from field: repeated buf.validate.Rule cel = 23; - */ - cel: Rule[]; - - /** - * If `required` is true, the field must be set. A validation error is returned - * if the field is not set. - * - * ```proto - * syntax="proto3"; - * - * message FieldsWithPresence { - * // Requires any string to be set, including the empty string. - * optional string link = 1 [ - * (buf.validate.field).required = true - * ]; - * // Requires true or false to be set. - * optional bool disabled = 2 [ - * (buf.validate.field).required = true - * ]; - * // Requires a message to be set, including the empty message. - * SomeMessage msg = 4 [ - * (buf.validate.field).required = true - * ]; - * } - * ``` - * - * All fields in the example above track presence. By default, Protovalidate - * ignores rules on those fields if no value is set. `required` ensures that - * the fields are set and valid. - * - * Fields that don't track presence are always validated by Protovalidate, - * whether they are set or not. It is not necessary to add `required`. It - * can be added to indicate that the field cannot be the zero value. - * - * ```proto - * syntax="proto3"; - * - * message FieldsWithoutPresence { - * // `string.email` always applies, even to an empty string. - * string link = 1 [ - * (buf.validate.field).string.email = true - * ]; - * // `repeated.min_items` always applies, even to an empty list. - * repeated string labels = 2 [ - * (buf.validate.field).repeated.min_items = 1 - * ]; - * // `required`, for fields that don't track presence, indicates - * // the value of the field can't be the zero value. - * int32 zero_value_not_allowed = 3 [ - * (buf.validate.field).required = true - * ]; - * } - * ``` - * - * To learn which fields track presence, see the - * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat). - * - * Note: While field rules can be applied to repeated items, map keys, and map - * values, the elements are always considered to be set. Consequently, - * specifying `repeated.items.required` is redundant. - * - * @generated from field: optional bool required = 25; - */ - required: boolean; - - /** - * Ignore validation rules on the field if its value matches the specified - * criteria. See the `Ignore` enum for details. - * - * ```proto - * message UpdateRequest { - * // The uri rule only applies if the field is not an empty string. - * string url = 1 [ - * (buf.validate.field).ignore = IGNORE_IF_ZERO_VALUE, - * (buf.validate.field).string.uri = true - * ]; - * } - * ``` - * - * @generated from field: optional buf.validate.Ignore ignore = 27; - */ - ignore: Ignore; - - /** - * @generated from oneof buf.validate.FieldRules.type - */ - type: { - /** - * Scalar Field Types - * - * @generated from field: buf.validate.FloatRules float = 1; - */ - value: FloatRules; - case: "float"; - } | { - /** - * @generated from field: buf.validate.DoubleRules double = 2; - */ - value: DoubleRules; - case: "double"; - } | { - /** - * @generated from field: buf.validate.Int32Rules int32 = 3; - */ - value: Int32Rules; - case: "int32"; - } | { - /** - * @generated from field: buf.validate.Int64Rules int64 = 4; - */ - value: Int64Rules; - case: "int64"; - } | { - /** - * @generated from field: buf.validate.UInt32Rules uint32 = 5; - */ - value: UInt32Rules; - case: "uint32"; - } | { - /** - * @generated from field: buf.validate.UInt64Rules uint64 = 6; - */ - value: UInt64Rules; - case: "uint64"; - } | { - /** - * @generated from field: buf.validate.SInt32Rules sint32 = 7; - */ - value: SInt32Rules; - case: "sint32"; - } | { - /** - * @generated from field: buf.validate.SInt64Rules sint64 = 8; - */ - value: SInt64Rules; - case: "sint64"; - } | { - /** - * @generated from field: buf.validate.Fixed32Rules fixed32 = 9; - */ - value: Fixed32Rules; - case: "fixed32"; - } | { - /** - * @generated from field: buf.validate.Fixed64Rules fixed64 = 10; - */ - value: Fixed64Rules; - case: "fixed64"; - } | { - /** - * @generated from field: buf.validate.SFixed32Rules sfixed32 = 11; - */ - value: SFixed32Rules; - case: "sfixed32"; - } | { - /** - * @generated from field: buf.validate.SFixed64Rules sfixed64 = 12; - */ - value: SFixed64Rules; - case: "sfixed64"; - } | { - /** - * @generated from field: buf.validate.BoolRules bool = 13; - */ - value: BoolRules; - case: "bool"; - } | { - /** - * @generated from field: buf.validate.StringRules string = 14; - */ - value: StringRules; - case: "string"; - } | { - /** - * @generated from field: buf.validate.BytesRules bytes = 15; - */ - value: BytesRules; - case: "bytes"; - } | { - /** - * Complex Field Types - * - * @generated from field: buf.validate.EnumRules enum = 16; - */ - value: EnumRules; - case: "enum"; - } | { - /** - * @generated from field: buf.validate.RepeatedRules repeated = 18; - */ - value: RepeatedRules; - case: "repeated"; - } | { - /** - * @generated from field: buf.validate.MapRules map = 19; - */ - value: MapRules; - case: "map"; - } | { - /** - * Well-Known Field Types - * - * @generated from field: buf.validate.AnyRules any = 20; - */ - value: AnyRules; - case: "any"; - } | { - /** - * @generated from field: buf.validate.DurationRules duration = 21; - */ - value: DurationRules; - case: "duration"; - } | { - /** - * @generated from field: buf.validate.FieldMaskRules field_mask = 28; - */ - value: FieldMaskRules; - case: "fieldMask"; - } | { - /** - * @generated from field: buf.validate.TimestampRules timestamp = 22; - */ - value: TimestampRules; - case: "timestamp"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message buf.validate.FieldRules. - * Use `create(FieldRulesSchema)` to create a new message. - */ -export const FieldRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 4); - -/** - * PredefinedRules are custom rules that can be re-used with - * multiple fields. - * - * @generated from message buf.validate.PredefinedRules - */ -export type PredefinedRules = Message<"buf.validate.PredefinedRules"> & { - /** - * `cel` is a repeated field used to represent a textual expression - * in the Common Expression Language (CEL) syntax. For more information, - * [see our documentation](https://buf.build/docs/protovalidate/schemas/predefined-rules/). - * - * ```proto - * message MyMessage { - * // The field `value` must be greater than 42. - * optional int32 value = 1 [(buf.validate.predefined).cel = { - * id: "my_message.value", - * message: "must be greater than 42", - * expression: "this > 42", - * }]; - * } - * ``` - * - * @generated from field: repeated buf.validate.Rule cel = 1; - */ - cel: Rule[]; -}; - -/** - * Describes the message buf.validate.PredefinedRules. - * Use `create(PredefinedRulesSchema)` to create a new message. - */ -export const PredefinedRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 5); - -/** - * FloatRules describes the rules applied to `float` values. These - * rules may also be applied to the `google.protobuf.FloatValue` Well-Known-Type. - * - * @generated from message buf.validate.FloatRules - */ -export type FloatRules = Message<"buf.validate.FloatRules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MyFloat { - * // value must equal 42.0 - * float value = 1 [(buf.validate.field).float.const = 42.0]; - * } - * ``` - * - * @generated from field: optional float const = 1; - */ - const: number; - - /** - * @generated from oneof buf.validate.FloatRules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified value, - * an error message is generated. - * - * ```proto - * message MyFloat { - * // must be less than 10.0 - * float value = 1 [(buf.validate.field).float.lt = 10.0]; - * } - * ``` - * - * @generated from field: float lt = 2; - */ - value: number; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyFloat { - * // must be less than or equal to 10.0 - * float value = 1 [(buf.validate.field).float.lte = 10.0]; - * } - * ``` - * - * @generated from field: float lte = 3; - */ - value: number; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.FloatRules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyFloat { - * // must be greater than 5.0 [float.gt] - * float value = 1 [(buf.validate.field).float.gt = 5.0]; - * - * // must be greater than 5 and less than 10.0 [float.gt_lt] - * float other_value = 2 [(buf.validate.field).float = { gt: 5.0, lt: 10.0 }]; - * - * // must be greater than 10 or less than 5.0 [float.gt_lt_exclusive] - * float another_value = 3 [(buf.validate.field).float = { gt: 10.0, lt: 5.0 }]; - * } - * ``` - * - * @generated from field: float gt = 4; - */ - value: number; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyFloat { - * // must be greater than or equal to 5.0 [float.gte] - * float value = 1 [(buf.validate.field).float.gte = 5.0]; - * - * // must be greater than or equal to 5.0 and less than 10.0 [float.gte_lt] - * float other_value = 2 [(buf.validate.field).float = { gte: 5.0, lt: 10.0 }]; - * - * // must be greater than or equal to 10.0 or less than 5.0 [float.gte_lt_exclusive] - * float another_value = 3 [(buf.validate.field).float = { gte: 10.0, lt: 5.0 }]; - * } - * ``` - * - * @generated from field: float gte = 5; - */ - value: number; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message - * is generated. - * - * ```proto - * message MyFloat { - * // must be in list [1.0, 2.0, 3.0] - * float value = 1 [(buf.validate.field).float = { in: [1.0, 2.0, 3.0] }]; - * } - * ``` - * - * @generated from field: repeated float in = 6; - */ - in: number[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MyFloat { - * // value must not be in list [1.0, 2.0, 3.0] - * float value = 1 [(buf.validate.field).float = { not_in: [1.0, 2.0, 3.0] }]; - * } - * ``` - * - * @generated from field: repeated float not_in = 7; - */ - notIn: number[]; - - /** - * `finite` requires the field value to be finite. If the field value is - * infinite or NaN, an error message is generated. - * - * @generated from field: optional bool finite = 8; - */ - finite: boolean; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyFloat { - * float value = 1 [ - * (buf.validate.field).float.example = 1.0, - * (buf.validate.field).float.example = inf - * ]; - * } - * ``` - * - * @generated from field: repeated float example = 9; - */ - example: number[]; -}; - -/** - * Describes the message buf.validate.FloatRules. - * Use `create(FloatRulesSchema)` to create a new message. - */ -export const FloatRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 6); - -/** - * DoubleRules describes the rules applied to `double` values. These - * rules may also be applied to the `google.protobuf.DoubleValue` Well-Known-Type. - * - * @generated from message buf.validate.DoubleRules - */ -export type DoubleRules = Message<"buf.validate.DoubleRules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MyDouble { - * // value must equal 42.0 - * double value = 1 [(buf.validate.field).double.const = 42.0]; - * } - * ``` - * - * @generated from field: optional double const = 1; - */ - const: number; - - /** - * @generated from oneof buf.validate.DoubleRules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyDouble { - * // must be less than 10.0 - * double value = 1 [(buf.validate.field).double.lt = 10.0]; - * } - * ``` - * - * @generated from field: double lt = 2; - */ - value: number; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified value - * (field <= value). If the field value is greater than the specified value, - * an error message is generated. - * - * ```proto - * message MyDouble { - * // must be less than or equal to 10.0 - * double value = 1 [(buf.validate.field).double.lte = 10.0]; - * } - * ``` - * - * @generated from field: double lte = 3; - */ - value: number; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.DoubleRules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or `lte`, - * the range is reversed, and the field value must be outside the specified - * range. If the field value doesn't meet the required conditions, an error - * message is generated. - * - * ```proto - * message MyDouble { - * // must be greater than 5.0 [double.gt] - * double value = 1 [(buf.validate.field).double.gt = 5.0]; - * - * // must be greater than 5 and less than 10.0 [double.gt_lt] - * double other_value = 2 [(buf.validate.field).double = { gt: 5.0, lt: 10.0 }]; - * - * // must be greater than 10 or less than 5.0 [double.gt_lt_exclusive] - * double another_value = 3 [(buf.validate.field).double = { gt: 10.0, lt: 5.0 }]; - * } - * ``` - * - * @generated from field: double gt = 4; - */ - value: number; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyDouble { - * // must be greater than or equal to 5.0 [double.gte] - * double value = 1 [(buf.validate.field).double.gte = 5.0]; - * - * // must be greater than or equal to 5.0 and less than 10.0 [double.gte_lt] - * double other_value = 2 [(buf.validate.field).double = { gte: 5.0, lt: 10.0 }]; - * - * // must be greater than or equal to 10.0 or less than 5.0 [double.gte_lt_exclusive] - * double another_value = 3 [(buf.validate.field).double = { gte: 10.0, lt: 5.0 }]; - * } - * ``` - * - * @generated from field: double gte = 5; - */ - value: number; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MyDouble { - * // must be in list [1.0, 2.0, 3.0] - * double value = 1 [(buf.validate.field).double = { in: [1.0, 2.0, 3.0] }]; - * } - * ``` - * - * @generated from field: repeated double in = 6; - */ - in: number[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MyDouble { - * // value must not be in list [1.0, 2.0, 3.0] - * double value = 1 [(buf.validate.field).double = { not_in: [1.0, 2.0, 3.0] }]; - * } - * ``` - * - * @generated from field: repeated double not_in = 7; - */ - notIn: number[]; - - /** - * `finite` requires the field value to be finite. If the field value is - * infinite or NaN, an error message is generated. - * - * @generated from field: optional bool finite = 8; - */ - finite: boolean; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyDouble { - * double value = 1 [ - * (buf.validate.field).double.example = 1.0, - * (buf.validate.field).double.example = inf - * ]; - * } - * ``` - * - * @generated from field: repeated double example = 9; - */ - example: number[]; -}; - -/** - * Describes the message buf.validate.DoubleRules. - * Use `create(DoubleRulesSchema)` to create a new message. - */ -export const DoubleRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 7); - -/** - * Int32Rules describes the rules applied to `int32` values. These - * rules may also be applied to the `google.protobuf.Int32Value` Well-Known-Type. - * - * @generated from message buf.validate.Int32Rules - */ -export type Int32Rules = Message<"buf.validate.Int32Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MyInt32 { - * // value must equal 42 - * int32 value = 1 [(buf.validate.field).int32.const = 42]; - * } - * ``` - * - * @generated from field: optional int32 const = 1; - */ - const: number; - - /** - * @generated from oneof buf.validate.Int32Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field - * < value). If the field value is equal to or greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyInt32 { - * // must be less than 10 - * int32 value = 1 [(buf.validate.field).int32.lt = 10]; - * } - * ``` - * - * @generated from field: int32 lt = 2; - */ - value: number; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyInt32 { - * // must be less than or equal to 10 - * int32 value = 1 [(buf.validate.field).int32.lte = 10]; - * } - * ``` - * - * @generated from field: int32 lte = 3; - */ - value: number; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.Int32Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyInt32 { - * // must be greater than 5 [int32.gt] - * int32 value = 1 [(buf.validate.field).int32.gt = 5]; - * - * // must be greater than 5 and less than 10 [int32.gt_lt] - * int32 other_value = 2 [(buf.validate.field).int32 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [int32.gt_lt_exclusive] - * int32 another_value = 3 [(buf.validate.field).int32 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: int32 gt = 4; - */ - value: number; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified value - * (exclusive). If the value of `gte` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyInt32 { - * // must be greater than or equal to 5 [int32.gte] - * int32 value = 1 [(buf.validate.field).int32.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [int32.gte_lt] - * int32 other_value = 2 [(buf.validate.field).int32 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [int32.gte_lt_exclusive] - * int32 another_value = 3 [(buf.validate.field).int32 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: int32 gte = 5; - */ - value: number; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MyInt32 { - * // must be in list [1, 2, 3] - * int32 value = 1 [(buf.validate.field).int32 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated int32 in = 6; - */ - in: number[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error message - * is generated. - * - * ```proto - * message MyInt32 { - * // value must not be in list [1, 2, 3] - * int32 value = 1 [(buf.validate.field).int32 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated int32 not_in = 7; - */ - notIn: number[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyInt32 { - * int32 value = 1 [ - * (buf.validate.field).int32.example = 1, - * (buf.validate.field).int32.example = -10 - * ]; - * } - * ``` - * - * @generated from field: repeated int32 example = 8; - */ - example: number[]; -}; - -/** - * Describes the message buf.validate.Int32Rules. - * Use `create(Int32RulesSchema)` to create a new message. - */ -export const Int32RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 8); - -/** - * Int64Rules describes the rules applied to `int64` values. These - * rules may also be applied to the `google.protobuf.Int64Value` Well-Known-Type. - * - * @generated from message buf.validate.Int64Rules - */ -export type Int64Rules = Message<"buf.validate.Int64Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MyInt64 { - * // value must equal 42 - * int64 value = 1 [(buf.validate.field).int64.const = 42]; - * } - * ``` - * - * @generated from field: optional int64 const = 1; - */ - const: bigint; - - /** - * @generated from oneof buf.validate.Int64Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified value, - * an error message is generated. - * - * ```proto - * message MyInt64 { - * // must be less than 10 - * int64 value = 1 [(buf.validate.field).int64.lt = 10]; - * } - * ``` - * - * @generated from field: int64 lt = 2; - */ - value: bigint; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyInt64 { - * // must be less than or equal to 10 - * int64 value = 1 [(buf.validate.field).int64.lte = 10]; - * } - * ``` - * - * @generated from field: int64 lte = 3; - */ - value: bigint; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.Int64Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyInt64 { - * // must be greater than 5 [int64.gt] - * int64 value = 1 [(buf.validate.field).int64.gt = 5]; - * - * // must be greater than 5 and less than 10 [int64.gt_lt] - * int64 other_value = 2 [(buf.validate.field).int64 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [int64.gt_lt_exclusive] - * int64 another_value = 3 [(buf.validate.field).int64 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: int64 gt = 4; - */ - value: bigint; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyInt64 { - * // must be greater than or equal to 5 [int64.gte] - * int64 value = 1 [(buf.validate.field).int64.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [int64.gte_lt] - * int64 other_value = 2 [(buf.validate.field).int64 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [int64.gte_lt_exclusive] - * int64 another_value = 3 [(buf.validate.field).int64 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: int64 gte = 5; - */ - value: bigint; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MyInt64 { - * // must be in list [1, 2, 3] - * int64 value = 1 [(buf.validate.field).int64 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated int64 in = 6; - */ - in: bigint[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MyInt64 { - * // value must not be in list [1, 2, 3] - * int64 value = 1 [(buf.validate.field).int64 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated int64 not_in = 7; - */ - notIn: bigint[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyInt64 { - * int64 value = 1 [ - * (buf.validate.field).int64.example = 1, - * (buf.validate.field).int64.example = -10 - * ]; - * } - * ``` - * - * @generated from field: repeated int64 example = 9; - */ - example: bigint[]; -}; - -/** - * Describes the message buf.validate.Int64Rules. - * Use `create(Int64RulesSchema)` to create a new message. - */ -export const Int64RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 9); - -/** - * UInt32Rules describes the rules applied to `uint32` values. These - * rules may also be applied to the `google.protobuf.UInt32Value` Well-Known-Type. - * - * @generated from message buf.validate.UInt32Rules - */ -export type UInt32Rules = Message<"buf.validate.UInt32Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MyUInt32 { - * // value must equal 42 - * uint32 value = 1 [(buf.validate.field).uint32.const = 42]; - * } - * ``` - * - * @generated from field: optional uint32 const = 1; - */ - const: number; - - /** - * @generated from oneof buf.validate.UInt32Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified value, - * an error message is generated. - * - * ```proto - * message MyUInt32 { - * // must be less than 10 - * uint32 value = 1 [(buf.validate.field).uint32.lt = 10]; - * } - * ``` - * - * @generated from field: uint32 lt = 2; - */ - value: number; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyUInt32 { - * // must be less than or equal to 10 - * uint32 value = 1 [(buf.validate.field).uint32.lte = 10]; - * } - * ``` - * - * @generated from field: uint32 lte = 3; - */ - value: number; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.UInt32Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyUInt32 { - * // must be greater than 5 [uint32.gt] - * uint32 value = 1 [(buf.validate.field).uint32.gt = 5]; - * - * // must be greater than 5 and less than 10 [uint32.gt_lt] - * uint32 other_value = 2 [(buf.validate.field).uint32 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [uint32.gt_lt_exclusive] - * uint32 another_value = 3 [(buf.validate.field).uint32 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: uint32 gt = 4; - */ - value: number; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyUInt32 { - * // must be greater than or equal to 5 [uint32.gte] - * uint32 value = 1 [(buf.validate.field).uint32.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [uint32.gte_lt] - * uint32 other_value = 2 [(buf.validate.field).uint32 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [uint32.gte_lt_exclusive] - * uint32 another_value = 3 [(buf.validate.field).uint32 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: uint32 gte = 5; - */ - value: number; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MyUInt32 { - * // must be in list [1, 2, 3] - * uint32 value = 1 [(buf.validate.field).uint32 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated uint32 in = 6; - */ - in: number[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MyUInt32 { - * // value must not be in list [1, 2, 3] - * uint32 value = 1 [(buf.validate.field).uint32 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated uint32 not_in = 7; - */ - notIn: number[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyUInt32 { - * uint32 value = 1 [ - * (buf.validate.field).uint32.example = 1, - * (buf.validate.field).uint32.example = 10 - * ]; - * } - * ``` - * - * @generated from field: repeated uint32 example = 8; - */ - example: number[]; -}; - -/** - * Describes the message buf.validate.UInt32Rules. - * Use `create(UInt32RulesSchema)` to create a new message. - */ -export const UInt32RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 10); - -/** - * UInt64Rules describes the rules applied to `uint64` values. These - * rules may also be applied to the `google.protobuf.UInt64Value` Well-Known-Type. - * - * @generated from message buf.validate.UInt64Rules - */ -export type UInt64Rules = Message<"buf.validate.UInt64Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MyUInt64 { - * // value must equal 42 - * uint64 value = 1 [(buf.validate.field).uint64.const = 42]; - * } - * ``` - * - * @generated from field: optional uint64 const = 1; - */ - const: bigint; - - /** - * @generated from oneof buf.validate.UInt64Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified value, - * an error message is generated. - * - * ```proto - * message MyUInt64 { - * // must be less than 10 - * uint64 value = 1 [(buf.validate.field).uint64.lt = 10]; - * } - * ``` - * - * @generated from field: uint64 lt = 2; - */ - value: bigint; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyUInt64 { - * // must be less than or equal to 10 - * uint64 value = 1 [(buf.validate.field).uint64.lte = 10]; - * } - * ``` - * - * @generated from field: uint64 lte = 3; - */ - value: bigint; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.UInt64Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyUInt64 { - * // must be greater than 5 [uint64.gt] - * uint64 value = 1 [(buf.validate.field).uint64.gt = 5]; - * - * // must be greater than 5 and less than 10 [uint64.gt_lt] - * uint64 other_value = 2 [(buf.validate.field).uint64 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [uint64.gt_lt_exclusive] - * uint64 another_value = 3 [(buf.validate.field).uint64 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: uint64 gt = 4; - */ - value: bigint; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyUInt64 { - * // must be greater than or equal to 5 [uint64.gte] - * uint64 value = 1 [(buf.validate.field).uint64.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [uint64.gte_lt] - * uint64 other_value = 2 [(buf.validate.field).uint64 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [uint64.gte_lt_exclusive] - * uint64 another_value = 3 [(buf.validate.field).uint64 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: uint64 gte = 5; - */ - value: bigint; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MyUInt64 { - * // must be in list [1, 2, 3] - * uint64 value = 1 [(buf.validate.field).uint64 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated uint64 in = 6; - */ - in: bigint[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MyUInt64 { - * // value must not be in list [1, 2, 3] - * uint64 value = 1 [(buf.validate.field).uint64 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated uint64 not_in = 7; - */ - notIn: bigint[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyUInt64 { - * uint64 value = 1 [ - * (buf.validate.field).uint64.example = 1, - * (buf.validate.field).uint64.example = -10 - * ]; - * } - * ``` - * - * @generated from field: repeated uint64 example = 8; - */ - example: bigint[]; -}; - -/** - * Describes the message buf.validate.UInt64Rules. - * Use `create(UInt64RulesSchema)` to create a new message. - */ -export const UInt64RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 11); - -/** - * SInt32Rules describes the rules applied to `sint32` values. - * - * @generated from message buf.validate.SInt32Rules - */ -export type SInt32Rules = Message<"buf.validate.SInt32Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MySInt32 { - * // value must equal 42 - * sint32 value = 1 [(buf.validate.field).sint32.const = 42]; - * } - * ``` - * - * @generated from field: optional sint32 const = 1; - */ - const: number; - - /** - * @generated from oneof buf.validate.SInt32Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field - * < value). If the field value is equal to or greater than the specified - * value, an error message is generated. - * - * ```proto - * message MySInt32 { - * // must be less than 10 - * sint32 value = 1 [(buf.validate.field).sint32.lt = 10]; - * } - * ``` - * - * @generated from field: sint32 lt = 2; - */ - value: number; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MySInt32 { - * // must be less than or equal to 10 - * sint32 value = 1 [(buf.validate.field).sint32.lte = 10]; - * } - * ``` - * - * @generated from field: sint32 lte = 3; - */ - value: number; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.SInt32Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MySInt32 { - * // must be greater than 5 [sint32.gt] - * sint32 value = 1 [(buf.validate.field).sint32.gt = 5]; - * - * // must be greater than 5 and less than 10 [sint32.gt_lt] - * sint32 other_value = 2 [(buf.validate.field).sint32 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [sint32.gt_lt_exclusive] - * sint32 another_value = 3 [(buf.validate.field).sint32 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: sint32 gt = 4; - */ - value: number; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MySInt32 { - * // must be greater than or equal to 5 [sint32.gte] - * sint32 value = 1 [(buf.validate.field).sint32.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [sint32.gte_lt] - * sint32 other_value = 2 [(buf.validate.field).sint32 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [sint32.gte_lt_exclusive] - * sint32 another_value = 3 [(buf.validate.field).sint32 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: sint32 gte = 5; - */ - value: number; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MySInt32 { - * // must be in list [1, 2, 3] - * sint32 value = 1 [(buf.validate.field).sint32 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated sint32 in = 6; - */ - in: number[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MySInt32 { - * // value must not be in list [1, 2, 3] - * sint32 value = 1 [(buf.validate.field).sint32 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated sint32 not_in = 7; - */ - notIn: number[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MySInt32 { - * sint32 value = 1 [ - * (buf.validate.field).sint32.example = 1, - * (buf.validate.field).sint32.example = -10 - * ]; - * } - * ``` - * - * @generated from field: repeated sint32 example = 8; - */ - example: number[]; -}; - -/** - * Describes the message buf.validate.SInt32Rules. - * Use `create(SInt32RulesSchema)` to create a new message. - */ -export const SInt32RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 12); - -/** - * SInt64Rules describes the rules applied to `sint64` values. - * - * @generated from message buf.validate.SInt64Rules - */ -export type SInt64Rules = Message<"buf.validate.SInt64Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MySInt64 { - * // value must equal 42 - * sint64 value = 1 [(buf.validate.field).sint64.const = 42]; - * } - * ``` - * - * @generated from field: optional sint64 const = 1; - */ - const: bigint; - - /** - * @generated from oneof buf.validate.SInt64Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field - * < value). If the field value is equal to or greater than the specified - * value, an error message is generated. - * - * ```proto - * message MySInt64 { - * // must be less than 10 - * sint64 value = 1 [(buf.validate.field).sint64.lt = 10]; - * } - * ``` - * - * @generated from field: sint64 lt = 2; - */ - value: bigint; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MySInt64 { - * // must be less than or equal to 10 - * sint64 value = 1 [(buf.validate.field).sint64.lte = 10]; - * } - * ``` - * - * @generated from field: sint64 lte = 3; - */ - value: bigint; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.SInt64Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MySInt64 { - * // must be greater than 5 [sint64.gt] - * sint64 value = 1 [(buf.validate.field).sint64.gt = 5]; - * - * // must be greater than 5 and less than 10 [sint64.gt_lt] - * sint64 other_value = 2 [(buf.validate.field).sint64 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [sint64.gt_lt_exclusive] - * sint64 another_value = 3 [(buf.validate.field).sint64 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: sint64 gt = 4; - */ - value: bigint; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MySInt64 { - * // must be greater than or equal to 5 [sint64.gte] - * sint64 value = 1 [(buf.validate.field).sint64.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [sint64.gte_lt] - * sint64 other_value = 2 [(buf.validate.field).sint64 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [sint64.gte_lt_exclusive] - * sint64 another_value = 3 [(buf.validate.field).sint64 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: sint64 gte = 5; - */ - value: bigint; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message - * is generated. - * - * ```proto - * message MySInt64 { - * // must be in list [1, 2, 3] - * sint64 value = 1 [(buf.validate.field).sint64 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated sint64 in = 6; - */ - in: bigint[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MySInt64 { - * // value must not be in list [1, 2, 3] - * sint64 value = 1 [(buf.validate.field).sint64 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated sint64 not_in = 7; - */ - notIn: bigint[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MySInt64 { - * sint64 value = 1 [ - * (buf.validate.field).sint64.example = 1, - * (buf.validate.field).sint64.example = -10 - * ]; - * } - * ``` - * - * @generated from field: repeated sint64 example = 8; - */ - example: bigint[]; -}; - -/** - * Describes the message buf.validate.SInt64Rules. - * Use `create(SInt64RulesSchema)` to create a new message. - */ -export const SInt64RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 13); - -/** - * Fixed32Rules describes the rules applied to `fixed32` values. - * - * @generated from message buf.validate.Fixed32Rules - */ -export type Fixed32Rules = Message<"buf.validate.Fixed32Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. - * If the field value doesn't match, an error message is generated. - * - * ```proto - * message MyFixed32 { - * // value must equal 42 - * fixed32 value = 1 [(buf.validate.field).fixed32.const = 42]; - * } - * ``` - * - * @generated from field: optional fixed32 const = 1; - */ - const: number; - - /** - * @generated from oneof buf.validate.Fixed32Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified value, - * an error message is generated. - * - * ```proto - * message MyFixed32 { - * // must be less than 10 - * fixed32 value = 1 [(buf.validate.field).fixed32.lt = 10]; - * } - * ``` - * - * @generated from field: fixed32 lt = 2; - */ - value: number; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyFixed32 { - * // must be less than or equal to 10 - * fixed32 value = 1 [(buf.validate.field).fixed32.lte = 10]; - * } - * ``` - * - * @generated from field: fixed32 lte = 3; - */ - value: number; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.Fixed32Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyFixed32 { - * // must be greater than 5 [fixed32.gt] - * fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5]; - * - * // must be greater than 5 and less than 10 [fixed32.gt_lt] - * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [fixed32.gt_lt_exclusive] - * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: fixed32 gt = 4; - */ - value: number; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyFixed32 { - * // must be greater than or equal to 5 [fixed32.gte] - * fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [fixed32.gte_lt] - * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [fixed32.gte_lt_exclusive] - * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: fixed32 gte = 5; - */ - value: number; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message - * is generated. - * - * ```proto - * message MyFixed32 { - * // must be in list [1, 2, 3] - * fixed32 value = 1 [(buf.validate.field).fixed32 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated fixed32 in = 6; - */ - in: number[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MyFixed32 { - * // value must not be in list [1, 2, 3] - * fixed32 value = 1 [(buf.validate.field).fixed32 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated fixed32 not_in = 7; - */ - notIn: number[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyFixed32 { - * fixed32 value = 1 [ - * (buf.validate.field).fixed32.example = 1, - * (buf.validate.field).fixed32.example = 2 - * ]; - * } - * ``` - * - * @generated from field: repeated fixed32 example = 8; - */ - example: number[]; -}; - -/** - * Describes the message buf.validate.Fixed32Rules. - * Use `create(Fixed32RulesSchema)` to create a new message. - */ -export const Fixed32RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 14); - -/** - * Fixed64Rules describes the rules applied to `fixed64` values. - * - * @generated from message buf.validate.Fixed64Rules - */ -export type Fixed64Rules = Message<"buf.validate.Fixed64Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MyFixed64 { - * // value must equal 42 - * fixed64 value = 1 [(buf.validate.field).fixed64.const = 42]; - * } - * ``` - * - * @generated from field: optional fixed64 const = 1; - */ - const: bigint; - - /** - * @generated from oneof buf.validate.Fixed64Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified value, - * an error message is generated. - * - * ```proto - * message MyFixed64 { - * // must be less than 10 - * fixed64 value = 1 [(buf.validate.field).fixed64.lt = 10]; - * } - * ``` - * - * @generated from field: fixed64 lt = 2; - */ - value: bigint; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MyFixed64 { - * // must be less than or equal to 10 - * fixed64 value = 1 [(buf.validate.field).fixed64.lte = 10]; - * } - * ``` - * - * @generated from field: fixed64 lte = 3; - */ - value: bigint; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.Fixed64Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyFixed64 { - * // must be greater than 5 [fixed64.gt] - * fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5]; - * - * // must be greater than 5 and less than 10 [fixed64.gt_lt] - * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [fixed64.gt_lt_exclusive] - * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: fixed64 gt = 4; - */ - value: bigint; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyFixed64 { - * // must be greater than or equal to 5 [fixed64.gte] - * fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [fixed64.gte_lt] - * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [fixed64.gte_lt_exclusive] - * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: fixed64 gte = 5; - */ - value: bigint; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MyFixed64 { - * // must be in list [1, 2, 3] - * fixed64 value = 1 [(buf.validate.field).fixed64 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated fixed64 in = 6; - */ - in: bigint[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MyFixed64 { - * // value must not be in list [1, 2, 3] - * fixed64 value = 1 [(buf.validate.field).fixed64 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated fixed64 not_in = 7; - */ - notIn: bigint[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyFixed64 { - * fixed64 value = 1 [ - * (buf.validate.field).fixed64.example = 1, - * (buf.validate.field).fixed64.example = 2 - * ]; - * } - * ``` - * - * @generated from field: repeated fixed64 example = 8; - */ - example: bigint[]; -}; - -/** - * Describes the message buf.validate.Fixed64Rules. - * Use `create(Fixed64RulesSchema)` to create a new message. - */ -export const Fixed64RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 15); - -/** - * SFixed32Rules describes the rules applied to `fixed32` values. - * - * @generated from message buf.validate.SFixed32Rules - */ -export type SFixed32Rules = Message<"buf.validate.SFixed32Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MySFixed32 { - * // value must equal 42 - * sfixed32 value = 1 [(buf.validate.field).sfixed32.const = 42]; - * } - * ``` - * - * @generated from field: optional sfixed32 const = 1; - */ - const: number; - - /** - * @generated from oneof buf.validate.SFixed32Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified value, - * an error message is generated. - * - * ```proto - * message MySFixed32 { - * // must be less than 10 - * sfixed32 value = 1 [(buf.validate.field).sfixed32.lt = 10]; - * } - * ``` - * - * @generated from field: sfixed32 lt = 2; - */ - value: number; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MySFixed32 { - * // must be less than or equal to 10 - * sfixed32 value = 1 [(buf.validate.field).sfixed32.lte = 10]; - * } - * ``` - * - * @generated from field: sfixed32 lte = 3; - */ - value: number; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.SFixed32Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MySFixed32 { - * // must be greater than 5 [sfixed32.gt] - * sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5]; - * - * // must be greater than 5 and less than 10 [sfixed32.gt_lt] - * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [sfixed32.gt_lt_exclusive] - * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: sfixed32 gt = 4; - */ - value: number; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MySFixed32 { - * // must be greater than or equal to 5 [sfixed32.gte] - * sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [sfixed32.gte_lt] - * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [sfixed32.gte_lt_exclusive] - * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: sfixed32 gte = 5; - */ - value: number; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MySFixed32 { - * // must be in list [1, 2, 3] - * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated sfixed32 in = 6; - */ - in: number[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MySFixed32 { - * // value must not be in list [1, 2, 3] - * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated sfixed32 not_in = 7; - */ - notIn: number[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MySFixed32 { - * sfixed32 value = 1 [ - * (buf.validate.field).sfixed32.example = 1, - * (buf.validate.field).sfixed32.example = 2 - * ]; - * } - * ``` - * - * @generated from field: repeated sfixed32 example = 8; - */ - example: number[]; -}; - -/** - * Describes the message buf.validate.SFixed32Rules. - * Use `create(SFixed32RulesSchema)` to create a new message. - */ -export const SFixed32RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 16); - -/** - * SFixed64Rules describes the rules applied to `fixed64` values. - * - * @generated from message buf.validate.SFixed64Rules - */ -export type SFixed64Rules = Message<"buf.validate.SFixed64Rules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MySFixed64 { - * // value must equal 42 - * sfixed64 value = 1 [(buf.validate.field).sfixed64.const = 42]; - * } - * ``` - * - * @generated from field: optional sfixed64 const = 1; - */ - const: bigint; - - /** - * @generated from oneof buf.validate.SFixed64Rules.less_than - */ - lessThan: { - /** - * `lt` requires the field value to be less than the specified value (field < - * value). If the field value is equal to or greater than the specified value, - * an error message is generated. - * - * ```proto - * message MySFixed64 { - * // must be less than 10 - * sfixed64 value = 1 [(buf.validate.field).sfixed64.lt = 10]; - * } - * ``` - * - * @generated from field: sfixed64 lt = 2; - */ - value: bigint; - case: "lt"; - } | { - /** - * `lte` requires the field value to be less than or equal to the specified - * value (field <= value). If the field value is greater than the specified - * value, an error message is generated. - * - * ```proto - * message MySFixed64 { - * // must be less than or equal to 10 - * sfixed64 value = 1 [(buf.validate.field).sfixed64.lte = 10]; - * } - * ``` - * - * @generated from field: sfixed64 lte = 3; - */ - value: bigint; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.SFixed64Rules.greater_than - */ - greaterThan: { - /** - * `gt` requires the field value to be greater than the specified value - * (exclusive). If the value of `gt` is larger than a specified `lt` or - * `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MySFixed64 { - * // must be greater than 5 [sfixed64.gt] - * sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5]; - * - * // must be greater than 5 and less than 10 [sfixed64.gt_lt] - * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gt: 5, lt: 10 }]; - * - * // must be greater than 10 or less than 5 [sfixed64.gt_lt_exclusive] - * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gt: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: sfixed64 gt = 4; - */ - value: bigint; - case: "gt"; - } | { - /** - * `gte` requires the field value to be greater than or equal to the specified - * value (exclusive). If the value of `gte` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MySFixed64 { - * // must be greater than or equal to 5 [sfixed64.gte] - * sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5]; - * - * // must be greater than or equal to 5 and less than 10 [sfixed64.gte_lt] - * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gte: 5, lt: 10 }]; - * - * // must be greater than or equal to 10 or less than 5 [sfixed64.gte_lt_exclusive] - * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gte: 10, lt: 5 }]; - * } - * ``` - * - * @generated from field: sfixed64 gte = 5; - */ - value: bigint; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` requires the field value to be equal to one of the specified values. - * If the field value isn't one of the specified values, an error message is - * generated. - * - * ```proto - * message MySFixed64 { - * // must be in list [1, 2, 3] - * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated sfixed64 in = 6; - */ - in: bigint[]; - - /** - * `not_in` requires the field value to not be equal to any of the specified - * values. If the field value is one of the specified values, an error - * message is generated. - * - * ```proto - * message MySFixed64 { - * // value must not be in list [1, 2, 3] - * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { not_in: [1, 2, 3] }]; - * } - * ``` - * - * @generated from field: repeated sfixed64 not_in = 7; - */ - notIn: bigint[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MySFixed64 { - * sfixed64 value = 1 [ - * (buf.validate.field).sfixed64.example = 1, - * (buf.validate.field).sfixed64.example = 2 - * ]; - * } - * ``` - * - * @generated from field: repeated sfixed64 example = 8; - */ - example: bigint[]; -}; - -/** - * Describes the message buf.validate.SFixed64Rules. - * Use `create(SFixed64RulesSchema)` to create a new message. - */ -export const SFixed64RulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 17); - -/** - * BoolRules describes the rules applied to `bool` values. These rules - * may also be applied to the `google.protobuf.BoolValue` Well-Known-Type. - * - * @generated from message buf.validate.BoolRules - */ -export type BoolRules = Message<"buf.validate.BoolRules"> & { - /** - * `const` requires the field value to exactly match the specified boolean value. - * If the field value doesn't match, an error message is generated. - * - * ```proto - * message MyBool { - * // value must equal true - * bool value = 1 [(buf.validate.field).bool.const = true]; - * } - * ``` - * - * @generated from field: optional bool const = 1; - */ - const: boolean; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyBool { - * bool value = 1 [ - * (buf.validate.field).bool.example = 1, - * (buf.validate.field).bool.example = 2 - * ]; - * } - * ``` - * - * @generated from field: repeated bool example = 2; - */ - example: boolean[]; -}; - -/** - * Describes the message buf.validate.BoolRules. - * Use `create(BoolRulesSchema)` to create a new message. - */ -export const BoolRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 18); - -/** - * StringRules describes the rules applied to `string` values These - * rules may also be applied to the `google.protobuf.StringValue` Well-Known-Type. - * - * @generated from message buf.validate.StringRules - */ -export type StringRules = Message<"buf.validate.StringRules"> & { - /** - * `const` requires the field value to exactly match the specified value. If - * the field value doesn't match, an error message is generated. - * - * ```proto - * message MyString { - * // value must equal `hello` - * string value = 1 [(buf.validate.field).string.const = "hello"]; - * } - * ``` - * - * @generated from field: optional string const = 1; - */ - const: string; - - /** - * `len` dictates that the field value must have the specified - * number of characters (Unicode code points), which may differ from the number - * of bytes in the string. If the field value does not meet the specified - * length, an error message will be generated. - * - * ```proto - * message MyString { - * // value length must be 5 characters - * string value = 1 [(buf.validate.field).string.len = 5]; - * } - * ``` - * - * @generated from field: optional uint64 len = 19; - */ - len: bigint; - - /** - * `min_len` specifies that the field value must have at least the specified - * number of characters (Unicode code points), which may differ from the number - * of bytes in the string. If the field value contains fewer characters, an error - * message will be generated. - * - * ```proto - * message MyString { - * // value length must be at least 3 characters - * string value = 1 [(buf.validate.field).string.min_len = 3]; - * } - * ``` - * - * @generated from field: optional uint64 min_len = 2; - */ - minLen: bigint; - - /** - * `max_len` specifies that the field value must have no more than the specified - * number of characters (Unicode code points), which may differ from the - * number of bytes in the string. If the field value contains more characters, - * an error message will be generated. - * - * ```proto - * message MyString { - * // value length must be at most 10 characters - * string value = 1 [(buf.validate.field).string.max_len = 10]; - * } - * ``` - * - * @generated from field: optional uint64 max_len = 3; - */ - maxLen: bigint; - - /** - * `len_bytes` dictates that the field value must have the specified number of - * bytes. If the field value does not match the specified length in bytes, - * an error message will be generated. - * - * ```proto - * message MyString { - * // value length must be 6 bytes - * string value = 1 [(buf.validate.field).string.len_bytes = 6]; - * } - * ``` - * - * @generated from field: optional uint64 len_bytes = 20; - */ - lenBytes: bigint; - - /** - * `min_bytes` specifies that the field value must have at least the specified - * number of bytes. If the field value contains fewer bytes, an error message - * will be generated. - * - * ```proto - * message MyString { - * // value length must be at least 4 bytes - * string value = 1 [(buf.validate.field).string.min_bytes = 4]; - * } - * - * ``` - * - * @generated from field: optional uint64 min_bytes = 4; - */ - minBytes: bigint; - - /** - * `max_bytes` specifies that the field value must have no more than the - * specified number of bytes. If the field value contains more bytes, an - * error message will be generated. - * - * ```proto - * message MyString { - * // value length must be at most 8 bytes - * string value = 1 [(buf.validate.field).string.max_bytes = 8]; - * } - * ``` - * - * @generated from field: optional uint64 max_bytes = 5; - */ - maxBytes: bigint; - - /** - * `pattern` specifies that the field value must match the specified - * regular expression (RE2 syntax), with the expression provided without any - * delimiters. If the field value doesn't match the regular expression, an - * error message will be generated. - * - * ```proto - * message MyString { - * // value does not match regex pattern `^[a-zA-Z]//$` - * string value = 1 [(buf.validate.field).string.pattern = "^[a-zA-Z]//$"]; - * } - * ``` - * - * @generated from field: optional string pattern = 6; - */ - pattern: string; - - /** - * `prefix` specifies that the field value must have the - * specified substring at the beginning of the string. If the field value - * doesn't start with the specified prefix, an error message will be - * generated. - * - * ```proto - * message MyString { - * // value does not have prefix `pre` - * string value = 1 [(buf.validate.field).string.prefix = "pre"]; - * } - * ``` - * - * @generated from field: optional string prefix = 7; - */ - prefix: string; - - /** - * `suffix` specifies that the field value must have the - * specified substring at the end of the string. If the field value doesn't - * end with the specified suffix, an error message will be generated. - * - * ```proto - * message MyString { - * // value does not have suffix `post` - * string value = 1 [(buf.validate.field).string.suffix = "post"]; - * } - * ``` - * - * @generated from field: optional string suffix = 8; - */ - suffix: string; - - /** - * `contains` specifies that the field value must have the - * specified substring anywhere in the string. If the field value doesn't - * contain the specified substring, an error message will be generated. - * - * ```proto - * message MyString { - * // value does not contain substring `inside`. - * string value = 1 [(buf.validate.field).string.contains = "inside"]; - * } - * ``` - * - * @generated from field: optional string contains = 9; - */ - contains: string; - - /** - * `not_contains` specifies that the field value must not have the - * specified substring anywhere in the string. If the field value contains - * the specified substring, an error message will be generated. - * - * ```proto - * message MyString { - * // value contains substring `inside`. - * string value = 1 [(buf.validate.field).string.not_contains = "inside"]; - * } - * ``` - * - * @generated from field: optional string not_contains = 23; - */ - notContains: string; - - /** - * `in` specifies that the field value must be equal to one of the specified - * values. If the field value isn't one of the specified values, an error - * message will be generated. - * - * ```proto - * message MyString { - * // must be in list ["apple", "banana"] - * string value = 1 [(buf.validate.field).string.in = "apple", (buf.validate.field).string.in = "banana"]; - * } - * ``` - * - * @generated from field: repeated string in = 10; - */ - in: string[]; - - /** - * `not_in` specifies that the field value cannot be equal to any - * of the specified values. If the field value is one of the specified values, - * an error message will be generated. - * ```proto - * message MyString { - * // value must not be in list ["orange", "grape"] - * string value = 1 [(buf.validate.field).string.not_in = "orange", (buf.validate.field).string.not_in = "grape"]; - * } - * ``` - * - * @generated from field: repeated string not_in = 11; - */ - notIn: string[]; - - /** - * `WellKnown` rules provide advanced rules against common string - * patterns. - * - * @generated from oneof buf.validate.StringRules.well_known - */ - wellKnown: { - /** - * `email` specifies that the field value must be a valid email address, for - * example "foo@example.com". - * - * Conforms to the definition for a valid email address from the [HTML standard](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address). - * Note that this standard willfully deviates from [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322), - * which allows many unexpected forms of email addresses and will easily match - * a typographical error. - * - * If the field value isn't a valid email address, an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid email address - * string value = 1 [(buf.validate.field).string.email = true]; - * } - * ``` - * - * @generated from field: bool email = 12; - */ - value: boolean; - case: "email"; - } | { - /** - * `hostname` specifies that the field value must be a valid hostname, for - * example "foo.example.com". - * - * A valid hostname follows the rules below: - * - The name consists of one or more labels, separated by a dot ("."). - * - Each label can be 1 to 63 alphanumeric characters. - * - A label can contain hyphens ("-"), but must not start or end with a hyphen. - * - The right-most label must not be digits only. - * - The name can have a trailing dot—for example, "foo.example.com.". - * - The name can be 253 characters at most, excluding the optional trailing dot. - * - * If the field value isn't a valid hostname, an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid hostname - * string value = 1 [(buf.validate.field).string.hostname = true]; - * } - * ``` - * - * @generated from field: bool hostname = 13; - */ - value: boolean; - case: "hostname"; - } | { - /** - * `ip` specifies that the field value must be a valid IP (v4 or v6) address. - * - * IPv4 addresses are expected in the dotted decimal format—for example, "192.168.5.21". - * IPv6 addresses are expected in their text representation—for example, "::1", - * or "2001:0DB8:ABCD:0012::0". - * - * Both formats are well-defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986). - * Zone identifiers for IPv6 addresses (for example, "fe80::a%en1") are supported. - * - * If the field value isn't a valid IP address, an error message will be - * generated. - * - * ```proto - * message MyString { - * // must be a valid IP address - * string value = 1 [(buf.validate.field).string.ip = true]; - * } - * ``` - * - * @generated from field: bool ip = 14; - */ - value: boolean; - case: "ip"; - } | { - /** - * `ipv4` specifies that the field value must be a valid IPv4 address—for - * example "192.168.5.21". If the field value isn't a valid IPv4 address, an - * error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid IPv4 address - * string value = 1 [(buf.validate.field).string.ipv4 = true]; - * } - * ``` - * - * @generated from field: bool ipv4 = 15; - */ - value: boolean; - case: "ipv4"; - } | { - /** - * `ipv6` specifies that the field value must be a valid IPv6 address—for - * example "::1", or "d7a:115c:a1e0:ab12:4843:cd96:626b:430b". If the field - * value is not a valid IPv6 address, an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid IPv6 address - * string value = 1 [(buf.validate.field).string.ipv6 = true]; - * } - * ``` - * - * @generated from field: bool ipv6 = 16; - */ - value: boolean; - case: "ipv6"; - } | { - /** - * `uri` specifies that the field value must be a valid URI, for example - * "https://example.com/foo/bar?baz=quux#frag". - * - * URI is defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986). - * Zone Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)). - * - * If the field value isn't a valid URI, an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid URI - * string value = 1 [(buf.validate.field).string.uri = true]; - * } - * ``` - * - * @generated from field: bool uri = 17; - */ - value: boolean; - case: "uri"; - } | { - /** - * `uri_ref` specifies that the field value must be a valid URI Reference—either - * a URI such as "https://example.com/foo/bar?baz=quux#frag", or a Relative - * Reference such as "./foo/bar?query". - * - * URI, URI Reference, and Relative Reference are defined in the internet - * standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986). Zone - * Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)). - * - * If the field value isn't a valid URI Reference, an error message will be - * generated. - * - * ```proto - * message MyString { - * // must be a valid URI Reference - * string value = 1 [(buf.validate.field).string.uri_ref = true]; - * } - * ``` - * - * @generated from field: bool uri_ref = 18; - */ - value: boolean; - case: "uriRef"; - } | { - /** - * `address` specifies that the field value must be either a valid hostname - * (for example, "example.com"), or a valid IP (v4 or v6) address (for example, - * "192.168.0.1", or "::1"). If the field value isn't a valid hostname or IP, - * an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid hostname, or ip address - * string value = 1 [(buf.validate.field).string.address = true]; - * } - * ``` - * - * @generated from field: bool address = 21; - */ - value: boolean; - case: "address"; - } | { - /** - * `uuid` specifies that the field value must be a valid UUID as defined by - * [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2). If the - * field value isn't a valid UUID, an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid UUID - * string value = 1 [(buf.validate.field).string.uuid = true]; - * } - * ``` - * - * @generated from field: bool uuid = 22; - */ - value: boolean; - case: "uuid"; - } | { - /** - * `tuuid` (trimmed UUID) specifies that the field value must be a valid UUID as - * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2) with all dashes - * omitted. If the field value isn't a valid UUID without dashes, an error message - * will be generated. - * - * ```proto - * message MyString { - * // must be a valid trimmed UUID - * string value = 1 [(buf.validate.field).string.tuuid = true]; - * } - * ``` - * - * @generated from field: bool tuuid = 33; - */ - value: boolean; - case: "tuuid"; - } | { - /** - * `ip_with_prefixlen` specifies that the field value must be a valid IP - * (v4 or v6) address with prefix length—for example, "192.168.5.21/16" or - * "2001:0DB8:ABCD:0012::F1/64". If the field value isn't a valid IP with - * prefix length, an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid IP with prefix length - * string value = 1 [(buf.validate.field).string.ip_with_prefixlen = true]; - * } - * ``` - * - * @generated from field: bool ip_with_prefixlen = 26; - */ - value: boolean; - case: "ipWithPrefixlen"; - } | { - /** - * `ipv4_with_prefixlen` specifies that the field value must be a valid - * IPv4 address with prefix length—for example, "192.168.5.21/16". If the - * field value isn't a valid IPv4 address with prefix length, an error - * message will be generated. - * - * ```proto - * message MyString { - * // must be a valid IPv4 address with prefix length - * string value = 1 [(buf.validate.field).string.ipv4_with_prefixlen = true]; - * } - * ``` - * - * @generated from field: bool ipv4_with_prefixlen = 27; - */ - value: boolean; - case: "ipv4WithPrefixlen"; - } | { - /** - * `ipv6_with_prefixlen` specifies that the field value must be a valid - * IPv6 address with prefix length—for example, "2001:0DB8:ABCD:0012::F1/64". - * If the field value is not a valid IPv6 address with prefix length, - * an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid IPv6 address prefix length - * string value = 1 [(buf.validate.field).string.ipv6_with_prefixlen = true]; - * } - * ``` - * - * @generated from field: bool ipv6_with_prefixlen = 28; - */ - value: boolean; - case: "ipv6WithPrefixlen"; - } | { - /** - * `ip_prefix` specifies that the field value must be a valid IP (v4 or v6) - * prefix—for example, "192.168.0.0/16" or "2001:0DB8:ABCD:0012::0/64". - * - * The prefix must have all zeros for the unmasked bits. For example, - * "2001:0DB8:ABCD:0012::0/64" designates the left-most 64 bits for the - * prefix, and the remaining 64 bits must be zero. - * - * If the field value isn't a valid IP prefix, an error message will be - * generated. - * - * ```proto - * message MyString { - * // must be a valid IP prefix - * string value = 1 [(buf.validate.field).string.ip_prefix = true]; - * } - * ``` - * - * @generated from field: bool ip_prefix = 29; - */ - value: boolean; - case: "ipPrefix"; - } | { - /** - * `ipv4_prefix` specifies that the field value must be a valid IPv4 - * prefix, for example "192.168.0.0/16". - * - * The prefix must have all zeros for the unmasked bits. For example, - * "192.168.0.0/16" designates the left-most 16 bits for the prefix, - * and the remaining 16 bits must be zero. - * - * If the field value isn't a valid IPv4 prefix, an error message - * will be generated. - * - * ```proto - * message MyString { - * // must be a valid IPv4 prefix - * string value = 1 [(buf.validate.field).string.ipv4_prefix = true]; - * } - * ``` - * - * @generated from field: bool ipv4_prefix = 30; - */ - value: boolean; - case: "ipv4Prefix"; - } | { - /** - * `ipv6_prefix` specifies that the field value must be a valid IPv6 prefix—for - * example, "2001:0DB8:ABCD:0012::0/64". - * - * The prefix must have all zeros for the unmasked bits. For example, - * "2001:0DB8:ABCD:0012::0/64" designates the left-most 64 bits for the - * prefix, and the remaining 64 bits must be zero. - * - * If the field value is not a valid IPv6 prefix, an error message will be - * generated. - * - * ```proto - * message MyString { - * // must be a valid IPv6 prefix - * string value = 1 [(buf.validate.field).string.ipv6_prefix = true]; - * } - * ``` - * - * @generated from field: bool ipv6_prefix = 31; - */ - value: boolean; - case: "ipv6Prefix"; - } | { - /** - * `host_and_port` specifies that the field value must be a valid host/port - * pair—for example, "example.com:8080". - * - * The host can be one of: - * - An IPv4 address in dotted decimal format—for example, "192.168.5.21". - * - An IPv6 address enclosed in square brackets—for example, "[2001:0DB8:ABCD:0012::F1]". - * - A hostname—for example, "example.com". - * - * The port is separated by a colon. It must be non-empty, with a decimal number - * in the range of 0-65535, inclusive. - * - * @generated from field: bool host_and_port = 32; - */ - value: boolean; - case: "hostAndPort"; - } | { - /** - * `ulid` specifies that the field value must be a valid ULID (Universally Unique - * Lexicographically Sortable Identifier) as defined by the [ULID specification](https://github.com/ulid/spec). - * If the field value isn't a valid ULID, an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid ULID - * string value = 1 [(buf.validate.field).string.ulid = true]; - * } - * ``` - * - * @generated from field: bool ulid = 35; - */ - value: boolean; - case: "ulid"; - } | { - /** - * `protobuf_fqn` specifies that the field value must be a valid fully-qualified - * Protobuf name as defined by the [Protobuf Language Specification](https://protobuf.com/docs/language-spec). - * - * A fully-qualified Protobuf name is a dot-separated list of Protobuf identifiers, - * where each identifier starts with a letter or underscore and is followed by zero or - * more letters, underscores, or digits. - * - * Examples: "buf.validate", "google.protobuf.Timestamp", "my_package.MyMessage". - * - * Note: historically, fully-qualified Protobuf names were represented with a leading - * dot (for example, ".buf.validate.StringRules"). Modern Protobuf does not use the - * leading dot, and most fully-qualified names are represented without it. Use - * `protobuf_dot_fqn` if a leading dot is required. - * - * If the field value isn't a valid fully-qualified Protobuf name, an error message - * will be generated. - * - * ```proto - * message MyString { - * // value must be a valid fully-qualified Protobuf name - * string value = 1 [(buf.validate.field).string.protobuf_fqn = true]; - * } - * ``` - * - * @generated from field: bool protobuf_fqn = 37; - */ - value: boolean; - case: "protobufFqn"; - } | { - /** - * `protobuf_dot_fqn` specifies that the field value must be a valid fully-qualified - * Protobuf name with a leading dot, as defined by the - * [Protobuf Language Specification](https://protobuf.com/docs/language-spec). - * - * A fully-qualified Protobuf name with a leading dot is a dot followed by a - * dot-separated list of Protobuf identifiers, where each identifier starts with a - * letter or underscore and is followed by zero or more letters, underscores, or - * digits. - * - * Examples: ".buf.validate", ".google.protobuf.Timestamp", ".my_package.MyMessage". - * - * Note: this is the historical representation of fully-qualified Protobuf names, - * where a leading dot denotes an absolute reference. Modern Protobuf does not use - * the leading dot, and most fully-qualified names are represented without it. Most - * users will want to use `protobuf_fqn` instead. - * - * If the field value isn't a valid fully-qualified Protobuf name with a leading dot, - * an error message will be generated. - * - * ```proto - * message MyString { - * // value must be a valid fully-qualified Protobuf name with a leading dot - * string value = 1 [(buf.validate.field).string.protobuf_dot_fqn = true]; - * } - * ``` - * - * @generated from field: bool protobuf_dot_fqn = 38; - */ - value: boolean; - case: "protobufDotFqn"; - } | { - /** - * `well_known_regex` specifies a common well-known pattern - * defined as a regex. If the field value doesn't match the well-known - * regex, an error message will be generated. - * - * ```proto - * message MyString { - * // must be a valid HTTP header value - * string value = 1 [(buf.validate.field).string.well_known_regex = KNOWN_REGEX_HTTP_HEADER_VALUE]; - * } - * ``` - * - * #### KnownRegex - * - * `well_known_regex` contains some well-known patterns. - * - * | Name | Number | Description | - * |-------------------------------|--------|-------------------------------------------| - * | KNOWN_REGEX_UNSPECIFIED | 0 | | - * | KNOWN_REGEX_HTTP_HEADER_NAME | 1 | HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2) | - * | KNOWN_REGEX_HTTP_HEADER_VALUE | 2 | HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4) | - * - * @generated from field: buf.validate.KnownRegex well_known_regex = 24; - */ - value: KnownRegex; - case: "wellKnownRegex"; - } | { case: undefined; value?: undefined }; - - /** - * This applies to regexes `HTTP_HEADER_NAME` and `HTTP_HEADER_VALUE` to - * enable strict header validation. By default, this is true, and HTTP header - * validations are [RFC-compliant](https://datatracker.ietf.org/doc/html/rfc7230#section-3). Setting to false will enable looser - * validations that only disallow `\r\n\0` characters, which can be used to - * bypass header matching rules. - * - * ```proto - * message MyString { - * // The field `value` must have be a valid HTTP headers, but not enforced with strict rules. - * string value = 1 [(buf.validate.field).string.strict = false]; - * } - * ``` - * - * @generated from field: optional bool strict = 25; - */ - strict: boolean; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyString { - * string value = 1 [ - * (buf.validate.field).string.example = "hello", - * (buf.validate.field).string.example = "world" - * ]; - * } - * ``` - * - * @generated from field: repeated string example = 34; - */ - example: string[]; -}; - -/** - * Describes the message buf.validate.StringRules. - * Use `create(StringRulesSchema)` to create a new message. - */ -export const StringRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 19); - -/** - * BytesRules describe the rules applied to `bytes` values. These rules - * may also be applied to the `google.protobuf.BytesValue` Well-Known-Type. - * - * @generated from message buf.validate.BytesRules - */ -export type BytesRules = Message<"buf.validate.BytesRules"> & { - /** - * `const` requires the field value to exactly match the specified bytes - * value. If the field value doesn't match, an error message is generated. - * - * ```proto - * message MyBytes { - * // must be "\x01\x02\x03\x04" - * bytes value = 1 [(buf.validate.field).bytes.const = "\x01\x02\x03\x04"]; - * } - * ``` - * - * @generated from field: optional bytes const = 1; - */ - const: Uint8Array; - - /** - * `len` requires the field value to have the specified length in bytes. - * If the field value doesn't match, an error message is generated. - * - * ```proto - * message MyBytes { - * // value length must be 4 bytes. - * optional bytes value = 1 [(buf.validate.field).bytes.len = 4]; - * } - * ``` - * - * @generated from field: optional uint64 len = 13; - */ - len: bigint; - - /** - * `min_len` requires the field value to have at least the specified minimum - * length in bytes. - * If the field value doesn't meet the requirement, an error message is generated. - * - * ```proto - * message MyBytes { - * // value length must be at least 2 bytes. - * optional bytes value = 1 [(buf.validate.field).bytes.min_len = 2]; - * } - * ``` - * - * @generated from field: optional uint64 min_len = 2; - */ - minLen: bigint; - - /** - * `max_len` requires the field value to have at most the specified maximum - * length in bytes. - * If the field value exceeds the requirement, an error message is generated. - * - * ```proto - * message MyBytes { - * // must be at most 6 bytes. - * optional bytes value = 1 [(buf.validate.field).bytes.max_len = 6]; - * } - * ``` - * - * @generated from field: optional uint64 max_len = 3; - */ - maxLen: bigint; - - /** - * `pattern` requires the field value to match the specified regular - * expression ([RE2 syntax](https://github.com/google/re2/wiki/Syntax)). - * The value of the field must be valid UTF-8 or validation will fail with a - * runtime error. - * If the field value doesn't match the pattern, an error message is generated. - * - * ```proto - * message MyBytes { - * // value must match regex pattern "^[a-zA-Z0-9]+$". - * optional bytes value = 1 [(buf.validate.field).bytes.pattern = "^[a-zA-Z0-9]+$"]; - * } - * ``` - * - * @generated from field: optional string pattern = 4; - */ - pattern: string; - - /** - * `prefix` requires the field value to have the specified bytes at the - * beginning of the string. - * If the field value doesn't meet the requirement, an error message is generated. - * - * ```proto - * message MyBytes { - * // value does not have prefix \x01\x02 - * optional bytes value = 1 [(buf.validate.field).bytes.prefix = "\x01\x02"]; - * } - * ``` - * - * @generated from field: optional bytes prefix = 5; - */ - prefix: Uint8Array; - - /** - * `suffix` requires the field value to have the specified bytes at the end - * of the string. - * If the field value doesn't meet the requirement, an error message is generated. - * - * ```proto - * message MyBytes { - * // value does not have suffix \x03\x04 - * optional bytes value = 1 [(buf.validate.field).bytes.suffix = "\x03\x04"]; - * } - * ``` - * - * @generated from field: optional bytes suffix = 6; - */ - suffix: Uint8Array; - - /** - * `contains` requires the field value to have the specified bytes anywhere in - * the string. - * If the field value doesn't meet the requirement, an error message is generated. - * - * ```proto - * message MyBytes { - * // value does not contain \x02\x03 - * optional bytes value = 1 [(buf.validate.field).bytes.contains = "\x02\x03"]; - * } - * ``` - * - * @generated from field: optional bytes contains = 7; - */ - contains: Uint8Array; - - /** - * `in` requires the field value to be equal to one of the specified - * values. If the field value doesn't match any of the specified values, an - * error message is generated. - * - * ```proto - * message MyBytes { - * // value must in ["\x01\x02", "\x02\x03", "\x03\x04"] - * optional bytes value = 1 [(buf.validate.field).bytes.in = {"\x01\x02", "\x02\x03", "\x03\x04"}]; - * } - * ``` - * - * @generated from field: repeated bytes in = 8; - */ - in: Uint8Array[]; - - /** - * `not_in` requires the field value to be not equal to any of the specified - * values. - * If the field value matches any of the specified values, an error message is - * generated. - * - * ```proto - * message MyBytes { - * // value must not in ["\x01\x02", "\x02\x03", "\x03\x04"] - * optional bytes value = 1 [(buf.validate.field).bytes.not_in = {"\x01\x02", "\x02\x03", "\x03\x04"}]; - * } - * ``` - * - * @generated from field: repeated bytes not_in = 9; - */ - notIn: Uint8Array[]; - - /** - * WellKnown rules provide advanced rules against common byte - * patterns - * - * @generated from oneof buf.validate.BytesRules.well_known - */ - wellKnown: { - /** - * `ip` ensures that the field `value` is a valid IP address (v4 or v6) in byte format. - * If the field value doesn't meet this rule, an error message is generated. - * - * ```proto - * message MyBytes { - * // must be a valid IP address - * optional bytes value = 1 [(buf.validate.field).bytes.ip = true]; - * } - * ``` - * - * @generated from field: bool ip = 10; - */ - value: boolean; - case: "ip"; - } | { - /** - * `ipv4` ensures that the field `value` is a valid IPv4 address in byte format. - * If the field value doesn't meet this rule, an error message is generated. - * - * ```proto - * message MyBytes { - * // must be a valid IPv4 address - * optional bytes value = 1 [(buf.validate.field).bytes.ipv4 = true]; - * } - * ``` - * - * @generated from field: bool ipv4 = 11; - */ - value: boolean; - case: "ipv4"; - } | { - /** - * `ipv6` ensures that the field `value` is a valid IPv6 address in byte format. - * If the field value doesn't meet this rule, an error message is generated. - * ```proto - * message MyBytes { - * // must be a valid IPv6 address - * optional bytes value = 1 [(buf.validate.field).bytes.ipv6 = true]; - * } - * ``` - * - * @generated from field: bool ipv6 = 12; - */ - value: boolean; - case: "ipv6"; - } | { - /** - * `uuid` ensures that the field value encodes 128-bit UUID data as defined - * by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2). - * The field must contain exactly 16 bytes representing the UUID. If the - * field value isn't a valid UUID, an error message will be generated. - * - * ```proto - * message MyBytes { - * // must be a valid UUID - * optional bytes value = 1 [(buf.validate.field).bytes.uuid = true]; - * } - * ``` - * - * @generated from field: bool uuid = 15; - */ - value: boolean; - case: "uuid"; - } | { case: undefined; value?: undefined }; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyBytes { - * bytes value = 1 [ - * (buf.validate.field).bytes.example = "\x01\x02", - * (buf.validate.field).bytes.example = "\x02\x03" - * ]; - * } - * ``` - * - * @generated from field: repeated bytes example = 14; - */ - example: Uint8Array[]; -}; - -/** - * Describes the message buf.validate.BytesRules. - * Use `create(BytesRulesSchema)` to create a new message. - */ -export const BytesRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 20); - -/** - * EnumRules describe the rules applied to `enum` values. - * - * @generated from message buf.validate.EnumRules - */ -export type EnumRules = Message<"buf.validate.EnumRules"> & { - /** - * `const` requires the field value to exactly match the specified enum value. - * If the field value doesn't match, an error message is generated. - * - * ```proto - * enum MyEnum { - * MY_ENUM_UNSPECIFIED = 0; - * MY_ENUM_VALUE1 = 1; - * MY_ENUM_VALUE2 = 2; - * } - * - * message MyMessage { - * // The field `value` must be exactly MY_ENUM_VALUE1. - * MyEnum value = 1 [(buf.validate.field).enum.const = 1]; - * } - * ``` - * - * @generated from field: optional int32 const = 1; - */ - const: number; - - /** - * `defined_only` requires the field value to be one of the defined values for - * this enum, failing on any undefined value. - * - * ```proto - * enum MyEnum { - * MY_ENUM_UNSPECIFIED = 0; - * MY_ENUM_VALUE1 = 1; - * MY_ENUM_VALUE2 = 2; - * } - * - * message MyMessage { - * // The field `value` must be a defined value of MyEnum. - * MyEnum value = 1 [(buf.validate.field).enum.defined_only = true]; - * } - * ``` - * - * @generated from field: optional bool defined_only = 2; - */ - definedOnly: boolean; - - /** - * `in` requires the field value to be equal to one of the - * specified enum values. If the field value doesn't match any of the - * specified values, an error message is generated. - * - * ```proto - * enum MyEnum { - * MY_ENUM_UNSPECIFIED = 0; - * MY_ENUM_VALUE1 = 1; - * MY_ENUM_VALUE2 = 2; - * } - * - * message MyMessage { - * // The field `value` must be equal to one of the specified values. - * MyEnum value = 1 [(buf.validate.field).enum = { in: [1, 2]}]; - * } - * ``` - * - * @generated from field: repeated int32 in = 3; - */ - in: number[]; - - /** - * `not_in` requires the field value to be not equal to any of the - * specified enum values. If the field value matches one of the specified - * values, an error message is generated. - * - * ```proto - * enum MyEnum { - * MY_ENUM_UNSPECIFIED = 0; - * MY_ENUM_VALUE1 = 1; - * MY_ENUM_VALUE2 = 2; - * } - * - * message MyMessage { - * // The field `value` must not be equal to any of the specified values. - * MyEnum value = 1 [(buf.validate.field).enum = { not_in: [1, 2]}]; - * } - * ``` - * - * @generated from field: repeated int32 not_in = 4; - */ - notIn: number[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * enum MyEnum { - * MY_ENUM_UNSPECIFIED = 0; - * MY_ENUM_VALUE1 = 1; - * MY_ENUM_VALUE2 = 2; - * } - * - * message MyMessage { - * (buf.validate.field).enum.example = 1, - * (buf.validate.field).enum.example = 2 - * } - * ``` - * - * @generated from field: repeated int32 example = 5; - */ - example: number[]; -}; - -/** - * Describes the message buf.validate.EnumRules. - * Use `create(EnumRulesSchema)` to create a new message. - */ -export const EnumRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 21); - -/** - * RepeatedRules describe the rules applied to `repeated` values. - * - * @generated from message buf.validate.RepeatedRules - */ -export type RepeatedRules = Message<"buf.validate.RepeatedRules"> & { - /** - * `min_items` requires that this field must contain at least the specified - * minimum number of items. - * - * Note that `min_items = 1` is equivalent to setting a field as `required`. - * - * ```proto - * message MyRepeated { - * // value must contain at least 2 items - * repeated string value = 1 [(buf.validate.field).repeated.min_items = 2]; - * } - * ``` - * - * @generated from field: optional uint64 min_items = 1; - */ - minItems: bigint; - - /** - * `max_items` denotes that this field must not exceed a - * certain number of items as the upper limit. If the field contains more - * items than specified, an error message will be generated, requiring the - * field to maintain no more than the specified number of items. - * - * ```proto - * message MyRepeated { - * // value must contain no more than 3 item(s) - * repeated string value = 1 [(buf.validate.field).repeated.max_items = 3]; - * } - * ``` - * - * @generated from field: optional uint64 max_items = 2; - */ - maxItems: bigint; - - /** - * `unique` indicates that all elements in this field must - * be unique. This rule is strictly applicable to scalar and enum - * types, with message types not being supported. - * - * ```proto - * message MyRepeated { - * // repeated value must contain unique items - * repeated string value = 1 [(buf.validate.field).repeated.unique = true]; - * } - * ``` - * - * @generated from field: optional bool unique = 3; - */ - unique: boolean; - - /** - * `items` details the rules to be applied to each item - * in the field. Even for repeated message fields, validation is executed - * against each item unless `ignore` is specified. - * - * ```proto - * message MyRepeated { - * // The items in the field `value` must follow the specified rules. - * repeated string value = 1 [(buf.validate.field).repeated.items = { - * string: { - * min_len: 3 - * max_len: 10 - * } - * }]; - * } - * ``` - * - * Note that the `required` rule does not apply. Repeated items - * cannot be unset. - * - * @generated from field: optional buf.validate.FieldRules items = 4; - */ - items?: FieldRules | undefined; -}; - -/** - * Describes the message buf.validate.RepeatedRules. - * Use `create(RepeatedRulesSchema)` to create a new message. - */ -export const RepeatedRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 22); - -/** - * MapRules describe the rules applied to `map` values. - * - * @generated from message buf.validate.MapRules - */ -export type MapRules = Message<"buf.validate.MapRules"> & { - /** - * Specifies the minimum number of key-value pairs allowed. If the field has - * fewer key-value pairs than specified, an error message is generated. - * - * ```proto - * message MyMap { - * // The field `value` must have at least 2 key-value pairs. - * map value = 1 [(buf.validate.field).map.min_pairs = 2]; - * } - * ``` - * - * @generated from field: optional uint64 min_pairs = 1; - */ - minPairs: bigint; - - /** - * Specifies the maximum number of key-value pairs allowed. If the field has - * more key-value pairs than specified, an error message is generated. - * - * ```proto - * message MyMap { - * // The field `value` must have at most 3 key-value pairs. - * map value = 1 [(buf.validate.field).map.max_pairs = 3]; - * } - * ``` - * - * @generated from field: optional uint64 max_pairs = 2; - */ - maxPairs: bigint; - - /** - * Specifies the rules to be applied to each key in the field. - * - * ```proto - * message MyMap { - * // The keys in the field `value` must follow the specified rules. - * map value = 1 [(buf.validate.field).map.keys = { - * string: { - * min_len: 3 - * max_len: 10 - * } - * }]; - * } - * ``` - * - * Note that the `required` rule does not apply. Map keys cannot be unset. - * - * @generated from field: optional buf.validate.FieldRules keys = 4; - */ - keys?: FieldRules | undefined; - - /** - * Specifies the rules to be applied to the value of each key in the - * field. Message values will still have their validations evaluated unless - * `ignore` is specified. - * - * ```proto - * message MyMap { - * // The values in the field `value` must follow the specified rules. - * map value = 1 [(buf.validate.field).map.values = { - * string: { - * min_len: 5 - * max_len: 20 - * } - * }]; - * } - * ``` - * Note that the `required` rule does not apply. Map values cannot be unset. - * - * @generated from field: optional buf.validate.FieldRules values = 5; - */ - values?: FieldRules | undefined; -}; - -/** - * Describes the message buf.validate.MapRules. - * Use `create(MapRulesSchema)` to create a new message. - */ -export const MapRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 23); - -/** - * AnyRules describe rules applied exclusively to the `google.protobuf.Any` well-known type. - * - * @generated from message buf.validate.AnyRules - */ -export type AnyRules = Message<"buf.validate.AnyRules"> & { - /** - * `in` requires the field's `type_url` to be equal to one of the - * specified values. If it doesn't match any of the specified values, an error - * message is generated. - * - * ```proto - * message MyAny { - * // The `value` field must have a `type_url` equal to one of the specified values. - * google.protobuf.Any value = 1 [(buf.validate.field).any = { - * in: ["type.googleapis.com/MyType1", "type.googleapis.com/MyType2"] - * }]; - * } - * ``` - * - * @generated from field: repeated string in = 2; - */ - in: string[]; - - /** - * `not_in` requires the field's type_url to be not equal to any of the specified values. If it matches any of the specified values, an error message is generated. - * - * ```proto - * message MyAny { - * // The `value` field must not have a `type_url` equal to any of the specified values. - * google.protobuf.Any value = 1 [(buf.validate.field).any = { - * not_in: ["type.googleapis.com/ForbiddenType1", "type.googleapis.com/ForbiddenType2"] - * }]; - * } - * ``` - * - * @generated from field: repeated string not_in = 3; - */ - notIn: string[]; -}; - -/** - * Describes the message buf.validate.AnyRules. - * Use `create(AnyRulesSchema)` to create a new message. - */ -export const AnyRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 24); - -/** - * DurationRules describe the rules applied exclusively to the `google.protobuf.Duration` well-known type. - * - * @generated from message buf.validate.DurationRules - */ -export type DurationRules = Message<"buf.validate.DurationRules"> & { - /** - * `const` dictates that the field must match the specified value of the `google.protobuf.Duration` type exactly. - * If the field's value deviates from the specified value, an error message - * will be generated. - * - * ```proto - * message MyDuration { - * // value must equal 5s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = "5s"]; - * } - * ``` - * - * @generated from field: optional google.protobuf.Duration const = 2; - */ - const?: Duration | undefined; - - /** - * @generated from oneof buf.validate.DurationRules.less_than - */ - lessThan: { - /** - * `lt` stipulates that the field must be less than the specified value of the `google.protobuf.Duration` type, - * exclusive. If the field's value is greater than or equal to the specified - * value, an error message will be generated. - * - * ```proto - * message MyDuration { - * // must be less than 5s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = "5s"]; - * } - * ``` - * - * @generated from field: google.protobuf.Duration lt = 3; - */ - value: Duration; - case: "lt"; - } | { - /** - * `lte` indicates that the field must be less than or equal to the specified - * value of the `google.protobuf.Duration` type, inclusive. If the field's value is greater than the specified value, - * an error message will be generated. - * - * ```proto - * message MyDuration { - * // must be less than or equal to 10s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = "10s"]; - * } - * ``` - * - * @generated from field: google.protobuf.Duration lte = 4; - */ - value: Duration; - case: "lte"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.DurationRules.greater_than - */ - greaterThan: { - /** - * `gt` requires the duration field value to be greater than the specified - * value (exclusive). If the value of `gt` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyDuration { - * // duration must be greater than 5s [duration.gt] - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gt = { seconds: 5 }]; - * - * // duration must be greater than 5s and less than 10s [duration.gt_lt] - * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gt: { seconds: 5 }, lt: { seconds: 10 } }]; - * - * // duration must be greater than 10s or less than 5s [duration.gt_lt_exclusive] - * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gt: { seconds: 10 }, lt: { seconds: 5 } }]; - * } - * ``` - * - * @generated from field: google.protobuf.Duration gt = 5; - */ - value: Duration; - case: "gt"; - } | { - /** - * `gte` requires the duration field value to be greater than or equal to the - * specified value (exclusive). If the value of `gte` is larger than a - * specified `lt` or `lte`, the range is reversed, and the field value must - * be outside the specified range. If the field value doesn't meet the - * required conditions, an error message is generated. - * - * ```proto - * message MyDuration { - * // duration must be greater than or equal to 5s [duration.gte] - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gte = { seconds: 5 }]; - * - * // duration must be greater than or equal to 5s and less than 10s [duration.gte_lt] - * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gte: { seconds: 5 }, lt: { seconds: 10 } }]; - * - * // duration must be greater than or equal to 10s or less than 5s [duration.gte_lt_exclusive] - * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gte: { seconds: 10 }, lt: { seconds: 5 } }]; - * } - * ``` - * - * @generated from field: google.protobuf.Duration gte = 6; - */ - value: Duration; - case: "gte"; - } | { case: undefined; value?: undefined }; - - /** - * `in` asserts that the field must be equal to one of the specified values of the `google.protobuf.Duration` type. - * If the field's value doesn't correspond to any of the specified values, - * an error message will be generated. - * - * ```proto - * message MyDuration { - * // must be in list [1s, 2s, 3s] - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = ["1s", "2s", "3s"]]; - * } - * ``` - * - * @generated from field: repeated google.protobuf.Duration in = 7; - */ - in: Duration[]; - - /** - * `not_in` denotes that the field must not be equal to - * any of the specified values of the `google.protobuf.Duration` type. - * If the field's value matches any of these values, an error message will be - * generated. - * - * ```proto - * message MyDuration { - * // value must not be in list [1s, 2s, 3s] - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.not_in = ["1s", "2s", "3s"]]; - * } - * ``` - * - * @generated from field: repeated google.protobuf.Duration not_in = 8; - */ - notIn: Duration[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyDuration { - * google.protobuf.Duration value = 1 [ - * (buf.validate.field).duration.example = { seconds: 1 }, - * (buf.validate.field).duration.example = { seconds: 2 }, - * ]; - * } - * ``` - * - * @generated from field: repeated google.protobuf.Duration example = 9; - */ - example: Duration[]; -}; - -/** - * Describes the message buf.validate.DurationRules. - * Use `create(DurationRulesSchema)` to create a new message. - */ -export const DurationRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 25); - -/** - * FieldMaskRules describe rules applied exclusively to the `google.protobuf.FieldMask` well-known type. - * - * @generated from message buf.validate.FieldMaskRules - */ -export type FieldMaskRules = Message<"buf.validate.FieldMaskRules"> & { - /** - * `const` dictates that the field must match the specified value of the `google.protobuf.FieldMask` type exactly. - * If the field's value deviates from the specified value, an error message - * will be generated. - * - * ```proto - * message MyFieldMask { - * // value must equal ["a"] - * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask.const = { - * paths: ["a"] - * }]; - * } - * ``` - * - * @generated from field: optional google.protobuf.FieldMask const = 1; - */ - const?: FieldMask | undefined; - - /** - * `in` requires the field value to only contain paths matching specified - * values or their subpaths. - * If any of the field value's paths doesn't match the rule, - * an error message is generated. - * See: https://protobuf.dev/reference/protobuf/google.protobuf/#field-mask - * - * ```proto - * message MyFieldMask { - * // The `value` FieldMask must only contain paths listed in `in`. - * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask = { - * in: ["a", "b", "c.a"] - * }]; - * } - * ``` - * - * @generated from field: repeated string in = 2; - */ - in: string[]; - - /** - * `not_in` requires the field value to not contain paths matching specified - * values or their subpaths. - * If any of the field value's paths matches the rule, - * an error message is generated. - * See: https://protobuf.dev/reference/protobuf/google.protobuf/#field-mask - * - * ```proto - * message MyFieldMask { - * // The `value` FieldMask shall not contain paths listed in `not_in`. - * google.protobuf.FieldMask value = 1 [(buf.validate.field).field_mask = { - * not_in: ["forbidden", "immutable", "c.a"] - * }]; - * } - * ``` - * - * @generated from field: repeated string not_in = 3; - */ - notIn: string[]; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyFieldMask { - * google.protobuf.FieldMask value = 1 [ - * (buf.validate.field).field_mask.example = { paths: ["a", "b"] }, - * (buf.validate.field).field_mask.example = { paths: ["c.a", "d"] }, - * ]; - * } - * ``` - * - * @generated from field: repeated google.protobuf.FieldMask example = 4; - */ - example: FieldMask[]; -}; - -/** - * Describes the message buf.validate.FieldMaskRules. - * Use `create(FieldMaskRulesSchema)` to create a new message. - */ -export const FieldMaskRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 26); - -/** - * TimestampRules describe the rules applied exclusively to the `google.protobuf.Timestamp` well-known type. - * - * @generated from message buf.validate.TimestampRules - */ -export type TimestampRules = Message<"buf.validate.TimestampRules"> & { - /** - * `const` dictates that this field, of the `google.protobuf.Timestamp` type, must exactly match the specified value. If the field value doesn't correspond to the specified timestamp, an error message will be generated. - * - * ```proto - * message MyTimestamp { - * // value must equal 2023-05-03T10:00:00Z - * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.const = {seconds: 1727998800}]; - * } - * ``` - * - * @generated from field: optional google.protobuf.Timestamp const = 2; - */ - const?: Timestamp | undefined; - - /** - * @generated from oneof buf.validate.TimestampRules.less_than - */ - lessThan: { - /** - * `lt` requires the timestamp field value to be less than the specified value (field < value). If the field value doesn't meet the required conditions, an error message is generated. - * - * ```proto - * message MyTimestamp { - * // timestamp must be less than '2023-01-01T00:00:00Z' [timestamp.lt] - * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lt = { seconds: 1672444800 }]; - * } - * ``` - * - * @generated from field: google.protobuf.Timestamp lt = 3; - */ - value: Timestamp; - case: "lt"; - } | { - /** - * `lte` requires the timestamp field value to be less than or equal to the specified value (field <= value). If the field value doesn't meet the required conditions, an error message is generated. - * - * ```proto - * message MyTimestamp { - * // timestamp must be less than or equal to '2023-05-14T00:00:00Z' [timestamp.lte] - * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lte = { seconds: 1678867200 }]; - * } - * ``` - * - * @generated from field: google.protobuf.Timestamp lte = 4; - */ - value: Timestamp; - case: "lte"; - } | { - /** - * `lt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be less than the current time. `lt_now` can only be used with the `within` rule. - * - * ```proto - * message MyTimestamp { - * // must be less than now - * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.lt_now = true]; - * } - * ``` - * - * @generated from field: bool lt_now = 7; - */ - value: boolean; - case: "ltNow"; - } | { case: undefined; value?: undefined }; - - /** - * @generated from oneof buf.validate.TimestampRules.greater_than - */ - greaterThan: { - /** - * `gt` requires the timestamp field value to be greater than the specified - * value (exclusive). If the value of `gt` is larger than a specified `lt` - * or `lte`, the range is reversed, and the field value must be outside the - * specified range. If the field value doesn't meet the required conditions, - * an error message is generated. - * - * ```proto - * message MyTimestamp { - * // timestamp must be greater than '2023-01-01T00:00:00Z' [timestamp.gt] - * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gt = { seconds: 1672444800 }]; - * - * // timestamp must be greater than '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gt_lt] - * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gt: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }]; - * - * // timestamp must be greater than '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gt_lt_exclusive] - * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gt: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }]; - * } - * ``` - * - * @generated from field: google.protobuf.Timestamp gt = 5; - */ - value: Timestamp; - case: "gt"; - } | { - /** - * `gte` requires the timestamp field value to be greater than or equal to the - * specified value (exclusive). If the value of `gte` is larger than a - * specified `lt` or `lte`, the range is reversed, and the field value - * must be outside the specified range. If the field value doesn't meet - * the required conditions, an error message is generated. - * - * ```proto - * message MyTimestamp { - * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' [timestamp.gte] - * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gte = { seconds: 1672444800 }]; - * - * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gte_lt] - * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gte: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }]; - * - * // timestamp must be greater than or equal to '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gte_lt_exclusive] - * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gte: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }]; - * } - * ``` - * - * @generated from field: google.protobuf.Timestamp gte = 6; - */ - value: Timestamp; - case: "gte"; - } | { - /** - * `gt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be greater than the current time. `gt_now` can only be used with the `within` rule. - * - * ```proto - * message MyTimestamp { - * // must be greater than now - * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.gt_now = true]; - * } - * ``` - * - * @generated from field: bool gt_now = 8; - */ - value: boolean; - case: "gtNow"; - } | { case: undefined; value?: undefined }; - - /** - * `within` specifies that this field, of the `google.protobuf.Timestamp` type, must be within the specified duration of the current time. If the field value isn't within the duration, an error message is generated. - * - * ```proto - * message MyTimestamp { - * // must be within 1 hour of now - * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.within = {seconds: 3600}]; - * } - * ``` - * - * @generated from field: optional google.protobuf.Duration within = 9; - */ - within?: Duration | undefined; - - /** - * `example` specifies values that the field may have. These values SHOULD - * conform to other rules. `example` values will not impact validation - * but may be used as helpful guidance on how to populate the given field. - * - * ```proto - * message MyTimestamp { - * google.protobuf.Timestamp value = 1 [ - * (buf.validate.field).timestamp.example = { seconds: 1672444800 }, - * (buf.validate.field).timestamp.example = { seconds: 1672531200 }, - * ]; - * } - * ``` - * - * @generated from field: repeated google.protobuf.Timestamp example = 10; - */ - example: Timestamp[]; -}; - -/** - * Describes the message buf.validate.TimestampRules. - * Use `create(TimestampRulesSchema)` to create a new message. - */ -export const TimestampRulesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 27); - -/** - * `Violations` is a collection of `Violation` messages. This message type is returned by - * Protovalidate when a proto message fails to meet the requirements set by the `Rule` validation rules. - * Each individual violation is represented by a `Violation` message. - * - * @generated from message buf.validate.Violations - */ -export type Violations = Message<"buf.validate.Violations"> & { - /** - * `violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected. - * - * @generated from field: repeated buf.validate.Violation violations = 1; - */ - violations: Violation[]; -}; - -/** - * Describes the message buf.validate.Violations. - * Use `create(ViolationsSchema)` to create a new message. - */ -export const ViolationsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 28); - -/** - * `Violation` represents a single instance where a validation rule, expressed - * as a `Rule`, was not met. It provides information about the field that - * caused the violation, the specific rule that wasn't fulfilled, and a - * human-readable error message. - * - * For example, consider the following message: - * - * ```proto - * message User { - * int32 age = 1 [(buf.validate.field).cel = { - * id: "user.age", - * expression: "this < 18 ? 'User must be at least 18 years old' : ''", - * }]; - * } - * ``` - * - * It could produce the following violation: - * - * ```json - * { - * "ruleId": "user.age", - * "message": "User must be at least 18 years old", - * "field": { - * "elements": [ - * { - * "fieldNumber": 1, - * "fieldName": "age", - * "fieldType": "TYPE_INT32" - * } - * ] - * }, - * "rule": { - * "elements": [ - * { - * "fieldNumber": 23, - * "fieldName": "cel", - * "fieldType": "TYPE_MESSAGE", - * "index": "0" - * } - * ] - * } - * } - * ``` - * - * @generated from message buf.validate.Violation - */ -export type Violation = Message<"buf.validate.Violation"> & { - /** - * `field` is a machine-readable path to the field that failed validation. - * This could be a nested field, in which case the path will include all the parent fields leading to the actual field that caused the violation. - * - * For example, consider the following message: - * - * ```proto - * message Message { - * bool a = 1 [(buf.validate.field).required = true]; - * } - * ``` - * - * It could produce the following violation: - * - * ```textproto - * violation { - * field { element { field_number: 1, field_name: "a", field_type: 8 } } - * ... - * } - * ``` - * - * @generated from field: optional buf.validate.FieldPath field = 5; - */ - field?: FieldPath | undefined; - - /** - * `rule` is a machine-readable path that points to the specific rule that failed validation. - * This will be a nested field starting from the FieldRules of the field that failed validation. - * For custom rules, this will provide the path of the rule, e.g. `cel[0]`. - * - * For example, consider the following message: - * - * ```proto - * message Message { - * bool a = 1 [(buf.validate.field).required = true]; - * bool b = 2 [(buf.validate.field).cel = { - * id: "custom_rule", - * expression: "!this ? 'b must be true': ''" - * }] - * } - * ``` - * - * It could produce the following violations: - * - * ```textproto - * violation { - * rule { element { field_number: 25, field_name: "required", field_type: 8 } } - * ... - * } - * violation { - * rule { element { field_number: 23, field_name: "cel", field_type: 11, index: 0 } } - * ... - * } - * ``` - * - * @generated from field: optional buf.validate.FieldPath rule = 6; - */ - rule?: FieldPath | undefined; - - /** - * `rule_id` is the unique identifier of the `Rule` that was not fulfilled. - * This is the same `id` that was specified in the `Rule` message, allowing easy tracing of which rule was violated. - * - * @generated from field: optional string rule_id = 2; - */ - ruleId: string; - - /** - * `message` is a human-readable error message that describes the nature of the violation. - * This can be the default error message from the violated `Rule`, or it can be a custom message that gives more context about the violation. - * - * @generated from field: optional string message = 3; - */ - message: string; - - /** - * `for_key` indicates whether the violation was caused by a map key, rather than a value. - * - * @generated from field: optional bool for_key = 4; - */ - forKey: boolean; -}; - -/** - * Describes the message buf.validate.Violation. - * Use `create(ViolationSchema)` to create a new message. - */ -export const ViolationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 29); - -/** - * `FieldPath` provides a path to a nested protobuf field. - * - * This message provides enough information to render a dotted field path even without protobuf descriptors. - * It also provides enough information to resolve a nested field through unknown wire data. - * - * @generated from message buf.validate.FieldPath - */ -export type FieldPath = Message<"buf.validate.FieldPath"> & { - /** - * `elements` contains each element of the path, starting from the root and recursing downward. - * - * @generated from field: repeated buf.validate.FieldPathElement elements = 1; - */ - elements: FieldPathElement[]; -}; - -/** - * Describes the message buf.validate.FieldPath. - * Use `create(FieldPathSchema)` to create a new message. - */ -export const FieldPathSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 30); - -/** - * `FieldPathElement` provides enough information to nest through a single protobuf field. - * - * If the selected field is a map or repeated field, the `subscript` value selects a specific element from it. - * A path that refers to a value nested under a map key or repeated field index will have a `subscript` value. - * The `field_type` field allows unambiguous resolution of a field even if descriptors are not available. - * - * @generated from message buf.validate.FieldPathElement - */ -export type FieldPathElement = Message<"buf.validate.FieldPathElement"> & { - /** - * `field_number` is the field number this path element refers to. - * - * @generated from field: optional int32 field_number = 1; - */ - fieldNumber: number; - - /** - * `field_name` contains the field name this path element refers to. - * This can be used to display a human-readable path even if the field number is unknown. - * - * @generated from field: optional string field_name = 2; - */ - fieldName: string; - - /** - * `field_type` specifies the type of this field. When using reflection, this value is not needed. - * - * This value is provided to make it possible to traverse unknown fields through wire data. - * When traversing wire data, be mindful of both packed[1] and delimited[2] encoding schemes. - * - * [1]: https://protobuf.dev/programming-guides/encoding/#packed - * [2]: https://protobuf.dev/programming-guides/encoding/#groups - * - * N.B.: Although groups are deprecated, the corresponding delimited encoding scheme is not, and - * can be explicitly used in Protocol Buffers 2023 Edition. - * - * @generated from field: optional google.protobuf.FieldDescriptorProto.Type field_type = 3; - */ - fieldType: FieldDescriptorProto_Type; - - /** - * `key_type` specifies the map key type of this field. This value is useful when traversing - * unknown fields through wire data: specifically, it allows handling the differences between - * different integer encodings. - * - * @generated from field: optional google.protobuf.FieldDescriptorProto.Type key_type = 4; - */ - keyType: FieldDescriptorProto_Type; - - /** - * `value_type` specifies map value type of this field. This is useful if you want to display a - * value inside unknown fields through wire data. - * - * @generated from field: optional google.protobuf.FieldDescriptorProto.Type value_type = 5; - */ - valueType: FieldDescriptorProto_Type; - - /** - * `subscript` contains a repeated index or map key, if this path element nests into a repeated or map field. - * - * @generated from oneof buf.validate.FieldPathElement.subscript - */ - subscript: { - /** - * `index` specifies a 0-based index into a repeated field. - * - * @generated from field: uint64 index = 6; - */ - value: bigint; - case: "index"; - } | { - /** - * `bool_key` specifies a map key of type bool. - * - * @generated from field: bool bool_key = 7; - */ - value: boolean; - case: "boolKey"; - } | { - /** - * `int_key` specifies a map key of type int32, int64, sint32, sint64, sfixed32 or sfixed64. - * - * @generated from field: int64 int_key = 8; - */ - value: bigint; - case: "intKey"; - } | { - /** - * `uint_key` specifies a map key of type uint32, uint64, fixed32 or fixed64. - * - * @generated from field: uint64 uint_key = 9; - */ - value: bigint; - case: "uintKey"; - } | { - /** - * `string_key` specifies a map key of type string. - * - * @generated from field: string string_key = 10; - */ - value: string; - case: "stringKey"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message buf.validate.FieldPathElement. - * Use `create(FieldPathElementSchema)` to create a new message. - */ -export const FieldPathElementSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_buf_validate_validate, 31); - -/** - * Specifies how `FieldRules.ignore` behaves, depending on the field's value, and - * whether the field tracks presence. - * - * @generated from enum buf.validate.Ignore - */ -export enum Ignore { - /** - * Ignore rules if the field tracks presence and is unset. This is the default - * behavior. - * - * In proto3, only message fields, members of a Protobuf `oneof`, and fields - * with the `optional` label track presence. Consequently, the following fields - * are always validated, whether a value is set or not: - * - * ```proto - * syntax="proto3"; - * - * message RulesApply { - * string email = 1 [ - * (buf.validate.field).string.email = true - * ]; - * int32 age = 2 [ - * (buf.validate.field).int32.gt = 0 - * ]; - * repeated string labels = 3 [ - * (buf.validate.field).repeated.min_items = 1 - * ]; - * } - * ``` - * - * In contrast, the following fields track presence, and are only validated if - * a value is set: - * - * ```proto - * syntax="proto3"; - * - * message RulesApplyIfSet { - * optional string email = 1 [ - * (buf.validate.field).string.email = true - * ]; - * oneof ref { - * string reference = 2 [ - * (buf.validate.field).string.uuid = true - * ]; - * string name = 3 [ - * (buf.validate.field).string.min_len = 4 - * ]; - * } - * SomeMessage msg = 4 [ - * (buf.validate.field).cel = {/* ... *\/} - * ]; - * } - * ``` - * - * To ensure that such a field is set, add the `required` rule. - * - * To learn which fields track presence, see the - * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat). - * - * @generated from enum value: IGNORE_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * Ignore rules if the field is unset, or set to the zero value. - * - * The zero value depends on the field type: - * - For strings, the zero value is the empty string. - * - For bytes, the zero value is empty bytes. - * - For bool, the zero value is false. - * - For numeric types, the zero value is zero. - * - For enums, the zero value is the first defined enum value. - * - For repeated fields, the zero is an empty list. - * - For map fields, the zero is an empty map. - * - For message fields, absence of the message (typically a null-value) is considered zero value. - * - * For fields that track presence (e.g. adding the `optional` label in proto3), - * this a no-op and behavior is the same as the default `IGNORE_UNSPECIFIED`. - * - * @generated from enum value: IGNORE_IF_ZERO_VALUE = 1; - */ - IF_ZERO_VALUE = 1, - - /** - * Always ignore rules, including the `required` rule. - * - * This is useful for ignoring the rules of a referenced message, or to - * temporarily ignore rules during development. - * - * ```proto - * message MyMessage { - * // The field's rules will always be ignored, including any validations - * // on value's fields. - * MyOtherMessage value = 1 [ - * (buf.validate.field).ignore = IGNORE_ALWAYS - * ]; - * } - * ``` - * - * @generated from enum value: IGNORE_ALWAYS = 3; - */ - ALWAYS = 3, -} - -/** - * Describes the enum buf.validate.Ignore. - */ -export const IgnoreSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_buf_validate_validate, 0); - -/** - * KnownRegex contains some well-known patterns. - * - * @generated from enum buf.validate.KnownRegex - */ -export enum KnownRegex { - /** - * @generated from enum value: KNOWN_REGEX_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2). - * - * @generated from enum value: KNOWN_REGEX_HTTP_HEADER_NAME = 1; - */ - HTTP_HEADER_NAME = 1, - - /** - * HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4). - * - * @generated from enum value: KNOWN_REGEX_HTTP_HEADER_VALUE = 2; - */ - HTTP_HEADER_VALUE = 2, -} - -/** - * Describes the enum buf.validate.KnownRegex. - */ -export const KnownRegexSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_buf_validate_validate, 1); - -/** - * Rules specify the validations to be performed on this message. By default, - * no validation is performed against a message. - * - * @generated from extension: optional buf.validate.MessageRules message = 1159; - */ -export const message: GenExtension = /*@__PURE__*/ - extDesc(file_buf_validate_validate, 0); - -/** - * Rules specify the validations to be performed on this oneof. By default, - * no validation is performed against a oneof. - * - * @generated from extension: optional buf.validate.OneofRules oneof = 1159; - */ -export const oneof: GenExtension = /*@__PURE__*/ - extDesc(file_buf_validate_validate, 1); - -/** - * Rules specify the validations to be performed on this field. By default, - * no validation is performed against a field. - * - * @generated from extension: optional buf.validate.FieldRules field = 1159; - */ -export const field: GenExtension = /*@__PURE__*/ - extDesc(file_buf_validate_validate, 2); - -/** - * Specifies predefined rules. When extending a standard rule message, - * this adds additional CEL expressions that apply when the extension is used. - * - * ```proto - * extend buf.validate.Int32Rules { - * bool is_zero [(buf.validate.predefined).cel = { - * id: "int32.is_zero", - * message: "must be zero", - * expression: "!rule || this == 0", - * }]; - * } - * - * message Foo { - * int32 reserved = 1 [(buf.validate.field).int32.(is_zero) = true]; - * } - * ``` - * - * @generated from extension: optional buf.validate.PredefinedRules predefined = 1160; - */ -export const predefined: GenExtension = /*@__PURE__*/ - extDesc(file_buf_validate_validate, 3); - diff --git a/meshexplorer/src/gen/meshexplorer/v1/chat_pb.ts b/meshexplorer/src/gen/meshexplorer/v1/chat_pb.ts deleted file mode 100644 index 8094683..0000000 --- a/meshexplorer/src/gen/meshexplorer/v1/chat_pb.ts +++ /dev/null @@ -1,292 +0,0 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none" -// @generated from file meshexplorer/v1/chat.proto (package meshexplorer.v1, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import { file_buf_validate_validate } from "../../buf/validate/validate_pb"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file meshexplorer/v1/chat.proto. - */ -export const file_meshexplorer_v1_chat: GenFile = /*@__PURE__*/ - fileDesc("ChptZXNoZXhwbG9yZXIvdjEvY2hhdC5wcm90bxIPbWVzaGV4cGxvcmVyLnYxImQKDk9yaWdpblBhdGhJbmZvEg4KBm9yaWdpbhgBIAEoCRIVCg1vcmlnaW5fcHVia2V5GAIgASgJEgwKBHBhdGgYAyABKAkSDgoGYnJva2VyGAQgASgJEg0KBXRvcGljGAUgASgJImQKDURlY3J5cHRlZENoYXQSEQoJdGltZXN0YW1wGAEgASgBEhAKCG1zZ190eXBlGAIgASgFEg4KBnNlbmRlchgDIAEoCRIMCgR0ZXh0GAQgASgJEhAKCHJhd190ZXh0GAUgASgJIqkCCgtDaGF0TWVzc2FnZRIYChBpbmdlc3RfdGltZXN0YW1wGAEgASgJEhYKDm1lc2hfdGltZXN0YW1wGAIgASgJEhQKDGNoYW5uZWxfaGFzaBgDIAEoCRILCgNtYWMYBCABKAkSGQoRZW5jcnlwdGVkX21lc3NhZ2UYBSABKAkSFQoNbWVzc2FnZV9jb3VudBgGIAEoBRI5ChBvcmlnaW5fcGF0aF9pbmZvGAcgAygLMh8ubWVzaGV4cGxvcmVyLnYxLk9yaWdpblBhdGhJbmZvEhIKCm1lc3NhZ2VfaWQYCCABKAkSNgoJZGVjcnlwdGVkGAkgASgLMh4ubWVzaGV4cGxvcmVyLnYxLkRlY3J5cHRlZENoYXRIAIgBAUIMCgpfZGVjcnlwdGVkIv4BCg5HZXRDaGF0UmVxdWVzdBIeCgVsaW1pdBgBIAEoBUIKukgHGgUY6AcoAUgAiAEBEhMKBmJlZm9yZRgCIAEoCUgBiAEBEhIKBWFmdGVyGAMgASgJSAKIAQESLgoKY2hhbm5lbF9pZBgEIAEoCUIVukgSchAyDl5bMC05QS1GYS1mXSskSAOIAQESEwoGcmVnaW9uGAUgASgJSASIAQESDwoHZGVjcnlwdBgGIAEoCBIUCgxwcml2YXRlX2tleXMYByADKAlCCAoGX2xpbWl0QgkKB19iZWZvcmVCCAoGX2FmdGVyQg0KC19jaGFubmVsX2lkQgkKB19yZWdpb24iQQoPR2V0Q2hhdFJlc3BvbnNlEi4KCG1lc3NhZ2VzGAEgAygLMhwubWVzaGV4cGxvcmVyLnYxLkNoYXRNZXNzYWdlIqICChFTdHJlYW1DaGF0UmVxdWVzdBIuCgpjaGFubmVsX2lkGAEgASgJQhW6SBJyEDIOXlswLTlBLUZhLWZdKyRIAIgBARITCgZyZWdpb24YAiABKAlIAYgBARIPCgdkZWNyeXB0GAMgASgIEhQKDHByaXZhdGVfa2V5cxgEIAMoCRImCg1wb2xsX2ludGVydmFsGAUgASgFQgq6SAcaBRiQTihkSAKIAQESIQoIbWF4X3Jvd3MYBiABKAVCCrpIBxoFGOgHKApIA4gBARIdChVza2lwX2luaXRpYWxfbWVzc2FnZXMYByABKAhCDQoLX2NoYW5uZWxfaWRCCQoHX3JlZ2lvbkIQCg5fcG9sbF9pbnRlcnZhbEILCglfbWF4X3Jvd3MyrQEKC0NoYXRTZXJ2aWNlEkwKB0dldENoYXQSHy5tZXNoZXhwbG9yZXIudjEuR2V0Q2hhdFJlcXVlc3QaIC5tZXNoZXhwbG9yZXIudjEuR2V0Q2hhdFJlc3BvbnNlElAKClN0cmVhbUNoYXQSIi5tZXNoZXhwbG9yZXIudjEuU3RyZWFtQ2hhdFJlcXVlc3QaHC5tZXNoZXhwbG9yZXIudjEuQ2hhdE1lc3NhZ2UwAWIGcHJvdG8z", [file_buf_validate_validate]); - -/** - * One (origin, origin_pubkey, path, broker, topic) reception tuple. - * - * @generated from message meshexplorer.v1.OriginPathInfo - */ -export type OriginPathInfo = Message<"meshexplorer.v1.OriginPathInfo"> & { - /** - * @generated from field: string origin = 1; - */ - origin: string; - - /** - * @generated from field: string origin_pubkey = 2; - */ - originPubkey: string; - - /** - * @generated from field: string path = 3; - */ - path: string; - - /** - * @generated from field: string broker = 4; - */ - broker: string; - - /** - * @generated from field: string topic = 5; - */ - topic: string; -}; - -/** - * Describes the message meshexplorer.v1.OriginPathInfo. - * Use `create(OriginPathInfoSchema)` to create a new message. - */ -export const OriginPathInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_chat, 0); - -/** - * A parsed/decrypted public-channel message (parseMeshcoreGroupMessage). - * - * @generated from message meshexplorer.v1.DecryptedChat - */ -export type DecryptedChat = Message<"meshexplorer.v1.DecryptedChat"> & { - /** - * @generated from field: double timestamp = 1; - */ - timestamp: number; - - /** - * @generated from field: int32 msg_type = 2; - */ - msgType: number; - - /** - * @generated from field: string sender = 3; - */ - sender: string; - - /** - * @generated from field: string text = 4; - */ - text: string; - - /** - * @generated from field: string raw_text = 5; - */ - rawText: string; -}; - -/** - * Describes the message meshexplorer.v1.DecryptedChat. - * Use `create(DecryptedChatSchema)` to create a new message. - */ -export const DecryptedChatSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_chat, 1); - -/** - * @generated from message meshexplorer.v1.ChatMessage - */ -export type ChatMessage = Message<"meshexplorer.v1.ChatMessage"> & { - /** - * @generated from field: string ingest_timestamp = 1; - */ - ingestTimestamp: string; - - /** - * @generated from field: string mesh_timestamp = 2; - */ - meshTimestamp: string; - - /** - * @generated from field: string channel_hash = 3; - */ - channelHash: string; - - /** - * @generated from field: string mac = 4; - */ - mac: string; - - /** - * Hex-encoded ciphertext. - * - * @generated from field: string encrypted_message = 5; - */ - encryptedMessage: string; - - /** - * @generated from field: int32 message_count = 6; - */ - messageCount: number; - - /** - * @generated from field: repeated meshexplorer.v1.OriginPathInfo origin_path_info = 7; - */ - originPathInfo: OriginPathInfo[]; - - /** - * @generated from field: string message_id = 8; - */ - messageId: string; - - /** - * Present only when decrypt was requested and decryption succeeded. - * - * @generated from field: optional meshexplorer.v1.DecryptedChat decrypted = 9; - */ - decrypted?: DecryptedChat | undefined; -}; - -/** - * Describes the message meshexplorer.v1.ChatMessage. - * Use `create(ChatMessageSchema)` to create a new message. - */ -export const ChatMessageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_chat, 2); - -/** - * @generated from message meshexplorer.v1.GetChatRequest - */ -export type GetChatRequest = Message<"meshexplorer.v1.GetChatRequest"> & { - /** - * @generated from field: optional int32 limit = 1; - */ - limit?: number | undefined; - - /** - * @generated from field: optional string before = 2; - */ - before?: string | undefined; - - /** - * @generated from field: optional string after = 3; - */ - after?: string | undefined; - - /** - * @generated from field: optional string channel_id = 4; - */ - channelId?: string | undefined; - - /** - * @generated from field: optional string region = 5; - */ - region?: string | undefined; - - /** - * @generated from field: bool decrypt = 6; - */ - decrypt: boolean; - - /** - * @generated from field: repeated string private_keys = 7; - */ - privateKeys: string[]; -}; - -/** - * Describes the message meshexplorer.v1.GetChatRequest. - * Use `create(GetChatRequestSchema)` to create a new message. - */ -export const GetChatRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_chat, 3); - -/** - * @generated from message meshexplorer.v1.GetChatResponse - */ -export type GetChatResponse = Message<"meshexplorer.v1.GetChatResponse"> & { - /** - * @generated from field: repeated meshexplorer.v1.ChatMessage messages = 1; - */ - messages: ChatMessage[]; -}; - -/** - * Describes the message meshexplorer.v1.GetChatResponse. - * Use `create(GetChatResponseSchema)` to create a new message. - */ -export const GetChatResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_chat, 4); - -/** - * @generated from message meshexplorer.v1.StreamChatRequest - */ -export type StreamChatRequest = Message<"meshexplorer.v1.StreamChatRequest"> & { - /** - * @generated from field: optional string channel_id = 1; - */ - channelId?: string | undefined; - - /** - * @generated from field: optional string region = 2; - */ - region?: string | undefined; - - /** - * @generated from field: bool decrypt = 3; - */ - decrypt: boolean; - - /** - * @generated from field: repeated string private_keys = 4; - */ - privateKeys: string[]; - - /** - * Poll interval in ms (clamped 100..10000, default 1000). - * - * @generated from field: optional int32 poll_interval = 5; - */ - pollInterval?: number | undefined; - - /** - * Max rows per poll (clamped 10..1000, default 500). - * - * @generated from field: optional int32 max_rows = 6; - */ - maxRows?: number | undefined; - - /** - * @generated from field: bool skip_initial_messages = 7; - */ - skipInitialMessages: boolean; -}; - -/** - * Describes the message meshexplorer.v1.StreamChatRequest. - * Use `create(StreamChatRequestSchema)` to create a new message. - */ -export const StreamChatRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_chat, 5); - -/** - * @generated from service meshexplorer.v1.ChatService - */ -export const ChatService: GenService<{ - /** - * @generated from rpc meshexplorer.v1.ChatService.GetChat - */ - getChat: { - methodKind: "unary"; - input: typeof GetChatRequestSchema; - output: typeof GetChatResponseSchema; - }, - /** - * @generated from rpc meshexplorer.v1.ChatService.StreamChat - */ - streamChat: { - methodKind: "server_streaming"; - input: typeof StreamChatRequestSchema; - output: typeof ChatMessageSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_meshexplorer_v1_chat, 0); - diff --git a/meshexplorer/src/gen/meshexplorer/v1/common_pb.ts b/meshexplorer/src/gen/meshexplorer/v1/common_pb.ts deleted file mode 100644 index 508769c..0000000 --- a/meshexplorer/src/gen/meshexplorer/v1/common_pb.ts +++ /dev/null @@ -1,90 +0,0 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none" -// @generated from file meshexplorer/v1/common.proto (package meshexplorer.v1, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file meshexplorer/v1/common.proto. - */ -export const file_meshexplorer_v1_common: GenFile = /*@__PURE__*/ - fileDesc("ChxtZXNoZXhwbG9yZXIvdjEvY29tbW9uLnByb3RvEg9tZXNoZXhwbG9yZXIudjEisQIKDE5laWdoYm9yRWRnZRITCgtzb3VyY2Vfbm9kZRgBIAEoCRITCgt0YXJnZXRfbm9kZRgCIAEoCRIXCg9jb25uZWN0aW9uX3R5cGUYAyABKAkSFAoMcGFja2V0X2NvdW50GAQgASgFEhMKC3NvdXJjZV9uYW1lGAUgASgJEhcKD3NvdXJjZV9sYXRpdHVkZRgGIAEoARIYChBzb3VyY2VfbG9uZ2l0dWRlGAcgASgBEhsKE3NvdXJjZV9oYXNfbG9jYXRpb24YCCABKAUSEwoLdGFyZ2V0X25hbWUYCSABKAkSFwoPdGFyZ2V0X2xhdGl0dWRlGAogASgBEhgKEHRhcmdldF9sb25naXR1ZGUYCyABKAESGwoTdGFyZ2V0X2hhc19sb2NhdGlvbhgMIAEoBWIGcHJvdG8z"); - -/** - * A directed edge in the neighbor graph between two located nodes. - * Shared by MapService.GetMap (when includeNeighbors=true) and - * NeighborsService.GetAllNeighbors. Mirrors meshcore_all_neighbor_edges. - * - * @generated from message meshexplorer.v1.NeighborEdge - */ -export type NeighborEdge = Message<"meshexplorer.v1.NeighborEdge"> & { - /** - * @generated from field: string source_node = 1; - */ - sourceNode: string; - - /** - * @generated from field: string target_node = 2; - */ - targetNode: string; - - /** - * @generated from field: string connection_type = 3; - */ - connectionType: string; - - /** - * @generated from field: int32 packet_count = 4; - */ - packetCount: number; - - /** - * @generated from field: string source_name = 5; - */ - sourceName: string; - - /** - * @generated from field: double source_latitude = 6; - */ - sourceLatitude: number; - - /** - * @generated from field: double source_longitude = 7; - */ - sourceLongitude: number; - - /** - * @generated from field: int32 source_has_location = 8; - */ - sourceHasLocation: number; - - /** - * @generated from field: string target_name = 9; - */ - targetName: string; - - /** - * @generated from field: double target_latitude = 10; - */ - targetLatitude: number; - - /** - * @generated from field: double target_longitude = 11; - */ - targetLongitude: number; - - /** - * @generated from field: int32 target_has_location = 12; - */ - targetHasLocation: number; -}; - -/** - * Describes the message meshexplorer.v1.NeighborEdge. - * Use `create(NeighborEdgeSchema)` to create a new message. - */ -export const NeighborEdgeSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_common, 0); - diff --git a/meshexplorer/src/gen/meshexplorer/v1/map_pb.ts b/meshexplorer/src/gen/meshexplorer/v1/map_pb.ts deleted file mode 100644 index 654ec60..0000000 --- a/meshexplorer/src/gen/meshexplorer/v1/map_pb.ts +++ /dev/null @@ -1,169 +0,0 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none" -// @generated from file meshexplorer/v1/map.proto (package meshexplorer.v1, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import { file_buf_validate_validate } from "../../buf/validate/validate_pb"; -import type { NeighborEdge } from "./common_pb"; -import { file_meshexplorer_v1_common } from "./common_pb"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file meshexplorer/v1/map.proto. - */ -export const file_meshexplorer_v1_map: GenFile = /*@__PURE__*/ - fileDesc("ChltZXNoZXhwbG9yZXIvdjEvbWFwLnByb3RvEg9tZXNoZXhwbG9yZXIudjEi0QEKDE5vZGVQb3NpdGlvbhIPCgdub2RlX2lkGAEgASgJEhEKBG5hbWUYAiABKAlIAIgBARIXCgpzaG9ydF9uYW1lGAMgASgJSAGIAQESEAoIbGF0aXR1ZGUYBCABKAESEQoJbG9uZ2l0dWRlGAUgASgBEhEKCWxhc3Rfc2VlbhgGIAEoCRIXCgpmaXJzdF9zZWVuGAcgASgJSAKIAQESDAoEdHlwZRgIIAEoCUIHCgVfbmFtZUINCgtfc2hvcnRfbmFtZUINCgtfZmlyc3Rfc2VlbiL5AgoNR2V0TWFwUmVxdWVzdBItCgdtaW5fbGF0GAEgASgBQhe6SBQSEhkAAAAAAIBWQCkAAAAAAIBWwEgAiAEBEi0KB21heF9sYXQYAiABKAFCF7pIFBISGQAAAAAAgFZAKQAAAAAAgFbASAGIAQESLQoHbWluX2xuZxgDIAEoAUIXukgUEhIZAAAAAACAZkApAAAAAACAZsBIAogBARItCgdtYXhfbG5nGAQgASgBQhe6SBQSEhkAAAAAAIBmQCkAAAAAAIBmwEgDiAEBEhIKCm5vZGVfdHlwZXMYBSADKAkSHwoJbGFzdF9zZWVuGAYgASgFQge6SAQaAigASASIAQESEwoGcmVnaW9uGAcgASgJSAWIAQESGQoRaW5jbHVkZV9uZWlnaGJvcnMYCCABKAhCCgoIX21pbl9sYXRCCgoIX21heF9sYXRCCgoIX21pbl9sbmdCCgoIX21heF9sbmdCDAoKX2xhc3Rfc2VlbkIJCgdfcmVnaW9uInAKDkdldE1hcFJlc3BvbnNlEiwKBW5vZGVzGAEgAygLMh0ubWVzaGV4cGxvcmVyLnYxLk5vZGVQb3NpdGlvbhIwCgluZWlnaGJvcnMYAiADKAsyHS5tZXNoZXhwbG9yZXIudjEuTmVpZ2hib3JFZGdlMlcKCk1hcFNlcnZpY2USSQoGR2V0TWFwEh4ubWVzaGV4cGxvcmVyLnYxLkdldE1hcFJlcXVlc3QaHy5tZXNoZXhwbG9yZXIudjEuR2V0TWFwUmVzcG9uc2ViBnByb3RvMw", [file_buf_validate_validate, file_meshexplorer_v1_common]); - -/** - * Latest known position of a node. Mirrors unified_latest_nodeinfo rows - * returned by getNodePositions(). - * - * @generated from message meshexplorer.v1.NodePosition - */ -export type NodePosition = Message<"meshexplorer.v1.NodePosition"> & { - /** - * @generated from field: string node_id = 1; - */ - nodeId: string; - - /** - * @generated from field: optional string name = 2; - */ - name?: string | undefined; - - /** - * @generated from field: optional string short_name = 3; - */ - shortName?: string | undefined; - - /** - * @generated from field: double latitude = 4; - */ - latitude: number; - - /** - * @generated from field: double longitude = 5; - */ - longitude: number; - - /** - * @generated from field: string last_seen = 6; - */ - lastSeen: string; - - /** - * @generated from field: optional string first_seen = 7; - */ - firstSeen?: string | undefined; - - /** - * @generated from field: string type = 8; - */ - type: string; -}; - -/** - * Describes the message meshexplorer.v1.NodePosition. - * Use `create(NodePositionSchema)` to create a new message. - */ -export const NodePositionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_map, 0); - -/** - * @generated from message meshexplorer.v1.GetMapRequest - */ -export type GetMapRequest = Message<"meshexplorer.v1.GetMapRequest"> & { - /** - * Bounding box (decimal degrees). Unset fields mean "unbounded" on that edge. - * - * @generated from field: optional double min_lat = 1; - */ - minLat?: number | undefined; - - /** - * @generated from field: optional double max_lat = 2; - */ - maxLat?: number | undefined; - - /** - * @generated from field: optional double min_lng = 3; - */ - minLng?: number | undefined; - - /** - * @generated from field: optional double max_lng = 4; - */ - maxLng?: number | undefined; - - /** - * @generated from field: repeated string node_types = 5; - */ - nodeTypes: string[]; - - /** - * Only include nodes seen within this many seconds. - * - * @generated from field: optional int32 last_seen = 6; - */ - lastSeen?: number | undefined; - - /** - * @generated from field: optional string region = 7; - */ - region?: string | undefined; - - /** - * When true, also compute and return the neighbor edge graph. - * - * @generated from field: bool include_neighbors = 8; - */ - includeNeighbors: boolean; -}; - -/** - * Describes the message meshexplorer.v1.GetMapRequest. - * Use `create(GetMapRequestSchema)` to create a new message. - */ -export const GetMapRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_map, 1); - -/** - * @generated from message meshexplorer.v1.GetMapResponse - */ -export type GetMapResponse = Message<"meshexplorer.v1.GetMapResponse"> & { - /** - * @generated from field: repeated meshexplorer.v1.NodePosition nodes = 1; - */ - nodes: NodePosition[]; - - /** - * Populated only when include_neighbors was set on the request. - * - * @generated from field: repeated meshexplorer.v1.NeighborEdge neighbors = 2; - */ - neighbors: NeighborEdge[]; -}; - -/** - * Describes the message meshexplorer.v1.GetMapResponse. - * Use `create(GetMapResponseSchema)` to create a new message. - */ -export const GetMapResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_map, 2); - -/** - * @generated from service meshexplorer.v1.MapService - */ -export const MapService: GenService<{ - /** - * @generated from rpc meshexplorer.v1.MapService.GetMap - */ - getMap: { - methodKind: "unary"; - input: typeof GetMapRequestSchema; - output: typeof GetMapResponseSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_meshexplorer_v1_map, 0); - diff --git a/meshexplorer/src/gen/meshexplorer/v1/neighbors_pb.ts b/meshexplorer/src/gen/meshexplorer/v1/neighbors_pb.ts deleted file mode 100644 index 5c75845..0000000 --- a/meshexplorer/src/gen/meshexplorer/v1/neighbors_pb.ts +++ /dev/null @@ -1,96 +0,0 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none" -// @generated from file meshexplorer/v1/neighbors.proto (package meshexplorer.v1, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import { file_buf_validate_validate } from "../../buf/validate/validate_pb"; -import type { NeighborEdge } from "./common_pb"; -import { file_meshexplorer_v1_common } from "./common_pb"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file meshexplorer/v1/neighbors.proto. - */ -export const file_meshexplorer_v1_neighbors: GenFile = /*@__PURE__*/ - fileDesc("Ch9tZXNoZXhwbG9yZXIvdjEvbmVpZ2hib3JzLnByb3RvEg9tZXNoZXhwbG9yZXIudjEi5wIKFkdldEFsbE5laWdoYm9yc1JlcXVlc3QSLQoHbWluX2xhdBgBIAEoAUIXukgUEhIZAAAAAACAVkApAAAAAACAVsBIAIgBARItCgdtYXhfbGF0GAIgASgBQhe6SBQSEhkAAAAAAIBWQCkAAAAAAIBWwEgBiAEBEi0KB21pbl9sbmcYAyABKAFCF7pIFBISGQAAAAAAgGZAKQAAAAAAgGbASAKIAQESLQoHbWF4X2xuZxgEIAEoAUIXukgUEhIZAAAAAACAZkApAAAAAACAZsBIA4gBARISCgpub2RlX3R5cGVzGAUgAygJEh8KCWxhc3Rfc2VlbhgGIAEoBUIHukgEGgIoAEgEiAEBEhMKBnJlZ2lvbhgHIAEoCUgFiAEBQgoKCF9taW5fbGF0QgoKCF9tYXhfbGF0QgoKCF9taW5fbG5nQgoKCF9tYXhfbG5nQgwKCl9sYXN0X3NlZW5CCQoHX3JlZ2lvbiJLChdHZXRBbGxOZWlnaGJvcnNSZXNwb25zZRIwCgluZWlnaGJvcnMYASADKAsyHS5tZXNoZXhwbG9yZXIudjEuTmVpZ2hib3JFZGdlMngKEE5laWdoYm9yc1NlcnZpY2USZAoPR2V0QWxsTmVpZ2hib3JzEicubWVzaGV4cGxvcmVyLnYxLkdldEFsbE5laWdoYm9yc1JlcXVlc3QaKC5tZXNoZXhwbG9yZXIudjEuR2V0QWxsTmVpZ2hib3JzUmVzcG9uc2ViBnByb3RvMw", [file_buf_validate_validate, file_meshexplorer_v1_common]); - -/** - * @generated from message meshexplorer.v1.GetAllNeighborsRequest - */ -export type GetAllNeighborsRequest = Message<"meshexplorer.v1.GetAllNeighborsRequest"> & { - /** - * @generated from field: optional double min_lat = 1; - */ - minLat?: number | undefined; - - /** - * @generated from field: optional double max_lat = 2; - */ - maxLat?: number | undefined; - - /** - * @generated from field: optional double min_lng = 3; - */ - minLng?: number | undefined; - - /** - * @generated from field: optional double max_lng = 4; - */ - maxLng?: number | undefined; - - /** - * @generated from field: repeated string node_types = 5; - */ - nodeTypes: string[]; - - /** - * @generated from field: optional int32 last_seen = 6; - */ - lastSeen?: number | undefined; - - /** - * @generated from field: optional string region = 7; - */ - region?: string | undefined; -}; - -/** - * Describes the message meshexplorer.v1.GetAllNeighborsRequest. - * Use `create(GetAllNeighborsRequestSchema)` to create a new message. - */ -export const GetAllNeighborsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_neighbors, 0); - -/** - * @generated from message meshexplorer.v1.GetAllNeighborsResponse - */ -export type GetAllNeighborsResponse = Message<"meshexplorer.v1.GetAllNeighborsResponse"> & { - /** - * @generated from field: repeated meshexplorer.v1.NeighborEdge neighbors = 1; - */ - neighbors: NeighborEdge[]; -}; - -/** - * Describes the message meshexplorer.v1.GetAllNeighborsResponse. - * Use `create(GetAllNeighborsResponseSchema)` to create a new message. - */ -export const GetAllNeighborsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_neighbors, 1); - -/** - * @generated from service meshexplorer.v1.NeighborsService - */ -export const NeighborsService: GenService<{ - /** - * @generated from rpc meshexplorer.v1.NeighborsService.GetAllNeighbors - */ - getAllNeighbors: { - methodKind: "unary"; - input: typeof GetAllNeighborsRequestSchema; - output: typeof GetAllNeighborsResponseSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_meshexplorer_v1_neighbors, 0); - diff --git a/meshexplorer/src/gen/meshexplorer/v1/node_pb.ts b/meshexplorer/src/gen/meshexplorer/v1/node_pb.ts deleted file mode 100644 index efd227d..0000000 --- a/meshexplorer/src/gen/meshexplorer/v1/node_pb.ts +++ /dev/null @@ -1,654 +0,0 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none" -// @generated from file meshexplorer/v1/node.proto (package meshexplorer.v1, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import { file_buf_validate_validate } from "../../buf/validate/validate_pb"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file meshexplorer/v1/node.proto. - */ -export const file_meshexplorer_v1_node: GenFile = /*@__PURE__*/ - fileDesc("ChptZXNoZXhwbG9yZXIvdjEvbm9kZS5wcm90bxIPbWVzaGV4cGxvcmVyLnYxIssCCghOb2RlSW5mbxISCgpwdWJsaWNfa2V5GAEgASgJEhEKCW5vZGVfbmFtZRgCIAEoCRIVCghsYXRpdHVkZRgDIAEoAUgAiAEBEhYKCWxvbmdpdHVkZRgEIAEoAUgBiAEBEhQKDGhhc19sb2NhdGlvbhgFIAEoBRITCgtpc19yZXBlYXRlchgGIAEoBRIUCgxpc19jaGF0X25vZGUYByABKAUSFgoOaXNfcm9vbV9zZXJ2ZXIYCCABKAUSEAoIaGFzX25hbWUYCSABKAUSEwoGYnJva2VyGAogASgJSAKIAQESEgoFdG9waWMYCyABKAlIA4gBARISCgpmaXJzdF9zZWVuGAwgASgJEhEKCWxhc3Rfc2VlbhgNIAEoCUILCglfbGF0aXR1ZGVCDAoKX2xvbmdpdHVkZUIJCgdfYnJva2VyQggKBl90b3BpYyJMChVPcmlnaW5QYXRoUHVia2V5VHVwbGUSDgoGb3JpZ2luGAEgASgJEgwKBHBhdGgYAiABKAkSFQoNb3JpZ2luX3B1YmtleRgDIAEoCSLuAgoGQWR2ZXJ0EhUKDWFkdl90aW1lc3RhbXAYASABKAkSSQoZb3JpZ2luX3BhdGhfcHVia2V5X3R1cGxlcxgCIAMoCzImLm1lc2hleHBsb3Jlci52MS5PcmlnaW5QYXRoUHVia2V5VHVwbGUSFAoMYWR2ZXJ0X2NvdW50GAMgASgFEhoKEmVhcmxpZXN0X3RpbWVzdGFtcBgEIAEoCRIYChBsYXRlc3RfdGltZXN0YW1wGAUgASgJEhUKCGxhdGl0dWRlGAYgASgBSACIAQESFgoJbG9uZ2l0dWRlGAcgASgBSAGIAQESEwoLaXNfcmVwZWF0ZXIYCCABKAUSFAoMaXNfY2hhdF9ub2RlGAkgASgFEhYKDmlzX3Jvb21fc2VydmVyGAogASgFEhQKDGhhc19sb2NhdGlvbhgLIAEoBRITCgtwYWNrZXRfaGFzaBgMIAEoCUILCglfbGF0aXR1ZGVCDAoKX2xvbmdpdHVkZSJOCg9Mb2NhdGlvbkhpc3RvcnkSFgoObWVzaF90aW1lc3RhbXAYASABKAkSEAoIbGF0aXR1ZGUYAiABKAESEQoJbG9uZ2l0dWRlGAMgASgBIlcKCU1xdHRUb3BpYxINCgV0b3BpYxgBIAEoCRIOCgZicm9rZXIYAiABKAkSGAoQbGFzdF9wYWNrZXRfdGltZRgDIAEoCRIRCglpc19yZWNlbnQYBCABKAgiYAoITXF0dEluZm8SEwoLaXNfdXBsaW5rZWQYASABKAgSEwoLaGFzX3BhY2tldHMYAiABKAgSKgoGdG9waWNzGAMgAygLMhoubWVzaGV4cGxvcmVyLnYxLk1xdHRUb3BpYyJXCg5HZXROb2RlUmVxdWVzdBIbCgpwdWJsaWNfa2V5GAEgASgJQge6SARyAhAKEh4KBWxpbWl0GAIgASgFQgq6SAcaBRjoBygBSACIAQFCCAoGX2xpbWl0IvABCg9HZXROb2RlUmVzcG9uc2USJwoEbm9kZRgBIAEoCzIZLm1lc2hleHBsb3Jlci52MS5Ob2RlSW5mbxIvCg5yZWNlbnRfYWR2ZXJ0cxgCIAMoCzIXLm1lc2hleHBsb3Jlci52MS5BZHZlcnQSOgoQbG9jYXRpb25faGlzdG9yeRgDIAMoCzIgLm1lc2hleHBsb3Jlci52MS5Mb2NhdGlvbkhpc3RvcnkSJwoEbXF0dBgEIAEoCzIZLm1lc2hleHBsb3Jlci52MS5NcXR0SW5mbxITCgZyZWdpb24YBSABKAlIAIgBAUIJCgdfcmVnaW9uIvoBCghOZWlnaGJvchISCgpwdWJsaWNfa2V5GAEgASgJEhEKCW5vZGVfbmFtZRgCIAEoCRIVCghsYXRpdHVkZRgDIAEoAUgAiAEBEhYKCWxvbmdpdHVkZRgEIAEoAUgBiAEBEhQKDGhhc19sb2NhdGlvbhgFIAEoBRITCgtpc19yZXBlYXRlchgGIAEoBRIUCgxpc19jaGF0X25vZGUYByABKAUSFgoOaXNfcm9vbV9zZXJ2ZXIYCCABKAUSEAoIaGFzX25hbWUYCSABKAUSEgoKZGlyZWN0aW9ucxgKIAMoCUILCglfbGF0aXR1ZGVCDAoKX2xvbmdpdHVkZSJlChdHZXROb2RlTmVpZ2hib3JzUmVxdWVzdBIbCgpwdWJsaWNfa2V5GAEgASgJQge6SARyAhAKEh8KCWxhc3Rfc2VlbhgCIAEoBUIHukgEGgIoAEgAiAEBQgwKCl9sYXN0X3NlZW4iSAoYR2V0Tm9kZU5laWdoYm9yc1Jlc3BvbnNlEiwKCW5laWdoYm9ycxgBIAMoCzIZLm1lc2hleHBsb3Jlci52MS5OZWlnaGJvciL1AQoLU2VhcmNoUXVlcnkSGwoFcXVlcnkYASABKAlCB7pIBHICGGRIAIgBARITCgZyZWdpb24YAiABKAlIAYgBARIfCglsYXN0X3NlZW4YAyABKAVCB7pIBBoCKABIAogBARIeCgVsaW1pdBgEIAEoBUIKukgHGgUYyAEoAUgDiAEBEhIKBWV4YWN0GAUgASgISASIAQESGAoLaXNfcmVwZWF0ZXIYBiABKAhIBYgBAUIICgZfcXVlcnlCCQoHX3JlZ2lvbkIMCgpfbGFzdF9zZWVuQggKBl9saW1pdEIICgZfZXhhY3RCDgoMX2lzX3JlcGVhdGVyIrECCgxTZWFyY2hSZXN1bHQSEgoKcHVibGljX2tleRgBIAEoCRIRCglub2RlX25hbWUYAiABKAkSFQoIbGF0aXR1ZGUYAyABKAFIAIgBARIWCglsb25naXR1ZGUYBCABKAFIAYgBARIUCgxoYXNfbG9jYXRpb24YBSABKAUSEwoLaXNfcmVwZWF0ZXIYBiABKAUSFAoMaXNfY2hhdF9ub2RlGAcgASgFEhYKDmlzX3Jvb21fc2VydmVyGAggASgFEhAKCGhhc19uYW1lGAkgASgFEhMKC2ZpcnN0X2hlYXJkGAogASgJEhEKCWxhc3Rfc2VlbhgLIAEoCRIOCgZicm9rZXIYDCABKAkSDQoFdG9waWMYDSABKAlCCwoJX2xhdGl0dWRlQgwKCl9sb25naXR1ZGUiQgoQU2VhcmNoUmVzdWx0TGlzdBIuCgdyZXN1bHRzGAEgAygLMh0ubWVzaGV4cGxvcmVyLnYxLlNlYXJjaFJlc3VsdCJOChJTZWFyY2hOb2Rlc1JlcXVlc3QSOAoHcXVlcmllcxgBIAMoCzIcLm1lc2hleHBsb3Jlci52MS5TZWFyY2hRdWVyeUIJukgGkgEDEPQDIkkKE1NlYXJjaE5vZGVzUmVzcG9uc2USMgoHcmVzdWx0cxgBIAMoCzIhLm1lc2hleHBsb3Jlci52MS5TZWFyY2hSZXN1bHRMaXN0Mp4CCgtOb2RlU2VydmljZRJMCgdHZXROb2RlEh8ubWVzaGV4cGxvcmVyLnYxLkdldE5vZGVSZXF1ZXN0GiAubWVzaGV4cGxvcmVyLnYxLkdldE5vZGVSZXNwb25zZRJnChBHZXROb2RlTmVpZ2hib3JzEigubWVzaGV4cGxvcmVyLnYxLkdldE5vZGVOZWlnaGJvcnNSZXF1ZXN0GikubWVzaGV4cGxvcmVyLnYxLkdldE5vZGVOZWlnaGJvcnNSZXNwb25zZRJYCgtTZWFyY2hOb2RlcxIjLm1lc2hleHBsb3Jlci52MS5TZWFyY2hOb2Rlc1JlcXVlc3QaJC5tZXNoZXhwbG9yZXIudjEuU2VhcmNoTm9kZXNSZXNwb25zZWIGcHJvdG8z", [file_buf_validate_validate]); - -/** - * Basic node identity/capabilities from the latest advert (getMeshcoreNodeInfo). - * - * @generated from message meshexplorer.v1.NodeInfo - */ -export type NodeInfo = Message<"meshexplorer.v1.NodeInfo"> & { - /** - * @generated from field: string public_key = 1; - */ - publicKey: string; - - /** - * @generated from field: string node_name = 2; - */ - nodeName: string; - - /** - * @generated from field: optional double latitude = 3; - */ - latitude?: number | undefined; - - /** - * @generated from field: optional double longitude = 4; - */ - longitude?: number | undefined; - - /** - * @generated from field: int32 has_location = 5; - */ - hasLocation: number; - - /** - * @generated from field: int32 is_repeater = 6; - */ - isRepeater: number; - - /** - * @generated from field: int32 is_chat_node = 7; - */ - isChatNode: number; - - /** - * @generated from field: int32 is_room_server = 8; - */ - isRoomServer: number; - - /** - * @generated from field: int32 has_name = 9; - */ - hasName: number; - - /** - * @generated from field: optional string broker = 10; - */ - broker?: string | undefined; - - /** - * @generated from field: optional string topic = 11; - */ - topic?: string | undefined; - - /** - * @generated from field: string first_seen = 12; - */ - firstSeen: string; - - /** - * @generated from field: string last_seen = 13; - */ - lastSeen: string; -}; - -/** - * Describes the message meshexplorer.v1.NodeInfo. - * Use `create(NodeInfoSchema)` to create a new message. - */ -export const NodeInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 0); - -/** - * One (origin, path, origin_pubkey) tuple from an advert's reception paths. - * - * @generated from message meshexplorer.v1.OriginPathPubkeyTuple - */ -export type OriginPathPubkeyTuple = Message<"meshexplorer.v1.OriginPathPubkeyTuple"> & { - /** - * @generated from field: string origin = 1; - */ - origin: string; - - /** - * @generated from field: string path = 2; - */ - path: string; - - /** - * @generated from field: string origin_pubkey = 3; - */ - originPubkey: string; -}; - -/** - * Describes the message meshexplorer.v1.OriginPathPubkeyTuple. - * Use `create(OriginPathPubkeyTupleSchema)` to create a new message. - */ -export const OriginPathPubkeyTupleSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 1); - -/** - * An advert grouped by packet_hash, with all the paths it was heard over. - * - * @generated from message meshexplorer.v1.Advert - */ -export type Advert = Message<"meshexplorer.v1.Advert"> & { - /** - * @generated from field: string adv_timestamp = 1; - */ - advTimestamp: string; - - /** - * @generated from field: repeated meshexplorer.v1.OriginPathPubkeyTuple origin_path_pubkey_tuples = 2; - */ - originPathPubkeyTuples: OriginPathPubkeyTuple[]; - - /** - * @generated from field: int32 advert_count = 3; - */ - advertCount: number; - - /** - * @generated from field: string earliest_timestamp = 4; - */ - earliestTimestamp: string; - - /** - * @generated from field: string latest_timestamp = 5; - */ - latestTimestamp: string; - - /** - * @generated from field: optional double latitude = 6; - */ - latitude?: number | undefined; - - /** - * @generated from field: optional double longitude = 7; - */ - longitude?: number | undefined; - - /** - * @generated from field: int32 is_repeater = 8; - */ - isRepeater: number; - - /** - * @generated from field: int32 is_chat_node = 9; - */ - isChatNode: number; - - /** - * @generated from field: int32 is_room_server = 10; - */ - isRoomServer: number; - - /** - * @generated from field: int32 has_location = 11; - */ - hasLocation: number; - - /** - * @generated from field: string packet_hash = 12; - */ - packetHash: string; -}; - -/** - * Describes the message meshexplorer.v1.Advert. - * Use `create(AdvertSchema)` to create a new message. - */ -export const AdvertSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 2); - -/** - * @generated from message meshexplorer.v1.LocationHistory - */ -export type LocationHistory = Message<"meshexplorer.v1.LocationHistory"> & { - /** - * @generated from field: string mesh_timestamp = 1; - */ - meshTimestamp: string; - - /** - * @generated from field: double latitude = 2; - */ - latitude: number; - - /** - * @generated from field: double longitude = 3; - */ - longitude: number; -}; - -/** - * Describes the message meshexplorer.v1.LocationHistory. - * Use `create(LocationHistorySchema)` to create a new message. - */ -export const LocationHistorySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 3); - -/** - * @generated from message meshexplorer.v1.MqttTopic - */ -export type MqttTopic = Message<"meshexplorer.v1.MqttTopic"> & { - /** - * @generated from field: string topic = 1; - */ - topic: string; - - /** - * @generated from field: string broker = 2; - */ - broker: string; - - /** - * @generated from field: string last_packet_time = 3; - */ - lastPacketTime: string; - - /** - * @generated from field: bool is_recent = 4; - */ - isRecent: boolean; -}; - -/** - * Describes the message meshexplorer.v1.MqttTopic. - * Use `create(MqttTopicSchema)` to create a new message. - */ -export const MqttTopicSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 4); - -/** - * @generated from message meshexplorer.v1.MqttInfo - */ -export type MqttInfo = Message<"meshexplorer.v1.MqttInfo"> & { - /** - * @generated from field: bool is_uplinked = 1; - */ - isUplinked: boolean; - - /** - * @generated from field: bool has_packets = 2; - */ - hasPackets: boolean; - - /** - * @generated from field: repeated meshexplorer.v1.MqttTopic topics = 3; - */ - topics: MqttTopic[]; -}; - -/** - * Describes the message meshexplorer.v1.MqttInfo. - * Use `create(MqttInfoSchema)` to create a new message. - */ -export const MqttInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 5); - -/** - * @generated from message meshexplorer.v1.GetNodeRequest - */ -export type GetNodeRequest = Message<"meshexplorer.v1.GetNodeRequest"> & { - /** - * @generated from field: string public_key = 1; - */ - publicKey: string; - - /** - * Max number of recent adverts to return (default 50). - * - * @generated from field: optional int32 limit = 2; - */ - limit?: number | undefined; -}; - -/** - * Describes the message meshexplorer.v1.GetNodeRequest. - * Use `create(GetNodeRequestSchema)` to create a new message. - */ -export const GetNodeRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 6); - -/** - * @generated from message meshexplorer.v1.GetNodeResponse - */ -export type GetNodeResponse = Message<"meshexplorer.v1.GetNodeResponse"> & { - /** - * @generated from field: meshexplorer.v1.NodeInfo node = 1; - */ - node?: NodeInfo | undefined; - - /** - * @generated from field: repeated meshexplorer.v1.Advert recent_adverts = 2; - */ - recentAdverts: Advert[]; - - /** - * @generated from field: repeated meshexplorer.v1.LocationHistory location_history = 3; - */ - locationHistory: LocationHistory[]; - - /** - * @generated from field: meshexplorer.v1.MqttInfo mqtt = 4; - */ - mqtt?: MqttInfo | undefined; - - /** - * @generated from field: optional string region = 5; - */ - region?: string | undefined; -}; - -/** - * Describes the message meshexplorer.v1.GetNodeResponse. - * Use `create(GetNodeResponseSchema)` to create a new message. - */ -export const GetNodeResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 7); - -/** - * Direct neighbor of a node (meshcore_node_direct_neighbors). - * - * @generated from message meshexplorer.v1.Neighbor - */ -export type Neighbor = Message<"meshexplorer.v1.Neighbor"> & { - /** - * @generated from field: string public_key = 1; - */ - publicKey: string; - - /** - * @generated from field: string node_name = 2; - */ - nodeName: string; - - /** - * @generated from field: optional double latitude = 3; - */ - latitude?: number | undefined; - - /** - * @generated from field: optional double longitude = 4; - */ - longitude?: number | undefined; - - /** - * @generated from field: int32 has_location = 5; - */ - hasLocation: number; - - /** - * @generated from field: int32 is_repeater = 6; - */ - isRepeater: number; - - /** - * @generated from field: int32 is_chat_node = 7; - */ - isChatNode: number; - - /** - * @generated from field: int32 is_room_server = 8; - */ - isRoomServer: number; - - /** - * @generated from field: int32 has_name = 9; - */ - hasName: number; - - /** - * @generated from field: repeated string directions = 10; - */ - directions: string[]; -}; - -/** - * Describes the message meshexplorer.v1.Neighbor. - * Use `create(NeighborSchema)` to create a new message. - */ -export const NeighborSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 8); - -/** - * @generated from message meshexplorer.v1.GetNodeNeighborsRequest - */ -export type GetNodeNeighborsRequest = Message<"meshexplorer.v1.GetNodeNeighborsRequest"> & { - /** - * @generated from field: string public_key = 1; - */ - publicKey: string; - - /** - * @generated from field: optional int32 last_seen = 2; - */ - lastSeen?: number | undefined; -}; - -/** - * Describes the message meshexplorer.v1.GetNodeNeighborsRequest. - * Use `create(GetNodeNeighborsRequestSchema)` to create a new message. - */ -export const GetNodeNeighborsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 9); - -/** - * @generated from message meshexplorer.v1.GetNodeNeighborsResponse - */ -export type GetNodeNeighborsResponse = Message<"meshexplorer.v1.GetNodeNeighborsResponse"> & { - /** - * @generated from field: repeated meshexplorer.v1.Neighbor neighbors = 1; - */ - neighbors: Neighbor[]; -}; - -/** - * Describes the message meshexplorer.v1.GetNodeNeighborsResponse. - * Use `create(GetNodeNeighborsResponseSchema)` to create a new message. - */ -export const GetNodeNeighborsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 10); - -/** - * One search request within a (possibly batched) SearchNodes call. - * - * @generated from message meshexplorer.v1.SearchQuery - */ -export type SearchQuery = Message<"meshexplorer.v1.SearchQuery"> & { - /** - * @generated from field: optional string query = 1; - */ - query?: string | undefined; - - /** - * @generated from field: optional string region = 2; - */ - region?: string | undefined; - - /** - * @generated from field: optional int32 last_seen = 3; - */ - lastSeen?: number | undefined; - - /** - * @generated from field: optional int32 limit = 4; - */ - limit?: number | undefined; - - /** - * @generated from field: optional bool exact = 5; - */ - exact?: boolean | undefined; - - /** - * @generated from field: optional bool is_repeater = 6; - */ - isRepeater?: boolean | undefined; -}; - -/** - * Describes the message meshexplorer.v1.SearchQuery. - * Use `create(SearchQuerySchema)` to create a new message. - */ -export const SearchQuerySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 11); - -/** - * @generated from message meshexplorer.v1.SearchResult - */ -export type SearchResult = Message<"meshexplorer.v1.SearchResult"> & { - /** - * @generated from field: string public_key = 1; - */ - publicKey: string; - - /** - * @generated from field: string node_name = 2; - */ - nodeName: string; - - /** - * @generated from field: optional double latitude = 3; - */ - latitude?: number | undefined; - - /** - * @generated from field: optional double longitude = 4; - */ - longitude?: number | undefined; - - /** - * @generated from field: int32 has_location = 5; - */ - hasLocation: number; - - /** - * @generated from field: int32 is_repeater = 6; - */ - isRepeater: number; - - /** - * @generated from field: int32 is_chat_node = 7; - */ - isChatNode: number; - - /** - * @generated from field: int32 is_room_server = 8; - */ - isRoomServer: number; - - /** - * @generated from field: int32 has_name = 9; - */ - hasName: number; - - /** - * @generated from field: string first_heard = 10; - */ - firstHeard: string; - - /** - * @generated from field: string last_seen = 11; - */ - lastSeen: string; - - /** - * @generated from field: string broker = 12; - */ - broker: string; - - /** - * @generated from field: string topic = 13; - */ - topic: string; -}; - -/** - * Describes the message meshexplorer.v1.SearchResult. - * Use `create(SearchResultSchema)` to create a new message. - */ -export const SearchResultSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 12); - -/** - * Results for a single query in the batch (preserves per-query grouping). - * - * @generated from message meshexplorer.v1.SearchResultList - */ -export type SearchResultList = Message<"meshexplorer.v1.SearchResultList"> & { - /** - * @generated from field: repeated meshexplorer.v1.SearchResult results = 1; - */ - results: SearchResult[]; -}; - -/** - * Describes the message meshexplorer.v1.SearchResultList. - * Use `create(SearchResultListSchema)` to create a new message. - */ -export const SearchResultListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 13); - -/** - * @generated from message meshexplorer.v1.SearchNodesRequest - */ -export type SearchNodesRequest = Message<"meshexplorer.v1.SearchNodesRequest"> & { - /** - * @generated from field: repeated meshexplorer.v1.SearchQuery queries = 1; - */ - queries: SearchQuery[]; -}; - -/** - * Describes the message meshexplorer.v1.SearchNodesRequest. - * Use `create(SearchNodesRequestSchema)` to create a new message. - */ -export const SearchNodesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 14); - -/** - * @generated from message meshexplorer.v1.SearchNodesResponse - */ -export type SearchNodesResponse = Message<"meshexplorer.v1.SearchNodesResponse"> & { - /** - * One entry per input query, in the same order. - * - * @generated from field: repeated meshexplorer.v1.SearchResultList results = 1; - */ - results: SearchResultList[]; -}; - -/** - * Describes the message meshexplorer.v1.SearchNodesResponse. - * Use `create(SearchNodesResponseSchema)` to create a new message. - */ -export const SearchNodesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_node, 15); - -/** - * @generated from service meshexplorer.v1.NodeService - */ -export const NodeService: GenService<{ - /** - * @generated from rpc meshexplorer.v1.NodeService.GetNode - */ - getNode: { - methodKind: "unary"; - input: typeof GetNodeRequestSchema; - output: typeof GetNodeResponseSchema; - }, - /** - * @generated from rpc meshexplorer.v1.NodeService.GetNodeNeighbors - */ - getNodeNeighbors: { - methodKind: "unary"; - input: typeof GetNodeNeighborsRequestSchema; - output: typeof GetNodeNeighborsResponseSchema; - }, - /** - * @generated from rpc meshexplorer.v1.NodeService.SearchNodes - */ - searchNodes: { - methodKind: "unary"; - input: typeof SearchNodesRequestSchema; - output: typeof SearchNodesResponseSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_meshexplorer_v1_node, 0); - diff --git a/meshexplorer/src/gen/meshexplorer/v1/packets_pb.ts b/meshexplorer/src/gen/meshexplorer/v1/packets_pb.ts deleted file mode 100644 index 81beccd..0000000 --- a/meshexplorer/src/gen/meshexplorer/v1/packets_pb.ts +++ /dev/null @@ -1,154 +0,0 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none" -// @generated from file meshexplorer/v1/packets.proto (package meshexplorer.v1, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import { file_buf_validate_validate } from "../../buf/validate/validate_pb"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file meshexplorer/v1/packets.proto. - */ -export const file_meshexplorer_v1_packets: GenFile = /*@__PURE__*/ - fileDesc("Ch1tZXNoZXhwbG9yZXIvdjEvcGFja2V0cy5wcm90bxIPbWVzaGV4cGxvcmVyLnYxIvMBCgZQYWNrZXQSGAoQaW5nZXN0X3RpbWVzdGFtcBgBIAEoCRIWCg5tZXNoX3RpbWVzdGFtcBgCIAEoCRIOCgZicm9rZXIYAyABKAkSDQoFdG9waWMYBCABKAkSDgoGcGFja2V0GAUgASgJEhAKCHBhdGhfbGVuGAYgASgFEgwKBHBhdGgYByABKAkSEgoKcm91dGVfdHlwZRgIIAEoBRIUCgxwYXlsb2FkX3R5cGUYCSABKAUSFwoPcGF5bG9hZF92ZXJzaW9uGAogASgFEg4KBmhlYWRlchgLIAEoBRIVCg1vcmlnaW5fcHVia2V5GAwgASgJIs8CChRTdHJlYW1QYWNrZXRzUmVxdWVzdBITCgZyZWdpb24YASABKAlIAIgBARIkCgxwYXlsb2FkX3R5cGUYAiABKAVCCbpIBhoEGA8oAEgBiAEBEiIKCnJvdXRlX3R5cGUYAyABKAVCCbpIBhoEGAMoAEgCiAEBEjEKDW9yaWdpbl9wdWJrZXkYBCABKAlCFbpIEnIQMg5eWzAtOUEtRmEtZl0rJEgDiAEBEiYKDXBvbGxfaW50ZXJ2YWwYBSABKAVCCrpIBxoFGJBOKGRIBIgBARIhCghtYXhfcm93cxgGIAEoBUIKukgHGgUYkE4oCkgFiAEBQgkKB19yZWdpb25CDwoNX3BheWxvYWRfdHlwZUINCgtfcm91dGVfdHlwZUIQCg5fb3JpZ2luX3B1YmtleUIQCg5fcG9sbF9pbnRlcnZhbEILCglfbWF4X3Jvd3MyYwoOUGFja2V0c1NlcnZpY2USUQoNU3RyZWFtUGFja2V0cxIlLm1lc2hleHBsb3Jlci52MS5TdHJlYW1QYWNrZXRzUmVxdWVzdBoXLm1lc2hleHBsb3Jlci52MS5QYWNrZXQwAWIGcHJvdG8z", [file_buf_validate_validate]); - -/** - * A raw mesh packet (meshcore_packets), hex fields kept as hex strings. - * - * @generated from message meshexplorer.v1.Packet - */ -export type Packet = Message<"meshexplorer.v1.Packet"> & { - /** - * @generated from field: string ingest_timestamp = 1; - */ - ingestTimestamp: string; - - /** - * @generated from field: string mesh_timestamp = 2; - */ - meshTimestamp: string; - - /** - * @generated from field: string broker = 3; - */ - broker: string; - - /** - * @generated from field: string topic = 4; - */ - topic: string; - - /** - * @generated from field: string packet = 5; - */ - packet: string; - - /** - * @generated from field: int32 path_len = 6; - */ - pathLen: number; - - /** - * @generated from field: string path = 7; - */ - path: string; - - /** - * @generated from field: int32 route_type = 8; - */ - routeType: number; - - /** - * @generated from field: int32 payload_type = 9; - */ - payloadType: number; - - /** - * @generated from field: int32 payload_version = 10; - */ - payloadVersion: number; - - /** - * @generated from field: int32 header = 11; - */ - header: number; - - /** - * @generated from field: string origin_pubkey = 12; - */ - originPubkey: string; -}; - -/** - * Describes the message meshexplorer.v1.Packet. - * Use `create(PacketSchema)` to create a new message. - */ -export const PacketSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_packets, 0); - -/** - * @generated from message meshexplorer.v1.StreamPacketsRequest - */ -export type StreamPacketsRequest = Message<"meshexplorer.v1.StreamPacketsRequest"> & { - /** - * @generated from field: optional string region = 1; - */ - region?: string | undefined; - - /** - * Payload type filter (0..15). - * - * @generated from field: optional int32 payload_type = 2; - */ - payloadType?: number | undefined; - - /** - * Route type filter (0..3). - * - * @generated from field: optional int32 route_type = 3; - */ - routeType?: number | undefined; - - /** - * @generated from field: optional string origin_pubkey = 4; - */ - originPubkey?: string | undefined; - - /** - * Poll interval in ms (clamped 100..10000, default 500). - * - * @generated from field: optional int32 poll_interval = 5; - */ - pollInterval?: number | undefined; - - /** - * Max rows per poll (clamped 10..10000, default 10). - * - * @generated from field: optional int32 max_rows = 6; - */ - maxRows?: number | undefined; -}; - -/** - * Describes the message meshexplorer.v1.StreamPacketsRequest. - * Use `create(StreamPacketsRequestSchema)` to create a new message. - */ -export const StreamPacketsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_packets, 1); - -/** - * @generated from service meshexplorer.v1.PacketsService - */ -export const PacketsService: GenService<{ - /** - * @generated from rpc meshexplorer.v1.PacketsService.StreamPackets - */ - streamPackets: { - methodKind: "server_streaming"; - input: typeof StreamPacketsRequestSchema; - output: typeof PacketSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_meshexplorer_v1_packets, 0); - diff --git a/meshexplorer/src/gen/meshexplorer/v1/stats_pb.ts b/meshexplorer/src/gen/meshexplorer/v1/stats_pb.ts deleted file mode 100644 index b1bf6c7..0000000 --- a/meshexplorer/src/gen/meshexplorer/v1/stats_pb.ts +++ /dev/null @@ -1,224 +0,0 @@ -// @generated by protoc-gen-es v2.12.0 with parameter "target=ts,import_extension=none" -// @generated from file meshexplorer/v1/stats.proto (package meshexplorer.v1, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file meshexplorer/v1/stats.proto. - */ -export const file_meshexplorer_v1_stats: GenFile = /*@__PURE__*/ - fileDesc("ChttZXNoZXhwbG9yZXIvdjEvc3RhdHMucHJvdG8SD21lc2hleHBsb3Jlci52MSIuCgxTdGF0c1JlcXVlc3QSEwoGcmVnaW9uGAEgASgJSACIAQFCCQoHX3JlZ2lvbiIsChVHZXRUb3RhbE5vZGVzUmVzcG9uc2USEwoLdG90YWxfbm9kZXMYASABKAUipgEKEE5vZGVzT3ZlclRpbWVSb3cSCwoDZGF5GAEgASgJEh8KF2N1bXVsYXRpdmVfdW5pcXVlX25vZGVzGAIgASgFEhsKE25vZGVzX3dpdGhfbG9jYXRpb24YAyABKAUSHgoWbm9kZXNfd2l0aG91dF9sb2NhdGlvbhgEIAEoBRIRCglyZXBlYXRlcnMYBSABKAUSFAoMcm9vbV9zZXJ2ZXJzGAYgASgFIksKGEdldE5vZGVzT3ZlclRpbWVSZXNwb25zZRIvCgRkYXRhGAEgAygLMiEubWVzaGV4cGxvcmVyLnYxLk5vZGVzT3ZlclRpbWVSb3ciQAoRUG9wdWxhckNoYW5uZWxSb3cSFAoMY2hhbm5lbF9oYXNoGAEgASgJEhUKDW1lc3NhZ2VfY291bnQYAiABKAUiTgoaR2V0UG9wdWxhckNoYW5uZWxzUmVzcG9uc2USMAoEZGF0YRgBIAMoCzIiLm1lc2hleHBsb3Jlci52MS5Qb3B1bGFyQ2hhbm5lbFJvdyI3ChFSZXBlYXRlclByZWZpeFJvdxIOCgZwcmVmaXgYASABKAkSEgoKbm9kZV9uYW1lcxgCIAMoCSJPChtHZXRSZXBlYXRlclByZWZpeGVzUmVzcG9uc2USMAoEZGF0YRgBIAMoCzIiLm1lc2hleHBsb3Jlci52MS5SZXBlYXRlclByZWZpeFJvdzKKAwoMU3RhdHNTZXJ2aWNlElYKDUdldFRvdGFsTm9kZXMSHS5tZXNoZXhwbG9yZXIudjEuU3RhdHNSZXF1ZXN0GiYubWVzaGV4cGxvcmVyLnYxLkdldFRvdGFsTm9kZXNSZXNwb25zZRJcChBHZXROb2Rlc092ZXJUaW1lEh0ubWVzaGV4cGxvcmVyLnYxLlN0YXRzUmVxdWVzdBopLm1lc2hleHBsb3Jlci52MS5HZXROb2Rlc092ZXJUaW1lUmVzcG9uc2USYAoSR2V0UG9wdWxhckNoYW5uZWxzEh0ubWVzaGV4cGxvcmVyLnYxLlN0YXRzUmVxdWVzdBorLm1lc2hleHBsb3Jlci52MS5HZXRQb3B1bGFyQ2hhbm5lbHNSZXNwb25zZRJiChNHZXRSZXBlYXRlclByZWZpeGVzEh0ubWVzaGV4cGxvcmVyLnYxLlN0YXRzUmVxdWVzdBosLm1lc2hleHBsb3Jlci52MS5HZXRSZXBlYXRlclByZWZpeGVzUmVzcG9uc2ViBnByb3RvMw"); - -/** - * @generated from message meshexplorer.v1.StatsRequest - */ -export type StatsRequest = Message<"meshexplorer.v1.StatsRequest"> & { - /** - * @generated from field: optional string region = 1; - */ - region?: string | undefined; -}; - -/** - * Describes the message meshexplorer.v1.StatsRequest. - * Use `create(StatsRequestSchema)` to create a new message. - */ -export const StatsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_stats, 0); - -/** - * @generated from message meshexplorer.v1.GetTotalNodesResponse - */ -export type GetTotalNodesResponse = Message<"meshexplorer.v1.GetTotalNodesResponse"> & { - /** - * @generated from field: int32 total_nodes = 1; - */ - totalNodes: number; -}; - -/** - * Describes the message meshexplorer.v1.GetTotalNodesResponse. - * Use `create(GetTotalNodesResponseSchema)` to create a new message. - */ -export const GetTotalNodesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_stats, 1); - -/** - * @generated from message meshexplorer.v1.NodesOverTimeRow - */ -export type NodesOverTimeRow = Message<"meshexplorer.v1.NodesOverTimeRow"> & { - /** - * @generated from field: string day = 1; - */ - day: string; - - /** - * @generated from field: int32 cumulative_unique_nodes = 2; - */ - cumulativeUniqueNodes: number; - - /** - * @generated from field: int32 nodes_with_location = 3; - */ - nodesWithLocation: number; - - /** - * @generated from field: int32 nodes_without_location = 4; - */ - nodesWithoutLocation: number; - - /** - * @generated from field: int32 repeaters = 5; - */ - repeaters: number; - - /** - * @generated from field: int32 room_servers = 6; - */ - roomServers: number; -}; - -/** - * Describes the message meshexplorer.v1.NodesOverTimeRow. - * Use `create(NodesOverTimeRowSchema)` to create a new message. - */ -export const NodesOverTimeRowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_stats, 2); - -/** - * @generated from message meshexplorer.v1.GetNodesOverTimeResponse - */ -export type GetNodesOverTimeResponse = Message<"meshexplorer.v1.GetNodesOverTimeResponse"> & { - /** - * @generated from field: repeated meshexplorer.v1.NodesOverTimeRow data = 1; - */ - data: NodesOverTimeRow[]; -}; - -/** - * Describes the message meshexplorer.v1.GetNodesOverTimeResponse. - * Use `create(GetNodesOverTimeResponseSchema)` to create a new message. - */ -export const GetNodesOverTimeResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_stats, 3); - -/** - * @generated from message meshexplorer.v1.PopularChannelRow - */ -export type PopularChannelRow = Message<"meshexplorer.v1.PopularChannelRow"> & { - /** - * @generated from field: string channel_hash = 1; - */ - channelHash: string; - - /** - * @generated from field: int32 message_count = 2; - */ - messageCount: number; -}; - -/** - * Describes the message meshexplorer.v1.PopularChannelRow. - * Use `create(PopularChannelRowSchema)` to create a new message. - */ -export const PopularChannelRowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_stats, 4); - -/** - * @generated from message meshexplorer.v1.GetPopularChannelsResponse - */ -export type GetPopularChannelsResponse = Message<"meshexplorer.v1.GetPopularChannelsResponse"> & { - /** - * @generated from field: repeated meshexplorer.v1.PopularChannelRow data = 1; - */ - data: PopularChannelRow[]; -}; - -/** - * Describes the message meshexplorer.v1.GetPopularChannelsResponse. - * Use `create(GetPopularChannelsResponseSchema)` to create a new message. - */ -export const GetPopularChannelsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_stats, 5); - -/** - * @generated from message meshexplorer.v1.RepeaterPrefixRow - */ -export type RepeaterPrefixRow = Message<"meshexplorer.v1.RepeaterPrefixRow"> & { - /** - * @generated from field: string prefix = 1; - */ - prefix: string; - - /** - * @generated from field: repeated string node_names = 2; - */ - nodeNames: string[]; -}; - -/** - * Describes the message meshexplorer.v1.RepeaterPrefixRow. - * Use `create(RepeaterPrefixRowSchema)` to create a new message. - */ -export const RepeaterPrefixRowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_stats, 6); - -/** - * @generated from message meshexplorer.v1.GetRepeaterPrefixesResponse - */ -export type GetRepeaterPrefixesResponse = Message<"meshexplorer.v1.GetRepeaterPrefixesResponse"> & { - /** - * @generated from field: repeated meshexplorer.v1.RepeaterPrefixRow data = 1; - */ - data: RepeaterPrefixRow[]; -}; - -/** - * Describes the message meshexplorer.v1.GetRepeaterPrefixesResponse. - * Use `create(GetRepeaterPrefixesResponseSchema)` to create a new message. - */ -export const GetRepeaterPrefixesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_meshexplorer_v1_stats, 7); - -/** - * @generated from service meshexplorer.v1.StatsService - */ -export const StatsService: GenService<{ - /** - * @generated from rpc meshexplorer.v1.StatsService.GetTotalNodes - */ - getTotalNodes: { - methodKind: "unary"; - input: typeof StatsRequestSchema; - output: typeof GetTotalNodesResponseSchema; - }, - /** - * @generated from rpc meshexplorer.v1.StatsService.GetNodesOverTime - */ - getNodesOverTime: { - methodKind: "unary"; - input: typeof StatsRequestSchema; - output: typeof GetNodesOverTimeResponseSchema; - }, - /** - * @generated from rpc meshexplorer.v1.StatsService.GetPopularChannels - */ - getPopularChannels: { - methodKind: "unary"; - input: typeof StatsRequestSchema; - output: typeof GetPopularChannelsResponseSchema; - }, - /** - * @generated from rpc meshexplorer.v1.StatsService.GetRepeaterPrefixes - */ - getRepeaterPrefixes: { - methodKind: "unary"; - input: typeof StatsRequestSchema; - output: typeof GetRepeaterPrefixesResponseSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_meshexplorer_v1_stats, 0); - diff --git a/meshexplorer/src/server/connect/chat.ts b/meshexplorer/src/server/connect/chat.ts index 91b9f98..c4f96aa 100644 --- a/meshexplorer/src/server/connect/chat.ts +++ b/meshexplorer/src/server/connect/chat.ts @@ -8,6 +8,7 @@ import { createChatMessagesStreamerConfig, } from "@/lib/clickhouse/streaming"; import { decryptMeshcoreGroupMessage } from "@/lib/meshcore"; +import { num } from "./mappers"; const PUBLIC_MESHCORE_KEY = "izOH6cXN6mrJ5e26oRXNcg=="; @@ -40,7 +41,7 @@ function toChatMessage( channelHash: row.channel_hash, mac: row.mac, encryptedMessage: row.encrypted_message, - messageCount: row.message_count, + messageCount: num(row.message_count), originPathInfo: (row.origin_path_info ?? []).map( ([origin, originPubkey, path, broker, topic]) => ({ origin, diff --git a/meshexplorer/src/server/connect/mappers.ts b/meshexplorer/src/server/connect/mappers.ts index 3708dad..1a4d3f5 100644 --- a/meshexplorer/src/server/connect/mappers.ts +++ b/meshexplorer/src/server/connect/mappers.ts @@ -17,21 +17,28 @@ export interface NeighborEdgeRow { target_has_location: number; } +// ClickHouse serializes UInt64/Int64 and aggregate columns (count(), etc.) as +// JSON *strings* in JSONEachRow. Coerce every integer field we feed into an +// int32 proto field, or protobuf-es rejects the string at encode time. +export function num(v: unknown): number { + return Number(v ?? 0); +} + /** Maps a ClickHouse neighbor-edge row to the NeighborEdge proto init shape. */ export function toNeighborEdge(row: NeighborEdgeRow): MessageInitShape { return { sourceNode: row.source_node, targetNode: row.target_node, connectionType: row.connection_type, - packetCount: row.packet_count, + packetCount: num(row.packet_count), sourceName: row.source_name, sourceLatitude: row.source_latitude, sourceLongitude: row.source_longitude, - sourceHasLocation: row.source_has_location, + sourceHasLocation: num(row.source_has_location), targetName: row.target_name, targetLatitude: row.target_latitude, targetLongitude: row.target_longitude, - targetHasLocation: row.target_has_location, + targetHasLocation: num(row.target_has_location), }; } diff --git a/meshexplorer/src/server/connect/node.ts b/meshexplorer/src/server/connect/node.ts index 6bdda56..7c112c4 100644 --- a/meshexplorer/src/server/connect/node.ts +++ b/meshexplorer/src/server/connect/node.ts @@ -7,6 +7,7 @@ import { getMeshcoreNodeNeighbors, searchMeshcoreNodes, } from "@/lib/clickhouse/actions"; +import { num } from "./mappers"; interface SearchResultRow { public_key: string; @@ -30,11 +31,11 @@ function toSearchResult(row: SearchResultRow): MessageInitShape = { const node = nodeInfo.node; // recentAdverts / locationHistory come back as untyped JSON rows. const adverts = nodeInfo.recentAdverts as Array<{ - adv_timestamp: string; + adv_timestamp: number; origin_path_pubkey_tuples: Array<[string, string, string]>; advert_count: number; earliest_timestamp: string; @@ -79,30 +80,30 @@ export const nodeServiceImpl: ServiceImpl = { nodeName: node.node_name, latitude: node.latitude ?? undefined, longitude: node.longitude ?? undefined, - hasLocation: node.has_location, - isRepeater: node.is_repeater, - isChatNode: node.is_chat_node, - isRoomServer: node.is_room_server, - hasName: node.has_name, + hasLocation: num(node.has_location), + isRepeater: num(node.is_repeater), + isChatNode: num(node.is_chat_node), + isRoomServer: num(node.is_room_server), + hasName: num(node.has_name), broker: node.broker ?? undefined, topic: node.topic ?? undefined, firstSeen: node.first_seen, lastSeen: node.last_seen, }, recentAdverts: adverts.map((a) => ({ - advTimestamp: a.adv_timestamp, + advTimestamp: num(a.adv_timestamp), originPathPubkeyTuples: (a.origin_path_pubkey_tuples ?? []).map( ([origin, path, originPubkey]) => ({ origin, path, originPubkey }), ), - advertCount: a.advert_count, + advertCount: num(a.advert_count), earliestTimestamp: a.earliest_timestamp, latestTimestamp: a.latest_timestamp, latitude: a.latitude ?? undefined, longitude: a.longitude ?? undefined, - isRepeater: a.is_repeater, - isChatNode: a.is_chat_node, - isRoomServer: a.is_room_server, - hasLocation: a.has_location, + isRepeater: num(a.is_repeater), + isChatNode: num(a.is_chat_node), + isRoomServer: num(a.is_room_server), + hasLocation: num(a.has_location), packetHash: a.packet_hash, })), locationHistory: locationHistory.map((l) => ({ @@ -135,11 +136,11 @@ export const nodeServiceImpl: ServiceImpl = { nodeName: n.node_name, latitude: n.latitude ?? undefined, longitude: n.longitude ?? undefined, - hasLocation: n.has_location, - isRepeater: n.is_repeater, - isChatNode: n.is_chat_node, - isRoomServer: n.is_room_server, - hasName: n.has_name, + hasLocation: num(n.has_location), + isRepeater: num(n.is_repeater), + isChatNode: num(n.is_chat_node), + isRoomServer: num(n.is_room_server), + hasName: num(n.has_name), directions: n.directions, })), }; diff --git a/meshexplorer/src/server/connect/packets.ts b/meshexplorer/src/server/connect/packets.ts index a5bdf77..0bccde7 100644 --- a/meshexplorer/src/server/connect/packets.ts +++ b/meshexplorer/src/server/connect/packets.ts @@ -4,6 +4,7 @@ import { createClickHouseStreamer, createMeshcorePacketsStreamerConfig, } from "@/lib/clickhouse/streaming"; +import { num } from "./mappers"; interface PacketRow { ingest_timestamp: string; @@ -47,12 +48,12 @@ export const packetsServiceImpl: ServiceImpl = { broker: row.broker, topic: row.topic, packet: row.packet, - pathLen: row.path_len, + pathLen: num(row.path_len), path: row.path, - routeType: row.route_type, - payloadType: row.payload_type, - payloadVersion: row.payload_version, - header: row.header, + routeType: num(row.route_type), + payloadType: num(row.payload_type), + payloadVersion: num(row.payload_version), + header: num(row.header), originPubkey: row.origin_pubkey, }; }