﻿/*
 * 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.
 */

#nullable disable
namespace DotPulsar.Internal.PulsarApi
{
    // This file was generated by a tool; you should avoid making direct changes.
    // Consider using 'partial classes' to extend these types
    // Input: PulsarApi.proto (Last edit: ba24d73)

#pragma warning disable CS1591, CS0612, CS3021, IDE1006

    [global::ProtoBuf.ProtoContract()]
    public partial class Schema : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"name", IsRequired = true)]
        public string Name { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"schema_data", IsRequired = true)]
        public byte[] SchemaData { get; set; }

        [global::ProtoBuf.ProtoMember(4, IsRequired = true)]
        public SchemaType Type { get; set; }

        [global::ProtoBuf.ProtoMember(5, Name = @"properties")]
        public global::System.Collections.Generic.List<KeyValue> Properties { get; } = new global::System.Collections.Generic.List<KeyValue>();

        [global::ProtoBuf.ProtoContract()]
        public enum SchemaType
        {
            None = 0,
            String = 1,
            Json = 2,
            Protobuf = 3,
            Avro = 4,
            Bool = 5,
            Int8 = 6,
            Int16 = 7,
            Int32 = 8,
            Int64 = 9,
            Float = 10,
            Double = 11,
            Date = 12,
            Time = 13,
            Timestamp = 14,
            KeyValue = 15,
        }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class MessageIdData : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, IsRequired = true)]
        public ulong LedgerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, IsRequired = true)]
        public ulong EntryId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"partition")]
        [global::System.ComponentModel.DefaultValue(-1)]
        public int Partition
        {
            get { return __pbn__Partition ?? -1; }
            set { __pbn__Partition = value; }
        }
        public bool ShouldSerializePartition() => __pbn__Partition != null;
        public void ResetPartition() => __pbn__Partition = null;
        private int? __pbn__Partition;

        [global::ProtoBuf.ProtoMember(4, Name = @"batch_index")]
        [global::System.ComponentModel.DefaultValue(-1)]
        public int BatchIndex
        {
            get { return __pbn__BatchIndex ?? -1; }
            set { __pbn__BatchIndex = value; }
        }
        public bool ShouldSerializeBatchIndex() => __pbn__BatchIndex != null;
        public void ResetBatchIndex() => __pbn__BatchIndex = null;
        private int? __pbn__BatchIndex;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class KeyValue : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"key", IsRequired = true)]
        public string Key { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"value", IsRequired = true)]
        public string Value { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class KeyLongValue : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"key", IsRequired = true)]
        public string Key { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"value", IsRequired = true)]
        public ulong Value { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class EncryptionKeys : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"key", IsRequired = true)]
        public string Key { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"value", IsRequired = true)]
        public byte[] Value { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"metadata")]
        public global::System.Collections.Generic.List<KeyValue> Metadatas { get; } = new global::System.Collections.Generic.List<KeyValue>();
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class MessageMetadata : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"producer_name", IsRequired = true)]
        public string ProducerName { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"sequence_id", IsRequired = true)]
        public ulong SequenceId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"publish_time", IsRequired = true)]
        public ulong PublishTime { get; set; }

        [global::ProtoBuf.ProtoMember(4, Name = @"properties")]
        public global::System.Collections.Generic.List<KeyValue> Properties { get; } = new global::System.Collections.Generic.List<KeyValue>();

        [global::ProtoBuf.ProtoMember(5, Name = @"replicated_from")]
        [global::System.ComponentModel.DefaultValue("")]
        public string ReplicatedFrom
        {
            get { return __pbn__ReplicatedFrom ?? ""; }
            set { __pbn__ReplicatedFrom = value; }
        }
        public bool ShouldSerializeReplicatedFrom() => __pbn__ReplicatedFrom != null;
        public void ResetReplicatedFrom() => __pbn__ReplicatedFrom = null;
        private string __pbn__ReplicatedFrom;

        [global::ProtoBuf.ProtoMember(6, Name = @"partition_key")]
        [global::System.ComponentModel.DefaultValue("")]
        public string PartitionKey
        {
            get { return __pbn__PartitionKey ?? ""; }
            set { __pbn__PartitionKey = value; }
        }
        public bool ShouldSerializePartitionKey() => __pbn__PartitionKey != null;
        public void ResetPartitionKey() => __pbn__PartitionKey = null;
        private string __pbn__PartitionKey;

        [global::ProtoBuf.ProtoMember(7, Name = @"replicate_to")]
        public global::System.Collections.Generic.List<string> ReplicateToes { get; } = new global::System.Collections.Generic.List<string>();

        [global::ProtoBuf.ProtoMember(8, Name = @"compression")]
        [global::System.ComponentModel.DefaultValue(CompressionType.None)]
        public CompressionType Compression
        {
            get { return __pbn__Compression ?? CompressionType.None; }
            set { __pbn__Compression = value; }
        }
        public bool ShouldSerializeCompression() => __pbn__Compression != null;
        public void ResetCompression() => __pbn__Compression = null;
        private CompressionType? __pbn__Compression;

        [global::ProtoBuf.ProtoMember(9, Name = @"uncompressed_size")]
        [global::System.ComponentModel.DefaultValue(0)]
        public uint UncompressedSize
        {
            get { return __pbn__UncompressedSize ?? 0; }
            set { __pbn__UncompressedSize = value; }
        }
        public bool ShouldSerializeUncompressedSize() => __pbn__UncompressedSize != null;
        public void ResetUncompressedSize() => __pbn__UncompressedSize = null;
        private uint? __pbn__UncompressedSize;

        [global::ProtoBuf.ProtoMember(11, Name = @"num_messages_in_batch")]
        [global::System.ComponentModel.DefaultValue(1)]
        public int NumMessagesInBatch
        {
            get { return __pbn__NumMessagesInBatch ?? 1; }
            set { __pbn__NumMessagesInBatch = value; }
        }
        public bool ShouldSerializeNumMessagesInBatch() => __pbn__NumMessagesInBatch != null;
        public void ResetNumMessagesInBatch() => __pbn__NumMessagesInBatch = null;
        private int? __pbn__NumMessagesInBatch;

        [global::ProtoBuf.ProtoMember(12, Name = @"event_time")]
        [global::System.ComponentModel.DefaultValue(0)]
        public ulong EventTime
        {
            get { return __pbn__EventTime ?? 0; }
            set { __pbn__EventTime = value; }
        }
        public bool ShouldSerializeEventTime() => __pbn__EventTime != null;
        public void ResetEventTime() => __pbn__EventTime = null;
        private ulong? __pbn__EventTime;

        [global::ProtoBuf.ProtoMember(13, Name = @"encryption_keys")]
        public global::System.Collections.Generic.List<EncryptionKeys> EncryptionKeys { get; } = new global::System.Collections.Generic.List<EncryptionKeys>();

        [global::ProtoBuf.ProtoMember(14, Name = @"encryption_algo")]
        [global::System.ComponentModel.DefaultValue("")]
        public string EncryptionAlgo
        {
            get { return __pbn__EncryptionAlgo ?? ""; }
            set { __pbn__EncryptionAlgo = value; }
        }
        public bool ShouldSerializeEncryptionAlgo() => __pbn__EncryptionAlgo != null;
        public void ResetEncryptionAlgo() => __pbn__EncryptionAlgo = null;
        private string __pbn__EncryptionAlgo;

        [global::ProtoBuf.ProtoMember(15, Name = @"encryption_param")]
        public byte[] EncryptionParam
        {
            get { return __pbn__EncryptionParam; }
            set { __pbn__EncryptionParam = value; }
        }
        public bool ShouldSerializeEncryptionParam() => __pbn__EncryptionParam != null;
        public void ResetEncryptionParam() => __pbn__EncryptionParam = null;
        private byte[] __pbn__EncryptionParam;

        [global::ProtoBuf.ProtoMember(16, Name = @"schema_version")]
        public byte[] SchemaVersion
        {
            get { return __pbn__SchemaVersion; }
            set { __pbn__SchemaVersion = value; }
        }
        public bool ShouldSerializeSchemaVersion() => __pbn__SchemaVersion != null;
        public void ResetSchemaVersion() => __pbn__SchemaVersion = null;
        private byte[] __pbn__SchemaVersion;

        [global::ProtoBuf.ProtoMember(17, Name = @"partition_key_b64_encoded")]
        [global::System.ComponentModel.DefaultValue(false)]
        public bool PartitionKeyB64Encoded
        {
            get { return __pbn__PartitionKeyB64Encoded ?? false; }
            set { __pbn__PartitionKeyB64Encoded = value; }
        }
        public bool ShouldSerializePartitionKeyB64Encoded() => __pbn__PartitionKeyB64Encoded != null;
        public void ResetPartitionKeyB64Encoded() => __pbn__PartitionKeyB64Encoded = null;
        private bool? __pbn__PartitionKeyB64Encoded;

        [global::ProtoBuf.ProtoMember(18, Name = @"ordering_key")]
        public byte[] OrderingKey
        {
            get { return __pbn__OrderingKey; }
            set { __pbn__OrderingKey = value; }
        }
        public bool ShouldSerializeOrderingKey() => __pbn__OrderingKey != null;
        public void ResetOrderingKey() => __pbn__OrderingKey = null;
        private byte[] __pbn__OrderingKey;

        [global::ProtoBuf.ProtoMember(19, Name = @"deliver_at_time")]
        public long DeliverAtTime
        {
            get { return __pbn__DeliverAtTime.GetValueOrDefault(); }
            set { __pbn__DeliverAtTime = value; }
        }
        public bool ShouldSerializeDeliverAtTime() => __pbn__DeliverAtTime != null;
        public void ResetDeliverAtTime() => __pbn__DeliverAtTime = null;
        private long? __pbn__DeliverAtTime;

        [global::ProtoBuf.ProtoMember(20, Name = @"marker_type")]
        public int MarkerType
        {
            get { return __pbn__MarkerType.GetValueOrDefault(); }
            set { __pbn__MarkerType = value; }
        }
        public bool ShouldSerializeMarkerType() => __pbn__MarkerType != null;
        public void ResetMarkerType() => __pbn__MarkerType = null;
        private int? __pbn__MarkerType;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class SingleMessageMetadata : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"properties")]
        public global::System.Collections.Generic.List<KeyValue> Properties { get; } = new global::System.Collections.Generic.List<KeyValue>();

        [global::ProtoBuf.ProtoMember(2, Name = @"partition_key")]
        [global::System.ComponentModel.DefaultValue("")]
        public string PartitionKey
        {
            get { return __pbn__PartitionKey ?? ""; }
            set { __pbn__PartitionKey = value; }
        }
        public bool ShouldSerializePartitionKey() => __pbn__PartitionKey != null;
        public void ResetPartitionKey() => __pbn__PartitionKey = null;
        private string __pbn__PartitionKey;

        [global::ProtoBuf.ProtoMember(3, Name = @"payload_size", IsRequired = true)]
        public int PayloadSize { get; set; }

        [global::ProtoBuf.ProtoMember(4, Name = @"compacted_out")]
        [global::System.ComponentModel.DefaultValue(false)]
        public bool CompactedOut
        {
            get { return __pbn__CompactedOut ?? false; }
            set { __pbn__CompactedOut = value; }
        }
        public bool ShouldSerializeCompactedOut() => __pbn__CompactedOut != null;
        public void ResetCompactedOut() => __pbn__CompactedOut = null;
        private bool? __pbn__CompactedOut;

        [global::ProtoBuf.ProtoMember(5, Name = @"event_time")]
        [global::System.ComponentModel.DefaultValue(0)]
        public ulong EventTime
        {
            get { return __pbn__EventTime ?? 0; }
            set { __pbn__EventTime = value; }
        }
        public bool ShouldSerializeEventTime() => __pbn__EventTime != null;
        public void ResetEventTime() => __pbn__EventTime = null;
        private ulong? __pbn__EventTime;

        [global::ProtoBuf.ProtoMember(6, Name = @"partition_key_b64_encoded")]
        [global::System.ComponentModel.DefaultValue(false)]
        public bool PartitionKeyB64Encoded
        {
            get { return __pbn__PartitionKeyB64Encoded ?? false; }
            set { __pbn__PartitionKeyB64Encoded = value; }
        }
        public bool ShouldSerializePartitionKeyB64Encoded() => __pbn__PartitionKeyB64Encoded != null;
        public void ResetPartitionKeyB64Encoded() => __pbn__PartitionKeyB64Encoded = null;
        private bool? __pbn__PartitionKeyB64Encoded;

        [global::ProtoBuf.ProtoMember(7, Name = @"ordering_key")]
        public byte[] OrderingKey
        {
            get { return __pbn__OrderingKey; }
            set { __pbn__OrderingKey = value; }
        }
        public bool ShouldSerializeOrderingKey() => __pbn__OrderingKey != null;
        public void ResetOrderingKey() => __pbn__OrderingKey = null;
        private byte[] __pbn__OrderingKey;

        [global::ProtoBuf.ProtoMember(8, Name = @"sequence_id")]
        public ulong SequenceId
        {
            get { return __pbn__SequenceId.GetValueOrDefault(); }
            set { __pbn__SequenceId = value; }
        }
        public bool ShouldSerializeSequenceId() => __pbn__SequenceId != null;
        public void ResetSequenceId() => __pbn__SequenceId = null;
        private ulong? __pbn__SequenceId;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandConnect : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"client_version", IsRequired = true)]
        public string ClientVersion { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"auth_method")]
        [global::System.ComponentModel.DefaultValue(AuthMethod.AuthMethodNone)]
        public AuthMethod AuthMethod
        {
            get { return __pbn__AuthMethod ?? AuthMethod.AuthMethodNone; }
            set { __pbn__AuthMethod = value; }
        }
        public bool ShouldSerializeAuthMethod() => __pbn__AuthMethod != null;
        public void ResetAuthMethod() => __pbn__AuthMethod = null;
        private AuthMethod? __pbn__AuthMethod;

        [global::ProtoBuf.ProtoMember(5, Name = @"auth_method_name")]
        [global::System.ComponentModel.DefaultValue("")]
        public string AuthMethodName
        {
            get { return __pbn__AuthMethodName ?? ""; }
            set { __pbn__AuthMethodName = value; }
        }
        public bool ShouldSerializeAuthMethodName() => __pbn__AuthMethodName != null;
        public void ResetAuthMethodName() => __pbn__AuthMethodName = null;
        private string __pbn__AuthMethodName;

        [global::ProtoBuf.ProtoMember(3, Name = @"auth_data")]
        public byte[] AuthData
        {
            get { return __pbn__AuthData; }
            set { __pbn__AuthData = value; }
        }
        public bool ShouldSerializeAuthData() => __pbn__AuthData != null;
        public void ResetAuthData() => __pbn__AuthData = null;
        private byte[] __pbn__AuthData;

        [global::ProtoBuf.ProtoMember(4, Name = @"protocol_version")]
        [global::System.ComponentModel.DefaultValue(0)]
        public int ProtocolVersion
        {
            get { return __pbn__ProtocolVersion ?? 0; }
            set { __pbn__ProtocolVersion = value; }
        }
        public bool ShouldSerializeProtocolVersion() => __pbn__ProtocolVersion != null;
        public void ResetProtocolVersion() => __pbn__ProtocolVersion = null;
        private int? __pbn__ProtocolVersion;

        [global::ProtoBuf.ProtoMember(6, Name = @"proxy_to_broker_url")]
        [global::System.ComponentModel.DefaultValue("")]
        public string ProxyToBrokerUrl
        {
            get { return __pbn__ProxyToBrokerUrl ?? ""; }
            set { __pbn__ProxyToBrokerUrl = value; }
        }
        public bool ShouldSerializeProxyToBrokerUrl() => __pbn__ProxyToBrokerUrl != null;
        public void ResetProxyToBrokerUrl() => __pbn__ProxyToBrokerUrl = null;
        private string __pbn__ProxyToBrokerUrl;

        [global::ProtoBuf.ProtoMember(7, Name = @"original_principal")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalPrincipal
        {
            get { return __pbn__OriginalPrincipal ?? ""; }
            set { __pbn__OriginalPrincipal = value; }
        }
        public bool ShouldSerializeOriginalPrincipal() => __pbn__OriginalPrincipal != null;
        public void ResetOriginalPrincipal() => __pbn__OriginalPrincipal = null;
        private string __pbn__OriginalPrincipal;

        [global::ProtoBuf.ProtoMember(8, Name = @"original_auth_data")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalAuthData
        {
            get { return __pbn__OriginalAuthData ?? ""; }
            set { __pbn__OriginalAuthData = value; }
        }
        public bool ShouldSerializeOriginalAuthData() => __pbn__OriginalAuthData != null;
        public void ResetOriginalAuthData() => __pbn__OriginalAuthData = null;
        private string __pbn__OriginalAuthData;

        [global::ProtoBuf.ProtoMember(9, Name = @"original_auth_method")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalAuthMethod
        {
            get { return __pbn__OriginalAuthMethod ?? ""; }
            set { __pbn__OriginalAuthMethod = value; }
        }
        public bool ShouldSerializeOriginalAuthMethod() => __pbn__OriginalAuthMethod != null;
        public void ResetOriginalAuthMethod() => __pbn__OriginalAuthMethod = null;
        private string __pbn__OriginalAuthMethod;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandConnected : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"server_version", IsRequired = true)]
        public string ServerVersion { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"protocol_version")]
        [global::System.ComponentModel.DefaultValue(0)]
        public int ProtocolVersion
        {
            get { return __pbn__ProtocolVersion ?? 0; }
            set { __pbn__ProtocolVersion = value; }
        }
        public bool ShouldSerializeProtocolVersion() => __pbn__ProtocolVersion != null;
        public void ResetProtocolVersion() => __pbn__ProtocolVersion = null;
        private int? __pbn__ProtocolVersion;

        [global::ProtoBuf.ProtoMember(3, Name = @"max_message_size")]
        public int MaxMessageSize
        {
            get { return __pbn__MaxMessageSize.GetValueOrDefault(); }
            set { __pbn__MaxMessageSize = value; }
        }
        public bool ShouldSerializeMaxMessageSize() => __pbn__MaxMessageSize != null;
        public void ResetMaxMessageSize() => __pbn__MaxMessageSize = null;
        private int? __pbn__MaxMessageSize;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandAuthResponse : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"client_version")]
        [global::System.ComponentModel.DefaultValue("")]
        public string ClientVersion
        {
            get { return __pbn__ClientVersion ?? ""; }
            set { __pbn__ClientVersion = value; }
        }
        public bool ShouldSerializeClientVersion() => __pbn__ClientVersion != null;
        public void ResetClientVersion() => __pbn__ClientVersion = null;
        private string __pbn__ClientVersion;

        [global::ProtoBuf.ProtoMember(2, Name = @"response")]
        public AuthData Response { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"protocol_version")]
        [global::System.ComponentModel.DefaultValue(0)]
        public int ProtocolVersion
        {
            get { return __pbn__ProtocolVersion ?? 0; }
            set { __pbn__ProtocolVersion = value; }
        }
        public bool ShouldSerializeProtocolVersion() => __pbn__ProtocolVersion != null;
        public void ResetProtocolVersion() => __pbn__ProtocolVersion = null;
        private int? __pbn__ProtocolVersion;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandAuthChallenge : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"server_version")]
        [global::System.ComponentModel.DefaultValue("")]
        public string ServerVersion
        {
            get { return __pbn__ServerVersion ?? ""; }
            set { __pbn__ServerVersion = value; }
        }
        public bool ShouldSerializeServerVersion() => __pbn__ServerVersion != null;
        public void ResetServerVersion() => __pbn__ServerVersion = null;
        private string __pbn__ServerVersion;

        [global::ProtoBuf.ProtoMember(2, Name = @"challenge")]
        public AuthData Challenge { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"protocol_version")]
        [global::System.ComponentModel.DefaultValue(0)]
        public int ProtocolVersion
        {
            get { return __pbn__ProtocolVersion ?? 0; }
            set { __pbn__ProtocolVersion = value; }
        }
        public bool ShouldSerializeProtocolVersion() => __pbn__ProtocolVersion != null;
        public void ResetProtocolVersion() => __pbn__ProtocolVersion = null;
        private int? __pbn__ProtocolVersion;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class AuthData : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"auth_method_name")]
        [global::System.ComponentModel.DefaultValue("")]
        public string AuthMethodName
        {
            get { return __pbn__AuthMethodName ?? ""; }
            set { __pbn__AuthMethodName = value; }
        }
        public bool ShouldSerializeAuthMethodName() => __pbn__AuthMethodName != null;
        public void ResetAuthMethodName() => __pbn__AuthMethodName = null;
        private string __pbn__AuthMethodName;

        [global::ProtoBuf.ProtoMember(2)]
        public byte[] auth_data
        {
            get { return __pbn__auth_data; }
            set { __pbn__auth_data = value; }
        }
        public bool ShouldSerializeauth_data() => __pbn__auth_data != null;
        public void Resetauth_data() => __pbn__auth_data = null;
        private byte[] __pbn__auth_data;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandSubscribe : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"topic", IsRequired = true)]
        public string Topic { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"subscription", IsRequired = true)]
        public string Subscription { get; set; }

        [global::ProtoBuf.ProtoMember(3, IsRequired = true)]
        public SubType Type { get; set; }

        [global::ProtoBuf.ProtoMember(4, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(5, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(6, Name = @"consumer_name")]
        [global::System.ComponentModel.DefaultValue("")]
        public string ConsumerName
        {
            get { return __pbn__ConsumerName ?? ""; }
            set { __pbn__ConsumerName = value; }
        }
        public bool ShouldSerializeConsumerName() => __pbn__ConsumerName != null;
        public void ResetConsumerName() => __pbn__ConsumerName = null;
        private string __pbn__ConsumerName;

        [global::ProtoBuf.ProtoMember(7, Name = @"priority_level")]
        public int PriorityLevel
        {
            get { return __pbn__PriorityLevel.GetValueOrDefault(); }
            set { __pbn__PriorityLevel = value; }
        }
        public bool ShouldSerializePriorityLevel() => __pbn__PriorityLevel != null;
        public void ResetPriorityLevel() => __pbn__PriorityLevel = null;
        private int? __pbn__PriorityLevel;

        [global::ProtoBuf.ProtoMember(8, Name = @"durable")]
        [global::System.ComponentModel.DefaultValue(true)]
        public bool Durable
        {
            get { return __pbn__Durable ?? true; }
            set { __pbn__Durable = value; }
        }
        public bool ShouldSerializeDurable() => __pbn__Durable != null;
        public void ResetDurable() => __pbn__Durable = null;
        private bool? __pbn__Durable;

        [global::ProtoBuf.ProtoMember(9, Name = @"start_message_id")]
        public MessageIdData StartMessageId { get; set; }

        [global::ProtoBuf.ProtoMember(10, Name = @"metadata")]
        public global::System.Collections.Generic.List<KeyValue> Metadatas { get; } = new global::System.Collections.Generic.List<KeyValue>();

        [global::ProtoBuf.ProtoMember(11, Name = @"read_compacted")]
        public bool ReadCompacted
        {
            get { return __pbn__ReadCompacted.GetValueOrDefault(); }
            set { __pbn__ReadCompacted = value; }
        }
        public bool ShouldSerializeReadCompacted() => __pbn__ReadCompacted != null;
        public void ResetReadCompacted() => __pbn__ReadCompacted = null;
        private bool? __pbn__ReadCompacted;

        [global::ProtoBuf.ProtoMember(12, Name = @"schema")]
        public Schema Schema { get; set; }

        [global::ProtoBuf.ProtoMember(13)]
        [global::System.ComponentModel.DefaultValue(InitialPosition.Latest)]
        public InitialPosition initialPosition
        {
            get { return __pbn__initialPosition ?? InitialPosition.Latest; }
            set { __pbn__initialPosition = value; }
        }
        public bool ShouldSerializeinitialPosition() => __pbn__initialPosition != null;
        public void ResetinitialPosition() => __pbn__initialPosition = null;
        private InitialPosition? __pbn__initialPosition;

        [global::ProtoBuf.ProtoMember(14, Name = @"replicate_subscription_state")]
        public bool ReplicateSubscriptionState
        {
            get { return __pbn__ReplicateSubscriptionState.GetValueOrDefault(); }
            set { __pbn__ReplicateSubscriptionState = value; }
        }
        public bool ShouldSerializeReplicateSubscriptionState() => __pbn__ReplicateSubscriptionState != null;
        public void ResetReplicateSubscriptionState() => __pbn__ReplicateSubscriptionState = null;
        private bool? __pbn__ReplicateSubscriptionState;

        [global::ProtoBuf.ProtoContract()]
        public enum SubType
        {
            Exclusive = 0,
            Shared = 1,
            Failover = 2,
            [global::ProtoBuf.ProtoEnum(Name = @"Key_Shared")]
            KeyShared = 3,
        }

        [global::ProtoBuf.ProtoContract()]
        public enum InitialPosition
        {
            Latest = 0,
            Earliest = 1,
        }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandPartitionedTopicMetadata : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"topic", IsRequired = true)]
        public string Topic { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"original_principal")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalPrincipal
        {
            get { return __pbn__OriginalPrincipal ?? ""; }
            set { __pbn__OriginalPrincipal = value; }
        }
        public bool ShouldSerializeOriginalPrincipal() => __pbn__OriginalPrincipal != null;
        public void ResetOriginalPrincipal() => __pbn__OriginalPrincipal = null;
        private string __pbn__OriginalPrincipal;

        [global::ProtoBuf.ProtoMember(4, Name = @"original_auth_data")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalAuthData
        {
            get { return __pbn__OriginalAuthData ?? ""; }
            set { __pbn__OriginalAuthData = value; }
        }
        public bool ShouldSerializeOriginalAuthData() => __pbn__OriginalAuthData != null;
        public void ResetOriginalAuthData() => __pbn__OriginalAuthData = null;
        private string __pbn__OriginalAuthData;

        [global::ProtoBuf.ProtoMember(5, Name = @"original_auth_method")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalAuthMethod
        {
            get { return __pbn__OriginalAuthMethod ?? ""; }
            set { __pbn__OriginalAuthMethod = value; }
        }
        public bool ShouldSerializeOriginalAuthMethod() => __pbn__OriginalAuthMethod != null;
        public void ResetOriginalAuthMethod() => __pbn__OriginalAuthMethod = null;
        private string __pbn__OriginalAuthMethod;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandPartitionedTopicMetadataResponse : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"partitions")]
        public uint Partitions
        {
            get { return __pbn__Partitions.GetValueOrDefault(); }
            set { __pbn__Partitions = value; }
        }
        public bool ShouldSerializePartitions() => __pbn__Partitions != null;
        public void ResetPartitions() => __pbn__Partitions = null;
        private uint? __pbn__Partitions;

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"response")]
        [global::System.ComponentModel.DefaultValue(LookupType.Success)]
        public LookupType Response
        {
            get { return __pbn__Response ?? LookupType.Success; }
            set { __pbn__Response = value; }
        }
        public bool ShouldSerializeResponse() => __pbn__Response != null;
        public void ResetResponse() => __pbn__Response = null;
        private LookupType? __pbn__Response;

        [global::ProtoBuf.ProtoMember(4, Name = @"error")]
        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
        public ServerError Error
        {
            get { return __pbn__Error ?? ServerError.UnknownError; }
            set { __pbn__Error = value; }
        }
        public bool ShouldSerializeError() => __pbn__Error != null;
        public void ResetError() => __pbn__Error = null;
        private ServerError? __pbn__Error;

        [global::ProtoBuf.ProtoMember(5, Name = @"message")]
        [global::System.ComponentModel.DefaultValue("")]
        public string Message
        {
            get { return __pbn__Message ?? ""; }
            set { __pbn__Message = value; }
        }
        public bool ShouldSerializeMessage() => __pbn__Message != null;
        public void ResetMessage() => __pbn__Message = null;
        private string __pbn__Message;

        [global::ProtoBuf.ProtoContract()]
        public enum LookupType
        {
            Success = 0,
            Failed = 1,
        }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandLookupTopic : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"topic", IsRequired = true)]
        public string Topic { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"authoritative")]
        [global::System.ComponentModel.DefaultValue(false)]
        public bool Authoritative
        {
            get { return __pbn__Authoritative ?? false; }
            set { __pbn__Authoritative = value; }
        }
        public bool ShouldSerializeAuthoritative() => __pbn__Authoritative != null;
        public void ResetAuthoritative() => __pbn__Authoritative = null;
        private bool? __pbn__Authoritative;

        [global::ProtoBuf.ProtoMember(4, Name = @"original_principal")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalPrincipal
        {
            get { return __pbn__OriginalPrincipal ?? ""; }
            set { __pbn__OriginalPrincipal = value; }
        }
        public bool ShouldSerializeOriginalPrincipal() => __pbn__OriginalPrincipal != null;
        public void ResetOriginalPrincipal() => __pbn__OriginalPrincipal = null;
        private string __pbn__OriginalPrincipal;

        [global::ProtoBuf.ProtoMember(5, Name = @"original_auth_data")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalAuthData
        {
            get { return __pbn__OriginalAuthData ?? ""; }
            set { __pbn__OriginalAuthData = value; }
        }
        public bool ShouldSerializeOriginalAuthData() => __pbn__OriginalAuthData != null;
        public void ResetOriginalAuthData() => __pbn__OriginalAuthData = null;
        private string __pbn__OriginalAuthData;

        [global::ProtoBuf.ProtoMember(6, Name = @"original_auth_method")]
        [global::System.ComponentModel.DefaultValue("")]
        public string OriginalAuthMethod
        {
            get { return __pbn__OriginalAuthMethod ?? ""; }
            set { __pbn__OriginalAuthMethod = value; }
        }
        public bool ShouldSerializeOriginalAuthMethod() => __pbn__OriginalAuthMethod != null;
        public void ResetOriginalAuthMethod() => __pbn__OriginalAuthMethod = null;
        private string __pbn__OriginalAuthMethod;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandLookupTopicResponse : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1)]
        [global::System.ComponentModel.DefaultValue("")]
        public string BrokerServiceUrl
        {
            get { return __pbn__brokerServiceUrl ?? ""; }
            set { __pbn__brokerServiceUrl = value; }
        }
        public bool ShouldSerializebrokerServiceUrl() => __pbn__brokerServiceUrl != null;
        public void ResetbrokerServiceUrl() => __pbn__brokerServiceUrl = null;
        private string __pbn__brokerServiceUrl;

        [global::ProtoBuf.ProtoMember(2)]
        [global::System.ComponentModel.DefaultValue("")]
        public string BrokerServiceUrlTls
        {
            get { return __pbn__brokerServiceUrlTls ?? ""; }
            set { __pbn__brokerServiceUrlTls = value; }
        }
        public bool ShouldSerializebrokerServiceUrlTls() => __pbn__brokerServiceUrlTls != null;
        public void ResetbrokerServiceUrlTls() => __pbn__brokerServiceUrlTls = null;
        private string __pbn__brokerServiceUrlTls;

        [global::ProtoBuf.ProtoMember(3, Name = @"response")]
        [global::System.ComponentModel.DefaultValue(LookupType.Redirect)]
        public LookupType Response
        {
            get { return __pbn__Response ?? LookupType.Redirect; }
            set { __pbn__Response = value; }
        }
        public bool ShouldSerializeResponse() => __pbn__Response != null;
        public void ResetResponse() => __pbn__Response = null;
        private LookupType? __pbn__Response;

        [global::ProtoBuf.ProtoMember(4, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(5, Name = @"authoritative")]
        [global::System.ComponentModel.DefaultValue(false)]
        public bool Authoritative
        {
            get { return __pbn__Authoritative ?? false; }
            set { __pbn__Authoritative = value; }
        }
        public bool ShouldSerializeAuthoritative() => __pbn__Authoritative != null;
        public void ResetAuthoritative() => __pbn__Authoritative = null;
        private bool? __pbn__Authoritative;

        [global::ProtoBuf.ProtoMember(6, Name = @"error")]
        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
        public ServerError Error
        {
            get { return __pbn__Error ?? ServerError.UnknownError; }
            set { __pbn__Error = value; }
        }
        public bool ShouldSerializeError() => __pbn__Error != null;
        public void ResetError() => __pbn__Error = null;
        private ServerError? __pbn__Error;

        [global::ProtoBuf.ProtoMember(7, Name = @"message")]
        [global::System.ComponentModel.DefaultValue("")]
        public string Message
        {
            get { return __pbn__Message ?? ""; }
            set { __pbn__Message = value; }
        }
        public bool ShouldSerializeMessage() => __pbn__Message != null;
        public void ResetMessage() => __pbn__Message = null;
        private string __pbn__Message;

        [global::ProtoBuf.ProtoMember(8, Name = @"proxy_through_service_url")]
        [global::System.ComponentModel.DefaultValue(false)]
        public bool ProxyThroughServiceUrl
        {
            get { return __pbn__ProxyThroughServiceUrl ?? false; }
            set { __pbn__ProxyThroughServiceUrl = value; }
        }
        public bool ShouldSerializeProxyThroughServiceUrl() => __pbn__ProxyThroughServiceUrl != null;
        public void ResetProxyThroughServiceUrl() => __pbn__ProxyThroughServiceUrl = null;
        private bool? __pbn__ProxyThroughServiceUrl;

        [global::ProtoBuf.ProtoContract()]
        public enum LookupType
        {
            Redirect = 0,
            Connect = 1,
            Failed = 2,
        }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandProducer : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"topic", IsRequired = true)]
        public string Topic { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"producer_id", IsRequired = true)]
        public ulong ProducerId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(4, Name = @"producer_name")]
        [global::System.ComponentModel.DefaultValue("")]
        public string ProducerName
        {
            get { return __pbn__ProducerName ?? ""; }
            set { __pbn__ProducerName = value; }
        }
        public bool ShouldSerializeProducerName() => __pbn__ProducerName != null;
        public void ResetProducerName() => __pbn__ProducerName = null;
        private string __pbn__ProducerName;

        [global::ProtoBuf.ProtoMember(5, Name = @"encrypted")]
        [global::System.ComponentModel.DefaultValue(false)]
        public bool Encrypted
        {
            get { return __pbn__Encrypted ?? false; }
            set { __pbn__Encrypted = value; }
        }
        public bool ShouldSerializeEncrypted() => __pbn__Encrypted != null;
        public void ResetEncrypted() => __pbn__Encrypted = null;
        private bool? __pbn__Encrypted;

        [global::ProtoBuf.ProtoMember(6, Name = @"metadata")]
        public global::System.Collections.Generic.List<KeyValue> Metadatas { get; } = new global::System.Collections.Generic.List<KeyValue>();

        [global::ProtoBuf.ProtoMember(7, Name = @"schema")]
        public Schema Schema { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandSend : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"producer_id", IsRequired = true)]
        public ulong ProducerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"sequence_id", IsRequired = true)]
        public ulong SequenceId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"num_messages")]
        [global::System.ComponentModel.DefaultValue(1)]
        public int NumMessages
        {
            get { return __pbn__NumMessages ?? 1; }
            set { __pbn__NumMessages = value; }
        }
        public bool ShouldSerializeNumMessages() => __pbn__NumMessages != null;
        public void ResetNumMessages() => __pbn__NumMessages = null;
        private int? __pbn__NumMessages;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandSendReceipt : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"producer_id", IsRequired = true)]
        public ulong ProducerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"sequence_id", IsRequired = true)]
        public ulong SequenceId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"message_id")]
        public MessageIdData MessageId { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandSendError : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"producer_id", IsRequired = true)]
        public ulong ProducerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"sequence_id", IsRequired = true)]
        public ulong SequenceId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"error", IsRequired = true)]
        public ServerError Error { get; set; }

        [global::ProtoBuf.ProtoMember(4, Name = @"message", IsRequired = true)]
        public string Message { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandMessage : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"message_id", IsRequired = true)]
        public MessageIdData MessageId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"redelivery_count")]
        [global::System.ComponentModel.DefaultValue(0)]
        public uint RedeliveryCount
        {
            get { return __pbn__RedeliveryCount ?? 0; }
            set { __pbn__RedeliveryCount = value; }
        }
        public bool ShouldSerializeRedeliveryCount() => __pbn__RedeliveryCount != null;
        public void ResetRedeliveryCount() => __pbn__RedeliveryCount = null;
        private uint? __pbn__RedeliveryCount;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandAck : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, IsRequired = true)]
        public AckType Type { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"message_id")]
        public global::System.Collections.Generic.List<MessageIdData> MessageIds { get; } = new global::System.Collections.Generic.List<MessageIdData>(1);

        [global::ProtoBuf.ProtoMember(4)]
        [global::System.ComponentModel.DefaultValue(ValidationError.UncompressedSizeCorruption)]
        public ValidationError validation_error
        {
            get { return __pbn__validation_error ?? ValidationError.UncompressedSizeCorruption; }
            set { __pbn__validation_error = value; }
        }
        public bool ShouldSerializevalidation_error() => __pbn__validation_error != null;
        public void Resetvalidation_error() => __pbn__validation_error = null;
        private ValidationError? __pbn__validation_error;

        [global::ProtoBuf.ProtoMember(5, Name = @"properties")]
        public global::System.Collections.Generic.List<KeyLongValue> Properties { get; } = new global::System.Collections.Generic.List<KeyLongValue>();

        [global::ProtoBuf.ProtoContract()]
        public enum AckType
        {
            Individual = 0,
            Cumulative = 1,
        }

        [global::ProtoBuf.ProtoContract()]
        public enum ValidationError
        {
            UncompressedSizeCorruption = 0,
            DecompressionError = 1,
            ChecksumMismatch = 2,
            BatchDeSerializeError = 3,
            DecryptionError = 4,
        }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandActiveConsumerChange : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"is_active")]
        [global::System.ComponentModel.DefaultValue(false)]
        public bool IsActive
        {
            get { return __pbn__IsActive ?? false; }
            set { __pbn__IsActive = value; }
        }
        public bool ShouldSerializeIsActive() => __pbn__IsActive != null;
        public void ResetIsActive() => __pbn__IsActive = null;
        private bool? __pbn__IsActive;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandFlow : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, IsRequired = true)]
        public uint MessagePermits { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandUnsubscribe : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandSeek : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"message_id")]
        public MessageIdData MessageId { get; set; }

        [global::ProtoBuf.ProtoMember(4, Name = @"message_publish_time")]
        public ulong MessagePublishTime
        {
            get { return __pbn__MessagePublishTime.GetValueOrDefault(); }
            set { __pbn__MessagePublishTime = value; }
        }
        public bool ShouldSerializeMessagePublishTime() => __pbn__MessagePublishTime != null;
        public void ResetMessagePublishTime() => __pbn__MessagePublishTime = null;
        private ulong? __pbn__MessagePublishTime;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandReachedEndOfTopic : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandCloseProducer : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"producer_id", IsRequired = true)]
        public ulong ProducerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandCloseConsumer : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandRedeliverUnacknowledgedMessages : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"message_ids")]
        public global::System.Collections.Generic.List<MessageIdData> MessageIds { get; } = new global::System.Collections.Generic.List<MessageIdData>();
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandSuccess : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"schema")]
        public Schema Schema { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandProducerSuccess : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"producer_name", IsRequired = true)]
        public string ProducerName { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"last_sequence_id")]
        [global::System.ComponentModel.DefaultValue(-1)]
        public long LastSequenceId
        {
            get { return __pbn__LastSequenceId ?? -1; }
            set { __pbn__LastSequenceId = value; }
        }
        public bool ShouldSerializeLastSequenceId() => __pbn__LastSequenceId != null;
        public void ResetLastSequenceId() => __pbn__LastSequenceId = null;
        private long? __pbn__LastSequenceId;

        [global::ProtoBuf.ProtoMember(4, Name = @"schema_version")]
        public byte[] SchemaVersion
        {
            get { return __pbn__SchemaVersion; }
            set { __pbn__SchemaVersion = value; }
        }
        public bool ShouldSerializeSchemaVersion() => __pbn__SchemaVersion != null;
        public void ResetSchemaVersion() => __pbn__SchemaVersion = null;
        private byte[] __pbn__SchemaVersion;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandError : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"error", IsRequired = true)]
        public ServerError Error { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"message", IsRequired = true)]
        public string Message { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandPing : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandPong : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandConsumerStats : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(4, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandConsumerStatsResponse : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"error_code")]
        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
        public ServerError ErrorCode
        {
            get { return __pbn__ErrorCode ?? ServerError.UnknownError; }
            set { __pbn__ErrorCode = value; }
        }
        public bool ShouldSerializeErrorCode() => __pbn__ErrorCode != null;
        public void ResetErrorCode() => __pbn__ErrorCode = null;
        private ServerError? __pbn__ErrorCode;

        [global::ProtoBuf.ProtoMember(3, Name = @"error_message")]
        [global::System.ComponentModel.DefaultValue("")]
        public string ErrorMessage
        {
            get { return __pbn__ErrorMessage ?? ""; }
            set { __pbn__ErrorMessage = value; }
        }
        public bool ShouldSerializeErrorMessage() => __pbn__ErrorMessage != null;
        public void ResetErrorMessage() => __pbn__ErrorMessage = null;
        private string __pbn__ErrorMessage;

        [global::ProtoBuf.ProtoMember(4)]
        public double MsgRateOut
        {
            get { return __pbn__msgRateOut.GetValueOrDefault(); }
            set { __pbn__msgRateOut = value; }
        }
        public bool ShouldSerializemsgRateOut() => __pbn__msgRateOut != null;
        public void ResetmsgRateOut() => __pbn__msgRateOut = null;
        private double? __pbn__msgRateOut;

        [global::ProtoBuf.ProtoMember(5)]
        public double MsgThroughputOut
        {
            get { return __pbn__msgThroughputOut.GetValueOrDefault(); }
            set { __pbn__msgThroughputOut = value; }
        }
        public bool ShouldSerializemsgThroughputOut() => __pbn__msgThroughputOut != null;
        public void ResetmsgThroughputOut() => __pbn__msgThroughputOut = null;
        private double? __pbn__msgThroughputOut;

        [global::ProtoBuf.ProtoMember(6)]
        public double MsgRateRedeliver
        {
            get { return __pbn__msgRateRedeliver.GetValueOrDefault(); }
            set { __pbn__msgRateRedeliver = value; }
        }
        public bool ShouldSerializemsgRateRedeliver() => __pbn__msgRateRedeliver != null;
        public void ResetmsgRateRedeliver() => __pbn__msgRateRedeliver = null;
        private double? __pbn__msgRateRedeliver;

        [global::ProtoBuf.ProtoMember(7)]
        [global::System.ComponentModel.DefaultValue("")]
        public string ConsumerName
        {
            get { return __pbn__consumerName ?? ""; }
            set { __pbn__consumerName = value; }
        }
        public bool ShouldSerializeconsumerName() => __pbn__consumerName != null;
        public void ResetconsumerName() => __pbn__consumerName = null;
        private string __pbn__consumerName;

        [global::ProtoBuf.ProtoMember(8)]
        public ulong AvailablePermits
        {
            get { return __pbn__availablePermits.GetValueOrDefault(); }
            set { __pbn__availablePermits = value; }
        }
        public bool ShouldSerializeavailablePermits() => __pbn__availablePermits != null;
        public void ResetavailablePermits() => __pbn__availablePermits = null;
        private ulong? __pbn__availablePermits;

        [global::ProtoBuf.ProtoMember(9)]
        public ulong UnackedMessages
        {
            get { return __pbn__unackedMessages.GetValueOrDefault(); }
            set { __pbn__unackedMessages = value; }
        }
        public bool ShouldSerializeunackedMessages() => __pbn__unackedMessages != null;
        public void ResetunackedMessages() => __pbn__unackedMessages = null;
        private ulong? __pbn__unackedMessages;

        [global::ProtoBuf.ProtoMember(10)]
        public bool BlockedConsumerOnUnackedMsgs
        {
            get { return __pbn__blockedConsumerOnUnackedMsgs.GetValueOrDefault(); }
            set { __pbn__blockedConsumerOnUnackedMsgs = value; }
        }
        public bool ShouldSerializeblockedConsumerOnUnackedMsgs() => __pbn__blockedConsumerOnUnackedMsgs != null;
        public void ResetblockedConsumerOnUnackedMsgs() => __pbn__blockedConsumerOnUnackedMsgs = null;
        private bool? __pbn__blockedConsumerOnUnackedMsgs;

        [global::ProtoBuf.ProtoMember(11, Name = @"address")]
        [global::System.ComponentModel.DefaultValue("")]
        public string Address
        {
            get { return __pbn__Address ?? ""; }
            set { __pbn__Address = value; }
        }
        public bool ShouldSerializeAddress() => __pbn__Address != null;
        public void ResetAddress() => __pbn__Address = null;
        private string __pbn__Address;

        [global::ProtoBuf.ProtoMember(12)]
        [global::System.ComponentModel.DefaultValue("")]
        public string ConnectedSince
        {
            get { return __pbn__connectedSince ?? ""; }
            set { __pbn__connectedSince = value; }
        }
        public bool ShouldSerializeconnectedSince() => __pbn__connectedSince != null;
        public void ResetconnectedSince() => __pbn__connectedSince = null;
        private string __pbn__connectedSince;

        [global::ProtoBuf.ProtoMember(13, Name = @"type")]
        [global::System.ComponentModel.DefaultValue("")]
        public string Type
        {
            get { return __pbn__Type ?? ""; }
            set { __pbn__Type = value; }
        }
        public bool ShouldSerializeType() => __pbn__Type != null;
        public void ResetType() => __pbn__Type = null;
        private string __pbn__Type;

        [global::ProtoBuf.ProtoMember(14)]
        public double MsgRateExpired
        {
            get { return __pbn__msgRateExpired.GetValueOrDefault(); }
            set { __pbn__msgRateExpired = value; }
        }
        public bool ShouldSerializemsgRateExpired() => __pbn__msgRateExpired != null;
        public void ResetmsgRateExpired() => __pbn__msgRateExpired = null;
        private double? __pbn__msgRateExpired;

        [global::ProtoBuf.ProtoMember(15)]
        public ulong MsgBacklog
        {
            get { return __pbn__msgBacklog.GetValueOrDefault(); }
            set { __pbn__msgBacklog = value; }
        }
        public bool ShouldSerializemsgBacklog() => __pbn__msgBacklog != null;
        public void ResetmsgBacklog() => __pbn__msgBacklog = null;
        private ulong? __pbn__msgBacklog;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandGetLastMessageId : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
        public ulong ConsumerId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandGetLastMessageIdResponse : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"last_message_id", IsRequired = true)]
        public MessageIdData LastMessageId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandGetTopicsOfNamespace : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"namespace", IsRequired = true)]
        public string Namespace { get; set; }

        [global::ProtoBuf.ProtoMember(3)]
        [global::System.ComponentModel.DefaultValue(Mode.Persistent)]
        public Mode mode
        {
            get { return __pbn__mode ?? Mode.Persistent; }
            set { __pbn__mode = value; }
        }
        public bool ShouldSerializemode() => __pbn__mode != null;
        public void Resetmode() => __pbn__mode = null;
        private Mode? __pbn__mode;

        [global::ProtoBuf.ProtoContract()]
        public enum Mode
        {
            [global::ProtoBuf.ProtoEnum(Name = @"PERSISTENT")]
            Persistent = 0,
            [global::ProtoBuf.ProtoEnum(Name = @"NON_PERSISTENT")]
            NonPersistent = 1,
            [global::ProtoBuf.ProtoEnum(Name = @"ALL")]
            All = 2,
        }
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandGetTopicsOfNamespaceResponse : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"topics")]
        public global::System.Collections.Generic.List<string> Topics { get; } = new global::System.Collections.Generic.List<string>();
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandGetSchema : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"topic", IsRequired = true)]
        public string Topic { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"schema_version")]
        public byte[] SchemaVersion
        {
            get { return __pbn__SchemaVersion; }
            set { __pbn__SchemaVersion = value; }
        }
        public bool ShouldSerializeSchemaVersion() => __pbn__SchemaVersion != null;
        public void ResetSchemaVersion() => __pbn__SchemaVersion = null;
        private byte[] __pbn__SchemaVersion;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class CommandGetSchemaResponse : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, Name = @"request_id", IsRequired = true)]
        public ulong RequestId { get; set; }

        [global::ProtoBuf.ProtoMember(2, Name = @"error_code")]
        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
        public ServerError ErrorCode
        {
            get { return __pbn__ErrorCode ?? ServerError.UnknownError; }
            set { __pbn__ErrorCode = value; }
        }
        public bool ShouldSerializeErrorCode() => __pbn__ErrorCode != null;
        public void ResetErrorCode() => __pbn__ErrorCode = null;
        private ServerError? __pbn__ErrorCode;

        [global::ProtoBuf.ProtoMember(3, Name = @"error_message")]
        [global::System.ComponentModel.DefaultValue("")]
        public string ErrorMessage
        {
            get { return __pbn__ErrorMessage ?? ""; }
            set { __pbn__ErrorMessage = value; }
        }
        public bool ShouldSerializeErrorMessage() => __pbn__ErrorMessage != null;
        public void ResetErrorMessage() => __pbn__ErrorMessage = null;
        private string __pbn__ErrorMessage;

        [global::ProtoBuf.ProtoMember(4, Name = @"schema")]
        public Schema Schema { get; set; }

        [global::ProtoBuf.ProtoMember(5, Name = @"schema_version")]
        public byte[] SchemaVersion
        {
            get { return __pbn__SchemaVersion; }
            set { __pbn__SchemaVersion = value; }
        }
        public bool ShouldSerializeSchemaVersion() => __pbn__SchemaVersion != null;
        public void ResetSchemaVersion() => __pbn__SchemaVersion = null;
        private byte[] __pbn__SchemaVersion;
    }

    [global::ProtoBuf.ProtoContract()]
    public partial class BaseCommand : global::ProtoBuf.IExtensible
    {
        private global::ProtoBuf.IExtension __pbn__extensionData;
        global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
            => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);

        [global::ProtoBuf.ProtoMember(1, IsRequired = true)]
        public Type CommandType { get; set; } = Type.Connect;

        [global::ProtoBuf.ProtoMember(2, Name = @"connect")]
        public CommandConnect Connect { get; set; }

        [global::ProtoBuf.ProtoMember(3, Name = @"connected")]
        public CommandConnected Connected { get; set; }

        [global::ProtoBuf.ProtoMember(4, Name = @"subscribe")]
        public CommandSubscribe Subscribe { get; set; }

        [global::ProtoBuf.ProtoMember(5, Name = @"producer")]
        public CommandProducer Producer { get; set; }

        [global::ProtoBuf.ProtoMember(6, Name = @"send")]
        public CommandSend Send { get; set; }

        [global::ProtoBuf.ProtoMember(7, Name = @"send_receipt")]
        public CommandSendReceipt SendReceipt { get; set; }

        [global::ProtoBuf.ProtoMember(8, Name = @"send_error")]
        public CommandSendError SendError { get; set; }

        [global::ProtoBuf.ProtoMember(9, Name = @"message")]
        public CommandMessage Message { get; set; }

        [global::ProtoBuf.ProtoMember(10, Name = @"ack")]
        public CommandAck Ack { get; set; }

        [global::ProtoBuf.ProtoMember(11, Name = @"flow")]
        public CommandFlow Flow { get; set; }

        [global::ProtoBuf.ProtoMember(12, Name = @"unsubscribe")]
        public CommandUnsubscribe Unsubscribe { get; set; }

        [global::ProtoBuf.ProtoMember(13, Name = @"success")]
        public CommandSuccess Success { get; set; }

        [global::ProtoBuf.ProtoMember(14, Name = @"error")]
        public CommandError Error { get; set; }

        [global::ProtoBuf.ProtoMember(15, Name = @"close_producer")]
        public CommandCloseProducer CloseProducer { get; set; }

        [global::ProtoBuf.ProtoMember(16, Name = @"close_consumer")]
        public CommandCloseConsumer CloseConsumer { get; set; }

        [global::ProtoBuf.ProtoMember(17, Name = @"producer_success")]
        public CommandProducerSuccess ProducerSuccess { get; set; }

        [global::ProtoBuf.ProtoMember(18, Name = @"ping")]
        public CommandPing Ping { get; set; }

        [global::ProtoBuf.ProtoMember(19, Name = @"pong")]
        public CommandPong Pong { get; set; }

        [global::ProtoBuf.ProtoMember(20)]
        public CommandRedeliverUnacknowledgedMessages RedeliverUnacknowledgedMessages { get; set; }

        [global::ProtoBuf.ProtoMember(21)]
        public CommandPartitionedTopicMetadata PartitionMetadata { get; set; }

        [global::ProtoBuf.ProtoMember(22)]
        public CommandPartitionedTopicMetadataResponse PartitionMetadataResponse { get; set; }

        [global::ProtoBuf.ProtoMember(23)]
        public CommandLookupTopic LookupTopic { get; set; }

        [global::ProtoBuf.ProtoMember(24)]
        public CommandLookupTopicResponse LookupTopicResponse { get; set; }

        [global::ProtoBuf.ProtoMember(25)]
        public CommandConsumerStats ConsumerStats { get; set; }

        [global::ProtoBuf.ProtoMember(26)]
        public CommandConsumerStatsResponse ConsumerStatsResponse { get; set; }

        [global::ProtoBuf.ProtoMember(27)]
        public CommandReachedEndOfTopic ReachedEndOfTopic { get; set; }

        [global::ProtoBuf.ProtoMember(28, Name = @"seek")]
        public CommandSeek Seek { get; set; }

        [global::ProtoBuf.ProtoMember(29)]
        public CommandGetLastMessageId GetLastMessageId { get; set; }

        [global::ProtoBuf.ProtoMember(30)]
        public CommandGetLastMessageIdResponse GetLastMessageIdResponse { get; set; }

        [global::ProtoBuf.ProtoMember(31, Name = @"active_consumer_change")]
        public CommandActiveConsumerChange ActiveConsumerChange { get; set; }

        [global::ProtoBuf.ProtoMember(32)]
        public CommandGetTopicsOfNamespace GetTopicsOfNamespace { get; set; }

        [global::ProtoBuf.ProtoMember(33)]
        public CommandGetTopicsOfNamespaceResponse GetTopicsOfNamespaceResponse { get; set; }

        [global::ProtoBuf.ProtoMember(34)]
        public CommandGetSchema GetSchema { get; set; }

        [global::ProtoBuf.ProtoMember(35)]
        public CommandGetSchemaResponse GetSchemaResponse { get; set; }

        [global::ProtoBuf.ProtoMember(36)]
        public CommandAuthChallenge AuthChallenge { get; set; }

        [global::ProtoBuf.ProtoMember(37)]
        public CommandAuthResponse AuthResponse { get; set; }

        [global::ProtoBuf.ProtoContract()]
        public enum Type
        {
            [global::ProtoBuf.ProtoEnum(Name = @"CONNECT")]
            Connect = 2,
            [global::ProtoBuf.ProtoEnum(Name = @"CONNECTED")]
            Connected = 3,
            [global::ProtoBuf.ProtoEnum(Name = @"SUBSCRIBE")]
            Subscribe = 4,
            [global::ProtoBuf.ProtoEnum(Name = @"PRODUCER")]
            Producer = 5,
            [global::ProtoBuf.ProtoEnum(Name = @"SEND")]
            Send = 6,
            [global::ProtoBuf.ProtoEnum(Name = @"SEND_RECEIPT")]
            SendReceipt = 7,
            [global::ProtoBuf.ProtoEnum(Name = @"SEND_ERROR")]
            SendError = 8,
            [global::ProtoBuf.ProtoEnum(Name = @"MESSAGE")]
            Message = 9,
            [global::ProtoBuf.ProtoEnum(Name = @"ACK")]
            Ack = 10,
            [global::ProtoBuf.ProtoEnum(Name = @"FLOW")]
            Flow = 11,
            [global::ProtoBuf.ProtoEnum(Name = @"UNSUBSCRIBE")]
            Unsubscribe = 12,
            [global::ProtoBuf.ProtoEnum(Name = @"SUCCESS")]
            Success = 13,
            [global::ProtoBuf.ProtoEnum(Name = @"ERROR")]
            Error = 14,
            [global::ProtoBuf.ProtoEnum(Name = @"CLOSE_PRODUCER")]
            CloseProducer = 15,
            [global::ProtoBuf.ProtoEnum(Name = @"CLOSE_CONSUMER")]
            CloseConsumer = 16,
            [global::ProtoBuf.ProtoEnum(Name = @"PRODUCER_SUCCESS")]
            ProducerSuccess = 17,
            [global::ProtoBuf.ProtoEnum(Name = @"PING")]
            Ping = 18,
            [global::ProtoBuf.ProtoEnum(Name = @"PONG")]
            Pong = 19,
            [global::ProtoBuf.ProtoEnum(Name = @"REDELIVER_UNACKNOWLEDGED_MESSAGES")]
            RedeliverUnacknowledgedMessages = 20,
            [global::ProtoBuf.ProtoEnum(Name = @"PARTITIONED_METADATA")]
            PartitionedMetadata = 21,
            [global::ProtoBuf.ProtoEnum(Name = @"PARTITIONED_METADATA_RESPONSE")]
            PartitionedMetadataResponse = 22,
            [global::ProtoBuf.ProtoEnum(Name = @"LOOKUP")]
            Lookup = 23,
            [global::ProtoBuf.ProtoEnum(Name = @"LOOKUP_RESPONSE")]
            LookupResponse = 24,
            [global::ProtoBuf.ProtoEnum(Name = @"CONSUMER_STATS")]
            ConsumerStats = 25,
            [global::ProtoBuf.ProtoEnum(Name = @"CONSUMER_STATS_RESPONSE")]
            ConsumerStatsResponse = 26,
            [global::ProtoBuf.ProtoEnum(Name = @"REACHED_END_OF_TOPIC")]
            ReachedEndOfTopic = 27,
            [global::ProtoBuf.ProtoEnum(Name = @"SEEK")]
            Seek = 28,
            [global::ProtoBuf.ProtoEnum(Name = @"GET_LAST_MESSAGE_ID")]
            GetLastMessageId = 29,
            [global::ProtoBuf.ProtoEnum(Name = @"GET_LAST_MESSAGE_ID_RESPONSE")]
            GetLastMessageIdResponse = 30,
            [global::ProtoBuf.ProtoEnum(Name = @"ACTIVE_CONSUMER_CHANGE")]
            ActiveConsumerChange = 31,
            [global::ProtoBuf.ProtoEnum(Name = @"GET_TOPICS_OF_NAMESPACE")]
            GetTopicsOfNamespace = 32,
            [global::ProtoBuf.ProtoEnum(Name = @"GET_TOPICS_OF_NAMESPACE_RESPONSE")]
            GetTopicsOfNamespaceResponse = 33,
            [global::ProtoBuf.ProtoEnum(Name = @"GET_SCHEMA")]
            GetSchema = 34,
            [global::ProtoBuf.ProtoEnum(Name = @"GET_SCHEMA_RESPONSE")]
            GetSchemaResponse = 35,
            [global::ProtoBuf.ProtoEnum(Name = @"AUTH_CHALLENGE")]
            AuthChallenge = 36,
            [global::ProtoBuf.ProtoEnum(Name = @"AUTH_RESPONSE")]
            AuthResponse = 37,
        }
    }

    [global::ProtoBuf.ProtoContract()]
    public enum CompressionType
    {
        [global::ProtoBuf.ProtoEnum(Name = @"NONE")]
        None = 0,
        [global::ProtoBuf.ProtoEnum(Name = @"LZ4")]
        Lz4 = 1,
        [global::ProtoBuf.ProtoEnum(Name = @"ZLIB")]
        Zlib = 2,
        [global::ProtoBuf.ProtoEnum(Name = @"ZSTD")]
        Zstd = 3,
        [global::ProtoBuf.ProtoEnum(Name = @"SNAPPY")]
        Snappy = 4,
    }

    [global::ProtoBuf.ProtoContract()]
    public enum ServerError
    {
        UnknownError = 0,
        MetadataError = 1,
        PersistenceError = 2,
        AuthenticationError = 3,
        AuthorizationError = 4,
        ConsumerBusy = 5,
        ServiceNotReady = 6,
        ProducerBlockedQuotaExceededError = 7,
        ProducerBlockedQuotaExceededException = 8,
        ChecksumError = 9,
        UnsupportedVersionError = 10,
        TopicNotFound = 11,
        SubscriptionNotFound = 12,
        ConsumerNotFound = 13,
        TooManyRequests = 14,
        TopicTerminatedError = 15,
        ProducerBusy = 16,
        InvalidTopicName = 17,
        IncompatibleSchema = 18,
        ConsumerAssignError = 19,
    }

    [global::ProtoBuf.ProtoContract()]
    public enum AuthMethod
    {
        AuthMethodNone = 0,
        AuthMethodYcaV1 = 1,
        AuthMethodAthens = 2,
    }

    [global::ProtoBuf.ProtoContract()]
    public enum ProtocolVersion
    {
        [global::ProtoBuf.ProtoEnum(Name = @"v0")]
        V0 = 0,
        [global::ProtoBuf.ProtoEnum(Name = @"v1")]
        V1 = 1,
        [global::ProtoBuf.ProtoEnum(Name = @"v2")]
        V2 = 2,
        [global::ProtoBuf.ProtoEnum(Name = @"v3")]
        V3 = 3,
        [global::ProtoBuf.ProtoEnum(Name = @"v4")]
        V4 = 4,
        [global::ProtoBuf.ProtoEnum(Name = @"v5")]
        V5 = 5,
        [global::ProtoBuf.ProtoEnum(Name = @"v6")]
        V6 = 6,
        [global::ProtoBuf.ProtoEnum(Name = @"v7")]
        V7 = 7,
        [global::ProtoBuf.ProtoEnum(Name = @"v8")]
        V8 = 8,
        [global::ProtoBuf.ProtoEnum(Name = @"v9")]
        V9 = 9,
        [global::ProtoBuf.ProtoEnum(Name = @"v10")]
        V10 = 10,
        [global::ProtoBuf.ProtoEnum(Name = @"v11")]
        V11 = 11,
        [global::ProtoBuf.ProtoEnum(Name = @"v12")]
        V12 = 12,
        [global::ProtoBuf.ProtoEnum(Name = @"v13")]
        V13 = 13,
        [global::ProtoBuf.ProtoEnum(Name = @"v14")]
        V14 = 14,
    }
}

#pragma warning restore CS1591, CS0612, CS3021, IDE1006
#nullable restore
