diff --git a/src/DotPulsar/Internal/ConsumerChannel.cs b/src/DotPulsar/Internal/ConsumerChannel.cs
index 2dd2325..3a632e9 100644
--- a/src/DotPulsar/Internal/ConsumerChannel.cs
+++ b/src/DotPulsar/Internal/ConsumerChannel.cs
@@ -173,7 +173,7 @@
 
         private async Task RejectPackage(MessagePackage messagePackage, CancellationToken cancellationToken)
         {
-            var ack = new CommandAck { Type = CommandAck.AckType.Individual, validation_error = CommandAck.ValidationError.ChecksumMismatch };
+            var ack = new CommandAck { Type = CommandAck.AckType.Individual, ValidationError = CommandAck.ValidationErrorType.ChecksumMismatch };
 
             ack.MessageIds.Add(messagePackage.MessageId);
 
diff --git a/src/DotPulsar/Internal/ConsumerChannelFactory.cs b/src/DotPulsar/Internal/ConsumerChannelFactory.cs
index f98d9fd..5268264 100644
--- a/src/DotPulsar/Internal/ConsumerChannelFactory.cs
+++ b/src/DotPulsar/Internal/ConsumerChannelFactory.cs
@@ -46,7 +46,7 @@
             _subscribe = new CommandSubscribe
             {
                 ConsumerName = options.ConsumerName,
-                initialPosition = (CommandSubscribe.InitialPosition) options.InitialPosition,
+                InitialPosition = (CommandSubscribe.InitialPositionType) options.InitialPosition,
                 PriorityLevel = options.PriorityLevel,
                 ReadCompacted = options.ReadCompacted,
                 Subscription = options.SubscriptionName,
diff --git a/src/DotPulsar/Internal/PulsarApi/GeneratedCode.cs b/src/DotPulsar/Internal/PulsarApi/GeneratedCode.cs
index 2e33017..e5ca9aa 100644
--- a/src/DotPulsar/Internal/PulsarApi/GeneratedCode.cs
+++ b/src/DotPulsar/Internal/PulsarApi/GeneratedCode.cs
@@ -13,13 +13,16 @@
  */
 
 #nullable disable
+#region Designer generated code
+#pragma warning disable CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
+
 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
+    // <auto-generated>
+    //   This file was generated by a tool; you should avoid making direct changes.
+    //   Consider using 'partial classes' to extend these types
+    //   Input: PulsarApi.proto (281163b)
+    // </auto-generated>
 
     [global::ProtoBuf.ProtoContract()]
     public partial class Schema : global::ProtoBuf.IExtensible
@@ -59,7 +62,13 @@
             Time = 13,
             Timestamp = 14,
             KeyValue = 15,
+            Instant = 16,
+            LocalDate = 17,
+            LocalTime = 18,
+            LocalDateTime = 19,
+            ProtobufNative = 20,
         }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -79,8 +88,8 @@
         [global::System.ComponentModel.DefaultValue(-1)]
         public int Partition
         {
-            get { return __pbn__Partition ?? -1; }
-            set { __pbn__Partition = value; }
+            get => __pbn__Partition ?? -1;
+            set => __pbn__Partition = value;
         }
         public bool ShouldSerializePartition() => __pbn__Partition != null;
         public void ResetPartition() => __pbn__Partition = null;
@@ -90,12 +99,26 @@
         [global::System.ComponentModel.DefaultValue(-1)]
         public int BatchIndex
         {
-            get { return __pbn__BatchIndex ?? -1; }
-            set { __pbn__BatchIndex = value; }
+            get => __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.ProtoMember(5, Name = @"ack_set")]
+        public long[] AckSets { get; set; }
+
+        [global::ProtoBuf.ProtoMember(6, Name = @"batch_size")]
+        public int BatchSize
+        {
+            get => __pbn__BatchSize.GetValueOrDefault();
+            set => __pbn__BatchSize = value;
+        }
+        public bool ShouldSerializeBatchSize() => __pbn__BatchSize != null;
+        public void ResetBatchSize() => __pbn__BatchSize = null;
+        private int? __pbn__BatchSize;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -110,6 +133,7 @@
 
         [global::ProtoBuf.ProtoMember(2, Name = @"value", IsRequired = true)]
         public string Value { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -124,6 +148,22 @@
 
         [global::ProtoBuf.ProtoMember(2, Name = @"value", IsRequired = true)]
         public ulong Value { get; set; }
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class IntRange : 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 = @"start", IsRequired = true)]
+        public int Start { get; set; }
+
+        [global::ProtoBuf.ProtoMember(2, Name = @"end", IsRequired = true)]
+        public int End { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -141,6 +181,7 @@
 
         [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()]
@@ -166,8 +207,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ReplicatedFrom
         {
-            get { return __pbn__ReplicatedFrom ?? ""; }
-            set { __pbn__ReplicatedFrom = value; }
+            get => __pbn__ReplicatedFrom ?? "";
+            set => __pbn__ReplicatedFrom = value;
         }
         public bool ShouldSerializeReplicatedFrom() => __pbn__ReplicatedFrom != null;
         public void ResetReplicatedFrom() => __pbn__ReplicatedFrom = null;
@@ -177,8 +218,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string PartitionKey
         {
-            get { return __pbn__PartitionKey ?? ""; }
-            set { __pbn__PartitionKey = value; }
+            get => __pbn__PartitionKey ?? "";
+            set => __pbn__PartitionKey = value;
         }
         public bool ShouldSerializePartitionKey() => __pbn__PartitionKey != null;
         public void ResetPartitionKey() => __pbn__PartitionKey = null;
@@ -191,8 +232,8 @@
         [global::System.ComponentModel.DefaultValue(CompressionType.None)]
         public CompressionType Compression
         {
-            get { return __pbn__Compression ?? CompressionType.None; }
-            set { __pbn__Compression = value; }
+            get => __pbn__Compression ?? CompressionType.None;
+            set => __pbn__Compression = value;
         }
         public bool ShouldSerializeCompression() => __pbn__Compression != null;
         public void ResetCompression() => __pbn__Compression = null;
@@ -202,8 +243,8 @@
         [global::System.ComponentModel.DefaultValue(0)]
         public uint UncompressedSize
         {
-            get { return __pbn__UncompressedSize ?? 0; }
-            set { __pbn__UncompressedSize = value; }
+            get => __pbn__UncompressedSize ?? 0;
+            set => __pbn__UncompressedSize = value;
         }
         public bool ShouldSerializeUncompressedSize() => __pbn__UncompressedSize != null;
         public void ResetUncompressedSize() => __pbn__UncompressedSize = null;
@@ -213,19 +254,19 @@
         [global::System.ComponentModel.DefaultValue(1)]
         public int NumMessagesInBatch
         {
-            get { return __pbn__NumMessagesInBatch ?? 1; }
-            set { __pbn__NumMessagesInBatch = value; }
+            get => __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)]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
         public ulong EventTime
         {
-            get { return __pbn__EventTime ?? 0; }
-            set { __pbn__EventTime = value; }
+            get => __pbn__EventTime ?? 0;
+            set => __pbn__EventTime = value;
         }
         public bool ShouldSerializeEventTime() => __pbn__EventTime != null;
         public void ResetEventTime() => __pbn__EventTime = null;
@@ -238,8 +279,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string EncryptionAlgo
         {
-            get { return __pbn__EncryptionAlgo ?? ""; }
-            set { __pbn__EncryptionAlgo = value; }
+            get => __pbn__EncryptionAlgo ?? "";
+            set => __pbn__EncryptionAlgo = value;
         }
         public bool ShouldSerializeEncryptionAlgo() => __pbn__EncryptionAlgo != null;
         public void ResetEncryptionAlgo() => __pbn__EncryptionAlgo = null;
@@ -248,8 +289,8 @@
         [global::ProtoBuf.ProtoMember(15, Name = @"encryption_param")]
         public byte[] EncryptionParam
         {
-            get { return __pbn__EncryptionParam; }
-            set { __pbn__EncryptionParam = value; }
+            get => __pbn__EncryptionParam;
+            set => __pbn__EncryptionParam = value;
         }
         public bool ShouldSerializeEncryptionParam() => __pbn__EncryptionParam != null;
         public void ResetEncryptionParam() => __pbn__EncryptionParam = null;
@@ -258,8 +299,8 @@
         [global::ProtoBuf.ProtoMember(16, Name = @"schema_version")]
         public byte[] SchemaVersion
         {
-            get { return __pbn__SchemaVersion; }
-            set { __pbn__SchemaVersion = value; }
+            get => __pbn__SchemaVersion;
+            set => __pbn__SchemaVersion = value;
         }
         public bool ShouldSerializeSchemaVersion() => __pbn__SchemaVersion != null;
         public void ResetSchemaVersion() => __pbn__SchemaVersion = null;
