Ver código fonte

Initial support for services and extensions. Incomplete, but enough to get generated unit test files to compile.

Jon Skeet 17 anos atrás
pai
commit
575083ae9c
37 arquivos alterados com 16089 adições e 296 exclusões
  1. 6 0
      csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
  2. 372 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs
  3. 268 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
  4. 1415 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs
  5. 243 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
  6. 13140 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
  7. 32 0
      csharp/ProtocolBuffers.Test/TestUtil.cs
  8. 5 3
      csharp/ProtocolBuffers/CodedInputStream.cs
  9. 9 6
      csharp/ProtocolBuffers/CodedOutputStream.cs
  10. 156 181
      csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
  11. 2 1
      csharp/ProtocolBuffers/Descriptors/EnumDescriptorIndexAttribute.cs
  12. 11 0
      csharp/ProtocolBuffers/DynamicMessage.cs
  13. 165 0
      csharp/ProtocolBuffers/ExtendableMessage.cs
  14. 11 0
      csharp/ProtocolBuffers/FieldSet.cs
  15. 14 3
      csharp/ProtocolBuffers/GeneratedBuilder.cs
  16. 68 2
      csharp/ProtocolBuffers/GeneratedExtension.cs
  17. 9 4
      csharp/ProtocolBuffers/GeneratedMessage.cs
  18. 14 0
      csharp/ProtocolBuffers/IRpcChannel.cs
  19. 8 0
      csharp/ProtocolBuffers/IRpcController.cs
  20. 9 0
      csharp/ProtocolBuffers/IService.cs
  21. 6 0
      csharp/ProtocolBuffers/ProtocolBuffers.csproj
  22. 35 0
      csharp/ProtocolBuffers/RpcUtil.cs
  23. 5 13
      csharp/ProtocolBuffers/TextFormat.cs
  24. 2 2
      csharp/ProtocolBuffers/UnknownField.cs
  25. 2 1
      src/google/protobuf/compiler/csharp/csharp_enum.cc
  26. 8 8
      src/google/protobuf/compiler/csharp/csharp_enum_field.cc
  27. 6 16
      src/google/protobuf/compiler/csharp/csharp_extension.cc
  28. 3 1
      src/google/protobuf/compiler/csharp/csharp_file.cc
  29. 12 4
      src/google/protobuf/compiler/csharp/csharp_helpers.cc
  30. 1 0
      src/google/protobuf/compiler/csharp/csharp_helpers.h
  31. 6 6
      src/google/protobuf/compiler/csharp/csharp_message.cc
  32. 31 44
      src/google/protobuf/compiler/csharp/csharp_service.cc
  33. 2 0
      src/google/protobuf/unittest.proto
  34. 3 0
      src/google/protobuf/unittest_embed_optimize_for.proto
  35. 4 1
      src/google/protobuf/unittest_import.proto
  36. 3 0
      src/google/protobuf/unittest_mset.proto
  37. 3 0
      src/google/protobuf/unittest_optimize_for.proto

+ 6 - 0
csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj

@@ -48,6 +48,12 @@
     <Compile Include="CodedInputStreamTest.cs" />
     <Compile Include="CodedOutputStreamTest.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TestProtos\UnitTestEmbedOptimizeForProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestImportProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestMessageSetProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestOptimizeForProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestProtoFile.cs" />
+    <Compile Include="TestUtil.cs" />
     <Compile Include="WireFormatTest.cs" />
   </ItemGroup>
   <ItemGroup>

+ 372 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs

@@ -0,0 +1,372 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestEmbedOptimizeForProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x31, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 
+            0x65, 0x5f, 0x66, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 
+            0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa1, 0x01, 0x0a, 0x19, 
+            0x54, 0x65, 0x73, 0x74, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x46, 0x6f, 
+            0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 
+            0x6d, 0x69, 0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x65, 
+            0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x42, 
+            0x4a, 0x48, 0x01, 0xc2, 0x3e, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 
+            0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 
+            0x3e, 0x21, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 
+            0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 
+        }, new pbd::FileDescriptor[] {
+                self::UnitTestOptimizeForProtoFile.Descriptor,
+        });
+    #endregion
+    
+    #region Extensions
+    /**/
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmbedOptimizedForSize__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor,
+            new string[] { "OptionalMessage", "RepeatedMessage", },
+            typeof (self::TestEmbedOptimizedForSize),
+            typeof (self::TestEmbedOptimizedForSize.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  #endregion
+  
+  #region Messages
+  public sealed partial class TestEmbedOptimizedForSize : pb::GeneratedMessage<TestEmbedOptimizedForSize, TestEmbedOptimizedForSize.Builder> {
+    // Use TestEmbedOptimizedForSize.CreateBuilder() to construct.
+    private TestEmbedOptimizedForSize() {}
+    
+    private static readonly TestEmbedOptimizedForSize defaultInstance = new TestEmbedOptimizedForSize();
+    public static TestEmbedOptimizedForSize DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestEmbedOptimizedForSize DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestEmbedOptimizeForProtoFile.internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestEmbedOptimizeForProtoFile.internal__static_protobuf_unittest_TestEmbedOptimizedForSize__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestOptimizedForSize optional_message = 1;
+    private bool hasOptionalMessage;
+    private self::TestOptimizedForSize optionalMessage_ = self::TestOptimizedForSize.DefaultInstance;
+    public bool HasOptionalMessage {
+      get { return hasOptionalMessage; }
+    }
+    public self::TestOptimizedForSize OptionalMessage {
+      get { return optionalMessage_; }
+    }
+    
+    // repeated .protobuf_unittest.TestOptimizedForSize repeated_message = 2;
+    private scg::IList<self::TestOptimizedForSize> repeatedMessage_ = pbc::Lists<self::TestOptimizedForSize>.Empty;
+    public scg::IList<self::TestOptimizedForSize> RepeatedMessageList {
+      get { return repeatedMessage_; } 
+    }
+    public int RepeatedMessageCount
+      { get { return repeatedMessage_.Count; }
+    }
+    public self::TestOptimizedForSize GetRepeatedMessage(int index) {
+      return repeatedMessage_ [index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (HasOptionalMessage) {
+          if (!OptionalMessage.IsInitialized) return false;
+        }
+        foreach (self::TestOptimizedForSize element in RepeatedMessageList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasOptionalMessage) {
+        output.WriteMessage(1, OptionalMessage);
+      }
+      foreach (self::TestOptimizedForSize element in RepeatedMessageList) {
+        output.WriteMessage(2, element);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasOptionalMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, OptionalMessage);
+        }
+        foreach (self::TestOptimizedForSize element in RepeatedMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestEmbedOptimizedForSize ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestEmbedOptimizedForSize> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestEmbedOptimizedForSize prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestEmbedOptimizedForSize, Builder> {
+      // Construct using self::TestEmbedOptimizedForSize.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestEmbedOptimizedForSize result = new self::TestEmbedOptimizedForSize();
+      
+      protected override self::TestEmbedOptimizedForSize MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> Clear() {
+        result = new self::TestEmbedOptimizedForSize();
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestEmbedOptimizedForSize.Descriptor; }
+      }
+      
+      public override self::TestEmbedOptimizedForSize DefaultInstanceForType {
+        get { return self::TestEmbedOptimizedForSize.DefaultInstance; }
+      }
+      
+      public override self::TestEmbedOptimizedForSize BuildPartial() {
+        if (result.repeatedMessage_ != pbc::Lists<self::TestOptimizedForSize>.Empty) {
+          result.repeatedMessage_ = pbc::Lists<self::TestOptimizedForSize>.AsReadOnly(result.repeatedMessage_);
+        }
+        self::TestEmbedOptimizedForSize returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestEmbedOptimizedForSize) {
+          return MergeFrom((self::TestEmbedOptimizedForSize) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> MergeFrom(self::TestEmbedOptimizedForSize other) {
+        if (other == self::TestEmbedOptimizedForSize.DefaultInstance) return this;
+        if (other.HasOptionalMessage) {
+          MergeOptionalMessage(other.OptionalMessage);
+        }
+        if (other.repeatedMessage_.Count != 0) {
+          if (result.repeatedMessage_.Count == 0) {
+            result.repeatedMessage_ = new scg::List<self::TestOptimizedForSize>();
+          }
+          base.AddRange(other.repeatedMessage_, result.repeatedMessage_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestOptimizedForSize.Builder subBuilder = self::TestOptimizedForSize.CreateBuilder();
+              if (HasOptionalMessage) {
+                subBuilder.MergeFrom(OptionalMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 18: {
+              self::TestOptimizedForSize.Builder subBuilder = self::TestOptimizedForSize.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedMessage(subBuilder.BuildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestOptimizedForSize optional_message = 1;
+      public bool HasOptionalMessage {
+        get { return result.HasOptionalMessage; }
+      }
+      public self::TestOptimizedForSize OptionalMessage {
+        get { return result.OptionalMessage; }
+        set { SetOptionalMessage(value); }
+      }
+      public Builder SetOptionalMessage(self::TestOptimizedForSize value) {
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalMessage(self::TestOptimizedForSize.Builder builderForValue) {
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalMessage(self::TestOptimizedForSize value) {
+        if (result.HasOptionalMessage &&
+            result.optionalMessage_ != self::TestOptimizedForSize.DefaultInstance) {
+          result.optionalMessage_ =
+            self::TestOptimizedForSize.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalMessage_ = value;
+        }
+        result.hasOptionalMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalMessage() {
+        result.hasOptionalMessage = false;
+        result.optionalMessage_ = self::TestOptimizedForSize.DefaultInstance;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.TestOptimizedForSize repeated_message = 2;
+      public scg::IList<self::TestOptimizedForSize> RepeatedMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedMessage_); }
+      }
+      public int RepeatedMessageCount {
+        get { return result.RepeatedMessageCount; }
+      }
+      public self::TestOptimizedForSize GetRepeatedMessage(int index) {
+        return result.GetRepeatedMessage(index);
+      }
+      public Builder SetRepeatedMessage(int index, self::TestOptimizedForSize value) {
+        result.repeatedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessage(int index, self::TestOptimizedForSize.Builder builderForValue) {
+        result.repeatedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessage(self::TestOptimizedForSize value) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestOptimizedForSize>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestOptimizedForSize>();
+        }
+        result.repeatedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessage(self::TestOptimizedForSize.Builder builderForValue) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestOptimizedForSize>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestOptimizedForSize>();
+        }
+        result.repeatedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessage(scg::IEnumerable<self::TestOptimizedForSize> values) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestOptimizedForSize>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestOptimizedForSize>();
+        }
+        base.AddRange(values, result.repeatedMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedMessage() {
+        result.repeatedMessage_ = pbc::Lists<self::TestOptimizedForSize>.Empty;
+        return this;
+      }
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  #endregion
+}

+ 268 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs

@@ -0,0 +1,268 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestImportProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x25, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
+            0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 
+            0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x1a, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 
+            0x67, 0x65, 0x12, 0x09, 0x0a, 0x01, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x2a, 0x3c, 0x0a, 0x0a, 0x49, 0x6d, 0x70, 
+            0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 
+            0x4f, 0x10, 0x07, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x41, 0x52, 0x10, 0x08, 0x12, 
+            0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x41, 0x5a, 0x10, 0x09, 0x42, 0x5a, 0x0a, 0x18, 0x63, 
+            0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x74, 
+            0x65, 0x73, 0x74, 0x48, 0x01, 0xc2, 0x3e, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 
+            0x63, 0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 
+            0x73, 0xca, 0x3e, 0x17, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 
+            0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 
+        }, new pbd::FileDescriptor[] {
+        });
+    #endregion
+    
+    #region Extensions
+    /**/
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_import_ImportMessage__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_import_ImportMessage__Descriptor,
+            new string[] { "D", },
+            typeof (self::ImportMessage),
+            typeof (self::ImportMessage.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  public enum ImportEnum {
+    IMPORT_FOO = 7,
+    IMPORT_BAR = 8,
+    IMPORT_BAZ = 9,
+  }
+  
+  #endregion
+  
+  #region Messages
+  public sealed partial class ImportMessage : pb::GeneratedMessage<ImportMessage, ImportMessage.Builder> {
+    // Use ImportMessage.CreateBuilder() to construct.
+    private ImportMessage() {}
+    
+    private static readonly ImportMessage defaultInstance = new ImportMessage();
+    public static ImportMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override ImportMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable; }
+    }
+    
+    // optional int32 d = 1;
+    private bool hasD;
+    private int d_ = 0;
+    public bool HasD {
+      get { return hasD; }
+    }
+    public int D {
+      get { return d_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasD) {
+        output.WriteInt32(1, D);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasD) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, D);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::ImportMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::ImportMessage parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::ImportMessage> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::ImportMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::ImportMessage, Builder> {
+      // Construct using self::ImportMessage.CreateBuilder()
+      internal Builder() {}
+      
+      self::ImportMessage result = new self::ImportMessage();
+      
+      protected override self::ImportMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::ImportMessage> Clear() {
+        result = new self::ImportMessage();
+        return this;
+      }
+      
+      public override IBuilder<self::ImportMessage> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::ImportMessage.Descriptor; }
+      }
+      
+      public override self::ImportMessage DefaultInstanceForType {
+        get { return self::ImportMessage.DefaultInstance; }
+      }
+      
+      public override self::ImportMessage BuildPartial() {
+        self::ImportMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::ImportMessage) {
+          return MergeFrom((self::ImportMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::ImportMessage> MergeFrom(self::ImportMessage other) {
+        if (other == self::ImportMessage.DefaultInstance) return this;
+        if (other.HasD) {
+          D = other.D;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::ImportMessage> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::ImportMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              D = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 d = 1;
+      public bool HasD {
+        get { return result.HasD; }
+      }
+      public int D {
+        get { return result.D; }
+        set { SetD(value); }
+      }
+      public Builder SetD(int value) {
+        result.hasD = true;
+        result.d_ = value;
+        return this;
+      }
+      public Builder ClearD() {
+        result.hasD = false;
+        result.d_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  #endregion
+}

+ 1415 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs

@@ -0,0 +1,1415 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestMessageSetProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x22, 0x1e, 0x0a, 0x0e, 
+            0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x2a, 0x08, 0x08, 0x04, 0x10, 0x80, 
+            0x80, 0x80, 0x80, 0x02, 0x3a, 0x02, 0x08, 0x01, 0x22, 0x51, 0x0a, 0x17, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 
+            0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x6d, 
+            0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 
+            0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x22, 0x96, 0x01, 0x0a, 0x18, 0x54, 0x65, 0x73, 0x74, 
+            0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x31, 
+            0x12, 0x09, 0x0a, 0x01, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x32, 0x6f, 0x0a, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 
+            0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 
+            0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0xb0, 0xa6, 0x5e, 0x20, 0x01, 0x28, 0x0b, 0x32, 
+            0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x31, 0x22, 0x98, 0x01, 0x0a, 0x18, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x12, 0x0b, 0x0a, 0x03, 0x73, 0x74, 0x72, 
+            0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x32, 0x6f, 0x0a, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 
+            0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 
+            0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0xf9, 0xbb, 0x5e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 
+            0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x22, 
+            0x6e, 0x0a, 0x0d, 0x52, 0x61, 0x77, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x04, 
+            0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0a, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 
+            0x65, 0x53, 0x65, 0x74, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x1a, 0x28, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0f, 0x0a, 
+            0x07, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x6d, 0x65, 
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0c, 0x42, 0x44, 0x48, 0x01, 0xc2, 0x3e, 0x21, 0x47, 0x6f, 
+            0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x1b, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 
+            0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 
+            0x65, 
+        }, new pbd::FileDescriptor[] {
+        });
+    #endregion
+    
+    #region Extensions
+    /**/
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSet__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSet__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSet__Descriptor,
+            new string[] { },
+            typeof (self::TestMessageSet),
+            typeof (self::TestMessageSet.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor 
+        = Descriptor.MessageTypes[1];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetContainer__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor,
+            new string[] { "MessageSet", },
+            typeof (self::TestMessageSetContainer),
+            typeof (self::TestMessageSetContainer.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor 
+        = Descriptor.MessageTypes[2];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetExtension1__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor,
+            new string[] { "I", },
+            typeof (self::TestMessageSetExtension1),
+            typeof (self::TestMessageSetExtension1.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor 
+        = Descriptor.MessageTypes[3];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetExtension2__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor,
+            new string[] { "Str", },
+            typeof (self::TestMessageSetExtension2),
+            typeof (self::TestMessageSetExtension2.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_RawMessageSet__Descriptor 
+        = Descriptor.MessageTypes[4];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RawMessageSet__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RawMessageSet__Descriptor,
+            new string[] { "Item", },
+            typeof (self::RawMessageSet),
+            typeof (self::RawMessageSet.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor 
+        = internal__static_protobuf_unittest_RawMessageSet__Descriptor.NestedTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RawMessageSet_Item__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor,
+            new string[] { "TypeId", "Message", },
+            typeof (self::RawMessageSet.Types.Item),
+            typeof (self::RawMessageSet.Types.Item.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  #endregion
+  
+  #region Messages
+  public sealed partial class TestMessageSet : pb::ExtendableMessage<TestMessageSet, TestMessageSet.Builder> {
+    // Use TestMessageSet.CreateBuilder() to construct.
+    private TestMessageSet() {}
+    
+    private static readonly TestMessageSet defaultInstance = new TestMessageSet();
+    public static TestMessageSet DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMessageSet DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSet__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSet__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      pb::ExtendableMessage<TestMessageSet, TestMessageSet.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteAsMessageSetTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSizeAsMessageSet;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMessageSet ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSet parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMessageSet> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMessageSet prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMessageSet, self::TestMessageSet.Builder>.ExtendableBuilder {
+      // Construct using self::TestMessageSet.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMessageSet result = new self::TestMessageSet();
+      
+      protected override self::TestMessageSet MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMessageSet> Clear() {
+        result = new self::TestMessageSet();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSet> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMessageSet.Descriptor; }
+      }
+      
+      public override self::TestMessageSet DefaultInstanceForType {
+        get { return self::TestMessageSet.DefaultInstance; }
+      }
+      
+      public override self::TestMessageSet BuildPartial() {
+        self::TestMessageSet returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMessageSet) {
+          return MergeFrom((self::TestMessageSet) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMessageSet> MergeFrom(self::TestMessageSet other) {
+        if (other == self::TestMessageSet.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSet> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMessageSet> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class TestMessageSetContainer : pb::GeneratedMessage<TestMessageSetContainer, TestMessageSetContainer.Builder> {
+    // Use TestMessageSetContainer.CreateBuilder() to construct.
+    private TestMessageSetContainer() {}
+    
+    private static readonly TestMessageSetContainer defaultInstance = new TestMessageSetContainer();
+    public static TestMessageSetContainer DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMessageSetContainer DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetContainer__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestMessageSet message_set = 1;
+    private bool hasMessageSet;
+    private self::TestMessageSet messageSet_ = self::TestMessageSet.DefaultInstance;
+    public bool HasMessageSet {
+      get { return hasMessageSet; }
+    }
+    public self::TestMessageSet MessageSet {
+      get { return messageSet_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (HasMessageSet) {
+          if (!MessageSet.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasMessageSet) {
+        output.WriteMessage(1, MessageSet);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasMessageSet) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, MessageSet);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMessageSetContainer ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetContainer parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMessageSetContainer> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMessageSetContainer prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMessageSetContainer, Builder> {
+      // Construct using self::TestMessageSetContainer.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMessageSetContainer result = new self::TestMessageSetContainer();
+      
+      protected override self::TestMessageSetContainer MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> Clear() {
+        result = new self::TestMessageSetContainer();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMessageSetContainer.Descriptor; }
+      }
+      
+      public override self::TestMessageSetContainer DefaultInstanceForType {
+        get { return self::TestMessageSetContainer.DefaultInstance; }
+      }
+      
+      public override self::TestMessageSetContainer BuildPartial() {
+        self::TestMessageSetContainer returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMessageSetContainer) {
+          return MergeFrom((self::TestMessageSetContainer) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> MergeFrom(self::TestMessageSetContainer other) {
+        if (other == self::TestMessageSetContainer.DefaultInstance) return this;
+        if (other.HasMessageSet) {
+          MergeMessageSet(other.MessageSet);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestMessageSet.Builder subBuilder = self::TestMessageSet.CreateBuilder();
+              if (HasMessageSet) {
+                subBuilder.MergeFrom(MessageSet);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              MessageSet = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestMessageSet message_set = 1;
+      public bool HasMessageSet {
+        get { return result.HasMessageSet; }
+      }
+      public self::TestMessageSet MessageSet {
+        get { return result.MessageSet; }
+        set { SetMessageSet(value); }
+      }
+      public Builder SetMessageSet(self::TestMessageSet value) {
+        result.hasMessageSet = true;
+        result.messageSet_ = value;
+        return this;
+      }
+      public Builder SetMessageSet(self::TestMessageSet.Builder builderForValue) {
+        result.hasMessageSet = true;
+        result.messageSet_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMessageSet(self::TestMessageSet value) {
+        if (result.HasMessageSet &&
+            result.messageSet_ != self::TestMessageSet.DefaultInstance) {
+          result.messageSet_ =
+            self::TestMessageSet.CreateBuilder(result.messageSet_).MergeFrom(value).BuildPartial();
+        } else {
+          result.messageSet_ = value;
+        }
+        result.hasMessageSet = true;
+        return this;
+      }
+      public Builder ClearMessageSet() {
+        result.hasMessageSet = false;
+        result.messageSet_ = self::TestMessageSet.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestMessageSetExtension1 : pb::GeneratedMessage<TestMessageSetExtension1, TestMessageSetExtension1.Builder> {
+    // Use TestMessageSetExtension1.CreateBuilder() to construct.
+    private TestMessageSetExtension1() {}
+    
+    private static readonly TestMessageSetExtension1 defaultInstance = new TestMessageSetExtension1();
+    public static TestMessageSetExtension1 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMessageSetExtension1 DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension1__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public static readonly pb::GeneratedExtension<self::TestMessageSet, self::TestMessageSetExtension1> MessageSetExtension =
+            pb::GeneratedExtension.CreateExtension<self::TestMessageSet, self::TestMessageSetExtension1>(Descriptor.Extensions[0]);
+    }
+    #endregion
+    
+    // optional int32 i = 15;
+    private bool hasI;
+    private int i_ = 0;
+    public bool HasI {
+      get { return hasI; }
+    }
+    public int I {
+      get { return i_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasI) {
+        output.WriteInt32(15, I);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasI) {
+          size += pb::CodedOutputStream.ComputeInt32Size(15, I);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMessageSetExtension1 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMessageSetExtension1> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMessageSetExtension1 prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMessageSetExtension1, Builder> {
+      // Construct using self::TestMessageSetExtension1.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMessageSetExtension1 result = new self::TestMessageSetExtension1();
+      
+      protected override self::TestMessageSetExtension1 MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> Clear() {
+        result = new self::TestMessageSetExtension1();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMessageSetExtension1.Descriptor; }
+      }
+      
+      public override self::TestMessageSetExtension1 DefaultInstanceForType {
+        get { return self::TestMessageSetExtension1.DefaultInstance; }
+      }
+      
+      public override self::TestMessageSetExtension1 BuildPartial() {
+        self::TestMessageSetExtension1 returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMessageSetExtension1) {
+          return MergeFrom((self::TestMessageSetExtension1) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> MergeFrom(self::TestMessageSetExtension1 other) {
+        if (other == self::TestMessageSetExtension1.DefaultInstance) return this;
+        if (other.HasI) {
+          I = other.I;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 120: {
+              I = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 i = 15;
+      public bool HasI {
+        get { return result.HasI; }
+      }
+      public int I {
+        get { return result.I; }
+        set { SetI(value); }
+      }
+      public Builder SetI(int value) {
+        result.hasI = true;
+        result.i_ = value;
+        return this;
+      }
+      public Builder ClearI() {
+        result.hasI = false;
+        result.i_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestMessageSetExtension2 : pb::GeneratedMessage<TestMessageSetExtension2, TestMessageSetExtension2.Builder> {
+    // Use TestMessageSetExtension2.CreateBuilder() to construct.
+    private TestMessageSetExtension2() {}
+    
+    private static readonly TestMessageSetExtension2 defaultInstance = new TestMessageSetExtension2();
+    public static TestMessageSetExtension2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMessageSetExtension2 DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension2__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public static readonly pb::GeneratedExtension<self::TestMessageSet, self::TestMessageSetExtension2> MessageSetExtension =
+            pb::GeneratedExtension.CreateExtension<self::TestMessageSet, self::TestMessageSetExtension2>(Descriptor.Extensions[0]);
+    }
+    #endregion
+    
+    // optional string str = 25;
+    private bool hasStr;
+    private string str_ = "";
+    public bool HasStr {
+      get { return hasStr; }
+    }
+    public string Str {
+      get { return str_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasStr) {
+        output.WriteString(25, Str);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasStr) {
+          size += pb::CodedOutputStream.ComputeStringSize(25, Str);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMessageSetExtension2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMessageSetExtension2> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMessageSetExtension2 prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMessageSetExtension2, Builder> {
+      // Construct using self::TestMessageSetExtension2.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMessageSetExtension2 result = new self::TestMessageSetExtension2();
+      
+      protected override self::TestMessageSetExtension2 MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> Clear() {
+        result = new self::TestMessageSetExtension2();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMessageSetExtension2.Descriptor; }
+      }
+      
+      public override self::TestMessageSetExtension2 DefaultInstanceForType {
+        get { return self::TestMessageSetExtension2.DefaultInstance; }
+      }
+      
+      public override self::TestMessageSetExtension2 BuildPartial() {
+        self::TestMessageSetExtension2 returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMessageSetExtension2) {
+          return MergeFrom((self::TestMessageSetExtension2) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> MergeFrom(self::TestMessageSetExtension2 other) {
+        if (other == self::TestMessageSetExtension2.DefaultInstance) return this;
+        if (other.HasStr) {
+          Str = other.Str;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 202: {
+              Str = input.ReadString();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional string str = 25;
+      public bool HasStr {
+        get { return result.HasStr; }
+      }
+      public string Str {
+        get { return result.Str; }
+        set { SetStr(value); }
+      }
+      public Builder SetStr(string value) {
+        result.hasStr = true;
+        result.str_ = value;
+        return this;
+      }
+      public Builder ClearStr() {
+        result.hasStr = false;
+        result.str_ = "";
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class RawMessageSet : pb::GeneratedMessage<RawMessageSet, RawMessageSet.Builder> {
+    // Use RawMessageSet.CreateBuilder() to construct.
+    private RawMessageSet() {}
+    
+    private static readonly RawMessageSet defaultInstance = new RawMessageSet();
+    public static RawMessageSet DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override RawMessageSet DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public sealed partial class Item : pb::GeneratedMessage<Item, Item.Builder> {
+        // Use Item.CreateBuilder() to construct.
+        private Item() {}
+        
+        private static readonly Item defaultInstance = new Item();
+        public static Item DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Item DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet_Item__FieldAccessorTable; }
+        }
+        
+        // required int32 type_id = 2;
+        private bool hasTypeId;
+        private int typeId_ = 0;
+        public bool HasTypeId {
+          get { return hasTypeId; }
+        }
+        public int TypeId {
+          get { return typeId_; }
+        }
+        
+        // required bytes message = 3;
+        private bool hasMessage;
+        private pb::ByteString message_ = pb::ByteString.Empty;
+        public bool HasMessage {
+          get { return hasMessage; }
+        }
+        public pb::ByteString Message {
+          get { return message_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasTypeId) return false;
+            if (!hasMessage) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasTypeId) {
+            output.WriteInt32(2, TypeId);
+          }
+          if (HasMessage) {
+            output.WriteBytes(3, Message);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasTypeId) {
+              size += pb::CodedOutputStream.ComputeInt32Size(2, TypeId);
+            }
+            if (HasMessage) {
+              size += pb::CodedOutputStream.ComputeBytesSize(3, Message);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::RawMessageSet.Types.Item ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::RawMessageSet.Types.Item> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::RawMessageSet.Types.Item prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::RawMessageSet.Types.Item, Builder> {
+          // Construct using self::RawMessageSet.Types.Item.CreateBuilder()
+          internal Builder() {}
+          
+          self::RawMessageSet.Types.Item result = new self::RawMessageSet.Types.Item();
+          
+          protected override self::RawMessageSet.Types.Item MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> Clear() {
+            result = new self::RawMessageSet.Types.Item();
+            return this;
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::RawMessageSet.Types.Item.Descriptor; }
+          }
+          
+          public override self::RawMessageSet.Types.Item DefaultInstanceForType {
+            get { return self::RawMessageSet.Types.Item.DefaultInstance; }
+          }
+          
+          public override self::RawMessageSet.Types.Item BuildPartial() {
+            self::RawMessageSet.Types.Item returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::RawMessageSet.Types.Item) {
+              return MergeFrom((self::RawMessageSet.Types.Item) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> MergeFrom(self::RawMessageSet.Types.Item other) {
+            if (other == self::RawMessageSet.Types.Item.DefaultInstance) return this;
+            if (other.HasTypeId) {
+              TypeId = other.TypeId;
+            }
+            if (other.HasMessage) {
+              Message = other.Message;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 16: {
+                  TypeId = input.ReadInt32();
+                  break;
+                }
+                case 26: {
+                  Message = input.ReadBytes();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // required int32 type_id = 2;
+          public bool HasTypeId {
+            get { return result.HasTypeId; }
+          }
+          public int TypeId {
+            get { return result.TypeId; }
+            set { SetTypeId(value); }
+          }
+          public Builder SetTypeId(int value) {
+            result.hasTypeId = true;
+            result.typeId_ = value;
+            return this;
+          }
+          public Builder ClearTypeId() {
+            result.hasTypeId = false;
+            result.typeId_ = 0;
+            return this;
+          }
+          
+          // required bytes message = 3;
+          public bool HasMessage {
+            get { return result.HasMessage; }
+          }
+          public pb::ByteString Message {
+            get { return result.Message; }
+            set { SetMessage(value); }
+          }
+          public Builder SetMessage(pb::ByteString value) {
+            result.hasMessage = true;
+            result.message_ = value;
+            return this;
+          }
+          public Builder ClearMessage() {
+            result.hasMessage = false;
+            result.message_ = pb::ByteString.Empty;
+            return this;
+          }
+        }
+      }
+      
+    }
+    #endregion
+    
+    // repeated group Item = 1 {
+    private scg::IList<self::RawMessageSet.Types.Item> item_ = pbc::Lists<self::RawMessageSet.Types.Item>.Empty;
+    public scg::IList<self::RawMessageSet.Types.Item> ItemList {
+      get { return item_; } 
+    }
+    public int ItemCount
+      { get { return item_.Count; }
+    }
+    public self::RawMessageSet.Types.Item GetItem(int index) {
+      return item_ [index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        foreach (self::RawMessageSet.Types.Item element in ItemList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      foreach (self::RawMessageSet.Types.Item element in ItemList) {
+        output.WriteGroup(1, element);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        foreach (self::RawMessageSet.Types.Item element in ItemList) {
+          size += pb::CodedOutputStream.ComputeGroupSize(1, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::RawMessageSet ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::RawMessageSet parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::RawMessageSet> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::RawMessageSet prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::RawMessageSet, Builder> {
+      // Construct using self::RawMessageSet.CreateBuilder()
+      internal Builder() {}
+      
+      self::RawMessageSet result = new self::RawMessageSet();
+      
+      protected override self::RawMessageSet MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::RawMessageSet> Clear() {
+        result = new self::RawMessageSet();
+        return this;
+      }
+      
+      public override IBuilder<self::RawMessageSet> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::RawMessageSet.Descriptor; }
+      }
+      
+      public override self::RawMessageSet DefaultInstanceForType {
+        get { return self::RawMessageSet.DefaultInstance; }
+      }
+      
+      public override self::RawMessageSet BuildPartial() {
+        if (result.item_ != pbc::Lists<self::RawMessageSet.Types.Item>.Empty) {
+          result.item_ = pbc::Lists<self::RawMessageSet.Types.Item>.AsReadOnly(result.item_);
+        }
+        self::RawMessageSet returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::RawMessageSet) {
+          return MergeFrom((self::RawMessageSet) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::RawMessageSet> MergeFrom(self::RawMessageSet other) {
+        if (other == self::RawMessageSet.DefaultInstance) return this;
+        if (other.item_.Count != 0) {
+          if (result.item_.Count == 0) {
+            result.item_ = new scg::List<self::RawMessageSet.Types.Item>();
+          }
+          base.AddRange(other.item_, result.item_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::RawMessageSet> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::RawMessageSet> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 11: {
+              self::RawMessageSet.Types.Item.Builder subBuilder = self::RawMessageSet.Types.Item.CreateBuilder();
+              input.ReadGroup(1, subBuilder, extensionRegistry);
+              AddItem(subBuilder.BuildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // repeated group Item = 1 {
+      public scg::IList<self::RawMessageSet.Types.Item> ItemList {
+        get { return pbc::Lists.AsReadOnly(result.item_); }
+      }
+      public int ItemCount {
+        get { return result.ItemCount; }
+      }
+      public self::RawMessageSet.Types.Item GetItem(int index) {
+        return result.GetItem(index);
+      }
+      public Builder SetItem(int index, self::RawMessageSet.Types.Item value) {
+        result.item_[index] = value;
+        return this;
+      }
+      public Builder SetItem(int index, self::RawMessageSet.Types.Item.Builder builderForValue) {
+        result.item_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddItem(self::RawMessageSet.Types.Item value) {
+        if (result.item_ == pbc::Lists<self::RawMessageSet.Types.Item>.Empty) {
+          result.item_ = new scg::List<self::RawMessageSet.Types.Item>();
+        }
+        result.item_.Add(value);
+        return this;
+      }
+      public Builder AddItem(self::RawMessageSet.Types.Item.Builder builderForValue) {
+        if (result.item_ == pbc::Lists<self::RawMessageSet.Types.Item>.Empty) {
+          result.item_ = new scg::List<self::RawMessageSet.Types.Item>();
+        }
+        result.item_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeItem(scg::IEnumerable<self::RawMessageSet.Types.Item> values) {
+        if (result.item_ == pbc::Lists<self::RawMessageSet.Types.Item>.Empty) {
+          result.item_ = new scg::List<self::RawMessageSet.Types.Item>();
+        }
+        base.AddRange(values, result.item_);
+        return this;
+      }
+      public Builder ClearItem() {
+        result.item_ = pbc::Lists<self::RawMessageSet.Types.Item>.Empty;
+        return this;
+      }
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  #endregion
+}

+ 243 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs

@@ -0,0 +1,243 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestOptimizeForProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x2b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x01, 0x0a, 
+            0x14, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x53, 0x69, 0x7a, 
+            0x65, 0x12, 0x09, 0x0a, 0x01, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x2e, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 
+            0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x32, 0x40, 0x0a, 0x0e, 0x74, 0x65, 0x73, 0x74, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 
+            0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0xd2, 0x09, 0x20, 0x01, 0x28, 0x05, 0x42, 0x45, 0x48, 
+            0x02, 0xc2, 0x3e, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 
+            0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x1c, 
+            0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x50, 
+            0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 
+        }, new pbd::FileDescriptor[] {
+                self::UnitTestProtoFile.Descriptor,
+        });
+    #endregion
+    
+    #region Extensions
+    /**/
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestOptimizedForSize__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor,
+            new string[] { "I", "Msg", },
+            typeof (self::TestOptimizedForSize),
+            typeof (self::TestOptimizedForSize.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  #endregion
+  
+  #region Messages
+  public sealed partial class TestOptimizedForSize : pb::ExtendableMessage<TestOptimizedForSize, TestOptimizedForSize.Builder> {
+    // Use TestOptimizedForSize.CreateBuilder() to construct.
+    private TestOptimizedForSize() {}
+    
+    private static readonly TestOptimizedForSize defaultInstance = new TestOptimizedForSize();
+    public static TestOptimizedForSize DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestOptimizedForSize DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestOptimizeForProtoFile.internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestOptimizeForProtoFile.internal__static_protobuf_unittest_TestOptimizedForSize__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public static readonly pb::GeneratedExtension<self::TestOptimizedForSize, int> TestExtension =
+            pb::GeneratedExtension.CreateExtension<self::TestOptimizedForSize, int>(Descriptor.Extensions[0]);
+    }
+    #endregion
+    
+    // optional int32 i = 1;
+    private bool hasI;
+    private int i_ = 0;
+    public bool HasI {
+      get { return hasI; }
+    }
+    public int I {
+      get { return i_; }
+    }
+    
+    // optional .protobuf_unittest.ForeignMessage msg = 19;
+    private bool hasMsg;
+    private self::ForeignMessage msg_ = self::ForeignMessage.DefaultInstance;
+    public bool HasMsg {
+      get { return hasMsg; }
+    }
+    public self::ForeignMessage Msg {
+      get { return msg_; }
+    }
+    
+    public static self::TestOptimizedForSize ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestOptimizedForSize parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestOptimizedForSize> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestOptimizedForSize prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestOptimizedForSize, self::TestOptimizedForSize.Builder>.ExtendableBuilder {
+      // Construct using self::TestOptimizedForSize.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestOptimizedForSize result = new self::TestOptimizedForSize();
+      
+      protected override self::TestOptimizedForSize MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestOptimizedForSize> Clear() {
+        result = new self::TestOptimizedForSize();
+        return this;
+      }
+      
+      public override IBuilder<self::TestOptimizedForSize> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestOptimizedForSize.Descriptor; }
+      }
+      
+      public override self::TestOptimizedForSize DefaultInstanceForType {
+        get { return self::TestOptimizedForSize.DefaultInstance; }
+      }
+      
+      public override self::TestOptimizedForSize BuildPartial() {
+        self::TestOptimizedForSize returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      
+      // optional int32 i = 1;
+      public bool HasI {
+        get { return result.HasI; }
+      }
+      public int I {
+        get { return result.I; }
+        set { SetI(value); }
+      }
+      public Builder SetI(int value) {
+        result.hasI = true;
+        result.i_ = value;
+        return this;
+      }
+      public Builder ClearI() {
+        result.hasI = false;
+        result.i_ = 0;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignMessage msg = 19;
+      public bool HasMsg {
+        get { return result.HasMsg; }
+      }
+      public self::ForeignMessage Msg {
+        get { return result.Msg; }
+        set { SetMsg(value); }
+      }
+      public Builder SetMsg(self::ForeignMessage value) {
+        result.hasMsg = true;
+        result.msg_ = value;
+        return this;
+      }
+      public Builder SetMsg(self::ForeignMessage.Builder builderForValue) {
+        result.hasMsg = true;
+        result.msg_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMsg(self::ForeignMessage value) {
+        if (result.HasMsg &&
+            result.msg_ != self::ForeignMessage.DefaultInstance) {
+          result.msg_ =
+            self::ForeignMessage.CreateBuilder(result.msg_).MergeFrom(value).BuildPartial();
+        } else {
+          result.msg_ = value;
+        }
+        result.hasMsg = true;
+        return this;
+      }
+      public Builder ClearMsg() {
+        result.hasMsg = false;
+        result.msg_ = self::ForeignMessage.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  #endregion
+}

+ 13140 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs

@@ -0,0 +1,13140 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 
+            0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x15, 0x0a, 0x0c, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 
+            0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x16, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 
+            0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 
+            0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 
+            0x04, 0x20, 0x01, 0x28, 0x04, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x69, 
+            0x6e, 0x74, 0x33, 0x32, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 
+            0x61, 0x6c, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x06, 0x20, 0x01, 0x28, 0x12, 0x12, 0x18, 0x0a, 0x10, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x07, 0x20, 0x01, 0x28, 
+            0x07, 0x12, 0x18, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 
+            0x34, 0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x12, 0x19, 0x0a, 0x11, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 
+            0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0f, 0x12, 0x19, 0x0a, 0x11, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x0a, 0x20, 0x01, 0x28, 
+            0x10, 0x12, 0x16, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 
+            0x0b, 0x20, 0x01, 0x28, 0x02, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 
+            0x75, 0x62, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x12, 0x15, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 
+            0x61, 0x6c, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x12, 0x16, 
+            0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 
+            0x28, 0x0c, 0x12, 0x44, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 
+            0x10, 0x20, 0x01, 0x28, 0x0a, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x4e, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 
+            0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 
+            0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 
+            0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x18, 0x6f, 0x70, 0x74, 0x69, 
+            0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 
+            0x65, 0x12, 0x48, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 
+            0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 
+            0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x48, 0x0a, 0x14, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 
+            0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 
+            0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3d, 0x0a, 0x15, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 
+            0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x42, 0x0a, 0x14, 0x6f, 0x70, 0x74, 0x69, 
+            0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x17, 0x20, 0x01, 
+            0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 
+            0x12, 0x21, 0x0a, 0x15, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 
+            0x70, 0x69, 0x65, 0x63, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x12, 0x19, 0x0a, 0x0d, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 
+            0x08, 0x01, 0x12, 0x16, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 
+            0x18, 0x1f, 0x20, 0x03, 0x28, 0x05, 0x12, 0x16, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 
+            0x6e, 0x74, 0x36, 0x34, 0x18, 0x20, 0x20, 0x03, 0x28, 0x03, 0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0d, 0x12, 0x17, 0x0a, 0x0f, 0x72, 
+            0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x22, 0x20, 0x03, 0x28, 0x04, 
+            0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 
+            0x23, 0x20, 0x03, 0x28, 0x11, 0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 
+            0x6e, 0x74, 0x36, 0x34, 0x18, 0x24, 0x20, 0x03, 0x28, 0x12, 0x12, 0x18, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x25, 0x20, 0x03, 0x28, 0x07, 0x12, 0x18, 0x0a, 0x10, 
+            0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x26, 0x20, 0x03, 
+            0x28, 0x06, 0x12, 0x19, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 
+            0x64, 0x33, 0x32, 0x18, 0x27, 0x20, 0x03, 0x28, 0x0f, 0x12, 0x19, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 
+            0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x28, 0x20, 0x03, 0x28, 0x10, 0x12, 0x16, 0x0a, 0x0e, 
+            0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x29, 0x20, 0x03, 0x28, 0x02, 
+            0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 
+            0x2a, 0x20, 0x03, 0x28, 0x01, 0x12, 0x15, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6f, 
+            0x6f, 0x6c, 0x18, 0x2b, 0x20, 0x03, 0x28, 0x08, 0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 
+            0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x2c, 0x20, 0x03, 0x28, 0x09, 0x12, 0x16, 0x0a, 0x0e, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x2d, 0x20, 0x03, 0x28, 0x0c, 0x12, 0x44, 0x0a, 
+            0x0d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x2e, 0x20, 0x03, 0x28, 0x0a, 
+            0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x4e, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x30, 0x20, 0x03, 0x28, 0x0b, 
+            0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 
+            0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x18, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x31, 0x20, 0x03, 0x28, 
+            0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x48, 0x0a, 0x17, 
+            0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 
+            0x61, 0x67, 0x65, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 
+            0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x48, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 
+            0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 
+            0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3d, 0x0a, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 
+            0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x34, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 
+            0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x42, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x35, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x24, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 
+            0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x21, 0x0a, 0x15, 0x72, 
+            0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 
+            0x18, 0x36, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x12, 0x19, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x37, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x01, 0x12, 0x19, 0x0a, 
+            0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x05, 
+            0x3a, 0x02, 0x34, 0x31, 0x12, 0x19, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 
+            0x34, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x02, 0x34, 0x32, 0x12, 0x1a, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 
+            0x6c, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x02, 0x34, 0x33, 0x12, 
+            0x1a, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x40, 0x20, 
+            0x01, 0x28, 0x04, 0x3a, 0x02, 0x34, 0x34, 0x12, 0x1b, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 
+            0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x41, 0x20, 0x01, 0x28, 0x11, 0x3a, 0x03, 0x2d, 0x34, 0x35, 0x12, 0x1a, 0x0a, 0x0e, 
+            0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x42, 0x20, 0x01, 0x28, 0x12, 
+            0x3a, 0x02, 0x34, 0x36, 0x12, 0x1b, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 
+            0x64, 0x33, 0x32, 0x18, 0x43, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x02, 0x34, 0x37, 0x12, 0x1b, 0x0a, 0x0f, 0x64, 0x65, 0x66, 
+            0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x44, 0x20, 0x01, 0x28, 0x06, 0x3a, 0x02, 
+            0x34, 0x38, 0x12, 0x1c, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 
+            0x33, 0x32, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x34, 0x39, 0x12, 0x1d, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 
+            0x75, 0x6c, 0x74, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x46, 0x20, 0x01, 0x28, 0x10, 0x3a, 0x03, 
+            0x2d, 0x35, 0x30, 0x12, 0x1b, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 
+            0x18, 0x47, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x35, 0x31, 0x2e, 0x35, 0x12, 0x1d, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 
+            0x75, 0x6c, 0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, 0x01, 0x3a, 0x05, 0x35, 0x32, 
+            0x30, 0x30, 0x30, 0x12, 0x1a, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 
+            0x49, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 
+            0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x05, 0x68, 0x65, 0x6c, 
+            0x6c, 0x6f, 0x12, 0x1c, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 
+            0x4b, 0x20, 0x01, 0x28, 0x0c, 0x3a, 0x05, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x12, 0x4c, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 
+            0x75, 0x6c, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x51, 0x20, 0x01, 0x28, 
+            0x0e, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 
+            0x64, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x03, 0x42, 0x41, 0x52, 0x12, 0x49, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 
+            0x74, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0e, 
+            0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0b, 0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 
+            0x4e, 0x5f, 0x42, 0x41, 0x52, 0x12, 0x4d, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 0x6d, 0x70, 
+            0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 
+            0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 
+            0x5f, 0x42, 0x41, 0x52, 0x12, 0x25, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 
+            0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x03, 0x61, 0x62, 0x63, 0x42, 
+            0x02, 0x08, 0x02, 0x12, 0x1d, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x72, 0x64, 0x18, 
+            0x55, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x03, 0x31, 0x32, 0x33, 0x42, 0x02, 0x08, 0x01, 0x1a, 0x1b, 0x0a, 0x0d, 0x4e, 0x65, 
+            0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0a, 0x0a, 0x02, 0x62, 0x62, 0x18, 0x01, 0x20, 
+            0x01, 0x28, 0x05, 0x1a, 0x1a, 0x0a, 0x0d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 
+            0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x1a, 0x1a, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x65, 0x61, 
+            0x74, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x05, 0x22, 
+            0x27, 0x0a, 0x0a, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x4f, 0x4f, 
+            0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x42, 0x41, 0x52, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x42, 0x41, 0x5a, 0x10, 0x03, 
+            0x22, 0x1b, 0x0a, 0x0e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x09, 
+            0x0a, 0x01, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x22, 0x1d, 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2a, 0x08, 0x08, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 
+            0x22, 0x24, 0x0a, 0x17, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x22, 0x24, 
+            0x0a, 0x17, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x05, 0x22, 0xd5, 0x05, 0x0a, 
+            0x0c, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x01, 
+            0x20, 0x02, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 
+            0x12, 0x09, 0x0a, 0x01, 0x62, 0x18, 0x03, 0x20, 0x02, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 
+            0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x35, 0x18, 0x05, 0x20, 
+            0x01, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x12, 
+            0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x37, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 
+            0x75, 0x6d, 0x6d, 0x79, 0x38, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 
+            0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x30, 0x18, 0x0a, 
+            0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x31, 0x18, 0x0b, 0x20, 0x01, 0x28, 
+            0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x32, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 
+            0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x33, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 
+            0x75, 0x6d, 0x6d, 0x79, 0x31, 0x34, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 
+            0x79, 0x31, 0x35, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x36, 
+            0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x37, 0x18, 0x11, 0x20, 
+            0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x38, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 
+            0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x39, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 
+            0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x30, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 
+            0x6d, 0x6d, 0x79, 0x32, 0x31, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 
+            0x32, 0x32, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x33, 0x18, 
+            0x17, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x34, 0x18, 0x18, 0x20, 0x01, 
+            0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x35, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x12, 
+            0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x36, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 
+            0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x37, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 
+            0x6d, 0x79, 0x32, 0x38, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 
+            0x39, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x33, 0x30, 0x18, 0x1e, 
+            0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x33, 0x31, 0x18, 0x1f, 0x20, 0x01, 0x28, 
+            0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x33, 0x32, 0x18, 0x20, 0x20, 0x01, 0x28, 0x05, 0x12, 0x09, 
+            0x0a, 0x01, 0x63, 0x18, 0x21, 0x20, 0x02, 0x28, 0x05, 0x32, 0x56, 0x0a, 0x06, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe8, 0x07, 
+            0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x32, 0x55, 0x0a, 
+            0x05, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 
+            0x69, 0x72, 0x65, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x13, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 
+            0x64, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x12, 0x39, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 
+            0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 
+            0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 
+            0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x0d, 0x0a, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 
+            0x05, 0x22, 0x5a, 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4e, 0x65, 0x73, 0x74, 
+            0x65, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 
+            0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 
+            0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x54, 0x65, 0x73, 
+            0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2a, 0x0a, 0x1e, 0x54, 0x65, 0x73, 
+            0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x57, 0x69, 0x74, 0x68, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2a, 0x08, 0x08, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x34, 0x0a, 
+            0x18, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x54, 0x61, 0x67, 0x4e, 
+            0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0d, 0x0a, 0x02, 
+            0x62, 0x62, 0x18, 0xff, 0xff, 0xff, 0x7f, 0x20, 0x01, 0x28, 0x05, 0x22, 0x55, 0x0a, 0x14, 0x54, 0x65, 0x73, 0x74, 0x52, 
+            0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x01, 0x61, 
+            0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 
+            0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x09, 0x0a, 0x01, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x22, 0x4b, 
+            0x0a, 0x14, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 
+            0x6e, 0x41, 0x12, 0x33, 0x0a, 0x02, 0x62, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 
+            0x75, 0x74, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x22, 0x62, 0x0a, 0x14, 0x54, 
+            0x65, 0x73, 0x74, 0x4d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x12, 
+            0x32, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x75, 0x74, 0x75, 0x61, 
+            0x6c, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x12, 0x16, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 
+            0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x22, 0xb3, 0x01, 0x0a, 0x12, 
+            0x54, 0x65, 0x73, 0x74, 0x44, 0x75, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x09, 
+            0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x36, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x02, 0x20, 0x01, 
+            0x28, 0x0a, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x44, 0x75, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 
+            0x72, 0x2e, 0x46, 0x6f, 0x6f, 0x12, 0x36, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0a, 0x32, 0x29, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x44, 0x75, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x42, 0x61, 
+            0x72, 0x1a, 0x10, 0x0a, 0x03, 0x46, 0x6f, 0x6f, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x1a, 
+            0x10, 0x0a, 0x03, 0x42, 0x61, 0x72, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x22, 0x80, 0x02, 
+            0x0a, 0x18, 0x54, 0x65, 0x73, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 
+            0x61, 0x73, 0x42, 0x69, 0x74, 0x73, 0x12, 0x5a, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 
+            0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 
+            0x39, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x61, 0x73, 
+            0x42, 0x69, 0x74, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x87, 
+            0x01, 0x0a, 0x0d, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x1c, 
+            0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x12, 0x50, 0x0a, 0x25, 0x6e, 0x65, 
+            0x73, 0x74, 0x65, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 
+            0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 
+            0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xe5, 0x03, 0x0a, 
+            0x17, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x6d, 0x65, 0x6c, 0x43, 0x61, 0x73, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 
+            0x61, 0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x0e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x46, 0x69, 0x65, 
+            0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x13, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 
+            0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x31, 0x0a, 0x09, 0x45, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 
+            0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 
+            0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 
+            0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 
+            0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 
+            0x10, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x69, 0x65, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 
+            0x01, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x12, 0x15, 0x0a, 0x09, 0x43, 0x6f, 0x72, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 
+            0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x08, 0x01, 0x12, 0x1e, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x03, 
+            0x28, 0x05, 0x12, 0x1b, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 
+            0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x12, 0x39, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x65, 0x61, 
+            0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 
+            0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3f, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 
+            0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x18, 0x52, 
+            0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x69, 0x65, 0x63, 0x65, 0x46, 0x69, 
+            0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x12, 0x1d, 0x0a, 0x11, 0x52, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x72, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 
+            0x42, 0x02, 0x08, 0x01, 0x22, 0x55, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x72, 0x64, 
+            0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x11, 0x0a, 0x09, 0x6d, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 
+            0x0b, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0e, 0x0a, 0x06, 0x6d, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 
+            0x03, 0x12, 0x10, 0x0a, 0x08, 0x6d, 0x79, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x02, 0x2a, 
+            0x04, 0x08, 0x02, 0x10, 0x0b, 0x2a, 0x04, 0x08, 0x0c, 0x10, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x18, 0x54, 0x65, 0x73, 0x74, 
+            0x45, 0x78, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 
+            0x12, 0x3f, 0x0a, 0x0d, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 
+            0x01, 0x28, 0x0c, 0x3a, 0x28, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x30, 0x30, 0x31, 0x5c, 0x30, 0x30, 0x37, 0x5c, 0x30, 0x31, 
+            0x30, 0x5c, 0x30, 0x31, 0x34, 0x5c, 0x6e, 0x5c, 0x72, 0x5c, 0x74, 0x5c, 0x30, 0x31, 0x33, 0x5c, 0x5c, 0x5c, 0x27, 0x5c, 
+            0x22, 0x5c, 0x33, 0x37, 0x36, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 
+            0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x0a, 0x34, 0x32, 0x39, 0x34, 0x39, 0x36, 0x37, 0x32, 0x39, 0x35, 0x12, 
+            0x2a, 0x0a, 0x0c, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x03, 0x20, 0x01, 0x28, 
+            0x04, 0x3a, 0x14, 0x31, 0x38, 0x34, 0x34, 0x36, 0x37, 0x34, 0x34, 0x30, 0x37, 0x33, 0x37, 0x30, 0x39, 0x35, 0x35, 0x31, 
+            0x36, 0x31, 0x35, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x04, 
+            0x20, 0x01, 0x28, 0x05, 0x3a, 0x0b, 0x2d, 0x32, 0x31, 0x34, 0x37, 0x34, 0x38, 0x33, 0x36, 0x34, 0x37, 0x12, 0x29, 0x0a, 
+            0x0b, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x14, 
+            0x2d, 0x39, 0x32, 0x32, 0x33, 0x33, 0x37, 0x32, 0x30, 0x33, 0x36, 0x38, 0x35, 0x34, 0x37, 0x37, 0x35, 0x38, 0x30, 0x37, 
+            0x12, 0x18, 0x0a, 0x0b, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 
+            0x09, 0x3a, 0x03, 0xe1, 0x88, 0xb4, 0x22, 0x0c, 0x0a, 0x0a, 0x46, 0x6f, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 
+            0x22, 0x0d, 0x0a, 0x0b, 0x46, 0x6f, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x0a, 0x0a, 0x42, 
+            0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0d, 0x0a, 0x0b, 0x42, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 
+            0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x40, 0x0a, 0x0b, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 
+            0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, 0x5f, 0x46, 0x4f, 0x4f, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 
+            0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, 0x5f, 0x42, 0x41, 0x52, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 
+            0x45, 0x49, 0x47, 0x4e, 0x5f, 0x42, 0x41, 0x5a, 0x10, 0x06, 0x2a, 0x47, 0x0a, 0x14, 0x54, 0x65, 0x73, 0x74, 0x45, 0x6e, 
+            0x75, 0x6d, 0x57, 0x69, 0x74, 0x68, 0x44, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x4f, 
+            0x4f, 0x31, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x41, 0x52, 0x31, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x42, 0x41, 
+            0x5a, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x4f, 0x4f, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x41, 0x52, 
+            0x32, 0x10, 0x02, 0x2a, 0x89, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x72, 0x73, 0x65, 0x45, 0x6e, 
+            0x75, 0x6d, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x41, 0x10, 0x7b, 0x12, 0x0e, 0x0a, 0x08, 
+            0x53, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x42, 0x10, 0xa6, 0xe7, 0x03, 0x12, 0x0f, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 
+            0x53, 0x45, 0x5f, 0x43, 0x10, 0xb2, 0xb1, 0x80, 0x06, 0x12, 0x15, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 
+            0x44, 0x10, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x15, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 
+            0x53, 0x45, 0x5f, 0x45, 0x10, 0xb4, 0xde, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x53, 
+            0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x46, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 
+            0x47, 0x10, 0x02, 0x32, 0x99, 0x01, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 
+            0x44, 0x0a, 0x03, 0x46, 0x6f, 0x6f, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 
+            0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x03, 0x42, 0x61, 0x72, 0x12, 0x1d, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x72, 
+            0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 
+            0x46, 0x0a, 0x18, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x46, 0x0a, 0x18, 0x6f, 0x70, 0x74, 0x69, 0x6f, 
+            0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 
+            0x01, 0x28, 0x03, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x69, 0x6e, 0x74, 
+            0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
+            0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x47, 0x0a, 0x19, 
+            0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 
+            0x28, 0x11, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 
+            0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x12, 0x3a, 0x48, 0x0a, 0x1a, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x48, 0x0a, 0x1a, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 
+            0x01, 0x28, 0x06, 0x3a, 0x49, 0x0a, 0x1b, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x66, 0x69, 0x78, 
+            0x65, 0x64, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x49, 
+            0x0a, 0x1b, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x10, 0x3a, 0x46, 0x0a, 0x18, 0x6f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 
+            0x0b, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 
+            0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x3a, 0x45, 
+            0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x01, 
+            0x28, 0x09, 0x3a, 0x46, 0x0a, 0x18, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 
+            0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x3a, 0x71, 0x0a, 0x17, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 
+            0x10, 0x20, 0x01, 0x28, 0x0a, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x21, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 
+            0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x73, 0x0a, 
+            0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 
+            0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x78, 0x0a, 0x21, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 
+            0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 
+            0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x78, 0x0a, 0x1e, 
+            0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 
+            0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x6d, 
+            0x0a, 0x1f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 
+            0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 
+            0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 
+            0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x72, 0x0a, 0x1e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 
+            0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 
+            0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x51, 0x0a, 0x1f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 
+            0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x18, 
+            0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x3a, 0x49, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 
+            0x5f, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x42, 
+            0x02, 0x08, 0x01, 0x3a, 0x46, 0x0a, 0x18, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 
+            0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x05, 0x3a, 0x46, 0x0a, 0x18, 0x72, 
+            0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 
+            0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x73, 0x18, 0x20, 0x20, 0x03, 0x28, 0x03, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 
+            0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0d, 
+            0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x22, 0x20, 0x03, 0x28, 0x04, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 
+            0x18, 0x23, 0x20, 0x03, 0x28, 0x11, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 
+            0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x24, 0x20, 0x03, 0x28, 0x12, 0x3a, 
+            0x48, 0x0a, 0x1a, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x25, 0x20, 0x03, 0x28, 0x07, 0x3a, 0x48, 0x0a, 0x1a, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 
+            0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x73, 0x18, 0x26, 0x20, 0x03, 0x28, 0x06, 0x3a, 0x49, 0x0a, 0x1b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x27, 0x20, 0x03, 
+            0x28, 0x0f, 0x3a, 0x49, 0x0a, 0x1b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 
+            0x64, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 
+            0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x28, 0x20, 0x03, 0x28, 0x10, 0x3a, 0x46, 0x0a, 
+            0x18, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x29, 0x20, 0x03, 0x28, 0x02, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 
+            0x64, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2a, 0x20, 0x03, 
+            0x28, 0x01, 0x3a, 0x45, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2b, 0x20, 0x03, 0x28, 0x08, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 
+            0x18, 0x2c, 0x20, 0x03, 0x28, 0x09, 0x3a, 0x46, 0x0a, 0x18, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 
+            0x79, 0x74, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2d, 0x20, 0x03, 0x28, 0x0c, 0x3a, 0x71, 
+            0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x2e, 0x20, 0x03, 0x28, 0x0a, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x47, 0x72, 
+            0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x21, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x30, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 
+            0x65, 0x3a, 0x73, 0x0a, 0x22, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 
+            0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x31, 0x20, 
+            0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 
+            0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x78, 
+            0x0a, 0x21, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x65, 
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 
+            0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 
+            0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x3a, 0x78, 0x0a, 0x1e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 
+            0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2a, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 
+            0x75, 0x6d, 0x3a, 0x6d, 0x0a, 0x1f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 
+            0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 
+            0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x34, 0x20, 0x03, 0x28, 
+            0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x72, 0x0a, 0x1e, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x35, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 
+            0x6d, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x51, 0x0a, 0x1f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 
+            0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x73, 0x18, 0x36, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x3a, 0x49, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 
+            0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x37, 0x20, 
+            0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x01, 0x3a, 0x49, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 
+            0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 
+            0x34, 0x31, 0x3a, 0x49, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x02, 0x34, 0x32, 0x3a, 0x4a, 0x0a, 
+            0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x02, 0x34, 0x33, 0x3a, 0x4a, 0x0a, 0x18, 0x64, 0x65, 0x66, 
+            0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 
+            0x40, 0x20, 0x01, 0x28, 0x04, 0x3a, 0x02, 0x34, 0x34, 0x3a, 0x4b, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 
+            0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 
+            0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x41, 0x20, 0x01, 0x28, 
+            0x11, 0x3a, 0x03, 0x2d, 0x34, 0x35, 0x3a, 0x4a, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x69, 
+            0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x42, 0x20, 0x01, 0x28, 0x12, 0x3a, 0x02, 
+            0x34, 0x36, 0x3a, 0x4b, 0x0a, 0x19, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 
+            0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x43, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x02, 0x34, 0x37, 0x3a, 
+            0x4b, 0x0a, 0x19, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x65, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 
+            0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x44, 0x20, 0x01, 0x28, 0x06, 0x3a, 0x02, 0x34, 0x38, 0x3a, 0x4c, 0x0a, 0x1a, 
+            0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x73, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x34, 0x39, 0x3a, 0x4d, 0x0a, 0x1a, 0x64, 0x65, 
+            0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x73, 0x18, 0x46, 0x20, 0x01, 0x28, 0x10, 0x3a, 0x03, 0x2d, 0x35, 0x30, 0x3a, 0x4b, 0x0a, 0x17, 0x64, 0x65, 0x66, 
+            0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x47, 
+            0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x35, 0x31, 0x2e, 0x35, 0x3a, 0x4d, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 
+            0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x48, 0x20, 0x01, 
+            0x28, 0x01, 0x3a, 0x05, 0x35, 0x32, 0x30, 0x30, 0x30, 0x3a, 0x4a, 0x0a, 0x16, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 
+            0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x49, 0x20, 0x01, 0x28, 0x08, 0x3a, 
+            0x04, 0x74, 0x72, 0x75, 0x65, 0x3a, 0x4d, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 
+            0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 
+            0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x05, 0x68, 
+            0x65, 0x6c, 0x6c, 0x6f, 0x3a, 0x4c, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 
+            0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x0c, 0x3a, 0x05, 0x77, 0x6f, 0x72, 
+            0x6c, 0x64, 0x3a, 0x7c, 0x0a, 0x1d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 
+            0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0e, 0x32, 
+            0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 
+            0x6e, 0x75, 0x6d, 0x3a, 0x03, 0x42, 0x41, 0x52, 0x3a, 0x79, 0x0a, 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 
+            0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 
+            0x18, 0x52, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0b, 
+            0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, 0x5f, 0x42, 0x41, 0x52, 0x3a, 0x7d, 0x0a, 0x1d, 0x64, 0x65, 0x66, 0x61, 0x75, 
+            0x6c, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x73, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 
+            0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 
+            0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x41, 0x52, 0x3a, 0x55, 
+            0x0a, 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 
+            0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
+            0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x03, 0x61, 0x62, 
+            0x63, 0x42, 0x02, 0x08, 0x02, 0x3a, 0x4d, 0x0a, 0x16, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x72, 
+            0x64, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x55, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x03, 0x31, 0x32, 0x33, 
+            0x42, 0x02, 0x08, 0x01, 0x3a, 0x42, 0x0a, 0x13, 0x6d, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x72, 0x64, 
+            0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x3f, 0x0a, 0x10, 0x6d, 0x79, 0x5f, 0x65, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
+            0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x65, 
+            0x6c, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x42, 0x49, 0x42, 
+            0x0d, 0x55, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x01, 0xc2, 0x3e, 0x21, 0x47, 
+            0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 
+            0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x11, 0x55, 0x6e, 0x69, 0x74, 0x54, 
+            0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 
+        }, new pbd::FileDescriptor[] {
+                self::UnitTestImportProtoFile.Descriptor,
+        });
+    #endregion
+    
+    #region Extensions
+    /*public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> OptionalInt32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[0]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> OptionalInt64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[1]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, uint> OptionalUint32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[2]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, ulong> OptionalUint64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[3]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> OptionalSint32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[4]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> OptionalSint64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[5]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, uint> OptionalFixed32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[6]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, ulong> OptionalFixed64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[7]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> OptionalSfixed32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[8]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> OptionalSfixed64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[9]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, float> OptionalFloatExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, float>(Descriptor.Extensions[10]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, double> OptionalDoubleExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, double>(Descriptor.Extensions[11]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, bool> OptionalBoolExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, bool>(Descriptor.Extensions[12]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> OptionalStringExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[13]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, pb::ByteString> OptionalBytesExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, pb::ByteString>(Descriptor.Extensions[14]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::OptionalGroup_extension> OptionalGroupExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::OptionalGroup_extension>(Descriptor.Extensions[15]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedMessage> OptionalNestedMessageExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedMessage>(Descriptor.Extensions[16]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ForeignMessage> OptionalForeignMessageExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ForeignMessage>(Descriptor.Extensions[17]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ImportMessage> OptionalImportMessageExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ImportMessage>(Descriptor.Extensions[18]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum> OptionalNestedEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum>(Descriptor.Extensions[19]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ForeignEnum> OptionalForeignEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ForeignEnum>(Descriptor.Extensions[20]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ImportEnum> OptionalImportEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ImportEnum>(Descriptor.Extensions[21]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> OptionalStringPieceExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[22]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> OptionalCordExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[23]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<int>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, int>(Descriptor.Extensions[24]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<long>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, long>(Descriptor.Extensions[25]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<uint>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[26]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<ulong>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[27]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<int>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, int>(Descriptor.Extensions[28]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<long>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, long>(Descriptor.Extensions[29]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<uint>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[30]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<ulong>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[31]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<int>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, int>(Descriptor.Extensions[32]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<long>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, long>(Descriptor.Extensions[33]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<float>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, float>(Descriptor.Extensions[34]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<double>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, double>(Descriptor.Extensions[35]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<bool>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, bool>(Descriptor.Extensions[36]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<string>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, string>(Descriptor.Extensions[37]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<pb::ByteString>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, pb::ByteString>(Descriptor.Extensions[38]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::RepeatedGroup_extension>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::RepeatedGroup_extension>(Descriptor.Extensions[39]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::TestAllTypes.Types.NestedMessage>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedMessage>(Descriptor.Extensions[40]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::ForeignMessage>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::ForeignMessage>(Descriptor.Extensions[41]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::ImportMessage>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::ImportMessage>(Descriptor.Extensions[42]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::TestAllTypes.Types.NestedEnum>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum>(Descriptor.Extensions[43]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::ForeignEnum>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::ForeignEnum>(Descriptor.Extensions[44]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::ImportEnum>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::ImportEnum>(Descriptor.Extensions[45]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<string>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, string>(Descriptor.Extensions[46]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<string>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, string>(Descriptor.Extensions[47]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> DefaultInt32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[48]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> DefaultInt64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[49]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, uint> DefaultUint32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[50]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, ulong> DefaultUint64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[51]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> DefaultSint32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[52]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> DefaultSint64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[53]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, uint> DefaultFixed32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[54]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, ulong> DefaultFixed64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[55]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> DefaultSfixed32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[56]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> DefaultSfixed64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[57]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, float> DefaultFloatExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, float>(Descriptor.Extensions[58]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, double> DefaultDoubleExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, double>(Descriptor.Extensions[59]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, bool> DefaultBoolExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, bool>(Descriptor.Extensions[60]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> DefaultStringExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[61]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, pb::ByteString> DefaultBytesExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, pb::ByteString>(Descriptor.Extensions[62]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum> DefaultNestedEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum>(Descriptor.Extensions[63]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ForeignEnum> DefaultForeignEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ForeignEnum>(Descriptor.Extensions[64]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ImportEnum> DefaultImportEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ImportEnum>(Descriptor.Extensions[65]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> DefaultStringPieceExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[66]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> DefaultCordExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[67]);
+    public static readonly pb::GeneratedExtension<self::TestFieldOrderings, string> MyExtensionString =
+          pb::GeneratedExtension.CreateExtension<self::TestFieldOrderings, string>(Descriptor.Extensions[68]);
+    public static readonly pb::GeneratedExtension<self::TestFieldOrderings, int> MyExtensionInt =
+          pb::GeneratedExtension.CreateExtension<self::TestFieldOrderings, int>(Descriptor.Extensions[69]);
+    */
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes__Descriptor,
+            new string[] { "OptionalInt32", "OptionalInt64", "OptionalUint32", "OptionalUint64", "OptionalSint32", "OptionalSint64", "OptionalFixed32", "OptionalFixed64", "OptionalSfixed32", "OptionalSfixed64", "OptionalFloat", "OptionalDouble", "OptionalBool", "OptionalString", "OptionalBytes", "OptionalGroup", "OptionalNestedMessage", "OptionalForeignMessage", "OptionalImportMessage", "OptionalNestedEnum", "OptionalForeignEnum", "OptionalImportEnum", "OptionalStringPiece", "OptionalCord", "RepeatedInt32", "RepeatedInt64", "RepeatedUint32", "RepeatedUint64", "RepeatedSint32", "RepeatedSint64", "RepeatedFixed32", "RepeatedFixed64", "RepeatedSfixed32", "RepeatedSfixed64", "RepeatedFloat", "RepeatedDouble", "RepeatedBool", "RepeatedString", "RepeatedBytes", "RepeatedGroup", "RepeatedNestedMessage", "RepeatedForeignMessage", "RepeatedImportMessage", "RepeatedNestedEnum", "RepeatedForeignEnum", "RepeatedImportEnum", "RepeatedStringPiece", "RepeatedCord", "DefaultInt32", "DefaultInt64", "DefaultUint32", "DefaultUint64", "DefaultSint32", "DefaultSint64", "DefaultFixed32", "DefaultFixed64", "DefaultSfixed32", "DefaultSfixed64", "DefaultFloat", "DefaultDouble", "DefaultBool", "DefaultString", "DefaultBytes", "DefaultNestedEnum", "DefaultForeignEnum", "DefaultImportEnum", "DefaultStringPiece", "DefaultCord", },
+            typeof (self::TestAllTypes),
+            typeof (self::TestAllTypes.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor 
+        = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor,
+            new string[] { "Bb", },
+            typeof (self::TestAllTypes.Types.NestedMessage),
+            typeof (self::TestAllTypes.Types.NestedMessage.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor 
+        = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[1];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor,
+            new string[] { "A", },
+            typeof (self::TestAllTypes.Types.OptionalGroup),
+            typeof (self::TestAllTypes.Types.OptionalGroup.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor 
+        = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[2];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor,
+            new string[] { "A", },
+            typeof (self::TestAllTypes.Types.RepeatedGroup),
+            typeof (self::TestAllTypes.Types.RepeatedGroup.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_ForeignMessage__Descriptor 
+        = Descriptor.MessageTypes[1];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_ForeignMessage__Descriptor,
+            new string[] { "C", },
+            typeof (self::ForeignMessage),
+            typeof (self::ForeignMessage.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllExtensions__Descriptor 
+        = Descriptor.MessageTypes[2];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllExtensions__Descriptor,
+            new string[] { },
+            typeof (self::TestAllExtensions),
+            typeof (self::TestAllExtensions.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor 
+        = Descriptor.MessageTypes[3];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor,
+            new string[] { "A", },
+            typeof (self::OptionalGroup_extension),
+            typeof (self::OptionalGroup_extension.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor 
+        = Descriptor.MessageTypes[4];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor,
+            new string[] { "A", },
+            typeof (self::RepeatedGroup_extension),
+            typeof (self::RepeatedGroup_extension.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequired__Descriptor 
+        = Descriptor.MessageTypes[5];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRequired__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRequired__Descriptor,
+            new string[] { "A", "Dummy2", "B", "Dummy4", "Dummy5", "Dummy6", "Dummy7", "Dummy8", "Dummy9", "Dummy10", "Dummy11", "Dummy12", "Dummy13", "Dummy14", "Dummy15", "Dummy16", "Dummy17", "Dummy18", "Dummy19", "Dummy20", "Dummy21", "Dummy22", "Dummy23", "Dummy24", "Dummy25", "Dummy26", "Dummy27", "Dummy28", "Dummy29", "Dummy30", "Dummy31", "Dummy32", "C", },
+            typeof (self::TestRequired),
+            typeof (self::TestRequired.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequiredForeign__Descriptor 
+        = Descriptor.MessageTypes[6];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRequiredForeign__Descriptor,
+            new string[] { "OptionalMessage", "RepeatedMessage", "Dummy", },
+            typeof (self::TestRequiredForeign),
+            typeof (self::TestRequiredForeign.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestForeignNested__Descriptor 
+        = Descriptor.MessageTypes[7];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestForeignNested__Descriptor,
+            new string[] { "ForeignNested", },
+            typeof (self::TestForeignNested),
+            typeof (self::TestForeignNested.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessage__Descriptor 
+        = Descriptor.MessageTypes[8];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmptyMessage__Descriptor,
+            new string[] { },
+            typeof (self::TestEmptyMessage),
+            typeof (self::TestEmptyMessage.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor 
+        = Descriptor.MessageTypes[9];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor,
+            new string[] { },
+            typeof (self::TestEmptyMessageWithExtensions),
+            typeof (self::TestEmptyMessageWithExtensions.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor 
+        = Descriptor.MessageTypes[10];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor,
+            new string[] { "A", "Bb", },
+            typeof (self::TestReallyLargeTagNumber),
+            typeof (self::TestReallyLargeTagNumber.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor 
+        = Descriptor.MessageTypes[11];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor,
+            new string[] { "A", "I", },
+            typeof (self::TestRecursiveMessage),
+            typeof (self::TestRecursiveMessage.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor 
+        = Descriptor.MessageTypes[12];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor,
+            new string[] { "Bb", },
+            typeof (self::TestMutualRecursionA),
+            typeof (self::TestMutualRecursionA.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor 
+        = Descriptor.MessageTypes[13];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor,
+            new string[] { "A", "OptionalInt32", },
+            typeof (self::TestMutualRecursionB),
+            typeof (self::TestMutualRecursionB.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor 
+        = Descriptor.MessageTypes[14];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor,
+            new string[] { "A", "Foo", "Bar", },
+            typeof (self::TestDupFieldNumber),
+            typeof (self::TestDupFieldNumber.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor 
+        = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor,
+            new string[] { "A", },
+            typeof (self::TestDupFieldNumber.Types.Foo),
+            typeof (self::TestDupFieldNumber.Types.Foo.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor 
+        = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[1];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor,
+            new string[] { "A", },
+            typeof (self::TestDupFieldNumber.Types.Bar),
+            typeof (self::TestDupFieldNumber.Types.Bar.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor 
+        = Descriptor.MessageTypes[15];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor,
+            new string[] { "OptionalNestedMessage", },
+            typeof (self::TestNestedMessageHasBits),
+            typeof (self::TestNestedMessageHasBits.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor 
+        = internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor.NestedTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor,
+            new string[] { "NestedmessageRepeatedInt32", "NestedmessageRepeatedForeignmessage", },
+            typeof (self::TestNestedMessageHasBits.Types.NestedMessage),
+            typeof (self::TestNestedMessageHasBits.Types.NestedMessage.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor 
+        = Descriptor.MessageTypes[16];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor,
+            new string[] { "PrimitiveField", "StringField", "EnumField", "MessageField", "StringPieceField", "CordField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedStringPieceField", "RepeatedCordField", },
+            typeof (self::TestCamelCaseFieldNames),
+            typeof (self::TestCamelCaseFieldNames.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestFieldOrderings__Descriptor 
+        = Descriptor.MessageTypes[17];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestFieldOrderings__Descriptor,
+            new string[] { "MyString", "MyInt", "MyFloat", },
+            typeof (self::TestFieldOrderings),
+            typeof (self::TestFieldOrderings.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor 
+        = Descriptor.MessageTypes[18];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor,
+            new string[] { "EscapedBytes", "LargeUint32", "LargeUint64", "SmallInt32", "SmallInt64", "Utf8String", },
+            typeof (self::TestExtremeDefaultValues),
+            typeof (self::TestExtremeDefaultValues.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_FooRequest__Descriptor 
+        = Descriptor.MessageTypes[19];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_FooRequest__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_FooRequest__Descriptor,
+            new string[] { },
+            typeof (self::FooRequest),
+            typeof (self::FooRequest.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_FooResponse__Descriptor 
+        = Descriptor.MessageTypes[20];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_FooResponse__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_FooResponse__Descriptor,
+            new string[] { },
+            typeof (self::FooResponse),
+            typeof (self::FooResponse.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_BarRequest__Descriptor 
+        = Descriptor.MessageTypes[21];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_BarRequest__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_BarRequest__Descriptor,
+            new string[] { },
+            typeof (self::BarRequest),
+            typeof (self::BarRequest.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_BarResponse__Descriptor 
+        = Descriptor.MessageTypes[22];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_BarResponse__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_BarResponse__Descriptor,
+            new string[] { },
+            typeof (self::BarResponse),
+            typeof (self::BarResponse.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  public enum ForeignEnum {
+    FOREIGN_FOO = 4,
+    FOREIGN_BAR = 5,
+    FOREIGN_BAZ = 6,
+  }
+  
+  public enum TestEnumWithDupValue {
+    FOO1 = 1,
+    BAR1 = 2,
+    BAZ = 3,
+  }
+  
+  public enum TestSparseEnum {
+    SPARSE_A = 123,
+    SPARSE_B = 62374,
+    SPARSE_C = 12589234,
+    SPARSE_D = -15,
+    SPARSE_E = -53452,
+    SPARSE_F = 0,
+    SPARSE_G = 2,
+  }
+  
+  #endregion
+  
+  #region Messages
+  public sealed partial class TestAllTypes : pb::GeneratedMessage<TestAllTypes, TestAllTypes.Builder> {
+    // Use TestAllTypes.CreateBuilder() to construct.
+    private TestAllTypes() {}
+    
+    private static readonly TestAllTypes defaultInstance = new TestAllTypes();
+    public static TestAllTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestAllTypes DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public enum NestedEnum {
+        FOO = 1,
+        BAR = 2,
+        BAZ = 3,
+      }
+      
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        // Use NestedMessage.CreateBuilder() to construct.
+        private NestedMessage() {}
+        
+        private static readonly NestedMessage defaultInstance = new NestedMessage();
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override NestedMessage DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable; }
+        }
+        
+        // optional int32 bb = 1;
+        private bool hasBb;
+        private int bb_ = 0;
+        public bool HasBb {
+          get { return hasBb; }
+        }
+        public int Bb {
+          get { return bb_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasBb) {
+            output.WriteInt32(1, Bb);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasBb) {
+              size += pb::CodedOutputStream.ComputeInt32Size(1, Bb);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestAllTypes.Types.NestedMessage> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestAllTypes.Types.NestedMessage prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllTypes.Types.NestedMessage, Builder> {
+          // Construct using self::TestAllTypes.Types.NestedMessage.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestAllTypes.Types.NestedMessage result = new self::TestAllTypes.Types.NestedMessage();
+          
+          protected override self::TestAllTypes.Types.NestedMessage MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> Clear() {
+            result = new self::TestAllTypes.Types.NestedMessage();
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestAllTypes.Types.NestedMessage.Descriptor; }
+          }
+          
+          public override self::TestAllTypes.Types.NestedMessage DefaultInstanceForType {
+            get { return self::TestAllTypes.Types.NestedMessage.DefaultInstance; }
+          }
+          
+          public override self::TestAllTypes.Types.NestedMessage BuildPartial() {
+            self::TestAllTypes.Types.NestedMessage returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestAllTypes.Types.NestedMessage) {
+              return MergeFrom((self::TestAllTypes.Types.NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> MergeFrom(self::TestAllTypes.Types.NestedMessage other) {
+            if (other == self::TestAllTypes.Types.NestedMessage.DefaultInstance) return this;
+            if (other.HasBb) {
+              Bb = other.Bb;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  Bb = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 bb = 1;
+          public bool HasBb {
+            get { return result.HasBb; }
+          }
+          public int Bb {
+            get { return result.Bb; }
+            set { SetBb(value); }
+          }
+          public Builder SetBb(int value) {
+            result.hasBb = true;
+            result.bb_ = value;
+            return this;
+          }
+          public Builder ClearBb() {
+            result.hasBb = false;
+            result.bb_ = 0;
+            return this;
+          }
+        }
+      }
+      
+      public sealed partial class OptionalGroup : pb::GeneratedMessage<OptionalGroup, OptionalGroup.Builder> {
+        // Use OptionalGroup.CreateBuilder() to construct.
+        private OptionalGroup() {}
+        
+        private static readonly OptionalGroup defaultInstance = new OptionalGroup();
+        public static OptionalGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override OptionalGroup DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable; }
+        }
+        
+        // optional int32 a = 17;
+        private bool hasA;
+        private int a_ = 0;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasA) {
+            output.WriteInt32(17, A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasA) {
+              size += pb::CodedOutputStream.ComputeInt32Size(17, A);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestAllTypes.Types.OptionalGroup> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestAllTypes.Types.OptionalGroup prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllTypes.Types.OptionalGroup, Builder> {
+          // Construct using self::TestAllTypes.Types.OptionalGroup.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestAllTypes.Types.OptionalGroup result = new self::TestAllTypes.Types.OptionalGroup();
+          
+          protected override self::TestAllTypes.Types.OptionalGroup MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> Clear() {
+            result = new self::TestAllTypes.Types.OptionalGroup();
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestAllTypes.Types.OptionalGroup.Descriptor; }
+          }
+          
+          public override self::TestAllTypes.Types.OptionalGroup DefaultInstanceForType {
+            get { return self::TestAllTypes.Types.OptionalGroup.DefaultInstance; }
+          }
+          
+          public override self::TestAllTypes.Types.OptionalGroup BuildPartial() {
+            self::TestAllTypes.Types.OptionalGroup returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestAllTypes.Types.OptionalGroup) {
+              return MergeFrom((self::TestAllTypes.Types.OptionalGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> MergeFrom(self::TestAllTypes.Types.OptionalGroup other) {
+            if (other == self::TestAllTypes.Types.OptionalGroup.DefaultInstance) return this;
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 136: {
+                  A = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 a = 17;
+          public bool HasA {
+            get { return result.HasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+      }
+      
+      public sealed partial class RepeatedGroup : pb::GeneratedMessage<RepeatedGroup, RepeatedGroup.Builder> {
+        // Use RepeatedGroup.CreateBuilder() to construct.
+        private RepeatedGroup() {}
+        
+        private static readonly RepeatedGroup defaultInstance = new RepeatedGroup();
+        public static RepeatedGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override RepeatedGroup DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable; }
+        }
+        
+        // optional int32 a = 47;
+        private bool hasA;
+        private int a_ = 0;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasA) {
+            output.WriteInt32(47, A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasA) {
+              size += pb::CodedOutputStream.ComputeInt32Size(47, A);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestAllTypes.Types.RepeatedGroup prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllTypes.Types.RepeatedGroup, Builder> {
+          // Construct using self::TestAllTypes.Types.RepeatedGroup.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestAllTypes.Types.RepeatedGroup result = new self::TestAllTypes.Types.RepeatedGroup();
+          
+          protected override self::TestAllTypes.Types.RepeatedGroup MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> Clear() {
+            result = new self::TestAllTypes.Types.RepeatedGroup();
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestAllTypes.Types.RepeatedGroup.Descriptor; }
+          }
+          
+          public override self::TestAllTypes.Types.RepeatedGroup DefaultInstanceForType {
+            get { return self::TestAllTypes.Types.RepeatedGroup.DefaultInstance; }
+          }
+          
+          public override self::TestAllTypes.Types.RepeatedGroup BuildPartial() {
+            self::TestAllTypes.Types.RepeatedGroup returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestAllTypes.Types.RepeatedGroup) {
+              return MergeFrom((self::TestAllTypes.Types.RepeatedGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> MergeFrom(self::TestAllTypes.Types.RepeatedGroup other) {
+            if (other == self::TestAllTypes.Types.RepeatedGroup.DefaultInstance) return this;
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 376: {
+                  A = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 a = 47;
+          public bool HasA {
+            get { return result.HasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+      }
+      
+    }
+    #endregion
+    
+    // optional int32 optional_int32 = 1;
+    private bool hasOptionalInt32;
+    private int optionalInt32_ = 0;
+    public bool HasOptionalInt32 {
+      get { return hasOptionalInt32; }
+    }
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+    }
+    
+    // optional int64 optional_int64 = 2;
+    private bool hasOptionalInt64;
+    private long optionalInt64_ = 0L;
+    public bool HasOptionalInt64 {
+      get { return hasOptionalInt64; }
+    }
+    public long OptionalInt64 {
+      get { return optionalInt64_; }
+    }
+    
+    // optional uint32 optional_uint32 = 3;
+    private bool hasOptionalUint32;
+    private uint optionalUint32_ = 0;
+    public bool HasOptionalUint32 {
+      get { return hasOptionalUint32; }
+    }
+    public uint OptionalUint32 {
+      get { return optionalUint32_; }
+    }
+    
+    // optional uint64 optional_uint64 = 4;
+    private bool hasOptionalUint64;
+    private ulong optionalUint64_ = 0UL;
+    public bool HasOptionalUint64 {
+      get { return hasOptionalUint64; }
+    }
+    public ulong OptionalUint64 {
+      get { return optionalUint64_; }
+    }
+    
+    // optional sint32 optional_sint32 = 5;
+    private bool hasOptionalSint32;
+    private int optionalSint32_ = 0;
+    public bool HasOptionalSint32 {
+      get { return hasOptionalSint32; }
+    }
+    public int OptionalSint32 {
+      get { return optionalSint32_; }
+    }
+    
+    // optional sint64 optional_sint64 = 6;
+    private bool hasOptionalSint64;
+    private long optionalSint64_ = 0L;
+    public bool HasOptionalSint64 {
+      get { return hasOptionalSint64; }
+    }
+    public long OptionalSint64 {
+      get { return optionalSint64_; }
+    }
+    
+    // optional fixed32 optional_fixed32 = 7;
+    private bool hasOptionalFixed32;
+    private uint optionalFixed32_ = 0;
+    public bool HasOptionalFixed32 {
+      get { return hasOptionalFixed32; }
+    }
+    public uint OptionalFixed32 {
+      get { return optionalFixed32_; }
+    }
+    
+    // optional fixed64 optional_fixed64 = 8;
+    private bool hasOptionalFixed64;
+    private ulong optionalFixed64_ = 0UL;
+    public bool HasOptionalFixed64 {
+      get { return hasOptionalFixed64; }
+    }
+    public ulong OptionalFixed64 {
+      get { return optionalFixed64_; }
+    }
+    
+    // optional sfixed32 optional_sfixed32 = 9;
+    private bool hasOptionalSfixed32;
+    private int optionalSfixed32_ = 0;
+    public bool HasOptionalSfixed32 {
+      get { return hasOptionalSfixed32; }
+    }
+    public int OptionalSfixed32 {
+      get { return optionalSfixed32_; }
+    }
+    
+    // optional sfixed64 optional_sfixed64 = 10;
+    private bool hasOptionalSfixed64;
+    private long optionalSfixed64_ = 0L;
+    public bool HasOptionalSfixed64 {
+      get { return hasOptionalSfixed64; }
+    }
+    public long OptionalSfixed64 {
+      get { return optionalSfixed64_; }
+    }
+    
+    // optional float optional_float = 11;
+    private bool hasOptionalFloat;
+    private float optionalFloat_ = 0F;
+    public bool HasOptionalFloat {
+      get { return hasOptionalFloat; }
+    }
+    public float OptionalFloat {
+      get { return optionalFloat_; }
+    }
+    
+    // optional double optional_double = 12;
+    private bool hasOptionalDouble;
+    private double optionalDouble_ = 0D;
+    public bool HasOptionalDouble {
+      get { return hasOptionalDouble; }
+    }
+    public double OptionalDouble {
+      get { return optionalDouble_; }
+    }
+    
+    // optional bool optional_bool = 13;
+    private bool hasOptionalBool;
+    private bool optionalBool_ = false;
+    public bool HasOptionalBool {
+      get { return hasOptionalBool; }
+    }
+    public bool OptionalBool {
+      get { return optionalBool_; }
+    }
+    
+    // optional string optional_string = 14;
+    private bool hasOptionalString;
+    private string optionalString_ = "";
+    public bool HasOptionalString {
+      get { return hasOptionalString; }
+    }
+    public string OptionalString {
+      get { return optionalString_; }
+    }
+    
+    // optional bytes optional_bytes = 15;
+    private bool hasOptionalBytes;
+    private pb::ByteString optionalBytes_ = pb::ByteString.Empty;
+    public bool HasOptionalBytes {
+      get { return hasOptionalBytes; }
+    }
+    public pb::ByteString OptionalBytes {
+      get { return optionalBytes_; }
+    }
+    
+    // optional group OptionalGroup = 16 {
+    private bool hasOptionalGroup;
+    private self::TestAllTypes.Types.OptionalGroup optionalGroup_ = self::TestAllTypes.Types.OptionalGroup.DefaultInstance;
+    public bool HasOptionalGroup {
+      get { return hasOptionalGroup; }
+    }
+    public self::TestAllTypes.Types.OptionalGroup OptionalGroup {
+      get { return optionalGroup_; }
+    }
+    
+    // optional .protobuf_unittest.TestAllTypes.NestedMessage optional_nested_message = 18;
+    private bool hasOptionalNestedMessage;
+    private self::TestAllTypes.Types.NestedMessage optionalNestedMessage_ = self::TestAllTypes.Types.NestedMessage.DefaultInstance;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public self::TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_; }
+    }
+    
+    // optional .protobuf_unittest.ForeignMessage optional_foreign_message = 19;
+    private bool hasOptionalForeignMessage;
+    private self::ForeignMessage optionalForeignMessage_ = self::ForeignMessage.DefaultInstance;
+    public bool HasOptionalForeignMessage {
+      get { return hasOptionalForeignMessage; }
+    }
+    public self::ForeignMessage OptionalForeignMessage {
+      get { return optionalForeignMessage_; }
+    }
+    
+    // optional .protobuf_unittest_import.ImportMessage optional_import_message = 20;
+    private bool hasOptionalImportMessage;
+    private self::ImportMessage optionalImportMessage_ = self::ImportMessage.DefaultInstance;
+    public bool HasOptionalImportMessage {
+      get { return hasOptionalImportMessage; }
+    }
+    public self::ImportMessage OptionalImportMessage {
+      get { return optionalImportMessage_; }
+    }
+    
+    // optional .protobuf_unittest.TestAllTypes.NestedEnum optional_nested_enum = 21;
+    private bool hasOptionalNestedEnum;
+    private self::TestAllTypes.Types.NestedEnum optionalNestedEnum_ = self::TestAllTypes.Types.NestedEnum.FOO;
+    public bool HasOptionalNestedEnum {
+      get { return hasOptionalNestedEnum; }
+    }
+    public self::TestAllTypes.Types.NestedEnum OptionalNestedEnum {  get { return optionalNestedEnum_; }}
+    
+    // optional .protobuf_unittest.ForeignEnum optional_foreign_enum = 22;
+    private bool hasOptionalForeignEnum;
+    private self::ForeignEnum optionalForeignEnum_ = self::ForeignEnum.FOREIGN_FOO;
+    public bool HasOptionalForeignEnum {
+      get { return hasOptionalForeignEnum; }
+    }
+    public self::ForeignEnum OptionalForeignEnum {  get { return optionalForeignEnum_; }}
+    
+    // optional .protobuf_unittest_import.ImportEnum optional_import_enum = 23;
+    private bool hasOptionalImportEnum;
+    private self::ImportEnum optionalImportEnum_ = self::ImportEnum.IMPORT_FOO;
+    public bool HasOptionalImportEnum {
+      get { return hasOptionalImportEnum; }
+    }
+    public self::ImportEnum OptionalImportEnum {  get { return optionalImportEnum_; }}
+    
+    // optional string optional_string_piece = 24 [ctype = STRING_PIECE];
+    private bool hasOptionalStringPiece;
+    private string optionalStringPiece_ = "";
+    public bool HasOptionalStringPiece {
+      get { return hasOptionalStringPiece; }
+    }
+    public string OptionalStringPiece {
+      get { return optionalStringPiece_; }
+    }
+    
+    // optional string optional_cord = 25 [ctype = CORD];
+    private bool hasOptionalCord;
+    private string optionalCord_ = "";
+    public bool HasOptionalCord {
+      get { return hasOptionalCord; }
+    }
+    public string OptionalCord {
+      get { return optionalCord_; }
+    }
+    
+    // repeated int32 repeated_int32 = 31;
+    private scg::IList<int> repeatedInt32_ = pbc::Lists<int>.Empty;
+    public scg::IList<int> RepeatedInt32List {
+      get { return repeatedInt32_; }
+    }
+    public int RepeatedInt32Count {
+      get { return repeatedInt32_.Count; }
+    }
+    public int GetRepeatedInt32(int index) {
+      return repeatedInt32_[index];
+    }
+    
+    // repeated int64 repeated_int64 = 32;
+    private scg::IList<long> repeatedInt64_ = pbc::Lists<long>.Empty;
+    public scg::IList<long> RepeatedInt64List {
+      get { return repeatedInt64_; }
+    }
+    public int RepeatedInt64Count {
+      get { return repeatedInt64_.Count; }
+    }
+    public long GetRepeatedInt64(int index) {
+      return repeatedInt64_[index];
+    }
+    
+    // repeated uint32 repeated_uint32 = 33;
+    private scg::IList<uint> repeatedUint32_ = pbc::Lists<uint>.Empty;
+    public scg::IList<uint> RepeatedUint32List {
+      get { return repeatedUint32_; }
+    }
+    public int RepeatedUint32Count {
+      get { return repeatedUint32_.Count; }
+    }
+    public uint GetRepeatedUint32(int index) {
+      return repeatedUint32_[index];
+    }
+    
+    // repeated uint64 repeated_uint64 = 34;
+    private scg::IList<ulong> repeatedUint64_ = pbc::Lists<ulong>.Empty;
+    public scg::IList<ulong> RepeatedUint64List {
+      get { return repeatedUint64_; }
+    }
+    public int RepeatedUint64Count {
+      get { return repeatedUint64_.Count; }
+    }
+    public ulong GetRepeatedUint64(int index) {
+      return repeatedUint64_[index];
+    }
+    
+    // repeated sint32 repeated_sint32 = 35;
+    private scg::IList<int> repeatedSint32_ = pbc::Lists<int>.Empty;
+    public scg::IList<int> RepeatedSint32List {
+      get { return repeatedSint32_; }
+    }
+    public int RepeatedSint32Count {
+      get { return repeatedSint32_.Count; }
+    }
+    public int GetRepeatedSint32(int index) {
+      return repeatedSint32_[index];
+    }
+    
+    // repeated sint64 repeated_sint64 = 36;
+    private scg::IList<long> repeatedSint64_ = pbc::Lists<long>.Empty;
+    public scg::IList<long> RepeatedSint64List {
+      get { return repeatedSint64_; }
+    }
+    public int RepeatedSint64Count {
+      get { return repeatedSint64_.Count; }
+    }
+    public long GetRepeatedSint64(int index) {
+      return repeatedSint64_[index];
+    }
+    
+    // repeated fixed32 repeated_fixed32 = 37;
+    private scg::IList<uint> repeatedFixed32_ = pbc::Lists<uint>.Empty;
+    public scg::IList<uint> RepeatedFixed32List {
+      get { return repeatedFixed32_; }
+    }
+    public int RepeatedFixed32Count {
+      get { return repeatedFixed32_.Count; }
+    }
+    public uint GetRepeatedFixed32(int index) {
+      return repeatedFixed32_[index];
+    }
+    
+    // repeated fixed64 repeated_fixed64 = 38;
+    private scg::IList<ulong> repeatedFixed64_ = pbc::Lists<ulong>.Empty;
+    public scg::IList<ulong> RepeatedFixed64List {
+      get { return repeatedFixed64_; }
+    }
+    public int RepeatedFixed64Count {
+      get { return repeatedFixed64_.Count; }
+    }
+    public ulong GetRepeatedFixed64(int index) {
+      return repeatedFixed64_[index];
+    }
+    
+    // repeated sfixed32 repeated_sfixed32 = 39;
+    private scg::IList<int> repeatedSfixed32_ = pbc::Lists<int>.Empty;
+    public scg::IList<int> RepeatedSfixed32List {
+      get { return repeatedSfixed32_; }
+    }
+    public int RepeatedSfixed32Count {
+      get { return repeatedSfixed32_.Count; }
+    }
+    public int GetRepeatedSfixed32(int index) {
+      return repeatedSfixed32_[index];
+    }
+    
+    // repeated sfixed64 repeated_sfixed64 = 40;
+    private scg::IList<long> repeatedSfixed64_ = pbc::Lists<long>.Empty;
+    public scg::IList<long> RepeatedSfixed64List {
+      get { return repeatedSfixed64_; }
+    }
+    public int RepeatedSfixed64Count {
+      get { return repeatedSfixed64_.Count; }
+    }
+    public long GetRepeatedSfixed64(int index) {
+      return repeatedSfixed64_[index];
+    }
+    
+    // repeated float repeated_float = 41;
+    private scg::IList<float> repeatedFloat_ = pbc::Lists<float>.Empty;
+    public scg::IList<float> RepeatedFloatList {
+      get { return repeatedFloat_; }
+    }
+    public int RepeatedFloatCount {
+      get { return repeatedFloat_.Count; }
+    }
+    public float GetRepeatedFloat(int index) {
+      return repeatedFloat_[index];
+    }
+    
+    // repeated double repeated_double = 42;
+    private scg::IList<double> repeatedDouble_ = pbc::Lists<double>.Empty;
+    public scg::IList<double> RepeatedDoubleList {
+      get { return repeatedDouble_; }
+    }
+    public int RepeatedDoubleCount {
+      get { return repeatedDouble_.Count; }
+    }
+    public double GetRepeatedDouble(int index) {
+      return repeatedDouble_[index];
+    }
+    
+    // repeated bool repeated_bool = 43;
+    private scg::IList<bool> repeatedBool_ = pbc::Lists<bool>.Empty;
+    public scg::IList<bool> RepeatedBoolList {
+      get { return repeatedBool_; }
+    }
+    public int RepeatedBoolCount {
+      get { return repeatedBool_.Count; }
+    }
+    public bool GetRepeatedBool(int index) {
+      return repeatedBool_[index];
+    }
+    
+    // repeated string repeated_string = 44;
+    private scg::IList<string> repeatedString_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedStringList {
+      get { return repeatedString_; }
+    }
+    public int RepeatedStringCount {
+      get { return repeatedString_.Count; }
+    }
+    public string GetRepeatedString(int index) {
+      return repeatedString_[index];
+    }
+    
+    // repeated bytes repeated_bytes = 45;
+    private scg::IList<pb::ByteString> repeatedBytes_ = pbc::Lists<pb::ByteString>.Empty;
+    public scg::IList<pb::ByteString> RepeatedBytesList {
+      get { return repeatedBytes_; }
+    }
+    public int RepeatedBytesCount {
+      get { return repeatedBytes_.Count; }
+    }
+    public pb::ByteString GetRepeatedBytes(int index) {
+      return repeatedBytes_[index];
+    }
+    
+    // repeated group RepeatedGroup = 46 {
+    private scg::IList<self::TestAllTypes.Types.RepeatedGroup> repeatedGroup_ = pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty;
+    public scg::IList<self::TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {
+      get { return repeatedGroup_; } 
+    }
+    public int RepeatedGroupCount
+      { get { return repeatedGroup_.Count; }
+    }
+    public self::TestAllTypes.Types.RepeatedGroup GetRepeatedGroup(int index) {
+      return repeatedGroup_ [index];
+    }
+    
+    // repeated .protobuf_unittest.TestAllTypes.NestedMessage repeated_nested_message = 48;
+    private scg::IList<self::TestAllTypes.Types.NestedMessage> repeatedNestedMessage_ = pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty;
+    public scg::IList<self::TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {
+      get { return repeatedNestedMessage_; } 
+    }
+    public int RepeatedNestedMessageCount
+      { get { return repeatedNestedMessage_.Count; }
+    }
+    public self::TestAllTypes.Types.NestedMessage GetRepeatedNestedMessage(int index) {
+      return repeatedNestedMessage_ [index];
+    }
+    
+    // repeated .protobuf_unittest.ForeignMessage repeated_foreign_message = 49;
+    private scg::IList<self::ForeignMessage> repeatedForeignMessage_ = pbc::Lists<self::ForeignMessage>.Empty;
+    public scg::IList<self::ForeignMessage> RepeatedForeignMessageList {
+      get { return repeatedForeignMessage_; } 
+    }
+    public int RepeatedForeignMessageCount
+      { get { return repeatedForeignMessage_.Count; }
+    }
+    public self::ForeignMessage GetRepeatedForeignMessage(int index) {
+      return repeatedForeignMessage_ [index];
+    }
+    
+    // repeated .protobuf_unittest_import.ImportMessage repeated_import_message = 50;
+    private scg::IList<self::ImportMessage> repeatedImportMessage_ = pbc::Lists<self::ImportMessage>.Empty;
+    public scg::IList<self::ImportMessage> RepeatedImportMessageList {
+      get { return repeatedImportMessage_; } 
+    }
+    public int RepeatedImportMessageCount
+      { get { return repeatedImportMessage_.Count; }
+    }
+    public self::ImportMessage GetRepeatedImportMessage(int index) {
+      return repeatedImportMessage_ [index];
+    }
+    
+    // repeated .protobuf_unittest.TestAllTypes.NestedEnum repeated_nested_enum = 51;
+    private scg::IList<self::TestAllTypes.Types.NestedEnum> repeatedNestedEnum_ = new scg::List<self::TestAllTypes.Types.NestedEnum> ();
+    public scg.IList<self::TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedNestedEnum_); }
+    }
+    public int RepeatedNestedEnumCount {
+      get { return repeatedNestedEnum_.Count; }
+    }
+    public self::TestAllTypes.Types.NestedEnum GetRepeatedNestedEnum(int index) {
+      return repeatedNestedEnum_[index];
+    }
+    
+    // repeated .protobuf_unittest.ForeignEnum repeated_foreign_enum = 52;
+    private scg::IList<self::ForeignEnum> repeatedForeignEnum_ = new scg::List<self::ForeignEnum> ();
+    public scg.IList<self::ForeignEnum> RepeatedForeignEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedForeignEnum_); }
+    }
+    public int RepeatedForeignEnumCount {
+      get { return repeatedForeignEnum_.Count; }
+    }
+    public self::ForeignEnum GetRepeatedForeignEnum(int index) {
+      return repeatedForeignEnum_[index];
+    }
+    
+    // repeated .protobuf_unittest_import.ImportEnum repeated_import_enum = 53;
+    private scg::IList<self::ImportEnum> repeatedImportEnum_ = new scg::List<self::ImportEnum> ();
+    public scg.IList<self::ImportEnum> RepeatedImportEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedImportEnum_); }
+    }
+    public int RepeatedImportEnumCount {
+      get { return repeatedImportEnum_.Count; }
+    }
+    public self::ImportEnum GetRepeatedImportEnum(int index) {
+      return repeatedImportEnum_[index];
+    }
+    
+    // repeated string repeated_string_piece = 54 [ctype = STRING_PIECE];
+    private scg::IList<string> repeatedStringPiece_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedStringPieceList {
+      get { return repeatedStringPiece_; }
+    }
+    public int RepeatedStringPieceCount {
+      get { return repeatedStringPiece_.Count; }
+    }
+    public string GetRepeatedStringPiece(int index) {
+      return repeatedStringPiece_[index];
+    }
+    
+    // repeated string repeated_cord = 55 [ctype = CORD];
+    private scg::IList<string> repeatedCord_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedCordList {
+      get { return repeatedCord_; }
+    }
+    public int RepeatedCordCount {
+      get { return repeatedCord_.Count; }
+    }
+    public string GetRepeatedCord(int index) {
+      return repeatedCord_[index];
+    }
+    
+    // optional int32 default_int32 = 61 [default = 41];
+    private bool hasDefaultInt32;
+    private int defaultInt32_ = 41;
+    public bool HasDefaultInt32 {
+      get { return hasDefaultInt32; }
+    }
+    public int DefaultInt32 {
+      get { return defaultInt32_; }
+    }
+    
+    // optional int64 default_int64 = 62 [default = 42];
+    private bool hasDefaultInt64;
+    private long defaultInt64_ = 42L;
+    public bool HasDefaultInt64 {
+      get { return hasDefaultInt64; }
+    }
+    public long DefaultInt64 {
+      get { return defaultInt64_; }
+    }
+    
+    // optional uint32 default_uint32 = 63 [default = 43];
+    private bool hasDefaultUint32;
+    private uint defaultUint32_ = 43;
+    public bool HasDefaultUint32 {
+      get { return hasDefaultUint32; }
+    }
+    public uint DefaultUint32 {
+      get { return defaultUint32_; }
+    }
+    
+    // optional uint64 default_uint64 = 64 [default = 44];
+    private bool hasDefaultUint64;
+    private ulong defaultUint64_ = 44UL;
+    public bool HasDefaultUint64 {
+      get { return hasDefaultUint64; }
+    }
+    public ulong DefaultUint64 {
+      get { return defaultUint64_; }
+    }
+    
+    // optional sint32 default_sint32 = 65 [default = -45];
+    private bool hasDefaultSint32;
+    private int defaultSint32_ = -45;
+    public bool HasDefaultSint32 {
+      get { return hasDefaultSint32; }
+    }
+    public int DefaultSint32 {
+      get { return defaultSint32_; }
+    }
+    
+    // optional sint64 default_sint64 = 66 [default = 46];
+    private bool hasDefaultSint64;
+    private long defaultSint64_ = 46L;
+    public bool HasDefaultSint64 {
+      get { return hasDefaultSint64; }
+    }
+    public long DefaultSint64 {
+      get { return defaultSint64_; }
+    }
+    
+    // optional fixed32 default_fixed32 = 67 [default = 47];
+    private bool hasDefaultFixed32;
+    private uint defaultFixed32_ = 47;
+    public bool HasDefaultFixed32 {
+      get { return hasDefaultFixed32; }
+    }
+    public uint DefaultFixed32 {
+      get { return defaultFixed32_; }
+    }
+    
+    // optional fixed64 default_fixed64 = 68 [default = 48];
+    private bool hasDefaultFixed64;
+    private ulong defaultFixed64_ = 48UL;
+    public bool HasDefaultFixed64 {
+      get { return hasDefaultFixed64; }
+    }
+    public ulong DefaultFixed64 {
+      get { return defaultFixed64_; }
+    }
+    
+    // optional sfixed32 default_sfixed32 = 69 [default = 49];
+    private bool hasDefaultSfixed32;
+    private int defaultSfixed32_ = 49;
+    public bool HasDefaultSfixed32 {
+      get { return hasDefaultSfixed32; }
+    }
+    public int DefaultSfixed32 {
+      get { return defaultSfixed32_; }
+    }
+    
+    // optional sfixed64 default_sfixed64 = 70 [default = -50];
+    private bool hasDefaultSfixed64;
+    private long defaultSfixed64_ = -50L;
+    public bool HasDefaultSfixed64 {
+      get { return hasDefaultSfixed64; }
+    }
+    public long DefaultSfixed64 {
+      get { return defaultSfixed64_; }
+    }
+    
+    // optional float default_float = 71 [default = 51.5];
+    private bool hasDefaultFloat;
+    private float defaultFloat_ = 51.5F;
+    public bool HasDefaultFloat {
+      get { return hasDefaultFloat; }
+    }
+    public float DefaultFloat {
+      get { return defaultFloat_; }
+    }
+    
+    // optional double default_double = 72 [default = 52000];
+    private bool hasDefaultDouble;
+    private double defaultDouble_ = 52000D;
+    public bool HasDefaultDouble {
+      get { return hasDefaultDouble; }
+    }
+    public double DefaultDouble {
+      get { return defaultDouble_; }
+    }
+    
+    // optional bool default_bool = 73 [default = true];
+    private bool hasDefaultBool;
+    private bool defaultBool_ = true;
+    public bool HasDefaultBool {
+      get { return hasDefaultBool; }
+    }
+    public bool DefaultBool {
+      get { return defaultBool_; }
+    }
+    
+    // optional string default_string = 74 [default = "hello"];
+    private bool hasDefaultString;
+    private string defaultString_ = "hello";
+    public bool HasDefaultString {
+      get { return hasDefaultString; }
+    }
+    public string DefaultString {
+      get { return defaultString_; }
+    }
+    
+    // optional bytes default_bytes = 75 [default = "world"];
+    private bool hasDefaultBytes;
+    private pb::ByteString defaultBytes_ = ((pb::ByteString) self::TestAllTypes.Descriptor.Fields[62].DefaultValue);
+    public bool HasDefaultBytes {
+      get { return hasDefaultBytes; }
+    }
+    public pb::ByteString DefaultBytes {
+      get { return defaultBytes_; }
+    }
+    
+    // optional .protobuf_unittest.TestAllTypes.NestedEnum default_nested_enum = 81 [default = BAR];
+    private bool hasDefaultNestedEnum;
+    private self::TestAllTypes.Types.NestedEnum defaultNestedEnum_ = self::TestAllTypes.Types.NestedEnum.BAR;
+    public bool HasDefaultNestedEnum {
+      get { return hasDefaultNestedEnum; }
+    }
+    public self::TestAllTypes.Types.NestedEnum DefaultNestedEnum {  get { return defaultNestedEnum_; }}
+    
+    // optional .protobuf_unittest.ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
+    private bool hasDefaultForeignEnum;
+    private self::ForeignEnum defaultForeignEnum_ = self::ForeignEnum.FOREIGN_BAR;
+    public bool HasDefaultForeignEnum {
+      get { return hasDefaultForeignEnum; }
+    }
+    public self::ForeignEnum DefaultForeignEnum {  get { return defaultForeignEnum_; }}
+    
+    // optional .protobuf_unittest_import.ImportEnum default_import_enum = 83 [default = IMPORT_BAR];
+    private bool hasDefaultImportEnum;
+    private self::ImportEnum defaultImportEnum_ = self::ImportEnum.IMPORT_BAR;
+    public bool HasDefaultImportEnum {
+      get { return hasDefaultImportEnum; }
+    }
+    public self::ImportEnum DefaultImportEnum {  get { return defaultImportEnum_; }}
+    
+    // optional string default_string_piece = 84 [default = "abc", ctype = STRING_PIECE];
+    private bool hasDefaultStringPiece;
+    private string defaultStringPiece_ = "abc";
+    public bool HasDefaultStringPiece {
+      get { return hasDefaultStringPiece; }
+    }
+    public string DefaultStringPiece {
+      get { return defaultStringPiece_; }
+    }
+    
+    // optional string default_cord = 85 [default = "123", ctype = CORD];
+    private bool hasDefaultCord;
+    private string defaultCord_ = "123";
+    public bool HasDefaultCord {
+      get { return hasDefaultCord; }
+    }
+    public string DefaultCord {
+      get { return defaultCord_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasOptionalInt32) {
+        output.WriteInt32(1, OptionalInt32);
+      }
+      if (HasOptionalInt64) {
+        output.WriteInt64(2, OptionalInt64);
+      }
+      if (HasOptionalUint32) {
+        output.WriteUInt32(3, OptionalUint32);
+      }
+      if (HasOptionalUint64) {
+        output.WriteUInt64(4, OptionalUint64);
+      }
+      if (HasOptionalSint32) {
+        output.WriteSInt32(5, OptionalSint32);
+      }
+      if (HasOptionalSint64) {
+        output.WriteSInt64(6, OptionalSint64);
+      }
+      if (HasOptionalFixed32) {
+        output.WriteFixed32(7, OptionalFixed32);
+      }
+      if (HasOptionalFixed64) {
+        output.WriteFixed64(8, OptionalFixed64);
+      }
+      if (HasOptionalSfixed32) {
+        output.WriteSFixed32(9, OptionalSfixed32);
+      }
+      if (HasOptionalSfixed64) {
+        output.WriteSFixed64(10, OptionalSfixed64);
+      }
+      if (HasOptionalFloat) {
+        output.WriteFloat(11, OptionalFloat);
+      }
+      if (HasOptionalDouble) {
+        output.WriteDouble(12, OptionalDouble);
+      }
+      if (HasOptionalBool) {
+        output.WriteBool(13, OptionalBool);
+      }
+      if (HasOptionalString) {
+        output.WriteString(14, OptionalString);
+      }
+      if (HasOptionalBytes) {
+        output.WriteBytes(15, OptionalBytes);
+      }
+      if (HasOptionalGroup) {
+        output.WriteGroup(16, OptionalGroup);
+      }
+      if (HasOptionalNestedMessage) {
+        output.WriteMessage(18, OptionalNestedMessage);
+      }
+      if (HasOptionalForeignMessage) {
+        output.WriteMessage(19, OptionalForeignMessage);
+      }
+      if (HasOptionalImportMessage) {
+        output.WriteMessage(20, OptionalImportMessage);
+      }
+      if (HasOptionalNestedEnum) {
+        output.WriteEnum(21, (int) OptionalNestedEnum);
+      }
+      if (HasOptionalForeignEnum) {
+        output.WriteEnum(22, (int) OptionalForeignEnum);
+      }
+      if (HasOptionalImportEnum) {
+        output.WriteEnum(23, (int) OptionalImportEnum);
+      }
+      if (HasOptionalStringPiece) {
+        output.WriteString(24, OptionalStringPiece);
+      }
+      if (HasOptionalCord) {
+        output.WriteString(25, OptionalCord);
+      }
+      foreach (int element in RepeatedInt32List) {
+        output.WriteInt32(31, element);
+      }
+      foreach (long element in RepeatedInt64List) {
+        output.WriteInt64(32, element);
+      }
+      foreach (uint element in RepeatedUint32List) {
+        output.WriteUInt32(33, element);
+      }
+      foreach (ulong element in RepeatedUint64List) {
+        output.WriteUInt64(34, element);
+      }
+      foreach (int element in RepeatedSint32List) {
+        output.WriteSInt32(35, element);
+      }
+      foreach (long element in RepeatedSint64List) {
+        output.WriteSInt64(36, element);
+      }
+      foreach (uint element in RepeatedFixed32List) {
+        output.WriteFixed32(37, element);
+      }
+      foreach (ulong element in RepeatedFixed64List) {
+        output.WriteFixed64(38, element);
+      }
+      foreach (int element in RepeatedSfixed32List) {
+        output.WriteSFixed32(39, element);
+      }
+      foreach (long element in RepeatedSfixed64List) {
+        output.WriteSFixed64(40, element);
+      }
+      foreach (float element in RepeatedFloatList) {
+        output.WriteFloat(41, element);
+      }
+      foreach (double element in RepeatedDoubleList) {
+        output.WriteDouble(42, element);
+      }
+      foreach (bool element in RepeatedBoolList) {
+        output.WriteBool(43, element);
+      }
+      foreach (string element in RepeatedStringList) {
+        output.WriteString(44, element);
+      }
+      foreach (pb::ByteString element in RepeatedBytesList) {
+        output.WriteBytes(45, element);
+      }
+      foreach (self::TestAllTypes.Types.RepeatedGroup element in RepeatedGroupList) {
+        output.WriteGroup(46, element);
+      }
+      foreach (self::TestAllTypes.Types.NestedMessage element in RepeatedNestedMessageList) {
+        output.WriteMessage(48, element);
+      }
+      foreach (self::ForeignMessage element in RepeatedForeignMessageList) {
+        output.WriteMessage(49, element);
+      }
+      foreach (self::ImportMessage element in RepeatedImportMessageList) {
+        output.WriteMessage(50, element);
+      }
+      foreach (self::TestAllTypes.Types.NestedEnum element in RepeatedNestedEnumList) {
+        output.WriteEnum(51, (int) element);
+      }
+      foreach (self::ForeignEnum element in RepeatedForeignEnumList) {
+        output.WriteEnum(52, (int) element);
+      }
+      foreach (self::ImportEnum element in RepeatedImportEnumList) {
+        output.WriteEnum(53, (int) element);
+      }
+      foreach (string element in RepeatedStringPieceList) {
+        output.WriteString(54, element);
+      }
+      foreach (string element in RepeatedCordList) {
+        output.WriteString(55, element);
+      }
+      if (HasDefaultInt32) {
+        output.WriteInt32(61, DefaultInt32);
+      }
+      if (HasDefaultInt64) {
+        output.WriteInt64(62, DefaultInt64);
+      }
+      if (HasDefaultUint32) {
+        output.WriteUInt32(63, DefaultUint32);
+      }
+      if (HasDefaultUint64) {
+        output.WriteUInt64(64, DefaultUint64);
+      }
+      if (HasDefaultSint32) {
+        output.WriteSInt32(65, DefaultSint32);
+      }
+      if (HasDefaultSint64) {
+        output.WriteSInt64(66, DefaultSint64);
+      }
+      if (HasDefaultFixed32) {
+        output.WriteFixed32(67, DefaultFixed32);
+      }
+      if (HasDefaultFixed64) {
+        output.WriteFixed64(68, DefaultFixed64);
+      }
+      if (HasDefaultSfixed32) {
+        output.WriteSFixed32(69, DefaultSfixed32);
+      }
+      if (HasDefaultSfixed64) {
+        output.WriteSFixed64(70, DefaultSfixed64);
+      }
+      if (HasDefaultFloat) {
+        output.WriteFloat(71, DefaultFloat);
+      }
+      if (HasDefaultDouble) {
+        output.WriteDouble(72, DefaultDouble);
+      }
+      if (HasDefaultBool) {
+        output.WriteBool(73, DefaultBool);
+      }
+      if (HasDefaultString) {
+        output.WriteString(74, DefaultString);
+      }
+      if (HasDefaultBytes) {
+        output.WriteBytes(75, DefaultBytes);
+      }
+      if (HasDefaultNestedEnum) {
+        output.WriteEnum(81, (int) DefaultNestedEnum);
+      }
+      if (HasDefaultForeignEnum) {
+        output.WriteEnum(82, (int) DefaultForeignEnum);
+      }
+      if (HasDefaultImportEnum) {
+        output.WriteEnum(83, (int) DefaultImportEnum);
+      }
+      if (HasDefaultStringPiece) {
+        output.WriteString(84, DefaultStringPiece);
+      }
+      if (HasDefaultCord) {
+        output.WriteString(85, DefaultCord);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasOptionalInt32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, OptionalInt32);
+        }
+        if (HasOptionalInt64) {
+          size += pb::CodedOutputStream.ComputeInt64Size(2, OptionalInt64);
+        }
+        if (HasOptionalUint32) {
+          size += pb::CodedOutputStream.ComputeUInt32Size(3, OptionalUint32);
+        }
+        if (HasOptionalUint64) {
+          size += pb::CodedOutputStream.ComputeUInt64Size(4, OptionalUint64);
+        }
+        if (HasOptionalSint32) {
+          size += pb::CodedOutputStream.ComputeSInt32Size(5, OptionalSint32);
+        }
+        if (HasOptionalSint64) {
+          size += pb::CodedOutputStream.ComputeSInt64Size(6, OptionalSint64);
+        }
+        if (HasOptionalFixed32) {
+          size += pb::CodedOutputStream.ComputeFixed32Size(7, OptionalFixed32);
+        }
+        if (HasOptionalFixed64) {
+          size += pb::CodedOutputStream.ComputeFixed64Size(8, OptionalFixed64);
+        }
+        if (HasOptionalSfixed32) {
+          size += pb::CodedOutputStream.ComputeSFixed32Size(9, OptionalSfixed32);
+        }
+        if (HasOptionalSfixed64) {
+          size += pb::CodedOutputStream.ComputeSFixed64Size(10, OptionalSfixed64);
+        }
+        if (HasOptionalFloat) {
+          size += pb::CodedOutputStream.ComputeFloatSize(11, OptionalFloat);
+        }
+        if (HasOptionalDouble) {
+          size += pb::CodedOutputStream.ComputeDoubleSize(12, OptionalDouble);
+        }
+        if (HasOptionalBool) {
+          size += pb::CodedOutputStream.ComputeBoolSize(13, OptionalBool);
+        }
+        if (HasOptionalString) {
+          size += pb::CodedOutputStream.ComputeStringSize(14, OptionalString);
+        }
+        if (HasOptionalBytes) {
+          size += pb::CodedOutputStream.ComputeBytesSize(15, OptionalBytes);
+        }
+        if (HasOptionalGroup) {
+          size += pb::CodedOutputStream.ComputeGroupSize(16, OptionalGroup);
+        }
+        if (HasOptionalNestedMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(18, OptionalNestedMessage);
+        }
+        if (HasOptionalForeignMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(19, OptionalForeignMessage);
+        }
+        if (HasOptionalImportMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(20, OptionalImportMessage);
+        }
+        if (HasOptionalNestedEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(21, (int) OptionalNestedEnum);
+        }
+        if (HasOptionalForeignEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(22, (int) OptionalForeignEnum);
+        }
+        if (HasOptionalImportEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(23, (int) OptionalImportEnum);
+        }
+        if (HasOptionalStringPiece) {
+          size += pb::CodedOutputStream.ComputeStringSize(24, OptionalStringPiece);
+        }
+        if (HasOptionalCord) {
+          size += pb::CodedOutputStream.ComputeStringSize(25, OptionalCord);
+        }
+        foreach (int element in RepeatedInt32List) {
+          size += pb::CodedOutputStream
+            .ComputeInt32Size(31, element);
+        }
+        foreach (long element in RepeatedInt64List) {
+          size += pb::CodedOutputStream
+            .ComputeInt64Size(32, element);
+        }
+        foreach (uint element in RepeatedUint32List) {
+          size += pb::CodedOutputStream
+            .ComputeUInt32Size(33, element);
+        }
+        foreach (ulong element in RepeatedUint64List) {
+          size += pb::CodedOutputStream
+            .ComputeUInt64Size(34, element);
+        }
+        foreach (int element in RepeatedSint32List) {
+          size += pb::CodedOutputStream
+            .ComputeSInt32Size(35, element);
+        }
+        foreach (long element in RepeatedSint64List) {
+          size += pb::CodedOutputStream
+            .ComputeSInt64Size(36, element);
+        }
+        foreach (uint element in RepeatedFixed32List) {
+          size += pb::CodedOutputStream
+            .ComputeFixed32Size(37, element);
+        }
+        foreach (ulong element in RepeatedFixed64List) {
+          size += pb::CodedOutputStream
+            .ComputeFixed64Size(38, element);
+        }
+        foreach (int element in RepeatedSfixed32List) {
+          size += pb::CodedOutputStream
+            .ComputeSFixed32Size(39, element);
+        }
+        foreach (long element in RepeatedSfixed64List) {
+          size += pb::CodedOutputStream
+            .ComputeSFixed64Size(40, element);
+        }
+        foreach (float element in RepeatedFloatList) {
+          size += pb::CodedOutputStream
+            .ComputeFloatSize(41, element);
+        }
+        foreach (double element in RepeatedDoubleList) {
+          size += pb::CodedOutputStream
+            .ComputeDoubleSize(42, element);
+        }
+        foreach (bool element in RepeatedBoolList) {
+          size += pb::CodedOutputStream
+            .ComputeBoolSize(43, element);
+        }
+        foreach (string element in RepeatedStringList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(44, element);
+        }
+        foreach (pb::ByteString element in RepeatedBytesList) {
+          size += pb::CodedOutputStream
+            .ComputeBytesSize(45, element);
+        }
+        foreach (self::TestAllTypes.Types.RepeatedGroup element in RepeatedGroupList) {
+          size += pb::CodedOutputStream.ComputeGroupSize(46, element);
+        }
+        foreach (self::TestAllTypes.Types.NestedMessage element in RepeatedNestedMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(48, element);
+        }
+        foreach (self::ForeignMessage element in RepeatedForeignMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(49, element);
+        }
+        foreach (self::ImportMessage element in RepeatedImportMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(50, element);
+        }
+        foreach (self::TestAllTypes.Types.NestedEnum element in RepeatedNestedEnumList) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(51, (int) element);
+        }
+        foreach (self::ForeignEnum element in RepeatedForeignEnumList) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(52, (int) element);
+        }
+        foreach (self::ImportEnum element in RepeatedImportEnumList) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(53, (int) element);
+        }
+        foreach (string element in RepeatedStringPieceList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(54, element);
+        }
+        foreach (string element in RepeatedCordList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(55, element);
+        }
+        if (HasDefaultInt32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(61, DefaultInt32);
+        }
+        if (HasDefaultInt64) {
+          size += pb::CodedOutputStream.ComputeInt64Size(62, DefaultInt64);
+        }
+        if (HasDefaultUint32) {
+          size += pb::CodedOutputStream.ComputeUInt32Size(63, DefaultUint32);
+        }
+        if (HasDefaultUint64) {
+          size += pb::CodedOutputStream.ComputeUInt64Size(64, DefaultUint64);
+        }
+        if (HasDefaultSint32) {
+          size += pb::CodedOutputStream.ComputeSInt32Size(65, DefaultSint32);
+        }
+        if (HasDefaultSint64) {
+          size += pb::CodedOutputStream.ComputeSInt64Size(66, DefaultSint64);
+        }
+        if (HasDefaultFixed32) {
+          size += pb::CodedOutputStream.ComputeFixed32Size(67, DefaultFixed32);
+        }
+        if (HasDefaultFixed64) {
+          size += pb::CodedOutputStream.ComputeFixed64Size(68, DefaultFixed64);
+        }
+        if (HasDefaultSfixed32) {
+          size += pb::CodedOutputStream.ComputeSFixed32Size(69, DefaultSfixed32);
+        }
+        if (HasDefaultSfixed64) {
+          size += pb::CodedOutputStream.ComputeSFixed64Size(70, DefaultSfixed64);
+        }
+        if (HasDefaultFloat) {
+          size += pb::CodedOutputStream.ComputeFloatSize(71, DefaultFloat);
+        }
+        if (HasDefaultDouble) {
+          size += pb::CodedOutputStream.ComputeDoubleSize(72, DefaultDouble);
+        }
+        if (HasDefaultBool) {
+          size += pb::CodedOutputStream.ComputeBoolSize(73, DefaultBool);
+        }
+        if (HasDefaultString) {
+          size += pb::CodedOutputStream.ComputeStringSize(74, DefaultString);
+        }
+        if (HasDefaultBytes) {
+          size += pb::CodedOutputStream.ComputeBytesSize(75, DefaultBytes);
+        }
+        if (HasDefaultNestedEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(81, (int) DefaultNestedEnum);
+        }
+        if (HasDefaultForeignEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(82, (int) DefaultForeignEnum);
+        }
+        if (HasDefaultImportEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(83, (int) DefaultImportEnum);
+        }
+        if (HasDefaultStringPiece) {
+          size += pb::CodedOutputStream.ComputeStringSize(84, DefaultStringPiece);
+        }
+        if (HasDefaultCord) {
+          size += pb::CodedOutputStream.ComputeStringSize(85, DefaultCord);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestAllTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestAllTypes parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestAllTypes> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestAllTypes prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllTypes, Builder> {
+      // Construct using self::TestAllTypes.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestAllTypes result = new self::TestAllTypes();
+      
+      protected override self::TestAllTypes MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestAllTypes> Clear() {
+        result = new self::TestAllTypes();
+        return this;
+      }
+      
+      public override IBuilder<self::TestAllTypes> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestAllTypes.Descriptor; }
+      }
+      
+      public override self::TestAllTypes DefaultInstanceForType {
+        get { return self::TestAllTypes.DefaultInstance; }
+      }
+      
+      public override self::TestAllTypes BuildPartial() {
+        result.repeatedInt32_ = pbc::Lists<int>.AsReadOnly(result.repeatedInt32_);
+        result.repeatedInt64_ = pbc::Lists<long>.AsReadOnly(result.repeatedInt64_);
+        result.repeatedUint32_ = pbc::Lists<uint>.AsReadOnly(result.repeatedUint32_);
+        result.repeatedUint64_ = pbc::Lists<ulong>.AsReadOnly(result.repeatedUint64_);
+        result.repeatedSint32_ = pbc::Lists<int>.AsReadOnly(result.repeatedSint32_);
+        result.repeatedSint64_ = pbc::Lists<long>.AsReadOnly(result.repeatedSint64_);
+        result.repeatedFixed32_ = pbc::Lists<uint>.AsReadOnly(result.repeatedFixed32_);
+        result.repeatedFixed64_ = pbc::Lists<ulong>.AsReadOnly(result.repeatedFixed64_);
+        result.repeatedSfixed32_ = pbc::Lists<int>.AsReadOnly(result.repeatedSfixed32_);
+        result.repeatedSfixed64_ = pbc::Lists<long>.AsReadOnly(result.repeatedSfixed64_);
+        result.repeatedFloat_ = pbc::Lists<float>.AsReadOnly(result.repeatedFloat_);
+        result.repeatedDouble_ = pbc::Lists<double>.AsReadOnly(result.repeatedDouble_);
+        result.repeatedBool_ = pbc::Lists<bool>.AsReadOnly(result.repeatedBool_);
+        result.repeatedString_ = pbc::Lists<string>.AsReadOnly(result.repeatedString_);
+        result.repeatedBytes_ = pbc::Lists<pb::ByteString>.AsReadOnly(result.repeatedBytes_);
+        if (result.repeatedGroup_ != pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty) {
+          result.repeatedGroup_ = pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.AsReadOnly(result.repeatedGroup_);
+        }
+        if (result.repeatedNestedMessage_ != pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty) {
+          result.repeatedNestedMessage_ = pbc::Lists<self::TestAllTypes.Types.NestedMessage>.AsReadOnly(result.repeatedNestedMessage_);
+        }
+        if (result.repeatedForeignMessage_ != pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedForeignMessage_ = pbc::Lists<self::ForeignMessage>.AsReadOnly(result.repeatedForeignMessage_);
+        }
+        if (result.repeatedImportMessage_ != pbc::Lists<self::ImportMessage>.Empty) {
+          result.repeatedImportMessage_ = pbc::Lists<self::ImportMessage>.AsReadOnly(result.repeatedImportMessage_);
+        }
+        result.repeatedNestedEnum_ = pbc::Lists.AsReadOnly(result.repeatedNestedEnum_);
+        result.repeatedForeignEnum_ = pbc::Lists.AsReadOnly(result.repeatedForeignEnum_);
+        result.repeatedImportEnum_ = pbc::Lists.AsReadOnly(result.repeatedImportEnum_);
+        result.repeatedStringPiece_ = pbc::Lists<string>.AsReadOnly(result.repeatedStringPiece_);
+        result.repeatedCord_ = pbc::Lists<string>.AsReadOnly(result.repeatedCord_);
+        self::TestAllTypes returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestAllTypes) {
+          return MergeFrom((self::TestAllTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestAllTypes> MergeFrom(self::TestAllTypes other) {
+        if (other == self::TestAllTypes.DefaultInstance) return this;
+        if (other.HasOptionalInt32) {
+          OptionalInt32 = other.OptionalInt32;
+        }
+        if (other.HasOptionalInt64) {
+          OptionalInt64 = other.OptionalInt64;
+        }
+        if (other.HasOptionalUint32) {
+          OptionalUint32 = other.OptionalUint32;
+        }
+        if (other.HasOptionalUint64) {
+          OptionalUint64 = other.OptionalUint64;
+        }
+        if (other.HasOptionalSint32) {
+          OptionalSint32 = other.OptionalSint32;
+        }
+        if (other.HasOptionalSint64) {
+          OptionalSint64 = other.OptionalSint64;
+        }
+        if (other.HasOptionalFixed32) {
+          OptionalFixed32 = other.OptionalFixed32;
+        }
+        if (other.HasOptionalFixed64) {
+          OptionalFixed64 = other.OptionalFixed64;
+        }
+        if (other.HasOptionalSfixed32) {
+          OptionalSfixed32 = other.OptionalSfixed32;
+        }
+        if (other.HasOptionalSfixed64) {
+          OptionalSfixed64 = other.OptionalSfixed64;
+        }
+        if (other.HasOptionalFloat) {
+          OptionalFloat = other.OptionalFloat;
+        }
+        if (other.HasOptionalDouble) {
+          OptionalDouble = other.OptionalDouble;
+        }
+        if (other.HasOptionalBool) {
+          OptionalBool = other.OptionalBool;
+        }
+        if (other.HasOptionalString) {
+          OptionalString = other.OptionalString;
+        }
+        if (other.HasOptionalBytes) {
+          OptionalBytes = other.OptionalBytes;
+        }
+        if (other.HasOptionalGroup) {
+          MergeOptionalGroup(other.OptionalGroup);
+        }
+        if (other.HasOptionalNestedMessage) {
+          MergeOptionalNestedMessage(other.OptionalNestedMessage);
+        }
+        if (other.HasOptionalForeignMessage) {
+          MergeOptionalForeignMessage(other.OptionalForeignMessage);
+        }
+        if (other.HasOptionalImportMessage) {
+          MergeOptionalImportMessage(other.OptionalImportMessage);
+        }
+        if (other.HasOptionalNestedEnum) {
+          OptionalNestedEnum = other.OptionalNestedEnum;
+        }
+        if (other.HasOptionalForeignEnum) {
+          OptionalForeignEnum = other.OptionalForeignEnum;
+        }
+        if (other.HasOptionalImportEnum) {
+          OptionalImportEnum = other.OptionalImportEnum;
+        }
+        if (other.HasOptionalStringPiece) {
+          OptionalStringPiece = other.OptionalStringPiece;
+        }
+        if (other.HasOptionalCord) {
+          OptionalCord = other.OptionalCord;
+        }
+        if (other.repeatedInt32_.Count != 0) {
+          if (result.repeatedInt32_.Count == 0) {
+            result.repeatedInt32_ = new scg::List<int>();
+          }
+          base.AddRange(other.repeatedInt32_, result.repeatedInt32_);
+        }
+        if (other.repeatedInt64_.Count != 0) {
+          if (result.repeatedInt64_.Count == 0) {
+            result.repeatedInt64_ = new scg::List<long>();
+          }
+          base.AddRange(other.repeatedInt64_, result.repeatedInt64_);
+        }
+        if (other.repeatedUint32_.Count != 0) {
+          if (result.repeatedUint32_.Count == 0) {
+            result.repeatedUint32_ = new scg::List<uint>();
+          }
+          base.AddRange(other.repeatedUint32_, result.repeatedUint32_);
+        }
+        if (other.repeatedUint64_.Count != 0) {
+          if (result.repeatedUint64_.Count == 0) {
+            result.repeatedUint64_ = new scg::List<ulong>();
+          }
+          base.AddRange(other.repeatedUint64_, result.repeatedUint64_);
+        }
+        if (other.repeatedSint32_.Count != 0) {
+          if (result.repeatedSint32_.Count == 0) {
+            result.repeatedSint32_ = new scg::List<int>();
+          }
+          base.AddRange(other.repeatedSint32_, result.repeatedSint32_);
+        }
+        if (other.repeatedSint64_.Count != 0) {
+          if (result.repeatedSint64_.Count == 0) {
+            result.repeatedSint64_ = new scg::List<long>();
+          }
+          base.AddRange(other.repeatedSint64_, result.repeatedSint64_);
+        }
+        if (other.repeatedFixed32_.Count != 0) {
+          if (result.repeatedFixed32_.Count == 0) {
+            result.repeatedFixed32_ = new scg::List<uint>();
+          }
+          base.AddRange(other.repeatedFixed32_, result.repeatedFixed32_);
+        }
+        if (other.repeatedFixed64_.Count != 0) {
+          if (result.repeatedFixed64_.Count == 0) {
+            result.repeatedFixed64_ = new scg::List<ulong>();
+          }
+          base.AddRange(other.repeatedFixed64_, result.repeatedFixed64_);
+        }
+        if (other.repeatedSfixed32_.Count != 0) {
+          if (result.repeatedSfixed32_.Count == 0) {
+            result.repeatedSfixed32_ = new scg::List<int>();
+          }
+          base.AddRange(other.repeatedSfixed32_, result.repeatedSfixed32_);
+        }
+        if (other.repeatedSfixed64_.Count != 0) {
+          if (result.repeatedSfixed64_.Count == 0) {
+            result.repeatedSfixed64_ = new scg::List<long>();
+          }
+          base.AddRange(other.repeatedSfixed64_, result.repeatedSfixed64_);
+        }
+        if (other.repeatedFloat_.Count != 0) {
+          if (result.repeatedFloat_.Count == 0) {
+            result.repeatedFloat_ = new scg::List<float>();
+          }
+          base.AddRange(other.repeatedFloat_, result.repeatedFloat_);
+        }
+        if (other.repeatedDouble_.Count != 0) {
+          if (result.repeatedDouble_.Count == 0) {
+            result.repeatedDouble_ = new scg::List<double>();
+          }
+          base.AddRange(other.repeatedDouble_, result.repeatedDouble_);
+        }
+        if (other.repeatedBool_.Count != 0) {
+          if (result.repeatedBool_.Count == 0) {
+            result.repeatedBool_ = new scg::List<bool>();
+          }
+          base.AddRange(other.repeatedBool_, result.repeatedBool_);
+        }
+        if (other.repeatedString_.Count != 0) {
+          if (result.repeatedString_.Count == 0) {
+            result.repeatedString_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedString_, result.repeatedString_);
+        }
+        if (other.repeatedBytes_.Count != 0) {
+          if (result.repeatedBytes_.Count == 0) {
+            result.repeatedBytes_ = new scg::List<pb::ByteString>();
+          }
+          base.AddRange(other.repeatedBytes_, result.repeatedBytes_);
+        }
+        if (other.repeatedGroup_.Count != 0) {
+          if (result.repeatedGroup_.Count == 0) {
+            result.repeatedGroup_ = new scg::List<self::TestAllTypes.Types.RepeatedGroup>();
+          }
+          base.AddRange(other.repeatedGroup_, result.repeatedGroup_);
+        }
+        if (other.repeatedNestedMessage_.Count != 0) {
+          if (result.repeatedNestedMessage_.Count == 0) {
+            result.repeatedNestedMessage_ = new scg::List<self::TestAllTypes.Types.NestedMessage>();
+          }
+          base.AddRange(other.repeatedNestedMessage_, result.repeatedNestedMessage_);
+        }
+        if (other.repeatedForeignMessage_.Count != 0) {
+          if (result.repeatedForeignMessage_.Count == 0) {
+            result.repeatedForeignMessage_ = new scg::List<self::ForeignMessage>();
+          }
+          base.AddRange(other.repeatedForeignMessage_, result.repeatedForeignMessage_);
+        }
+        if (other.repeatedImportMessage_.Count != 0) {
+          if (result.repeatedImportMessage_.Count == 0) {
+            result.repeatedImportMessage_ = new scg::List<self::ImportMessage>();
+          }
+          base.AddRange(other.repeatedImportMessage_, result.repeatedImportMessage_);
+        }
+        if (other.repeatedNestedEnum_.Count != 0) {
+          if (result.repeatedNestedEnum_.Count == 0) {
+            result.repeatedNestedEnum_ = new scg::List<self::TestAllTypes.Types.NestedEnum>();
+          }
+          base.AddRange(other.repeatedNestedEnum_, result.repeatedNestedEnum_);
+        }
+        if (other.repeatedForeignEnum_.Count != 0) {
+          if (result.repeatedForeignEnum_.Count == 0) {
+            result.repeatedForeignEnum_ = new scg::List<self::ForeignEnum>();
+          }
+          base.AddRange(other.repeatedForeignEnum_, result.repeatedForeignEnum_);
+        }
+        if (other.repeatedImportEnum_.Count != 0) {
+          if (result.repeatedImportEnum_.Count == 0) {
+            result.repeatedImportEnum_ = new scg::List<self::ImportEnum>();
+          }
+          base.AddRange(other.repeatedImportEnum_, result.repeatedImportEnum_);
+        }
+        if (other.repeatedStringPiece_.Count != 0) {
+          if (result.repeatedStringPiece_.Count == 0) {
+            result.repeatedStringPiece_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedStringPiece_, result.repeatedStringPiece_);
+        }
+        if (other.repeatedCord_.Count != 0) {
+          if (result.repeatedCord_.Count == 0) {
+            result.repeatedCord_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedCord_, result.repeatedCord_);
+        }
+        if (other.HasDefaultInt32) {
+          DefaultInt32 = other.DefaultInt32;
+        }
+        if (other.HasDefaultInt64) {
+          DefaultInt64 = other.DefaultInt64;
+        }
+        if (other.HasDefaultUint32) {
+          DefaultUint32 = other.DefaultUint32;
+        }
+        if (other.HasDefaultUint64) {
+          DefaultUint64 = other.DefaultUint64;
+        }
+        if (other.HasDefaultSint32) {
+          DefaultSint32 = other.DefaultSint32;
+        }
+        if (other.HasDefaultSint64) {
+          DefaultSint64 = other.DefaultSint64;
+        }
+        if (other.HasDefaultFixed32) {
+          DefaultFixed32 = other.DefaultFixed32;
+        }
+        if (other.HasDefaultFixed64) {
+          DefaultFixed64 = other.DefaultFixed64;
+        }
+        if (other.HasDefaultSfixed32) {
+          DefaultSfixed32 = other.DefaultSfixed32;
+        }
+        if (other.HasDefaultSfixed64) {
+          DefaultSfixed64 = other.DefaultSfixed64;
+        }
+        if (other.HasDefaultFloat) {
+          DefaultFloat = other.DefaultFloat;
+        }
+        if (other.HasDefaultDouble) {
+          DefaultDouble = other.DefaultDouble;
+        }
+        if (other.HasDefaultBool) {
+          DefaultBool = other.DefaultBool;
+        }
+        if (other.HasDefaultString) {
+          DefaultString = other.DefaultString;
+        }
+        if (other.HasDefaultBytes) {
+          DefaultBytes = other.DefaultBytes;
+        }
+        if (other.HasDefaultNestedEnum) {
+          DefaultNestedEnum = other.DefaultNestedEnum;
+        }
+        if (other.HasDefaultForeignEnum) {
+          DefaultForeignEnum = other.DefaultForeignEnum;
+        }
+        if (other.HasDefaultImportEnum) {
+          DefaultImportEnum = other.DefaultImportEnum;
+        }
+        if (other.HasDefaultStringPiece) {
+          DefaultStringPiece = other.DefaultStringPiece;
+        }
+        if (other.HasDefaultCord) {
+          DefaultCord = other.DefaultCord;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestAllTypes> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestAllTypes> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              OptionalInt32 = input.ReadInt32();
+              break;
+            }
+            case 16: {
+              OptionalInt64 = input.ReadInt64();
+              break;
+            }
+            case 24: {
+              OptionalUint32 = input.ReadUInt32();
+              break;
+            }
+            case 32: {
+              OptionalUint64 = input.ReadUInt64();
+              break;
+            }
+            case 40: {
+              OptionalSint32 = input.ReadSInt32();
+              break;
+            }
+            case 48: {
+              OptionalSint64 = input.ReadSInt64();
+              break;
+            }
+            case 61: {
+              OptionalFixed32 = input.ReadFixed32();
+              break;
+            }
+            case 65: {
+              OptionalFixed64 = input.ReadFixed64();
+              break;
+            }
+            case 77: {
+              OptionalSfixed32 = input.ReadSFixed32();
+              break;
+            }
+            case 81: {
+              OptionalSfixed64 = input.ReadSFixed64();
+              break;
+            }
+            case 93: {
+              OptionalFloat = input.ReadFloat();
+              break;
+            }
+            case 97: {
+              OptionalDouble = input.ReadDouble();
+              break;
+            }
+            case 104: {
+              OptionalBool = input.ReadBool();
+              break;
+            }
+            case 114: {
+              OptionalString = input.ReadString();
+              break;
+            }
+            case 122: {
+              OptionalBytes = input.ReadBytes();
+              break;
+            }
+            case 131: {
+              self::TestAllTypes.Types.OptionalGroup.Builder subBuilder = self::TestAllTypes.Types.OptionalGroup.CreateBuilder();
+              if (HasOptionalGroup) {
+                subBuilder.MergeFrom(OptionalGroup);
+              }
+              input.ReadGroup(16, subBuilder, extensionRegistry);
+              OptionalGroup = subBuilder.BuildPartial();
+              break;
+            }
+            case 146: {
+              self::TestAllTypes.Types.NestedMessage.Builder subBuilder = self::TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (HasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 154: {
+              self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+              if (HasOptionalForeignMessage) {
+                subBuilder.MergeFrom(OptionalForeignMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalForeignMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 162: {
+              self::ImportMessage.Builder subBuilder = self::ImportMessage.CreateBuilder();
+              if (HasOptionalImportMessage) {
+                subBuilder.MergeFrom(OptionalImportMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalImportMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 168: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::TestAllTypes.Types.NestedEnum), rawValue)) {
+                unknownFields.MergeVarintField(21, (ulong) rawValue);
+              } else {
+                OptionalNestedEnum = (self::TestAllTypes.Types.NestedEnum) rawValue;
+              }
+              break;
+            }
+            case 176: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), rawValue)) {
+                unknownFields.MergeVarintField(22, (ulong) rawValue);
+              } else {
+                OptionalForeignEnum = (self::ForeignEnum) rawValue;
+              }
+              break;
+            }
+            case 184: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ImportEnum), rawValue)) {
+                unknownFields.MergeVarintField(23, (ulong) rawValue);
+              } else {
+                OptionalImportEnum = (self::ImportEnum) rawValue;
+              }
+              break;
+            }
+            case 194: {
+              OptionalStringPiece = input.ReadString();
+              break;
+            }
+            case 202: {
+              OptionalCord = input.ReadString();
+              break;
+            }
+            case 248: {
+              AddRepeatedInt32(input.ReadInt32());
+              break;
+            }
+            case 256: {
+              AddRepeatedInt64(input.ReadInt64());
+              break;
+            }
+            case 264: {
+              AddRepeatedUint32(input.ReadUInt32());
+              break;
+            }
+            case 272: {
+              AddRepeatedUint64(input.ReadUInt64());
+              break;
+            }
+            case 280: {
+              AddRepeatedSint32(input.ReadSInt32());
+              break;
+            }
+            case 288: {
+              AddRepeatedSint64(input.ReadSInt64());
+              break;
+            }
+            case 301: {
+              AddRepeatedFixed32(input.ReadFixed32());
+              break;
+            }
+            case 305: {
+              AddRepeatedFixed64(input.ReadFixed64());
+              break;
+            }
+            case 317: {
+              AddRepeatedSfixed32(input.ReadSFixed32());
+              break;
+            }
+            case 321: {
+              AddRepeatedSfixed64(input.ReadSFixed64());
+              break;
+            }
+            case 333: {
+              AddRepeatedFloat(input.ReadFloat());
+              break;
+            }
+            case 337: {
+              AddRepeatedDouble(input.ReadDouble());
+              break;
+            }
+            case 344: {
+              AddRepeatedBool(input.ReadBool());
+              break;
+            }
+            case 354: {
+              AddRepeatedString(input.ReadString());
+              break;
+            }
+            case 362: {
+              AddRepeatedBytes(input.ReadBytes());
+              break;
+            }
+            case 371: {
+              self::TestAllTypes.Types.RepeatedGroup.Builder subBuilder = self::TestAllTypes.Types.RepeatedGroup.CreateBuilder();
+              input.ReadGroup(46, subBuilder, extensionRegistry);
+              AddRepeatedGroup(subBuilder.BuildPartial());
+              break;
+            }
+            case 386: {
+              self::TestAllTypes.Types.NestedMessage.Builder subBuilder = self::TestAllTypes.Types.NestedMessage.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedNestedMessage(subBuilder.BuildPartial());
+              break;
+            }
+            case 394: {
+              self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedForeignMessage(subBuilder.BuildPartial());
+              break;
+            }
+            case 402: {
+              self::ImportMessage.Builder subBuilder = self::ImportMessage.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedImportMessage(subBuilder.BuildPartial());
+              break;
+            }
+            case 408: {
+              int rawValue = input.ReadEnum();
+              self::TestAllTypes.Types.NestedEnum value = (self::TestAllTypes.Types.NestedEnum) rawValue;
+              if (!global::System.Enum.IsDefined(typeof(self::TestAllTypes.Types.NestedEnum), value)) {
+                unknownFields.MergeVarintField(51, (ulong) rawValue);
+              } else {
+                AddRepeatedNestedEnum(value);
+              }
+              break;
+            }
+            case 416: {
+              int rawValue = input.ReadEnum();
+              self::ForeignEnum value = (self::ForeignEnum) rawValue;
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), value)) {
+                unknownFields.MergeVarintField(52, (ulong) rawValue);
+              } else {
+                AddRepeatedForeignEnum(value);
+              }
+              break;
+            }
+            case 424: {
+              int rawValue = input.ReadEnum();
+              self::ImportEnum value = (self::ImportEnum) rawValue;
+              if (!global::System.Enum.IsDefined(typeof(self::ImportEnum), value)) {
+                unknownFields.MergeVarintField(53, (ulong) rawValue);
+              } else {
+                AddRepeatedImportEnum(value);
+              }
+              break;
+            }
+            case 434: {
+              AddRepeatedStringPiece(input.ReadString());
+              break;
+            }
+            case 442: {
+              AddRepeatedCord(input.ReadString());
+              break;
+            }
+            case 488: {
+              DefaultInt32 = input.ReadInt32();
+              break;
+            }
+            case 496: {
+              DefaultInt64 = input.ReadInt64();
+              break;
+            }
+            case 504: {
+              DefaultUint32 = input.ReadUInt32();
+              break;
+            }
+            case 512: {
+              DefaultUint64 = input.ReadUInt64();
+              break;
+            }
+            case 520: {
+              DefaultSint32 = input.ReadSInt32();
+              break;
+            }
+            case 528: {
+              DefaultSint64 = input.ReadSInt64();
+              break;
+            }
+            case 541: {
+              DefaultFixed32 = input.ReadFixed32();
+              break;
+            }
+            case 545: {
+              DefaultFixed64 = input.ReadFixed64();
+              break;
+            }
+            case 557: {
+              DefaultSfixed32 = input.ReadSFixed32();
+              break;
+            }
+            case 561: {
+              DefaultSfixed64 = input.ReadSFixed64();
+              break;
+            }
+            case 573: {
+              DefaultFloat = input.ReadFloat();
+              break;
+            }
+            case 577: {
+              DefaultDouble = input.ReadDouble();
+              break;
+            }
+            case 584: {
+              DefaultBool = input.ReadBool();
+              break;
+            }
+            case 594: {
+              DefaultString = input.ReadString();
+              break;
+            }
+            case 602: {
+              DefaultBytes = input.ReadBytes();
+              break;
+            }
+            case 648: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::TestAllTypes.Types.NestedEnum), rawValue)) {
+                unknownFields.MergeVarintField(81, (ulong) rawValue);
+              } else {
+                DefaultNestedEnum = (self::TestAllTypes.Types.NestedEnum) rawValue;
+              }
+              break;
+            }
+            case 656: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), rawValue)) {
+                unknownFields.MergeVarintField(82, (ulong) rawValue);
+              } else {
+                DefaultForeignEnum = (self::ForeignEnum) rawValue;
+              }
+              break;
+            }
+            case 664: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ImportEnum), rawValue)) {
+                unknownFields.MergeVarintField(83, (ulong) rawValue);
+              } else {
+                DefaultImportEnum = (self::ImportEnum) rawValue;
+              }
+              break;
+            }
+            case 674: {
+              DefaultStringPiece = input.ReadString();
+              break;
+            }
+            case 682: {
+              DefaultCord = input.ReadString();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 optional_int32 = 1;
+      public bool HasOptionalInt32 {
+        get { return result.HasOptionalInt32; }
+      }
+      public int OptionalInt32 {
+        get { return result.OptionalInt32; }
+        set { SetOptionalInt32(value); }
+      }
+      public Builder SetOptionalInt32(int value) {
+        result.hasOptionalInt32 = true;
+        result.optionalInt32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt32() {
+        result.hasOptionalInt32 = false;
+        result.optionalInt32_ = 0;
+        return this;
+      }
+      
+      // optional int64 optional_int64 = 2;
+      public bool HasOptionalInt64 {
+        get { return result.HasOptionalInt64; }
+      }
+      public long OptionalInt64 {
+        get { return result.OptionalInt64; }
+        set { SetOptionalInt64(value); }
+      }
+      public Builder SetOptionalInt64(long value) {
+        result.hasOptionalInt64 = true;
+        result.optionalInt64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt64() {
+        result.hasOptionalInt64 = false;
+        result.optionalInt64_ = 0L;
+        return this;
+      }
+      
+      // optional uint32 optional_uint32 = 3;
+      public bool HasOptionalUint32 {
+        get { return result.HasOptionalUint32; }
+      }
+      public uint OptionalUint32 {
+        get { return result.OptionalUint32; }
+        set { SetOptionalUint32(value); }
+      }
+      public Builder SetOptionalUint32(uint value) {
+        result.hasOptionalUint32 = true;
+        result.optionalUint32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalUint32() {
+        result.hasOptionalUint32 = false;
+        result.optionalUint32_ = 0;
+        return this;
+      }
+      
+      // optional uint64 optional_uint64 = 4;
+      public bool HasOptionalUint64 {
+        get { return result.HasOptionalUint64; }
+      }
+      public ulong OptionalUint64 {
+        get { return result.OptionalUint64; }
+        set { SetOptionalUint64(value); }
+      }
+      public Builder SetOptionalUint64(ulong value) {
+        result.hasOptionalUint64 = true;
+        result.optionalUint64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalUint64() {
+        result.hasOptionalUint64 = false;
+        result.optionalUint64_ = 0UL;
+        return this;
+      }
+      
+      // optional sint32 optional_sint32 = 5;
+      public bool HasOptionalSint32 {
+        get { return result.HasOptionalSint32; }
+      }
+      public int OptionalSint32 {
+        get { return result.OptionalSint32; }
+        set { SetOptionalSint32(value); }
+      }
+      public Builder SetOptionalSint32(int value) {
+        result.hasOptionalSint32 = true;
+        result.optionalSint32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSint32() {
+        result.hasOptionalSint32 = false;
+        result.optionalSint32_ = 0;
+        return this;
+      }
+      
+      // optional sint64 optional_sint64 = 6;
+      public bool HasOptionalSint64 {
+        get { return result.HasOptionalSint64; }
+      }
+      public long OptionalSint64 {
+        get { return result.OptionalSint64; }
+        set { SetOptionalSint64(value); }
+      }
+      public Builder SetOptionalSint64(long value) {
+        result.hasOptionalSint64 = true;
+        result.optionalSint64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSint64() {
+        result.hasOptionalSint64 = false;
+        result.optionalSint64_ = 0L;
+        return this;
+      }
+      
+      // optional fixed32 optional_fixed32 = 7;
+      public bool HasOptionalFixed32 {
+        get { return result.HasOptionalFixed32; }
+      }
+      public uint OptionalFixed32 {
+        get { return result.OptionalFixed32; }
+        set { SetOptionalFixed32(value); }
+      }
+      public Builder SetOptionalFixed32(uint value) {
+        result.hasOptionalFixed32 = true;
+        result.optionalFixed32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFixed32() {
+        result.hasOptionalFixed32 = false;
+        result.optionalFixed32_ = 0;
+        return this;
+      }
+      
+      // optional fixed64 optional_fixed64 = 8;
+      public bool HasOptionalFixed64 {
+        get { return result.HasOptionalFixed64; }
+      }
+      public ulong OptionalFixed64 {
+        get { return result.OptionalFixed64; }
+        set { SetOptionalFixed64(value); }
+      }
+      public Builder SetOptionalFixed64(ulong value) {
+        result.hasOptionalFixed64 = true;
+        result.optionalFixed64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFixed64() {
+        result.hasOptionalFixed64 = false;
+        result.optionalFixed64_ = 0UL;
+        return this;
+      }
+      
+      // optional sfixed32 optional_sfixed32 = 9;
+      public bool HasOptionalSfixed32 {
+        get { return result.HasOptionalSfixed32; }
+      }
+      public int OptionalSfixed32 {
+        get { return result.OptionalSfixed32; }
+        set { SetOptionalSfixed32(value); }
+      }
+      public Builder SetOptionalSfixed32(int value) {
+        result.hasOptionalSfixed32 = true;
+        result.optionalSfixed32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSfixed32() {
+        result.hasOptionalSfixed32 = false;
+        result.optionalSfixed32_ = 0;
+        return this;
+      }
+      
+      // optional sfixed64 optional_sfixed64 = 10;
+      public bool HasOptionalSfixed64 {
+        get { return result.HasOptionalSfixed64; }
+      }
+      public long OptionalSfixed64 {
+        get { return result.OptionalSfixed64; }
+        set { SetOptionalSfixed64(value); }
+      }
+      public Builder SetOptionalSfixed64(long value) {
+        result.hasOptionalSfixed64 = true;
+        result.optionalSfixed64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSfixed64() {
+        result.hasOptionalSfixed64 = false;
+        result.optionalSfixed64_ = 0L;
+        return this;
+      }
+      
+      // optional float optional_float = 11;
+      public bool HasOptionalFloat {
+        get { return result.HasOptionalFloat; }
+      }
+      public float OptionalFloat {
+        get { return result.OptionalFloat; }
+        set { SetOptionalFloat(value); }
+      }
+      public Builder SetOptionalFloat(float value) {
+        result.hasOptionalFloat = true;
+        result.optionalFloat_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFloat() {
+        result.hasOptionalFloat = false;
+        result.optionalFloat_ = 0F;
+        return this;
+      }
+      
+      // optional double optional_double = 12;
+      public bool HasOptionalDouble {
+        get { return result.HasOptionalDouble; }
+      }
+      public double OptionalDouble {
+        get { return result.OptionalDouble; }
+        set { SetOptionalDouble(value); }
+      }
+      public Builder SetOptionalDouble(double value) {
+        result.hasOptionalDouble = true;
+        result.optionalDouble_ = value;
+        return this;
+      }
+      public Builder ClearOptionalDouble() {
+        result.hasOptionalDouble = false;
+        result.optionalDouble_ = 0D;
+        return this;
+      }
+      
+      // optional bool optional_bool = 13;
+      public bool HasOptionalBool {
+        get { return result.HasOptionalBool; }
+      }
+      public bool OptionalBool {
+        get { return result.OptionalBool; }
+        set { SetOptionalBool(value); }
+      }
+      public Builder SetOptionalBool(bool value) {
+        result.hasOptionalBool = true;
+        result.optionalBool_ = value;
+        return this;
+      }
+      public Builder ClearOptionalBool() {
+        result.hasOptionalBool = false;
+        result.optionalBool_ = false;
+        return this;
+      }
+      
+      // optional string optional_string = 14;
+      public bool HasOptionalString {
+        get { return result.HasOptionalString; }
+      }
+      public string OptionalString {
+        get { return result.OptionalString; }
+        set { SetOptionalString(value); }
+      }
+      public Builder SetOptionalString(string value) {
+        result.hasOptionalString = true;
+        result.optionalString_ = value;
+        return this;
+      }
+      public Builder ClearOptionalString() {
+        result.hasOptionalString = false;
+        result.optionalString_ = "";
+        return this;
+      }
+      
+      // optional bytes optional_bytes = 15;
+      public bool HasOptionalBytes {
+        get { return result.HasOptionalBytes; }
+      }
+      public pb::ByteString OptionalBytes {
+        get { return result.OptionalBytes; }
+        set { SetOptionalBytes(value); }
+      }
+      public Builder SetOptionalBytes(pb::ByteString value) {
+        result.hasOptionalBytes = true;
+        result.optionalBytes_ = value;
+        return this;
+      }
+      public Builder ClearOptionalBytes() {
+        result.hasOptionalBytes = false;
+        result.optionalBytes_ = pb::ByteString.Empty;
+        return this;
+      }
+      
+      // optional group OptionalGroup = 16 {
+      public bool HasOptionalGroup {
+        get { return result.HasOptionalGroup; }
+      }
+      public self::TestAllTypes.Types.OptionalGroup OptionalGroup {
+        get { return result.OptionalGroup; }
+        set { SetOptionalGroup(value); }
+      }
+      public Builder SetOptionalGroup(self::TestAllTypes.Types.OptionalGroup value) {
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = value;
+        return this;
+      }
+      public Builder SetOptionalGroup(self::TestAllTypes.Types.OptionalGroup.Builder builderForValue) {
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalGroup(self::TestAllTypes.Types.OptionalGroup value) {
+        if (result.HasOptionalGroup &&
+            result.optionalGroup_ != self::TestAllTypes.Types.OptionalGroup.DefaultInstance) {
+          result.optionalGroup_ =
+            self::TestAllTypes.Types.OptionalGroup.CreateBuilder(result.optionalGroup_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalGroup_ = value;
+        }
+        result.hasOptionalGroup = true;
+        return this;
+      }
+      public Builder ClearOptionalGroup() {
+        result.hasOptionalGroup = false;
+        result.optionalGroup_ = self::TestAllTypes.Types.OptionalGroup.DefaultInstance;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.TestAllTypes.NestedMessage optional_nested_message = 18;
+      public bool HasOptionalNestedMessage {
+        get { return result.HasOptionalNestedMessage; }
+      }
+      public self::TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(self::TestAllTypes.Types.NestedMessage value) {
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(self::TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(self::TestAllTypes.Types.NestedMessage value) {
+        if (result.HasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != self::TestAllTypes.Types.NestedMessage.DefaultInstance) {
+          result.optionalNestedMessage_ =
+            self::TestAllTypes.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = self::TestAllTypes.Types.NestedMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignMessage optional_foreign_message = 19;
+      public bool HasOptionalForeignMessage {
+        get { return result.HasOptionalForeignMessage; }
+      }
+      public self::ForeignMessage OptionalForeignMessage {
+        get { return result.OptionalForeignMessage; }
+        set { SetOptionalForeignMessage(value); }
+      }
+      public Builder SetOptionalForeignMessage(self::ForeignMessage value) {
+        result.hasOptionalForeignMessage = true;
+        result.optionalForeignMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalForeignMessage(self::ForeignMessage.Builder builderForValue) {
+        result.hasOptionalForeignMessage = true;
+        result.optionalForeignMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalForeignMessage(self::ForeignMessage value) {
+        if (result.HasOptionalForeignMessage &&
+            result.optionalForeignMessage_ != self::ForeignMessage.DefaultInstance) {
+          result.optionalForeignMessage_ =
+            self::ForeignMessage.CreateBuilder(result.optionalForeignMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalForeignMessage_ = value;
+        }
+        result.hasOptionalForeignMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalForeignMessage() {
+        result.hasOptionalForeignMessage = false;
+        result.optionalForeignMessage_ = self::ForeignMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional .protobuf_unittest_import.ImportMessage optional_import_message = 20;
+      public bool HasOptionalImportMessage {
+        get { return result.HasOptionalImportMessage; }
+      }
+      public self::ImportMessage OptionalImportMessage {
+        get { return result.OptionalImportMessage; }
+        set { SetOptionalImportMessage(value); }
+      }
+      public Builder SetOptionalImportMessage(self::ImportMessage value) {
+        result.hasOptionalImportMessage = true;
+        result.optionalImportMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalImportMessage(self::ImportMessage.Builder builderForValue) {
+        result.hasOptionalImportMessage = true;
+        result.optionalImportMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalImportMessage(self::ImportMessage value) {
+        if (result.HasOptionalImportMessage &&
+            result.optionalImportMessage_ != self::ImportMessage.DefaultInstance) {
+          result.optionalImportMessage_ =
+            self::ImportMessage.CreateBuilder(result.optionalImportMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalImportMessage_ = value;
+        }
+        result.hasOptionalImportMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalImportMessage() {
+        result.hasOptionalImportMessage = false;
+        result.optionalImportMessage_ = self::ImportMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.TestAllTypes.NestedEnum optional_nested_enum = 21;
+      public bool HasOptionalNestedEnum {
+        get { return result.HasOptionalNestedEnum; }
+      }
+      public self::TestAllTypes.Types.NestedEnum OptionalNestedEnum {
+        get { return result.OptionalNestedEnum; }
+        set { SetOptionalNestedEnum(value); }
+      }
+      public Builder SetOptionalNestedEnum(self::TestAllTypes.Types.NestedEnum value) {
+        result.hasOptionalNestedEnum = true;
+        result.optionalNestedEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalNestedEnum() {
+        result.hasOptionalNestedEnum = false;
+        result.optionalNestedEnum_ = self::TestAllTypes.Types.NestedEnum.FOO;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignEnum optional_foreign_enum = 22;
+      public bool HasOptionalForeignEnum {
+        get { return result.HasOptionalForeignEnum; }
+      }
+      public self::ForeignEnum OptionalForeignEnum {
+        get { return result.OptionalForeignEnum; }
+        set { SetOptionalForeignEnum(value); }
+      }
+      public Builder SetOptionalForeignEnum(self::ForeignEnum value) {
+        result.hasOptionalForeignEnum = true;
+        result.optionalForeignEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalForeignEnum() {
+        result.hasOptionalForeignEnum = false;
+        result.optionalForeignEnum_ = self::ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+      
+      // optional .protobuf_unittest_import.ImportEnum optional_import_enum = 23;
+      public bool HasOptionalImportEnum {
+        get { return result.HasOptionalImportEnum; }
+      }
+      public self::ImportEnum OptionalImportEnum {
+        get { return result.OptionalImportEnum; }
+        set { SetOptionalImportEnum(value); }
+      }
+      public Builder SetOptionalImportEnum(self::ImportEnum value) {
+        result.hasOptionalImportEnum = true;
+        result.optionalImportEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalImportEnum() {
+        result.hasOptionalImportEnum = false;
+        result.optionalImportEnum_ = self::ImportEnum.IMPORT_FOO;
+        return this;
+      }
+      
+      // optional string optional_string_piece = 24 [ctype = STRING_PIECE];
+      public bool HasOptionalStringPiece {
+        get { return result.HasOptionalStringPiece; }
+      }
+      public string OptionalStringPiece {
+        get { return result.OptionalStringPiece; }
+        set { SetOptionalStringPiece(value); }
+      }
+      public Builder SetOptionalStringPiece(string value) {
+        result.hasOptionalStringPiece = true;
+        result.optionalStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearOptionalStringPiece() {
+        result.hasOptionalStringPiece = false;
+        result.optionalStringPiece_ = "";
+        return this;
+      }
+      
+      // optional string optional_cord = 25 [ctype = CORD];
+      public bool HasOptionalCord {
+        get { return result.HasOptionalCord; }
+      }
+      public string OptionalCord {
+        get { return result.OptionalCord; }
+        set { SetOptionalCord(value); }
+      }
+      public Builder SetOptionalCord(string value) {
+        result.hasOptionalCord = true;
+        result.optionalCord_ = value;
+        return this;
+      }
+      public Builder ClearOptionalCord() {
+        result.hasOptionalCord = false;
+        result.optionalCord_ = "";
+        return this;
+      }
+      
+      // repeated int32 repeated_int32 = 31;
+      public scg::IList<int> RepeatedInt32List {
+        get { return pbc::Lists<int>.AsReadOnly(result.repeatedInt32_); }
+      }
+      public int RepeatedInt32Count {
+        get { return result.RepeatedInt32Count; }
+      }
+      public int GetRepeatedInt32(int index) {
+        return result.GetRepeatedInt32(index);
+      }
+      public Builder SetRepeatedInt32(int index, int value) {
+        result.repeatedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt32(int value) {
+        if (result.repeatedInt32_.Count == 0) {
+          result.repeatedInt32_ = new scg::List<int>();
+        }
+        result.repeatedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt32(scg::IEnumerable<int> values) {
+        if (result.repeatedInt32_.Count == 0) {
+          result.repeatedInt32_ = new scg::List<int>();
+        }
+        base.AddRange(values, result.repeatedInt32_);
+        return this;
+      }
+      public Builder ClearRepeatedInt32() {
+        result.repeatedInt32_ = pbc::Lists<int>.Empty;
+        return this;
+      }
+      
+      // repeated int64 repeated_int64 = 32;
+      public scg::IList<long> RepeatedInt64List {
+        get { return pbc::Lists<long>.AsReadOnly(result.repeatedInt64_); }
+      }
+      public int RepeatedInt64Count {
+        get { return result.RepeatedInt64Count; }
+      }
+      public long GetRepeatedInt64(int index) {
+        return result.GetRepeatedInt64(index);
+      }
+      public Builder SetRepeatedInt64(int index, long value) {
+        result.repeatedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt64(long value) {
+        if (result.repeatedInt64_.Count == 0) {
+          result.repeatedInt64_ = new scg::List<long>();
+        }
+        result.repeatedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt64(scg::IEnumerable<long> values) {
+        if (result.repeatedInt64_.Count == 0) {
+          result.repeatedInt64_ = new scg::List<long>();
+        }
+        base.AddRange(values, result.repeatedInt64_);
+        return this;
+      }
+      public Builder ClearRepeatedInt64() {
+        result.repeatedInt64_ = pbc::Lists<long>.Empty;
+        return this;
+      }
+      
+      // repeated uint32 repeated_uint32 = 33;
+      public scg::IList<uint> RepeatedUint32List {
+        get { return pbc::Lists<uint>.AsReadOnly(result.repeatedUint32_); }
+      }
+      public int RepeatedUint32Count {
+        get { return result.RepeatedUint32Count; }
+      }
+      public uint GetRepeatedUint32(int index) {
+        return result.GetRepeatedUint32(index);
+      }
+      public Builder SetRepeatedUint32(int index, uint value) {
+        result.repeatedUint32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedUint32(uint value) {
+        if (result.repeatedUint32_.Count == 0) {
+          result.repeatedUint32_ = new scg::List<uint>();
+        }
+        result.repeatedUint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedUint32(scg::IEnumerable<uint> values) {
+        if (result.repeatedUint32_.Count == 0) {
+          result.repeatedUint32_ = new scg::List<uint>();
+        }
+        base.AddRange(values, result.repeatedUint32_);
+        return this;
+      }
+      public Builder ClearRepeatedUint32() {
+        result.repeatedUint32_ = pbc::Lists<uint>.Empty;
+        return this;
+      }
+      
+      // repeated uint64 repeated_uint64 = 34;
+      public scg::IList<ulong> RepeatedUint64List {
+        get { return pbc::Lists<ulong>.AsReadOnly(result.repeatedUint64_); }
+      }
+      public int RepeatedUint64Count {
+        get { return result.RepeatedUint64Count; }
+      }
+      public ulong GetRepeatedUint64(int index) {
+        return result.GetRepeatedUint64(index);
+      }
+      public Builder SetRepeatedUint64(int index, ulong value) {
+        result.repeatedUint64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedUint64(ulong value) {
+        if (result.repeatedUint64_.Count == 0) {
+          result.repeatedUint64_ = new scg::List<ulong>();
+        }
+        result.repeatedUint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedUint64(scg::IEnumerable<ulong> values) {
+        if (result.repeatedUint64_.Count == 0) {
+          result.repeatedUint64_ = new scg::List<ulong>();
+        }
+        base.AddRange(values, result.repeatedUint64_);
+        return this;
+      }
+      public Builder ClearRepeatedUint64() {
+        result.repeatedUint64_ = pbc::Lists<ulong>.Empty;
+        return this;
+      }
+      
+      // repeated sint32 repeated_sint32 = 35;
+      public scg::IList<int> RepeatedSint32List {
+        get { return pbc::Lists<int>.AsReadOnly(result.repeatedSint32_); }
+      }
+      public int RepeatedSint32Count {
+        get { return result.RepeatedSint32Count; }
+      }
+      public int GetRepeatedSint32(int index) {
+        return result.GetRepeatedSint32(index);
+      }
+      public Builder SetRepeatedSint32(int index, int value) {
+        result.repeatedSint32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSint32(int value) {
+        if (result.repeatedSint32_.Count == 0) {
+          result.repeatedSint32_ = new scg::List<int>();
+        }
+        result.repeatedSint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSint32(scg::IEnumerable<int> values) {
+        if (result.repeatedSint32_.Count == 0) {
+          result.repeatedSint32_ = new scg::List<int>();
+        }
+        base.AddRange(values, result.repeatedSint32_);
+        return this;
+      }
+      public Builder ClearRepeatedSint32() {
+        result.repeatedSint32_ = pbc::Lists<int>.Empty;
+        return this;
+      }
+      
+      // repeated sint64 repeated_sint64 = 36;
+      public scg::IList<long> RepeatedSint64List {
+        get { return pbc::Lists<long>.AsReadOnly(result.repeatedSint64_); }
+      }
+      public int RepeatedSint64Count {
+        get { return result.RepeatedSint64Count; }
+      }
+      public long GetRepeatedSint64(int index) {
+        return result.GetRepeatedSint64(index);
+      }
+      public Builder SetRepeatedSint64(int index, long value) {
+        result.repeatedSint64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSint64(long value) {
+        if (result.repeatedSint64_.Count == 0) {
+          result.repeatedSint64_ = new scg::List<long>();
+        }
+        result.repeatedSint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSint64(scg::IEnumerable<long> values) {
+        if (result.repeatedSint64_.Count == 0) {
+          result.repeatedSint64_ = new scg::List<long>();
+        }
+        base.AddRange(values, result.repeatedSint64_);
+        return this;
+      }
+      public Builder ClearRepeatedSint64() {
+        result.repeatedSint64_ = pbc::Lists<long>.Empty;
+        return this;
+      }
+      
+      // repeated fixed32 repeated_fixed32 = 37;
+      public scg::IList<uint> RepeatedFixed32List {
+        get { return pbc::Lists<uint>.AsReadOnly(result.repeatedFixed32_); }
+      }
+      public int RepeatedFixed32Count {
+        get { return result.RepeatedFixed32Count; }
+      }
+      public uint GetRepeatedFixed32(int index) {
+        return result.GetRepeatedFixed32(index);
+      }
+      public Builder SetRepeatedFixed32(int index, uint value) {
+        result.repeatedFixed32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFixed32(uint value) {
+        if (result.repeatedFixed32_.Count == 0) {
+          result.repeatedFixed32_ = new scg::List<uint>();
+        }
+        result.repeatedFixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFixed32(scg::IEnumerable<uint> values) {
+        if (result.repeatedFixed32_.Count == 0) {
+          result.repeatedFixed32_ = new scg::List<uint>();
+        }
+        base.AddRange(values, result.repeatedFixed32_);
+        return this;
+      }
+      public Builder ClearRepeatedFixed32() {
+        result.repeatedFixed32_ = pbc::Lists<uint>.Empty;
+        return this;
+      }
+      
+      // repeated fixed64 repeated_fixed64 = 38;
+      public scg::IList<ulong> RepeatedFixed64List {
+        get { return pbc::Lists<ulong>.AsReadOnly(result.repeatedFixed64_); }
+      }
+      public int RepeatedFixed64Count {
+        get { return result.RepeatedFixed64Count; }
+      }
+      public ulong GetRepeatedFixed64(int index) {
+        return result.GetRepeatedFixed64(index);
+      }
+      public Builder SetRepeatedFixed64(int index, ulong value) {
+        result.repeatedFixed64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFixed64(ulong value) {
+        if (result.repeatedFixed64_.Count == 0) {
+          result.repeatedFixed64_ = new scg::List<ulong>();
+        }
+        result.repeatedFixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFixed64(scg::IEnumerable<ulong> values) {
+        if (result.repeatedFixed64_.Count == 0) {
+          result.repeatedFixed64_ = new scg::List<ulong>();
+        }
+        base.AddRange(values, result.repeatedFixed64_);
+        return this;
+      }
+      public Builder ClearRepeatedFixed64() {
+        result.repeatedFixed64_ = pbc::Lists<ulong>.Empty;
+        return this;
+      }
+      
+      // repeated sfixed32 repeated_sfixed32 = 39;
+      public scg::IList<int> RepeatedSfixed32List {
+        get { return pbc::Lists<int>.AsReadOnly(result.repeatedSfixed32_); }
+      }
+      public int RepeatedSfixed32Count {
+        get { return result.RepeatedSfixed32Count; }
+      }
+      public int GetRepeatedSfixed32(int index) {
+        return result.GetRepeatedSfixed32(index);
+      }
+      public Builder SetRepeatedSfixed32(int index, int value) {
+        result.repeatedSfixed32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSfixed32(int value) {
+        if (result.repeatedSfixed32_.Count == 0) {
+          result.repeatedSfixed32_ = new scg::List<int>();
+        }
+        result.repeatedSfixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSfixed32(scg::IEnumerable<int> values) {
+        if (result.repeatedSfixed32_.Count == 0) {
+          result.repeatedSfixed32_ = new scg::List<int>();
+        }
+        base.AddRange(values, result.repeatedSfixed32_);
+        return this;
+      }
+      public Builder ClearRepeatedSfixed32() {
+        result.repeatedSfixed32_ = pbc::Lists<int>.Empty;
+        return this;
+      }
+      
+      // repeated sfixed64 repeated_sfixed64 = 40;
+      public scg::IList<long> RepeatedSfixed64List {
+        get { return pbc::Lists<long>.AsReadOnly(result.repeatedSfixed64_); }
+      }
+      public int RepeatedSfixed64Count {
+        get { return result.RepeatedSfixed64Count; }
+      }
+      public long GetRepeatedSfixed64(int index) {
+        return result.GetRepeatedSfixed64(index);
+      }
+      public Builder SetRepeatedSfixed64(int index, long value) {
+        result.repeatedSfixed64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSfixed64(long value) {
+        if (result.repeatedSfixed64_.Count == 0) {
+          result.repeatedSfixed64_ = new scg::List<long>();
+        }
+        result.repeatedSfixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSfixed64(scg::IEnumerable<long> values) {
+        if (result.repeatedSfixed64_.Count == 0) {
+          result.repeatedSfixed64_ = new scg::List<long>();
+        }
+        base.AddRange(values, result.repeatedSfixed64_);
+        return this;
+      }
+      public Builder ClearRepeatedSfixed64() {
+        result.repeatedSfixed64_ = pbc::Lists<long>.Empty;
+        return this;
+      }
+      
+      // repeated float repeated_float = 41;
+      public scg::IList<float> RepeatedFloatList {
+        get { return pbc::Lists<float>.AsReadOnly(result.repeatedFloat_); }
+      }
+      public int RepeatedFloatCount {
+        get { return result.RepeatedFloatCount; }
+      }
+      public float GetRepeatedFloat(int index) {
+        return result.GetRepeatedFloat(index);
+      }
+      public Builder SetRepeatedFloat(int index, float value) {
+        result.repeatedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFloat(float value) {
+        if (result.repeatedFloat_.Count == 0) {
+          result.repeatedFloat_ = new scg::List<float>();
+        }
+        result.repeatedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFloat(scg::IEnumerable<float> values) {
+        if (result.repeatedFloat_.Count == 0) {
+          result.repeatedFloat_ = new scg::List<float>();
+        }
+        base.AddRange(values, result.repeatedFloat_);
+        return this;
+      }
+      public Builder ClearRepeatedFloat() {
+        result.repeatedFloat_ = pbc::Lists<float>.Empty;
+        return this;
+      }
+      
+      // repeated double repeated_double = 42;
+      public scg::IList<double> RepeatedDoubleList {
+        get { return pbc::Lists<double>.AsReadOnly(result.repeatedDouble_); }
+      }
+      public int RepeatedDoubleCount {
+        get { return result.RepeatedDoubleCount; }
+      }
+      public double GetRepeatedDouble(int index) {
+        return result.GetRepeatedDouble(index);
+      }
+      public Builder SetRepeatedDouble(int index, double value) {
+        result.repeatedDouble_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedDouble(double value) {
+        if (result.repeatedDouble_.Count == 0) {
+          result.repeatedDouble_ = new scg::List<double>();
+        }
+        result.repeatedDouble_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedDouble(scg::IEnumerable<double> values) {
+        if (result.repeatedDouble_.Count == 0) {
+          result.repeatedDouble_ = new scg::List<double>();
+        }
+        base.AddRange(values, result.repeatedDouble_);
+        return this;
+      }
+      public Builder ClearRepeatedDouble() {
+        result.repeatedDouble_ = pbc::Lists<double>.Empty;
+        return this;
+      }
+      
+      // repeated bool repeated_bool = 43;
+      public scg::IList<bool> RepeatedBoolList {
+        get { return pbc::Lists<bool>.AsReadOnly(result.repeatedBool_); }
+      }
+      public int RepeatedBoolCount {
+        get { return result.RepeatedBoolCount; }
+      }
+      public bool GetRepeatedBool(int index) {
+        return result.GetRepeatedBool(index);
+      }
+      public Builder SetRepeatedBool(int index, bool value) {
+        result.repeatedBool_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedBool(bool value) {
+        if (result.repeatedBool_.Count == 0) {
+          result.repeatedBool_ = new scg::List<bool>();
+        }
+        result.repeatedBool_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedBool(scg::IEnumerable<bool> values) {
+        if (result.repeatedBool_.Count == 0) {
+          result.repeatedBool_ = new scg::List<bool>();
+        }
+        base.AddRange(values, result.repeatedBool_);
+        return this;
+      }
+      public Builder ClearRepeatedBool() {
+        result.repeatedBool_ = pbc::Lists<bool>.Empty;
+        return this;
+      }
+      
+      // repeated string repeated_string = 44;
+      public scg::IList<string> RepeatedStringList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedString_); }
+      }
+      public int RepeatedStringCount {
+        get { return result.RepeatedStringCount; }
+      }
+      public string GetRepeatedString(int index) {
+        return result.GetRepeatedString(index);
+      }
+      public Builder SetRepeatedString(int index, string value) {
+        result.repeatedString_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedString(string value) {
+        if (result.repeatedString_.Count == 0) {
+          result.repeatedString_ = new scg::List<string>();
+        }
+        result.repeatedString_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedString(scg::IEnumerable<string> values) {
+        if (result.repeatedString_.Count == 0) {
+          result.repeatedString_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedString_);
+        return this;
+      }
+      public Builder ClearRepeatedString() {
+        result.repeatedString_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // repeated bytes repeated_bytes = 45;
+      public scg::IList<pb::ByteString> RepeatedBytesList {
+        get { return pbc::Lists<pb::ByteString>.AsReadOnly(result.repeatedBytes_); }
+      }
+      public int RepeatedBytesCount {
+        get { return result.RepeatedBytesCount; }
+      }
+      public pb::ByteString GetRepeatedBytes(int index) {
+        return result.GetRepeatedBytes(index);
+      }
+      public Builder SetRepeatedBytes(int index, pb::ByteString value) {
+        result.repeatedBytes_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedBytes(pb::ByteString value) {
+        if (result.repeatedBytes_.Count == 0) {
+          result.repeatedBytes_ = new scg::List<pb::ByteString>();
+        }
+        result.repeatedBytes_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedBytes(scg::IEnumerable<pb::ByteString> values) {
+        if (result.repeatedBytes_.Count == 0) {
+          result.repeatedBytes_ = new scg::List<pb::ByteString>();
+        }
+        base.AddRange(values, result.repeatedBytes_);
+        return this;
+      }
+      public Builder ClearRepeatedBytes() {
+        result.repeatedBytes_ = pbc::Lists<pb::ByteString>.Empty;
+        return this;
+      }
+      
+      // repeated group RepeatedGroup = 46 {
+      public scg::IList<self::TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedGroup_); }
+      }
+      public int RepeatedGroupCount {
+        get { return result.RepeatedGroupCount; }
+      }
+      public self::TestAllTypes.Types.RepeatedGroup GetRepeatedGroup(int index) {
+        return result.GetRepeatedGroup(index);
+      }
+      public Builder SetRepeatedGroup(int index, self::TestAllTypes.Types.RepeatedGroup value) {
+        result.repeatedGroup_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedGroup(int index, self::TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {
+        result.repeatedGroup_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedGroup(self::TestAllTypes.Types.RepeatedGroup value) {
+        if (result.repeatedGroup_ == pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty) {
+          result.repeatedGroup_ = new scg::List<self::TestAllTypes.Types.RepeatedGroup>();
+        }
+        result.repeatedGroup_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedGroup(self::TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {
+        if (result.repeatedGroup_ == pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty) {
+          result.repeatedGroup_ = new scg::List<self::TestAllTypes.Types.RepeatedGroup>();
+        }
+        result.repeatedGroup_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedGroup(scg::IEnumerable<self::TestAllTypes.Types.RepeatedGroup> values) {
+        if (result.repeatedGroup_ == pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty) {
+          result.repeatedGroup_ = new scg::List<self::TestAllTypes.Types.RepeatedGroup>();
+        }
+        base.AddRange(values, result.repeatedGroup_);
+        return this;
+      }
+      public Builder ClearRepeatedGroup() {
+        result.repeatedGroup_ = pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.TestAllTypes.NestedMessage repeated_nested_message = 48;
+      public scg::IList<self::TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedNestedMessage_); }
+      }
+      public int RepeatedNestedMessageCount {
+        get { return result.RepeatedNestedMessageCount; }
+      }
+      public self::TestAllTypes.Types.NestedMessage GetRepeatedNestedMessage(int index) {
+        return result.GetRepeatedNestedMessage(index);
+      }
+      public Builder SetRepeatedNestedMessage(int index, self::TestAllTypes.Types.NestedMessage value) {
+        result.repeatedNestedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedNestedMessage(int index, self::TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        result.repeatedNestedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedNestedMessage(self::TestAllTypes.Types.NestedMessage value) {
+        if (result.repeatedNestedMessage_ == pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty) {
+          result.repeatedNestedMessage_ = new scg::List<self::TestAllTypes.Types.NestedMessage>();
+        }
+        result.repeatedNestedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedNestedMessage(self::TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        if (result.repeatedNestedMessage_ == pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty) {
+          result.repeatedNestedMessage_ = new scg::List<self::TestAllTypes.Types.NestedMessage>();
+        }
+        result.repeatedNestedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedNestedMessage(scg::IEnumerable<self::TestAllTypes.Types.NestedMessage> values) {
+        if (result.repeatedNestedMessage_ == pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty) {
+          result.repeatedNestedMessage_ = new scg::List<self::TestAllTypes.Types.NestedMessage>();
+        }
+        base.AddRange(values, result.repeatedNestedMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedNestedMessage() {
+        result.repeatedNestedMessage_ = pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.ForeignMessage repeated_foreign_message = 49;
+      public scg::IList<self::ForeignMessage> RepeatedForeignMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedForeignMessage_); }
+      }
+      public int RepeatedForeignMessageCount {
+        get { return result.RepeatedForeignMessageCount; }
+      }
+      public self::ForeignMessage GetRepeatedForeignMessage(int index) {
+        return result.GetRepeatedForeignMessage(index);
+      }
+      public Builder SetRepeatedForeignMessage(int index, self::ForeignMessage value) {
+        result.repeatedForeignMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedForeignMessage(int index, self::ForeignMessage.Builder builderForValue) {
+        result.repeatedForeignMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedForeignMessage(self::ForeignMessage value) {
+        if (result.repeatedForeignMessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedForeignMessage_ = new scg::List<self::ForeignMessage>();
+        }
+        result.repeatedForeignMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedForeignMessage(self::ForeignMessage.Builder builderForValue) {
+        if (result.repeatedForeignMessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedForeignMessage_ = new scg::List<self::ForeignMessage>();
+        }
+        result.repeatedForeignMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedForeignMessage(scg::IEnumerable<self::ForeignMessage> values) {
+        if (result.repeatedForeignMessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedForeignMessage_ = new scg::List<self::ForeignMessage>();
+        }
+        base.AddRange(values, result.repeatedForeignMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedForeignMessage() {
+        result.repeatedForeignMessage_ = pbc::Lists<self::ForeignMessage>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest_import.ImportMessage repeated_import_message = 50;
+      public scg::IList<self::ImportMessage> RepeatedImportMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedImportMessage_); }
+      }
+      public int RepeatedImportMessageCount {
+        get { return result.RepeatedImportMessageCount; }
+      }
+      public self::ImportMessage GetRepeatedImportMessage(int index) {
+        return result.GetRepeatedImportMessage(index);
+      }
+      public Builder SetRepeatedImportMessage(int index, self::ImportMessage value) {
+        result.repeatedImportMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedImportMessage(int index, self::ImportMessage.Builder builderForValue) {
+        result.repeatedImportMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedImportMessage(self::ImportMessage value) {
+        if (result.repeatedImportMessage_ == pbc::Lists<self::ImportMessage>.Empty) {
+          result.repeatedImportMessage_ = new scg::List<self::ImportMessage>();
+        }
+        result.repeatedImportMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedImportMessage(self::ImportMessage.Builder builderForValue) {
+        if (result.repeatedImportMessage_ == pbc::Lists<self::ImportMessage>.Empty) {
+          result.repeatedImportMessage_ = new scg::List<self::ImportMessage>();
+        }
+        result.repeatedImportMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedImportMessage(scg::IEnumerable<self::ImportMessage> values) {
+        if (result.repeatedImportMessage_ == pbc::Lists<self::ImportMessage>.Empty) {
+          result.repeatedImportMessage_ = new scg::List<self::ImportMessage>();
+        }
+        base.AddRange(values, result.repeatedImportMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedImportMessage() {
+        result.repeatedImportMessage_ = pbc::Lists<self::ImportMessage>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.TestAllTypes.NestedEnum repeated_nested_enum = 51;
+      public scg::IList<self::TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedNestedEnum_); }
+      }
+      public int RepeatedNestedEnumCount {
+        get { return result.RepeatedNestedEnumCount; } 
+      }
+      public self::TestAllTypes.Types.NestedEnum GetRepeatedNestedEnum(int index) {
+        return result.GetRepeatedNestedEnum(index);
+      }
+      public Builder SetRepeatedNestedEnum(int index, self::TestAllTypes.Types.NestedEnum value) {
+        result.repeatedNestedEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedNestedEnum(self::TestAllTypes.Types.NestedEnum value) {
+        if (result.repeatedNestedEnum_.Count == 0) {
+          result.repeatedNestedEnum_ = new scg::List<self::TestAllTypes.Types.NestedEnum>();
+        }
+        result.repeatedNestedEnum_.Add(value);
+        return this;
+      }
+      public Builder AddAllRepeatedNestedEnum(scg::IEnumerable<self::TestAllTypes.Types.NestedEnum> values) {
+        if (result.repeatedNestedEnum_.Count == 0) {
+          result.repeatedNestedEnum_ = new scg::List<self::TestAllTypes.Types.NestedEnum>();
+        }
+        base.AddRange(values, result.repeatedNestedEnum_);
+        return this;
+      }
+      public Builder ClearRepeatedNestedEnum() {
+        result.repeatedNestedEnum_ = pbc::Lists<self::TestAllTypes.Types.NestedEnum>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.ForeignEnum repeated_foreign_enum = 52;
+      public scg::IList<self::ForeignEnum> RepeatedForeignEnumList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedForeignEnum_); }
+      }
+      public int RepeatedForeignEnumCount {
+        get { return result.RepeatedForeignEnumCount; } 
+      }
+      public self::ForeignEnum GetRepeatedForeignEnum(int index) {
+        return result.GetRepeatedForeignEnum(index);
+      }
+      public Builder SetRepeatedForeignEnum(int index, self::ForeignEnum value) {
+        result.repeatedForeignEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedForeignEnum(self::ForeignEnum value) {
+        if (result.repeatedForeignEnum_.Count == 0) {
+          result.repeatedForeignEnum_ = new scg::List<self::ForeignEnum>();
+        }
+        result.repeatedForeignEnum_.Add(value);
+        return this;
+      }
+      public Builder AddAllRepeatedForeignEnum(scg::IEnumerable<self::ForeignEnum> values) {
+        if (result.repeatedForeignEnum_.Count == 0) {
+          result.repeatedForeignEnum_ = new scg::List<self::ForeignEnum>();
+        }
+        base.AddRange(values, result.repeatedForeignEnum_);
+        return this;
+      }
+      public Builder ClearRepeatedForeignEnum() {
+        result.repeatedForeignEnum_ = pbc::Lists<self::ForeignEnum>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest_import.ImportEnum repeated_import_enum = 53;
+      public scg::IList<self::ImportEnum> RepeatedImportEnumList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedImportEnum_); }
+      }
+      public int RepeatedImportEnumCount {
+        get { return result.RepeatedImportEnumCount; } 
+      }
+      public self::ImportEnum GetRepeatedImportEnum(int index) {
+        return result.GetRepeatedImportEnum(index);
+      }
+      public Builder SetRepeatedImportEnum(int index, self::ImportEnum value) {
+        result.repeatedImportEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedImportEnum(self::ImportEnum value) {
+        if (result.repeatedImportEnum_.Count == 0) {
+          result.repeatedImportEnum_ = new scg::List<self::ImportEnum>();
+        }
+        result.repeatedImportEnum_.Add(value);
+        return this;
+      }
+      public Builder AddAllRepeatedImportEnum(scg::IEnumerable<self::ImportEnum> values) {
+        if (result.repeatedImportEnum_.Count == 0) {
+          result.repeatedImportEnum_ = new scg::List<self::ImportEnum>();
+        }
+        base.AddRange(values, result.repeatedImportEnum_);
+        return this;
+      }
+      public Builder ClearRepeatedImportEnum() {
+        result.repeatedImportEnum_ = pbc::Lists<self::ImportEnum>.Empty;
+        return this;
+      }
+      
+      // repeated string repeated_string_piece = 54 [ctype = STRING_PIECE];
+      public scg::IList<string> RepeatedStringPieceList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedStringPiece_); }
+      }
+      public int RepeatedStringPieceCount {
+        get { return result.RepeatedStringPieceCount; }
+      }
+      public string GetRepeatedStringPiece(int index) {
+        return result.GetRepeatedStringPiece(index);
+      }
+      public Builder SetRepeatedStringPiece(int index, string value) {
+        result.repeatedStringPiece_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringPiece(string value) {
+        if (result.repeatedStringPiece_.Count == 0) {
+          result.repeatedStringPiece_ = new scg::List<string>();
+        }
+        result.repeatedStringPiece_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringPiece(scg::IEnumerable<string> values) {
+        if (result.repeatedStringPiece_.Count == 0) {
+          result.repeatedStringPiece_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedStringPiece_);
+        return this;
+      }
+      public Builder ClearRepeatedStringPiece() {
+        result.repeatedStringPiece_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // repeated string repeated_cord = 55 [ctype = CORD];
+      public scg::IList<string> RepeatedCordList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedCord_); }
+      }
+      public int RepeatedCordCount {
+        get { return result.RepeatedCordCount; }
+      }
+      public string GetRepeatedCord(int index) {
+        return result.GetRepeatedCord(index);
+      }
+      public Builder SetRepeatedCord(int index, string value) {
+        result.repeatedCord_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedCord(string value) {
+        if (result.repeatedCord_.Count == 0) {
+          result.repeatedCord_ = new scg::List<string>();
+        }
+        result.repeatedCord_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedCord(scg::IEnumerable<string> values) {
+        if (result.repeatedCord_.Count == 0) {
+          result.repeatedCord_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedCord_);
+        return this;
+      }
+      public Builder ClearRepeatedCord() {
+        result.repeatedCord_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // optional int32 default_int32 = 61 [default = 41];
+      public bool HasDefaultInt32 {
+        get { return result.HasDefaultInt32; }
+      }
+      public int DefaultInt32 {
+        get { return result.DefaultInt32; }
+        set { SetDefaultInt32(value); }
+      }
+      public Builder SetDefaultInt32(int value) {
+        result.hasDefaultInt32 = true;
+        result.defaultInt32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultInt32() {
+        result.hasDefaultInt32 = false;
+        result.defaultInt32_ = 41;
+        return this;
+      }
+      
+      // optional int64 default_int64 = 62 [default = 42];
+      public bool HasDefaultInt64 {
+        get { return result.HasDefaultInt64; }
+      }
+      public long DefaultInt64 {
+        get { return result.DefaultInt64; }
+        set { SetDefaultInt64(value); }
+      }
+      public Builder SetDefaultInt64(long value) {
+        result.hasDefaultInt64 = true;
+        result.defaultInt64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultInt64() {
+        result.hasDefaultInt64 = false;
+        result.defaultInt64_ = 42L;
+        return this;
+      }
+      
+      // optional uint32 default_uint32 = 63 [default = 43];
+      public bool HasDefaultUint32 {
+        get { return result.HasDefaultUint32; }
+      }
+      public uint DefaultUint32 {
+        get { return result.DefaultUint32; }
+        set { SetDefaultUint32(value); }
+      }
+      public Builder SetDefaultUint32(uint value) {
+        result.hasDefaultUint32 = true;
+        result.defaultUint32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultUint32() {
+        result.hasDefaultUint32 = false;
+        result.defaultUint32_ = 43;
+        return this;
+      }
+      
+      // optional uint64 default_uint64 = 64 [default = 44];
+      public bool HasDefaultUint64 {
+        get { return result.HasDefaultUint64; }
+      }
+      public ulong DefaultUint64 {
+        get { return result.DefaultUint64; }
+        set { SetDefaultUint64(value); }
+      }
+      public Builder SetDefaultUint64(ulong value) {
+        result.hasDefaultUint64 = true;
+        result.defaultUint64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultUint64() {
+        result.hasDefaultUint64 = false;
+        result.defaultUint64_ = 44UL;
+        return this;
+      }
+      
+      // optional sint32 default_sint32 = 65 [default = -45];
+      public bool HasDefaultSint32 {
+        get { return result.HasDefaultSint32; }
+      }
+      public int DefaultSint32 {
+        get { return result.DefaultSint32; }
+        set { SetDefaultSint32(value); }
+      }
+      public Builder SetDefaultSint32(int value) {
+        result.hasDefaultSint32 = true;
+        result.defaultSint32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSint32() {
+        result.hasDefaultSint32 = false;
+        result.defaultSint32_ = -45;
+        return this;
+      }
+      
+      // optional sint64 default_sint64 = 66 [default = 46];
+      public bool HasDefaultSint64 {
+        get { return result.HasDefaultSint64; }
+      }
+      public long DefaultSint64 {
+        get { return result.DefaultSint64; }
+        set { SetDefaultSint64(value); }
+      }
+      public Builder SetDefaultSint64(long value) {
+        result.hasDefaultSint64 = true;
+        result.defaultSint64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSint64() {
+        result.hasDefaultSint64 = false;
+        result.defaultSint64_ = 46L;
+        return this;
+      }
+      
+      // optional fixed32 default_fixed32 = 67 [default = 47];
+      public bool HasDefaultFixed32 {
+        get { return result.HasDefaultFixed32; }
+      }
+      public uint DefaultFixed32 {
+        get { return result.DefaultFixed32; }
+        set { SetDefaultFixed32(value); }
+      }
+      public Builder SetDefaultFixed32(uint value) {
+        result.hasDefaultFixed32 = true;
+        result.defaultFixed32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFixed32() {
+        result.hasDefaultFixed32 = false;
+        result.defaultFixed32_ = 47;
+        return this;
+      }
+      
+      // optional fixed64 default_fixed64 = 68 [default = 48];
+      public bool HasDefaultFixed64 {
+        get { return result.HasDefaultFixed64; }
+      }
+      public ulong DefaultFixed64 {
+        get { return result.DefaultFixed64; }
+        set { SetDefaultFixed64(value); }
+      }
+      public Builder SetDefaultFixed64(ulong value) {
+        result.hasDefaultFixed64 = true;
+        result.defaultFixed64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFixed64() {
+        result.hasDefaultFixed64 = false;
+        result.defaultFixed64_ = 48UL;
+        return this;
+      }
+      
+      // optional sfixed32 default_sfixed32 = 69 [default = 49];
+      public bool HasDefaultSfixed32 {
+        get { return result.HasDefaultSfixed32; }
+      }
+      public int DefaultSfixed32 {
+        get { return result.DefaultSfixed32; }
+        set { SetDefaultSfixed32(value); }
+      }
+      public Builder SetDefaultSfixed32(int value) {
+        result.hasDefaultSfixed32 = true;
+        result.defaultSfixed32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSfixed32() {
+        result.hasDefaultSfixed32 = false;
+        result.defaultSfixed32_ = 49;
+        return this;
+      }
+      
+      // optional sfixed64 default_sfixed64 = 70 [default = -50];
+      public bool HasDefaultSfixed64 {
+        get { return result.HasDefaultSfixed64; }
+      }
+      public long DefaultSfixed64 {
+        get { return result.DefaultSfixed64; }
+        set { SetDefaultSfixed64(value); }
+      }
+      public Builder SetDefaultSfixed64(long value) {
+        result.hasDefaultSfixed64 = true;
+        result.defaultSfixed64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSfixed64() {
+        result.hasDefaultSfixed64 = false;
+        result.defaultSfixed64_ = -50L;
+        return this;
+      }
+      
+      // optional float default_float = 71 [default = 51.5];
+      public bool HasDefaultFloat {
+        get { return result.HasDefaultFloat; }
+      }
+      public float DefaultFloat {
+        get { return result.DefaultFloat; }
+        set { SetDefaultFloat(value); }
+      }
+      public Builder SetDefaultFloat(float value) {
+        result.hasDefaultFloat = true;
+        result.defaultFloat_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFloat() {
+        result.hasDefaultFloat = false;
+        result.defaultFloat_ = 51.5F;
+        return this;
+      }
+      
+      // optional double default_double = 72 [default = 52000];
+      public bool HasDefaultDouble {
+        get { return result.HasDefaultDouble; }
+      }
+      public double DefaultDouble {
+        get { return result.DefaultDouble; }
+        set { SetDefaultDouble(value); }
+      }
+      public Builder SetDefaultDouble(double value) {
+        result.hasDefaultDouble = true;
+        result.defaultDouble_ = value;
+        return this;
+      }
+      public Builder ClearDefaultDouble() {
+        result.hasDefaultDouble = false;
+        result.defaultDouble_ = 52000D;
+        return this;
+      }
+      
+      // optional bool default_bool = 73 [default = true];
+      public bool HasDefaultBool {
+        get { return result.HasDefaultBool; }
+      }
+      public bool DefaultBool {
+        get { return result.DefaultBool; }
+        set { SetDefaultBool(value); }
+      }
+      public Builder SetDefaultBool(bool value) {
+        result.hasDefaultBool = true;
+        result.defaultBool_ = value;
+        return this;
+      }
+      public Builder ClearDefaultBool() {
+        result.hasDefaultBool = false;
+        result.defaultBool_ = true;
+        return this;
+      }
+      
+      // optional string default_string = 74 [default = "hello"];
+      public bool HasDefaultString {
+        get { return result.HasDefaultString; }
+      }
+      public string DefaultString {
+        get { return result.DefaultString; }
+        set { SetDefaultString(value); }
+      }
+      public Builder SetDefaultString(string value) {
+        result.hasDefaultString = true;
+        result.defaultString_ = value;
+        return this;
+      }
+      public Builder ClearDefaultString() {
+        result.hasDefaultString = false;
+        result.defaultString_ = "hello";
+        return this;
+      }
+      
+      // optional bytes default_bytes = 75 [default = "world"];
+      public bool HasDefaultBytes {
+        get { return result.HasDefaultBytes; }
+      }
+      public pb::ByteString DefaultBytes {
+        get { return result.DefaultBytes; }
+        set { SetDefaultBytes(value); }
+      }
+      public Builder SetDefaultBytes(pb::ByteString value) {
+        result.hasDefaultBytes = true;
+        result.defaultBytes_ = value;
+        return this;
+      }
+      public Builder ClearDefaultBytes() {
+        result.hasDefaultBytes = false;
+        result.defaultBytes_ = ((pb::ByteString) self::TestAllTypes.Descriptor.Fields[62].DefaultValue);
+        return this;
+      }
+      
+      // optional .protobuf_unittest.TestAllTypes.NestedEnum default_nested_enum = 81 [default = BAR];
+      public bool HasDefaultNestedEnum {
+        get { return result.HasDefaultNestedEnum; }
+      }
+      public self::TestAllTypes.Types.NestedEnum DefaultNestedEnum {
+        get { return result.DefaultNestedEnum; }
+        set { SetDefaultNestedEnum(value); }
+      }
+      public Builder SetDefaultNestedEnum(self::TestAllTypes.Types.NestedEnum value) {
+        result.hasDefaultNestedEnum = true;
+        result.defaultNestedEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultNestedEnum() {
+        result.hasDefaultNestedEnum = false;
+        result.defaultNestedEnum_ = self::TestAllTypes.Types.NestedEnum.BAR;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
+      public bool HasDefaultForeignEnum {
+        get { return result.HasDefaultForeignEnum; }
+      }
+      public self::ForeignEnum DefaultForeignEnum {
+        get { return result.DefaultForeignEnum; }
+        set { SetDefaultForeignEnum(value); }
+      }
+      public Builder SetDefaultForeignEnum(self::ForeignEnum value) {
+        result.hasDefaultForeignEnum = true;
+        result.defaultForeignEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultForeignEnum() {
+        result.hasDefaultForeignEnum = false;
+        result.defaultForeignEnum_ = self::ForeignEnum.FOREIGN_BAR;
+        return this;
+      }
+      
+      // optional .protobuf_unittest_import.ImportEnum default_import_enum = 83 [default = IMPORT_BAR];
+      public bool HasDefaultImportEnum {
+        get { return result.HasDefaultImportEnum; }
+      }
+      public self::ImportEnum DefaultImportEnum {
+        get { return result.DefaultImportEnum; }
+        set { SetDefaultImportEnum(value); }
+      }
+      public Builder SetDefaultImportEnum(self::ImportEnum value) {
+        result.hasDefaultImportEnum = true;
+        result.defaultImportEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultImportEnum() {
+        result.hasDefaultImportEnum = false;
+        result.defaultImportEnum_ = self::ImportEnum.IMPORT_BAR;
+        return this;
+      }
+      
+      // optional string default_string_piece = 84 [default = "abc", ctype = STRING_PIECE];
+      public bool HasDefaultStringPiece {
+        get { return result.HasDefaultStringPiece; }
+      }
+      public string DefaultStringPiece {
+        get { return result.DefaultStringPiece; }
+        set { SetDefaultStringPiece(value); }
+      }
+      public Builder SetDefaultStringPiece(string value) {
+        result.hasDefaultStringPiece = true;
+        result.defaultStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearDefaultStringPiece() {
+        result.hasDefaultStringPiece = false;
+        result.defaultStringPiece_ = "abc";
+        return this;
+      }
+      
+      // optional string default_cord = 85 [default = "123", ctype = CORD];
+      public bool HasDefaultCord {
+        get { return result.HasDefaultCord; }
+      }
+      public string DefaultCord {
+        get { return result.DefaultCord; }
+        set { SetDefaultCord(value); }
+      }
+      public Builder SetDefaultCord(string value) {
+        result.hasDefaultCord = true;
+        result.defaultCord_ = value;
+        return this;
+      }
+      public Builder ClearDefaultCord() {
+        result.hasDefaultCord = false;
+        result.defaultCord_ = "123";
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class ForeignMessage : pb::GeneratedMessage<ForeignMessage, ForeignMessage.Builder> {
+    // Use ForeignMessage.CreateBuilder() to construct.
+    private ForeignMessage() {}
+    
+    private static readonly ForeignMessage defaultInstance = new ForeignMessage();
+    public static ForeignMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override ForeignMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable; }
+    }
+    
+    // optional int32 c = 1;
+    private bool hasC;
+    private int c_ = 0;
+    public bool HasC {
+      get { return hasC; }
+    }
+    public int C {
+      get { return c_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasC) {
+        output.WriteInt32(1, C);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasC) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, C);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::ForeignMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::ForeignMessage parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::ForeignMessage> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::ForeignMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::ForeignMessage, Builder> {
+      // Construct using self::ForeignMessage.CreateBuilder()
+      internal Builder() {}
+      
+      self::ForeignMessage result = new self::ForeignMessage();
+      
+      protected override self::ForeignMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::ForeignMessage> Clear() {
+        result = new self::ForeignMessage();
+        return this;
+      }
+      
+      public override IBuilder<self::ForeignMessage> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::ForeignMessage.Descriptor; }
+      }
+      
+      public override self::ForeignMessage DefaultInstanceForType {
+        get { return self::ForeignMessage.DefaultInstance; }
+      }
+      
+      public override self::ForeignMessage BuildPartial() {
+        self::ForeignMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::ForeignMessage) {
+          return MergeFrom((self::ForeignMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::ForeignMessage> MergeFrom(self::ForeignMessage other) {
+        if (other == self::ForeignMessage.DefaultInstance) return this;
+        if (other.HasC) {
+          C = other.C;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::ForeignMessage> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::ForeignMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              C = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 c = 1;
+      public bool HasC {
+        get { return result.HasC; }
+      }
+      public int C {
+        get { return result.C; }
+        set { SetC(value); }
+      }
+      public Builder SetC(int value) {
+        result.hasC = true;
+        result.c_ = value;
+        return this;
+      }
+      public Builder ClearC() {
+        result.hasC = false;
+        result.c_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestAllExtensions : pb::ExtendableMessage<TestAllExtensions, TestAllExtensions.Builder> {
+    // Use TestAllExtensions.CreateBuilder() to construct.
+    private TestAllExtensions() {}
+    
+    private static readonly TestAllExtensions defaultInstance = new TestAllExtensions();
+    public static TestAllExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestAllExtensions DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      pb::ExtendableMessage<TestAllExtensions, TestAllExtensions.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestAllExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestAllExtensions parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestAllExtensions> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestAllExtensions prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllExtensions, self::TestAllExtensions.Builder>.ExtendableBuilder {
+      // Construct using self::TestAllExtensions.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestAllExtensions result = new self::TestAllExtensions();
+      
+      protected override self::TestAllExtensions MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestAllExtensions> Clear() {
+        result = new self::TestAllExtensions();
+        return this;
+      }
+      
+      public override IBuilder<self::TestAllExtensions> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestAllExtensions.Descriptor; }
+      }
+      
+      public override self::TestAllExtensions DefaultInstanceForType {
+        get { return self::TestAllExtensions.DefaultInstance; }
+      }
+      
+      public override self::TestAllExtensions BuildPartial() {
+        self::TestAllExtensions returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestAllExtensions) {
+          return MergeFrom((self::TestAllExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestAllExtensions> MergeFrom(self::TestAllExtensions other) {
+        if (other == self::TestAllExtensions.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestAllExtensions> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestAllExtensions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class OptionalGroup_extension : pb::GeneratedMessage<OptionalGroup_extension, OptionalGroup_extension.Builder> {
+    // Use OptionalGroup_extension.CreateBuilder() to construct.
+    private OptionalGroup_extension() {}
+    
+    private static readonly OptionalGroup_extension defaultInstance = new OptionalGroup_extension();
+    public static OptionalGroup_extension DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override OptionalGroup_extension DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable; }
+    }
+    
+    // optional int32 a = 17;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(17, A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(17, A);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::OptionalGroup_extension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::OptionalGroup_extension parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::OptionalGroup_extension> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::OptionalGroup_extension prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::OptionalGroup_extension, Builder> {
+      // Construct using self::OptionalGroup_extension.CreateBuilder()
+      internal Builder() {}
+      
+      self::OptionalGroup_extension result = new self::OptionalGroup_extension();
+      
+      protected override self::OptionalGroup_extension MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> Clear() {
+        result = new self::OptionalGroup_extension();
+        return this;
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::OptionalGroup_extension.Descriptor; }
+      }
+      
+      public override self::OptionalGroup_extension DefaultInstanceForType {
+        get { return self::OptionalGroup_extension.DefaultInstance; }
+      }
+      
+      public override self::OptionalGroup_extension BuildPartial() {
+        self::OptionalGroup_extension returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::OptionalGroup_extension) {
+          return MergeFrom((self::OptionalGroup_extension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> MergeFrom(self::OptionalGroup_extension other) {
+        if (other == self::OptionalGroup_extension.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 136: {
+              A = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 a = 17;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class RepeatedGroup_extension : pb::GeneratedMessage<RepeatedGroup_extension, RepeatedGroup_extension.Builder> {
+    // Use RepeatedGroup_extension.CreateBuilder() to construct.
+    private RepeatedGroup_extension() {}
+    
+    private static readonly RepeatedGroup_extension defaultInstance = new RepeatedGroup_extension();
+    public static RepeatedGroup_extension DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override RepeatedGroup_extension DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable; }
+    }
+    
+    // optional int32 a = 47;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(47, A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(47, A);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::RepeatedGroup_extension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::RepeatedGroup_extension parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::RepeatedGroup_extension> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::RepeatedGroup_extension prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::RepeatedGroup_extension, Builder> {
+      // Construct using self::RepeatedGroup_extension.CreateBuilder()
+      internal Builder() {}
+      
+      self::RepeatedGroup_extension result = new self::RepeatedGroup_extension();
+      
+      protected override self::RepeatedGroup_extension MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> Clear() {
+        result = new self::RepeatedGroup_extension();
+        return this;
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::RepeatedGroup_extension.Descriptor; }
+      }
+      
+      public override self::RepeatedGroup_extension DefaultInstanceForType {
+        get { return self::RepeatedGroup_extension.DefaultInstance; }
+      }
+      
+      public override self::RepeatedGroup_extension BuildPartial() {
+        self::RepeatedGroup_extension returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::RepeatedGroup_extension) {
+          return MergeFrom((self::RepeatedGroup_extension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> MergeFrom(self::RepeatedGroup_extension other) {
+        if (other == self::RepeatedGroup_extension.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 376: {
+              A = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 a = 47;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestRequired : pb::GeneratedMessage<TestRequired, TestRequired.Builder> {
+    // Use TestRequired.CreateBuilder() to construct.
+    private TestRequired() {}
+    
+    private static readonly TestRequired defaultInstance = new TestRequired();
+    public static TestRequired DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRequired DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::TestRequired> Single =
+            pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::TestRequired>(Descriptor.Extensions[0]);
+      public static readonly
+        pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::TestRequired>> name =
+            pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::TestRequired>(Descriptor.Extensions[1]);
+    }
+    #endregion
+    
+    // required int32 a = 1;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    // optional int32 dummy2 = 2;
+    private bool hasDummy2;
+    private int dummy2_ = 0;
+    public bool HasDummy2 {
+      get { return hasDummy2; }
+    }
+    public int Dummy2 {
+      get { return dummy2_; }
+    }
+    
+    // required int32 b = 3;
+    private bool hasB;
+    private int b_ = 0;
+    public bool HasB {
+      get { return hasB; }
+    }
+    public int B {
+      get { return b_; }
+    }
+    
+    // optional int32 dummy4 = 4;
+    private bool hasDummy4;
+    private int dummy4_ = 0;
+    public bool HasDummy4 {
+      get { return hasDummy4; }
+    }
+    public int Dummy4 {
+      get { return dummy4_; }
+    }
+    
+    // optional int32 dummy5 = 5;
+    private bool hasDummy5;
+    private int dummy5_ = 0;
+    public bool HasDummy5 {
+      get { return hasDummy5; }
+    }
+    public int Dummy5 {
+      get { return dummy5_; }
+    }
+    
+    // optional int32 dummy6 = 6;
+    private bool hasDummy6;
+    private int dummy6_ = 0;
+    public bool HasDummy6 {
+      get { return hasDummy6; }
+    }
+    public int Dummy6 {
+      get { return dummy6_; }
+    }
+    
+    // optional int32 dummy7 = 7;
+    private bool hasDummy7;
+    private int dummy7_ = 0;
+    public bool HasDummy7 {
+      get { return hasDummy7; }
+    }
+    public int Dummy7 {
+      get { return dummy7_; }
+    }
+    
+    // optional int32 dummy8 = 8;
+    private bool hasDummy8;
+    private int dummy8_ = 0;
+    public bool HasDummy8 {
+      get { return hasDummy8; }
+    }
+    public int Dummy8 {
+      get { return dummy8_; }
+    }
+    
+    // optional int32 dummy9 = 9;
+    private bool hasDummy9;
+    private int dummy9_ = 0;
+    public bool HasDummy9 {
+      get { return hasDummy9; }
+    }
+    public int Dummy9 {
+      get { return dummy9_; }
+    }
+    
+    // optional int32 dummy10 = 10;
+    private bool hasDummy10;
+    private int dummy10_ = 0;
+    public bool HasDummy10 {
+      get { return hasDummy10; }
+    }
+    public int Dummy10 {
+      get { return dummy10_; }
+    }
+    
+    // optional int32 dummy11 = 11;
+    private bool hasDummy11;
+    private int dummy11_ = 0;
+    public bool HasDummy11 {
+      get { return hasDummy11; }
+    }
+    public int Dummy11 {
+      get { return dummy11_; }
+    }
+    
+    // optional int32 dummy12 = 12;
+    private bool hasDummy12;
+    private int dummy12_ = 0;
+    public bool HasDummy12 {
+      get { return hasDummy12; }
+    }
+    public int Dummy12 {
+      get { return dummy12_; }
+    }
+    
+    // optional int32 dummy13 = 13;
+    private bool hasDummy13;
+    private int dummy13_ = 0;
+    public bool HasDummy13 {
+      get { return hasDummy13; }
+    }
+    public int Dummy13 {
+      get { return dummy13_; }
+    }
+    
+    // optional int32 dummy14 = 14;
+    private bool hasDummy14;
+    private int dummy14_ = 0;
+    public bool HasDummy14 {
+      get { return hasDummy14; }
+    }
+    public int Dummy14 {
+      get { return dummy14_; }
+    }
+    
+    // optional int32 dummy15 = 15;
+    private bool hasDummy15;
+    private int dummy15_ = 0;
+    public bool HasDummy15 {
+      get { return hasDummy15; }
+    }
+    public int Dummy15 {
+      get { return dummy15_; }
+    }
+    
+    // optional int32 dummy16 = 16;
+    private bool hasDummy16;
+    private int dummy16_ = 0;
+    public bool HasDummy16 {
+      get { return hasDummy16; }
+    }
+    public int Dummy16 {
+      get { return dummy16_; }
+    }
+    
+    // optional int32 dummy17 = 17;
+    private bool hasDummy17;
+    private int dummy17_ = 0;
+    public bool HasDummy17 {
+      get { return hasDummy17; }
+    }
+    public int Dummy17 {
+      get { return dummy17_; }
+    }
+    
+    // optional int32 dummy18 = 18;
+    private bool hasDummy18;
+    private int dummy18_ = 0;
+    public bool HasDummy18 {
+      get { return hasDummy18; }
+    }
+    public int Dummy18 {
+      get { return dummy18_; }
+    }
+    
+    // optional int32 dummy19 = 19;
+    private bool hasDummy19;
+    private int dummy19_ = 0;
+    public bool HasDummy19 {
+      get { return hasDummy19; }
+    }
+    public int Dummy19 {
+      get { return dummy19_; }
+    }
+    
+    // optional int32 dummy20 = 20;
+    private bool hasDummy20;
+    private int dummy20_ = 0;
+    public bool HasDummy20 {
+      get { return hasDummy20; }
+    }
+    public int Dummy20 {
+      get { return dummy20_; }
+    }
+    
+    // optional int32 dummy21 = 21;
+    private bool hasDummy21;
+    private int dummy21_ = 0;
+    public bool HasDummy21 {
+      get { return hasDummy21; }
+    }
+    public int Dummy21 {
+      get { return dummy21_; }
+    }
+    
+    // optional int32 dummy22 = 22;
+    private bool hasDummy22;
+    private int dummy22_ = 0;
+    public bool HasDummy22 {
+      get { return hasDummy22; }
+    }
+    public int Dummy22 {
+      get { return dummy22_; }
+    }
+    
+    // optional int32 dummy23 = 23;
+    private bool hasDummy23;
+    private int dummy23_ = 0;
+    public bool HasDummy23 {
+      get { return hasDummy23; }
+    }
+    public int Dummy23 {
+      get { return dummy23_; }
+    }
+    
+    // optional int32 dummy24 = 24;
+    private bool hasDummy24;
+    private int dummy24_ = 0;
+    public bool HasDummy24 {
+      get { return hasDummy24; }
+    }
+    public int Dummy24 {
+      get { return dummy24_; }
+    }
+    
+    // optional int32 dummy25 = 25;
+    private bool hasDummy25;
+    private int dummy25_ = 0;
+    public bool HasDummy25 {
+      get { return hasDummy25; }
+    }
+    public int Dummy25 {
+      get { return dummy25_; }
+    }
+    
+    // optional int32 dummy26 = 26;
+    private bool hasDummy26;
+    private int dummy26_ = 0;
+    public bool HasDummy26 {
+      get { return hasDummy26; }
+    }
+    public int Dummy26 {
+      get { return dummy26_; }
+    }
+    
+    // optional int32 dummy27 = 27;
+    private bool hasDummy27;
+    private int dummy27_ = 0;
+    public bool HasDummy27 {
+      get { return hasDummy27; }
+    }
+    public int Dummy27 {
+      get { return dummy27_; }
+    }
+    
+    // optional int32 dummy28 = 28;
+    private bool hasDummy28;
+    private int dummy28_ = 0;
+    public bool HasDummy28 {
+      get { return hasDummy28; }
+    }
+    public int Dummy28 {
+      get { return dummy28_; }
+    }
+    
+    // optional int32 dummy29 = 29;
+    private bool hasDummy29;
+    private int dummy29_ = 0;
+    public bool HasDummy29 {
+      get { return hasDummy29; }
+    }
+    public int Dummy29 {
+      get { return dummy29_; }
+    }
+    
+    // optional int32 dummy30 = 30;
+    private bool hasDummy30;
+    private int dummy30_ = 0;
+    public bool HasDummy30 {
+      get { return hasDummy30; }
+    }
+    public int Dummy30 {
+      get { return dummy30_; }
+    }
+    
+    // optional int32 dummy31 = 31;
+    private bool hasDummy31;
+    private int dummy31_ = 0;
+    public bool HasDummy31 {
+      get { return hasDummy31; }
+    }
+    public int Dummy31 {
+      get { return dummy31_; }
+    }
+    
+    // optional int32 dummy32 = 32;
+    private bool hasDummy32;
+    private int dummy32_ = 0;
+    public bool HasDummy32 {
+      get { return hasDummy32; }
+    }
+    public int Dummy32 {
+      get { return dummy32_; }
+    }
+    
+    // required int32 c = 33;
+    private bool hasC;
+    private int c_ = 0;
+    public bool HasC {
+      get { return hasC; }
+    }
+    public int C {
+      get { return c_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasA) return false;
+        if (!hasB) return false;
+        if (!hasC) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(1, A);
+      }
+      if (HasDummy2) {
+        output.WriteInt32(2, Dummy2);
+      }
+      if (HasB) {
+        output.WriteInt32(3, B);
+      }
+      if (HasDummy4) {
+        output.WriteInt32(4, Dummy4);
+      }
+      if (HasDummy5) {
+        output.WriteInt32(5, Dummy5);
+      }
+      if (HasDummy6) {
+        output.WriteInt32(6, Dummy6);
+      }
+      if (HasDummy7) {
+        output.WriteInt32(7, Dummy7);
+      }
+      if (HasDummy8) {
+        output.WriteInt32(8, Dummy8);
+      }
+      if (HasDummy9) {
+        output.WriteInt32(9, Dummy9);
+      }
+      if (HasDummy10) {
+        output.WriteInt32(10, Dummy10);
+      }
+      if (HasDummy11) {
+        output.WriteInt32(11, Dummy11);
+      }
+      if (HasDummy12) {
+        output.WriteInt32(12, Dummy12);
+      }
+      if (HasDummy13) {
+        output.WriteInt32(13, Dummy13);
+      }
+      if (HasDummy14) {
+        output.WriteInt32(14, Dummy14);
+      }
+      if (HasDummy15) {
+        output.WriteInt32(15, Dummy15);
+      }
+      if (HasDummy16) {
+        output.WriteInt32(16, Dummy16);
+      }
+      if (HasDummy17) {
+        output.WriteInt32(17, Dummy17);
+      }
+      if (HasDummy18) {
+        output.WriteInt32(18, Dummy18);
+      }
+      if (HasDummy19) {
+        output.WriteInt32(19, Dummy19);
+      }
+      if (HasDummy20) {
+        output.WriteInt32(20, Dummy20);
+      }
+      if (HasDummy21) {
+        output.WriteInt32(21, Dummy21);
+      }
+      if (HasDummy22) {
+        output.WriteInt32(22, Dummy22);
+      }
+      if (HasDummy23) {
+        output.WriteInt32(23, Dummy23);
+      }
+      if (HasDummy24) {
+        output.WriteInt32(24, Dummy24);
+      }
+      if (HasDummy25) {
+        output.WriteInt32(25, Dummy25);
+      }
+      if (HasDummy26) {
+        output.WriteInt32(26, Dummy26);
+      }
+      if (HasDummy27) {
+        output.WriteInt32(27, Dummy27);
+      }
+      if (HasDummy28) {
+        output.WriteInt32(28, Dummy28);
+      }
+      if (HasDummy29) {
+        output.WriteInt32(29, Dummy29);
+      }
+      if (HasDummy30) {
+        output.WriteInt32(30, Dummy30);
+      }
+      if (HasDummy31) {
+        output.WriteInt32(31, Dummy31);
+      }
+      if (HasDummy32) {
+        output.WriteInt32(32, Dummy32);
+      }
+      if (HasC) {
+        output.WriteInt32(33, C);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+        }
+        if (HasDummy2) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, Dummy2);
+        }
+        if (HasB) {
+          size += pb::CodedOutputStream.ComputeInt32Size(3, B);
+        }
+        if (HasDummy4) {
+          size += pb::CodedOutputStream.ComputeInt32Size(4, Dummy4);
+        }
+        if (HasDummy5) {
+          size += pb::CodedOutputStream.ComputeInt32Size(5, Dummy5);
+        }
+        if (HasDummy6) {
+          size += pb::CodedOutputStream.ComputeInt32Size(6, Dummy6);
+        }
+        if (HasDummy7) {
+          size += pb::CodedOutputStream.ComputeInt32Size(7, Dummy7);
+        }
+        if (HasDummy8) {
+          size += pb::CodedOutputStream.ComputeInt32Size(8, Dummy8);
+        }
+        if (HasDummy9) {
+          size += pb::CodedOutputStream.ComputeInt32Size(9, Dummy9);
+        }
+        if (HasDummy10) {
+          size += pb::CodedOutputStream.ComputeInt32Size(10, Dummy10);
+        }
+        if (HasDummy11) {
+          size += pb::CodedOutputStream.ComputeInt32Size(11, Dummy11);
+        }
+        if (HasDummy12) {
+          size += pb::CodedOutputStream.ComputeInt32Size(12, Dummy12);
+        }
+        if (HasDummy13) {
+          size += pb::CodedOutputStream.ComputeInt32Size(13, Dummy13);
+        }
+        if (HasDummy14) {
+          size += pb::CodedOutputStream.ComputeInt32Size(14, Dummy14);
+        }
+        if (HasDummy15) {
+          size += pb::CodedOutputStream.ComputeInt32Size(15, Dummy15);
+        }
+        if (HasDummy16) {
+          size += pb::CodedOutputStream.ComputeInt32Size(16, Dummy16);
+        }
+        if (HasDummy17) {
+          size += pb::CodedOutputStream.ComputeInt32Size(17, Dummy17);
+        }
+        if (HasDummy18) {
+          size += pb::CodedOutputStream.ComputeInt32Size(18, Dummy18);
+        }
+        if (HasDummy19) {
+          size += pb::CodedOutputStream.ComputeInt32Size(19, Dummy19);
+        }
+        if (HasDummy20) {
+          size += pb::CodedOutputStream.ComputeInt32Size(20, Dummy20);
+        }
+        if (HasDummy21) {
+          size += pb::CodedOutputStream.ComputeInt32Size(21, Dummy21);
+        }
+        if (HasDummy22) {
+          size += pb::CodedOutputStream.ComputeInt32Size(22, Dummy22);
+        }
+        if (HasDummy23) {
+          size += pb::CodedOutputStream.ComputeInt32Size(23, Dummy23);
+        }
+        if (HasDummy24) {
+          size += pb::CodedOutputStream.ComputeInt32Size(24, Dummy24);
+        }
+        if (HasDummy25) {
+          size += pb::CodedOutputStream.ComputeInt32Size(25, Dummy25);
+        }
+        if (HasDummy26) {
+          size += pb::CodedOutputStream.ComputeInt32Size(26, Dummy26);
+        }
+        if (HasDummy27) {
+          size += pb::CodedOutputStream.ComputeInt32Size(27, Dummy27);
+        }
+        if (HasDummy28) {
+          size += pb::CodedOutputStream.ComputeInt32Size(28, Dummy28);
+        }
+        if (HasDummy29) {
+          size += pb::CodedOutputStream.ComputeInt32Size(29, Dummy29);
+        }
+        if (HasDummy30) {
+          size += pb::CodedOutputStream.ComputeInt32Size(30, Dummy30);
+        }
+        if (HasDummy31) {
+          size += pb::CodedOutputStream.ComputeInt32Size(31, Dummy31);
+        }
+        if (HasDummy32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(32, Dummy32);
+        }
+        if (HasC) {
+          size += pb::CodedOutputStream.ComputeInt32Size(33, C);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestRequired ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRequired parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestRequired> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestRequired prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestRequired, Builder> {
+      // Construct using self::TestRequired.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestRequired result = new self::TestRequired();
+      
+      protected override self::TestRequired MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestRequired> Clear() {
+        result = new self::TestRequired();
+        return this;
+      }
+      
+      public override IBuilder<self::TestRequired> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestRequired.Descriptor; }
+      }
+      
+      public override self::TestRequired DefaultInstanceForType {
+        get { return self::TestRequired.DefaultInstance; }
+      }
+      
+      public override self::TestRequired BuildPartial() {
+        self::TestRequired returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestRequired) {
+          return MergeFrom((self::TestRequired) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestRequired> MergeFrom(self::TestRequired other) {
+        if (other == self::TestRequired.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        if (other.HasDummy2) {
+          Dummy2 = other.Dummy2;
+        }
+        if (other.HasB) {
+          B = other.B;
+        }
+        if (other.HasDummy4) {
+          Dummy4 = other.Dummy4;
+        }
+        if (other.HasDummy5) {
+          Dummy5 = other.Dummy5;
+        }
+        if (other.HasDummy6) {
+          Dummy6 = other.Dummy6;
+        }
+        if (other.HasDummy7) {
+          Dummy7 = other.Dummy7;
+        }
+        if (other.HasDummy8) {
+          Dummy8 = other.Dummy8;
+        }
+        if (other.HasDummy9) {
+          Dummy9 = other.Dummy9;
+        }
+        if (other.HasDummy10) {
+          Dummy10 = other.Dummy10;
+        }
+        if (other.HasDummy11) {
+          Dummy11 = other.Dummy11;
+        }
+        if (other.HasDummy12) {
+          Dummy12 = other.Dummy12;
+        }
+        if (other.HasDummy13) {
+          Dummy13 = other.Dummy13;
+        }
+        if (other.HasDummy14) {
+          Dummy14 = other.Dummy14;
+        }
+        if (other.HasDummy15) {
+          Dummy15 = other.Dummy15;
+        }
+        if (other.HasDummy16) {
+          Dummy16 = other.Dummy16;
+        }
+        if (other.HasDummy17) {
+          Dummy17 = other.Dummy17;
+        }
+        if (other.HasDummy18) {
+          Dummy18 = other.Dummy18;
+        }
+        if (other.HasDummy19) {
+          Dummy19 = other.Dummy19;
+        }
+        if (other.HasDummy20) {
+          Dummy20 = other.Dummy20;
+        }
+        if (other.HasDummy21) {
+          Dummy21 = other.Dummy21;
+        }
+        if (other.HasDummy22) {
+          Dummy22 = other.Dummy22;
+        }
+        if (other.HasDummy23) {
+          Dummy23 = other.Dummy23;
+        }
+        if (other.HasDummy24) {
+          Dummy24 = other.Dummy24;
+        }
+        if (other.HasDummy25) {
+          Dummy25 = other.Dummy25;
+        }
+        if (other.HasDummy26) {
+          Dummy26 = other.Dummy26;
+        }
+        if (other.HasDummy27) {
+          Dummy27 = other.Dummy27;
+        }
+        if (other.HasDummy28) {
+          Dummy28 = other.Dummy28;
+        }
+        if (other.HasDummy29) {
+          Dummy29 = other.Dummy29;
+        }
+        if (other.HasDummy30) {
+          Dummy30 = other.Dummy30;
+        }
+        if (other.HasDummy31) {
+          Dummy31 = other.Dummy31;
+        }
+        if (other.HasDummy32) {
+          Dummy32 = other.Dummy32;
+        }
+        if (other.HasC) {
+          C = other.C;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestRequired> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestRequired> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              A = input.ReadInt32();
+              break;
+            }
+            case 16: {
+              Dummy2 = input.ReadInt32();
+              break;
+            }
+            case 24: {
+              B = input.ReadInt32();
+              break;
+            }
+            case 32: {
+              Dummy4 = input.ReadInt32();
+              break;
+            }
+            case 40: {
+              Dummy5 = input.ReadInt32();
+              break;
+            }
+            case 48: {
+              Dummy6 = input.ReadInt32();
+              break;
+            }
+            case 56: {
+              Dummy7 = input.ReadInt32();
+              break;
+            }
+            case 64: {
+              Dummy8 = input.ReadInt32();
+              break;
+            }
+            case 72: {
+              Dummy9 = input.ReadInt32();
+              break;
+            }
+            case 80: {
+              Dummy10 = input.ReadInt32();
+              break;
+            }
+            case 88: {
+              Dummy11 = input.ReadInt32();
+              break;
+            }
+            case 96: {
+              Dummy12 = input.ReadInt32();
+              break;
+            }
+            case 104: {
+              Dummy13 = input.ReadInt32();
+              break;
+            }
+            case 112: {
+              Dummy14 = input.ReadInt32();
+              break;
+            }
+            case 120: {
+              Dummy15 = input.ReadInt32();
+              break;
+            }
+            case 128: {
+              Dummy16 = input.ReadInt32();
+              break;
+            }
+            case 136: {
+              Dummy17 = input.ReadInt32();
+              break;
+            }
+            case 144: {
+              Dummy18 = input.ReadInt32();
+              break;
+            }
+            case 152: {
+              Dummy19 = input.ReadInt32();
+              break;
+            }
+            case 160: {
+              Dummy20 = input.ReadInt32();
+              break;
+            }
+            case 168: {
+              Dummy21 = input.ReadInt32();
+              break;
+            }
+            case 176: {
+              Dummy22 = input.ReadInt32();
+              break;
+            }
+            case 184: {
+              Dummy23 = input.ReadInt32();
+              break;
+            }
+            case 192: {
+              Dummy24 = input.ReadInt32();
+              break;
+            }
+            case 200: {
+              Dummy25 = input.ReadInt32();
+              break;
+            }
+            case 208: {
+              Dummy26 = input.ReadInt32();
+              break;
+            }
+            case 216: {
+              Dummy27 = input.ReadInt32();
+              break;
+            }
+            case 224: {
+              Dummy28 = input.ReadInt32();
+              break;
+            }
+            case 232: {
+              Dummy29 = input.ReadInt32();
+              break;
+            }
+            case 240: {
+              Dummy30 = input.ReadInt32();
+              break;
+            }
+            case 248: {
+              Dummy31 = input.ReadInt32();
+              break;
+            }
+            case 256: {
+              Dummy32 = input.ReadInt32();
+              break;
+            }
+            case 264: {
+              C = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // required int32 a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy2 = 2;
+      public bool HasDummy2 {
+        get { return result.HasDummy2; }
+      }
+      public int Dummy2 {
+        get { return result.Dummy2; }
+        set { SetDummy2(value); }
+      }
+      public Builder SetDummy2(int value) {
+        result.hasDummy2 = true;
+        result.dummy2_ = value;
+        return this;
+      }
+      public Builder ClearDummy2() {
+        result.hasDummy2 = false;
+        result.dummy2_ = 0;
+        return this;
+      }
+      
+      // required int32 b = 3;
+      public bool HasB {
+        get { return result.HasB; }
+      }
+      public int B {
+        get { return result.B; }
+        set { SetB(value); }
+      }
+      public Builder SetB(int value) {
+        result.hasB = true;
+        result.b_ = value;
+        return this;
+      }
+      public Builder ClearB() {
+        result.hasB = false;
+        result.b_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy4 = 4;
+      public bool HasDummy4 {
+        get { return result.HasDummy4; }
+      }
+      public int Dummy4 {
+        get { return result.Dummy4; }
+        set { SetDummy4(value); }
+      }
+      public Builder SetDummy4(int value) {
+        result.hasDummy4 = true;
+        result.dummy4_ = value;
+        return this;
+      }
+      public Builder ClearDummy4() {
+        result.hasDummy4 = false;
+        result.dummy4_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy5 = 5;
+      public bool HasDummy5 {
+        get { return result.HasDummy5; }
+      }
+      public int Dummy5 {
+        get { return result.Dummy5; }
+        set { SetDummy5(value); }
+      }
+      public Builder SetDummy5(int value) {
+        result.hasDummy5 = true;
+        result.dummy5_ = value;
+        return this;
+      }
+      public Builder ClearDummy5() {
+        result.hasDummy5 = false;
+        result.dummy5_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy6 = 6;
+      public bool HasDummy6 {
+        get { return result.HasDummy6; }
+      }
+      public int Dummy6 {
+        get { return result.Dummy6; }
+        set { SetDummy6(value); }
+      }
+      public Builder SetDummy6(int value) {
+        result.hasDummy6 = true;
+        result.dummy6_ = value;
+        return this;
+      }
+      public Builder ClearDummy6() {
+        result.hasDummy6 = false;
+        result.dummy6_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy7 = 7;
+      public bool HasDummy7 {
+        get { return result.HasDummy7; }
+      }
+      public int Dummy7 {
+        get { return result.Dummy7; }
+        set { SetDummy7(value); }
+      }
+      public Builder SetDummy7(int value) {
+        result.hasDummy7 = true;
+        result.dummy7_ = value;
+        return this;
+      }
+      public Builder ClearDummy7() {
+        result.hasDummy7 = false;
+        result.dummy7_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy8 = 8;
+      public bool HasDummy8 {
+        get { return result.HasDummy8; }
+      }
+      public int Dummy8 {
+        get { return result.Dummy8; }
+        set { SetDummy8(value); }
+      }
+      public Builder SetDummy8(int value) {
+        result.hasDummy8 = true;
+        result.dummy8_ = value;
+        return this;
+      }
+      public Builder ClearDummy8() {
+        result.hasDummy8 = false;
+        result.dummy8_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy9 = 9;
+      public bool HasDummy9 {
+        get { return result.HasDummy9; }
+      }
+      public int Dummy9 {
+        get { return result.Dummy9; }
+        set { SetDummy9(value); }
+      }
+      public Builder SetDummy9(int value) {
+        result.hasDummy9 = true;
+        result.dummy9_ = value;
+        return this;
+      }
+      public Builder ClearDummy9() {
+        result.hasDummy9 = false;
+        result.dummy9_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy10 = 10;
+      public bool HasDummy10 {
+        get { return result.HasDummy10; }
+      }
+      public int Dummy10 {
+        get { return result.Dummy10; }
+        set { SetDummy10(value); }
+      }
+      public Builder SetDummy10(int value) {
+        result.hasDummy10 = true;
+        result.dummy10_ = value;
+        return this;
+      }
+      public Builder ClearDummy10() {
+        result.hasDummy10 = false;
+        result.dummy10_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy11 = 11;
+      public bool HasDummy11 {
+        get { return result.HasDummy11; }
+      }
+      public int Dummy11 {
+        get { return result.Dummy11; }
+        set { SetDummy11(value); }
+      }
+      public Builder SetDummy11(int value) {
+        result.hasDummy11 = true;
+        result.dummy11_ = value;
+        return this;
+      }
+      public Builder ClearDummy11() {
+        result.hasDummy11 = false;
+        result.dummy11_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy12 = 12;
+      public bool HasDummy12 {
+        get { return result.HasDummy12; }
+      }
+      public int Dummy12 {
+        get { return result.Dummy12; }
+        set { SetDummy12(value); }
+      }
+      public Builder SetDummy12(int value) {
+        result.hasDummy12 = true;
+        result.dummy12_ = value;
+        return this;
+      }
+      public Builder ClearDummy12() {
+        result.hasDummy12 = false;
+        result.dummy12_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy13 = 13;
+      public bool HasDummy13 {
+        get { return result.HasDummy13; }
+      }
+      public int Dummy13 {
+        get { return result.Dummy13; }
+        set { SetDummy13(value); }
+      }
+      public Builder SetDummy13(int value) {
+        result.hasDummy13 = true;
+        result.dummy13_ = value;
+        return this;
+      }
+      public Builder ClearDummy13() {
+        result.hasDummy13 = false;
+        result.dummy13_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy14 = 14;
+      public bool HasDummy14 {
+        get { return result.HasDummy14; }
+      }
+      public int Dummy14 {
+        get { return result.Dummy14; }
+        set { SetDummy14(value); }
+      }
+      public Builder SetDummy14(int value) {
+        result.hasDummy14 = true;
+        result.dummy14_ = value;
+        return this;
+      }
+      public Builder ClearDummy14() {
+        result.hasDummy14 = false;
+        result.dummy14_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy15 = 15;
+      public bool HasDummy15 {
+        get { return result.HasDummy15; }
+      }
+      public int Dummy15 {
+        get { return result.Dummy15; }
+        set { SetDummy15(value); }
+      }
+      public Builder SetDummy15(int value) {
+        result.hasDummy15 = true;
+        result.dummy15_ = value;
+        return this;
+      }
+      public Builder ClearDummy15() {
+        result.hasDummy15 = false;
+        result.dummy15_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy16 = 16;
+      public bool HasDummy16 {
+        get { return result.HasDummy16; }
+      }
+      public int Dummy16 {
+        get { return result.Dummy16; }
+        set { SetDummy16(value); }
+      }
+      public Builder SetDummy16(int value) {
+        result.hasDummy16 = true;
+        result.dummy16_ = value;
+        return this;
+      }
+      public Builder ClearDummy16() {
+        result.hasDummy16 = false;
+        result.dummy16_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy17 = 17;
+      public bool HasDummy17 {
+        get { return result.HasDummy17; }
+      }
+      public int Dummy17 {
+        get { return result.Dummy17; }
+        set { SetDummy17(value); }
+      }
+      public Builder SetDummy17(int value) {
+        result.hasDummy17 = true;
+        result.dummy17_ = value;
+        return this;
+      }
+      public Builder ClearDummy17() {
+        result.hasDummy17 = false;
+        result.dummy17_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy18 = 18;
+      public bool HasDummy18 {
+        get { return result.HasDummy18; }
+      }
+      public int Dummy18 {
+        get { return result.Dummy18; }
+        set { SetDummy18(value); }
+      }
+      public Builder SetDummy18(int value) {
+        result.hasDummy18 = true;
+        result.dummy18_ = value;
+        return this;
+      }
+      public Builder ClearDummy18() {
+        result.hasDummy18 = false;
+        result.dummy18_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy19 = 19;
+      public bool HasDummy19 {
+        get { return result.HasDummy19; }
+      }
+      public int Dummy19 {
+        get { return result.Dummy19; }
+        set { SetDummy19(value); }
+      }
+      public Builder SetDummy19(int value) {
+        result.hasDummy19 = true;
+        result.dummy19_ = value;
+        return this;
+      }
+      public Builder ClearDummy19() {
+        result.hasDummy19 = false;
+        result.dummy19_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy20 = 20;
+      public bool HasDummy20 {
+        get { return result.HasDummy20; }
+      }
+      public int Dummy20 {
+        get { return result.Dummy20; }
+        set { SetDummy20(value); }
+      }
+      public Builder SetDummy20(int value) {
+        result.hasDummy20 = true;
+        result.dummy20_ = value;
+        return this;
+      }
+      public Builder ClearDummy20() {
+        result.hasDummy20 = false;
+        result.dummy20_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy21 = 21;
+      public bool HasDummy21 {
+        get { return result.HasDummy21; }
+      }
+      public int Dummy21 {
+        get { return result.Dummy21; }
+        set { SetDummy21(value); }
+      }
+      public Builder SetDummy21(int value) {
+        result.hasDummy21 = true;
+        result.dummy21_ = value;
+        return this;
+      }
+      public Builder ClearDummy21() {
+        result.hasDummy21 = false;
+        result.dummy21_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy22 = 22;
+      public bool HasDummy22 {
+        get { return result.HasDummy22; }
+      }
+      public int Dummy22 {
+        get { return result.Dummy22; }
+        set { SetDummy22(value); }
+      }
+      public Builder SetDummy22(int value) {
+        result.hasDummy22 = true;
+        result.dummy22_ = value;
+        return this;
+      }
+      public Builder ClearDummy22() {
+        result.hasDummy22 = false;
+        result.dummy22_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy23 = 23;
+      public bool HasDummy23 {
+        get { return result.HasDummy23; }
+      }
+      public int Dummy23 {
+        get { return result.Dummy23; }
+        set { SetDummy23(value); }
+      }
+      public Builder SetDummy23(int value) {
+        result.hasDummy23 = true;
+        result.dummy23_ = value;
+        return this;
+      }
+      public Builder ClearDummy23() {
+        result.hasDummy23 = false;
+        result.dummy23_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy24 = 24;
+      public bool HasDummy24 {
+        get { return result.HasDummy24; }
+      }
+      public int Dummy24 {
+        get { return result.Dummy24; }
+        set { SetDummy24(value); }
+      }
+      public Builder SetDummy24(int value) {
+        result.hasDummy24 = true;
+        result.dummy24_ = value;
+        return this;
+      }
+      public Builder ClearDummy24() {
+        result.hasDummy24 = false;
+        result.dummy24_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy25 = 25;
+      public bool HasDummy25 {
+        get { return result.HasDummy25; }
+      }
+      public int Dummy25 {
+        get { return result.Dummy25; }
+        set { SetDummy25(value); }
+      }
+      public Builder SetDummy25(int value) {
+        result.hasDummy25 = true;
+        result.dummy25_ = value;
+        return this;
+      }
+      public Builder ClearDummy25() {
+        result.hasDummy25 = false;
+        result.dummy25_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy26 = 26;
+      public bool HasDummy26 {
+        get { return result.HasDummy26; }
+      }
+      public int Dummy26 {
+        get { return result.Dummy26; }
+        set { SetDummy26(value); }
+      }
+      public Builder SetDummy26(int value) {
+        result.hasDummy26 = true;
+        result.dummy26_ = value;
+        return this;
+      }
+      public Builder ClearDummy26() {
+        result.hasDummy26 = false;
+        result.dummy26_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy27 = 27;
+      public bool HasDummy27 {
+        get { return result.HasDummy27; }
+      }
+      public int Dummy27 {
+        get { return result.Dummy27; }
+        set { SetDummy27(value); }
+      }
+      public Builder SetDummy27(int value) {
+        result.hasDummy27 = true;
+        result.dummy27_ = value;
+        return this;
+      }
+      public Builder ClearDummy27() {
+        result.hasDummy27 = false;
+        result.dummy27_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy28 = 28;
+      public bool HasDummy28 {
+        get { return result.HasDummy28; }
+      }
+      public int Dummy28 {
+        get { return result.Dummy28; }
+        set { SetDummy28(value); }
+      }
+      public Builder SetDummy28(int value) {
+        result.hasDummy28 = true;
+        result.dummy28_ = value;
+        return this;
+      }
+      public Builder ClearDummy28() {
+        result.hasDummy28 = false;
+        result.dummy28_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy29 = 29;
+      public bool HasDummy29 {
+        get { return result.HasDummy29; }
+      }
+      public int Dummy29 {
+        get { return result.Dummy29; }
+        set { SetDummy29(value); }
+      }
+      public Builder SetDummy29(int value) {
+        result.hasDummy29 = true;
+        result.dummy29_ = value;
+        return this;
+      }
+      public Builder ClearDummy29() {
+        result.hasDummy29 = false;
+        result.dummy29_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy30 = 30;
+      public bool HasDummy30 {
+        get { return result.HasDummy30; }
+      }
+      public int Dummy30 {
+        get { return result.Dummy30; }
+        set { SetDummy30(value); }
+      }
+      public Builder SetDummy30(int value) {
+        result.hasDummy30 = true;
+        result.dummy30_ = value;
+        return this;
+      }
+      public Builder ClearDummy30() {
+        result.hasDummy30 = false;
+        result.dummy30_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy31 = 31;
+      public bool HasDummy31 {
+        get { return result.HasDummy31; }
+      }
+      public int Dummy31 {
+        get { return result.Dummy31; }
+        set { SetDummy31(value); }
+      }
+      public Builder SetDummy31(int value) {
+        result.hasDummy31 = true;
+        result.dummy31_ = value;
+        return this;
+      }
+      public Builder ClearDummy31() {
+        result.hasDummy31 = false;
+        result.dummy31_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy32 = 32;
+      public bool HasDummy32 {
+        get { return result.HasDummy32; }
+      }
+      public int Dummy32 {
+        get { return result.Dummy32; }
+        set { SetDummy32(value); }
+      }
+      public Builder SetDummy32(int value) {
+        result.hasDummy32 = true;
+        result.dummy32_ = value;
+        return this;
+      }
+      public Builder ClearDummy32() {
+        result.hasDummy32 = false;
+        result.dummy32_ = 0;
+        return this;
+      }
+      
+      // required int32 c = 33;
+      public bool HasC {
+        get { return result.HasC; }
+      }
+      public int C {
+        get { return result.C; }
+        set { SetC(value); }
+      }
+      public Builder SetC(int value) {
+        result.hasC = true;
+        result.c_ = value;
+        return this;
+      }
+      public Builder ClearC() {
+        result.hasC = false;
+        result.c_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestRequiredForeign : pb::GeneratedMessage<TestRequiredForeign, TestRequiredForeign.Builder> {
+    // Use TestRequiredForeign.CreateBuilder() to construct.
+    private TestRequiredForeign() {}
+    
+    private static readonly TestRequiredForeign defaultInstance = new TestRequiredForeign();
+    public static TestRequiredForeign DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRequiredForeign DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestRequired optional_message = 1;
+    private bool hasOptionalMessage;
+    private self::TestRequired optionalMessage_ = self::TestRequired.DefaultInstance;
+    public bool HasOptionalMessage {
+      get { return hasOptionalMessage; }
+    }
+    public self::TestRequired OptionalMessage {
+      get { return optionalMessage_; }
+    }
+    
+    // repeated .protobuf_unittest.TestRequired repeated_message = 2;
+    private scg::IList<self::TestRequired> repeatedMessage_ = pbc::Lists<self::TestRequired>.Empty;
+    public scg::IList<self::TestRequired> RepeatedMessageList {
+      get { return repeatedMessage_; } 
+    }
+    public int RepeatedMessageCount
+      { get { return repeatedMessage_.Count; }
+    }
+    public self::TestRequired GetRepeatedMessage(int index) {
+      return repeatedMessage_ [index];
+    }
+    
+    // optional int32 dummy = 3;
+    private bool hasDummy;
+    private int dummy_ = 0;
+    public bool HasDummy {
+      get { return hasDummy; }
+    }
+    public int Dummy {
+      get { return dummy_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (HasOptionalMessage) {
+          if (!OptionalMessage.IsInitialized) return false;
+        }
+        foreach (self::TestRequired element in RepeatedMessageList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasOptionalMessage) {
+        output.WriteMessage(1, OptionalMessage);
+      }
+      foreach (self::TestRequired element in RepeatedMessageList) {
+        output.WriteMessage(2, element);
+      }
+      if (HasDummy) {
+        output.WriteInt32(3, Dummy);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasOptionalMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, OptionalMessage);
+        }
+        foreach (self::TestRequired element in RepeatedMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+        }
+        if (HasDummy) {
+          size += pb::CodedOutputStream.ComputeInt32Size(3, Dummy);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestRequiredForeign ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRequiredForeign parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestRequiredForeign> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestRequiredForeign prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestRequiredForeign, Builder> {
+      // Construct using self::TestRequiredForeign.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestRequiredForeign result = new self::TestRequiredForeign();
+      
+      protected override self::TestRequiredForeign MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> Clear() {
+        result = new self::TestRequiredForeign();
+        return this;
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestRequiredForeign.Descriptor; }
+      }
+      
+      public override self::TestRequiredForeign DefaultInstanceForType {
+        get { return self::TestRequiredForeign.DefaultInstance; }
+      }
+      
+      public override self::TestRequiredForeign BuildPartial() {
+        if (result.repeatedMessage_ != pbc::Lists<self::TestRequired>.Empty) {
+          result.repeatedMessage_ = pbc::Lists<self::TestRequired>.AsReadOnly(result.repeatedMessage_);
+        }
+        self::TestRequiredForeign returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestRequiredForeign) {
+          return MergeFrom((self::TestRequiredForeign) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> MergeFrom(self::TestRequiredForeign other) {
+        if (other == self::TestRequiredForeign.DefaultInstance) return this;
+        if (other.HasOptionalMessage) {
+          MergeOptionalMessage(other.OptionalMessage);
+        }
+        if (other.repeatedMessage_.Count != 0) {
+          if (result.repeatedMessage_.Count == 0) {
+            result.repeatedMessage_ = new scg::List<self::TestRequired>();
+          }
+          base.AddRange(other.repeatedMessage_, result.repeatedMessage_);
+        }
+        if (other.HasDummy) {
+          Dummy = other.Dummy;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestRequired.Builder subBuilder = self::TestRequired.CreateBuilder();
+              if (HasOptionalMessage) {
+                subBuilder.MergeFrom(OptionalMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 18: {
+              self::TestRequired.Builder subBuilder = self::TestRequired.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedMessage(subBuilder.BuildPartial());
+              break;
+            }
+            case 24: {
+              Dummy = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestRequired optional_message = 1;
+      public bool HasOptionalMessage {
+        get { return result.HasOptionalMessage; }
+      }
+      public self::TestRequired OptionalMessage {
+        get { return result.OptionalMessage; }
+        set { SetOptionalMessage(value); }
+      }
+      public Builder SetOptionalMessage(self::TestRequired value) {
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalMessage(self::TestRequired.Builder builderForValue) {
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalMessage(self::TestRequired value) {
+        if (result.HasOptionalMessage &&
+            result.optionalMessage_ != self::TestRequired.DefaultInstance) {
+          result.optionalMessage_ =
+            self::TestRequired.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalMessage_ = value;
+        }
+        result.hasOptionalMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalMessage() {
+        result.hasOptionalMessage = false;
+        result.optionalMessage_ = self::TestRequired.DefaultInstance;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.TestRequired repeated_message = 2;
+      public scg::IList<self::TestRequired> RepeatedMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedMessage_); }
+      }
+      public int RepeatedMessageCount {
+        get { return result.RepeatedMessageCount; }
+      }
+      public self::TestRequired GetRepeatedMessage(int index) {
+        return result.GetRepeatedMessage(index);
+      }
+      public Builder SetRepeatedMessage(int index, self::TestRequired value) {
+        result.repeatedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessage(int index, self::TestRequired.Builder builderForValue) {
+        result.repeatedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessage(self::TestRequired value) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestRequired>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestRequired>();
+        }
+        result.repeatedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessage(self::TestRequired.Builder builderForValue) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestRequired>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestRequired>();
+        }
+        result.repeatedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessage(scg::IEnumerable<self::TestRequired> values) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestRequired>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestRequired>();
+        }
+        base.AddRange(values, result.repeatedMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedMessage() {
+        result.repeatedMessage_ = pbc::Lists<self::TestRequired>.Empty;
+        return this;
+      }
+      
+      // optional int32 dummy = 3;
+      public bool HasDummy {
+        get { return result.HasDummy; }
+      }
+      public int Dummy {
+        get { return result.Dummy; }
+        set { SetDummy(value); }
+      }
+      public Builder SetDummy(int value) {
+        result.hasDummy = true;
+        result.dummy_ = value;
+        return this;
+      }
+      public Builder ClearDummy() {
+        result.hasDummy = false;
+        result.dummy_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestForeignNested : pb::GeneratedMessage<TestForeignNested, TestForeignNested.Builder> {
+    // Use TestForeignNested.CreateBuilder() to construct.
+    private TestForeignNested() {}
+    
+    private static readonly TestForeignNested defaultInstance = new TestForeignNested();
+    public static TestForeignNested DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestForeignNested DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestAllTypes.NestedMessage foreign_nested = 1;
+    private bool hasForeignNested;
+    private self::TestAllTypes.Types.NestedMessage foreignNested_ = self::TestAllTypes.Types.NestedMessage.DefaultInstance;
+    public bool HasForeignNested {
+      get { return hasForeignNested; }
+    }
+    public self::TestAllTypes.Types.NestedMessage ForeignNested {
+      get { return foreignNested_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasForeignNested) {
+        output.WriteMessage(1, ForeignNested);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasForeignNested) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, ForeignNested);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestForeignNested ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestForeignNested parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestForeignNested> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestForeignNested prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestForeignNested, Builder> {
+      // Construct using self::TestForeignNested.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestForeignNested result = new self::TestForeignNested();
+      
+      protected override self::TestForeignNested MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestForeignNested> Clear() {
+        result = new self::TestForeignNested();
+        return this;
+      }
+      
+      public override IBuilder<self::TestForeignNested> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestForeignNested.Descriptor; }
+      }
+      
+      public override self::TestForeignNested DefaultInstanceForType {
+        get { return self::TestForeignNested.DefaultInstance; }
+      }
+      
+      public override self::TestForeignNested BuildPartial() {
+        self::TestForeignNested returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestForeignNested) {
+          return MergeFrom((self::TestForeignNested) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestForeignNested> MergeFrom(self::TestForeignNested other) {
+        if (other == self::TestForeignNested.DefaultInstance) return this;
+        if (other.HasForeignNested) {
+          MergeForeignNested(other.ForeignNested);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestForeignNested> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestForeignNested> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestAllTypes.Types.NestedMessage.Builder subBuilder = self::TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (HasForeignNested) {
+                subBuilder.MergeFrom(ForeignNested);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              ForeignNested = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestAllTypes.NestedMessage foreign_nested = 1;
+      public bool HasForeignNested {
+        get { return result.HasForeignNested; }
+      }
+      public self::TestAllTypes.Types.NestedMessage ForeignNested {
+        get { return result.ForeignNested; }
+        set { SetForeignNested(value); }
+      }
+      public Builder SetForeignNested(self::TestAllTypes.Types.NestedMessage value) {
+        result.hasForeignNested = true;
+        result.foreignNested_ = value;
+        return this;
+      }
+      public Builder SetForeignNested(self::TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        result.hasForeignNested = true;
+        result.foreignNested_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeForeignNested(self::TestAllTypes.Types.NestedMessage value) {
+        if (result.HasForeignNested &&
+            result.foreignNested_ != self::TestAllTypes.Types.NestedMessage.DefaultInstance) {
+          result.foreignNested_ =
+            self::TestAllTypes.Types.NestedMessage.CreateBuilder(result.foreignNested_).MergeFrom(value).BuildPartial();
+        } else {
+          result.foreignNested_ = value;
+        }
+        result.hasForeignNested = true;
+        return this;
+      }
+      public Builder ClearForeignNested() {
+        result.hasForeignNested = false;
+        result.foreignNested_ = self::TestAllTypes.Types.NestedMessage.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestEmptyMessage : pb::GeneratedMessage<TestEmptyMessage, TestEmptyMessage.Builder> {
+    // Use TestEmptyMessage.CreateBuilder() to construct.
+    private TestEmptyMessage() {}
+    
+    private static readonly TestEmptyMessage defaultInstance = new TestEmptyMessage();
+    public static TestEmptyMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestEmptyMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestEmptyMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmptyMessage parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestEmptyMessage> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestEmptyMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestEmptyMessage, Builder> {
+      // Construct using self::TestEmptyMessage.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestEmptyMessage result = new self::TestEmptyMessage();
+      
+      protected override self::TestEmptyMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> Clear() {
+        result = new self::TestEmptyMessage();
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestEmptyMessage.Descriptor; }
+      }
+      
+      public override self::TestEmptyMessage DefaultInstanceForType {
+        get { return self::TestEmptyMessage.DefaultInstance; }
+      }
+      
+      public override self::TestEmptyMessage BuildPartial() {
+        self::TestEmptyMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestEmptyMessage) {
+          return MergeFrom((self::TestEmptyMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> MergeFrom(self::TestEmptyMessage other) {
+        if (other == self::TestEmptyMessage.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class TestEmptyMessageWithExtensions : pb::ExtendableMessage<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder> {
+    // Use TestEmptyMessageWithExtensions.CreateBuilder() to construct.
+    private TestEmptyMessageWithExtensions() {}
+    
+    private static readonly TestEmptyMessageWithExtensions defaultInstance = new TestEmptyMessageWithExtensions();
+    public static TestEmptyMessageWithExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestEmptyMessageWithExtensions DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      pb::ExtendableMessage<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestEmptyMessageWithExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestEmptyMessageWithExtensions> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestEmptyMessageWithExtensions prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestEmptyMessageWithExtensions, self::TestEmptyMessageWithExtensions.Builder>.ExtendableBuilder {
+      // Construct using self::TestEmptyMessageWithExtensions.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestEmptyMessageWithExtensions result = new self::TestEmptyMessageWithExtensions();
+      
+      protected override self::TestEmptyMessageWithExtensions MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> Clear() {
+        result = new self::TestEmptyMessageWithExtensions();
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestEmptyMessageWithExtensions.Descriptor; }
+      }
+      
+      public override self::TestEmptyMessageWithExtensions DefaultInstanceForType {
+        get { return self::TestEmptyMessageWithExtensions.DefaultInstance; }
+      }
+      
+      public override self::TestEmptyMessageWithExtensions BuildPartial() {
+        self::TestEmptyMessageWithExtensions returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestEmptyMessageWithExtensions) {
+          return MergeFrom((self::TestEmptyMessageWithExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> MergeFrom(self::TestEmptyMessageWithExtensions other) {
+        if (other == self::TestEmptyMessageWithExtensions.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class TestReallyLargeTagNumber : pb::GeneratedMessage<TestReallyLargeTagNumber, TestReallyLargeTagNumber.Builder> {
+    // Use TestReallyLargeTagNumber.CreateBuilder() to construct.
+    private TestReallyLargeTagNumber() {}
+    
+    private static readonly TestReallyLargeTagNumber defaultInstance = new TestReallyLargeTagNumber();
+    public static TestReallyLargeTagNumber DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestReallyLargeTagNumber DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable; }
+    }
+    
+    // optional int32 a = 1;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    // optional int32 bb = 268435455;
+    private bool hasBb;
+    private int bb_ = 0;
+    public bool HasBb {
+      get { return hasBb; }
+    }
+    public int Bb {
+      get { return bb_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(1, A);
+      }
+      if (HasBb) {
+        output.WriteInt32(268435455, Bb);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+        }
+        if (HasBb) {
+          size += pb::CodedOutputStream.ComputeInt32Size(268435455, Bb);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestReallyLargeTagNumber ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestReallyLargeTagNumber> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestReallyLargeTagNumber prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestReallyLargeTagNumber, Builder> {
+      // Construct using self::TestReallyLargeTagNumber.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestReallyLargeTagNumber result = new self::TestReallyLargeTagNumber();
+      
+      protected override self::TestReallyLargeTagNumber MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> Clear() {
+        result = new self::TestReallyLargeTagNumber();
+        return this;
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestReallyLargeTagNumber.Descriptor; }
+      }
+      
+      public override self::TestReallyLargeTagNumber DefaultInstanceForType {
+        get { return self::TestReallyLargeTagNumber.DefaultInstance; }
+      }
+      
+      public override self::TestReallyLargeTagNumber BuildPartial() {
+        self::TestReallyLargeTagNumber returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestReallyLargeTagNumber) {
+          return MergeFrom((self::TestReallyLargeTagNumber) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> MergeFrom(self::TestReallyLargeTagNumber other) {
+        if (other == self::TestReallyLargeTagNumber.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        if (other.HasBb) {
+          Bb = other.Bb;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              A = input.ReadInt32();
+              break;
+            }
+            case 2147483640: {
+              Bb = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      // optional int32 bb = 268435455;
+      public bool HasBb {
+        get { return result.HasBb; }
+      }
+      public int Bb {
+        get { return result.Bb; }
+        set { SetBb(value); }
+      }
+      public Builder SetBb(int value) {
+        result.hasBb = true;
+        result.bb_ = value;
+        return this;
+      }
+      public Builder ClearBb() {
+        result.hasBb = false;
+        result.bb_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestRecursiveMessage : pb::GeneratedMessage<TestRecursiveMessage, TestRecursiveMessage.Builder> {
+    // Use TestRecursiveMessage.CreateBuilder() to construct.
+    private TestRecursiveMessage() {}
+    
+    private static readonly TestRecursiveMessage defaultInstance = new TestRecursiveMessage();
+    public static TestRecursiveMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRecursiveMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestRecursiveMessage a = 1;
+    private bool hasA;
+    private self::TestRecursiveMessage a_ = self::TestRecursiveMessage.DefaultInstance;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public self::TestRecursiveMessage A {
+      get { return a_; }
+    }
+    
+    // optional int32 i = 2;
+    private bool hasI;
+    private int i_ = 0;
+    public bool HasI {
+      get { return hasI; }
+    }
+    public int I {
+      get { return i_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteMessage(1, A);
+      }
+      if (HasI) {
+        output.WriteInt32(2, I);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, A);
+        }
+        if (HasI) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, I);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestRecursiveMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRecursiveMessage parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestRecursiveMessage> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestRecursiveMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestRecursiveMessage, Builder> {
+      // Construct using self::TestRecursiveMessage.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestRecursiveMessage result = new self::TestRecursiveMessage();
+      
+      protected override self::TestRecursiveMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> Clear() {
+        result = new self::TestRecursiveMessage();
+        return this;
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestRecursiveMessage.Descriptor; }
+      }
+      
+      public override self::TestRecursiveMessage DefaultInstanceForType {
+        get { return self::TestRecursiveMessage.DefaultInstance; }
+      }
+      
+      public override self::TestRecursiveMessage BuildPartial() {
+        self::TestRecursiveMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestRecursiveMessage) {
+          return MergeFrom((self::TestRecursiveMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> MergeFrom(self::TestRecursiveMessage other) {
+        if (other == self::TestRecursiveMessage.DefaultInstance) return this;
+        if (other.HasA) {
+          MergeA(other.A);
+        }
+        if (other.HasI) {
+          I = other.I;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestRecursiveMessage.Builder subBuilder = self::TestRecursiveMessage.CreateBuilder();
+              if (HasA) {
+                subBuilder.MergeFrom(A);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              A = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              I = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestRecursiveMessage a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public self::TestRecursiveMessage A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(self::TestRecursiveMessage value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder SetA(self::TestRecursiveMessage.Builder builderForValue) {
+        result.hasA = true;
+        result.a_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeA(self::TestRecursiveMessage value) {
+        if (result.HasA &&
+            result.a_ != self::TestRecursiveMessage.DefaultInstance) {
+          result.a_ =
+            self::TestRecursiveMessage.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();
+        } else {
+          result.a_ = value;
+        }
+        result.hasA = true;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = self::TestRecursiveMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional int32 i = 2;
+      public bool HasI {
+        get { return result.HasI; }
+      }
+      public int I {
+        get { return result.I; }
+        set { SetI(value); }
+      }
+      public Builder SetI(int value) {
+        result.hasI = true;
+        result.i_ = value;
+        return this;
+      }
+      public Builder ClearI() {
+        result.hasI = false;
+        result.i_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestMutualRecursionA : pb::GeneratedMessage<TestMutualRecursionA, TestMutualRecursionA.Builder> {
+    // Use TestMutualRecursionA.CreateBuilder() to construct.
+    private TestMutualRecursionA() {}
+    
+    private static readonly TestMutualRecursionA defaultInstance = new TestMutualRecursionA();
+    public static TestMutualRecursionA DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMutualRecursionA DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestMutualRecursionB bb = 1;
+    private bool hasBb;
+    private self::TestMutualRecursionB bb_ = self::TestMutualRecursionB.DefaultInstance;
+    public bool HasBb {
+      get { return hasBb; }
+    }
+    public self::TestMutualRecursionB Bb {
+      get { return bb_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasBb) {
+        output.WriteMessage(1, Bb);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasBb) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, Bb);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMutualRecursionA ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMutualRecursionA parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMutualRecursionA> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMutualRecursionA prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMutualRecursionA, Builder> {
+      // Construct using self::TestMutualRecursionA.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMutualRecursionA result = new self::TestMutualRecursionA();
+      
+      protected override self::TestMutualRecursionA MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> Clear() {
+        result = new self::TestMutualRecursionA();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMutualRecursionA.Descriptor; }
+      }
+      
+      public override self::TestMutualRecursionA DefaultInstanceForType {
+        get { return self::TestMutualRecursionA.DefaultInstance; }
+      }
+      
+      public override self::TestMutualRecursionA BuildPartial() {
+        self::TestMutualRecursionA returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMutualRecursionA) {
+          return MergeFrom((self::TestMutualRecursionA) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> MergeFrom(self::TestMutualRecursionA other) {
+        if (other == self::TestMutualRecursionA.DefaultInstance) return this;
+        if (other.HasBb) {
+          MergeBb(other.Bb);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestMutualRecursionB.Builder subBuilder = self::TestMutualRecursionB.CreateBuilder();
+              if (HasBb) {
+                subBuilder.MergeFrom(Bb);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Bb = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestMutualRecursionB bb = 1;
+      public bool HasBb {
+        get { return result.HasBb; }
+      }
+      public self::TestMutualRecursionB Bb {
+        get { return result.Bb; }
+        set { SetBb(value); }
+      }
+      public Builder SetBb(self::TestMutualRecursionB value) {
+        result.hasBb = true;
+        result.bb_ = value;
+        return this;
+      }
+      public Builder SetBb(self::TestMutualRecursionB.Builder builderForValue) {
+        result.hasBb = true;
+        result.bb_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeBb(self::TestMutualRecursionB value) {
+        if (result.HasBb &&
+            result.bb_ != self::TestMutualRecursionB.DefaultInstance) {
+          result.bb_ =
+            self::TestMutualRecursionB.CreateBuilder(result.bb_).MergeFrom(value).BuildPartial();
+        } else {
+          result.bb_ = value;
+        }
+        result.hasBb = true;
+        return this;
+      }
+      public Builder ClearBb() {
+        result.hasBb = false;
+        result.bb_ = self::TestMutualRecursionB.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestMutualRecursionB : pb::GeneratedMessage<TestMutualRecursionB, TestMutualRecursionB.Builder> {
+    // Use TestMutualRecursionB.CreateBuilder() to construct.
+    private TestMutualRecursionB() {}
+    
+    private static readonly TestMutualRecursionB defaultInstance = new TestMutualRecursionB();
+    public static TestMutualRecursionB DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMutualRecursionB DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestMutualRecursionA a = 1;
+    private bool hasA;
+    private self::TestMutualRecursionA a_ = self::TestMutualRecursionA.DefaultInstance;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public self::TestMutualRecursionA A {
+      get { return a_; }
+    }
+    
+    // optional int32 optional_int32 = 2;
+    private bool hasOptionalInt32;
+    private int optionalInt32_ = 0;
+    public bool HasOptionalInt32 {
+      get { return hasOptionalInt32; }
+    }
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteMessage(1, A);
+      }
+      if (HasOptionalInt32) {
+        output.WriteInt32(2, OptionalInt32);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, A);
+        }
+        if (HasOptionalInt32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, OptionalInt32);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMutualRecursionB ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMutualRecursionB parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMutualRecursionB> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMutualRecursionB prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMutualRecursionB, Builder> {
+      // Construct using self::TestMutualRecursionB.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMutualRecursionB result = new self::TestMutualRecursionB();
+      
+      protected override self::TestMutualRecursionB MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> Clear() {
+        result = new self::TestMutualRecursionB();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMutualRecursionB.Descriptor; }
+      }
+      
+      public override self::TestMutualRecursionB DefaultInstanceForType {
+        get { return self::TestMutualRecursionB.DefaultInstance; }
+      }
+      
+      public override self::TestMutualRecursionB BuildPartial() {
+        self::TestMutualRecursionB returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMutualRecursionB) {
+          return MergeFrom((self::TestMutualRecursionB) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> MergeFrom(self::TestMutualRecursionB other) {
+        if (other == self::TestMutualRecursionB.DefaultInstance) return this;
+        if (other.HasA) {
+          MergeA(other.A);
+        }
+        if (other.HasOptionalInt32) {
+          OptionalInt32 = other.OptionalInt32;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestMutualRecursionA.Builder subBuilder = self::TestMutualRecursionA.CreateBuilder();
+              if (HasA) {
+                subBuilder.MergeFrom(A);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              A = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              OptionalInt32 = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestMutualRecursionA a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public self::TestMutualRecursionA A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(self::TestMutualRecursionA value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder SetA(self::TestMutualRecursionA.Builder builderForValue) {
+        result.hasA = true;
+        result.a_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeA(self::TestMutualRecursionA value) {
+        if (result.HasA &&
+            result.a_ != self::TestMutualRecursionA.DefaultInstance) {
+          result.a_ =
+            self::TestMutualRecursionA.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();
+        } else {
+          result.a_ = value;
+        }
+        result.hasA = true;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = self::TestMutualRecursionA.DefaultInstance;
+        return this;
+      }
+      
+      // optional int32 optional_int32 = 2;
+      public bool HasOptionalInt32 {
+        get { return result.HasOptionalInt32; }
+      }
+      public int OptionalInt32 {
+        get { return result.OptionalInt32; }
+        set { SetOptionalInt32(value); }
+      }
+      public Builder SetOptionalInt32(int value) {
+        result.hasOptionalInt32 = true;
+        result.optionalInt32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt32() {
+        result.hasOptionalInt32 = false;
+        result.optionalInt32_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestDupFieldNumber : pb::GeneratedMessage<TestDupFieldNumber, TestDupFieldNumber.Builder> {
+    // Use TestDupFieldNumber.CreateBuilder() to construct.
+    private TestDupFieldNumber() {}
+    
+    private static readonly TestDupFieldNumber defaultInstance = new TestDupFieldNumber();
+    public static TestDupFieldNumber DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestDupFieldNumber DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public sealed partial class Foo : pb::GeneratedMessage<Foo, Foo.Builder> {
+        // Use Foo.CreateBuilder() to construct.
+        private Foo() {}
+        
+        private static readonly Foo defaultInstance = new Foo();
+        public static Foo DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Foo DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable; }
+        }
+        
+        // optional int32 a = 1;
+        private bool hasA;
+        private int a_ = 0;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasA) {
+            output.WriteInt32(1, A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasA) {
+              size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestDupFieldNumber.Types.Foo> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestDupFieldNumber.Types.Foo prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestDupFieldNumber.Types.Foo, Builder> {
+          // Construct using self::TestDupFieldNumber.Types.Foo.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestDupFieldNumber.Types.Foo result = new self::TestDupFieldNumber.Types.Foo();
+          
+          protected override self::TestDupFieldNumber.Types.Foo MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> Clear() {
+            result = new self::TestDupFieldNumber.Types.Foo();
+            return this;
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestDupFieldNumber.Types.Foo.Descriptor; }
+          }
+          
+          public override self::TestDupFieldNumber.Types.Foo DefaultInstanceForType {
+            get { return self::TestDupFieldNumber.Types.Foo.DefaultInstance; }
+          }
+          
+          public override self::TestDupFieldNumber.Types.Foo BuildPartial() {
+            self::TestDupFieldNumber.Types.Foo returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestDupFieldNumber.Types.Foo) {
+              return MergeFrom((self::TestDupFieldNumber.Types.Foo) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> MergeFrom(self::TestDupFieldNumber.Types.Foo other) {
+            if (other == self::TestDupFieldNumber.Types.Foo.DefaultInstance) return this;
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  A = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 a = 1;
+          public bool HasA {
+            get { return result.HasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+      }
+      
+      public sealed partial class Bar : pb::GeneratedMessage<Bar, Bar.Builder> {
+        // Use Bar.CreateBuilder() to construct.
+        private Bar() {}
+        
+        private static readonly Bar defaultInstance = new Bar();
+        public static Bar DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Bar DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable; }
+        }
+        
+        // optional int32 a = 1;
+        private bool hasA;
+        private int a_ = 0;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasA) {
+            output.WriteInt32(1, A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasA) {
+              size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestDupFieldNumber.Types.Bar> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestDupFieldNumber.Types.Bar prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestDupFieldNumber.Types.Bar, Builder> {
+          // Construct using self::TestDupFieldNumber.Types.Bar.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestDupFieldNumber.Types.Bar result = new self::TestDupFieldNumber.Types.Bar();
+          
+          protected override self::TestDupFieldNumber.Types.Bar MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> Clear() {
+            result = new self::TestDupFieldNumber.Types.Bar();
+            return this;
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestDupFieldNumber.Types.Bar.Descriptor; }
+          }
+          
+          public override self::TestDupFieldNumber.Types.Bar DefaultInstanceForType {
+            get { return self::TestDupFieldNumber.Types.Bar.DefaultInstance; }
+          }
+          
+          public override self::TestDupFieldNumber.Types.Bar BuildPartial() {
+            self::TestDupFieldNumber.Types.Bar returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestDupFieldNumber.Types.Bar) {
+              return MergeFrom((self::TestDupFieldNumber.Types.Bar) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> MergeFrom(self::TestDupFieldNumber.Types.Bar other) {
+            if (other == self::TestDupFieldNumber.Types.Bar.DefaultInstance) return this;
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  A = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 a = 1;
+          public bool HasA {
+            get { return result.HasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+      }
+      
+    }
+    #endregion
+    
+    // optional int32 a = 1;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    // optional group Foo = 2 {
+    private bool hasFoo;
+    private self::TestDupFieldNumber.Types.Foo foo_ = self::TestDupFieldNumber.Types.Foo.DefaultInstance;
+    public bool HasFoo {
+      get { return hasFoo; }
+    }
+    public self::TestDupFieldNumber.Types.Foo Foo {
+      get { return foo_; }
+    }
+    
+    // optional group Bar = 3 {
+    private bool hasBar;
+    private self::TestDupFieldNumber.Types.Bar bar_ = self::TestDupFieldNumber.Types.Bar.DefaultInstance;
+    public bool HasBar {
+      get { return hasBar; }
+    }
+    public self::TestDupFieldNumber.Types.Bar Bar {
+      get { return bar_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(1, A);
+      }
+      if (HasFoo) {
+        output.WriteGroup(2, Foo);
+      }
+      if (HasBar) {
+        output.WriteGroup(3, Bar);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+        }
+        if (HasFoo) {
+          size += pb::CodedOutputStream.ComputeGroupSize(2, Foo);
+        }
+        if (HasBar) {
+          size += pb::CodedOutputStream.ComputeGroupSize(3, Bar);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestDupFieldNumber ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestDupFieldNumber parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestDupFieldNumber> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestDupFieldNumber prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestDupFieldNumber, Builder> {
+      // Construct using self::TestDupFieldNumber.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestDupFieldNumber result = new self::TestDupFieldNumber();
+      
+      protected override self::TestDupFieldNumber MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> Clear() {
+        result = new self::TestDupFieldNumber();
+        return this;
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestDupFieldNumber.Descriptor; }
+      }
+      
+      public override self::TestDupFieldNumber DefaultInstanceForType {
+        get { return self::TestDupFieldNumber.DefaultInstance; }
+      }
+      
+      public override self::TestDupFieldNumber BuildPartial() {
+        self::TestDupFieldNumber returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestDupFieldNumber) {
+          return MergeFrom((self::TestDupFieldNumber) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> MergeFrom(self::TestDupFieldNumber other) {
+        if (other == self::TestDupFieldNumber.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        if (other.HasFoo) {
+          MergeFoo(other.Foo);
+        }
+        if (other.HasBar) {
+          MergeBar(other.Bar);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              A = input.ReadInt32();
+              break;
+            }
+            case 19: {
+              self::TestDupFieldNumber.Types.Foo.Builder subBuilder = self::TestDupFieldNumber.Types.Foo.CreateBuilder();
+              if (HasFoo) {
+                subBuilder.MergeFrom(Foo);
+              }
+              input.ReadGroup(2, subBuilder, extensionRegistry);
+              Foo = subBuilder.BuildPartial();
+              break;
+            }
+            case 27: {
+              self::TestDupFieldNumber.Types.Bar.Builder subBuilder = self::TestDupFieldNumber.Types.Bar.CreateBuilder();
+              if (HasBar) {
+                subBuilder.MergeFrom(Bar);
+              }
+              input.ReadGroup(3, subBuilder, extensionRegistry);
+              Bar = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      // optional group Foo = 2 {
+      public bool HasFoo {
+        get { return result.HasFoo; }
+      }
+      public self::TestDupFieldNumber.Types.Foo Foo {
+        get { return result.Foo; }
+        set { SetFoo(value); }
+      }
+      public Builder SetFoo(self::TestDupFieldNumber.Types.Foo value) {
+        result.hasFoo = true;
+        result.foo_ = value;
+        return this;
+      }
+      public Builder SetFoo(self::TestDupFieldNumber.Types.Foo.Builder builderForValue) {
+        result.hasFoo = true;
+        result.foo_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFoo(self::TestDupFieldNumber.Types.Foo value) {
+        if (result.HasFoo &&
+            result.foo_ != self::TestDupFieldNumber.Types.Foo.DefaultInstance) {
+          result.foo_ =
+            self::TestDupFieldNumber.Types.Foo.CreateBuilder(result.foo_).MergeFrom(value).BuildPartial();
+        } else {
+          result.foo_ = value;
+        }
+        result.hasFoo = true;
+        return this;
+      }
+      public Builder ClearFoo() {
+        result.hasFoo = false;
+        result.foo_ = self::TestDupFieldNumber.Types.Foo.DefaultInstance;
+        return this;
+      }
+      
+      // optional group Bar = 3 {
+      public bool HasBar {
+        get { return result.HasBar; }
+      }
+      public self::TestDupFieldNumber.Types.Bar Bar {
+        get { return result.Bar; }
+        set { SetBar(value); }
+      }
+      public Builder SetBar(self::TestDupFieldNumber.Types.Bar value) {
+        result.hasBar = true;
+        result.bar_ = value;
+        return this;
+      }
+      public Builder SetBar(self::TestDupFieldNumber.Types.Bar.Builder builderForValue) {
+        result.hasBar = true;
+        result.bar_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeBar(self::TestDupFieldNumber.Types.Bar value) {
+        if (result.HasBar &&
+            result.bar_ != self::TestDupFieldNumber.Types.Bar.DefaultInstance) {
+          result.bar_ =
+            self::TestDupFieldNumber.Types.Bar.CreateBuilder(result.bar_).MergeFrom(value).BuildPartial();
+        } else {
+          result.bar_ = value;
+        }
+        result.hasBar = true;
+        return this;
+      }
+      public Builder ClearBar() {
+        result.hasBar = false;
+        result.bar_ = self::TestDupFieldNumber.Types.Bar.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestNestedMessageHasBits : pb::GeneratedMessage<TestNestedMessageHasBits, TestNestedMessageHasBits.Builder> {
+    // Use TestNestedMessageHasBits.CreateBuilder() to construct.
+    private TestNestedMessageHasBits() {}
+    
+    private static readonly TestNestedMessageHasBits defaultInstance = new TestNestedMessageHasBits();
+    public static TestNestedMessageHasBits DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestNestedMessageHasBits DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        // Use NestedMessage.CreateBuilder() to construct.
+        private NestedMessage() {}
+        
+        private static readonly NestedMessage defaultInstance = new NestedMessage();
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override NestedMessage DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable; }
+        }
+        
+        // repeated int32 nestedmessage_repeated_int32 = 1;
+        private scg::IList<int> nestedmessageRepeatedInt32_ = pbc::Lists<int>.Empty;
+        public scg::IList<int> NestedmessageRepeatedInt32List {
+          get { return nestedmessageRepeatedInt32_; }
+        }
+        public int NestedmessageRepeatedInt32Count {
+          get { return nestedmessageRepeatedInt32_.Count; }
+        }
+        public int GetNestedmessageRepeatedInt32(int index) {
+          return nestedmessageRepeatedInt32_[index];
+        }
+        
+        // repeated .protobuf_unittest.ForeignMessage nestedmessage_repeated_foreignmessage = 2;
+        private scg::IList<self::ForeignMessage> nestedmessageRepeatedForeignmessage_ = pbc::Lists<self::ForeignMessage>.Empty;
+        public scg::IList<self::ForeignMessage> NestedmessageRepeatedForeignmessageList {
+          get { return nestedmessageRepeatedForeignmessage_; } 
+        }
+        public int NestedmessageRepeatedForeignmessageCount
+          { get { return nestedmessageRepeatedForeignmessage_.Count; }
+        }
+        public self::ForeignMessage GetNestedmessageRepeatedForeignmessage(int index) {
+          return nestedmessageRepeatedForeignmessage_ [index];
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          foreach (int element in NestedmessageRepeatedInt32List) {
+            output.WriteInt32(1, element);
+          }
+          foreach (self::ForeignMessage element in NestedmessageRepeatedForeignmessageList) {
+            output.WriteMessage(2, element);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            foreach (int element in NestedmessageRepeatedInt32List) {
+              size += pb::CodedOutputStream
+                .ComputeInt32Size(1, element);
+            }
+            foreach (self::ForeignMessage element in NestedmessageRepeatedForeignmessageList) {
+              size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestNestedMessageHasBits.Types.NestedMessage prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestNestedMessageHasBits.Types.NestedMessage, Builder> {
+          // Construct using self::TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestNestedMessageHasBits.Types.NestedMessage result = new self::TestNestedMessageHasBits.Types.NestedMessage();
+          
+          protected override self::TestNestedMessageHasBits.Types.NestedMessage MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> Clear() {
+            result = new self::TestNestedMessageHasBits.Types.NestedMessage();
+            return this;
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestNestedMessageHasBits.Types.NestedMessage.Descriptor; }
+          }
+          
+          public override self::TestNestedMessageHasBits.Types.NestedMessage DefaultInstanceForType {
+            get { return self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance; }
+          }
+          
+          public override self::TestNestedMessageHasBits.Types.NestedMessage BuildPartial() {
+            result.nestedmessageRepeatedInt32_ = pbc::Lists<int>.AsReadOnly(result.nestedmessageRepeatedInt32_);
+            if (result.nestedmessageRepeatedForeignmessage_ != pbc::Lists<self::ForeignMessage>.Empty) {
+              result.nestedmessageRepeatedForeignmessage_ = pbc::Lists<self::ForeignMessage>.AsReadOnly(result.nestedmessageRepeatedForeignmessage_);
+            }
+            self::TestNestedMessageHasBits.Types.NestedMessage returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestNestedMessageHasBits.Types.NestedMessage) {
+              return MergeFrom((self::TestNestedMessageHasBits.Types.NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> MergeFrom(self::TestNestedMessageHasBits.Types.NestedMessage other) {
+            if (other == self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) return this;
+            if (other.nestedmessageRepeatedInt32_.Count != 0) {
+              if (result.nestedmessageRepeatedInt32_.Count == 0) {
+                result.nestedmessageRepeatedInt32_ = new scg::List<int>();
+              }
+              base.AddRange(other.nestedmessageRepeatedInt32_, result.nestedmessageRepeatedInt32_);
+            }
+            if (other.nestedmessageRepeatedForeignmessage_.Count != 0) {
+              if (result.nestedmessageRepeatedForeignmessage_.Count == 0) {
+                result.nestedmessageRepeatedForeignmessage_ = new scg::List<self::ForeignMessage>();
+              }
+              base.AddRange(other.nestedmessageRepeatedForeignmessage_, result.nestedmessageRepeatedForeignmessage_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  AddNestedmessageRepeatedInt32(input.ReadInt32());
+                  break;
+                }
+                case 18: {
+                  self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+                  input.ReadMessage(subBuilder, extensionRegistry);
+                  AddNestedmessageRepeatedForeignmessage(subBuilder.BuildPartial());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // repeated int32 nestedmessage_repeated_int32 = 1;
+          public scg::IList<int> NestedmessageRepeatedInt32List {
+            get { return pbc::Lists<int>.AsReadOnly(result.nestedmessageRepeatedInt32_); }
+          }
+          public int NestedmessageRepeatedInt32Count {
+            get { return result.NestedmessageRepeatedInt32Count; }
+          }
+          public int GetNestedmessageRepeatedInt32(int index) {
+            return result.GetNestedmessageRepeatedInt32(index);
+          }
+          public Builder SetNestedmessageRepeatedInt32(int index, int value) {
+            result.nestedmessageRepeatedInt32_[index] = value;
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedInt32(int value) {
+            if (result.nestedmessageRepeatedInt32_.Count == 0) {
+              result.nestedmessageRepeatedInt32_ = new scg::List<int>();
+            }
+            result.nestedmessageRepeatedInt32_.Add(value);
+            return this;
+          }
+          public Builder AddRangeNestedmessageRepeatedInt32(scg::IEnumerable<int> values) {
+            if (result.nestedmessageRepeatedInt32_.Count == 0) {
+              result.nestedmessageRepeatedInt32_ = new scg::List<int>();
+            }
+            base.AddRange(values, result.nestedmessageRepeatedInt32_);
+            return this;
+          }
+          public Builder ClearNestedmessageRepeatedInt32() {
+            result.nestedmessageRepeatedInt32_ = pbc::Lists<int>.Empty;
+            return this;
+          }
+          
+          // repeated .protobuf_unittest.ForeignMessage nestedmessage_repeated_foreignmessage = 2;
+          public scg::IList<self::ForeignMessage> NestedmessageRepeatedForeignmessageList {
+            get { return pbc::Lists.AsReadOnly(result.nestedmessageRepeatedForeignmessage_); }
+          }
+          public int NestedmessageRepeatedForeignmessageCount {
+            get { return result.NestedmessageRepeatedForeignmessageCount; }
+          }
+          public self::ForeignMessage GetNestedmessageRepeatedForeignmessage(int index) {
+            return result.GetNestedmessageRepeatedForeignmessage(index);
+          }
+          public Builder SetNestedmessageRepeatedForeignmessage(int index, self::ForeignMessage value) {
+            result.nestedmessageRepeatedForeignmessage_[index] = value;
+            return this;
+          }
+          public Builder SetNestedmessageRepeatedForeignmessage(int index, self::ForeignMessage.Builder builderForValue) {
+            result.nestedmessageRepeatedForeignmessage_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedForeignmessage(self::ForeignMessage value) {
+            if (result.nestedmessageRepeatedForeignmessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+              result.nestedmessageRepeatedForeignmessage_ = new scg::List<self::ForeignMessage>();
+            }
+            result.nestedmessageRepeatedForeignmessage_.Add(value);
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedForeignmessage(self::ForeignMessage.Builder builderForValue) {
+            if (result.nestedmessageRepeatedForeignmessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+              result.nestedmessageRepeatedForeignmessage_ = new scg::List<self::ForeignMessage>();
+            }
+            result.nestedmessageRepeatedForeignmessage_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeNestedmessageRepeatedForeignmessage(scg::IEnumerable<self::ForeignMessage> values) {
+            if (result.nestedmessageRepeatedForeignmessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+              result.nestedmessageRepeatedForeignmessage_ = new scg::List<self::ForeignMessage>();
+            }
+            base.AddRange(values, result.nestedmessageRepeatedForeignmessage_);
+            return this;
+          }
+          public Builder ClearNestedmessageRepeatedForeignmessage() {
+            result.nestedmessageRepeatedForeignmessage_ = pbc::Lists<self::ForeignMessage>.Empty;
+            return this;
+          }
+        }
+      }
+      
+    }
+    #endregion
+    
+    // optional .protobuf_unittest.TestNestedMessageHasBits.NestedMessage optional_nested_message = 1;
+    private bool hasOptionalNestedMessage;
+    private self::TestNestedMessageHasBits.Types.NestedMessage optionalNestedMessage_ = self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public self::TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasOptionalNestedMessage) {
+        output.WriteMessage(1, OptionalNestedMessage);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasOptionalNestedMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, OptionalNestedMessage);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestNestedMessageHasBits ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestNestedMessageHasBits> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestNestedMessageHasBits prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestNestedMessageHasBits, Builder> {
+      // Construct using self::TestNestedMessageHasBits.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestNestedMessageHasBits result = new self::TestNestedMessageHasBits();
+      
+      protected override self::TestNestedMessageHasBits MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> Clear() {
+        result = new self::TestNestedMessageHasBits();
+        return this;
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestNestedMessageHasBits.Descriptor; }
+      }
+      
+      public override self::TestNestedMessageHasBits DefaultInstanceForType {
+        get { return self::TestNestedMessageHasBits.DefaultInstance; }
+      }
+      
+      public override self::TestNestedMessageHasBits BuildPartial() {
+        self::TestNestedMessageHasBits returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestNestedMessageHasBits) {
+          return MergeFrom((self::TestNestedMessageHasBits) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> MergeFrom(self::TestNestedMessageHasBits other) {
+        if (other == self::TestNestedMessageHasBits.DefaultInstance) return this;
+        if (other.HasOptionalNestedMessage) {
+          MergeOptionalNestedMessage(other.OptionalNestedMessage);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestNestedMessageHasBits.Types.NestedMessage.Builder subBuilder = self::TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder();
+              if (HasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestNestedMessageHasBits.NestedMessage optional_nested_message = 1;
+      public bool HasOptionalNestedMessage {
+        get { return result.HasOptionalNestedMessage; }
+      }
+      public self::TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(self::TestNestedMessageHasBits.Types.NestedMessage value) {
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(self::TestNestedMessageHasBits.Types.NestedMessage.Builder builderForValue) {
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(self::TestNestedMessageHasBits.Types.NestedMessage value) {
+        if (result.HasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) {
+          result.optionalNestedMessage_ =
+            self::TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestCamelCaseFieldNames : pb::GeneratedMessage<TestCamelCaseFieldNames, TestCamelCaseFieldNames.Builder> {
+    // Use TestCamelCaseFieldNames.CreateBuilder() to construct.
+    private TestCamelCaseFieldNames() {}
+    
+    private static readonly TestCamelCaseFieldNames defaultInstance = new TestCamelCaseFieldNames();
+    public static TestCamelCaseFieldNames DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestCamelCaseFieldNames DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable; }
+    }
+    
+    // optional int32 PrimitiveField = 1;
+    private bool hasPrimitiveField;
+    private int primitiveField_ = 0;
+    public bool HasPrimitiveField {
+      get { return hasPrimitiveField; }
+    }
+    public int PrimitiveField {
+      get { return primitiveField_; }
+    }
+    
+    // optional string StringField = 2;
+    private bool hasStringField;
+    private string stringField_ = "";
+    public bool HasStringField {
+      get { return hasStringField; }
+    }
+    public string StringField {
+      get { return stringField_; }
+    }
+    
+    // optional .protobuf_unittest.ForeignEnum EnumField = 3;
+    private bool hasEnumField;
+    private self::ForeignEnum enumField_ = self::ForeignEnum.FOREIGN_FOO;
+    public bool HasEnumField {
+      get { return hasEnumField; }
+    }
+    public self::ForeignEnum EnumField {  get { return enumField_; }}
+    
+    // optional .protobuf_unittest.ForeignMessage MessageField = 4;
+    private bool hasMessageField;
+    private self::ForeignMessage messageField_ = self::ForeignMessage.DefaultInstance;
+    public bool HasMessageField {
+      get { return hasMessageField; }
+    }
+    public self::ForeignMessage MessageField {
+      get { return messageField_; }
+    }
+    
+    // optional string StringPieceField = 5 [ctype = STRING_PIECE];
+    private bool hasStringPieceField;
+    private string stringPieceField_ = "";
+    public bool HasStringPieceField {
+      get { return hasStringPieceField; }
+    }
+    public string StringPieceField {
+      get { return stringPieceField_; }
+    }
+    
+    // optional string CordField = 6 [ctype = CORD];
+    private bool hasCordField;
+    private string cordField_ = "";
+    public bool HasCordField {
+      get { return hasCordField; }
+    }
+    public string CordField {
+      get { return cordField_; }
+    }
+    
+    // repeated int32 RepeatedPrimitiveField = 7;
+    private scg::IList<int> repeatedPrimitiveField_ = pbc::Lists<int>.Empty;
+    public scg::IList<int> RepeatedPrimitiveFieldList {
+      get { return repeatedPrimitiveField_; }
+    }
+    public int RepeatedPrimitiveFieldCount {
+      get { return repeatedPrimitiveField_.Count; }
+    }
+    public int GetRepeatedPrimitiveField(int index) {
+      return repeatedPrimitiveField_[index];
+    }
+    
+    // repeated string RepeatedStringField = 8;
+    private scg::IList<string> repeatedStringField_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedStringFieldList {
+      get { return repeatedStringField_; }
+    }
+    public int RepeatedStringFieldCount {
+      get { return repeatedStringField_.Count; }
+    }
+    public string GetRepeatedStringField(int index) {
+      return repeatedStringField_[index];
+    }
+    
+    // repeated .protobuf_unittest.ForeignEnum RepeatedEnumField = 9;
+    private scg::IList<self::ForeignEnum> repeatedEnumField_ = new scg::List<self::ForeignEnum> ();
+    public scg.IList<self::ForeignEnum> RepeatedEnumFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedEnumField_); }
+    }
+    public int RepeatedEnumFieldCount {
+      get { return repeatedEnumField_.Count; }
+    }
+    public self::ForeignEnum GetRepeatedEnumField(int index) {
+      return repeatedEnumField_[index];
+    }
+    
+    // repeated .protobuf_unittest.ForeignMessage RepeatedMessageField = 10;
+    private scg::IList<self::ForeignMessage> repeatedMessageField_ = pbc::Lists<self::ForeignMessage>.Empty;
+    public scg::IList<self::ForeignMessage> RepeatedMessageFieldList {
+      get { return repeatedMessageField_; } 
+    }
+    public int RepeatedMessageFieldCount
+      { get { return repeatedMessageField_.Count; }
+    }
+    public self::ForeignMessage GetRepeatedMessageField(int index) {
+      return repeatedMessageField_ [index];
+    }
+    
+    // repeated string RepeatedStringPieceField = 11 [ctype = STRING_PIECE];
+    private scg::IList<string> repeatedStringPieceField_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedStringPieceFieldList {
+      get { return repeatedStringPieceField_; }
+    }
+    public int RepeatedStringPieceFieldCount {
+      get { return repeatedStringPieceField_.Count; }
+    }
+    public string GetRepeatedStringPieceField(int index) {
+      return repeatedStringPieceField_[index];
+    }
+    
+    // repeated string RepeatedCordField = 12 [ctype = CORD];
+    private scg::IList<string> repeatedCordField_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedCordFieldList {
+      get { return repeatedCordField_; }
+    }
+    public int RepeatedCordFieldCount {
+      get { return repeatedCordField_.Count; }
+    }
+    public string GetRepeatedCordField(int index) {
+      return repeatedCordField_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasPrimitiveField) {
+        output.WriteInt32(1, PrimitiveField);
+      }
+      if (HasStringField) {
+        output.WriteString(2, StringField);
+      }
+      if (HasEnumField) {
+        output.WriteEnum(3, (int) EnumField);
+      }
+      if (HasMessageField) {
+        output.WriteMessage(4, MessageField);
+      }
+      if (HasStringPieceField) {
+        output.WriteString(5, StringPieceField);
+      }
+      if (HasCordField) {
+        output.WriteString(6, CordField);
+      }
+      foreach (int element in RepeatedPrimitiveFieldList) {
+        output.WriteInt32(7, element);
+      }
+      foreach (string element in RepeatedStringFieldList) {
+        output.WriteString(8, element);
+      }
+      foreach (self::ForeignEnum element in RepeatedEnumFieldList) {
+        output.WriteEnum(9, (int) element);
+      }
+      foreach (self::ForeignMessage element in RepeatedMessageFieldList) {
+        output.WriteMessage(10, element);
+      }
+      foreach (string element in RepeatedStringPieceFieldList) {
+        output.WriteString(11, element);
+      }
+      foreach (string element in RepeatedCordFieldList) {
+        output.WriteString(12, element);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasPrimitiveField) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, PrimitiveField);
+        }
+        if (HasStringField) {
+          size += pb::CodedOutputStream.ComputeStringSize(2, StringField);
+        }
+        if (HasEnumField) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(3, (int) EnumField);
+        }
+        if (HasMessageField) {
+          size += pb::CodedOutputStream.ComputeMessageSize(4, MessageField);
+        }
+        if (HasStringPieceField) {
+          size += pb::CodedOutputStream.ComputeStringSize(5, StringPieceField);
+        }
+        if (HasCordField) {
+          size += pb::CodedOutputStream.ComputeStringSize(6, CordField);
+        }
+        foreach (int element in RepeatedPrimitiveFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeInt32Size(7, element);
+        }
+        foreach (string element in RepeatedStringFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(8, element);
+        }
+        foreach (self::ForeignEnum element in RepeatedEnumFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(9, (int) element);
+        }
+        foreach (self::ForeignMessage element in RepeatedMessageFieldList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(10, element);
+        }
+        foreach (string element in RepeatedStringPieceFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(11, element);
+        }
+        foreach (string element in RepeatedCordFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(12, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestCamelCaseFieldNames ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestCamelCaseFieldNames> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestCamelCaseFieldNames prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestCamelCaseFieldNames, Builder> {
+      // Construct using self::TestCamelCaseFieldNames.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestCamelCaseFieldNames result = new self::TestCamelCaseFieldNames();
+      
+      protected override self::TestCamelCaseFieldNames MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> Clear() {
+        result = new self::TestCamelCaseFieldNames();
+        return this;
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestCamelCaseFieldNames.Descriptor; }
+      }
+      
+      public override self::TestCamelCaseFieldNames DefaultInstanceForType {
+        get { return self::TestCamelCaseFieldNames.DefaultInstance; }
+      }
+      
+      public override self::TestCamelCaseFieldNames BuildPartial() {
+        result.repeatedPrimitiveField_ = pbc::Lists<int>.AsReadOnly(result.repeatedPrimitiveField_);
+        result.repeatedStringField_ = pbc::Lists<string>.AsReadOnly(result.repeatedStringField_);
+        result.repeatedEnumField_ = pbc::Lists.AsReadOnly(result.repeatedEnumField_);
+        if (result.repeatedMessageField_ != pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedMessageField_ = pbc::Lists<self::ForeignMessage>.AsReadOnly(result.repeatedMessageField_);
+        }
+        result.repeatedStringPieceField_ = pbc::Lists<string>.AsReadOnly(result.repeatedStringPieceField_);
+        result.repeatedCordField_ = pbc::Lists<string>.AsReadOnly(result.repeatedCordField_);
+        self::TestCamelCaseFieldNames returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestCamelCaseFieldNames) {
+          return MergeFrom((self::TestCamelCaseFieldNames) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> MergeFrom(self::TestCamelCaseFieldNames other) {
+        if (other == self::TestCamelCaseFieldNames.DefaultInstance) return this;
+        if (other.HasPrimitiveField) {
+          PrimitiveField = other.PrimitiveField;
+        }
+        if (other.HasStringField) {
+          StringField = other.StringField;
+        }
+        if (other.HasEnumField) {
+          EnumField = other.EnumField;
+        }
+        if (other.HasMessageField) {
+          MergeMessageField(other.MessageField);
+        }
+        if (other.HasStringPieceField) {
+          StringPieceField = other.StringPieceField;
+        }
+        if (other.HasCordField) {
+          CordField = other.CordField;
+        }
+        if (other.repeatedPrimitiveField_.Count != 0) {
+          if (result.repeatedPrimitiveField_.Count == 0) {
+            result.repeatedPrimitiveField_ = new scg::List<int>();
+          }
+          base.AddRange(other.repeatedPrimitiveField_, result.repeatedPrimitiveField_);
+        }
+        if (other.repeatedStringField_.Count != 0) {
+          if (result.repeatedStringField_.Count == 0) {
+            result.repeatedStringField_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedStringField_, result.repeatedStringField_);
+        }
+        if (other.repeatedEnumField_.Count != 0) {
+          if (result.repeatedEnumField_.Count == 0) {
+            result.repeatedEnumField_ = new scg::List<self::ForeignEnum>();
+          }
+          base.AddRange(other.repeatedEnumField_, result.repeatedEnumField_);
+        }
+        if (other.repeatedMessageField_.Count != 0) {
+          if (result.repeatedMessageField_.Count == 0) {
+            result.repeatedMessageField_ = new scg::List<self::ForeignMessage>();
+          }
+          base.AddRange(other.repeatedMessageField_, result.repeatedMessageField_);
+        }
+        if (other.repeatedStringPieceField_.Count != 0) {
+          if (result.repeatedStringPieceField_.Count == 0) {
+            result.repeatedStringPieceField_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedStringPieceField_, result.repeatedStringPieceField_);
+        }
+        if (other.repeatedCordField_.Count != 0) {
+          if (result.repeatedCordField_.Count == 0) {
+            result.repeatedCordField_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedCordField_, result.repeatedCordField_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              PrimitiveField = input.ReadInt32();
+              break;
+            }
+            case 18: {
+              StringField = input.ReadString();
+              break;
+            }
+            case 24: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), rawValue)) {
+                unknownFields.MergeVarintField(3, (ulong) rawValue);
+              } else {
+                EnumField = (self::ForeignEnum) rawValue;
+              }
+              break;
+            }
+            case 34: {
+              self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+              if (HasMessageField) {
+                subBuilder.MergeFrom(MessageField);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              MessageField = subBuilder.BuildPartial();
+              break;
+            }
+            case 42: {
+              StringPieceField = input.ReadString();
+              break;
+            }
+            case 50: {
+              CordField = input.ReadString();
+              break;
+            }
+            case 56: {
+              AddRepeatedPrimitiveField(input.ReadInt32());
+              break;
+            }
+            case 66: {
+              AddRepeatedStringField(input.ReadString());
+              break;
+            }
+            case 72: {
+              int rawValue = input.ReadEnum();
+              self::ForeignEnum value = (self::ForeignEnum) rawValue;
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), value)) {
+                unknownFields.MergeVarintField(9, (ulong) rawValue);
+              } else {
+                AddRepeatedEnumField(value);
+              }
+              break;
+            }
+            case 82: {
+              self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedMessageField(subBuilder.BuildPartial());
+              break;
+            }
+            case 90: {
+              AddRepeatedStringPieceField(input.ReadString());
+              break;
+            }
+            case 98: {
+              AddRepeatedCordField(input.ReadString());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 PrimitiveField = 1;
+      public bool HasPrimitiveField {
+        get { return result.HasPrimitiveField; }
+      }
+      public int PrimitiveField {
+        get { return result.PrimitiveField; }
+        set { SetPrimitiveField(value); }
+      }
+      public Builder SetPrimitiveField(int value) {
+        result.hasPrimitiveField = true;
+        result.primitiveField_ = value;
+        return this;
+      }
+      public Builder ClearPrimitiveField() {
+        result.hasPrimitiveField = false;
+        result.primitiveField_ = 0;
+        return this;
+      }
+      
+      // optional string StringField = 2;
+      public bool HasStringField {
+        get { return result.HasStringField; }
+      }
+      public string StringField {
+        get { return result.StringField; }
+        set { SetStringField(value); }
+      }
+      public Builder SetStringField(string value) {
+        result.hasStringField = true;
+        result.stringField_ = value;
+        return this;
+      }
+      public Builder ClearStringField() {
+        result.hasStringField = false;
+        result.stringField_ = "";
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignEnum EnumField = 3;
+      public bool HasEnumField {
+        get { return result.HasEnumField; }
+      }
+      public self::ForeignEnum EnumField {
+        get { return result.EnumField; }
+        set { SetEnumField(value); }
+      }
+      public Builder SetEnumField(self::ForeignEnum value) {
+        result.hasEnumField = true;
+        result.enumField_ = value;
+        return this;
+      }
+      public Builder ClearEnumField() {
+        result.hasEnumField = false;
+        result.enumField_ = self::ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignMessage MessageField = 4;
+      public bool HasMessageField {
+        get { return result.HasMessageField; }
+      }
+      public self::ForeignMessage MessageField {
+        get { return result.MessageField; }
+        set { SetMessageField(value); }
+      }
+      public Builder SetMessageField(self::ForeignMessage value) {
+        result.hasMessageField = true;
+        result.messageField_ = value;
+        return this;
+      }
+      public Builder SetMessageField(self::ForeignMessage.Builder builderForValue) {
+        result.hasMessageField = true;
+        result.messageField_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMessageField(self::ForeignMessage value) {
+        if (result.HasMessageField &&
+            result.messageField_ != self::ForeignMessage.DefaultInstance) {
+          result.messageField_ =
+            self::ForeignMessage.CreateBuilder(result.messageField_).MergeFrom(value).BuildPartial();
+        } else {
+          result.messageField_ = value;
+        }
+        result.hasMessageField = true;
+        return this;
+      }
+      public Builder ClearMessageField() {
+        result.hasMessageField = false;
+        result.messageField_ = self::ForeignMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional string StringPieceField = 5 [ctype = STRING_PIECE];
+      public bool HasStringPieceField {
+        get { return result.HasStringPieceField; }
+      }
+      public string StringPieceField {
+        get { return result.StringPieceField; }
+        set { SetStringPieceField(value); }
+      }
+      public Builder SetStringPieceField(string value) {
+        result.hasStringPieceField = true;
+        result.stringPieceField_ = value;
+        return this;
+      }
+      public Builder ClearStringPieceField() {
+        result.hasStringPieceField = false;
+        result.stringPieceField_ = "";
+        return this;
+      }
+      
+      // optional string CordField = 6 [ctype = CORD];
+      public bool HasCordField {
+        get { return result.HasCordField; }
+      }
+      public string CordField {
+        get { return result.CordField; }
+        set { SetCordField(value); }
+      }
+      public Builder SetCordField(string value) {
+        result.hasCordField = true;
+        result.cordField_ = value;
+        return this;
+      }
+      public Builder ClearCordField() {
+        result.hasCordField = false;
+        result.cordField_ = "";
+        return this;
+      }
+      
+      // repeated int32 RepeatedPrimitiveField = 7;
+      public scg::IList<int> RepeatedPrimitiveFieldList {
+        get { return pbc::Lists<int>.AsReadOnly(result.repeatedPrimitiveField_); }
+      }
+      public int RepeatedPrimitiveFieldCount {
+        get { return result.RepeatedPrimitiveFieldCount; }
+      }
+      public int GetRepeatedPrimitiveField(int index) {
+        return result.GetRepeatedPrimitiveField(index);
+      }
+      public Builder SetRepeatedPrimitiveField(int index, int value) {
+        result.repeatedPrimitiveField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedPrimitiveField(int value) {
+        if (result.repeatedPrimitiveField_.Count == 0) {
+          result.repeatedPrimitiveField_ = new scg::List<int>();
+        }
+        result.repeatedPrimitiveField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedPrimitiveField(scg::IEnumerable<int> values) {
+        if (result.repeatedPrimitiveField_.Count == 0) {
+          result.repeatedPrimitiveField_ = new scg::List<int>();
+        }
+        base.AddRange(values, result.repeatedPrimitiveField_);
+        return this;
+      }
+      public Builder ClearRepeatedPrimitiveField() {
+        result.repeatedPrimitiveField_ = pbc::Lists<int>.Empty;
+        return this;
+      }
+      
+      // repeated string RepeatedStringField = 8;
+      public scg::IList<string> RepeatedStringFieldList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedStringField_); }
+      }
+      public int RepeatedStringFieldCount {
+        get { return result.RepeatedStringFieldCount; }
+      }
+      public string GetRepeatedStringField(int index) {
+        return result.GetRepeatedStringField(index);
+      }
+      public Builder SetRepeatedStringField(int index, string value) {
+        result.repeatedStringField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringField(string value) {
+        if (result.repeatedStringField_.Count == 0) {
+          result.repeatedStringField_ = new scg::List<string>();
+        }
+        result.repeatedStringField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringField(scg::IEnumerable<string> values) {
+        if (result.repeatedStringField_.Count == 0) {
+          result.repeatedStringField_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedStringField_);
+        return this;
+      }
+      public Builder ClearRepeatedStringField() {
+        result.repeatedStringField_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.ForeignEnum RepeatedEnumField = 9;
+      public scg::IList<self::ForeignEnum> RepeatedEnumFieldList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedEnumField_); }
+      }
+      public int RepeatedEnumFieldCount {
+        get { return result.RepeatedEnumFieldCount; } 
+      }
+      public self::ForeignEnum GetRepeatedEnumField(int index) {
+        return result.GetRepeatedEnumField(index);
+      }
+      public Builder SetRepeatedEnumField(int index, self::ForeignEnum value) {
+        result.repeatedEnumField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedEnumField(self::ForeignEnum value) {
+        if (result.repeatedEnumField_.Count == 0) {
+          result.repeatedEnumField_ = new scg::List<self::ForeignEnum>();
+        }
+        result.repeatedEnumField_.Add(value);
+        return this;
+      }
+      public Builder AddAllRepeatedEnumField(scg::IEnumerable<self::ForeignEnum> values) {
+        if (result.repeatedEnumField_.Count == 0) {
+          result.repeatedEnumField_ = new scg::List<self::ForeignEnum>();
+        }
+        base.AddRange(values, result.repeatedEnumField_);
+        return this;
+      }
+      public Builder ClearRepeatedEnumField() {
+        result.repeatedEnumField_ = pbc::Lists<self::ForeignEnum>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.ForeignMessage RepeatedMessageField = 10;
+      public scg::IList<self::ForeignMessage> RepeatedMessageFieldList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedMessageField_); }
+      }
+      public int RepeatedMessageFieldCount {
+        get { return result.RepeatedMessageFieldCount; }
+      }
+      public self::ForeignMessage GetRepeatedMessageField(int index) {
+        return result.GetRepeatedMessageField(index);
+      }
+      public Builder SetRepeatedMessageField(int index, self::ForeignMessage value) {
+        result.repeatedMessageField_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessageField(int index, self::ForeignMessage.Builder builderForValue) {
+        result.repeatedMessageField_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessageField(self::ForeignMessage value) {
+        if (result.repeatedMessageField_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedMessageField_ = new scg::List<self::ForeignMessage>();
+        }
+        result.repeatedMessageField_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessageField(self::ForeignMessage.Builder builderForValue) {
+        if (result.repeatedMessageField_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedMessageField_ = new scg::List<self::ForeignMessage>();
+        }
+        result.repeatedMessageField_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessageField(scg::IEnumerable<self::ForeignMessage> values) {
+        if (result.repeatedMessageField_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedMessageField_ = new scg::List<self::ForeignMessage>();
+        }
+        base.AddRange(values, result.repeatedMessageField_);
+        return this;
+      }
+      public Builder ClearRepeatedMessageField() {
+        result.repeatedMessageField_ = pbc::Lists<self::ForeignMessage>.Empty;
+        return this;
+      }
+      
+      // repeated string RepeatedStringPieceField = 11 [ctype = STRING_PIECE];
+      public scg::IList<string> RepeatedStringPieceFieldList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedStringPieceField_); }
+      }
+      public int RepeatedStringPieceFieldCount {
+        get { return result.RepeatedStringPieceFieldCount; }
+      }
+      public string GetRepeatedStringPieceField(int index) {
+        return result.GetRepeatedStringPieceField(index);
+      }
+      public Builder SetRepeatedStringPieceField(int index, string value) {
+        result.repeatedStringPieceField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringPieceField(string value) {
+        if (result.repeatedStringPieceField_.Count == 0) {
+          result.repeatedStringPieceField_ = new scg::List<string>();
+        }
+        result.repeatedStringPieceField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringPieceField(scg::IEnumerable<string> values) {
+        if (result.repeatedStringPieceField_.Count == 0) {
+          result.repeatedStringPieceField_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedStringPieceField_);
+        return this;
+      }
+      public Builder ClearRepeatedStringPieceField() {
+        result.repeatedStringPieceField_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // repeated string RepeatedCordField = 12 [ctype = CORD];
+      public scg::IList<string> RepeatedCordFieldList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedCordField_); }
+      }
+      public int RepeatedCordFieldCount {
+        get { return result.RepeatedCordFieldCount; }
+      }
+      public string GetRepeatedCordField(int index) {
+        return result.GetRepeatedCordField(index);
+      }
+      public Builder SetRepeatedCordField(int index, string value) {
+        result.repeatedCordField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedCordField(string value) {
+        if (result.repeatedCordField_.Count == 0) {
+          result.repeatedCordField_ = new scg::List<string>();
+        }
+        result.repeatedCordField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedCordField(scg::IEnumerable<string> values) {
+        if (result.repeatedCordField_.Count == 0) {
+          result.repeatedCordField_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedCordField_);
+        return this;
+      }
+      public Builder ClearRepeatedCordField() {
+        result.repeatedCordField_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestFieldOrderings : pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder> {
+    // Use TestFieldOrderings.CreateBuilder() to construct.
+    private TestFieldOrderings() {}
+    
+    private static readonly TestFieldOrderings defaultInstance = new TestFieldOrderings();
+    public static TestFieldOrderings DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestFieldOrderings DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable; }
+    }
+    
+    // optional string my_string = 11;
+    private bool hasMyString;
+    private string myString_ = "";
+    public bool HasMyString {
+      get { return hasMyString; }
+    }
+    public string MyString {
+      get { return myString_; }
+    }
+    
+    // optional int64 my_int = 1;
+    private bool hasMyInt;
+    private long myInt_ = 0L;
+    public bool HasMyInt {
+      get { return hasMyInt; }
+    }
+    public long MyInt {
+      get { return myInt_; }
+    }
+    
+    // optional float my_float = 101;
+    private bool hasMyFloat;
+    private float myFloat_ = 0F;
+    public bool HasMyFloat {
+      get { return hasMyFloat; }
+    }
+    public float MyFloat {
+      get { return myFloat_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (HasMyInt) {
+        output.WriteInt64(1, MyInt);
+      }
+      extensionWriter.WriteUntil(11, output);
+      if (HasMyString) {
+        output.WriteString(11, MyString);
+      }
+      extensionWriter.WriteUntil(101, output);
+      if (HasMyFloat) {
+        output.WriteFloat(101, MyFloat);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasMyInt) {
+          size += pb::CodedOutputStream.ComputeInt64Size(1, MyInt);
+        }
+        if (HasMyString) {
+          size += pb::CodedOutputStream.ComputeStringSize(11, MyString);
+        }
+        if (HasMyFloat) {
+          size += pb::CodedOutputStream.ComputeFloatSize(101, MyFloat);
+        }
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestFieldOrderings ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestFieldOrderings parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestFieldOrderings> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestFieldOrderings prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestFieldOrderings, self::TestFieldOrderings.Builder>.ExtendableBuilder {
+      // Construct using self::TestFieldOrderings.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestFieldOrderings result = new self::TestFieldOrderings();
+      
+      protected override self::TestFieldOrderings MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> Clear() {
+        result = new self::TestFieldOrderings();
+        return this;
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestFieldOrderings.Descriptor; }
+      }
+      
+      public override self::TestFieldOrderings DefaultInstanceForType {
+        get { return self::TestFieldOrderings.DefaultInstance; }
+      }
+      
+      public override self::TestFieldOrderings BuildPartial() {
+        self::TestFieldOrderings returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestFieldOrderings) {
+          return MergeFrom((self::TestFieldOrderings) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> MergeFrom(self::TestFieldOrderings other) {
+        if (other == self::TestFieldOrderings.DefaultInstance) return this;
+        if (other.HasMyString) {
+          MyString = other.MyString;
+        }
+        if (other.HasMyInt) {
+          MyInt = other.MyInt;
+        }
+        if (other.HasMyFloat) {
+          MyFloat = other.MyFloat;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              MyInt = input.ReadInt64();
+              break;
+            }
+            case 90: {
+              MyString = input.ReadString();
+              break;
+            }
+            case 813: {
+              MyFloat = input.ReadFloat();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional string my_string = 11;
+      public bool HasMyString {
+        get { return result.HasMyString; }
+      }
+      public string MyString {
+        get { return result.MyString; }
+        set { SetMyString(value); }
+      }
+      public Builder SetMyString(string value) {
+        result.hasMyString = true;
+        result.myString_ = value;
+        return this;
+      }
+      public Builder ClearMyString() {
+        result.hasMyString = false;
+        result.myString_ = "";
+        return this;
+      }
+      
+      // optional int64 my_int = 1;
+      public bool HasMyInt {
+        get { return result.HasMyInt; }
+      }
+      public long MyInt {
+        get { return result.MyInt; }
+        set { SetMyInt(value); }
+      }
+      public Builder SetMyInt(long value) {
+        result.hasMyInt = true;
+        result.myInt_ = value;
+        return this;
+      }
+      public Builder ClearMyInt() {
+        result.hasMyInt = false;
+        result.myInt_ = 0L;
+        return this;
+      }
+      
+      // optional float my_float = 101;
+      public bool HasMyFloat {
+        get { return result.HasMyFloat; }
+      }
+      public float MyFloat {
+        get { return result.MyFloat; }
+        set { SetMyFloat(value); }
+      }
+      public Builder SetMyFloat(float value) {
+        result.hasMyFloat = true;
+        result.myFloat_ = value;
+        return this;
+      }
+      public Builder ClearMyFloat() {
+        result.hasMyFloat = false;
+        result.myFloat_ = 0F;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestExtremeDefaultValues : pb::GeneratedMessage<TestExtremeDefaultValues, TestExtremeDefaultValues.Builder> {
+    // Use TestExtremeDefaultValues.CreateBuilder() to construct.
+    private TestExtremeDefaultValues() {}
+    
+    private static readonly TestExtremeDefaultValues defaultInstance = new TestExtremeDefaultValues();
+    public static TestExtremeDefaultValues DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestExtremeDefaultValues DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable; }
+    }
+    
+    // optional bytes escaped_bytes = 1 [default = "\000\001\007\010\014\n\r\t\013\\\'\"\376"];
+    private bool hasEscapedBytes;
+    private pb::ByteString escapedBytes_ = ((pb::ByteString) self::TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue);
+    public bool HasEscapedBytes {
+      get { return hasEscapedBytes; }
+    }
+    public pb::ByteString EscapedBytes {
+      get { return escapedBytes_; }
+    }
+    
+    // optional uint32 large_uint32 = 2 [default = 4294967295];
+    private bool hasLargeUint32;
+    private uint largeUint32_ = 4294967295;
+    public bool HasLargeUint32 {
+      get { return hasLargeUint32; }
+    }
+    public uint LargeUint32 {
+      get { return largeUint32_; }
+    }
+    
+    // optional uint64 large_uint64 = 3 [default = 18446744073709551615];
+    private bool hasLargeUint64;
+    private ulong largeUint64_ = 18446744073709551615UL;
+    public bool HasLargeUint64 {
+      get { return hasLargeUint64; }
+    }
+    public ulong LargeUint64 {
+      get { return largeUint64_; }
+    }
+    
+    // optional int32 small_int32 = 4 [default = -2147483647];
+    private bool hasSmallInt32;
+    private int smallInt32_ = -2147483647;
+    public bool HasSmallInt32 {
+      get { return hasSmallInt32; }
+    }
+    public int SmallInt32 {
+      get { return smallInt32_; }
+    }
+    
+    // optional int64 small_int64 = 5 [default = -9223372036854775807];
+    private bool hasSmallInt64;
+    private long smallInt64_ = -9223372036854775807L;
+    public bool HasSmallInt64 {
+      get { return hasSmallInt64; }
+    }
+    public long SmallInt64 {
+      get { return smallInt64_; }
+    }
+    
+    // optional string utf8_string = 6 [default = "\341\210\264"];
+    private bool hasUtf8String;
+    private string utf8String_ = ((string) self::TestExtremeDefaultValues.Descriptor.Fields[5].DefaultValue);
+    public bool HasUtf8String {
+      get { return hasUtf8String; }
+    }
+    public string Utf8String {
+      get { return utf8String_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasEscapedBytes) {
+        output.WriteBytes(1, EscapedBytes);
+      }
+      if (HasLargeUint32) {
+        output.WriteUInt32(2, LargeUint32);
+      }
+      if (HasLargeUint64) {
+        output.WriteUInt64(3, LargeUint64);
+      }
+      if (HasSmallInt32) {
+        output.WriteInt32(4, SmallInt32);
+      }
+      if (HasSmallInt64) {
+        output.WriteInt64(5, SmallInt64);
+      }
+      if (HasUtf8String) {
+        output.WriteString(6, Utf8String);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasEscapedBytes) {
+          size += pb::CodedOutputStream.ComputeBytesSize(1, EscapedBytes);
+        }
+        if (HasLargeUint32) {
+          size += pb::CodedOutputStream.ComputeUInt32Size(2, LargeUint32);
+        }
+        if (HasLargeUint64) {
+          size += pb::CodedOutputStream.ComputeUInt64Size(3, LargeUint64);
+        }
+        if (HasSmallInt32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(4, SmallInt32);
+        }
+        if (HasSmallInt64) {
+          size += pb::CodedOutputStream.ComputeInt64Size(5, SmallInt64);
+        }
+        if (HasUtf8String) {
+          size += pb::CodedOutputStream.ComputeStringSize(6, Utf8String);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestExtremeDefaultValues ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestExtremeDefaultValues> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestExtremeDefaultValues prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestExtremeDefaultValues, Builder> {
+      // Construct using self::TestExtremeDefaultValues.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestExtremeDefaultValues result = new self::TestExtremeDefaultValues();
+      
+      protected override self::TestExtremeDefaultValues MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> Clear() {
+        result = new self::TestExtremeDefaultValues();
+        return this;
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestExtremeDefaultValues.Descriptor; }
+      }
+      
+      public override self::TestExtremeDefaultValues DefaultInstanceForType {
+        get { return self::TestExtremeDefaultValues.DefaultInstance; }
+      }
+      
+      public override self::TestExtremeDefaultValues BuildPartial() {
+        self::TestExtremeDefaultValues returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestExtremeDefaultValues) {
+          return MergeFrom((self::TestExtremeDefaultValues) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> MergeFrom(self::TestExtremeDefaultValues other) {
+        if (other == self::TestExtremeDefaultValues.DefaultInstance) return this;
+        if (other.HasEscapedBytes) {
+          EscapedBytes = other.EscapedBytes;
+        }
+        if (other.HasLargeUint32) {
+          LargeUint32 = other.LargeUint32;
+        }
+        if (other.HasLargeUint64) {
+          LargeUint64 = other.LargeUint64;
+        }
+        if (other.HasSmallInt32) {
+          SmallInt32 = other.SmallInt32;
+        }
+        if (other.HasSmallInt64) {
+          SmallInt64 = other.SmallInt64;
+        }
+        if (other.HasUtf8String) {
+          Utf8String = other.Utf8String;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              EscapedBytes = input.ReadBytes();
+              break;
+            }
+            case 16: {
+              LargeUint32 = input.ReadUInt32();
+              break;
+            }
+            case 24: {
+              LargeUint64 = input.ReadUInt64();
+              break;
+            }
+            case 32: {
+              SmallInt32 = input.ReadInt32();
+              break;
+            }
+            case 40: {
+              SmallInt64 = input.ReadInt64();
+              break;
+            }
+            case 50: {
+              Utf8String = input.ReadString();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional bytes escaped_bytes = 1 [default = "\000\001\007\010\014\n\r\t\013\\\'\"\376"];
+      public bool HasEscapedBytes {
+        get { return result.HasEscapedBytes; }
+      }
+      public pb::ByteString EscapedBytes {
+        get { return result.EscapedBytes; }
+        set { SetEscapedBytes(value); }
+      }
+      public Builder SetEscapedBytes(pb::ByteString value) {
+        result.hasEscapedBytes = true;
+        result.escapedBytes_ = value;
+        return this;
+      }
+      public Builder ClearEscapedBytes() {
+        result.hasEscapedBytes = false;
+        result.escapedBytes_ = ((pb::ByteString) self::TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue);
+        return this;
+      }
+      
+      // optional uint32 large_uint32 = 2 [default = 4294967295];
+      public bool HasLargeUint32 {
+        get { return result.HasLargeUint32; }
+      }
+      public uint LargeUint32 {
+        get { return result.LargeUint32; }
+        set { SetLargeUint32(value); }
+      }
+      public Builder SetLargeUint32(uint value) {
+        result.hasLargeUint32 = true;
+        result.largeUint32_ = value;
+        return this;
+      }
+      public Builder ClearLargeUint32() {
+        result.hasLargeUint32 = false;
+        result.largeUint32_ = 4294967295;
+        return this;
+      }
+      
+      // optional uint64 large_uint64 = 3 [default = 18446744073709551615];
+      public bool HasLargeUint64 {
+        get { return result.HasLargeUint64; }
+      }
+      public ulong LargeUint64 {
+        get { return result.LargeUint64; }
+        set { SetLargeUint64(value); }
+      }
+      public Builder SetLargeUint64(ulong value) {
+        result.hasLargeUint64 = true;
+        result.largeUint64_ = value;
+        return this;
+      }
+      public Builder ClearLargeUint64() {
+        result.hasLargeUint64 = false;
+        result.largeUint64_ = 18446744073709551615UL;
+        return this;
+      }
+      
+      // optional int32 small_int32 = 4 [default = -2147483647];
+      public bool HasSmallInt32 {
+        get { return result.HasSmallInt32; }
+      }
+      public int SmallInt32 {
+        get { return result.SmallInt32; }
+        set { SetSmallInt32(value); }
+      }
+      public Builder SetSmallInt32(int value) {
+        result.hasSmallInt32 = true;
+        result.smallInt32_ = value;
+        return this;
+      }
+      public Builder ClearSmallInt32() {
+        result.hasSmallInt32 = false;
+        result.smallInt32_ = -2147483647;
+        return this;
+      }
+      
+      // optional int64 small_int64 = 5 [default = -9223372036854775807];
+      public bool HasSmallInt64 {
+        get { return result.HasSmallInt64; }
+      }
+      public long SmallInt64 {
+        get { return result.SmallInt64; }
+        set { SetSmallInt64(value); }
+      }
+      public Builder SetSmallInt64(long value) {
+        result.hasSmallInt64 = true;
+        result.smallInt64_ = value;
+        return this;
+      }
+      public Builder ClearSmallInt64() {
+        result.hasSmallInt64 = false;
+        result.smallInt64_ = -9223372036854775807L;
+        return this;
+      }
+      
+      // optional string utf8_string = 6 [default = "\341\210\264"];
+      public bool HasUtf8String {
+        get { return result.HasUtf8String; }
+      }
+      public string Utf8String {
+        get { return result.Utf8String; }
+        set { SetUtf8String(value); }
+      }
+      public Builder SetUtf8String(string value) {
+        result.hasUtf8String = true;
+        result.utf8String_ = value;
+        return this;
+      }
+      public Builder ClearUtf8String() {
+        result.hasUtf8String = false;
+        result.utf8String_ = ((string) self::TestExtremeDefaultValues.Descriptor.Fields[5].DefaultValue);
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class FooRequest : pb::GeneratedMessage<FooRequest, FooRequest.Builder> {
+    // Use FooRequest.CreateBuilder() to construct.
+    private FooRequest() {}
+    
+    private static readonly FooRequest defaultInstance = new FooRequest();
+    public static FooRequest DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override FooRequest DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::FooRequest ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::FooRequest parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::FooRequest> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::FooRequest prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::FooRequest, Builder> {
+      // Construct using self::FooRequest.CreateBuilder()
+      internal Builder() {}
+      
+      self::FooRequest result = new self::FooRequest();
+      
+      protected override self::FooRequest MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::FooRequest> Clear() {
+        result = new self::FooRequest();
+        return this;
+      }
+      
+      public override IBuilder<self::FooRequest> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::FooRequest.Descriptor; }
+      }
+      
+      public override self::FooRequest DefaultInstanceForType {
+        get { return self::FooRequest.DefaultInstance; }
+      }
+      
+      public override self::FooRequest BuildPartial() {
+        self::FooRequest returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::FooRequest) {
+          return MergeFrom((self::FooRequest) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::FooRequest> MergeFrom(self::FooRequest other) {
+        if (other == self::FooRequest.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::FooRequest> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::FooRequest> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class FooResponse : pb::GeneratedMessage<FooResponse, FooResponse.Builder> {
+    // Use FooResponse.CreateBuilder() to construct.
+    private FooResponse() {}
+    
+    private static readonly FooResponse defaultInstance = new FooResponse();
+    public static FooResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override FooResponse DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::FooResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::FooResponse parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::FooResponse> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::FooResponse prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::FooResponse, Builder> {
+      // Construct using self::FooResponse.CreateBuilder()
+      internal Builder() {}
+      
+      self::FooResponse result = new self::FooResponse();
+      
+      protected override self::FooResponse MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::FooResponse> Clear() {
+        result = new self::FooResponse();
+        return this;
+      }
+      
+      public override IBuilder<self::FooResponse> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::FooResponse.Descriptor; }
+      }
+      
+      public override self::FooResponse DefaultInstanceForType {
+        get { return self::FooResponse.DefaultInstance; }
+      }
+      
+      public override self::FooResponse BuildPartial() {
+        self::FooResponse returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::FooResponse) {
+          return MergeFrom((self::FooResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::FooResponse> MergeFrom(self::FooResponse other) {
+        if (other == self::FooResponse.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::FooResponse> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::FooResponse> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class BarRequest : pb::GeneratedMessage<BarRequest, BarRequest.Builder> {
+    // Use BarRequest.CreateBuilder() to construct.
+    private BarRequest() {}
+    
+    private static readonly BarRequest defaultInstance = new BarRequest();
+    public static BarRequest DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override BarRequest DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::BarRequest ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::BarRequest parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::BarRequest> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::BarRequest prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::BarRequest, Builder> {
+      // Construct using self::BarRequest.CreateBuilder()
+      internal Builder() {}
+      
+      self::BarRequest result = new self::BarRequest();
+      
+      protected override self::BarRequest MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::BarRequest> Clear() {
+        result = new self::BarRequest();
+        return this;
+      }
+      
+      public override IBuilder<self::BarRequest> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::BarRequest.Descriptor; }
+      }
+      
+      public override self::BarRequest DefaultInstanceForType {
+        get { return self::BarRequest.DefaultInstance; }
+      }
+      
+      public override self::BarRequest BuildPartial() {
+        self::BarRequest returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::BarRequest) {
+          return MergeFrom((self::BarRequest) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::BarRequest> MergeFrom(self::BarRequest other) {
+        if (other == self::BarRequest.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::BarRequest> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::BarRequest> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class BarResponse : pb::GeneratedMessage<BarResponse, BarResponse.Builder> {
+    // Use BarResponse.CreateBuilder() to construct.
+    private BarResponse() {}
+    
+    private static readonly BarResponse defaultInstance = new BarResponse();
+    public static BarResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override BarResponse DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::BarResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::BarResponse parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::BarResponse> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::BarResponse prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::BarResponse, Builder> {
+      // Construct using self::BarResponse.CreateBuilder()
+      internal Builder() {}
+      
+      self::BarResponse result = new self::BarResponse();
+      
+      protected override self::BarResponse MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::BarResponse> Clear() {
+        result = new self::BarResponse();
+        return this;
+      }
+      
+      public override IBuilder<self::BarResponse> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::BarResponse.Descriptor; }
+      }
+      
+      public override self::BarResponse DefaultInstanceForType {
+        get { return self::BarResponse.DefaultInstance; }
+      }
+      
+      public override self::BarResponse BuildPartial() {
+        self::BarResponse returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::BarResponse) {
+          return MergeFrom((self::BarResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::BarResponse> MergeFrom(self::BarResponse other) {
+        if (other == self::BarResponse.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::BarResponse> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::BarResponse> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  public abstract class TestService : pb::IService {
+    public abstract void Foo(
+        pb::IRpcController controller,
+        self::FooRequest request,
+        global::System.Action<self::FooResponse> done);
+    public abstract void Bar(
+        pb::IRpcController controller,
+        self::BarRequest request,
+        global::System.Action<self::BarResponse> done);
+    
+    public static pbd::ServiceDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.Descriptor.Services[0]; }
+    }
+    public pbd::ServiceDescriptor DescriptorForType {
+      get { return Descriptor; }
+    }
+    
+    public void CallMethod(
+        pbd::MethodDescriptor method,
+        pb::IRpcController controller,
+        pb::IMessage request,
+        global::System.Action<pb::IMessage> done) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+          "Service.CallMethod() given method descriptor for wrong " +
+          "service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          this.Foo(controller, (self::FooRequest)request,
+            pb::RpcUtil.SpecializeCallback<self::FooResponse>(
+              done));
+          return;
+        case 1:
+          this.Bar(controller, (self::BarRequest)request,
+            pb::RpcUtil.SpecializeCallback<self::BarResponse>(
+              done));
+          return;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+          "Service.GetRequestPrototype() given method " +
+          "descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return self::FooRequest.DefaultInstance;
+        case 1:
+          return self::BarRequest.DefaultInstance;
+        default:
+          throw new global::System.ArgumentException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+          "Service.GetResponsePrototype() given method " +
+          "descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return self::FooResponse.DefaultInstance;
+        case 1:
+          return self::BarResponse.DefaultInstance;
+        default:
+          throw new global::System.ArgumentException("Can't get here.");
+      }
+    }
+    
+    public static Stub CreateStub(
+        pb::IRpcChannel channel) {
+      return new Stub(channel);
+    }
+    
+    public class Stub : self::TestService {
+      internal Stub(pb::IRpcChannel channel) {
+        this.channel = channel;
+      }
+      
+      private readonly pb::IRpcChannel channel;
+      
+      public pb::IRpcChannel Channel {
+        get { return channel; }
+      }
+      
+      public override void Foo(
+          pb::IRpcController controller,
+          self::FooRequest request,
+          global::System.Action<self::FooResponse> done) {
+        channel.CallMethod(
+          Descriptor.Methods[0],
+          controller,
+          request,
+          self::FooResponse.DefaultInstance,
+          pb::RpcUtil.GeneralizeCallback(done, self::FooResponse.DefaultInstance));
+      }
+      
+      public override void Bar(
+          pb::IRpcController controller,
+          self::BarRequest request,
+          global::System.Action<self::BarResponse> done) {
+        channel.CallMethod(
+          Descriptor.Methods[1],
+          controller,
+          request,
+          self::BarResponse.DefaultInstance,
+          pb::RpcUtil.GeneralizeCallback(done, self::BarResponse.DefaultInstance));
+      }
+    }
+  }
+  
+  #endregion
+}

+ 32 - 0
csharp/ProtocolBuffers.Test/TestUtil.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+
+namespace Google.ProtocolBuffers {
+  internal static class TestUtil {
+
+    private static DirectoryInfo testDataDirectory;
+
+    internal static DirectoryInfo TestDataDirectory {
+      get {
+        if (testDataDirectory != null) {
+          return testDataDirectory;
+        }
+
+        DirectoryInfo ancestor = new DirectoryInfo(".");
+        // Search each parent directory looking for "src/google/protobuf".
+        while (ancestor != null) {
+          string candidate = Path.Combine(ancestor.FullName, "src/google/protobuf");
+          if (Directory.Exists(candidate)) {
+            testDataDirectory = new DirectoryInfo(candidate);
+            return testDataDirectory;
+          }
+          ancestor = ancestor.Parent;
+        }
+        // TODO(jonskeet): Come up with a better exception to throw
+        throw new Exception("Unable to find directory containing test files");
+      }
+    }
+  }
+}

+ 5 - 3
csharp/ProtocolBuffers/CodedInputStream.cs

@@ -142,6 +142,7 @@ namespace Google.ProtocolBuffers {
     /// Read a double field from the stream.
     /// </summary>
     public double ReadDouble() {
+      // TODO(jonskeet): Test this on different endiannesses
       return BitConverter.Int64BitsToDouble((long) ReadRawLittleEndian64());
     }
 
@@ -149,9 +150,10 @@ namespace Google.ProtocolBuffers {
     /// Read a float field from the stream.
     /// </summary>
     public float ReadFloat() {
-      //return Float.intBitsToFloat(readRawLittleEndian32());
-      // FIXME implement!
-      throw new NotImplementedException();
+      // TODO(jonskeet): Test this on different endiannesses
+      uint raw = ReadRawLittleEndian32();
+      byte[] rawBytes = BitConverter.GetBytes(raw);
+      return BitConverter.ToSingle(rawBytes, 0);
     }
 
     /// <summary>

+ 9 - 6
csharp/ProtocolBuffers/CodedOutputStream.cs

@@ -98,6 +98,7 @@ namespace Google.ProtocolBuffers {
     /// Writes a double field value, including tag, to the stream.
     /// </summary>
     public void WriteDouble(int fieldNumber, double value) {
+      // TODO(jonskeet): Test this on different endiannesses
       WriteTag(fieldNumber, WireFormat.WireType.Fixed64);
       WriteRawLittleEndian64((ulong)BitConverter.DoubleToInt64Bits(value));
     }
@@ -107,8 +108,10 @@ namespace Google.ProtocolBuffers {
     /// </summary>
     public void WriteFloat(int fieldNumber, float value) {
       WriteTag(fieldNumber, WireFormat.WireType.Fixed32);
-      // FIXME: How do we convert a single to 32 bits? (Without unsafe code)
-      //WriteRawLittleEndian32(BitConverter.SingleT(value));
+      // TODO(jonskeet): Test this on different endiannesses
+      byte[] rawBytes = BitConverter.GetBytes(value);
+      uint asInteger = BitConverter.ToUInt32(rawBytes, 0);
+      WriteRawLittleEndian32(asInteger);
     }
 
     /// <summary>
@@ -434,7 +437,7 @@ namespace Google.ProtocolBuffers {
     /// Compute the number of bytes that would be needed to encode a
     /// fixed64 field, including the tag.
     /// </summary>
-    public static int ComputeFixed64Size(int fieldNumber, long value) {
+    public static int ComputeFixed64Size(int fieldNumber, ulong value) {
       return ComputeTagSize(fieldNumber) + LittleEndian64Size;
     }
 
@@ -442,7 +445,7 @@ namespace Google.ProtocolBuffers {
     /// Compute the number of bytes that would be needed to encode a
     /// fixed32 field, including the tag.
     /// </summary>
-    public static int ComputeFixed32Size(int fieldNumber, int value) {
+    public static int ComputeFixed32Size(int fieldNumber, uint value) {
       return ComputeTagSize(fieldNumber) + LittleEndian32Size;
     }
 
@@ -625,8 +628,8 @@ namespace Google.ProtocolBuffers {
         case FieldType.Int64: return ComputeInt64Size(fieldNumber, (long)value);
         case FieldType.UInt64: return ComputeUInt64Size(fieldNumber, (ulong)value);
         case FieldType.Int32: return ComputeInt32Size(fieldNumber, (int)value);
-        case FieldType.Fixed64: return ComputeFixed64Size(fieldNumber, (long)value);
-        case FieldType.Fixed32: return ComputeFixed32Size(fieldNumber, (int)value);
+        case FieldType.Fixed64: return ComputeFixed64Size(fieldNumber, (ulong)value);
+        case FieldType.Fixed32: return ComputeFixed32Size(fieldNumber, (uint)value);
         case FieldType.Bool: return ComputeBoolSize(fieldNumber, (bool)value);
         case FieldType.String: return ComputeStringSize(fieldNumber, (string)value);
         case FieldType.Group: return ComputeGroupSize(fieldNumber, (IMessage)value);

+ 156 - 181
csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs

@@ -16,152 +16,152 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
     }
     private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
         new byte[] {
-            0x0a, 0x24, 0x73, 0x72, 0x63, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
-            0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 
-            0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x22, 0xdc, 0x02, 0x0a, 0x13, 
-            0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
-            0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0f, 0x0a, 0x07, 0x70, 0x61, 0x63, 
-            0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x12, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 
-            0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x12, 0x36, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 
-            0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 
-            0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 
-            0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 
-            0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
-            0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
-            0x6f, 0x74, 0x6f, 0x12, 0x38, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 
-            0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 
-            0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 
-            0x6f, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 
-            0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 
-            0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
-            0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 
-            0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 
-            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa9, 0x03, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 
-            0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 
-            0x12, 0x34, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 
-            0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 
-            0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 
-            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 
-            0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 
-            0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x35, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 
-            0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 
-            0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 
-            0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 
-            0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
-            0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 
-            0x72, 0x6f, 0x74, 0x6f, 0x12, 0x48, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 
-            0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 
-            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
-            0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 
-            0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 
-            0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 
-            0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2c, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
-            0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 
-            0x05, 0x12, 0x0b, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x22, 0x94, 0x05, 0x0a, 0x14, 0x46, 
-            0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
-            0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0e, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 
-            0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x12, 0x3a, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 
-            0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
-            0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
-            0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 
-            0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
-            0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 
-            0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 
-            0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x12, 0x10, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 
-            0x20, 0x01, 0x28, 0x09, 0x12, 0x15, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 
-            0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 
-            0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
-            0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x02, 0x0a, 0x04, 
-            0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 
-            0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 
-            0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 
-            0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 
-            0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 
-            0x36, 0x34, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 
-            0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 
-            0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 
-            0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 
-            0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 
-            0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 
-            0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 
-            0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x14, 0x12, 0x11, 0x0a, 0x0d, 0x54, 
-            0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 
-            0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 
-            0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 
-            0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 
-            0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 
-            0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0x8c, 0x01, 
-            0x0a, 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 
-            0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x38, 0x0a, 0x05, 0x76, 
-            0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
-            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 
-            0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 
-            0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
-            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 
-            0x22, 0x6c, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 
-            0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 
-            0x28, 0x09, 0x12, 0x0e, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x12, 0x32, 
-            0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 
-            0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 
-            0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 
-            0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 
-            0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x36, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 
-            0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 
-            0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 
-            0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 
-            0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
-            0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, 0x0a, 
-            0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 
-            0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x12, 0x0a, 0x0a, 
-            0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x13, 0x0a, 0x0b, 
-            0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x12, 0x2f, 0x0a, 
-            0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 
-            0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 
-            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x88, 0x03, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 
-            0x6e, 0x73, 0x12, 0x14, 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 
-            0x20, 0x01, 0x28, 0x09, 0x12, 0x1c, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 
-            0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x12, 0x22, 0x0a, 0x13, 0x6a, 0x61, 
-            0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 
-            0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 
-            0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 
+            0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 
+            0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x67, 0x6f, 0x6f, 0x67, 
+            0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x22, 0xdc, 0x02, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 
+            0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 
+            0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0f, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 
+            0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x12, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 
+            0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x12, 0x36, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 
+            0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 
+            0x74, 0x6f, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 
+            0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 
+            0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
+            0x38, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 
+            0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 
+            0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x38, 0x0a, 
+            0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 
+            0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 
+            0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 
             0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 
-            0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x09, 0x43, 0x4f, 0x44, 
-            0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x12, 0x19, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 
-            0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x09, 0x12, 0x1e, 0x0a, 0x15, 0x63, 0x73, 0x68, 
-            0x61, 0x72, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe9, 
-            0x07, 0x20, 0x01, 0x28, 0x09, 0x12, 0x25, 0x0a, 0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 
-            0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 
-            0x61, 0x6c, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x13, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x5f, 
-            0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 
-            0x65, 0x12, 0x24, 0x0a, 0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x63, 
-            0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x22, 
-            0x28, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 
-            0x50, 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 
-            0x02, 0x22, 0x38, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 
-            0x26, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 
-            0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 
-            0x85, 0x01, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x05, 
-            0x63, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
-            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 
-            0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 
-            0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x22, 0x23, 
-            0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 
-            0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x0d, 0x0a, 0x0b, 0x45, 
-            0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 
-            0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x10, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 
-            0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 
-            0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x72, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
-            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 
-            0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0xc2, 0x3e, 0x27, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 
-            0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 
-            0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x13, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 
-            0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0xd0, 0x3e, 0x00, 0xd8, 0x3e, 0x00, 0xe0, 0x3e, 
-            0x01, 
+            0x6e, 0x73, 0x22, 0xa9, 0x03, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 
+            0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x34, 0x0a, 0x05, 
+            0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 
+            0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 
+            0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x35, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 
+            0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
+            0x6f, 0x74, 0x6f, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 
+            0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 
+            0x12, 0x48, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 
+            0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
+            0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2c, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 
+            0x67, 0x65, 0x12, 0x0d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0b, 0x0a, 
+            0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x22, 0x94, 0x05, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 
+            0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 
+            0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0e, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 
+            0x03, 0x20, 0x01, 0x28, 0x05, 0x12, 0x3a, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 
+            0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 
+            0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 
+            0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 
+            0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 
+            0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 
+            0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 
+            0x28, 0x09, 0x12, 0x10, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 
+            0x12, 0x15, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 
+            0x01, 0x28, 0x09, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 
+            0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 
+            0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 
+            0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 
+            0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 
+            0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 
+            0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x33, 0x32, 
+            0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, 
+            0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 
+            0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 
+            0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 
+            0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 
+            0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 
+            0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 
+            0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 
+            0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 
+            0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 
+            0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 
+            0x36, 0x34, 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 
+            0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 
+            0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 
+            0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0x8c, 0x01, 0x0a, 0x13, 0x45, 0x6e, 
+            0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 
+            0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 
+            0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 
+            0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 
+            0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6c, 0x0a, 0x18, 
+            0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 
+            0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0e, 
+            0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x12, 0x32, 0x0a, 0x07, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 
+            0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 
+            0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x36, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 
+            0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
+            0x6f, 0x74, 0x6f, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 
+            0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 
+            0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, 0x0a, 0x15, 0x4d, 0x65, 0x74, 
+            0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 
+            0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x12, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 
+            0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x13, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 
+            0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 
+            0x6e, 0x73, 0x22, 0x88, 0x03, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 
+            0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 
+            0x12, 0x1c, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 
+            0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x12, 0x22, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 
+            0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 
+            0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 
+            0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 
+            0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 
+            0x5a, 0x45, 0x12, 0x19, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 
+            0x63, 0x65, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x09, 0x12, 0x1e, 0x0a, 0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 
+            0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 
+            0x09, 0x12, 0x25, 0x0a, 0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 
+            0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 
+            0x12, 0x23, 0x0a, 0x13, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 
+            0x73, 0x65, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x12, 0x24, 0x0a, 
+            0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 
+            0x65, 0x73, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x4f, 
+            0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 
+            0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x22, 0x38, 0x0a, 
+            0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x17, 0x6d, 
+            0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 
+            0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0c, 
+            0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x63, 0x74, 0x79, 0x70, 
+            0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 
+            0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 
+            0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x22, 0x23, 0x0a, 0x05, 0x43, 0x54, 
+            0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 
+            0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x0d, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x10, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 
+            0x73, 0x42, 0x72, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 
+            0x6f, 0x73, 0x48, 0x01, 0xc2, 0x3e, 0x27, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 
+            0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 
+            0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x13, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 
+            0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0xd0, 0x3e, 0x00, 0xd8, 0x3e, 0x00, 0xe0, 0x3e, 0x01, 
         }, new pbd::FileDescriptor[] {
         });
     #endregion
     
     #region Extensions
+    /**/
     #endregion
     
     #region Static variables
@@ -295,7 +295,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FileDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FileDescriptorProto__FieldAccessorTable; }
     }
     
@@ -973,7 +973,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto__FieldAccessorTable; }
     }
     
@@ -996,7 +996,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
           get { return self::DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto_ExtensionRange__Descriptor; }
         }
         
-        protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
           get { return self::DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto_ExtensionRange__FieldAccessorTable; }
         }
         
@@ -1872,57 +1872,36 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FieldDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FieldDescriptorProto__FieldAccessorTable; }
     }
     
     #region Nested types
     public static class Types {
       public enum Type {
-        [pbd::EnumDescriptorIndex(0)]
         TYPE_DOUBLE = 1,
-        [pbd::EnumDescriptorIndex(1)]
         TYPE_FLOAT = 2,
-        [pbd::EnumDescriptorIndex(2)]
         TYPE_INT64 = 3,
-        [pbd::EnumDescriptorIndex(3)]
         TYPE_UINT64 = 4,
-        [pbd::EnumDescriptorIndex(4)]
         TYPE_INT32 = 5,
-        [pbd::EnumDescriptorIndex(5)]
         TYPE_FIXED64 = 6,
-        [pbd::EnumDescriptorIndex(6)]
         TYPE_FIXED32 = 7,
-        [pbd::EnumDescriptorIndex(7)]
         TYPE_BOOL = 8,
-        [pbd::EnumDescriptorIndex(8)]
         TYPE_STRING = 9,
-        [pbd::EnumDescriptorIndex(9)]
         TYPE_GROUP = 10,
-        [pbd::EnumDescriptorIndex(10)]
         TYPE_MESSAGE = 11,
-        [pbd::EnumDescriptorIndex(11)]
         TYPE_BYTES = 12,
-        [pbd::EnumDescriptorIndex(12)]
         TYPE_UINT32 = 13,
-        [pbd::EnumDescriptorIndex(13)]
         TYPE_ENUM = 14,
-        [pbd::EnumDescriptorIndex(14)]
-        TYPE_SFIXED32 = 20,
-        [pbd::EnumDescriptorIndex(15)]
+        TYPE_SFIXED32 = 15,
         TYPE_SFIXED64 = 16,
-        [pbd::EnumDescriptorIndex(16)]
         TYPE_SINT32 = 17,
-        [pbd::EnumDescriptorIndex(17)]
         TYPE_SINT64 = 18,
       }
       
       public enum Label {
-        [pbd::EnumDescriptorIndex(0)]
         LABEL_OPTIONAL = 1,
-        [pbd::EnumDescriptorIndex(1)]
         LABEL_REQUIRED = 2,
-        [pbd::EnumDescriptorIndex(2)]
         LABEL_REPEATED = 3,
       }
       
@@ -2450,7 +2429,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumDescriptorProto__FieldAccessorTable; }
     }
     
@@ -2792,7 +2771,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumValueDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumValueDescriptorProto__FieldAccessorTable; }
     }
     
@@ -3099,7 +3078,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_ServiceDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_ServiceDescriptorProto__FieldAccessorTable; }
     }
     
@@ -3441,7 +3420,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MethodDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MethodDescriptorProto__FieldAccessorTable; }
     }
     
@@ -3790,16 +3769,14 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FileOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FileOptions__FieldAccessorTable; }
     }
     
     #region Nested types
     public static class Types {
       public enum OptimizeMode {
-        [pbd::EnumDescriptorIndex(0)]
         SPEED = 1,
-        [pbd::EnumDescriptorIndex(1)]
         CODE_SIZE = 2,
       }
       
@@ -4344,7 +4321,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MessageOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MessageOptions__FieldAccessorTable; }
     }
     
@@ -4546,16 +4523,14 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FieldOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FieldOptions__FieldAccessorTable; }
     }
     
     #region Nested types
     public static class Types {
       public enum CType {
-        [pbd::EnumDescriptorIndex(0)]
         CORD = 1,
-        [pbd::EnumDescriptorIndex(1)]
         STRING_PIECE = 2,
       }
       
@@ -4806,7 +4781,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumOptions__FieldAccessorTable; }
     }
     
@@ -4966,7 +4941,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumValueOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumValueOptions__FieldAccessorTable; }
     }
     
@@ -5126,7 +5101,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_ServiceOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_ServiceOptions__FieldAccessorTable; }
     }
     
@@ -5286,7 +5261,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MethodOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MethodOptions__FieldAccessorTable; }
     }
     

+ 2 - 1
csharp/ProtocolBuffers/Descriptors/EnumDescriptorIndexAttribute.cs

@@ -3,9 +3,10 @@
 namespace Google.ProtocolBuffers.Descriptors {
   /// <summary>
   /// Allows enum values to express the index within their descriptor.
+  /// TODO(jonskeet): Consider removing this. I don't think we need it after all.
   /// </summary>
   [AttributeUsage(AttributeTargets.Field)]
-  internal class EnumDescriptorIndexAttribute : Attribute {
+  public class EnumDescriptorIndexAttribute : Attribute {
     readonly int index;
 
     internal int Index {

+ 11 - 0
csharp/ProtocolBuffers/DynamicMessage.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+  public class DynamicMessage {
+    internal static object GetDefaultInstance(Google.ProtocolBuffers.Descriptors.MessageDescriptor messageDescriptor) {
+      throw new NotImplementedException();
+    }
+  }
+}

+ 165 - 0
csharp/ProtocolBuffers/ExtendableMessage.cs

@@ -0,0 +1,165 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Google.ProtocolBuffers.Descriptors;
+using Google.ProtocolBuffers.Collections;
+
+namespace Google.ProtocolBuffers {
+  public abstract class ExtendableMessage<TMessage,TBuilder> : GeneratedMessage<TMessage,TBuilder>
+    where TMessage : GeneratedMessage<TMessage, TBuilder>
+    where TBuilder : IBuilder<TMessage> {
+
+    protected ExtendableMessage() {}
+    private readonly FieldSet extensions = FieldSet.CreateFieldSet();
+
+    /// <summary>
+    /// Checks if a singular extension is present.
+    /// </summary>
+    public bool HasExtension(GeneratedExtension<TMessage, TBuilder> extension) {
+      return extensions.HasField(extension.Descriptor);
+    }
+
+    /// <summary>
+    /// Returns the number of elements in a repeated extension.
+    /// </summary>
+    public int GetExtensionCount<TExtension>(GeneratedExtension<TMessage, IList<TExtension>> extension) {
+      return extensions.GetRepeatedFieldCount(extension.Descriptor);
+    }
+
+    /// <summary>
+    /// Returns the value of an extension.
+    /// </summary>
+    public TExtension GetExtension<TExtension>(GeneratedExtension<TMessage, TExtension> extension) {
+      object value = extensions[extension.Descriptor];
+      if (value == null) {
+        return (TExtension) extension.MessageDefaultInstance;
+      } else {
+        return (TExtension) extension.FromReflectionType(value);
+      }
+    }
+
+    /// <summary>
+    /// Returns one element of a repeated extension.
+    /// </summary>
+    public TExtension GetExtension<TExtension>(GeneratedExtension<TMessage, IList<TExtension>> extension, int index) {
+      return (TExtension) extension.SingularFromReflectionType(extensions[extension.Descriptor, index]);
+    }
+
+    /// <summary>
+    /// Called by subclasses to check if all extensions are initialized.
+    /// </summary>
+    protected bool ExtensionsAreInitialized {
+      get { return extensions.IsInitialized; }      
+    }
+
+    #region Reflection
+    public override IDictionary<FieldDescriptor, object> AllFields {
+      get {
+        IDictionary<FieldDescriptor, object> result = GetMutableFieldMap();
+        foreach(KeyValuePair<FieldDescriptor, object> entry in extensions.AllFields) {
+          result[entry.Key] = entry.Value;
+        }
+        return Dictionaries.AsReadOnly(result);
+      }
+    }
+
+    public override bool HasField(FieldDescriptor field) {
+      if (field.IsExtension) {
+        VerifyContainingType(field);
+        return extensions.HasField(field);
+      } else {
+        return base.HasField(field);
+      }
+    }
+
+    public override object this[FieldDescriptor field] {
+      get {
+        if (field.IsExtension) {
+          VerifyContainingType(field);
+          object value = extensions[field];
+          if (value == null) {
+            // Lacking an ExtensionRegistry, we have no way to determine the
+            // extension's real type, so we return a DynamicMessage.
+            // TODO(jonskeet): Work out what this means
+            return DynamicMessage.GetDefaultInstance(field.MessageType);
+          } else {
+            return value;
+          }
+        } else {
+          return base[field];
+        }
+      }
+    }
+
+    public override int GetRepeatedFieldCount(FieldDescriptor field) {
+      if (field.IsExtension) {
+        VerifyContainingType(field);
+        return extensions.GetRepeatedFieldCount(field);
+      } else {
+        return base.GetRepeatedFieldCount(field);
+      }
+    }
+
+    public override object this[FieldDescriptor field, int index] {
+      get {
+        if (field.IsExtension) {
+          VerifyContainingType(field);
+          return extensions[field, index];
+        } else {
+          return base[field, index];
+        }
+      }
+    }
+  
+    private void VerifyContainingType(FieldDescriptor field) {
+      if (field.ContainingType != DescriptorForType) {
+        throw new ArgumentException("FieldDescriptor does not match message type.");
+      }
+    }
+    #endregion
+
+    /// <summary>
+    /// Used by subclasses to serialize extensions. Extension ranges may be
+    /// interleaves with field numbers, but we must write them in canonical
+    /// (sorted by field number) order. This class helps us to write individual
+    /// ranges of extensions at once.
+    /// 
+    /// TODO(jonskeet): See if we can improve this in terms of readability.
+    /// </summary>
+    protected class ExtensionWriter {
+      readonly IEnumerator<KeyValuePair<FieldDescriptor, object>> iterator;
+      readonly FieldSet extensions;
+      KeyValuePair<FieldDescriptor, object>? next = null;
+
+      internal ExtensionWriter(ExtendableMessage<TMessage, TBuilder> message) {
+        extensions = message.extensions;
+        iterator = message.extensions.GetEnumerator();
+        if (iterator.MoveNext()) {
+          next = iterator.Current;
+        }
+      }
+
+      public void WriteUntil(int end, CodedOutputStream output) {
+        while (next != null && next.Value.Key.FieldNumber < end) {
+          extensions.WriteField(next.Value.Key, next.Value.Value, output);
+          if (iterator.MoveNext()) {
+            next = iterator.Current;
+          } else {
+            next = null;
+          }
+        }
+      }
+    }
+
+    protected ExtensionWriter CreateExtensionWriter(ExtendableMessage<TMessage, TBuilder> message) {
+      return new ExtensionWriter(message);
+    }
+
+    /// <summary>
+    /// Called by subclasses to compute the size of extensions.
+    /// </summary>
+    protected int ExtensionsSerializedSize {
+      get { return extensions.SerializedSize; }
+    }
+  }
+}

+ 11 - 0
csharp/ProtocolBuffers/FieldSet.cs

@@ -30,6 +30,10 @@ namespace Google.ProtocolBuffers {
       this.fields = fields;
     }
 
+    public static FieldSet CreateFieldSet() {
+      return new FieldSet(new Dictionary<FieldDescriptor, object>());
+    }
+
     /// <summary>
     /// Makes this FieldSet immutable, and returns it for convenience. Any
     /// mutable repeated fields are made immutable, as well as the map itself.
@@ -395,6 +399,13 @@ namespace Google.ProtocolBuffers {
       ((IList<object>) list).Add(value);
     }
 
+    /// <summary>
+    /// Returns an enumerator for the field map. Used to write the fields out.
+    /// </summary>
+    internal IEnumerator<KeyValuePair<FieldDescriptor, object>> GetEnumerator() {
+      return fields.GetEnumerator();
+    }
+
     /// <summary>
     /// See <see cref="IMessage.IsInitialized" />
     /// </summary>

+ 14 - 3
csharp/ProtocolBuffers/GeneratedBuilder.cs

@@ -23,7 +23,7 @@ namespace Google.ProtocolBuffers {
     protected abstract TMessage MessageBeingBuilt { get; }
 
     protected internal FieldAccessorTable InternalFieldAccessors {
-      get { return MessageBeingBuilt.InternalFieldAccessors; }
+      get { return MessageBeingBuilt.FieldAccesseorsFromBuilder; }
     }
 
     public override bool Initialized {
@@ -190,6 +190,16 @@ namespace Google.ProtocolBuffers {
       return this;
     }
 
+    public virtual IBuilder<TMessage> MergeFrom(CodedInputStream input) {
+      ((IBuilder)this).MergeFrom(input);
+      return this;
+    }
+
+    public virtual IBuilder<TMessage> MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) {
+      ((IBuilder)this).MergeFrom(input, extensionRegistry);
+      return this;
+    }
+    
     /// <summary>
     /// Like Build(), but will wrap UninitializedMessageException in
     /// InvalidProtocolBufferException.
@@ -217,7 +227,8 @@ namespace Google.ProtocolBuffers {
     public abstract IBuilder<TMessage> Clone();
     public abstract new IBuilder<TMessage> Clear();
     public abstract TMessage DefaultInstanceForType { get; }
-    public abstract IBuilder<TMessage> MergeFrom(CodedInputStream input);
-    public abstract IBuilder<TMessage> MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry);
+    
+    public abstract class ExtendableBuilder : GeneratedBuilder<TMessage, TBuilder> {
+    }
   }
 }

+ 68 - 2
csharp/ProtocolBuffers/GeneratedExtension.cs

@@ -1,7 +1,29 @@
 using Google.ProtocolBuffers.Descriptors;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
 
 namespace Google.ProtocolBuffers {
 
+  public static class GeneratedExtension {
+
+    public static GeneratedExtension<TContainer, TExtension> CreateExtension<TContainer, TExtension>(FieldDescriptor descriptor)
+        where TContainer : IMessage<TContainer> {
+      if (descriptor.IsRepeated) {
+        throw new ArgumentException("Must call CreateRepeatedGeneratedExtension() for repeated types.");
+      }
+      return new GeneratedExtension<TContainer, TExtension>(descriptor);
+    }
+
+    public static GeneratedExtension<TContainer, IList<TExtension>> CreateRepeatedExtension<TContainer, TExtension>(FieldDescriptor descriptor) 
+        where TContainer : IMessage<TContainer> {
+      if (descriptor.IsRepeated) {
+        throw new ArgumentException("Must call CreateRepeatedGeneratedExtension() for repeated types.");
+      }
+      return new GeneratedExtension<TContainer, IList<TExtension>>(descriptor);
+    }
+  }
+
   /// <summary>
   /// Base class for all generated extensions.
   /// </summary>
@@ -24,8 +46,52 @@ namespace Google.ProtocolBuffers {
   /// in ExtendableMessage and ExtendableBuilder.
   /// </remarks>
   public class GeneratedExtension<TContainer, TExtension> where TContainer : IMessage<TContainer> {
-    public FieldDescriptor Descriptor;
+    private readonly IMessage messageDefaultInstance;
+    private readonly FieldDescriptor descriptor;
+
+    internal GeneratedExtension(FieldDescriptor descriptor) {
+      if (!descriptor.IsExtension) {
+        throw new ArgumentException("GeneratedExtension given a regular (non-extension) field.");
+      }
+
+      this.descriptor = descriptor;
+
+      switch (descriptor.MappedType) {
+        case MappedType.Message:
+          PropertyInfo defaultInstanceProperty = typeof(TExtension)
+              .GetProperty("DefaultInstance", BindingFlags.Static | BindingFlags.Public);
+          if (defaultInstanceProperty == null) {
+            throw new ArgumentException("No public static DefaultInstance property for type " + typeof(TExtension).Name);
+          }
+          messageDefaultInstance = (IMessage) defaultInstanceProperty.GetValue(null, null);
+          break;
+        case MappedType.Enum:
+          // FIXME(jonskeet): May not need this
+          //enumValueOf = getMethodOrDie(type, "valueOf",
+            //                           EnumValueDescriptor.class);
+          //enumGetValueDescriptor = getMethodOrDie(type, "getValueDescriptor");
+          messageDefaultInstance = null;
+          break;
+        default:
+          messageDefaultInstance = null;
+          break;
+      }
+    }
+
+    public FieldDescriptor Descriptor {
+      get { return descriptor; }
+    }
+
+    public IMessage MessageDefaultInstance {
+      get { return messageDefaultInstance; }
+    }
+
+    internal object SingularFromReflectionType(object p) {
+      throw new System.NotImplementedException();
+    }
 
-    public IMessage MessageDefaultInstance;
+    internal object FromReflectionType(object value) {
+      throw new System.NotImplementedException();
+    }
   }
 }

+ 9 - 4
csharp/ProtocolBuffers/GeneratedMessage.cs

@@ -14,11 +14,16 @@ namespace Google.ProtocolBuffers {
   /// can ignore this class as an implementation detail.
   /// </summary>
   public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage, IMessage<TMessage>
-      where TMessage : GeneratedMessage<TMessage, TBuilder> where TBuilder : IBuilder<TMessage> {
+      where TMessage : GeneratedMessage<TMessage, TBuilder> 
+      where TBuilder : IBuilder<TMessage> {
 
     private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
 
-    protected internal abstract FieldAccessorTable InternalFieldAccessors { get; }
+    internal FieldAccessorTable FieldAccesseorsFromBuilder {
+      get { return InternalFieldAccessors; }
+    }
+
+    protected abstract FieldAccessorTable InternalFieldAccessors { get; }
 
     public override MessageDescriptor DescriptorForType {
       get { return InternalFieldAccessors.Descriptor; }
@@ -36,7 +41,7 @@ namespace Google.ProtocolBuffers {
 
     public abstract IBuilder<TMessage> CreateBuilderForType();
 
-    private IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
+    internal IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
 
       // Use a SortedList so we'll end up serializing fields in order
       var ret = new SortedList<FieldDescriptor, object>();
@@ -83,6 +88,6 @@ namespace Google.ProtocolBuffers {
     /// </summary>
     internal void SetUnknownFields(UnknownFieldSet fieldSet) {
       unknownFields = fieldSet;
-    }
+    }    
   }
 }

+ 14 - 0
csharp/ProtocolBuffers/IRpcChannel.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers {
+  /// <summary>
+  /// TODO(jonskeet): Do this properly.
+  /// </summary>
+  public interface IRpcChannel {
+    void CallMethod<T>(MethodDescriptor method, IRpcController controller,
+        IMessage request, IMessage responsePrototype, Action<T> done);
+  }
+}

+ 8 - 0
csharp/ProtocolBuffers/IRpcController.cs

@@ -0,0 +1,8 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+  public interface IRpcController {
+  }
+}

+ 9 - 0
csharp/ProtocolBuffers/IService.cs

@@ -0,0 +1,9 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+  public interface IService {
+    // TODO(jonskeet): Fill this in
+  }
+}

+ 6 - 0
csharp/ProtocolBuffers/ProtocolBuffers.csproj

@@ -67,6 +67,8 @@
     <Compile Include="Descriptors\MethodDescriptor.cs" />
     <Compile Include="Descriptors\PackageDescriptor.cs" />
     <Compile Include="Descriptors\ServiceDescriptor.cs" />
+    <Compile Include="DynamicMessage.cs" />
+    <Compile Include="ExtendableMessage.cs" />
     <Compile Include="ExtensionInfo.cs" />
     <Compile Include="ExtensionRegistry.cs" />
     <Compile Include="FieldAccess\SingleEnumAccessor.cs" />
@@ -85,7 +87,11 @@
     <Compile Include="IBuilder.cs" />
     <Compile Include="IMessage.cs" />
     <Compile Include="InvalidProtocolBufferException.cs" />
+    <Compile Include="IRpcChannel.cs" />
+    <Compile Include="IRpcController.cs" />
+    <Compile Include="IService.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RpcUtil.cs" />
     <Compile Include="TextFormat.cs" />
     <Compile Include="TextGenerator.cs" />
     <Compile Include="UninitializedMessageException.cs" />

+ 35 - 0
csharp/ProtocolBuffers/RpcUtil.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+  public static class RpcUtil {
+
+    /// <summary>
+    /// Converts an Action[IMessage] to an Action[T].
+    /// </summary>
+    public static Action<T> SpecializeCallback<T>(Action<IMessage> action) 
+        where T : IMessage<T> {
+      return message => action(message);
+    }
+
+    /// <summary>
+    /// Converts an Action[T] to an Action[IMessage].
+    /// The generalized action will accept any message object which has
+    /// the same descriptor, and will convert it to the correct class
+    /// before calling the original action. However, if the generalized
+    /// callback is given a message with a different descriptor, an
+    /// exception will be thrown.
+    /// </summary>
+    public static Action<IMessage> GeneralizeCallback<T>(Action<T> action, T defaultInstance)
+        where T : class, IMessage<T> {
+      return message => {
+        T castMessage = message as T;
+        if (castMessage == null) {
+          castMessage = (T) defaultInstance.CreateBuilderForType().MergeFrom(message).Build();
+        }
+        action(castMessage);
+      };
+    }
+  }
+}

+ 5 - 13
csharp/ProtocolBuffers/TextFormat.cs

@@ -155,25 +155,18 @@ namespace Google.ProtocolBuffers {
         UnknownField field = entry.Value;
 
         foreach (ulong value in field.VarintList) {
-          generator.Print(entry.Key.ToString());
-          generator.Print(": ");
+          generator.Print(prefix);
           generator.Print(value.ToString());
           generator.Print("\n");
         }
         foreach (uint value in field.Fixed32List) {
-          generator.Print(entry.Key.ToString());
-          generator.Print(": ");
-          // FIXME(jonskeet): Get format of this right; in Java it's %08x. Find out what this means
-          // Also check we're okay in terms of signed/unsigned.
-          generator.Print(string.Format("0x{0:x}", value));
+          generator.Print(prefix);
+          generator.Print(string.Format("0x{0:x8}", value));
           generator.Print("\n");
         }
         foreach (ulong value in field.Fixed64List) {
-          generator.Print(entry.Key.ToString());
-          generator.Print(": ");
-          // FIXME(jonskeet): Get format of this right; in Java it's %016x. Find out what this means
-          // Also check we're okay in terms of signed/unsigned.
-          generator.Print(string.Format("0x{0:x}", value));
+          generator.Print(prefix);
+          generator.Print(string.Format("0x{0:x16}", value));
           generator.Print("\n");
         }
         foreach (ByteString value in field.LengthDelimitedList) {
@@ -193,7 +186,6 @@ namespace Google.ProtocolBuffers {
       }
     }
 
-
     internal static ulong ParseUInt64(string text) {
       return (ulong) ParseInteger(text, true, false);
     }

+ 2 - 2
csharp/ProtocolBuffers/UnknownField.cs

@@ -127,10 +127,10 @@ namespace Google.ProtocolBuffers {
       foreach (ulong value in varintList) {
         result += CodedOutputStream.ComputeUInt64Size(fieldNumber, value);
       }
-      foreach (int value in fixed32List) {
+      foreach (uint value in fixed32List) {
         result += CodedOutputStream.ComputeFixed32Size(fieldNumber, value);
       }
-      foreach (long value in fixed64List) {
+      foreach (ulong value in fixed64List) {
         result += CodedOutputStream.ComputeFixed64Size(fieldNumber, value);
       }
       foreach (ByteString value in lengthDelimitedList) {

+ 2 - 1
src/google/protobuf/compiler/csharp/csharp_enum.cc

@@ -69,8 +69,9 @@ void EnumGenerator::Generate(io::Printer* printer) {
     vars["number"] = SimpleItoa(canonical_values_[i]->number());
 
     // TODO(jonskeet): Change CONSTANT_CASE into PascalCase
+    // TODO(jonskeet): I don't think we need EnumDescriptorIndex after all
     printer->Print(vars,
-      "[pbd::EnumDescriptorIndex($index$)]\r\n"
+      //"[pbd::EnumDescriptorIndex($index$)]\r\n"
       "$name$ = $number$,\r\n");
   }
   printer->Outdent();

+ 8 - 8
src/google/protobuf/compiler/csharp/csharp_enum_field.cc

@@ -178,11 +178,11 @@ GenerateBuilderMembers(io::Printer* printer) const {
     //   could hold on to the returned list and modify it after the message
     //   has been built, thus mutating the message which is supposed to be
     //   immutable.
-    "public global::System.Collections.Generic::IList<$type$> $capitalized_name$List {\r\n"
+    "public scg::IList<$type$> $capitalized_name$List {\r\n"
     "  get { return pbc::Lists.AsReadOnly(result.$name$_); }\r\n"
     "}\r\n"
     "public int $capitalized_name$Count {\r\n"
-    "  get { return result.get$capitalized_name$Count; } \r\n"
+    "  get { return result.$capitalized_name$Count; } \r\n"
     "}\r\n"
     "public $type$ Get$capitalized_name$(int index) {\r\n"
     "  return result.Get$capitalized_name$(index);\r\n"
@@ -191,7 +191,7 @@ GenerateBuilderMembers(io::Printer* printer) const {
     "  result.$name$_[index] = value;\r\n"
     "  return this;\r\n"
     "}\r\n"
-    "public Builder add$capitalized_name$($type$ value) {\r\n"
+    "public Builder Add$capitalized_name$($type$ value) {\r\n"
     "  if (result.$name$_.Count == 0) {\r\n"
     "    result.$name$_ = new scg::List<$type$>();\r\n"
     "  }\r\n"
@@ -232,9 +232,9 @@ void RepeatedEnumFieldGenerator::
 GenerateParsingCode(io::Printer* printer) const {
   printer->Print(variables_,
     "int rawValue = input.ReadEnum();\r\n"
-    "$type$ value = $type$.valueOf(rawValue);\r\n"
-    "if (value == null) {\r\n"
-    "  unknownFields.MergeVarintField($number$, rawValue);\r\n"
+    "$type$ value = ($type$) rawValue;\r\n"
+    "if (!global::System.Enum.IsDefined(typeof($type$), value)) {\r\n"
+    "  unknownFields.MergeVarintField($number$, (ulong) rawValue);\r\n"
     "} else {\r\n"
     "  Add$capitalized_name$(value);\r\n"
     "}\r\n");
@@ -244,7 +244,7 @@ void RepeatedEnumFieldGenerator::
 GenerateSerializationCode(io::Printer* printer) const {
   printer->Print(variables_,
     "foreach ($type$ element in $capitalized_name$List) {\r\n"
-    "  output.WriteEnum($number$, element.Number);\r\n"
+    "  output.WriteEnum($number$, (int) element);\r\n"
     "}\r\n");
 }
 
@@ -253,7 +253,7 @@ GenerateSerializedSizeCode(io::Printer* printer) const {
   printer->Print(variables_,
     "foreach ($type$ element in $capitalized_name$List) {\r\n"
     "  size += pb::CodedOutputStream\r\n"
-    "    .ComputeEnumSize($number$, element.Number);\r\n"
+    "    .ComputeEnumSize($number$, (int) element);\r\n"
     "}\r\n");
 }
 

+ 6 - 16
src/google/protobuf/compiler/csharp/csharp_extension.cc

@@ -36,7 +36,7 @@ ExtensionGenerator::~ExtensionGenerator() {}
 
 void ExtensionGenerator::Generate(io::Printer* printer) {
   map<string, string> vars;
-  vars["name"] = UnderscoresToCamelCase(descriptor_);
+  vars["name"] = UnderscoresToCapitalizedCamelCase(descriptor_);
   vars["containing_type"] = ClassName(descriptor_->containing_type());
   vars["index"] = SimpleItoa(descriptor_->index());
 
@@ -56,23 +56,13 @@ void ExtensionGenerator::Generate(io::Printer* printer) {
 
   if (descriptor_->is_repeated()) {
     printer->Print(vars,
-      "public static final\r\n"
-      "  pb::GeneratedMessage.GeneratedExtension<\r\n"
-      "    $containing_type$,\r\n"
-      "    java.util.List<$type$>> $name$ =\r\n"
-      "      pb::GeneratedMessage\r\n"
-      "        .newRepeatedGeneratedExtension(\r\n"
-      "          getDescriptor().getExtensions().get($index$),\r\n"
-      "          typeof ($type$));\r\n");
+      "public static readonly\r\n"
+      "  pb::GeneratedExtension<$containing_type$, scg::IList<$type$>> name =\r\n"
+      "      pb::GeneratedExtension.CreateRepeatedExtension<$containing_type$, $type$>(Descriptor.Extensions[$index$]);\r\n");
   } else {
     printer->Print(vars,
-      "public static final\r\n"
-      "  pb::GeneratedMessage.GeneratedExtension<\r\n"
-      "    $containing_type$,\r\n"
-      "    $type$> $name$ =\r\n"
-      "      pb::GeneratedMessage.newGeneratedExtension(\r\n"
-      "        getDescriptor().getExtensions().get($index$),\r\n"
-      "        typeof ($type$));\r\n");
+      "public static readonly pb::GeneratedExtension<$containing_type$, $type$> $name$ =\r\n"
+      "      pb::GeneratedExtension.CreateExtension<$containing_type$, $type$>(Descriptor.Extensions[$index$]);\r\n");
   }
 }
 

+ 3 - 1
src/google/protobuf/compiler/csharp/csharp_file.cc

@@ -148,7 +148,7 @@ void FileGenerator::Generate(io::Printer* printer) {
   printer->Print("\r\n}, new pbd::FileDescriptor[] {\r\n");
   for (int i = 0; i < file_->dependency_count(); i++) {
     printer->Print(
-      "        $dependency$.getDescriptor(),\r\n",
+      "        $dependency$.Descriptor,\r\n",
       "dependency", ClassName(file_->dependency(i)));
   }
 
@@ -165,9 +165,11 @@ void FileGenerator::Generate(io::Printer* printer) {
   // Extensions must be generated in the outer class since they are values,
   // not classes.
   printer->Print("#region Extensions\r\n");
+  printer->Print("/*");
   for (int i = 0; i < file_->extension_count(); i++) {
     ExtensionGenerator(file_->extension(i)).Generate(printer);
   }
+  printer->Print("*/\r\n");
   printer->Print("#endregion\r\n\r\n");
 
   printer->Print("#region Static variables\r\n");

+ 12 - 4
src/google/protobuf/compiler/csharp/csharp_helpers.cc

@@ -91,6 +91,10 @@ string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) {
   return UnderscoresToCamelCaseImpl(FieldName(field), true);
 }
 
+string UnderscoresToCapitalizedCamelCase(const MethodDescriptor* method) {
+  return UnderscoresToCamelCaseImpl(method->name(), true);
+}
+
 string UnderscoresToCamelCase(const MethodDescriptor* method) {
   return UnderscoresToCamelCaseImpl(method->name(), false);
 }
@@ -162,19 +166,23 @@ string ClassName(const FileDescriptor* descriptor) {
 MappedType GetMappedType(FieldDescriptor::Type field_type) {
   switch (field_type) {
     case FieldDescriptor::TYPE_INT32:
-    case FieldDescriptor::TYPE_UINT32:
     case FieldDescriptor::TYPE_SINT32:
-    case FieldDescriptor::TYPE_FIXED32:
     case FieldDescriptor::TYPE_SFIXED32:
       return MAPPEDTYPE_INT;
 
     case FieldDescriptor::TYPE_INT64:
-    case FieldDescriptor::TYPE_UINT64:
     case FieldDescriptor::TYPE_SINT64:
-    case FieldDescriptor::TYPE_FIXED64:
     case FieldDescriptor::TYPE_SFIXED64:
       return MAPPEDTYPE_LONG;
 
+    case FieldDescriptor::TYPE_UINT32:
+    case FieldDescriptor::TYPE_FIXED32:
+      return MAPPEDTYPE_UINT;
+
+    case FieldDescriptor::TYPE_UINT64:
+    case FieldDescriptor::TYPE_FIXED64:
+      return MAPPEDTYPE_ULONG;
+
     case FieldDescriptor::TYPE_FLOAT:
       return MAPPEDTYPE_FLOAT;
 

+ 1 - 0
src/google/protobuf/compiler/csharp/csharp_helpers.h

@@ -43,6 +43,7 @@ string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field);
 // Similar, but for method names.  (Typically, this merely has the effect
 // of lower-casing the first letter of the name.)
 string UnderscoresToCamelCase(const MethodDescriptor* method);
+string UnderscoresToCapitalizedCamelCase(const MethodDescriptor* method);
 
 // Strips ".proto" or ".protodevel" from the end of a filename.
 string StripProto(const string& filename);

+ 6 - 6
src/google/protobuf/compiler/csharp/csharp_message.cc

@@ -204,7 +204,7 @@ void MessageGenerator::Generate(io::Printer* printer) {
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "$access$ sealed partial class $classname$ : pb::GeneratedMessage.ExtendableMessage<$classname$> {\r\n",
+      "$access$ sealed partial class $classname$ : pb::ExtendableMessage<$classname$, $classname$.Builder> {\r\n",
       "classname", descriptor_->name(),
       "access", ClassAccessLevel(descriptor_->file()));
   } else {
@@ -233,7 +233,7 @@ void MessageGenerator::Generate(io::Printer* printer) {
     "  get { return $fileclass$.internal__$identifier$__Descriptor; }\r\n"
     "}\r\n"
     "\r\n"
-    "protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {\r\n"
+    "protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {\r\n"
     "  get { return $fileclass$.internal__$identifier$__FieldAccessorTable; }\r\n"
     "}\r\n"
     "\r\n",
@@ -298,7 +298,8 @@ GenerateMessageSerializationMethods(io::Printer* printer) {
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "pb::GeneratedMessage.ExtendableMessage.ExtensionWriter extensionWriter = CreateExtensionWriter();\r\n");
+      "pb::ExtendableMessage<$classname$, $classname$.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);\r\n",
+      "classname", descriptor_->name());
   }
 
   // Merge the fields and the extension ranges, both sorted by field number.
@@ -434,8 +435,7 @@ void MessageGenerator::GenerateBuilder(io::Printer* printer) {
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "$access$ sealed partial class Builder : pb::GeneratedMessage.ExtendableBuilder<\r\n"
-      "      $classname$, Builder> {\r\n",
+      "$access$ sealed partial class Builder : pb::GeneratedBuilder<$classname$, $classname$.Builder>.ExtendableBuilder {\r\n",
       "classname", ClassName(descriptor_),
       "access", ClassAccessLevel(descriptor_->file()));
   } else {
@@ -673,7 +673,7 @@ void MessageGenerator::GenerateIsInitialized(io::Printer* printer) {
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "if (!extensionsAreInitialized()) return false;\r\n");
+      "if (!ExtensionsAreInitialized) return false;\r\n");
   }
 
   printer->Outdent();

+ 31 - 44
src/google/protobuf/compiler/csharp/csharp_service.cc

@@ -36,11 +36,8 @@ ServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor)
 ServiceGenerator::~ServiceGenerator() {}
 
 void ServiceGenerator::Generate(io::Printer* printer) {
-  bool is_own_file = descriptor_->file()->options().csharp_multiple_files();
   printer->Print(
-    "public $static$ abstract class $classname$\r\n"
-    "    implements pb::Service {\r\n",
-    "static", is_own_file ? "" : "static",
+    "public abstract class $classname$ : pb::IService {\r\n",
     "classname", descriptor_->name());
   printer->Indent();
 
@@ -48,27 +45,24 @@ void ServiceGenerator::Generate(io::Printer* printer) {
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
     map<string, string> vars;
-    vars["name"] = UnderscoresToCamelCase(method);
+    vars["name"] = UnderscoresToCapitalizedCamelCase(method);
     vars["input"] = ClassName(method->input_type());
     vars["output"] = ClassName(method->output_type());
     printer->Print(vars,
       "public abstract void $name$(\r\n"
-      "    pb::RpcController controller,\r\n"
+      "    pb::IRpcController controller,\r\n"
       "    $input$ request,\r\n"
-      "    pb::RpcCallback<$output$> done);\r\n");
+      "    global::System.Action<$output$> done);\r\n");
   }
 
-  // Generate getDescriptor() and getDescriptorForType().
+  // Generate Descriptor and DescriptorForType.
   printer->Print(
     "\r\n"
-    "public static final\r\n"
-    "    pbd::ServiceDescriptor\r\n"
-    "    getDescriptor() {\r\n"
-    "  return $file$.getDescriptor().getServices().get($index$);\r\n"
+    "public static pbd::ServiceDescriptor Descriptor {\r\n"
+    "  get { return $file$.Descriptor.Services[$index$]; }\r\n"
     "}\r\n"
-    "public final pbd::ServiceDescriptor\r\n"
-    "    DescriptorForType {\r\n"
-    "  return getDescriptor();\r\n"
+    "public pbd::ServiceDescriptor DescriptorForType {\r\n"
+    "  get { return Descriptor; }\r\n"
     "}\r\n",
     "file", ClassName(descriptor_->file()),
     "index", SimpleItoa(descriptor_->index()));
@@ -86,18 +80,17 @@ void ServiceGenerator::Generate(io::Printer* printer) {
 void ServiceGenerator::GenerateCallMethod(io::Printer* printer) {
   printer->Print(
     "\r\n"
-    "public final void callMethod(\r\n"
+    "public void CallMethod(\r\n"
     "    pbd::MethodDescriptor method,\r\n"
-    "    pb::RpcController controller,\r\n"
+    "    pb::IRpcController controller,\r\n"
     "    pb::IMessage request,\r\n"
-    "    pb::RpcCallback<\r\n"
-    "      pb::Message> done) {\r\n"
-    "  if (method.getService() != getDescriptor()) {\r\n"
+    "    global::System.Action<pb::IMessage> done) {\r\n"
+    "  if (method.Service != Descriptor) {\r\n"
     "    throw new global::System.ArgumentException(\r\n"
     "      \"Service.CallMethod() given method descriptor for wrong \" +\r\n"
     "      \"service type.\");\r\n"
     "  }\r\n"
-    "  switch(method.getIndex()) {\r\n");
+    "  switch(method.Index) {\r\n");
   printer->Indent();
   printer->Indent();
 
@@ -105,13 +98,13 @@ void ServiceGenerator::GenerateCallMethod(io::Printer* printer) {
     const MethodDescriptor* method = descriptor_->method(i);
     map<string, string> vars;
     vars["index"] = SimpleItoa(i);
-    vars["method"] = UnderscoresToCamelCase(method);
+    vars["method"] = UnderscoresToCapitalizedCamelCase(method);
     vars["input"] = ClassName(method->input_type());
     vars["output"] = ClassName(method->output_type());
     printer->Print(vars,
       "case $index$:\r\n"
       "  this.$method$(controller, ($input$)request,\r\n"
-      "    pb::RpcUtil.<$output$>specializeCallback(\r\n"
+      "    pb::RpcUtil.SpecializeCallback<$output$>(\r\n"
       "      done));\r\n"
       "  return;\r\n");
   }
@@ -132,10 +125,8 @@ void ServiceGenerator::GenerateCallMethod(io::Printer* printer) {
 void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,
                                             io::Printer* printer) {
   printer->Print(
-    "public final pb::Message\r\n"
-    "    Get$request_or_response$Prototype(\r\n"
-    "    pbd::MethodDescriptor method) {\r\n"
-    "  if (method.getService() != getDescriptor()) {\r\n"
+    "public pb::IMessage Get$request_or_response$Prototype(pbd::MethodDescriptor method) {\r\n"
+    "  if (method.Service != Descriptor) {\r\n"
     "    throw new global::System.ArgumentException(\r\n"
     "      \"Service.Get$request_or_response$Prototype() given method \" +\r\n"
     "      \"descriptor for wrong service type.\");\r\n"
@@ -162,7 +153,6 @@ void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,
 
   printer->Outdent();
   printer->Outdent();
-
   printer->Print(
     "  }\r\n"
     "}\r\n"
@@ -171,48 +161,45 @@ void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,
 
 void ServiceGenerator::GenerateStub(io::Printer* printer) {
   printer->Print(
-    "public static Stub newStub(\r\n"
-    "    pb::RpcChannel channel) {\r\n"
+    "public static Stub CreateStub(\r\n"
+    "    pb::IRpcChannel channel) {\r\n"
     "  return new Stub(channel);\r\n"
     "}\r\n"
     "\r\n"
-    "public static final class Stub extends $classname$ {\r\n",
+    "public class Stub : $classname$ {\r\n",
     "classname", ClassName(descriptor_));
   printer->Indent();
 
   printer->Print(
-    "private Stub(pb::RpcChannel channel) {\r\n"
+    "internal Stub(pb::IRpcChannel channel) {\r\n"
     "  this.channel = channel;\r\n"
     "}\r\n"
     "\r\n"
-    "private final pb::RpcChannel channel;\r\n"
+    "private readonly pb::IRpcChannel channel;\r\n"
     "\r\n"
-    "public pb::RpcChannel getChannel() {\r\n"
-    "  return channel;\r\n"
+    "public pb::IRpcChannel Channel {\r\n"
+    "  get { return channel; }\r\n"
     "}\r\n");
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
     map<string, string> vars;
     vars["index"] = SimpleItoa(i);
-    vars["method"] = UnderscoresToCamelCase(method);
+    vars["method"] = UnderscoresToCapitalizedCamelCase(method);
     vars["input"] = ClassName(method->input_type());
     vars["output"] = ClassName(method->output_type());
     printer->Print(vars,
       "\r\n"
-      "public void $method$(\r\n"
-      "    pb::RpcController controller,\r\n"
+      "public override void $method$(\r\n"
+      "    pb::IRpcController controller,\r\n"
       "    $input$ request,\r\n"
-      "    pb::RpcCallback<$output$> done) {\r\n"
-      "  channel.callMethod(\r\n"
+      "    global::System.Action<$output$> done) {\r\n"
+      "  channel.CallMethod(\r\n"
       "    Descriptor.Methods[$index$],\r\n"
       "    controller,\r\n"
       "    request,\r\n"
       "    $output$.DefaultInstance,\r\n"
-      "    pb::RpcUtil.generalizeCallback(\r\n"
-      "      done,\r\n"
-      "      typeof ($output$),\r\n"
-      "      $output$.DefaultInstance));\r\n"
+      "    pb::RpcUtil.GeneralizeCallback(done, $output$.DefaultInstance));\r\n"
       "}\r\n");
   }
 

+ 2 - 0
src/google/protobuf/unittest.proto

@@ -20,6 +20,8 @@
 //
 // A proto file we will use for unit testing.
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestProtoFile";
 
 import "google/protobuf/unittest_import.proto";
 

+ 3 - 0
src/google/protobuf/unittest_embed_optimize_for.proto

@@ -24,6 +24,9 @@ import "google/protobuf/unittest_optimize_for.proto";
 
 package protobuf_unittest;
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestEmbedOptimizeForProtoFile";
+
 // We optimize for speed here, but we are importing a proto that is optimized
 // for code size.
 option optimize_for = SPEED;

+ 4 - 1
src/google/protobuf/unittest_import.proto

@@ -29,9 +29,12 @@ package protobuf_unittest_import;
 
 option optimize_for = SPEED;
 
-// Excercise the java_package option.
+// Exercise the java_package option.
 option java_package = "com.google.protobuf.test";
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestImportProtoFile";
+
 // Do not set a java_outer_classname here to verify that Proto2 works without
 // one.
 

+ 3 - 0
src/google/protobuf/unittest_mset.proto

@@ -24,6 +24,9 @@ package protobuf_unittest;
 
 option optimize_for = SPEED;
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestMessageSetProtoFile";
+
 // A message with message_set_wire_format.
 message TestMessageSet {
   option message_set_wire_format = true;

+ 3 - 0
src/google/protobuf/unittest_optimize_for.proto

@@ -26,6 +26,9 @@ package protobuf_unittest;
 
 option optimize_for = CODE_SIZE;
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestOptimizeForProtoFile";
+
 message TestOptimizedForSize {
   optional int32 i = 1;
   optional ForeignMessage msg = 19;