@@ -269,8 +310,8 @@
         [global::System.ComponentModel.DefaultValue(false)]
         public bool PartitionKeyB64Encoded
         {
-            get { return __pbn__PartitionKeyB64Encoded ?? false; }
-            set { __pbn__PartitionKeyB64Encoded = value; }
+            get => __pbn__PartitionKeyB64Encoded ?? false;
+            set => __pbn__PartitionKeyB64Encoded = value;
         }
         public bool ShouldSerializePartitionKeyB64Encoded() => __pbn__PartitionKeyB64Encoded != null;
         public void ResetPartitionKeyB64Encoded() => __pbn__PartitionKeyB64Encoded = null;
@@ -279,8 +320,8 @@
         [global::ProtoBuf.ProtoMember(18, Name = @"ordering_key")]
         public byte[] OrderingKey
         {
-            get { return __pbn__OrderingKey; }
-            set { __pbn__OrderingKey = value; }
+            get => __pbn__OrderingKey;
+            set => __pbn__OrderingKey = value;
         }
         public bool ShouldSerializeOrderingKey() => __pbn__OrderingKey != null;
         public void ResetOrderingKey() => __pbn__OrderingKey = null;
@@ -289,8 +330,8 @@
         [global::ProtoBuf.ProtoMember(19, Name = @"deliver_at_time")]
         public long DeliverAtTime
         {
-            get { return __pbn__DeliverAtTime.GetValueOrDefault(); }
-            set { __pbn__DeliverAtTime = value; }
+            get => __pbn__DeliverAtTime.GetValueOrDefault();
+            set => __pbn__DeliverAtTime = value;
         }
         public bool ShouldSerializeDeliverAtTime() => __pbn__DeliverAtTime != null;
         public void ResetDeliverAtTime() => __pbn__DeliverAtTime = null;
@@ -299,12 +340,107 @@
         [global::ProtoBuf.ProtoMember(20, Name = @"marker_type")]
         public int MarkerType
         {
-            get { return __pbn__MarkerType.GetValueOrDefault(); }
-            set { __pbn__MarkerType = value; }
+            get => __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.ProtoMember(22, Name = @"txnid_least_bits")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits.GetValueOrDefault();
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(23, Name = @"txnid_most_bits")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits.GetValueOrDefault();
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(24, Name = @"highest_sequence_id")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong HighestSequenceId
+        {
+            get => __pbn__HighestSequenceId ?? 0;
+            set => __pbn__HighestSequenceId = value;
+        }
+        public bool ShouldSerializeHighestSequenceId() => __pbn__HighestSequenceId != null;
+        public void ResetHighestSequenceId() => __pbn__HighestSequenceId = null;
+        private ulong? __pbn__HighestSequenceId;
+
+        [global::ProtoBuf.ProtoMember(25, Name = @"null_value")]
+        [global::System.ComponentModel.DefaultValue(false)]
+        public bool NullValue
+        {
+            get => __pbn__NullValue ?? false;
+            set => __pbn__NullValue = value;
+        }
+        public bool ShouldSerializeNullValue() => __pbn__NullValue != null;
+        public void ResetNullValue() => __pbn__NullValue = null;
+        private bool? __pbn__NullValue;
+
+        [global::ProtoBuf.ProtoMember(26, Name = @"uuid")]
+        [global::System.ComponentModel.DefaultValue("")]
+        public string Uuid
+        {
+            get => __pbn__Uuid ?? "";
+            set => __pbn__Uuid = value;
+        }
+        public bool ShouldSerializeUuid() => __pbn__Uuid != null;
+        public void ResetUuid() => __pbn__Uuid = null;
+        private string __pbn__Uuid;
+
+        [global::ProtoBuf.ProtoMember(27, Name = @"num_chunks_from_msg")]
+        public int NumChunksFromMsg
+        {
+            get => __pbn__NumChunksFromMsg.GetValueOrDefault();
+            set => __pbn__NumChunksFromMsg = value;
+        }
+        public bool ShouldSerializeNumChunksFromMsg() => __pbn__NumChunksFromMsg != null;
+        public void ResetNumChunksFromMsg() => __pbn__NumChunksFromMsg = null;
+        private int? __pbn__NumChunksFromMsg;
+
+        [global::ProtoBuf.ProtoMember(28, Name = @"total_chunk_msg_size")]
+        public int TotalChunkMsgSize
+        {
+            get => __pbn__TotalChunkMsgSize.GetValueOrDefault();
+            set => __pbn__TotalChunkMsgSize = value;
+        }
+        public bool ShouldSerializeTotalChunkMsgSize() => __pbn__TotalChunkMsgSize != null;
+        public void ResetTotalChunkMsgSize() => __pbn__TotalChunkMsgSize = null;
+        private int? __pbn__TotalChunkMsgSize;
+
+        [global::ProtoBuf.ProtoMember(29, Name = @"chunk_id")]
+        public int ChunkId
+        {
+            get => __pbn__ChunkId.GetValueOrDefault();
+            set => __pbn__ChunkId = value;
+        }
+        public bool ShouldSerializeChunkId() => __pbn__ChunkId != null;
+        public void ResetChunkId() => __pbn__ChunkId = null;
+        private int? __pbn__ChunkId;
+
+        [global::ProtoBuf.ProtoMember(30, Name = @"null_partition_key")]
+        [global::System.ComponentModel.DefaultValue(false)]
+        public bool NullPartitionKey
+        {
+            get => __pbn__NullPartitionKey ?? false;
+            set => __pbn__NullPartitionKey = value;
+        }
+        public bool ShouldSerializeNullPartitionKey() => __pbn__NullPartitionKey != null;
+        public void ResetNullPartitionKey() => __pbn__NullPartitionKey = null;
+        private bool? __pbn__NullPartitionKey;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -321,8 +457,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string PartitionKey
         {
-            get { return __pbn__PartitionKey ?? ""; }
-            set { __pbn__PartitionKey = value; }
+            get => __pbn__PartitionKey ?? "";
+            set => __pbn__PartitionKey = value;
         }
         public bool ShouldSerializePartitionKey() => __pbn__PartitionKey != null;
         public void ResetPartitionKey() => __pbn__PartitionKey = null;
@@ -335,19 +471,19 @@
         [global::System.ComponentModel.DefaultValue(false)]
         public bool CompactedOut
         {
-            get { return __pbn__CompactedOut ?? false; }
-            set { __pbn__CompactedOut = value; }
+            get => __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)]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
         public ulong EventTime
         {
-            get { return __pbn__EventTime ?? 0; }
-            set { __pbn__EventTime = value; }
+            get => __pbn__EventTime ?? 0;
+            set => __pbn__EventTime = value;
         }
         public bool ShouldSerializeEventTime() => __pbn__EventTime != null;
         public void ResetEventTime() => __pbn__EventTime = null;
@@ -357,8 +493,8 @@
         [global::System.ComponentModel.DefaultValue(false)]
         public bool PartitionKeyB64Encoded
         {
-            get { return __pbn__PartitionKeyB64Encoded ?? false; }
-            set { __pbn__PartitionKeyB64Encoded = value; }
+            get => __pbn__PartitionKeyB64Encoded ?? false;
+            set => __pbn__PartitionKeyB64Encoded = value;
         }
         public bool ShouldSerializePartitionKeyB64Encoded() => __pbn__PartitionKeyB64Encoded != null;
         public void ResetPartitionKeyB64Encoded() => __pbn__PartitionKeyB64Encoded = null;
@@ -367,8 +503,8 @@
         [global::ProtoBuf.ProtoMember(7, Name = @"ordering_key")]
         public byte[] OrderingKey
         {
-            get { return __pbn__OrderingKey; }
-            set { __pbn__OrderingKey = value; }
+            get => __pbn__OrderingKey;
+            set => __pbn__OrderingKey = value;
         }
         public bool ShouldSerializeOrderingKey() => __pbn__OrderingKey != null;
         public void ResetOrderingKey() => __pbn__OrderingKey = null;
@@ -377,12 +513,35 @@
         [global::ProtoBuf.ProtoMember(8, Name = @"sequence_id")]
         public ulong SequenceId
         {
-            get { return __pbn__SequenceId.GetValueOrDefault(); }
-            set { __pbn__SequenceId = value; }
+            get => __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.ProtoMember(9, Name = @"null_value")]
+        [global::System.ComponentModel.DefaultValue(false)]
+        public bool NullValue
+        {
+            get => __pbn__NullValue ?? false;
+            set => __pbn__NullValue = value;
+        }
+        public bool ShouldSerializeNullValue() => __pbn__NullValue != null;
+        public void ResetNullValue() => __pbn__NullValue = null;
+        private bool? __pbn__NullValue;
+
+        [global::ProtoBuf.ProtoMember(10, Name = @"null_partition_key")]
+        [global::System.ComponentModel.DefaultValue(false)]
+        public bool NullPartitionKey
+        {
+            get => __pbn__NullPartitionKey ?? false;
+            set => __pbn__NullPartitionKey = value;
+        }
+        public bool ShouldSerializeNullPartitionKey() => __pbn__NullPartitionKey != null;
+        public void ResetNullPartitionKey() => __pbn__NullPartitionKey = null;
+        private bool? __pbn__NullPartitionKey;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -399,8 +558,8 @@
         [global::System.ComponentModel.DefaultValue(AuthMethod.AuthMethodNone)]
         public AuthMethod AuthMethod
         {
-            get { return __pbn__AuthMethod ?? AuthMethod.AuthMethodNone; }
-            set { __pbn__AuthMethod = value; }
+            get => __pbn__AuthMethod ?? AuthMethod.AuthMethodNone;
+            set => __pbn__AuthMethod = value;
         }
         public bool ShouldSerializeAuthMethod() => __pbn__AuthMethod != null;
         public void ResetAuthMethod() => __pbn__AuthMethod = null;
@@ -410,8 +569,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string AuthMethodName
         {
-            get { return __pbn__AuthMethodName ?? ""; }
-            set { __pbn__AuthMethodName = value; }
+            get => __pbn__AuthMethodName ?? "";
+            set => __pbn__AuthMethodName = value;
         }
         public bool ShouldSerializeAuthMethodName() => __pbn__AuthMethodName != null;
         public void ResetAuthMethodName() => __pbn__AuthMethodName = null;
@@ -420,8 +579,8 @@
         [global::ProtoBuf.ProtoMember(3, Name = @"auth_data")]
         public byte[] AuthData
         {
-            get { return __pbn__AuthData; }
-            set { __pbn__AuthData = value; }
+            get => __pbn__AuthData;
+            set => __pbn__AuthData = value;
         }
         public bool ShouldSerializeAuthData() => __pbn__AuthData != null;
         public void ResetAuthData() => __pbn__AuthData = null;
@@ -431,8 +590,8 @@
         [global::System.ComponentModel.DefaultValue(0)]
         public int ProtocolVersion
         {
-            get { return __pbn__ProtocolVersion ?? 0; }
-            set { __pbn__ProtocolVersion = value; }
+            get => __pbn__ProtocolVersion ?? 0;
+            set => __pbn__ProtocolVersion = value;
         }
         public bool ShouldSerializeProtocolVersion() => __pbn__ProtocolVersion != null;
         public void ResetProtocolVersion() => __pbn__ProtocolVersion = null;
@@ -442,8 +601,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ProxyToBrokerUrl
         {
-            get { return __pbn__ProxyToBrokerUrl ?? ""; }
-            set { __pbn__ProxyToBrokerUrl = value; }
+            get => __pbn__ProxyToBrokerUrl ?? "";
+            set => __pbn__ProxyToBrokerUrl = value;
         }
         public bool ShouldSerializeProxyToBrokerUrl() => __pbn__ProxyToBrokerUrl != null;
         public void ResetProxyToBrokerUrl() => __pbn__ProxyToBrokerUrl = null;
@@ -453,8 +612,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalPrincipal
         {
-            get { return __pbn__OriginalPrincipal ?? ""; }
-            set { __pbn__OriginalPrincipal = value; }
+            get => __pbn__OriginalPrincipal ?? "";
+            set => __pbn__OriginalPrincipal = value;
         }
         public bool ShouldSerializeOriginalPrincipal() => __pbn__OriginalPrincipal != null;
         public void ResetOriginalPrincipal() => __pbn__OriginalPrincipal = null;
@@ -464,8 +623,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalAuthData
         {
-            get { return __pbn__OriginalAuthData ?? ""; }
-            set { __pbn__OriginalAuthData = value; }
+            get => __pbn__OriginalAuthData ?? "";
+            set => __pbn__OriginalAuthData = value;
         }
         public bool ShouldSerializeOriginalAuthData() => __pbn__OriginalAuthData != null;
         public void ResetOriginalAuthData() => __pbn__OriginalAuthData = null;
@@ -475,12 +634,36 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalAuthMethod
         {
-            get { return __pbn__OriginalAuthMethod ?? ""; }
-            set { __pbn__OriginalAuthMethod = value; }
+            get => __pbn__OriginalAuthMethod ?? "";
+            set => __pbn__OriginalAuthMethod = value;
         }
         public bool ShouldSerializeOriginalAuthMethod() => __pbn__OriginalAuthMethod != null;
         public void ResetOriginalAuthMethod() => __pbn__OriginalAuthMethod = null;
         private string __pbn__OriginalAuthMethod;
+
+        [global::ProtoBuf.ProtoMember(10, Name = @"feature_flags")]
+        public FeatureFlags FeatureFlags { get; set; }
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class FeatureFlags : 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 = @"supports_auth_refresh")]
+        [global::System.ComponentModel.DefaultValue(false)]
+        public bool SupportsAuthRefresh
+        {
+            get => __pbn__SupportsAuthRefresh ?? false;
+            set => __pbn__SupportsAuthRefresh = value;
+        }
+        public bool ShouldSerializeSupportsAuthRefresh() => __pbn__SupportsAuthRefresh != null;
+        public void ResetSupportsAuthRefresh() => __pbn__SupportsAuthRefresh = null;
+        private bool? __pbn__SupportsAuthRefresh;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -497,8 +680,8 @@
         [global::System.ComponentModel.DefaultValue(0)]
         public int ProtocolVersion
         {
-            get { return __pbn__ProtocolVersion ?? 0; }
-            set { __pbn__ProtocolVersion = value; }
+            get => __pbn__ProtocolVersion ?? 0;
+            set => __pbn__ProtocolVersion = value;
         }
         public bool ShouldSerializeProtocolVersion() => __pbn__ProtocolVersion != null;
         public void ResetProtocolVersion() => __pbn__ProtocolVersion = null;
@@ -507,12 +690,13 @@
         [global::ProtoBuf.ProtoMember(3, Name = @"max_message_size")]
         public int MaxMessageSize
         {
-            get { return __pbn__MaxMessageSize.GetValueOrDefault(); }
-            set { __pbn__MaxMessageSize = value; }
+            get => __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()]
@@ -526,8 +710,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ClientVersion
         {
-            get { return __pbn__ClientVersion ?? ""; }
-            set { __pbn__ClientVersion = value; }
+            get => __pbn__ClientVersion ?? "";
+            set => __pbn__ClientVersion = value;
         }
         public bool ShouldSerializeClientVersion() => __pbn__ClientVersion != null;
         public void ResetClientVersion() => __pbn__ClientVersion = null;
@@ -540,12 +724,13 @@
         [global::System.ComponentModel.DefaultValue(0)]
         public int ProtocolVersion
         {
-            get { return __pbn__ProtocolVersion ?? 0; }
-            set { __pbn__ProtocolVersion = value; }
+            get => __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()]
@@ -559,8 +744,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ServerVersion
         {
-            get { return __pbn__ServerVersion ?? ""; }
-            set { __pbn__ServerVersion = value; }
+            get => __pbn__ServerVersion ?? "";
+            set => __pbn__ServerVersion = value;
         }
         public bool ShouldSerializeServerVersion() => __pbn__ServerVersion != null;
         public void ResetServerVersion() => __pbn__ServerVersion = null;
@@ -573,12 +758,13 @@
         [global::System.ComponentModel.DefaultValue(0)]
         public int ProtocolVersion
         {
-            get { return __pbn__ProtocolVersion ?? 0; }
-            set { __pbn__ProtocolVersion = value; }
+            get => __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()]
@@ -592,22 +778,49 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string AuthMethodName
         {
-            get { return __pbn__AuthMethodName ?? ""; }
-            set { __pbn__AuthMethodName = value; }
+            get => __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
+        public byte[] Data
         {
-            get { return __pbn__auth_data; }
-            set { __pbn__auth_data = value; }
+            get => __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 KeySharedMeta : 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 KeySharedMode KeySharedMode { get; set; }
+
+        [global::ProtoBuf.ProtoMember(3)]
+        public global::System.Collections.Generic.List<IntRange> hashRanges { get; } = new global::System.Collections.Generic.List<IntRange>();
+
+        [global::ProtoBuf.ProtoMember(4)]
+        [global::System.ComponentModel.DefaultValue(false)]
+        public bool allowOutOfOrderDelivery
+        {
+            get => __pbn__allowOutOfOrderDelivery ?? false;
+            set => __pbn__allowOutOfOrderDelivery = value;
+        }
+        public bool ShouldSerializeallowOutOfOrderDelivery() => __pbn__allowOutOfOrderDelivery != null;
+        public void ResetallowOutOfOrderDelivery() => __pbn__allowOutOfOrderDelivery = null;
+        private bool? __pbn__allowOutOfOrderDelivery;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -636,8 +849,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ConsumerName
         {
-            get { return __pbn__ConsumerName ?? ""; }
-            set { __pbn__ConsumerName = value; }
+            get => __pbn__ConsumerName ?? "";
+            set => __pbn__ConsumerName = value;
         }
         public bool ShouldSerializeConsumerName() => __pbn__ConsumerName != null;
         public void ResetConsumerName() => __pbn__ConsumerName = null;
@@ -646,8 +859,8 @@
         [global::ProtoBuf.ProtoMember(7, Name = @"priority_level")]
         public int PriorityLevel
         {
-            get { return __pbn__PriorityLevel.GetValueOrDefault(); }
-            set { __pbn__PriorityLevel = value; }
+            get => __pbn__PriorityLevel.GetValueOrDefault();
+            set => __pbn__PriorityLevel = value;
         }
         public bool ShouldSerializePriorityLevel() => __pbn__PriorityLevel != null;
         public void ResetPriorityLevel() => __pbn__PriorityLevel = null;
@@ -657,8 +870,8 @@
         [global::System.ComponentModel.DefaultValue(true)]
         public bool Durable
         {
-            get { return __pbn__Durable ?? true; }
-            set { __pbn__Durable = value; }
+            get => __pbn__Durable ?? true;
+            set => __pbn__Durable = value;
         }
         public bool ShouldSerializeDurable() => __pbn__Durable != null;
         public void ResetDurable() => __pbn__Durable = null;
@@ -673,8 +886,8 @@
         [global::ProtoBuf.ProtoMember(11, Name = @"read_compacted")]
         public bool ReadCompacted
         {
-            get { return __pbn__ReadCompacted.GetValueOrDefault(); }
-            set { __pbn__ReadCompacted = value; }
+            get => __pbn__ReadCompacted.GetValueOrDefault();
+            set => __pbn__ReadCompacted = value;
         }
         public bool ShouldSerializeReadCompacted() => __pbn__ReadCompacted != null;
         public void ResetReadCompacted() => __pbn__ReadCompacted = null;
@@ -684,26 +897,51 @@
         public Schema Schema { get; set; }
 
         [global::ProtoBuf.ProtoMember(13)]
-        [global::System.ComponentModel.DefaultValue(InitialPosition.Latest)]
-        public InitialPosition initialPosition
+        [global::System.ComponentModel.DefaultValue(InitialPositionType.Latest)]
+        public InitialPositionType InitialPosition
         {
-            get { return __pbn__initialPosition ?? InitialPosition.Latest; }
-            set { __pbn__initialPosition = value; }
+            get => __pbn__initialPosition ?? InitialPositionType.Latest;
+            set => __pbn__initialPosition = value;
         }
         public bool ShouldSerializeinitialPosition() => __pbn__initialPosition != null;
         public void ResetinitialPosition() => __pbn__initialPosition = null;
-        private InitialPosition? __pbn__initialPosition;
+        private InitialPositionType? __pbn__initialPosition;
 
         [global::ProtoBuf.ProtoMember(14, Name = @"replicate_subscription_state")]
         public bool ReplicateSubscriptionState
         {
-            get { return __pbn__ReplicateSubscriptionState.GetValueOrDefault(); }
-            set { __pbn__ReplicateSubscriptionState = value; }
+            get => __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.ProtoMember(15, Name = @"force_topic_creation")]
+        [global::System.ComponentModel.DefaultValue(true)]
+        public bool ForceTopicCreation
+        {
+            get => __pbn__ForceTopicCreation ?? true;
+            set => __pbn__ForceTopicCreation = value;
+        }
+        public bool ShouldSerializeForceTopicCreation() => __pbn__ForceTopicCreation != null;
+        public void ResetForceTopicCreation() => __pbn__ForceTopicCreation = null;
+        private bool? __pbn__ForceTopicCreation;
+
+        [global::ProtoBuf.ProtoMember(16, Name = @"start_message_rollback_duration_sec")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong StartMessageRollbackDurationSec
+        {
+            get => __pbn__StartMessageRollbackDurationSec ?? 0;
+            set => __pbn__StartMessageRollbackDurationSec = value;
+        }
+        public bool ShouldSerializeStartMessageRollbackDurationSec() => __pbn__StartMessageRollbackDurationSec != null;
+        public void ResetStartMessageRollbackDurationSec() => __pbn__StartMessageRollbackDurationSec = null;
+        private ulong? __pbn__StartMessageRollbackDurationSec;
+
+        [global::ProtoBuf.ProtoMember(17)]
+        public KeySharedMeta KeySharedMeta { get; set; }
+
         [global::ProtoBuf.ProtoContract()]
         public enum SubType
         {
@@ -715,11 +953,12 @@
         }
 
         [global::ProtoBuf.ProtoContract()]
-        public enum InitialPosition
+        public enum InitialPositionType
         {
             Latest = 0,
             Earliest = 1,
         }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -739,8 +978,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalPrincipal
         {
-            get { return __pbn__OriginalPrincipal ?? ""; }
-            set { __pbn__OriginalPrincipal = value; }
+            get => __pbn__OriginalPrincipal ?? "";
+            set => __pbn__OriginalPrincipal = value;
         }
         public bool ShouldSerializeOriginalPrincipal() => __pbn__OriginalPrincipal != null;
         public void ResetOriginalPrincipal() => __pbn__OriginalPrincipal = null;
@@ -750,8 +989,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalAuthData
         {
-            get { return __pbn__OriginalAuthData ?? ""; }
-            set { __pbn__OriginalAuthData = value; }
+            get => __pbn__OriginalAuthData ?? "";
+            set => __pbn__OriginalAuthData = value;
         }
         public bool ShouldSerializeOriginalAuthData() => __pbn__OriginalAuthData != null;
         public void ResetOriginalAuthData() => __pbn__OriginalAuthData = null;
@@ -761,12 +1000,13 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalAuthMethod
         {
-            get { return __pbn__OriginalAuthMethod ?? ""; }
-            set { __pbn__OriginalAuthMethod = value; }
+            get => __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()]
@@ -779,8 +1019,8 @@
         [global::ProtoBuf.ProtoMember(1, Name = @"partitions")]
         public uint Partitions
         {
-            get { return __pbn__Partitions.GetValueOrDefault(); }
-            set { __pbn__Partitions = value; }
+            get => __pbn__Partitions.GetValueOrDefault();
+            set => __pbn__Partitions = value;
         }
         public bool ShouldSerializePartitions() => __pbn__Partitions != null;
         public void ResetPartitions() => __pbn__Partitions = null;
@@ -793,8 +1033,8 @@
         [global::System.ComponentModel.DefaultValue(LookupType.Success)]
         public LookupType Response
         {
-            get { return __pbn__Response ?? LookupType.Success; }
-            set { __pbn__Response = value; }
+            get => __pbn__Response ?? LookupType.Success;
+            set => __pbn__Response = value;
         }
         public bool ShouldSerializeResponse() => __pbn__Response != null;
         public void ResetResponse() => __pbn__Response = null;
@@ -804,8 +1044,8 @@
         [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
         public ServerError Error
         {
-            get { return __pbn__Error ?? ServerError.UnknownError; }
-            set { __pbn__Error = value; }
+            get => __pbn__Error ?? ServerError.UnknownError;
+            set => __pbn__Error = value;
         }
         public bool ShouldSerializeError() => __pbn__Error != null;
         public void ResetError() => __pbn__Error = null;
@@ -815,8 +1055,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string Message
         {
-            get { return __pbn__Message ?? ""; }
-            set { __pbn__Message = value; }
+            get => __pbn__Message ?? "";
+            set => __pbn__Message = value;
         }
         public bool ShouldSerializeMessage() => __pbn__Message != null;
         public void ResetMessage() => __pbn__Message = null;
@@ -828,6 +1068,7 @@
             Success = 0,
             Failed = 1,
         }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -847,8 +1088,8 @@
         [global::System.ComponentModel.DefaultValue(false)]
         public bool Authoritative
         {
-            get { return __pbn__Authoritative ?? false; }
-            set { __pbn__Authoritative = value; }
+            get => __pbn__Authoritative ?? false;
+            set => __pbn__Authoritative = value;
         }
         public bool ShouldSerializeAuthoritative() => __pbn__Authoritative != null;
         public void ResetAuthoritative() => __pbn__Authoritative = null;
@@ -858,8 +1099,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalPrincipal
         {
-            get { return __pbn__OriginalPrincipal ?? ""; }
-            set { __pbn__OriginalPrincipal = value; }
+            get => __pbn__OriginalPrincipal ?? "";
+            set => __pbn__OriginalPrincipal = value;
         }
         public bool ShouldSerializeOriginalPrincipal() => __pbn__OriginalPrincipal != null;
         public void ResetOriginalPrincipal() => __pbn__OriginalPrincipal = null;
@@ -869,8 +1110,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalAuthData
         {
-            get { return __pbn__OriginalAuthData ?? ""; }
-            set { __pbn__OriginalAuthData = value; }
+            get => __pbn__OriginalAuthData ?? "";
+            set => __pbn__OriginalAuthData = value;
         }
         public bool ShouldSerializeOriginalAuthData() => __pbn__OriginalAuthData != null;
         public void ResetOriginalAuthData() => __pbn__OriginalAuthData = null;
@@ -880,12 +1121,24 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string OriginalAuthMethod
         {
-            get { return __pbn__OriginalAuthMethod ?? ""; }
-            set { __pbn__OriginalAuthMethod = value; }
+            get => __pbn__OriginalAuthMethod ?? "";
+            set => __pbn__OriginalAuthMethod = value;
         }
         public bool ShouldSerializeOriginalAuthMethod() => __pbn__OriginalAuthMethod != null;
         public void ResetOriginalAuthMethod() => __pbn__OriginalAuthMethod = null;
         private string __pbn__OriginalAuthMethod;
+
+        [global::ProtoBuf.ProtoMember(7, Name = @"advertised_listener_name")]
+        [global::System.ComponentModel.DefaultValue("")]
+        public string AdvertisedListenerName
+        {
+            get => __pbn__AdvertisedListenerName ?? "";
+            set => __pbn__AdvertisedListenerName = value;
+        }
+        public bool ShouldSerializeAdvertisedListenerName() => __pbn__AdvertisedListenerName != null;
+        public void ResetAdvertisedListenerName() => __pbn__AdvertisedListenerName = null;
+        private string __pbn__AdvertisedListenerName;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -899,8 +1152,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string BrokerServiceUrl
         {
-            get { return __pbn__brokerServiceUrl ?? ""; }
-            set { __pbn__brokerServiceUrl = value; }
+            get => __pbn__brokerServiceUrl ?? "";
+            set => __pbn__brokerServiceUrl = value;
         }
         public bool ShouldSerializebrokerServiceUrl() => __pbn__brokerServiceUrl != null;
         public void ResetbrokerServiceUrl() => __pbn__brokerServiceUrl = null;
@@ -910,8 +1163,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string BrokerServiceUrlTls
         {
-            get { return __pbn__brokerServiceUrlTls ?? ""; }
-            set { __pbn__brokerServiceUrlTls = value; }
+            get => __pbn__brokerServiceUrlTls ?? "";
+            set => __pbn__brokerServiceUrlTls = value;
         }
         public bool ShouldSerializebrokerServiceUrlTls() => __pbn__brokerServiceUrlTls != null;
         public void ResetbrokerServiceUrlTls() => __pbn__brokerServiceUrlTls = null;
@@ -921,8 +1174,8 @@
         [global::System.ComponentModel.DefaultValue(LookupType.Redirect)]
         public LookupType Response
         {
-            get { return __pbn__Response ?? LookupType.Redirect; }
-            set { __pbn__Response = value; }
+            get => __pbn__Response ?? LookupType.Redirect;
+            set => __pbn__Response = value;
         }
         public bool ShouldSerializeResponse() => __pbn__Response != null;
         public void ResetResponse() => __pbn__Response = null;
@@ -935,8 +1188,8 @@
         [global::System.ComponentModel.DefaultValue(false)]
         public bool Authoritative
         {
-            get { return __pbn__Authoritative ?? false; }
-            set { __pbn__Authoritative = value; }
+            get => __pbn__Authoritative ?? false;
+            set => __pbn__Authoritative = value;
         }
         public bool ShouldSerializeAuthoritative() => __pbn__Authoritative != null;
         public void ResetAuthoritative() => __pbn__Authoritative = null;
@@ -946,8 +1199,8 @@
         [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
         public ServerError Error
         {
-            get { return __pbn__Error ?? ServerError.UnknownError; }
-            set { __pbn__Error = value; }
+            get => __pbn__Error ?? ServerError.UnknownError;
+            set => __pbn__Error = value;
         }
         public bool ShouldSerializeError() => __pbn__Error != null;
         public void ResetError() => __pbn__Error = null;
@@ -957,8 +1210,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string Message
         {
-            get { return __pbn__Message ?? ""; }
-            set { __pbn__Message = value; }
+            get => __pbn__Message ?? "";
+            set => __pbn__Message = value;
         }
         public bool ShouldSerializeMessage() => __pbn__Message != null;
         public void ResetMessage() => __pbn__Message = null;
@@ -968,8 +1221,8 @@
         [global::System.ComponentModel.DefaultValue(false)]
         public bool ProxyThroughServiceUrl
         {
-            get { return __pbn__ProxyThroughServiceUrl ?? false; }
-            set { __pbn__ProxyThroughServiceUrl = value; }
+            get => __pbn__ProxyThroughServiceUrl ?? false;
+            set => __pbn__ProxyThroughServiceUrl = value;
         }
         public bool ShouldSerializeProxyThroughServiceUrl() => __pbn__ProxyThroughServiceUrl != null;
         public void ResetProxyThroughServiceUrl() => __pbn__ProxyThroughServiceUrl = null;
@@ -982,6 +1235,7 @@
             Connect = 1,
             Failed = 2,
         }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1004,8 +1258,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ProducerName
         {
-            get { return __pbn__ProducerName ?? ""; }
-            set { __pbn__ProducerName = value; }
+            get => __pbn__ProducerName ?? "";
+            set => __pbn__ProducerName = value;
         }
         public bool ShouldSerializeProducerName() => __pbn__ProducerName != null;
         public void ResetProducerName() => __pbn__ProducerName = null;
@@ -1015,8 +1269,8 @@
         [global::System.ComponentModel.DefaultValue(false)]
         public bool Encrypted
         {
-            get { return __pbn__Encrypted ?? false; }
-            set { __pbn__Encrypted = value; }
+            get => __pbn__Encrypted ?? false;
+            set => __pbn__Encrypted = value;
         }
         public bool ShouldSerializeEncrypted() => __pbn__Encrypted != null;
         public void ResetEncrypted() => __pbn__Encrypted = null;
@@ -1027,6 +1281,29 @@
 
         [global::ProtoBuf.ProtoMember(7, Name = @"schema")]
         public Schema Schema { get; set; }
+
+        [global::ProtoBuf.ProtoMember(8, Name = @"epoch")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong Epoch
+        {
+            get => __pbn__Epoch ?? 0;
+            set => __pbn__Epoch = value;
+        }
+        public bool ShouldSerializeEpoch() => __pbn__Epoch != null;
+        public void ResetEpoch() => __pbn__Epoch = null;
+        private ulong? __pbn__Epoch;
+
+        [global::ProtoBuf.ProtoMember(9, Name = @"user_provided_producer_name")]
+        [global::System.ComponentModel.DefaultValue(true)]
+        public bool UserProvidedProducerName
+        {
+            get => __pbn__UserProvidedProducerName ?? true;
+            set => __pbn__UserProvidedProducerName = value;
+        }
+        public bool ShouldSerializeUserProvidedProducerName() => __pbn__UserProvidedProducerName != null;
+        public void ResetUserProvidedProducerName() => __pbn__UserProvidedProducerName = null;
+        private bool? __pbn__UserProvidedProducerName;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1046,12 +1323,57 @@
         [global::System.ComponentModel.DefaultValue(1)]
         public int NumMessages
         {
-            get { return __pbn__NumMessages ?? 1; }
-            set { __pbn__NumMessages = value; }
+            get => __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.ProtoMember(4, Name = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(5, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(6, Name = @"highest_sequence_id")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong HighestSequenceId
+        {
+            get => __pbn__HighestSequenceId ?? 0;
+            set => __pbn__HighestSequenceId = value;
+        }
+        public bool ShouldSerializeHighestSequenceId() => __pbn__HighestSequenceId != null;
+        public void ResetHighestSequenceId() => __pbn__HighestSequenceId = null;
+        private ulong? __pbn__HighestSequenceId;
+
+        [global::ProtoBuf.ProtoMember(7, Name = @"is_chunk")]
+        [global::System.ComponentModel.DefaultValue(false)]
+        public bool IsChunk
+        {
+            get => __pbn__IsChunk ?? false;
+            set => __pbn__IsChunk = value;
+        }
+        public bool ShouldSerializeIsChunk() => __pbn__IsChunk != null;
+        public void ResetIsChunk() => __pbn__IsChunk = null;
+        private bool? __pbn__IsChunk;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1069,6 +1391,18 @@
 
         [global::ProtoBuf.ProtoMember(3, Name = @"message_id")]
         public MessageIdData MessageId { get; set; }
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"highest_sequence_id")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong HighestSequenceId
+        {
+            get => __pbn__HighestSequenceId ?? 0;
+            set => __pbn__HighestSequenceId = value;
+        }
+        public bool ShouldSerializeHighestSequenceId() => __pbn__HighestSequenceId != null;
+        public void ResetHighestSequenceId() => __pbn__HighestSequenceId = null;
+        private ulong? __pbn__HighestSequenceId;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1089,6 +1423,7 @@
 
         [global::ProtoBuf.ProtoMember(4, Name = @"message", IsRequired = true)]
         public string Message { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1108,12 +1443,16 @@
         [global::System.ComponentModel.DefaultValue(0)]
         public uint RedeliveryCount
         {
-            get { return __pbn__RedeliveryCount ?? 0; }
-            set { __pbn__RedeliveryCount = value; }
+            get => __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.ProtoMember(4, Name = @"ack_set")]
+        public long[] AckSets { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1130,22 +1469,54 @@
         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);
+        public global::System.Collections.Generic.List<MessageIdData> MessageIds { get; } = new global::System.Collections.Generic.List<MessageIdData>();
 
         [global::ProtoBuf.ProtoMember(4)]
-        [global::System.ComponentModel.DefaultValue(ValidationError.UncompressedSizeCorruption)]
-        public ValidationError validation_error
+        [global::System.ComponentModel.DefaultValue(ValidationErrorType.UncompressedSizeCorruption)]
+        public ValidationErrorType ValidationError
         {
-            get { return __pbn__validation_error ?? ValidationError.UncompressedSizeCorruption; }
-            set { __pbn__validation_error = value; }
+            get => __pbn__validation_error ?? ValidationErrorType.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;
+        private ValidationErrorType? __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.ProtoMember(6, Name = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(7, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(8, Name = @"request_id")]
+        public ulong RequestId
+        {
+            get => __pbn__RequestId.GetValueOrDefault();
+            set => __pbn__RequestId = value;
+        }
+        public bool ShouldSerializeRequestId() => __pbn__RequestId != null;
+        public void ResetRequestId() => __pbn__RequestId = null;
+        private ulong? __pbn__RequestId;
+
         [global::ProtoBuf.ProtoContract()]
         public enum AckType
         {
@@ -1154,7 +1525,7 @@
         }
 
         [global::ProtoBuf.ProtoContract()]
-        public enum ValidationError
+        public enum ValidationErrorType
         {
             UncompressedSizeCorruption = 0,
             DecompressionError = 1,
@@ -1162,6 +1533,73 @@
             BatchDeSerializeError = 3,
             DecryptionError = 4,
         }
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandAckResponse : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"error")]
+        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
+        public ServerError Error
+        {
+            get => __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 => __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(6, Name = @"request_id")]
+        public ulong RequestId
+        {
+            get => __pbn__RequestId.GetValueOrDefault();
+            set => __pbn__RequestId = value;
+        }
+        public bool ShouldSerializeRequestId() => __pbn__RequestId != null;
+        public void ResetRequestId() => __pbn__RequestId = null;
+        private ulong? __pbn__RequestId;
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1178,12 +1616,13 @@
         [global::System.ComponentModel.DefaultValue(false)]
         public bool IsActive
         {
-            get { return __pbn__IsActive ?? false; }
-            set { __pbn__IsActive = value; }
+            get => __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()]
@@ -1198,6 +1637,7 @@
 
         [global::ProtoBuf.ProtoMember(2, IsRequired = true)]
         public uint MessagePermits { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1212,6 +1652,7 @@
 
         [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
         public ulong RequestId { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1233,12 +1674,13 @@
         [global::ProtoBuf.ProtoMember(4, Name = @"message_publish_time")]
         public ulong MessagePublishTime
         {
-            get { return __pbn__MessagePublishTime.GetValueOrDefault(); }
-            set { __pbn__MessagePublishTime = value; }
+            get => __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()]
@@ -1250,6 +1692,7 @@
 
         [global::ProtoBuf.ProtoMember(1, Name = @"consumer_id", IsRequired = true)]
         public ulong ConsumerId { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1264,6 +1707,7 @@
 
         [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
         public ulong RequestId { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1278,6 +1722,7 @@
 
         [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
         public ulong RequestId { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1292,6 +1737,7 @@
 
         [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()]
@@ -1306,6 +1752,7 @@
 
         [global::ProtoBuf.ProtoMember(2, Name = @"schema")]
         public Schema Schema { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1325,8 +1772,8 @@
         [global::System.ComponentModel.DefaultValue(-1)]
         public long LastSequenceId
         {
-            get { return __pbn__LastSequenceId ?? -1; }
-            set { __pbn__LastSequenceId = value; }
+            get => __pbn__LastSequenceId ?? -1;
+            set => __pbn__LastSequenceId = value;
         }
         public bool ShouldSerializeLastSequenceId() => __pbn__LastSequenceId != null;
         public void ResetLastSequenceId() => __pbn__LastSequenceId = null;
@@ -1335,12 +1782,13 @@
         [global::ProtoBuf.ProtoMember(4, Name = @"schema_version")]
         public byte[] SchemaVersion
         {
-            get { return __pbn__SchemaVersion; }
-            set { __pbn__SchemaVersion = value; }
+            get => __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()]
@@ -1358,6 +1806,7 @@
 
         [global::ProtoBuf.ProtoMember(3, Name = @"message", IsRequired = true)]
         public string Message { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1366,6 +1815,7 @@
         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()]
@@ -1374,6 +1824,7 @@
         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()]
@@ -1388,6 +1839,7 @@
 
         [global::ProtoBuf.ProtoMember(4, Name = @"consumer_id", IsRequired = true)]
         public ulong ConsumerId { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1404,8 +1856,8 @@
         [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
         public ServerError ErrorCode
         {
-            get { return __pbn__ErrorCode ?? ServerError.UnknownError; }
-            set { __pbn__ErrorCode = value; }
+            get => __pbn__ErrorCode ?? ServerError.UnknownError;
+            set => __pbn__ErrorCode = value;
         }
         public bool ShouldSerializeErrorCode() => __pbn__ErrorCode != null;
         public void ResetErrorCode() => __pbn__ErrorCode = null;
@@ -1415,8 +1867,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ErrorMessage
         {
-            get { return __pbn__ErrorMessage ?? ""; }
-            set { __pbn__ErrorMessage = value; }
+            get => __pbn__ErrorMessage ?? "";
+            set => __pbn__ErrorMessage = value;
         }
         public bool ShouldSerializeErrorMessage() => __pbn__ErrorMessage != null;
         public void ResetErrorMessage() => __pbn__ErrorMessage = null;
@@ -1425,8 +1877,8 @@
         [global::ProtoBuf.ProtoMember(4)]
         public double MsgRateOut
         {
-            get { return __pbn__msgRateOut.GetValueOrDefault(); }
-            set { __pbn__msgRateOut = value; }
+            get => __pbn__msgRateOut.GetValueOrDefault();
+            set => __pbn__msgRateOut = value;
         }
         public bool ShouldSerializemsgRateOut() => __pbn__msgRateOut != null;
         public void ResetmsgRateOut() => __pbn__msgRateOut = null;
@@ -1435,8 +1887,8 @@
         [global::ProtoBuf.ProtoMember(5)]
         public double MsgThroughputOut
         {
-            get { return __pbn__msgThroughputOut.GetValueOrDefault(); }
-            set { __pbn__msgThroughputOut = value; }
+            get => __pbn__msgThroughputOut.GetValueOrDefault();
+            set => __pbn__msgThroughputOut = value;
         }
         public bool ShouldSerializemsgThroughputOut() => __pbn__msgThroughputOut != null;
         public void ResetmsgThroughputOut() => __pbn__msgThroughputOut = null;
@@ -1445,8 +1897,8 @@
         [global::ProtoBuf.ProtoMember(6)]
         public double MsgRateRedeliver
         {
-            get { return __pbn__msgRateRedeliver.GetValueOrDefault(); }
-            set { __pbn__msgRateRedeliver = value; }
+            get => __pbn__msgRateRedeliver.GetValueOrDefault();
+            set => __pbn__msgRateRedeliver = value;
         }
         public bool ShouldSerializemsgRateRedeliver() => __pbn__msgRateRedeliver != null;
         public void ResetmsgRateRedeliver() => __pbn__msgRateRedeliver = null;
@@ -1456,8 +1908,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ConsumerName
         {
-            get { return __pbn__consumerName ?? ""; }
-            set { __pbn__consumerName = value; }
+            get => __pbn__consumerName ?? "";
+            set => __pbn__consumerName = value;
         }
         public bool ShouldSerializeconsumerName() => __pbn__consumerName != null;
         public void ResetconsumerName() => __pbn__consumerName = null;
@@ -1466,8 +1918,8 @@
         [global::ProtoBuf.ProtoMember(8)]
         public ulong AvailablePermits
         {
-            get { return __pbn__availablePermits.GetValueOrDefault(); }
-            set { __pbn__availablePermits = value; }
+            get => __pbn__availablePermits.GetValueOrDefault();
+            set => __pbn__availablePermits = value;
         }
         public bool ShouldSerializeavailablePermits() => __pbn__availablePermits != null;
         public void ResetavailablePermits() => __pbn__availablePermits = null;
@@ -1476,8 +1928,8 @@
         [global::ProtoBuf.ProtoMember(9)]
         public ulong UnackedMessages
         {
-            get { return __pbn__unackedMessages.GetValueOrDefault(); }
-            set { __pbn__unackedMessages = value; }
+            get => __pbn__unackedMessages.GetValueOrDefault();
+            set => __pbn__unackedMessages = value;
         }
         public bool ShouldSerializeunackedMessages() => __pbn__unackedMessages != null;
         public void ResetunackedMessages() => __pbn__unackedMessages = null;
@@ -1486,8 +1938,8 @@
         [global::ProtoBuf.ProtoMember(10)]
         public bool BlockedConsumerOnUnackedMsgs
         {
-            get { return __pbn__blockedConsumerOnUnackedMsgs.GetValueOrDefault(); }
-            set { __pbn__blockedConsumerOnUnackedMsgs = value; }
+            get => __pbn__blockedConsumerOnUnackedMsgs.GetValueOrDefault();
+            set => __pbn__blockedConsumerOnUnackedMsgs = value;
         }
         public bool ShouldSerializeblockedConsumerOnUnackedMsgs() => __pbn__blockedConsumerOnUnackedMsgs != null;
         public void ResetblockedConsumerOnUnackedMsgs() => __pbn__blockedConsumerOnUnackedMsgs = null;
@@ -1497,8 +1949,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string Address
         {
-            get { return __pbn__Address ?? ""; }
-            set { __pbn__Address = value; }
+            get => __pbn__Address ?? "";
+            set => __pbn__Address = value;
         }
         public bool ShouldSerializeAddress() => __pbn__Address != null;
         public void ResetAddress() => __pbn__Address = null;
@@ -1508,8 +1960,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ConnectedSince
         {
-            get { return __pbn__connectedSince ?? ""; }
-            set { __pbn__connectedSince = value; }
+            get => __pbn__connectedSince ?? "";
+            set => __pbn__connectedSince = value;
         }
         public bool ShouldSerializeconnectedSince() => __pbn__connectedSince != null;
         public void ResetconnectedSince() => __pbn__connectedSince = null;
@@ -1519,8 +1971,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string Type
         {
-            get { return __pbn__Type ?? ""; }
-            set { __pbn__Type = value; }
+            get => __pbn__Type ?? "";
+            set => __pbn__Type = value;
         }
         public bool ShouldSerializeType() => __pbn__Type != null;
         public void ResetType() => __pbn__Type = null;
@@ -1529,8 +1981,8 @@
         [global::ProtoBuf.ProtoMember(14)]
         public double MsgRateExpired
         {
-            get { return __pbn__msgRateExpired.GetValueOrDefault(); }
-            set { __pbn__msgRateExpired = value; }
+            get => __pbn__msgRateExpired.GetValueOrDefault();
+            set => __pbn__msgRateExpired = value;
         }
         public bool ShouldSerializemsgRateExpired() => __pbn__msgRateExpired != null;
         public void ResetmsgRateExpired() => __pbn__msgRateExpired = null;
@@ -1539,12 +1991,13 @@
         [global::ProtoBuf.ProtoMember(15)]
         public ulong MsgBacklog
         {
-            get { return __pbn__msgBacklog.GetValueOrDefault(); }
-            set { __pbn__msgBacklog = value; }
+            get => __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()]
@@ -1559,6 +2012,7 @@
 
         [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
         public ulong RequestId { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1573,6 +2027,7 @@
 
         [global::ProtoBuf.ProtoMember(2, Name = @"request_id", IsRequired = true)]
         public ulong RequestId { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1589,18 +2044,18 @@
         public string Namespace { get; set; }
 
         [global::ProtoBuf.ProtoMember(3)]
-        [global::System.ComponentModel.DefaultValue(Mode.Persistent)]
-        public Mode mode
+        [global::System.ComponentModel.DefaultValue(ModeType.Persistent)]
+        public ModeType Mode
         {
-            get { return __pbn__mode ?? Mode.Persistent; }
-            set { __pbn__mode = value; }
+            get => __pbn__mode ?? ModeType.Persistent;
+            set => __pbn__mode = value;
         }
         public bool ShouldSerializemode() => __pbn__mode != null;
         public void Resetmode() => __pbn__mode = null;
-        private Mode? __pbn__mode;
+        private ModeType? __pbn__mode;
 
         [global::ProtoBuf.ProtoContract()]
-        public enum Mode
+        public enum ModeType
         {
             [global::ProtoBuf.ProtoEnum(Name = @"PERSISTENT")]
             Persistent = 0,
@@ -1609,6 +2064,7 @@
             [global::ProtoBuf.ProtoEnum(Name = @"ALL")]
             All = 2,
         }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1623,6 +2079,7 @@
 
         [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()]
@@ -1641,12 +2098,13 @@
         [global::ProtoBuf.ProtoMember(3, Name = @"schema_version")]
         public byte[] SchemaVersion
         {
-            get { return __pbn__SchemaVersion; }
-            set { __pbn__SchemaVersion = value; }
+            get => __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()]
@@ -1663,8 +2121,8 @@
         [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
         public ServerError ErrorCode
         {
-            get { return __pbn__ErrorCode ?? ServerError.UnknownError; }
-            set { __pbn__ErrorCode = value; }
+            get => __pbn__ErrorCode ?? ServerError.UnknownError;
+            set => __pbn__ErrorCode = value;
         }
         public bool ShouldSerializeErrorCode() => __pbn__ErrorCode != null;
         public void ResetErrorCode() => __pbn__ErrorCode = null;
@@ -1674,8 +2132,8 @@
         [global::System.ComponentModel.DefaultValue("")]
         public string ErrorMessage
         {
-            get { return __pbn__ErrorMessage ?? ""; }
-            set { __pbn__ErrorMessage = value; }
+            get => __pbn__ErrorMessage ?? "";
+            set => __pbn__ErrorMessage = value;
         }
         public bool ShouldSerializeErrorMessage() => __pbn__ErrorMessage != null;
         public void ResetErrorMessage() => __pbn__ErrorMessage = null;
@@ -1687,12 +2145,689 @@
         [global::ProtoBuf.ProtoMember(5, Name = @"schema_version")]
         public byte[] SchemaVersion
         {
-            get { return __pbn__SchemaVersion; }
-            set { __pbn__SchemaVersion = value; }
+            get => __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 CommandGetOrCreateSchema : 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", IsRequired = true)]
+        public Schema Schema { get; set; }
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandGetOrCreateSchemaResponse : 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 => __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 => __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_version")]
+        public byte[] SchemaVersion
+        {
+            get => __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 CommandNewTxn : 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 = @"txn_ttl_seconds")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnTtlSeconds
+        {
+            get => __pbn__TxnTtlSeconds ?? 0;
+            set => __pbn__TxnTtlSeconds = value;
+        }
+        public bool ShouldSerializeTxnTtlSeconds() => __pbn__TxnTtlSeconds != null;
+        public void ResetTxnTtlSeconds() => __pbn__TxnTtlSeconds = null;
+        private ulong? __pbn__TxnTtlSeconds;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"tc_id")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TcId
+        {
+            get => __pbn__TcId ?? 0;
+            set => __pbn__TcId = value;
+        }
+        public bool ShouldSerializeTcId() => __pbn__TcId != null;
+        public void ResetTcId() => __pbn__TcId = null;
+        private ulong? __pbn__TcId;
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandNewTxnResponse : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"error")]
+        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
+        public ServerError Error
+        {
+            get => __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 => __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 partial class CommandAddPartitionToTxn : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"partitions")]
+        public global::System.Collections.Generic.List<string> Partitions { get; } = new global::System.Collections.Generic.List<string>();
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandAddPartitionToTxnResponse : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"error")]
+        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
+        public ServerError Error
+        {
+            get => __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 => __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 partial class Subscription : 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, IsRequired = true)]
+        public string SubscriptionName { get; set; }
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandAddSubscriptionToTxn : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"subscription")]
+        public global::System.Collections.Generic.List<Subscription> Subscriptions { get; } = new global::System.Collections.Generic.List<Subscription>();
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandAddSubscriptionToTxnResponse : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"error")]
+        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
+        public ServerError Error
+        {
+            get => __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 => __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 partial class CommandEndTxn : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"txn_action")]
+        [global::System.ComponentModel.DefaultValue(TxnAction.Commit)]
+        public TxnAction TxnAction
+        {
+            get => __pbn__TxnAction ?? TxnAction.Commit;
+            set => __pbn__TxnAction = value;
+        }
+        public bool ShouldSerializeTxnAction() => __pbn__TxnAction != null;
+        public void ResetTxnAction() => __pbn__TxnAction = null;
+        private TxnAction? __pbn__TxnAction;
+
+        [global::ProtoBuf.ProtoMember(5, Name = @"message_id")]
+        public global::System.Collections.Generic.List<MessageIdData> MessageIds { get; } = new global::System.Collections.Generic.List<MessageIdData>();
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandEndTxnResponse : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"error")]
+        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
+        public ServerError Error
+        {
+            get => __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 => __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 partial class CommandEndTxnOnPartition : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"topic")]
+        [global::System.ComponentModel.DefaultValue("")]
+        public string Topic
+        {
+            get => __pbn__Topic ?? "";
+            set => __pbn__Topic = value;
+        }
+        public bool ShouldSerializeTopic() => __pbn__Topic != null;
+        public void ResetTopic() => __pbn__Topic = null;
+        private string __pbn__Topic;
+
+        [global::ProtoBuf.ProtoMember(5, Name = @"txn_action")]
+        [global::System.ComponentModel.DefaultValue(TxnAction.Commit)]
+        public TxnAction TxnAction
+        {
+            get => __pbn__TxnAction ?? TxnAction.Commit;
+            set => __pbn__TxnAction = value;
+        }
+        public bool ShouldSerializeTxnAction() => __pbn__TxnAction != null;
+        public void ResetTxnAction() => __pbn__TxnAction = null;
+        private TxnAction? __pbn__TxnAction;
+
+        [global::ProtoBuf.ProtoMember(6, Name = @"message_id")]
+        public global::System.Collections.Generic.List<MessageIdData> MessageIds { get; } = new global::System.Collections.Generic.List<MessageIdData>();
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandEndTxnOnPartitionResponse : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"error")]
+        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
+        public ServerError Error
+        {
+            get => __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 => __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 partial class CommandEndTxnOnSubscription : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"subscription")]
+        public Subscription Subscription { get; set; }
+
+        [global::ProtoBuf.ProtoMember(5, Name = @"txn_action")]
+        [global::System.ComponentModel.DefaultValue(TxnAction.Commit)]
+        public TxnAction TxnAction
+        {
+            get => __pbn__TxnAction ?? TxnAction.Commit;
+            set => __pbn__TxnAction = value;
+        }
+        public bool ShouldSerializeTxnAction() => __pbn__TxnAction != null;
+        public void ResetTxnAction() => __pbn__TxnAction = null;
+        private TxnAction? __pbn__TxnAction;
+
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public partial class CommandEndTxnOnSubscriptionResponse : 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 = @"txnid_least_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidLeastBits
+        {
+            get => __pbn__TxnidLeastBits ?? 0;
+            set => __pbn__TxnidLeastBits = value;
+        }
+        public bool ShouldSerializeTxnidLeastBits() => __pbn__TxnidLeastBits != null;
+        public void ResetTxnidLeastBits() => __pbn__TxnidLeastBits = null;
+        private ulong? __pbn__TxnidLeastBits;
+
+        [global::ProtoBuf.ProtoMember(3, Name = @"txnid_most_bits")]
+        [global::System.ComponentModel.DefaultValue(typeof(ulong), "0")]
+        public ulong TxnidMostBits
+        {
+            get => __pbn__TxnidMostBits ?? 0;
+            set => __pbn__TxnidMostBits = value;
+        }
+        public bool ShouldSerializeTxnidMostBits() => __pbn__TxnidMostBits != null;
+        public void ResetTxnidMostBits() => __pbn__TxnidMostBits = null;
+        private ulong? __pbn__TxnidMostBits;
+
+        [global::ProtoBuf.ProtoMember(4, Name = @"error")]
+        [global::System.ComponentModel.DefaultValue(ServerError.UnknownError)]
+        public ServerError Error
+        {
+            get => __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 => __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()]
@@ -1813,6 +2948,51 @@
         [global::ProtoBuf.ProtoMember(37)]
         public CommandAuthResponse AuthResponse { get; set; }
 
+        [global::ProtoBuf.ProtoMember(38)]
+        public CommandAckResponse AckResponse { get; set; }
+
+        [global::ProtoBuf.ProtoMember(39)]
+        public CommandGetOrCreateSchema GetOrCreateSchema { get; set; }
+
+        [global::ProtoBuf.ProtoMember(40)]
+        public CommandGetOrCreateSchemaResponse GetOrCreateSchemaResponse { get; set; }
+
+        [global::ProtoBuf.ProtoMember(50)]
+        public CommandNewTxn NewTxn { get; set; }
+
+        [global::ProtoBuf.ProtoMember(51)]
+        public CommandNewTxnResponse NewTxnResponse { get; set; }
+
+        [global::ProtoBuf.ProtoMember(52)]
+        public CommandAddPartitionToTxn AddPartitionToTxn { get; set; }
+
+        [global::ProtoBuf.ProtoMember(53)]
+        public CommandAddPartitionToTxnResponse AddPartitionToTxnResponse { get; set; }
+
+        [global::ProtoBuf.ProtoMember(54)]
+        public CommandAddSubscriptionToTxn AddSubscriptionToTxn { get; set; }
+
+        [global::ProtoBuf.ProtoMember(55)]
+        public CommandAddSubscriptionToTxnResponse AddSubscriptionToTxnResponse { get; set; }
+
+        [global::ProtoBuf.ProtoMember(56)]
+        public CommandEndTxn EndTxn { get; set; }
+
+        [global::ProtoBuf.ProtoMember(57)]
+        public CommandEndTxnResponse EndTxnResponse { get; set; }
+
+        [global::ProtoBuf.ProtoMember(58)]
+        public CommandEndTxnOnPartition EndTxnOnPartition { get; set; }
+
+        [global::ProtoBuf.ProtoMember(59)]
+        public CommandEndTxnOnPartitionResponse EndTxnOnPartitionResponse { get; set; }
+
+        [global::ProtoBuf.ProtoMember(60)]
+        public CommandEndTxnOnSubscription EndTxnOnSubscription { get; set; }
+
+        [global::ProtoBuf.ProtoMember(61)]
+        public CommandEndTxnOnSubscriptionResponse EndTxnOnSubscriptionResponse { get; set; }
+
         [global::ProtoBuf.ProtoContract()]
         public enum Type
         {
@@ -1888,7 +3068,38 @@
             AuthChallenge = 36,
             [global::ProtoBuf.ProtoEnum(Name = @"AUTH_RESPONSE")]
             AuthResponse = 37,
+            [global::ProtoBuf.ProtoEnum(Name = @"ACK_RESPONSE")]
+            AckResponse = 38,
+            [global::ProtoBuf.ProtoEnum(Name = @"GET_OR_CREATE_SCHEMA")]
+            GetOrCreateSchema = 39,
+            [global::ProtoBuf.ProtoEnum(Name = @"GET_OR_CREATE_SCHEMA_RESPONSE")]
+            GetOrCreateSchemaResponse = 40,
+            [global::ProtoBuf.ProtoEnum(Name = @"NEW_TXN")]
+            NewTxn = 50,
+            [global::ProtoBuf.ProtoEnum(Name = @"NEW_TXN_RESPONSE")]
+            NewTxnResponse = 51,
+            [global::ProtoBuf.ProtoEnum(Name = @"ADD_PARTITION_TO_TXN")]
+            AddPartitionToTxn = 52,
+            [global::ProtoBuf.ProtoEnum(Name = @"ADD_PARTITION_TO_TXN_RESPONSE")]
+            AddPartitionToTxnResponse = 53,
+            [global::ProtoBuf.ProtoEnum(Name = @"ADD_SUBSCRIPTION_TO_TXN")]
+            AddSubscriptionToTxn = 54,
+            [global::ProtoBuf.ProtoEnum(Name = @"ADD_SUBSCRIPTION_TO_TXN_RESPONSE")]
+            AddSubscriptionToTxnResponse = 55,
+            [global::ProtoBuf.ProtoEnum(Name = @"END_TXN")]
+            EndTxn = 56,
+            [global::ProtoBuf.ProtoEnum(Name = @"END_TXN_RESPONSE")]
+            EndTxnResponse = 57,
+            [global::ProtoBuf.ProtoEnum(Name = @"END_TXN_ON_PARTITION")]
+            EndTxnOnPartition = 58,
+            [global::ProtoBuf.ProtoEnum(Name = @"END_TXN_ON_PARTITION_RESPONSE")]
+            EndTxnOnPartitionResponse = 59,
+            [global::ProtoBuf.ProtoEnum(Name = @"END_TXN_ON_SUBSCRIPTION")]
+            EndTxnOnSubscription = 60,
+            [global::ProtoBuf.ProtoEnum(Name = @"END_TXN_ON_SUBSCRIPTION_RESPONSE")]
+            EndTxnOnSubscriptionResponse = 61,
         }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1929,6 +3140,10 @@
         InvalidTopicName = 17,
         IncompatibleSchema = 18,
         ConsumerAssignError = 19,
+        TransactionCoordinatorNotFound = 20,
+        InvalidTxnStatus = 21,
+        NotAllowedError = 22,
+        TransactionConflict = 23,
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -1972,8 +3187,29 @@
         V13 = 13,
         [global::ProtoBuf.ProtoEnum(Name = @"v14")]
         V14 = 14,
+        [global::ProtoBuf.ProtoEnum(Name = @"v15")]
+        V15 = 15,
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public enum KeySharedMode
+    {
+        [global::ProtoBuf.ProtoEnum(Name = @"AUTO_SPLIT")]
+        AutoSplit = 0,
+        [global::ProtoBuf.ProtoEnum(Name = @"STICKY")]
+        Sticky = 1,
+    }
+
+    [global::ProtoBuf.ProtoContract()]
+    public enum TxnAction
+    {
+        [global::ProtoBuf.ProtoEnum(Name = @"COMMIT")]
+        Commit = 0,
+        [global::ProtoBuf.ProtoEnum(Name = @"ABORT")]
+        Abort = 1,
     }
 }
 
-#pragma warning restore CS1591, CS0612, CS3021, IDE1006
+#pragma warning restore CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
+#endregion
 #nullable restore
