Эх сурвалжийг харах

Merge pull request #384 from google/csharp

Merge protobuf C# into master (only C# proto2 is supported)
Jie Luo 10 жил өмнө
parent
commit
aa8c951ef5
100 өөрчлөгдсөн 59464 нэмэгдсэн , 0 устгасан
  1. 8 0
      .gitignore
  2. 3 0
      benchmarks/google_size.proto
  3. 3 0
      benchmarks/google_speed.proto
  4. 45 0
      csharp/.gitignore
  5. 148 0
      csharp/CHANGES.txt
  6. 37 0
      csharp/README.md
  7. 8 0
      csharp/build/BuildAll.bat
  8. 122 0
      csharp/build/Common.targets
  9. 59 0
      csharp/build/Google.ProtocolBuffers.nuspec
  10. 60 0
      csharp/build/Google.ProtocolBuffersLite.nuspec
  11. 2 0
      csharp/build/RunBenchmarks.bat
  12. 20 0
      csharp/build/build.bat
  13. 241 0
      csharp/build/build.csproj
  14. 248 0
      csharp/build/googlecode_upload.py
  15. 79 0
      csharp/build/nuspec.xsd
  16. 186 0
      csharp/build/publish.csproj
  17. 167 0
      csharp/build/target.csproj
  18. 22 0
      csharp/buildall.sh
  19. 50 0
      csharp/generate_protos.sh
  20. BIN
      csharp/keys/Google.ProtocolBuffers.snk
  21. 13 0
      csharp/keys/generate_new_key.bat
  22. 71 0
      csharp/protos/extest/unittest_extras_full.proto
  23. 115 0
      csharp/protos/extest/unittest_extras_lite.proto
  24. 53 0
      csharp/protos/extest/unittest_extras_xmltest.proto
  25. 141 0
      csharp/protos/extest/unittest_issues.proto
  26. 136 0
      csharp/src/AddressBook/AddPerson.cs
  27. 72 0
      csharp/src/AddressBook/AddressBook.csproj
  28. 1158 0
      csharp/src/AddressBook/Addressbook.cs
  29. 103 0
      csharp/src/AddressBook/ListPeople.cs
  30. 99 0
      csharp/src/AddressBook/Program.cs
  31. 29 0
      csharp/src/AddressBook/Properties/AssemblyInfo.cs
  32. 44 0
      csharp/src/AddressBook/SampleUsage.cs
  33. 3 0
      csharp/src/AddressBook/app.config
  34. 4569 0
      csharp/src/ProtoBench/GoogleSize.cs
  35. 6634 0
      csharp/src/ProtoBench/GoogleSpeed.cs
  36. 538 0
      csharp/src/ProtoBench/Program.cs
  37. 31 0
      csharp/src/ProtoBench/Properties/AssemblyInfo.cs
  38. 88 0
      csharp/src/ProtoBench/ProtoBench.csproj
  39. 33516 0
      csharp/src/ProtoBench/Unittest.cs
  40. 347 0
      csharp/src/ProtoBench/UnittestImport.cs
  41. 333 0
      csharp/src/ProtoBench/UnittestImportPublic.cs
  42. 3 0
      csharp/src/ProtoBench/app.config
  43. BIN
      csharp/src/ProtoBench/google_message1.dat
  44. BIN
      csharp/src/ProtoBench/google_message2.dat
  45. 88 0
      csharp/src/ProtoDump/Program.cs
  46. 30 0
      csharp/src/ProtoDump/Properties/AssemblyInfo.cs
  47. 67 0
      csharp/src/ProtoDump/ProtoDump.csproj
  48. 3 0
      csharp/src/ProtoDump/app.config
  49. 305 0
      csharp/src/ProtoMunge/Program.cs
  50. 30 0
      csharp/src/ProtoMunge/Properties/AssemblyInfo.cs
  51. 67 0
      csharp/src/ProtoMunge/ProtoMunge.csproj
  52. 3 0
      csharp/src/ProtoMunge/app.config
  53. 686 0
      csharp/src/ProtocolBuffers.Serialization/AbstractReader.cs
  54. 175 0
      csharp/src/ProtocolBuffers.Serialization/AbstractTextReader.cs
  55. 104 0
      csharp/src/ProtocolBuffers.Serialization/AbstractTextWriter.cs
  56. 503 0
      csharp/src/ProtocolBuffers.Serialization/AbstractWriter.cs
  57. 265 0
      csharp/src/ProtocolBuffers.Serialization/DictionaryReader.cs
  58. 200 0
      csharp/src/ProtocolBuffers.Serialization/DictionaryWriter.cs
  59. 185 0
      csharp/src/ProtocolBuffers.Serialization/Extensions.cs
  60. 162 0
      csharp/src/ProtocolBuffers.Serialization/Http/FormUrlEncodedReader.cs
  61. 112 0
      csharp/src/ProtocolBuffers.Serialization/Http/MessageFormatFactory.cs
  62. 176 0
      csharp/src/ProtocolBuffers.Serialization/Http/MessageFormatOptions.cs
  63. 262 0
      csharp/src/ProtocolBuffers.Serialization/JsonFormatReader.cs
  64. 541 0
      csharp/src/ProtocolBuffers.Serialization/JsonFormatWriter.cs
  65. 442 0
      csharp/src/ProtocolBuffers.Serialization/JsonTextCursor.cs
  66. 65 0
      csharp/src/ProtocolBuffers.Serialization/Properties/AssemblyInfo.cs
  67. 93 0
      csharp/src/ProtocolBuffers.Serialization/ProtocolBuffers.Serialization.csproj
  68. 93 0
      csharp/src/ProtocolBuffers.Serialization/ProtocolBuffersLite.Serialization.csproj
  69. 18 0
      csharp/src/ProtocolBuffers.Serialization/RecursionLimitExceeded.cs
  70. 338 0
      csharp/src/ProtocolBuffers.Serialization/XmlFormatReader.cs
  71. 280 0
      csharp/src/ProtocolBuffers.Serialization/XmlFormatWriter.cs
  72. 17 0
      csharp/src/ProtocolBuffers.Serialization/XmlReaderOptions.cs
  73. 24 0
      csharp/src/ProtocolBuffers.Serialization/XmlWriterOptions.cs
  74. 522 0
      csharp/src/ProtocolBuffers.Test/AbstractMessageTest.cs
  75. 8 0
      csharp/src/ProtocolBuffers.Test/App.xaml
  76. 60 0
      csharp/src/ProtocolBuffers.Test/App.xaml.cs
  77. 147 0
      csharp/src/ProtocolBuffers.Test/ByteStringTest.cs
  78. 569 0
      csharp/src/ProtocolBuffers.Test/CodedInputStreamTest.cs
  79. 471 0
      csharp/src/ProtocolBuffers.Test/CodedOutputStreamTest.cs
  80. 125 0
      csharp/src/ProtocolBuffers.Test/Collections/PopsicleListTest.cs
  81. 18 0
      csharp/src/ProtocolBuffers.Test/Compatibility/BinaryCompatibilityTests.cs
  82. 227 0
      csharp/src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs
  83. 35 0
      csharp/src/ProtocolBuffers.Test/Compatibility/DictionaryCompatibilityTests.cs
  84. 43 0
      csharp/src/ProtocolBuffers.Test/Compatibility/JsonCompatibilityTests.cs
  85. 38 0
      csharp/src/ProtocolBuffers.Test/Compatibility/TestResources.cs
  86. 35 0
      csharp/src/ProtocolBuffers.Test/Compatibility/TextCompatibilityTests.cs
  87. 45 0
      csharp/src/ProtocolBuffers.Test/Compatibility/XmlCompatibilityTests.cs
  88. BIN
      csharp/src/ProtocolBuffers.Test/Compatibility/google_message1.dat
  89. BIN
      csharp/src/ProtocolBuffers.Test/Compatibility/google_message2.dat
  90. 99 0
      csharp/src/ProtocolBuffers.Test/DeprecatedMemberTest.cs
  91. 286 0
      csharp/src/ProtocolBuffers.Test/DescriptorsTest.cs
  92. 227 0
      csharp/src/ProtocolBuffers.Test/DynamicMessageTest.cs
  93. 200 0
      csharp/src/ProtocolBuffers.Test/ExtendableMessageTest.cs
  94. 183 0
      csharp/src/ProtocolBuffers.Test/FieldPresenceTest.cs
  95. 102 0
      csharp/src/ProtocolBuffers.Test/GeneratedBuilderTest.cs
  96. 514 0
      csharp/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
  97. 60 0
      csharp/src/ProtocolBuffers.Test/IssuesTest.cs
  98. 90 0
      csharp/src/ProtocolBuffers.Test/MessageStreamIteratorTest.cs
  99. 78 0
      csharp/src/ProtocolBuffers.Test/MessageStreamWriterTest.cs
  100. 344 0
      csharp/src/ProtocolBuffers.Test/MessageTest.cs

+ 8 - 0
.gitignore

@@ -76,6 +76,14 @@ src/**/*.trs
 java/target
 javanano/target
 
+# Windows native output.
+vsprojects/Debug
+vsprojects/Release
+
+# NuGet packages: we want the repository configuration, but not the
+# packages themselves.
+/csharp/src/packages/*/
+
 # Directories created by opening the Objective C Xcode projects.
 objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/xcuserdata/
 objectivec/ProtocolBuffers_OSX.xcodeproj/xcuserdata/

+ 3 - 0
benchmarks/google_size.proto

@@ -1,7 +1,10 @@
+syntax = "proto2";
+
 package benchmarks;
 
 option java_outer_classname = "GoogleSize";
 option optimize_for = CODE_SIZE;
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
 
 message SizeMessage1 {
   required string field1 = 1;

+ 3 - 0
benchmarks/google_speed.proto

@@ -1,7 +1,10 @@
+syntax = "proto2";
+
 package benchmarks;
 
 option java_outer_classname = "GoogleSpeed";
 option optimize_for = SPEED;
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
 
 message SpeedMessage1 {
   required string field1 = 1;

+ 45 - 0
csharp/.gitignore

@@ -0,0 +1,45 @@
+#
+# 	Untracked directories
+#
+src/AddressBook/bin
+src/AddressBook/obj
+src/ProtocolBuffers/bin/
+src/ProtocolBuffers/obj/
+src/ProtocolBuffers/objCF
+src/ProtocolBuffers.Serialization/bin/
+src/ProtocolBuffers.Serialization/obj/
+src/ProtocolBuffers.Test/bin/
+src/ProtocolBuffers.Test/obj/
+src/ProtocolBuffersLite.Test/bin/
+src/ProtocolBuffersLite.Test/obj/
+src/ProtoBench/bin/
+src/ProtoBench/obj/
+src/ProtoDump/bin/
+src/ProtoDump/obj/
+src/ProtoGen/bin/
+src/ProtoGen/obj/
+src/ProtoGen.Test/bin/
+src/ProtoGen.Test/obj/
+src/ProtoMunge/bin/
+src/ProtoMunge/obj/
+mono/bin
+mono/tmp
+mono/protoc
+build_output
+build_temp
+build/msbuild*.log
+lib/Microsoft.Silverlight.Testing
+lib/NUnit
+
+#
+# 	Untracked files
+#
+*.user
+*.suo
+_ReSharper.*
+*.sln.cache
+mono/TestResult.xml
+mono/.libs
+mono/*.exe
+mono/*.dll
+lib/protoc.exe

+ 148 - 0
csharp/CHANGES.txt

@@ -0,0 +1,148 @@
+===============================================================================
+Welcome to the C# port of Google Protocol Buffers, written by Jon Skeet
+(skeet@pobox.com) based on the work of many talented people.
+
+===============================================================================
+RELEASE NOTES - Code imported into Google's main protobuf repository
+===============================================================================
+
+Everything below note this represents history of protobuf-csharp-port project
+before the code was merged into csharp/ subtree of GitHub google/protobuf
+repository.
+Frozen legacy version of the original project is available in
+https://github.com/jskeet/protobuf-csharp-port.
+
+===============================================================================
+RELEASE NOTES - Version 2.4.1.555
+===============================================================================
+
+Changes:
+- Upgrade solution format to Visual Studio 2012.
+- Add the ability to print a builder (not just a message)
+- TextGenerator introduces a new overload of PrintTo
+- Munge protoc's error format into a VS-C#-compatible output format.
+- Work to make ProtoGen clone that acts as a protoc.exe plugin.
+- Added the AllowPartiallyTrustedCallers attribute
+- Optimized enum parsing.
+
+Fixes:
+- Fix for bug in limited input stream's Position, Introduced Position on 
+  output stream
+- Fix for writing a character to a JSON output overflows allocated buffer
+- Optimize FromBase64String to return Empty when presented with empty string.
+- Use string.Concat instead of operator to avoid potential import problems
+- Issue 81: quoting for NUnit parameters.
+- Issue 56: NuGet package is noisy
+- Issue 70: Portable library project has some invalid Nunit-based code.
+- Issue 71: CodedInputStream.ReadBytes go to slow path unnecessarily
+- Issue 84: warning CS0219: The variable `size' is assigned but never used
+
+===============================================================================
+RELEASE NOTES - Version 2.4.1.521
+===============================================================================
+
+Changes:
+- Add generated_code_attributes option, defaulted to false
+- Added support for Portable library
+- Added 'Unsafe' static type in ByteString to allow direct buffer access
+
+Fixes:
+- Issue 50: The XML serializer will fail to deserialize a message with empty 
+  child message
+- Issue 45: Use of 'item' as a field name causes AmbiguousMatchException
+- Issue 49: Generated nested static Types class should be partial
+- Issue 38: Disable CLSCompliant warnings (3021)
+- Issue 40: proto_path does not work for command-line file names
+- Issue 54: should retire all bytes in buffer (bufferSize)
+- Issue 43: Fix to correct identical 'umbrella_classname' options from trying 
+  to write to the same filename.
+
+===============================================================================
+RELEASE NOTES - Version 2.4.1.473
+===============================================================================
+
+Features:
+- Added option service_generator_type to control service generation with
+  NONE, GENERIC, INTERFACE, or IRPCDISPATCH
+- Added interfaces IRpcDispatch and IRpcServerStub to provide for blocking
+  services and implementations.
+- Added ProtoGen.exe command-line argument "--protoc_dir=" to specify the 
+  location of protoc.exe.
+- Extracted interfaces for ICodedInputStream and ICodedOutputStream to allow
+  custom implementation of writers with both speed and size optimizations.
+- Addition of the "Google.ProtoBuffers.Serialization" assembly to support
+  reading and writing messages to/from XML, JSON, IDictionary<,> and others.
+- Several performance related fixes and tweeks
+- Issue 3:	Add option to mark generated code with attribute
+- Issue 20:	Support for decorating classes [Serializable]
+- Issue 21:	Decorate fields with [deprecated=true] as [System.Obsolete]
+- Issue 22:	Reusable Builder classes
+- Issue 24:	Support for using Json/Xml formats with ICodedInputStream
+- Issue 25: Added support for NuGet packages
+- Issue 31: Upgraded protoc.exe and descriptor to 2.4.1
+
+Fixes:
+- Issue 13:	Message with Field same name as message causes uncompilable .cs
+- Issue 16:	Does not integrate well with other tooling
+- Issue 19:	Support for negative enum values
+- Issue 26:	AddRange in GeneratedBuilder iterates twice.
+- Issue 27:	Remove XML documentation output from test projects to clear 
+  warnings/errors.
+- Issue 28: Circular message dependencies result in null default values for 
+  Message fields.
+- Issue 29: Message classes generated have a public default constructor.  You
+  can disable private ctor generation with the option generate_private_ctor.
+- Issue 35: Fixed a bug in ProtoGen handling of arguments with trailing \
+- Big-endian support for float, and double on Silverlight
+- Packed and Unpacked parsing allow for all repeated, as per version 2.3
+- Fix for leaving Builder a public ctor on internal classes for use with
+  generic "where T: new()" constraints.
+
+Other:
+- Changed the code signing key to a privately held key
+- Reformatted all code and line-endings to C# defaults
+- Reworking of performance benchmarks to produce reliable results, option /v2
+- Issue 34: Silverlight assemblies are now unit tested
+
+===============================================================================
+RELEASE NOTES - Version 2.3.0.277
+===============================================================================
+
+Features:
+- Added cls_compliance option to generate attributes indicating 
+  non-CLS-compliance.
+- Added file_extension option to control the generated output file's extension.
+- Added umbrella_namespace option to place the umbrella class into a nested
+  namespace to address issues with proto files having the same name as a 
+  message it contains.
+- Added output_directory option to set the output path for the source file(s).
+- Added ignore_google_protobuf option to avoid generating code for includes 
+  from the google.protobuf package.
+- Added the LITE framework (Google.ProtoBuffersLite.dll) and the ability to
+  generate code with "option optimize_for = LITE_RUNTIME;".
+- Added ability to invoke protoc.exe from within ProtoGen.exe.
+- Upgraded to protoc.exe (2.3) compiler.
+
+Fixes:
+- Issue 9:	Class cannot be static and sealed error
+- Issue 12:	default value for enumerate fields must be filled out
+
+Other:
+- Rewrite of build using MSBbuild instead of NAnt
+- Moved to NUnit Version 2.2.8.0
+- Changed to using secure .snk for releases
+
+===============================================================================
+RELEASE NOTES - Version 0.9.1
+===============================================================================
+
+Fixes:
+- issue 10:	Incorrect encoding of packed fields when serialized
+
+===============================================================================
+RELEASE NOTES - Version 0.9.0
+===============================================================================
+
+- Initial release
+
+===============================================================================

+ 37 - 0
csharp/README.md

@@ -0,0 +1,37 @@
+
+This directory contains the C# Protocol Buffers runtime library.
+
+Usage
+=====
+
+The easiest way to use C# protocol buffers in your project is to use the [Google.ProtocolBuffers NuGet package](http://www.nuget.org/packages/Google.ProtocolBuffers/). This package is the legacy package for C# protocol buffers, but it will work fine with C# code generated by `protoc` if you use proto2 syntax (The API of the runtime library haven't changed so far).
+
+*WARNING: If you specify `syntax = "proto3";` in your .proto files, the generated code won't necessarily work with the legacy NuGet package. So before we officially add proto3 support, always use `syntax = "proto2";` (the default) in your protos.*
+
+We will definitely release a new NuGet package for the runtime library in the future. The new runtime library WILL contain significant semantic, backwardly-incompatible changes in proto handling (mostly because we will be adding proto3 support and we will be using that oportunity to make some design changes). So keep in mind that you will need to regenerate your proto files and switch to a new NuGet package once the new version of runtime library becomes available.
+
+Building
+========
+
+Open the `src/ProtocolBuffers.sln` solution in Visual Studio. Click "Build solution" to build the solution. You should be able to run the NUnit test from Test Explorer (you might need to install NUnit Visual Studio add-in).
+
+Supported Visual Studio versions are VS2013 (update 4) and VS2015. On Linux, you can also use Monodevelop 5.9 (older versions might work fine).
+
+Proto2 & Proto3
+===============
+
+*WARNING: Only proto2 is supported for now, proto3 is under construction.*
+
+C# protocol buffers are currently under development and you should expect semantic, backward-incompatible changes in the future.
+
+Also, as of now, only proto2 is supported. Proto3 support for C# is currently in progress
+(both design & implementation) and you should not expect any of the proto3 features to work. 
+In fact, always use `syntax = "proto2";` in your .proto files for now, unless you are feeling like experimenting.
+
+History of C# protobufs
+=======================
+
+This subtree was originally imported from https://github.com/jskeet/protobuf-csharp-port
+and represents the latest development version of C# protobufs, that will now be developed
+and maintained by Google. All the development will be done in open, under this repository
+(https://github.com/google/protobuf).

+ 8 - 0
csharp/build/BuildAll.bat

@@ -0,0 +1,8 @@
+@echo off
+SET BUILD_TARGET=%~1
+SET BUILD_CONFIG=%~2
+
+IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild
+IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug
+
+CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo build.csproj /t:%BUILD_TARGET% /toolsversion:4.0 "/p:Configuration=%BUILD_CONFIG%" %3 %4 %5 %6

+ 122 - 0
csharp/build/Common.targets

@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+<!-- **********************************************************************************************
+Targets For Clean
+*********************************************************************************************** -->
+
+  <Target Name="_CleanFolder">
+    <Message Importance="normal" Text="Removing temporary directory '$(CleanFolderDirectory)'"/>
+    <Error Text="Can not remove empty directory name." Condition=" '$(CleanFolderDirectory)' == '' " />
+
+    <Exec WorkingDirectory="$(MSBuildProjectDirectory)" Condition="Exists($(CleanFolderDirectory))" Outputs="@(Ignore)"
+      Command="MOVE /Y &quot;$(CleanFolderDirectory)&quot; &quot;$(CleanFolderDirectory)-deleted&quot; > NUL" />
+    
+    <RemoveDir Directories="$(CleanFolderDirectory)-deleted" Condition="Exists('$(CleanFolderDirectory)-deleted')" />
+  </Target>
+
+  <Target Name="_CleanTempOutput">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="CleanFolderDirectory=%(TempBuildFolder.Identity);" Targets="_CleanFolder" />
+  </Target>
+  
+  <Target Name="_CleanAll" DependsOnTargets="_CleanTempOutput">
+    <MakeDir Directories="$(BuildTempDirectory)" />
+    <MakeDir Directories="$(BuildOutputDirectory)" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Build
+*********************************************************************************************** -->
+
+  <Target Name="_CompileAll">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="SolutionTarget=Rebuild;" Targets="_BuildAllConfigurations" />
+  </Target>
+
+  <Target Name="_BuildAllConfigurations">
+    <MSBuild Properties="TargetVersion=cf20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=cf35;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=net20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=net35;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=net40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=sl20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=sl30;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=sl40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=pl40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Tools
+*********************************************************************************************** -->
+
+  <Target Name="_BuildTools">
+    
+    <MSBuild Targets="Build" ToolsVersion="3.5" Projects="$(ProjectDirectory)\src\ProtocolBuffers.sln" Properties="Configuration=Release;Platform=Any CPU;" />
+    <Copy SourceFiles="%(ToolsOutputItem.Identity)" DestinationFolder="$(BuildOutputDirectory)\tools" />
+
+    <Copy SourceFiles="$(LibDirectory)\NUnit-config\nunit-console.v2.0.config" DestinationFiles="$(NUnitExePath).config" />
+    <Exec 
+      WorkingDirectory="%(ToolsTestContainer.RootDir)%(ToolsTestContainer.Directory)"
+      Command="&quot;$(NUnitExePath)&quot; /nologo /noshadow &quot;%(ToolsTestContainer.Identity)&quot; /xml:&quot;$(BuildTempDirectory)\%(ToolsTestContainer.Filename).xml&quot;" />
+    
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For GenerateSource
+*********************************************************************************************** -->
+
+  <Target Name="_GenerateProjects">
+    <Exec Command="&quot;$(CsProjectProjector)&quot; csproj_templates src\ProtocolBuffersLibrary.sln" WorkingDirectory="$(ProjectDirectory)" />
+  </Target>
+  
+  <Target Name="_CleanTempSource">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="CleanFolderDirectory=$(SourceTempDirectory);" Targets="_CleanFolder" />
+    <MakeDir Directories="$(SourceTempDirectory)" />
+  </Target>
+  
+  <Target Name="_GenerateSource" DependsOnTargets="_CleanTempSource">
+    <Message Importance="high" Text="Generating source from proto files" />
+    <Exec Command="&quot;$(ProtocExePath)&quot; --proto_path=$(ProtosDirectory) --descriptor_set_out=compiled.pb @(Protos->'%(RelativeDir)%(Filename)%(Extension)', ' ')" WorkingDirectory="$(SourceTempDirectory)" />
+    <Exec Command="&quot;$(ProtogenExePath)&quot; compiled.pb" WorkingDirectory="$(SourceTempDirectory)" />
+  </Target>
+
+  <Target Name="_CopyGeneratedSource" DependsOnTargets="_GenerateSource">
+    <Copy SourceFiles="%(GeneratedSource.Identity)" DestinationFiles="%(GeneratedSource.TargetDirectory)\%(GeneratedSource.Filename)%(GeneratedSource.Extension)" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Package
+*********************************************************************************************** -->
+
+  <Target Name="_PackageAll">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="SolutionTarget=_Publish;" Targets="_BuildAllConfigurations" />
+  </Target>
+
+  <Target Name="_GeneratePackage">
+    <Copy SourceFiles="@(StaticPackageItem)" DestinationFolder="$(BuildOutputPackage)\%(StaticPackageItem.TargetDirectory)\%(StaticPackageItem.RecursiveDir)" />
+    <Exec Command="&quot;$(ZipExePath)&quot; a -tzip $(BuildTempDirectory)\$(PackageName)-binaries.zip * -x!*.pdb -r" WorkingDirectory="$(BuildOutputPackage)" />
+    <Exec Command="&quot;$(ZipExePath)&quot; a -tzip $(BuildTempDirectory)\$(PackageName)-symbols.zip * -r" WorkingDirectory="$(BuildOutputPackage)" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Benchmark
+*********************************************************************************************** -->
+
+  <Target Name="_RunBenchmarks">
+    <ItemGroup>
+      <BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SizeMessage1,ProtoBench" />
+      <BenchmarkParameter Include="google_message1.dat" />
+      <BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SpeedMessage1,ProtoBench" />
+      <BenchmarkParameter Include="google_message1.dat" />
+      <BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SizeMessage2,ProtoBench" />
+      <BenchmarkParameter Include="google_message2.dat" />
+      <BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SpeedMessage2,ProtoBench" />
+      <BenchmarkParameter Include="google_message2.dat" />
+    </ItemGroup>
+
+    <Message Text="Running ProtoBench.exe" />
+    <Exec Command="ProtoBench.exe $(BenchmarkArgs) @(BenchmarkParameter->'%(Identity)', ' ') &quot;/log:$(BenchmarkOutputFile)&quot;"
+          WorkingDirectory="$(SourceDirectory)\ProtoBench\bin\NET35\Release" />
+
+  </Target>
+
+</Project>

+ 59 - 0
csharp/build/Google.ProtocolBuffers.nuspec

@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nuspec.xsd">
+  <metadata>
+    <id>Google.ProtocolBuffers</id>
+    <version>$version$</version>
+    <owners>Jon Skeet</owners>
+    <authors>Jon Skeet</authors>
+    <licenseUrl>http://code.google.com/p/protobuf-csharp-port/source/browse/license.txt</licenseUrl>
+    <projectUrl>http://code.google.com/p/protobuf-csharp-port/</projectUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <copyright>Copyright 2008 Google Inc.  All rights reserved.</copyright>
+    <tags>Protocol Buffers Binary Serialization Format Google</tags>
+
+    <title>Google.ProtocolBuffers</title>
+    <summary>A managed code generator and library for Google's data interchange format.</summary>
+    <description><![CDATA[
+Protocol Buffers is a binary serialization format and technology, released to the open source community by Google in 2008.  
+Its primary use is to produce small fast binary representations of a 'message' or object for serialization or transportation.
+There are various implementations of Protocol Buffers in .NET. This project is a fairly close port of the Google Java implementation.
+
+There are two main parts:
+
+tools/protoc.exe, which takes the textual representation of the protocol buffer and turns it into a binary representation for use with ProtoGen.exe.
+tools/ProtoGen.exe, which takes binary representations of protocol buffer descriptors (as generated by the "stock" protoc binary supplied by Google) and creates C# source code. This is only required at build time.
+
+lib/*/Google.ProtocolBuffers.dll, which is a supporting library. This is required at execution time.
+lib/*/Google.ProtocolBuffers.Serialization.dll, a supplementary library that provides extensions for reading and writing protocol buffers to xml, json, and others.
+
+LINKS:
+
+Project Home    - http://code.google.com/p/protobuf-csharp-port
+Online Help     - http://help.protobuffers.net
+Developer Guide - http://code.google.com/apis/protocolbuffers/docs/overview.html
+Language Guide  - http://code.google.com/apis/protocolbuffers/docs/proto.html
+
+    ]]></description>
+	
+    <references>
+      <reference file="Google.ProtocolBuffers.dll"/>
+      <reference file="Google.ProtocolBuffers.Serialization.dll"/>
+    </references>
+  
+  </metadata>
+  <files>
+    <!-- Release Binaries -->
+    <file src="..\build_output\Release\**\Google.ProtocolBuffers.???" target="lib\" />
+    <file src="..\build_output\Release\**\Google.ProtocolBuffers.Serialization.???" target="lib\" />
+    <!-- Tools -->
+    <file src="..\build_output\tools\**\*" target="tools\" />
+    <file src="..\build_output\protos\**\*" target="tools\" />
+    <!-- Content -->
+    <file src="..\build_output\CHANGES.txt" target="tools\"/>
+    <file src="..\build_output\license.txt" target="tools\"/>
+    <file src="..\build_output\tools\protoc-license.txt" target="tools\"/>
+    <!-- Source -->
+    <file src="..\src\ProtocolBuffers\**\*.cs" target="src\ProtocolBuffers\"/>
+    <file src="..\src\ProtocolBuffers.Serialization\**\*.cs" target="src\ProtocolBuffers.Serialization\"/>
+  </files>
+</package>

+ 60 - 0
csharp/build/Google.ProtocolBuffersLite.nuspec

@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nuspec.xsd">
+  <metadata>
+    <id>Google.ProtocolBuffersLite</id>
+    <version>$version$</version>
+    <owners>Jon Skeet</owners>
+    <authors>Jon Skeet</authors>
+    <licenseUrl>http://code.google.com/p/protobuf-csharp-port/source/browse/license.txt</licenseUrl>
+    <projectUrl>http://code.google.com/p/protobuf-csharp-port/</projectUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <copyright>Copyright 2008 Google Inc.  All rights reserved.</copyright>
+    <tags>Protocol Buffers Binary Serialization Format Google</tags>
+
+    <title>Google.ProtocolBuffersLite</title>
+    <summary>A managed code generator and library for Google's data interchange format.</summary>
+    <description><![CDATA[
+Protocol Buffers is a binary serialization format and technology, released to the open source community by Google in 2008.  
+Its primary use is to produce small fast binary representations of a 'message' or object for serialization or transportation.
+There are various implementations of Protocol Buffers in .NET. This project is a fairly close port of the Google Java implementation.
+
+There are two main parts:
+
+tools/protoc.exe, which takes the textual representation of the protocol buffer and turns it into a binary representation for use with ProtoGen.exe.
+tools/ProtoGen.exe, which takes binary representations of protocol buffer descriptors (as generated by the "stock" protoc binary supplied by Google) and creates C# source code. This is only required at build time.
+
+lib/*/Google.ProtocolBuffersLite.dll, which is a supporting library. This is required at execution time.
+lib/*/Google.ProtocolBuffersLite.Serialization.dll, a supplementary library that provides extensions for reading and writing protocol buffers to xml, json, and others.
+
+LINKS:
+
+Project Home    - http://code.google.com/p/protobuf-csharp-port
+Online Help     - http://help.protobuffers.net
+Developer Guide - http://code.google.com/apis/protocolbuffers/docs/overview.html
+Language Guide  - http://code.google.com/apis/protocolbuffers/docs/proto.html
+
+    ]]></description>
+	
+    <references>
+      <reference file="Google.ProtocolBuffersLite.dll"/>
+      <reference file="Google.ProtocolBuffersLite.Serialization.dll"/>
+    </references>
+  
+  </metadata>
+
+  <files>
+    <!-- Release Binaries -->
+    <file src="..\build_output\Release\**\Google.ProtocolBuffersLite.???" target="lib\" />
+    <file src="..\build_output\Release\**\Google.ProtocolBuffersLite.Serialization.???" target="lib\" />
+    <!-- Tools -->
+    <file src="..\build_output\tools\**\*" target="tools\" />
+    <file src="..\build_output\protos\**\*" target="tools\" />
+    <!-- Content -->
+    <file src="..\build_output\CHANGES.txt" target="tools\"/>
+    <file src="..\build_output\license.txt" target="tools\"/>
+    <file src="..\build_output\tools\protoc-license.txt" target="tools\"/>
+    <!-- Source -->
+    <file src="..\src\ProtocolBuffers\**\*.cs" target="src\ProtocolBuffers\"/>
+    <file src="..\src\ProtocolBuffers.Serialization\**\*.cs" target="src\ProtocolBuffers.Serialization\"/>
+  </files>
+</package>

+ 2 - 0
csharp/build/RunBenchmarks.bat

@@ -0,0 +1,2 @@
+@echo off
+CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo build.csproj /toolsversion:4.0 /t:RunBenchmarks %1 %2 %3 %4

+ 20 - 0
csharp/build/build.bat

@@ -0,0 +1,20 @@
+@echo off
+SET BUILD_VERSION=%~1
+SET BUILD_TARGET=%~2
+SET BUILD_CONFIG=%~3
+
+IF NOT "%BUILD_VERSION%"=="" GOTO RUN
+ECHO.
+ECHO Usage: build.bat platform [target] [config] [msbuild arguments]
+ECHO.
+ECHO - platform:  CF20, CF35, NET20, NET35, NET40, PL40, SL20, SL30, or SL40
+ECHO - [target]:  Rebuild, Clean, Build, Test, or Publish
+ECHO - [config]:  Debug or Release
+ECHO.
+EXIT /B 1
+
+:RUN
+IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild
+IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug
+
+CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo target.csproj /toolsversion:4.0 %4 %5 %6 "/t:%BUILD_TARGET%" "/p:Configuration=%BUILD_CONFIG%;TargetVersion=%BUILD_VERSION%"

+ 241 - 0
csharp/build/build.csproj

@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <!-- build targets -->
+  <Target Name="Clean" DependsOnTargets="_CleanAll" />
+  <Target Name="BuildTools" DependsOnTargets="_BuildTools" />
+  <Target Name="GenerateProjects" DependsOnTargets="_GenerateProjects" />
+  <Target Name="GenerateSource" DependsOnTargets="_GenerateSource;_CopyGeneratedSource" />
+  <Target Name="RebuildSource" DependsOnTargets="Clean;BuildTools;GenerateSource" />
+  <Target Name="Build" DependsOnTargets="GenerateProjects;BuildTools;GenerateSource;_CompileAll" />
+  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
+  <Target Name="GeneratePackage" DependsOnTargets="_PackageAll;_GeneratePackage" />
+  <Target Name="FullBuild" DependsOnTargets="Rebuild;GeneratePackage" />
+  <!-- misc targets -->
+  <Target Name="RunBenchmarks" DependsOnTargets="_CleanAll;_BuildTools;_RunBenchmarks" />
+
+  <PropertyGroup>
+    <ProjectName>Protocol Buffers</ProjectName>
+    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">Any CPU</Platform>
+    
+    <!--Directory Paths-->
+    <ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory>
+    <SourceDirectory>$(ProjectDirectory)\src</SourceDirectory>
+    <LibDirectory>$(ProjectDirectory)\lib</LibDirectory>
+    <ProtosDirectory>$(ProjectDirectory)\protos</ProtosDirectory>
+
+    <SourceTempDirectory>$(ProjectDirectory)\build_temp\GeneratedSource</SourceTempDirectory>
+    <BuildTempDirectory>$(ProjectDirectory)\build_temp</BuildTempDirectory>
+    <BuildOutputDirectory>$(ProjectDirectory)\build_output</BuildOutputDirectory>
+    <BuildOutputPackage>$(BuildOutputDirectory)</BuildOutputPackage>
+
+    <BenchmarkArgs>/v2 /fast /formats</BenchmarkArgs>
+    <BenchmarkOutputFile>$(BuildTempDirectory)\..\BenchmarkResults.txt</BenchmarkOutputFile>
+    <BenchmarkProtosDirectory>$(ProjectDirectory)\benchmarks</BenchmarkProtosDirectory>
+
+    <PackageName Condition=" '$(PackageName)' == '' ">$(Configuration)</PackageName>
+    
+    <!--Tool Paths-->
+    <ProtocExePath>$(BuildOutputDirectory)\tools\protoc.exe</ProtocExePath>
+    <ProtogenExePath>$(BuildOutputDirectory)\tools\protogen.exe</ProtogenExePath>
+    <NUnitExePath>$(LibDirectory)\NUnit\tools\nunit-console.exe</NUnitExePath>
+    <CsProjectProjector>$(LibDirectory)\CsProjectProjector\CsProjectProjector.exe</CsProjectProjector>
+    <ZipExePath>$(LibDirectory)\7-Zip 9.20\7za.exe</ZipExePath>
+  
+</PropertyGroup>
+
+  <Import Project="Common.targets"/>
+
+  <!-- Proto Files -->
+  <ItemGroup>
+    <Protos Include="$(ProtosDirectory)\extest\unittest_issues.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras_full.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras_xmltest.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_generic_services.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_rpc_interop.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_rpc_interop_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\descriptor.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\csharp_options.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_csharp_options.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_custom_options.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_embed_optimize_for.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_empty.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_import.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_import_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_lite_imports_nonlite.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_mset.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_no_generic_services.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_optimize_for.proto" />
+    <Protos Include="$(ProtosDirectory)\google\test\google_size.proto" />
+    <Protos Include="$(ProtosDirectory)\google\test\google_speed.proto" />
+    <Protos Include="$(ProtosDirectory)\tutorial\addressbook.proto" />
+    <!-- for benchmark -->
+    <Protos Include="$(ProtosDirectory)\benchmarks\google_size.proto" />
+    <Protos Include="$(ProtosDirectory)\benchmarks\google_speed.proto" />
+  </ItemGroup>
+  <!-- Generated Source -->
+  <ItemGroup>
+    <!-- Main protos -->
+    <GeneratedSource Include="$(SourceTempDirectory)\CSharpOptions.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers\DescriptorProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\DescriptorProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers\DescriptorProtos</TargetDirectory>
+    </GeneratedSource>
+        
+    <!-- Address book sample -->
+    <GeneratedSource Include="$(SourceTempDirectory)\AddressBookProtos.cs">
+      <TargetDirectory>$(SourceDirectory)\AddressBook</TargetDirectory>
+    </GeneratedSource>
+    <!-- Unit test -->
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasIssuesProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestXmlSerializerTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestCSharpOptionsProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestCustomOptionsProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestEmbedOptimizeForProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestEmptyProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>  
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestMessageSetProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestNoGenericServicesProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestOptimizeForProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestRpcInterop.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestRpcInteropLite.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestGenericServices.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <!-- Lite unit test -->
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasFullProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestLiteImportNonLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestGoogleSizeProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestGoogleSpeedProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\GoogleSizeProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\GoogleSpeedProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory>
+    </GeneratedSource>
+  </ItemGroup>
+  <!-- Package Items -->
+  <ItemGroup>
+    <StaticPackageItem Include="$(ProjectDirectory)\CHANGES.txt" />
+    <StaticPackageItem Include="$(ProjectDirectory)\license.txt" />
+    <StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\descriptor.proto">
+      <TargetDirectory>\protos\google\protobuf</TargetDirectory>
+    </StaticPackageItem>
+    <StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\compiler\plugin.proto">
+      <TargetDirectory>\protos\google\protobuf\compiler</TargetDirectory>
+    </StaticPackageItem>
+    <StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\csharp_options.proto">
+      <TargetDirectory>\protos\google\protobuf</TargetDirectory>
+    </StaticPackageItem>
+    <StaticPackageItem Include="$(ProjectDirectory)\protos\tutorial\addressbook.proto">
+      <TargetDirectory>\protos\tutorial</TargetDirectory>
+    </StaticPackageItem>
+  </ItemGroup>
+  <!-- Tools -->
+  <ItemGroup>
+    <ToolsTestContainer Include="$(SourceDirectory)\ProtoGen.Test\bin\NET35\Release\Google.ProtocolBuffers.ProtoGen.Test.dll" />
+
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtocolBuffers\bin\NET35\Release\Google.ProtocolBuffers.dll" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\NET35\Release\Google.ProtocolBuffers.Serialization.dll" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoGen\bin\NET35\Release\ProtoGen.exe" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoGen\bin\NET35\Release\ProtoGen.exe.config" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoMunge\bin\NET35\Release\ProtoMunge.exe" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoDump\bin\NET35\Release\ProtoDump.exe" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoBench\bin\NET35\Release\ProtoBench.exe" />
+    <ToolsOutputItem Include="$(LibDirectory)\protoc.exe" />
+    <ToolsOutputItem Include="$(LibDirectory)\protoc-license.txt" />
+  </ItemGroup>
+  <!-- Temporary Directories -->
+  <ItemGroup>
+    <TempBuildFolder Include="$(BuildTempDirectory)" />
+    <TempBuildFolder Include="$(BuildOutputDirectory)" />
+    <TempBuildFolder Include="$(SourceDirectory)\AddressBook\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\AddressBook\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoBench\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoBench\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Serialization\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Test\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Test\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffersLite.Test\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoDump\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoDump\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoGen\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoGen\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoGen.Test\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoGen.Test\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoMunge\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoMunge\bin" />
+  </ItemGroup>
+</Project>

+ 248 - 0
csharp/build/googlecode_upload.py

@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, 2007 Google Inc. All Rights Reserved.
+# Author: danderson@google.com (David Anderson)
+#
+# Script for uploading files to a Google Code project.
+#
+# This is intended to be both a useful script for people who want to
+# streamline project uploads and a reference implementation for
+# uploading files to Google Code projects.
+#
+# To upload a file to Google Code, you need to provide a path to the
+# file on your local machine, a small summary of what the file is, a
+# project name, and a valid account that is a member or owner of that
+# project.  You can optionally provide a list of labels that apply to
+# the file.  The file will be uploaded under the same name that it has
+# in your local filesystem (that is, the "basename" or last path
+# component).  Run the script with '--help' to get the exact syntax
+# and available options.
+#
+# Note that the upload script requests that you enter your
+# googlecode.com password.  This is NOT your Gmail account password!
+# This is the password you use on googlecode.com for committing to
+# Subversion and uploading files.  You can find your password by going
+# to http://code.google.com/hosting/settings when logged in with your
+# Gmail account. If you have already committed to your project's
+# Subversion repository, the script will automatically retrieve your
+# credentials from there (unless disabled, see the output of '--help'
+# for details).
+#
+# If you are looking at this script as a reference for implementing
+# your own Google Code file uploader, then you should take a look at
+# the upload() function, which is the meat of the uploader.  You
+# basically need to build a multipart/form-data POST request with the
+# right fields and send it to https://PROJECT.googlecode.com/files .
+# Authenticate the request using HTTP Basic authentication, as is
+# shown below.
+#
+# Licensed under the terms of the Apache Software License 2.0:
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Questions, comments, feature requests and patches are most welcome.
+# Please direct all of these to the Google Code users group:
+#  http://groups.google.com/group/google-code-hosting
+
+"""Google Code file uploader script.
+"""
+
+__author__ = 'danderson@google.com (David Anderson)'
+
+import httplib
+import os.path
+import optparse
+import getpass
+import base64
+import sys
+
+
+def upload(file, project_name, user_name, password, summary, labels=None):
+  """Upload a file to a Google Code project's file server.
+
+  Args:
+    file: The local path to the file.
+    project_name: The name of your project on Google Code.
+    user_name: Your Google account name.
+    password: The googlecode.com password for your account.
+              Note that this is NOT your global Google Account password!
+    summary: A small description for the file.
+    labels: an optional list of label strings with which to tag the file.
+
+  Returns: a tuple:
+    http_status: 201 if the upload succeeded, something else if an
+                 error occured.
+    http_reason: The human-readable string associated with http_status
+    file_url: If the upload succeeded, the URL of the file on Google
+              Code, None otherwise.
+  """
+  # The login is the user part of user@gmail.com. If the login provided
+  # is in the full user@domain form, strip it down.
+  if user_name.endswith('@gmail.com'):
+    user_name = user_name[:user_name.index('@gmail.com')]
+
+  form_fields = [('summary', summary)]
+  if labels is not None:
+    form_fields.extend([('label', l.strip()) for l in labels])
+
+  content_type, body = encode_upload_request(form_fields, file)
+
+  upload_host = '%s.googlecode.com' % project_name
+  upload_uri = '/files'
+  auth_token = base64.b64encode('%s:%s'% (user_name, password))
+  headers = {
+    'Authorization': 'Basic %s' % auth_token,
+    'User-Agent': 'Googlecode.com uploader v0.9.4',
+    'Content-Type': content_type,
+    }
+
+  server = httplib.HTTPSConnection(upload_host)
+  server.request('POST', upload_uri, body, headers)
+  resp = server.getresponse()
+  server.close()
+
+  if resp.status == 201:
+    location = resp.getheader('Location', None)
+  else:
+    location = None
+  return resp.status, resp.reason, location
+
+
+def encode_upload_request(fields, file_path):
+  """Encode the given fields and file into a multipart form body.
+
+  fields is a sequence of (name, value) pairs. file is the path of
+  the file to upload. The file will be uploaded to Google Code with
+  the same file name.
+
+  Returns: (content_type, body) ready for httplib.HTTP instance
+  """
+  BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla'
+  CRLF = '\r\n'
+
+  body = []
+
+  # Add the metadata about the upload first
+  for key, value in fields:
+    body.extend(
+      ['--' + BOUNDARY,
+       'Content-Disposition: form-data; name="%s"' % key,
+       '',
+       value,
+       ])
+
+  # Now add the file itself
+  file_name = os.path.basename(file_path)
+  f = open(file_path, 'rb')
+  file_content = f.read()
+  f.close()
+
+  body.extend(
+    ['--' + BOUNDARY,
+     'Content-Disposition: form-data; name="filename"; filename="%s"'
+     % file_name,
+     # The upload server determines the mime-type, no need to set it.
+     'Content-Type: application/octet-stream',
+     '',
+     file_content,
+     ])
+
+  # Finalize the form body
+  body.extend(['--' + BOUNDARY + '--', ''])
+
+  return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
+
+
+def upload_find_auth(file_path, project_name, summary, labels=None,
+                     user_name=None, password=None, tries=3):
+  """Find credentials and upload a file to a Google Code project's file server.
+
+  file_path, project_name, summary, and labels are passed as-is to upload.
+
+  Args:
+    file_path: The local path to the file.
+    project_name: The name of your project on Google Code.
+    summary: A small description for the file.
+    labels: an optional list of label strings with which to tag the file.
+    config_dir: Path to Subversion configuration directory, 'none', or None.
+    user_name: Your Google account name.
+    tries: How many attempts to make.
+  """
+
+  while tries > 0:
+    if user_name is None:
+      # Read username if not specified or loaded from svn config, or on
+      # subsequent tries.
+      sys.stdout.write('Please enter your googlecode.com username: ')
+      sys.stdout.flush()
+      user_name = sys.stdin.readline().rstrip()
+    if password is None:
+      # Read password if not loaded from svn config, or on subsequent tries.
+      print 'Please enter your googlecode.com password.'
+      print '** Note that this is NOT your Gmail account password! **'
+      print 'It is the password you use to access Subversion repositories,'
+      print 'and can be found here: http://code.google.com/hosting/settings'
+      password = getpass.getpass()
+
+    status, reason, url = upload(file_path, project_name, user_name, password,
+                                 summary, labels)
+    # Returns 403 Forbidden instead of 401 Unauthorized for bad
+    # credentials as of 2007-07-17.
+    if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]:
+      # Rest for another try.
+      user_name = password = None
+      tries = tries - 1
+    else:
+      # We're done.
+      break
+
+  return status, reason, url
+
+
+def main():
+  parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY '
+                                 '-p PROJECT [options] FILE')
+  parser.add_option('-s', '--summary', dest='summary',
+                    help='Short description of the file')
+  parser.add_option('-p', '--project', dest='project',
+                    help='Google Code project name')
+  parser.add_option('-u', '--user', dest='user',
+                    help='Your Google Code username')
+  parser.add_option('-w', '--password', dest='password',
+                    help='Your Google Code password')
+  parser.add_option('-l', '--labels', dest='labels',
+                    help='An optional list of comma-separated labels to attach '
+                    'to the file')
+
+  options, args = parser.parse_args()
+
+  if not options.summary:
+    parser.error('File summary is missing.')
+  elif not options.project:
+    parser.error('Project name is missing.')
+  elif len(args) < 1:
+    parser.error('File to upload not provided.')
+  elif len(args) > 1:
+    parser.error('Only one file may be specified.')
+
+  file_path = args[0]
+
+  if options.labels:
+    labels = options.labels.split(',')
+  else:
+    labels = None
+
+  status, reason, url = upload_find_auth(file_path, options.project,
+                                         options.summary, labels,
+                                         options.user, options.password)
+  if url:
+    print 'The file was uploaded successfully.'
+    print 'URL: %s' % url
+    return 0
+  else:
+    print 'An error occurred. Your file was not uploaded.'
+    print 'Google Code upload server said: %s (%s)' % (reason, status)
+    return 1
+
+
+if __name__ == '__main__':
+  sys.exit(main())

+ 79 - 0
csharp/build/nuspec.xsd

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- original location: https://hg01.codeplex.com/nuget/raw-file/tip/src/Core/Authoring/nuspec.xsd -->
+<xs:schema id="nuspec" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <xs:element name="package">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="metadata" maxOccurs="1" minOccurs="1">
+                    <xs:complexType>
+                        <xs:all>
+                            <xs:element name="id" maxOccurs="1" minOccurs="1" type="xs:string" />
+                            <xs:element name="version" maxOccurs="1" minOccurs="1" type="xs:string" />
+                            <xs:element name="title" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="authors" maxOccurs="1" minOccurs="1" type="xs:string" />
+                            <xs:element name="owners" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="licenseUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" />
+                            <xs:element name="projectUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" />
+                            <xs:element name="iconUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" />
+                            <xs:element name="requireLicenseAcceptance" maxOccurs="1" minOccurs="0" type="xs:boolean" />
+                            <xs:element name="description" maxOccurs="1" minOccurs="1" type="xs:string" />
+                            <xs:element name="summary" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="releaseNotes" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="copyright" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="language" maxOccurs="1" minOccurs="0" type="xs:string" default="en-US" />
+                            <xs:element name="tags" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="dependencies" maxOccurs="1" minOccurs="0">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="dependency" minOccurs="0" maxOccurs="unbounded">
+                                            <xs:complexType>
+                                                <xs:attribute name="id" type="xs:string" use="required" />
+                                                <xs:attribute name="version" type="xs:string" use="optional" />
+                                            </xs:complexType>
+                                        </xs:element>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                            <xs:element name="frameworkAssemblies" maxOccurs="1" minOccurs="0">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="frameworkAssembly" minOccurs="0" maxOccurs="unbounded">
+                                            <xs:complexType>
+                                                <xs:attribute name="assemblyName" type="xs:string" use="required" />
+                                                <xs:attribute name="targetFramework" type="xs:string" use="optional" />
+                                            </xs:complexType>
+                                        </xs:element>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                            <xs:element name="references" maxOccurs="1" minOccurs="0">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="reference" minOccurs="0" maxOccurs="unbounded">
+                                            <xs:complexType>
+                                                <xs:attribute name="file" type="xs:string" use="required" />
+                                            </xs:complexType>
+                                        </xs:element>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:all>
+                    </xs:complexType>
+                </xs:element>
+                <xs:element name="files" minOccurs="0" maxOccurs="1" nillable="true">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="file" minOccurs="0" maxOccurs="unbounded">
+                                <xs:complexType>
+                                    <xs:attribute name="src" use="required" type="xs:string" />
+                                    <xs:attribute name="target" use="optional" type="xs:string" />
+                                    <xs:attribute name="exclude" use="optional" type="xs:string" />
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>

+ 186 - 0
csharp/build/publish.csproj

@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Publish" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <!-- build targets -->
+  <Target Name="Clean" DependsOnTargets="_Clean" />
+  <Target Name="Build" DependsOnTargets="_Clean;_Prerequisites;_StampVersion;_GenerateSource;_Build" />
+  <Target Name="Label" DependsOnTargets="_HgLabel" />
+  <Target Name="Package" DependsOnTargets="_HgPack;_NugetPack" />
+  <Target Name="Prepare" DependsOnTargets="Clean;Build;Label;Package" />
+  <Target Name="PushAll" DependsOnTargets="_HgPush;_NugetPush" />
+  <Target Name="Publish" DependsOnTargets="Prepare;PushAll" />
+
+  <PropertyGroup>
+    <ProjectName>Protocol Buffers</ProjectName>
+    <VersionMajor>2</VersionMajor>
+    <VersionMinor>4</VersionMinor>
+    <VersionBuild>1</VersionBuild>
+    <VersionRevision></VersionRevision>
+    <VersionLabel></VersionLabel>
+
+    <PackagePrefix>protobuf-csharp-port-</PackagePrefix>
+    <PublishDebug>false</PublishDebug>
+    
+    <GoogleUsername></GoogleUsername>
+    <GooglePassword></GooglePassword>
+    
+    <!--Directory Paths-->
+    <ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory>
+    <BuildTempDirectory>$(ProjectDirectory)\build_temp</BuildTempDirectory>
+    <BuildOutputDirectory>$(ProjectDirectory)\build_output</BuildOutputDirectory>
+    <SourceDirectory>$(ProjectDirectory)\src</SourceDirectory>
+    <LibDirectory>$(ProjectDirectory)\lib</LibDirectory>
+    
+    <!-- File Paths -->
+    <SigningKey>$(ProjectDirectory)\release-key\Google.ProtocolBuffers.snk</SigningKey>
+    
+    <!--Tool Paths-->
+    <HgTool>hg.exe</HgTool>
+    <Python>C:\Python25\python.exe</Python>
+    <SnTool>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A@InstallationFolder)Bin\sn.exe</SnTool>
+    <StampVer>$(LibDirectory)\StampVersion.exe</StampVer>
+    <ZipExePath>$(LibDirectory)\7-Zip 9.20\7za.exe</ZipExePath>
+    <NuGet>$(LibDirectory)\NuGet.exe</NuGet>
+    <ProtogenExePath>$(BuildOutputDirectory)\tools\protogen.exe</ProtogenExePath>
+  </PropertyGroup>
+  
+  <!-- Import user settings -->
+  <Import Project="$(MSBuildProjectFullPath).user" Condition="Exists('$(MSBuildProjectFullPath).user')" />
+
+  <!-- Files -->
+  <ItemGroup>
+  </ItemGroup>
+  
+  <!-- Tasks -->
+
+  <Target Name="_Prerequisites" DependsOnTargets="_CheckEnvironment;_ReadVersion" />
+  
+  <Target Name="_Clean">
+    <MSBuild Properties="Configuration=Debug;" Targets="Clean" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="Configuration=Release;" Targets="Clean" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MakeDir Directories="$(BuildTempDirectory)" />
+    <MakeDir Directories="$(BuildOutputDirectory)" />
+  </Target>
+
+  <Target Name="_WriteUserConfig">
+    <ItemGroup>
+      <Lines Include="&lt;Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>" />
+      <Lines Include="  &lt;PropertyGroup>"/>
+      <Lines Include="    &lt;GoogleUsername> (Enter your google-code user/password here) &lt;/GoogleUsername>"/>
+      <Lines Include="    &lt;GooglePassword>&lt;/GooglePassword>"/>
+      <Lines Include="  &lt;/PropertyGroup>" />
+      <Lines Include="&lt;/Project>" />
+    </ItemGroup>
+    <WriteLinesToFile File="$(MSBuildProjectFullPath).user" Lines="@(Lines)" Overwrite="true" Condition="!Exists('$(MSBuildProjectFullPath).user')" />
+    <Exec Command="Notepad.exe $(MSBuildProjectFullPath).user" />
+  </Target>
+  
+  <Target Name="_CheckEnvironment">
+    <!-- Require google credentials -->
+    <CallTarget Targets="_WriteUserConfig" Condition=" '$(GooglePassword)' == '' " />
+    <Error Text="Restart after you verify your credentials in $(MSBuildProjectFullPath).user" Condition=" '$(GooglePassword)' == '' " />
+    <!-- Require Win7.0A SDK to verify strong-name -->
+    <Error Text="Unable to locate Win7SDK Tools: $(SnTool)" Condition="!Exists($(SnTool))" />
+    <!-- Require Python 2.5 installed -->
+    <!-- Error Text="Unable to locate Python 2.5: $(Python)" Condition="!Exists($(Python))" / -->
+    <!-- Require production signing key -->
+    <Exec Command="$(HgTool) clone https://bitbucket.org/rknapp/protobuf-csharp-port-keyfile $(ProjectDirectory)\release-key" Condition="!Exists('$(SigningKey)')" />
+    <Error Text="Unable to locate release signing key: $(SigningKey)" Condition="!Exists($(SigningKey))" />
+  </Target>
+
+  <Target Name="_ReadVersion" Condition=" '$(VersionLabel)' == '' ">
+    <Exec Command="$(HgTool) log -l 1 --template &quot;{rev}&quot; > &quot;$(BuildTempDirectory)\revision.txt&quot;"></Exec>
+    <ReadLinesFromFile File="$(BuildTempDirectory)\revision.txt">
+      <Output TaskParameter="Lines" PropertyName="VersionRevision"/>
+    </ReadLinesFromFile>
+
+    <PropertyGroup>
+      <VersionLabel>$(VersionMajor).$(VersionMinor).$(VersionBuild).$(VersionRevision)</VersionLabel>
+    </PropertyGroup>
+    
+    <Message Text="Building version $(VersionLabel)" Importance="high" />
+  </Target>
+
+  <Target Name="_StampVersion" DependsOnTargets="_Prerequisites">
+    <Exec Command="$(StampVer) /major:$(VersionMajor) /minor:$(VersionMinor) /build:$(VersionBuild) /revision:$(VersionRevision)" WorkingDirectory="$(SourceDirectory)" />
+    <Exec Command="FIND &quot;$(VersionLabel)&quot; ProtocolBuffers\Properties\AssemblyInfo.cs" WorkingDirectory="$(SourceDirectory)" />
+  </Target>
+
+  <Target Name="_GenerateSource" DependsOnTargets="_Prerequisites">
+    <MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="GenerateProjects;BuildTools;GenerateSource" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+    <Exec Command="&quot;$(SnTool)&quot; -T &quot;$(ProtogenExePath)&quot; > signkey.txt" WorkingDirectory="$(BuildTempDirectory)" />
+    <!-- Make sure we are signing with the correct key -->
+    <Exec Command="FIND &quot;55f7125234beb589&quot; signkey.txt" WorkingDirectory="$(BuildTempDirectory)" />
+  </Target>
+  
+  <Target Name="_Build" DependsOnTargets="_Prerequisites">
+    <!-- Release Build -->
+    <MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="_CompileAll" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+    <MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey);PackageName=$(PackagePrefix)$(VersionLabel)-release" Targets="GeneratePackage" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+    <!-- Debug Build -->
+    <MSBuild Condition=" '$(PublishDebug)' == 'true' " Properties="Configuration=Debug;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="_CompileAll" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+    <MSBuild Condition=" '$(PublishDebug)' == 'true' " Properties="Configuration=Debug;AssemblyOriginatorKeyFile=$(SigningKey);PackageName=$(PackagePrefix)$(VersionLabel)-full" Targets="GeneratePackage" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+  </Target>
+
+  <Target Name="_HgPack" DependsOnTargets="_Prerequisites">
+    <Exec Command="$(HgTool) archive $(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-source.zip" WorkingDirectory="$(ProjectDirectory)" />
+  </Target>
+  
+  <Target Name="_HgLabel" DependsOnTargets="_Prerequisites">
+    <Exec Command="$(HgTool) commit -m &quot;version $(VersionLabel)&quot;" WorkingDirectory="$(ProjectDirectory)" />
+    <Exec Command="$(HgTool) tag $(VersionLabel)" WorkingDirectory="$(ProjectDirectory)" />
+  </Target>
+  
+  <Target Name="_HgPush" DependsOnTargets="_Prerequisites">
+    <Exec Command="$(HgTool) push" WorkingDirectory="$(ProjectDirectory)" />
+  </Target>
+
+  <Target Name="_PkgPush" DependsOnTargets="_Prerequisites">
+    <PropertyGroup>
+      <UploadPackage>$(Python) "$(MSBuildProjectDirectory)\googlecode_upload.py" --project protobuf-csharp-port --user "$(GoogleUsername)" --password "$(GooglePassword)"</UploadPackage>
+      
+      <SourcePackage>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-source.zip</SourcePackage>
+      <ReleasePackageBin>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-release-binaries.zip</ReleasePackageBin>
+      <ReleasePackageSyb>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-release-symbols.zip</ReleasePackageSyb>
+      <DebugPackageBin>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-full-binaries.zip</DebugPackageBin>
+      <DebugPackageSyb>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-full-symbols.zip</DebugPackageSyb>
+    </PropertyGroup>
+
+    <Error Condition="!Exists('$(SourcePackage)')" Text="File not found: $(SourcePackage)" />
+    <Error Condition="!Exists('$(ReleasePackageBin)')" Text="File not found: $(ReleasePackageBin)" />
+    <Error Condition="!Exists('$(ReleasePackageSyb)')" Text="File not found: $(ReleasePackageSyb)" />
+    <Error Condition="'$(PublishDebug)' == 'true' And !Exists('$(DebugPackageBin)')" Text="File not found: $(DebugPackageBin)" />
+    <Error Condition="'$(PublishDebug)' == 'true' And !Exists('$(DebugPackageSyb)')" Text="File not found: $(DebugPackageSyb)" />
+
+    <Exec WorkingDirectory="$(ProjectDirectory)"
+          Command="$(UploadPackage) --labels Type-Source,Featured --summary &quot;Version $(VersionLabel) source&quot; $(SourcePackage)" />
+    
+    <Exec WorkingDirectory="$(ProjectDirectory)"
+          Command="$(UploadPackage) --labels Type-Executable,Featured --summary &quot;Version $(VersionLabel) release binaries only&quot; $(ReleasePackageBin)" />
+    <Exec WorkingDirectory="$(ProjectDirectory)"
+          Command="$(UploadPackage) --labels Type-Executable,Featured --summary &quot;Version $(VersionLabel) release binaries and symbols&quot; $(ReleasePackageSyb)" />
+
+    <Exec WorkingDirectory="$(ProjectDirectory)" Condition=" '$(PublishDebug)' == 'true' "
+          Command="$(UploadPackage) --labels Type-Executable,Featured --summary &quot;Version $(VersionLabel) all binaries&quot; $(DebugPackageBin)" />
+    <Exec WorkingDirectory="$(ProjectDirectory)" Condition=" '$(PublishDebug)' == 'true' "
+          Command="$(UploadPackage) --labels Type-Executable,Featured --summary &quot;Version $(VersionLabel) all binaries and symbols&quot; $(DebugPackageSyb)" />
+  </Target>
+
+  <Target Name="_NugetPack" DependsOnTargets="_Prerequisites">
+    <Exec WorkingDirectory="$(MSBuildProjectDirectory)"
+      Command="$(NuGet) update -self" />
+    <Exec WorkingDirectory="$(MSBuildProjectDirectory)"
+      Command="$(NuGet) pack Google.ProtocolBuffers.nuspec -Symbols -Version $(VersionLabel) -NoPackageAnalysis -OutputDirectory $(BuildTempDirectory)" />
+    <Exec WorkingDirectory="$(MSBuildProjectDirectory)"
+      Command="$(NuGet) pack Google.ProtocolBuffersLite.nuspec -Symbols -Version $(VersionLabel) -NoPackageAnalysis -OutputDirectory $(BuildTempDirectory)" />
+  </Target>
+
+  <Target Name="_NugetPush" DependsOnTargets="_Prerequisites">
+    <Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffers.$(VersionLabel).nupkg" ContinueOnError="true" />
+    <Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffersLite.$(VersionLabel).nupkg" ContinueOnError="true" />
+
+    <Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffers.$(VersionLabel).symbols.nupkg" ContinueOnError="true" />
+    <Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffersLite.$(VersionLabel).symbols.nupkg" ContinueOnError="true" />
+  </Target>
+  
+</Project>

+ 167 - 0
csharp/build/target.csproj

@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+<!-- **********************************************************************************************
+High-level Targets
+*********************************************************************************************** -->
+
+  <Target Name="Clean" DependsOnTargets="_Clean" />
+  <Target Name="Build" DependsOnTargets="_Compile;_Test" />
+  <Target Name="Test" DependsOnTargets="_Test" />
+  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
+  <Target Name="Publish" DependsOnTargets="Clean;Build;_Publish" />
+
+  <!-- **********************************************************************************************
+Properties
+*********************************************************************************************** -->
+
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">Any CPU</Platform>
+    <TargetVersion Condition=" '$(TargetVersion)' == '' ">NET20</TargetVersion>
+    <BuildParams></BuildParams>
+
+    <!--Directory Paths-->
+    <ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory>
+    <SourceDirectory>$(ProjectDirectory)\src</SourceDirectory>
+    <LibDirectory>$(ProjectDirectory)\lib</LibDirectory>
+
+    <!--File Paths-->
+    <BuildTempDirectory>$(ProjectDirectory)\build_temp\$(Configuration)\$(TargetVersion)</BuildTempDirectory>
+    <BuildOutputDirectory>$(ProjectDirectory)\build_output\$(Configuration)\$(TargetVersion)</BuildOutputDirectory>
+    <SolutionFile>$(SourceDirectory)\ProtocolBuffersLibrary.$(TargetVersion).sln</SolutionFile>
+
+    <!--Tool Paths-->
+    <NUnitExePath>$(LibDirectory)\NUnit\tools\nunit-console.exe</NUnitExePath>
+    <StatLightExePath>$(LibDirectory)\StatLight\tools\StatLight.exe</StatLightExePath>
+  </PropertyGroup>
+
+<!-- **********************************************************************************************
+Target Versions
+*********************************************************************************************** -->
+
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'NET20' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>NUNIT</TestFramework>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'NET35' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>NUNIT</TestFramework>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'NET40' ">
+    <BuildTools>4.0</BuildTools>
+    <TestFramework>NUNIT</TestFramework>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'CF20' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>NONE</TestFramework>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'CF35' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>NONE</TestFramework>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'SL20' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>SILVERLIGHT</TestFramework>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'SL30' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>SILVERLIGHT</TestFramework>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'SL40' ">
+    <BuildTools>4.0</BuildTools>
+    <TestFramework>SILVERLIGHT</TestFramework>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'PL40' ">
+    <BuildTools>4.0</BuildTools>
+    <TestFramework>SILVERLIGHT</TestFramework>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <BuildOutputDirectory>$(ProjectDirectory)\build_output\$(Configuration)\portable-net40+sl4+sl5+wp7+wp8+win8</BuildOutputDirectory>
+  </PropertyGroup>
+
+<!-- **********************************************************************************************
+File Groups
+*********************************************************************************************** -->
+
+  <ItemGroup>
+    <WorkingDirectories Include="$(BuildTempDirectory)" />
+    <WorkingDirectories Include="$(BuildOutputDirectory)" />
+    
+    <TestContainer Include="$(SourceDirectory)\ProtocolBuffers.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Test.dll" />
+    <TestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Test.dll" />
+    <TestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersMixedLite.Test.dll" />
+
+    <StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffers.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Test.xap" />
+    <StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Test.xap" />
+    <StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersMixedLite.Test.xap" />
+
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.dll" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.pdb" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.xml" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.dll" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.pdb" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.xml" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.dll" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.pdb" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.xml" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.dll" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.pdb" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.xml" />
+  </ItemGroup>
+
+<!-- **********************************************************************************************
+Targets For Build
+*********************************************************************************************** -->
+
+  <Target Name="_Configured">
+    <Message Text="Building $(TargetVersion) for configuration $(Configuration), platform $(Platform)" Importance="normal" />
+    <Error Text="Unknown or missing value for TargetVersion=[value]" Condition=" '$(BuildTools)' == '' " />
+  </Target>
+  
+  <Target Name="_Clean" DependsOnTargets="_Configured">
+    <RemoveDir Directories="@(WorkingDirectories)" Condition="Exists(%(WorkingDirectories.Identity))" />
+    <MSBuild Targets="Clean" Projects="$(SolutionFile)" ToolsVersion="$(BuildTools)"
+             Properties="Configuration=$(Configuration);Platform=$(Platform);"
+             />
+  </Target>
+
+  <Target Name="_Compile" DependsOnTargets="_Configured">
+    <MSBuild Targets="Build" Projects="$(SolutionFile)" ToolsVersion="$(BuildTools)"
+             Properties="Configuration=$(Configuration);Platform=$(Platform);$(BuildParams)"
+             />
+  </Target>
+
+  <Target Name="_Publish" DependsOnTargets="_Configured">
+    <MakeDir Directories="$(BuildOutputDirectory)" />
+    <Copy SourceFiles="@(PublishItem)" DestinationFolder="$(BuildOutputDirectory)" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Test
+*********************************************************************************************** -->
+
+  <Target Name="_Test" DependsOnTargets="_Configured">
+    <MakeDir Directories="$(BuildTempDirectory)" />
+    <CallTarget Targets="_RunNunit" Condition=" '$(TestFramework)'=='NUNIT' " />
+    <CallTarget Targets="_RunStatLight" Condition=" '$(TestFramework)'=='SILVERLIGHT' " />
+  </Target>
+
+  <Target Name="_RunNunit">
+    <Copy SourceFiles="$(LibDirectory)\NUnit-config\nunit-console.$(TargetFrameworkVersion).config" DestinationFiles="$(NUnitExePath).config" />
+    <Exec Command="&quot;$(NUnitExePath)&quot; /nologo /noshadow &quot;%(TestContainer.Identity)&quot; /xml:&quot;$(BuildTempDirectory)\%(TestContainer.Filename).xml&quot;" />
+  </Target>
+
+  <Target Name="_RunStatLight">
+    <Exec
+      Command="&quot;$(StatLightExePath)&quot; -x %(StatLightTestContainer.Identity) --ReportOutputFileType=NUnit --ReportOutputFile=$(BuildTempDirectory)\%(StatLightTestContainer.Filename).xml" />
+  </Target>
+
+</Project>

+ 22 - 0
csharp/buildall.sh

@@ -0,0 +1,22 @@
+#!/bin/bash
+# Use mono to build solution and run all tests.
+
+# Adjust these to reflect the location of nunit-console in your system.
+NUNIT_CONSOLE=nunit-console
+
+# The rest you can leave intact
+CONFIG=Release
+KEYFILE=../keys/Google.ProtocolBuffers.snk  # TODO(jtattermusch): signing!
+SRC=$(dirname $0)/src
+
+set -ex
+
+echo Building the solution.
+xbuild /p:Configuration=$CONFIG $SRC/ProtocolBuffers.sln
+
+echo Running tests.
+$NUNIT_CONSOLE $SRC/ProtocolBuffers.Test/bin/$CONFIG/Google.ProtocolBuffers.Test.dll
+
+$NUNIT_CONSOLE $SRC/ProtocolBuffersLite.Test/bin/$CONFIG/Google.ProtocolBuffersLite.Test.dll
+
+$NUNIT_CONSOLE $SRC/ProtocolBuffersLite.Test/bin/$CONFIG/Google.ProtocolBuffersMixedLite.Test.dll

+ 50 - 0
csharp/generate_protos.sh

@@ -0,0 +1,50 @@
+#!/bin/bash
+# Generates C# source files from .proto files.
+# You first need to make sure protoc has been built (see instructions on
+# building protoc in root of this repository)
+
+set -ex
+
+# cd to repository root
+cd $(dirname $0)/..
+
+# protocol buffer compiler to use
+PROTOC=src/protoc
+
+# Descriptor proto
+#TODO(jtattermusch): generate descriptor.proto
+
+# ProtocolBuffers.Test protos
+$PROTOC -Isrc --csharp_out=csharp/src/ProtocolBuffers.Test/TestProtos \
+    src/google/protobuf/unittest.proto \
+    src/google/protobuf/unittest_custom_options.proto \
+    src/google/protobuf/unittest_drop_unknown_fields.proto \
+    src/google/protobuf/unittest_enormous_descriptor.proto \
+    src/google/protobuf/unittest_import.proto \
+    src/google/protobuf/unittest_import_public.proto \
+    src/google/protobuf/unittest_mset.proto \
+    src/google/protobuf/unittest_optimize_for.proto \
+    src/google/protobuf/unittest_no_field_presence.proto \
+    src/google/protobuf/unknown_enum_test.proto
+
+$PROTOC -Icsharp/protos/extest --csharp_out=csharp/src/ProtocolBuffers.Test/TestProtos \
+    csharp/protos/extest/unittest_extras_xmltest.proto \
+    csharp/protos/extest/unittest_issues.proto
+
+$PROTOC -Ibenchmarks --csharp_out=csharp/src/ProtocolBuffers.Test/TestProtos \
+    benchmarks/google_size.proto \
+    benchmarks/google_speed.proto
+
+# ProtocolBuffersLite.Test protos
+$PROTOC -Isrc --csharp_out=csharp/src/ProtocolBuffersLite.Test/TestProtos \
+    src/google/protobuf/unittest.proto \
+    src/google/protobuf/unittest_import.proto \
+    src/google/protobuf/unittest_import_lite.proto \
+    src/google/protobuf/unittest_import_public.proto \
+    src/google/protobuf/unittest_import_public_lite.proto \
+    src/google/protobuf/unittest_lite.proto \
+    src/google/protobuf/unittest_lite_imports_nonlite.proto
+
+$PROTOC -Icsharp/protos/extest --csharp_out=csharp/src/ProtocolBuffersLite.Test/TestProtos \
+    csharp/protos/extest/unittest_extras_full.proto \
+    csharp/protos/extest/unittest_extras_lite.proto

BIN
csharp/keys/Google.ProtocolBuffers.snk


+ 13 - 0
csharp/keys/generate_new_key.bat

@@ -0,0 +1,13 @@
+@ECHO OFF
+IF EXIST "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe" GOTO FOUND
+goto USEPATH
+
+:FOUND
+"C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe" -k %~dp0\Google.ProtocolBuffers.snk 
+GOTO EXIT
+
+:USEPATH
+sn.exe -k %~dp0\Google.ProtocolBuffers.snk 
+GOTO EXIT
+
+:EXIT

+ 71 - 0
csharp/protos/extest/unittest_extras_full.proto

@@ -0,0 +1,71 @@
+syntax = "proto2";
+
+package protobuf_unittest_extra;
+
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option optimize_for = CODE_SIZE;
+option java_package = "com.google.protobuf";
+
+message TestInteropPerson {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+  repeated int32 codes = 10 [packed=true];
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+
+  repeated PhoneNumber phone = 4;
+  
+  repeated group Addresses = 5 {
+    required string address = 1;
+    optional string address2 = 2;
+    required string city = 3;
+    required string state = 4;
+    required fixed32 zip = 5;
+  }
+
+  extensions 100 to 199;
+}
+
+message  TestInteropEmployeeId {
+  required string number = 1;
+}
+  
+extend TestInteropPerson {
+  // Note: changed from required to optional, as required fields are not
+  // permitted in extensions. (The fact that this was allowed in protogen
+  // before was almost certainly a bug.)
+  optional TestInteropEmployeeId employee_id = 126;
+}
+
+message TestMissingFieldsA {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+  
+  message SubA {
+    required int32 count = 5;
+    repeated string values = 6;
+  }
+  optional SubA testA = 11;
+}
+
+message TestMissingFieldsB {
+  required string name = 1;
+  required int32 id = 2;
+  optional string website = 4;
+  
+  message SubB {
+    repeated string values = 7;
+  }
+  optional SubB testB = 12;
+}

+ 115 - 0
csharp/protos/extest/unittest_extras_lite.proto

@@ -0,0 +1,115 @@
+syntax = "proto2";
+
+package protobuf_unittest_extra;
+
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option optimize_for = LITE_RUNTIME;
+option java_package = "com.google.protobuf";
+
+message TestRequiredLite {
+  required int32 d = 1;
+  required ExtraEnum en = 2 [default = DEFAULT];
+}
+
+enum ExtraEnum {
+  DEFAULT = 10;
+  EXLITE_FOO = 7;
+  EXLITE_BAR = 8;
+  EXLITE_BAZ = 9;
+}
+
+message TestInteropPersonLite {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+  repeated int32 codes = 10 [packed=true];
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+
+  repeated PhoneNumber phone = 4;
+  
+  repeated group Addresses = 5 {
+    required string address = 1;
+    optional string address2 = 2;
+    required string city = 3;
+    required string state = 4;
+    required fixed32 zip = 5;
+  }
+
+  extensions 100 to 199;
+}
+
+message  TestInteropEmployeeIdLite {
+  required string number = 1;
+}
+  
+extend TestInteropPersonLite {
+  // Note: changed from required to optional, as required fields are not
+  // permitted in extensions. (The fact that this was allowed in protogen
+  // before was almost certainly a bug.)
+  optional TestInteropEmployeeIdLite employee_id_lite = 126;
+}
+
+/* Removed from unittest_lite.proto and added back here */
+
+message TestUnpackedExtensionsLite {
+  extensions 1 to max;
+}
+
+message TestUnpackedTypesLite {
+  repeated    int32 unpacked_int32    =  90;
+  repeated    int64 unpacked_int64    =  91;
+  repeated   uint32 unpacked_uint32   =  92;
+  repeated   uint64 unpacked_uint64   =  93;
+  repeated   sint32 unpacked_sint32   =  94;
+  repeated   sint64 unpacked_sint64   =  95;
+  repeated  fixed32 unpacked_fixed32  =  96;
+  repeated  fixed64 unpacked_fixed64  =  97;
+  repeated sfixed32 unpacked_sfixed32 =  98;
+  repeated sfixed64 unpacked_sfixed64 =  99;
+  repeated    float unpacked_float    = 100;
+  repeated   double unpacked_double   = 101;
+  repeated     bool unpacked_bool     = 102;
+  repeated UnpackedTypesForeignEnumLite unpacked_enum  = 103;
+}
+
+extend TestUnpackedExtensionsLite {
+  repeated    int32 unpacked_int32_extension_lite    =  90;
+  repeated    int64 unpacked_int64_extension_lite    =  91;
+  repeated   uint32 unpacked_uint32_extension_lite   =  92;
+  repeated   uint64 unpacked_uint64_extension_lite   =  93;
+  repeated   sint32 unpacked_sint32_extension_lite   =  94;
+  repeated   sint64 unpacked_sint64_extension_lite   =  95;
+  repeated  fixed32 unpacked_fixed32_extension_lite  =  96;
+  repeated  fixed64 unpacked_fixed64_extension_lite  =  97;
+  repeated sfixed32 unpacked_sfixed32_extension_lite =  98;
+  repeated sfixed64 unpacked_sfixed64_extension_lite =  99;
+  repeated    float unpacked_float_extension_lite    = 100;
+  repeated   double unpacked_double_extension_lite   = 101;
+  repeated     bool unpacked_bool_extension_lite     = 102;
+  repeated UnpackedTypesForeignEnumLite unpacked_enum_extension_lite = 103;
+}
+
+enum UnpackedTypesForeignEnumLite {
+  FOREIGN_LITE_FOO = 4;
+  FOREIGN_LITE_BAR = 5;
+  FOREIGN_LITE_BAZ = 6;
+}
+
+message BucketOfBytes {
+    optional bytes value = 1;
+    
+}
+message BucketOfBytesEx {
+    optional bytes value = 1;
+    optional bytes value2 = 255;
+}

+ 53 - 0
csharp/protos/extest/unittest_extras_xmltest.proto

@@ -0,0 +1,53 @@
+syntax = "proto2";
+
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+
+package protobuf_unittest_extra;
+
+option optimize_for = SPEED;
+
+enum EnumOptions {
+  ONE = 0;
+  TWO = 1;
+  THREE = 2;
+}
+
+message TestXmlChild {
+  repeated EnumOptions options = 3;
+  optional bytes binary = 4;
+}
+
+message TestXmlNoFields {
+}
+
+message TestXmlRescursive {
+  optional TestXmlRescursive child = 1;
+}
+
+message TestXmlMessage {
+
+  optional int64 number = 6;
+  repeated int32 numbers = 2;
+  optional string text = 3;
+  repeated string textlines = 700;
+  optional bool valid = 5;
+
+  optional TestXmlChild child = 1;
+  repeated group Children = 401 {
+    repeated EnumOptions options = 3;
+    optional bytes binary = 4;
+  }
+
+extensions 100 to 199;
+}
+
+message  TestXmlExtension {
+  required int32 number = 1;
+}
+
+extend TestXmlMessage {
+  optional EnumOptions extension_enum = 101;
+  optional string extension_text = 102;
+  repeated int32 extension_number = 103 [packed = true];
+  optional TestXmlExtension extension_message = 199;
+}

+ 141 - 0
csharp/protos/extest/unittest_issues.proto

@@ -0,0 +1,141 @@
+syntax = "proto2";
+
+// These proto descriptors have at one time been reported as an issue or defect.
+// They are kept here to replicate the issue, and continue to verify the fix.
+
+// Issue: Non-"Google.Protobuffers" namespace will ensure that protobuffer library types are qualified
+option csharp_namespace = "UnitTest.Issues.TestProtos";
+
+package unittest_issues;
+option optimize_for = SPEED;
+
+// The following is a representative set of features
+/*
+enum EnumOptions {
+    ONE = 0;
+    TWO = 1;
+    THREE = 2;
+}
+
+message TestBasicChild
+{
+    repeated EnumOptions options = 3;
+    optional bytes binary = 4;
+}
+
+message TestBasicNoFields {
+}
+
+message TestBasicRescursive {
+    optional TestBasicRescursive child = 1;
+}
+
+message TestBasicMessage {
+
+    optional int64 number = 6;
+    repeated int32 numbers = 2;
+    optional string text = 3;
+    repeated string textlines = 700;
+    optional bool valid = 5;
+    
+    optional TestBasicChild child = 1;
+    repeated group Children = 401 
+    {
+        repeated EnumOptions options = 3;
+        optional bytes binary = 4;
+    }
+
+    extensions 100 to 199;
+}
+
+message  TestBasicExtension {
+  required int32 number = 1;
+}
+  
+extend TestBasicMessage {
+  optional EnumOptions extension_enum = 101;
+  optional string extension_text = 102;
+  repeated int32 extension_number = 103 [packed = true];
+  optional TestBasicExtension extension_message = 199;
+}
+
+// Issue for non-qualified type reference in new services generation
+option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH;
+
+service TestGenericService {
+  rpc Foo(TestBasicNoFields) returns (TestBasicMessage);
+  rpc Bar(TestBasicNoFields) returns (TestBasicMessage);
+}
+*/
+
+// Old issue 13: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=13
+// New issue 309: https://github.com/google/protobuf/issues/309
+ 
+// message A {
+//    optional int32 _A = 1;
+// }
+
+// message B {
+//    optional int32 B_ = 1;
+// }
+
+//message AB {
+//    optional int32 a_b = 1;
+//}
+
+// Similar issue with numeric names
+// Java code failed too, so probably best for this to be a restriction.
+// See https://github.com/google/protobuf/issues/308
+// message NumberField {
+//    optional int32 _01 = 1;
+// }
+
+// Issue 28: Circular message dependencies result in null defaults for DefaultInstance
+
+message MyMessageAReferenceB {
+    required MyMessageBReferenceA value = 1;
+}
+
+message MyMessageBReferenceA {
+    required MyMessageAReferenceB value = 1;
+}
+
+// issue 19 - negative enum values
+
+enum NegativeEnum {
+    FiveBelow = -5;
+    MinusOne = -1;
+    Zero = 0;
+}
+
+message NegativeEnumMessage { 
+    optional NegativeEnum value = 1;
+    repeated NegativeEnum values = 2;
+    repeated NegativeEnum packed_values = 3 [packed=true];
+}
+
+// Issue 21: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=21
+// Decorate fields with [deprecated=true] as [System.Obsolete]
+
+message DeprecatedChild {
+}
+
+enum DeprecatedEnum {
+    one = 1;
+}
+
+message DeprecatedFieldsMessage {
+    optional int32 PrimitiveValue = 1 [deprecated = true];
+    repeated int32 PrimitiveArray = 2 [deprecated = true];
+
+    optional DeprecatedChild MessageValue = 3 [deprecated = true];
+    repeated DeprecatedChild MessageArray = 4 [deprecated = true];
+
+    optional DeprecatedEnum EnumValue = 5 [deprecated = true];
+    repeated DeprecatedEnum EnumArray = 6 [deprecated = true];
+}
+
+// Issue 45: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=45
+message ItemField {
+  optional int32 item = 1;
+}

+ 136 - 0
csharp/src/AddressBook/AddPerson.cs

@@ -0,0 +1,136 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.IO;
+
+namespace Google.ProtocolBuffers.Examples.AddressBook
+{
+    internal class AddPerson
+    {
+        /// <summary>
+        /// Builds a person based on user input
+        /// </summary>
+        private static Person PromptForAddress(TextReader input, TextWriter output)
+        {
+            Person.Builder person = Person.CreateBuilder();
+
+            output.Write("Enter person ID: ");
+            person.Id = int.Parse(input.ReadLine());
+
+            output.Write("Enter name: ");
+            person.Name = input.ReadLine();
+
+            output.Write("Enter email address (blank for none): ");
+            string email = input.ReadLine();
+            if (email.Length > 0)
+            {
+                person.Email = email;
+            }
+
+            while (true)
+            {
+                output.Write("Enter a phone number (or leave blank to finish): ");
+                string number = input.ReadLine();
+                if (number.Length == 0)
+                {
+                    break;
+                }
+
+                Person.Types.PhoneNumber.Builder phoneNumber =
+                    Person.Types.PhoneNumber.CreateBuilder().SetNumber(number);
+
+                output.Write("Is this a mobile, home, or work phone? ");
+                String type = input.ReadLine();
+                switch (type)
+                {
+                    case "mobile":
+                        phoneNumber.Type = Person.Types.PhoneType.MOBILE;
+                        break;
+                    case "home":
+                        phoneNumber.Type = Person.Types.PhoneType.HOME;
+                        break;
+                    case "work":
+                        phoneNumber.Type = Person.Types.PhoneType.WORK;
+                        break;
+                    default:
+                        output.Write("Unknown phone type. Using default.");
+                        break;
+                }
+
+                person.AddPhone(phoneNumber);
+            }
+            return person.Build();
+        }
+
+        /// <summary>
+        /// Entry point - loads an existing addressbook or creates a new one,
+        /// then writes it back to the file.
+        /// </summary>
+        public static int Main(string[] args)
+        {
+            if (args.Length != 1)
+            {
+                Console.Error.WriteLine("Usage:  AddPerson ADDRESS_BOOK_FILE");
+                return -1;
+            }
+
+            AddressBook.Builder addressBook = AddressBook.CreateBuilder();
+
+            if (File.Exists(args[0]))
+            {
+                using (Stream file = File.OpenRead(args[0]))
+                {
+                    addressBook.MergeFrom(file);
+                }
+            }
+            else
+            {
+                Console.WriteLine("{0}: File not found. Creating a new file.", args[0]);
+            }
+
+            // Add an address.
+            addressBook.AddPerson(PromptForAddress(Console.In, Console.Out));
+
+            // Write the new address book back to disk.
+            using (Stream output = File.OpenWrite(args[0]))
+            {
+                addressBook.Build().WriteTo(output);
+            }
+            return 0;
+        }
+    }
+}

+ 72 - 0
csharp/src/AddressBook/AddressBook.csproj

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{A31F5FB2-4FF3-432A-B35B-5CD203606311}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.Examples.AddressBook</RootNamespace>
+    <AssemblyName>AddressBook</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <StartupObject>Google.ProtocolBuffers.Examples.AddressBook.Program</StartupObject>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AddPerson.cs" />
+    <Compile Include="Addressbook.cs" />
+    <Compile Include="SampleUsage.cs" />
+    <Compile Include="ListPeople.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 1158 - 0
csharp/src/AddressBook/Addressbook.cs

@@ -0,0 +1,1158 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: addressbook.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.Examples.AddressBook {
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class Addressbook {
+
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_tutorial_Person__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.Person, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Builder> internal__static_tutorial_Person__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_tutorial_Person_PhoneNumber__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Builder> internal__static_tutorial_Person_PhoneNumber__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_tutorial_AddressBook__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook, global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.Builder> internal__static_tutorial_AddressBook__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+
+    static Addressbook() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChFhZGRyZXNzYm9vay5wcm90bxIIdHV0b3JpYWwi2gEKBlBlcnNvbhIMCgRu", 
+            "YW1lGAEgAigJEgoKAmlkGAIgAigFEg0KBWVtYWlsGAMgASgJEisKBXBob25l", 
+            "GAQgAygLMhwudHV0b3JpYWwuUGVyc29uLlBob25lTnVtYmVyGk0KC1Bob25l", 
+            "TnVtYmVyEg4KBm51bWJlchgBIAIoCRIuCgR0eXBlGAIgASgOMhoudHV0b3Jp", 
+            "YWwuUGVyc29uLlBob25lVHlwZToESE9NRSIrCglQaG9uZVR5cGUSCgoGTU9C", 
+            "SUxFEAASCAoESE9NRRABEggKBFdPUksQAiIvCgtBZGRyZXNzQm9vaxIgCgZw", 
+            "ZXJzb24YASADKAsyEC50dXRvcmlhbC5QZXJzb25CVwoUY29tLmV4YW1wbGUu", 
+            "dHV0b3JpYWxCEUFkZHJlc3NCb29rUHJvdG9zqgIrR29vZ2xlLlByb3RvY29s", 
+          "QnVmZmVycy5FeGFtcGxlcy5BZGRyZXNzQm9vaw=="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_tutorial_Person__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_tutorial_Person__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.Person, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Builder>(internal__static_tutorial_Person__Descriptor,
+                new string[] { "Name", "Id", "Email", "Phone", });
+        internal__static_tutorial_Person_PhoneNumber__Descriptor = internal__static_tutorial_Person__Descriptor.NestedTypes[0];
+        internal__static_tutorial_Person_PhoneNumber__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Builder>(internal__static_tutorial_Person_PhoneNumber__Descriptor,
+                new string[] { "Number", "Type", });
+        internal__static_tutorial_AddressBook__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_tutorial_AddressBook__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook, global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.Builder>(internal__static_tutorial_AddressBook__Descriptor,
+                new string[] { "Person", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          }, assigner);
+    }
+    #endregion
+
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class Person : pb::GeneratedMessage<Person, Person.Builder> {
+    private Person() { }
+    private static readonly Person defaultInstance = new Person().MakeReadOnly();
+    private static readonly string[] _personFieldNames = new string[] { "email", "id", "name", "phone" };
+    private static readonly uint[] _personFieldTags = new uint[] { 26, 16, 10, 34 };
+    public static Person DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override Person DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override Person ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.internal__static_tutorial_Person__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<Person, Person.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.internal__static_tutorial_Person__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum PhoneType {
+        MOBILE = 0,
+        HOME = 1,
+        WORK = 2,
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class PhoneNumber : pb::GeneratedMessage<PhoneNumber, PhoneNumber.Builder> {
+        private PhoneNumber() { }
+        private static readonly PhoneNumber defaultInstance = new PhoneNumber().MakeReadOnly();
+        private static readonly string[] _phoneNumberFieldNames = new string[] { "number", "type" };
+        private static readonly uint[] _phoneNumberFieldTags = new uint[] { 10, 16 };
+        public static PhoneNumber DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override PhoneNumber DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override PhoneNumber ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.internal__static_tutorial_Person_PhoneNumber__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<PhoneNumber, PhoneNumber.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.internal__static_tutorial_Person_PhoneNumber__FieldAccessorTable; }
+        }
+
+        public const int NumberFieldNumber = 1;
+        private bool hasNumber;
+        private string number_ = "";
+        public bool HasNumber {
+          get { return hasNumber; }
+        }
+        public string Number {
+          get { return number_; }
+        }
+
+        public const int TypeFieldNumber = 2;
+        private bool hasType;
+        private global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType type_ = global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType.HOME;
+        public bool HasType {
+          get { return hasType; }
+        }
+        public global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType Type {
+          get { return type_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            if (!hasNumber) return false;
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _phoneNumberFieldNames;
+          if (hasNumber) {
+            output.WriteString(1, field_names[0], Number);
+          }
+          if (hasType) {
+            output.WriteEnum(2, field_names[1], (int) Type, Type);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasNumber) {
+            size += pb::CodedOutputStream.ComputeStringSize(1, Number);
+          }
+          if (hasType) {
+            size += pb::CodedOutputStream.ComputeEnumSize(2, (int) Type);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static PhoneNumber ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static PhoneNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private PhoneNumber MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(PhoneNumber prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<PhoneNumber, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(PhoneNumber cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private PhoneNumber result;
+
+          private PhoneNumber PrepareBuilder() {
+            if (resultIsReadOnly) {
+              PhoneNumber original = result;
+              result = new PhoneNumber();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override PhoneNumber MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Descriptor; }
+          }
+
+          public override PhoneNumber DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.DefaultInstance; }
+          }
+
+          public override PhoneNumber BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is PhoneNumber) {
+              return MergeFrom((PhoneNumber) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(PhoneNumber other) {
+            if (other == global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasNumber) {
+              Number = other.Number;
+            }
+            if (other.HasType) {
+              Type = other.Type;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_phoneNumberFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _phoneNumberFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasNumber = input.ReadString(ref result.number_);
+                  break;
+                }
+                case 16: {
+                  object unknown;
+                  if(input.ReadEnum(ref result.type_, out unknown)) {
+                    result.hasType = true;
+                  } else if(unknown is int) {
+                    if (unknownFields == null) {
+                      unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                    }
+                    unknownFields.MergeVarintField(2, (ulong)(int)unknown);
+                  }
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasNumber {
+            get { return result.hasNumber; }
+          }
+          public string Number {
+            get { return result.Number; }
+            set { SetNumber(value); }
+          }
+          public Builder SetNumber(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasNumber = true;
+            result.number_ = value;
+            return this;
+          }
+          public Builder ClearNumber() {
+            PrepareBuilder();
+            result.hasNumber = false;
+            result.number_ = "";
+            return this;
+          }
+
+          public bool HasType {
+           get { return result.hasType; }
+          }
+          public global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType Type {
+            get { return result.Type; }
+            set { SetType(value); }
+          }
+          public Builder SetType(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType value) {
+            PrepareBuilder();
+            result.hasType = true;
+            result.type_ = value;
+            return this;
+          }
+          public Builder ClearType() {
+            PrepareBuilder();
+            result.hasType = false;
+            result.type_ = global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType.HOME;
+            return this;
+          }
+        }
+        static PhoneNumber() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int NameFieldNumber = 1;
+    private bool hasName;
+    private string name_ = "";
+    public bool HasName {
+      get { return hasName; }
+    }
+    public string Name {
+      get { return name_; }
+    }
+
+    public const int IdFieldNumber = 2;
+    private bool hasId;
+    private int id_;
+    public bool HasId {
+      get { return hasId; }
+    }
+    public int Id {
+      get { return id_; }
+    }
+
+    public const int EmailFieldNumber = 3;
+    private bool hasEmail;
+    private string email_ = "";
+    public bool HasEmail {
+      get { return hasEmail; }
+    }
+    public string Email {
+      get { return email_; }
+    }
+
+    public const int PhoneFieldNumber = 4;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber> phone_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber>();
+    public scg::IList<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber> PhoneList {
+      get { return phone_; }
+    }
+    public int PhoneCount {
+      get { return phone_.Count; }
+    }
+    public global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber GetPhone(int index) {
+      return phone_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!hasName) return false;
+        if (!hasId) return false;
+        foreach (global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber element in PhoneList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _personFieldNames;
+      if (hasName) {
+        output.WriteString(1, field_names[2], Name);
+      }
+      if (hasId) {
+        output.WriteInt32(2, field_names[1], Id);
+      }
+      if (hasEmail) {
+        output.WriteString(3, field_names[0], Email);
+      }
+      if (phone_.Count > 0) {
+        output.WriteMessageArray(4, field_names[3], phone_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasName) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+      }
+      if (hasId) {
+        size += pb::CodedOutputStream.ComputeInt32Size(2, Id);
+      }
+      if (hasEmail) {
+        size += pb::CodedOutputStream.ComputeStringSize(3, Email);
+      }
+      foreach (global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber element in PhoneList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(4, element);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static Person ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Person ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Person ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Person ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Person ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Person ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Person ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static Person ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static Person ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Person ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private Person MakeReadOnly() {
+      phone_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(Person prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<Person, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(Person cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private Person result;
+
+      private Person PrepareBuilder() {
+        if (resultIsReadOnly) {
+          Person original = result;
+          result = new Person();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override Person MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.Examples.AddressBook.Person.Descriptor; }
+      }
+
+      public override Person DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.Examples.AddressBook.Person.DefaultInstance; }
+      }
+
+      public override Person BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is Person) {
+          return MergeFrom((Person) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(Person other) {
+        if (other == global::Google.ProtocolBuffers.Examples.AddressBook.Person.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasName) {
+          Name = other.Name;
+        }
+        if (other.HasId) {
+          Id = other.Id;
+        }
+        if (other.HasEmail) {
+          Email = other.Email;
+        }
+        if (other.phone_.Count != 0) {
+          result.phone_.Add(other.phone_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_personFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _personFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasName = input.ReadString(ref result.name_);
+              break;
+            }
+            case 16: {
+              result.hasId = input.ReadInt32(ref result.id_);
+              break;
+            }
+            case 26: {
+              result.hasEmail = input.ReadString(ref result.email_);
+              break;
+            }
+            case 34: {
+              input.ReadMessageArray(tag, field_name, result.phone_, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.DefaultInstance, extensionRegistry);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasName {
+        get { return result.hasName; }
+      }
+      public string Name {
+        get { return result.Name; }
+        set { SetName(value); }
+      }
+      public Builder SetName(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasName = true;
+        result.name_ = value;
+        return this;
+      }
+      public Builder ClearName() {
+        PrepareBuilder();
+        result.hasName = false;
+        result.name_ = "";
+        return this;
+      }
+
+      public bool HasId {
+        get { return result.hasId; }
+      }
+      public int Id {
+        get { return result.Id; }
+        set { SetId(value); }
+      }
+      public Builder SetId(int value) {
+        PrepareBuilder();
+        result.hasId = true;
+        result.id_ = value;
+        return this;
+      }
+      public Builder ClearId() {
+        PrepareBuilder();
+        result.hasId = false;
+        result.id_ = 0;
+        return this;
+      }
+
+      public bool HasEmail {
+        get { return result.hasEmail; }
+      }
+      public string Email {
+        get { return result.Email; }
+        set { SetEmail(value); }
+      }
+      public Builder SetEmail(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasEmail = true;
+        result.email_ = value;
+        return this;
+      }
+      public Builder ClearEmail() {
+        PrepareBuilder();
+        result.hasEmail = false;
+        result.email_ = "";
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber> PhoneList {
+        get { return PrepareBuilder().phone_; }
+      }
+      public int PhoneCount {
+        get { return result.PhoneCount; }
+      }
+      public global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber GetPhone(int index) {
+        return result.GetPhone(index);
+      }
+      public Builder SetPhone(int index, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.phone_[index] = value;
+        return this;
+      }
+      public Builder SetPhone(int index, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.phone_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddPhone(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.phone_.Add(value);
+        return this;
+      }
+      public Builder AddPhone(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.phone_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangePhone(scg::IEnumerable<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber> values) {
+        PrepareBuilder();
+        result.phone_.Add(values);
+        return this;
+      }
+      public Builder ClearPhone() {
+        PrepareBuilder();
+        result.phone_.Clear();
+        return this;
+      }
+    }
+    static Person() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class AddressBook : pb::GeneratedMessage<AddressBook, AddressBook.Builder> {
+    private AddressBook() { }
+    private static readonly AddressBook defaultInstance = new AddressBook().MakeReadOnly();
+    private static readonly string[] _addressBookFieldNames = new string[] { "person" };
+    private static readonly uint[] _addressBookFieldTags = new uint[] { 10 };
+    public static AddressBook DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override AddressBook DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override AddressBook ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.internal__static_tutorial_AddressBook__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<AddressBook, AddressBook.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.internal__static_tutorial_AddressBook__FieldAccessorTable; }
+    }
+
+    public const int PersonFieldNumber = 1;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person> person_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person>();
+    public scg::IList<global::Google.ProtocolBuffers.Examples.AddressBook.Person> PersonList {
+      get { return person_; }
+    }
+    public int PersonCount {
+      get { return person_.Count; }
+    }
+    public global::Google.ProtocolBuffers.Examples.AddressBook.Person GetPerson(int index) {
+      return person_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        foreach (global::Google.ProtocolBuffers.Examples.AddressBook.Person element in PersonList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _addressBookFieldNames;
+      if (person_.Count > 0) {
+        output.WriteMessageArray(1, field_names[0], person_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      foreach (global::Google.ProtocolBuffers.Examples.AddressBook.Person element in PersonList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(1, element);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static AddressBook ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static AddressBook ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static AddressBook ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static AddressBook ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private AddressBook MakeReadOnly() {
+      person_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(AddressBook prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<AddressBook, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(AddressBook cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private AddressBook result;
+
+      private AddressBook PrepareBuilder() {
+        if (resultIsReadOnly) {
+          AddressBook original = result;
+          result = new AddressBook();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override AddressBook MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.Descriptor; }
+      }
+
+      public override AddressBook DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.DefaultInstance; }
+      }
+
+      public override AddressBook BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is AddressBook) {
+          return MergeFrom((AddressBook) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(AddressBook other) {
+        if (other == global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.person_.Count != 0) {
+          result.person_.Add(other.person_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_addressBookFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _addressBookFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              input.ReadMessageArray(tag, field_name, result.person_, global::Google.ProtocolBuffers.Examples.AddressBook.Person.DefaultInstance, extensionRegistry);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person> PersonList {
+        get { return PrepareBuilder().person_; }
+      }
+      public int PersonCount {
+        get { return result.PersonCount; }
+      }
+      public global::Google.ProtocolBuffers.Examples.AddressBook.Person GetPerson(int index) {
+        return result.GetPerson(index);
+      }
+      public Builder SetPerson(int index, global::Google.ProtocolBuffers.Examples.AddressBook.Person value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.person_[index] = value;
+        return this;
+      }
+      public Builder SetPerson(int index, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.person_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddPerson(global::Google.ProtocolBuffers.Examples.AddressBook.Person value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.person_.Add(value);
+        return this;
+      }
+      public Builder AddPerson(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.person_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangePerson(scg::IEnumerable<global::Google.ProtocolBuffers.Examples.AddressBook.Person> values) {
+        PrepareBuilder();
+        result.person_.Add(values);
+        return this;
+      }
+      public Builder ClearPerson() {
+        PrepareBuilder();
+        result.person_.Clear();
+        return this;
+      }
+    }
+    static AddressBook() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.Examples.AddressBook.Addressbook.Descriptor, null);
+    }
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code

+ 103 - 0
csharp/src/AddressBook/ListPeople.cs

@@ -0,0 +1,103 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.IO;
+
+namespace Google.ProtocolBuffers.Examples.AddressBook
+{
+    internal class ListPeople
+    {
+        /// <summary>
+        /// Iterates though all people in the AddressBook and prints info about them.
+        /// </summary>
+        private static void Print(AddressBook addressBook)
+        {
+            foreach (Person person in addressBook.PersonList)
+            {
+                Console.WriteLine("Person ID: {0}", person.Id);
+                Console.WriteLine("  Name: {0}", person.Name);
+                if (person.HasEmail)
+                {
+                    Console.WriteLine("  E-mail address: {0}", person.Email);
+                }
+
+                foreach (Person.Types.PhoneNumber phoneNumber in person.PhoneList)
+                {
+                    switch (phoneNumber.Type)
+                    {
+                        case Person.Types.PhoneType.MOBILE:
+                            Console.Write("  Mobile phone #: ");
+                            break;
+                        case Person.Types.PhoneType.HOME:
+                            Console.Write("  Home phone #: ");
+                            break;
+                        case Person.Types.PhoneType.WORK:
+                            Console.Write("  Work phone #: ");
+                            break;
+                    }
+                    Console.WriteLine(phoneNumber.Number);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Entry point - loads the addressbook and then displays it.
+        /// </summary>
+        public static int Main(string[] args)
+        {
+            if (args.Length != 1)
+            {
+                Console.Error.WriteLine("Usage:  ListPeople ADDRESS_BOOK_FILE");
+                return 1;
+            }
+
+            if (!File.Exists(args[0]))
+            {
+                Console.WriteLine("{0} doesn't exist. Add a person to create the file first.", args[0]);
+                return 0;
+            }
+
+            // Read the existing address book.
+            using (Stream stream = File.OpenRead(args[0]))
+            {
+                AddressBook addressBook = AddressBook.ParseFrom(stream);
+                Print(addressBook);
+            }
+            return 0;
+        }
+    }
+}

+ 99 - 0
csharp/src/AddressBook/Program.cs

@@ -0,0 +1,99 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+
+namespace Google.ProtocolBuffers.Examples.AddressBook
+{
+    /// <summary>
+    /// Entry point. Repeatedly prompts user for an action to take, delegating actual behaviour
+    /// to individual actions. Each action has its own Main method, so that it can be used as an
+    /// invidual complete program.
+    /// </summary>
+    internal class Program
+    {
+        private static int Main(string[] args)
+        {
+            if (args.Length > 1)
+            {
+                Console.Error.WriteLine("Usage: AddressBook [file]");
+                Console.Error.WriteLine("If the filename isn't specified, \"addressbook.data\" is used instead.");
+                return 1;
+            }
+            string addressBookFile = args.Length > 0 ? args[0] : "addressbook.data";
+
+            bool stopping = false;
+            while (!stopping)
+            {
+                Console.WriteLine("Options:");
+                Console.WriteLine("  L: List contents");
+                Console.WriteLine("  A: Add new person");
+                Console.WriteLine("  Q: Quit");
+                Console.Write("Action? ");
+                Console.Out.Flush();
+                char choice = Console.ReadKey().KeyChar;
+                Console.WriteLine();
+                try
+                {
+                    switch (choice)
+                    {
+                        case 'A':
+                        case 'a':
+                            AddPerson.Main(new string[] {addressBookFile});
+                            break;
+                        case 'L':
+                        case 'l':
+                            ListPeople.Main(new string[] {addressBookFile});
+                            break;
+                        case 'Q':
+                        case 'q':
+                            stopping = true;
+                            break;
+                        default:
+                            Console.WriteLine("Unknown option: {0}", choice);
+                            break;
+                    }
+                }
+                catch (Exception e)
+                {
+                    Console.WriteLine("Exception executing action: {0}", e);
+                }
+                Console.WriteLine();
+            }
+            return 0;
+        }
+    }
+}

+ 29 - 0
csharp/src/AddressBook/Properties/AssemblyInfo.cs

@@ -0,0 +1,29 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("AddressBook")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("AddressBook")]
+[assembly: AssemblyCopyright("Copyright ©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+[assembly: AssemblyFileVersion("2.4.1.555")]

+ 44 - 0
csharp/src/AddressBook/SampleUsage.cs

@@ -0,0 +1,44 @@
+using System;
+using System.IO;
+
+namespace Google.ProtocolBuffers.Examples.AddressBook
+{
+    internal class SampleUsage
+    {
+        private static void Main()
+        {
+            byte[] bytes;
+            //Create a builder to start building a message
+            Person.Builder newContact = Person.CreateBuilder();
+            //Set the primitive properties
+            newContact.SetId(1)
+                .SetName("Foo")
+                .SetEmail("foo@bar");
+            //Now add an item to a list (repeating) field
+            newContact.AddPhone(
+                //Create the child message inline
+                Person.Types.PhoneNumber.CreateBuilder().SetNumber("555-1212").Build()
+                );
+            //Now build the final message:
+            Person person = newContact.Build();
+            //The builder is no longer valid (at least not now, scheduled for 2.4):
+            newContact = null;
+            using (MemoryStream stream = new MemoryStream())
+            {
+                //Save the person to a stream
+                person.WriteTo(stream);
+                bytes = stream.ToArray();
+            }
+            //Create another builder, merge the byte[], and build the message:
+            Person copy = Person.CreateBuilder().MergeFrom(bytes).Build();
+
+            //A more streamlined approach might look like this:
+            bytes = AddressBook.CreateBuilder().AddPerson(copy).Build().ToByteArray();
+            //And read the address book back again
+            AddressBook restored = AddressBook.CreateBuilder().MergeFrom(bytes).Build();
+            //The message performs a deep-comparison on equality:
+            if (restored.PersonCount != 1 || !person.Equals(restored.PersonList[0]))
+                throw new ApplicationException("There is a bad person in here!");
+        }
+    }
+}

+ 3 - 0
csharp/src/AddressBook/app.config

@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+	<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration>

+ 4569 - 0
csharp/src/ProtoBench/GoogleSize.cs

@@ -0,0 +1,4569 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google_size.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class GoogleSize {
+
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage1, global::Google.ProtocolBuffers.TestProtos.SizeMessage1.Builder> internal__static_benchmarks_SizeMessage1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage1SubMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.Builder> internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Builder> internal__static_benchmarks_SizeMessage2__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2_Group1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Builder> internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.Builder> internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+
+    static GoogleSize() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChFnb29nbGVfc2l6ZS5wcm90bxIKYmVuY2htYXJrcyL2BgoMU2l6ZU1lc3Nh", 
+            "Z2UxEg4KBmZpZWxkMRgBIAIoCRIOCgZmaWVsZDkYCSABKAkSDwoHZmllbGQx", 
+            "OBgSIAEoCRIWCgdmaWVsZDgwGFAgASgIOgVmYWxzZRIVCgdmaWVsZDgxGFEg", 
+            "ASgIOgR0cnVlEg4KBmZpZWxkMhgCIAIoBRIOCgZmaWVsZDMYAyACKAUSEQoI", 
+            "ZmllbGQyODAYmAIgASgFEhEKBmZpZWxkNhgGIAEoBToBMBIPCgdmaWVsZDIy", 
+            "GBYgASgDEg4KBmZpZWxkNBgEIAEoCRIOCgZmaWVsZDUYBSADKAYSFgoHZmll", 
+            "bGQ1ORg7IAEoCDoFZmFsc2USDgoGZmllbGQ3GAcgASgJEg8KB2ZpZWxkMTYY", 
+            "ECABKAUSFAoIZmllbGQxMzAYggEgASgFOgEwEhUKB2ZpZWxkMTIYDCABKAg6", 
+            "BHRydWUSFQoHZmllbGQxNxgRIAEoCDoEdHJ1ZRIVCgdmaWVsZDEzGA0gASgI", 
+            "OgR0cnVlEhUKB2ZpZWxkMTQYDiABKAg6BHRydWUSEwoIZmllbGQxMDQYaCAB", 
+            "KAU6ATASEwoIZmllbGQxMDAYZCABKAU6ATASEwoIZmllbGQxMDEYZSABKAU6", 
+            "ATASEAoIZmllbGQxMDIYZiABKAkSEAoIZmllbGQxMDMYZyABKAkSEgoHZmll", 
+            "bGQyORgdIAEoBToBMBIWCgdmaWVsZDMwGB4gASgIOgVmYWxzZRITCgdmaWVs", 
+            "ZDYwGDwgASgFOgItMRIVCghmaWVsZDI3MRiPAiABKAU6Ai0xEhUKCGZpZWxk", 
+            "MjcyGJACIAEoBToCLTESEQoIZmllbGQxNTAYlgEgASgFEhIKB2ZpZWxkMjMY", 
+            "FyABKAU6ATASFgoHZmllbGQyNBgYIAEoCDoFZmFsc2USEgoHZmllbGQyNRgZ", 
+            "IAEoBToBMBIzCgdmaWVsZDE1GA8gASgLMiIuYmVuY2htYXJrcy5TaXplTWVz", 
+            "c2FnZTFTdWJNZXNzYWdlEg8KB2ZpZWxkNzgYTiABKAgSEgoHZmllbGQ2NxhD", 
+            "IAEoBToBMBIPCgdmaWVsZDY4GEQgASgFEhQKCGZpZWxkMTI4GIABIAEoBToB", 
+            "MBIoCghmaWVsZDEyORiBASABKAk6FXh4eHh4eHh4eHh4eHh4eHh4eHh4eBIU", 
+            "CghmaWVsZDEzMRiDASABKAU6ATAioQMKFlNpemVNZXNzYWdlMVN1Yk1lc3Nh", 
+            "Z2USEQoGZmllbGQxGAEgASgFOgEwEhEKBmZpZWxkMhgCIAEoBToBMBIRCgZm", 
+            "aWVsZDMYAyABKAU6ATASDwoHZmllbGQxNRgPIAEoCRIVCgdmaWVsZDEyGAwg", 
+            "ASgIOgR0cnVlEg8KB2ZpZWxkMTMYDSABKAMSDwoHZmllbGQxNBgOIAEoAxIP", 
+            "CgdmaWVsZDE2GBAgASgFEhIKB2ZpZWxkMTkYEyABKAU6ATISFQoHZmllbGQy", 
+            "MBgUIAEoCDoEdHJ1ZRIVCgdmaWVsZDI4GBwgASgIOgR0cnVlEg8KB2ZpZWxk", 
+            "MjEYFSABKAYSDwoHZmllbGQyMhgWIAEoBRIWCgdmaWVsZDIzGBcgASgIOgVm", 
+            "YWxzZRIYCghmaWVsZDIwNhjOASABKAg6BWZhbHNlEhEKCGZpZWxkMjAzGMsB", 
+            "IAEoBxIRCghmaWVsZDIwNBjMASABKAUSEQoIZmllbGQyMDUYzQEgASgJEhEK", 
+            "CGZpZWxkMjA3GM8BIAEoBBIRCghmaWVsZDMwMBisAiABKAQixwcKDFNpemVN", 
+            "ZXNzYWdlMhIOCgZmaWVsZDEYASABKAkSDgoGZmllbGQzGAMgASgDEg4KBmZp", 
+            "ZWxkNBgEIAEoAxIPCgdmaWVsZDMwGB4gASgDEhYKB2ZpZWxkNzUYSyABKAg6", 
+            "BWZhbHNlEg4KBmZpZWxkNhgGIAEoCRIOCgZmaWVsZDIYAiABKAwSEgoHZmll", 
+            "bGQyMRgVIAEoBToBMBIPCgdmaWVsZDcxGEcgASgFEg8KB2ZpZWxkMjUYGSAB", 
+            "KAISEwoIZmllbGQxMDkYbSABKAU6ATASFAoIZmllbGQyMTAY0gEgASgFOgEw", 
+            "EhQKCGZpZWxkMjExGNMBIAEoBToBMBIUCghmaWVsZDIxMhjUASABKAU6ATAS", 
+            "FAoIZmllbGQyMTMY1QEgASgFOgEwEhQKCGZpZWxkMjE2GNgBIAEoBToBMBIU", 
+            "CghmaWVsZDIxNxjZASABKAU6ATASFAoIZmllbGQyMTgY2gEgASgFOgEwEhQK", 
+            "CGZpZWxkMjIwGNwBIAEoBToBMBIUCghmaWVsZDIyMRjdASABKAU6ATASFAoI", 
+            "ZmllbGQyMjIY3gEgASgCOgEwEg8KB2ZpZWxkNjMYPyABKAUSLwoGZ3JvdXAx", 
+            "GAogAygKMh8uYmVuY2htYXJrcy5TaXplTWVzc2FnZTIuR3JvdXAxEhEKCGZp", 
+            "ZWxkMTI4GIABIAMoCRIRCghmaWVsZDEzMRiDASABKAMSEAoIZmllbGQxMjcY", 
+            "fyADKAkSEQoIZmllbGQxMjkYgQEgASgFEhEKCGZpZWxkMTMwGIIBIAMoAxIY", 
+            "CghmaWVsZDIwNRjNASABKAg6BWZhbHNlEhgKCGZpZWxkMjA2GM4BIAEoCDoF", 
+            "ZmFsc2UawgIKBkdyb3VwMRIPCgdmaWVsZDExGAsgAigCEg8KB2ZpZWxkMjYY", 
+            "GiABKAISDwoHZmllbGQxMhgMIAEoCRIPCgdmaWVsZDEzGA0gASgJEg8KB2Zp", 
+            "ZWxkMTQYDiADKAkSDwoHZmllbGQxNRgPIAIoBBIOCgZmaWVsZDUYBSABKAUS", 
+            "DwoHZmllbGQyNxgbIAEoCRIPCgdmaWVsZDI4GBwgASgFEg8KB2ZpZWxkMjkY", 
+            "HSABKAkSDwoHZmllbGQxNhgQIAEoCRIPCgdmaWVsZDIyGBYgAygJEg8KB2Zp", 
+            "ZWxkNzMYSSADKAUSEgoHZmllbGQyMBgUIAEoBToBMBIPCgdmaWVsZDI0GBgg", 
+            "ASgJEjcKB2ZpZWxkMzEYHyABKAsyJi5iZW5jaG1hcmtzLlNpemVNZXNzYWdl", 
+            "Mkdyb3VwZWRNZXNzYWdlIt4BChpTaXplTWVzc2FnZTJHcm91cGVkTWVzc2Fn", 
+            "ZRIOCgZmaWVsZDEYASABKAISDgoGZmllbGQyGAIgASgCEhEKBmZpZWxkMxgD", 
+            "IAEoAjoBMBIOCgZmaWVsZDQYBCABKAgSDgoGZmllbGQ1GAUgASgIEhQKBmZp", 
+            "ZWxkNhgGIAEoCDoEdHJ1ZRIVCgZmaWVsZDcYByABKAg6BWZhbHNlEg4KBmZp", 
+            "ZWxkOBgIIAEoAhIOCgZmaWVsZDkYCSABKAgSDwoHZmllbGQxMBgKIAEoAhIP", 
+            "CgdmaWVsZDExGAsgASgDQjJCCkdvb2dsZVNpemVIAqoCIUdvb2dsZS5Qcm90", 
+          "b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcw=="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_benchmarks_SizeMessage1__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_benchmarks_SizeMessage1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage1, global::Google.ProtocolBuffers.TestProtos.SizeMessage1.Builder>(internal__static_benchmarks_SizeMessage1__Descriptor,
+                new string[] { "Field1", "Field9", "Field18", "Field80", "Field81", "Field2", "Field3", "Field280", "Field6", "Field22", "Field4", "Field5", "Field59", "Field7", "Field16", "Field130", "Field12", "Field17", "Field13", "Field14", "Field104", "Field100", "Field101", "Field102", "Field103", "Field29", "Field30", "Field60", "Field271", "Field272", "Field150", "Field23", "Field24", "Field25", "Field15", "Field78", "Field67", "Field68", "Field128", "Field129", "Field131", });
+        internal__static_benchmarks_SizeMessage1SubMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.Builder>(internal__static_benchmarks_SizeMessage1SubMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300", });
+        internal__static_benchmarks_SizeMessage2__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_benchmarks_SizeMessage2__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Builder>(internal__static_benchmarks_SizeMessage2__Descriptor,
+                new string[] { "Field1", "Field3", "Field4", "Field30", "Field75", "Field6", "Field2", "Field21", "Field71", "Field25", "Field109", "Field210", "Field211", "Field212", "Field213", "Field216", "Field217", "Field218", "Field220", "Field221", "Field222", "Field63", "Group1", "Field128", "Field131", "Field127", "Field129", "Field130", "Field205", "Field206", });
+        internal__static_benchmarks_SizeMessage2_Group1__Descriptor = internal__static_benchmarks_SizeMessage2__Descriptor.NestedTypes[0];
+        internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Builder>(internal__static_benchmarks_SizeMessage2_Group1__Descriptor,
+                new string[] { "Field11", "Field26", "Field12", "Field13", "Field14", "Field15", "Field5", "Field27", "Field28", "Field29", "Field16", "Field22", "Field73", "Field20", "Field24", "Field31", });
+        internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.Builder>(internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field4", "Field5", "Field6", "Field7", "Field8", "Field9", "Field10", "Field11", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          }, assigner);
+    }
+    #endregion
+
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SizeMessage1 : pb::GeneratedMessage<SizeMessage1, SizeMessage1.Builder> {
+    private SizeMessage1() { }
+    private static readonly SizeMessage1 defaultInstance = new SizeMessage1().MakeReadOnly();
+    public static SizeMessage1 DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SizeMessage1 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SizeMessage1 ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage1__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage1, SizeMessage1.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage1__FieldAccessorTable; }
+    }
+
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private string field9_ = "";
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public string Field9 {
+      get { return field9_; }
+    }
+
+    public const int Field18FieldNumber = 18;
+    private bool hasField18;
+    private string field18_ = "";
+    public bool HasField18 {
+      get { return hasField18; }
+    }
+    public string Field18 {
+      get { return field18_; }
+    }
+
+    public const int Field80FieldNumber = 80;
+    private bool hasField80;
+    private bool field80_;
+    public bool HasField80 {
+      get { return hasField80; }
+    }
+    public bool Field80 {
+      get { return field80_; }
+    }
+
+    public const int Field81FieldNumber = 81;
+    private bool hasField81;
+    private bool field81_ = true;
+    public bool HasField81 {
+      get { return hasField81; }
+    }
+    public bool Field81 {
+      get { return field81_; }
+    }
+
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+
+    public const int Field280FieldNumber = 280;
+    private bool hasField280;
+    private int field280_;
+    public bool HasField280 {
+      get { return hasField280; }
+    }
+    public int Field280 {
+      get { return field280_; }
+    }
+
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private int field6_;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public int Field6 {
+      get { return field6_; }
+    }
+
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private long field22_;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public long Field22 {
+      get { return field22_; }
+    }
+
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private string field4_ = "";
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public string Field4 {
+      get { return field4_; }
+    }
+
+    public const int Field5FieldNumber = 5;
+    private pbc::PopsicleList<ulong> field5_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> Field5List {
+      get { return pbc::Lists.AsReadOnly(field5_); }
+    }
+    public int Field5Count {
+      get { return field5_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetField5(int index) {
+      return field5_[index];
+    }
+
+    public const int Field59FieldNumber = 59;
+    private bool hasField59;
+    private bool field59_;
+    public bool HasField59 {
+      get { return hasField59; }
+    }
+    public bool Field59 {
+      get { return field59_; }
+    }
+
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private string field7_ = "";
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public string Field7 {
+      get { return field7_; }
+    }
+
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+
+    public const int Field130FieldNumber = 130;
+    private bool hasField130;
+    private int field130_;
+    public bool HasField130 {
+      get { return hasField130; }
+    }
+    public int Field130 {
+      get { return field130_; }
+    }
+
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+
+    public const int Field17FieldNumber = 17;
+    private bool hasField17;
+    private bool field17_ = true;
+    public bool HasField17 {
+      get { return hasField17; }
+    }
+    public bool Field17 {
+      get { return field17_; }
+    }
+
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private bool field13_ = true;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public bool Field13 {
+      get { return field13_; }
+    }
+
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private bool field14_ = true;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public bool Field14 {
+      get { return field14_; }
+    }
+
+    public const int Field104FieldNumber = 104;
+    private bool hasField104;
+    private int field104_;
+    public bool HasField104 {
+      get { return hasField104; }
+    }
+    public int Field104 {
+      get { return field104_; }
+    }
+
+    public const int Field100FieldNumber = 100;
+    private bool hasField100;
+    private int field100_;
+    public bool HasField100 {
+      get { return hasField100; }
+    }
+    public int Field100 {
+      get { return field100_; }
+    }
+
+    public const int Field101FieldNumber = 101;
+    private bool hasField101;
+    private int field101_;
+    public bool HasField101 {
+      get { return hasField101; }
+    }
+    public int Field101 {
+      get { return field101_; }
+    }
+
+    public const int Field102FieldNumber = 102;
+    private bool hasField102;
+    private string field102_ = "";
+    public bool HasField102 {
+      get { return hasField102; }
+    }
+    public string Field102 {
+      get { return field102_; }
+    }
+
+    public const int Field103FieldNumber = 103;
+    private bool hasField103;
+    private string field103_ = "";
+    public bool HasField103 {
+      get { return hasField103; }
+    }
+    public string Field103 {
+      get { return field103_; }
+    }
+
+    public const int Field29FieldNumber = 29;
+    private bool hasField29;
+    private int field29_;
+    public bool HasField29 {
+      get { return hasField29; }
+    }
+    public int Field29 {
+      get { return field29_; }
+    }
+
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private bool field30_;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public bool Field30 {
+      get { return field30_; }
+    }
+
+    public const int Field60FieldNumber = 60;
+    private bool hasField60;
+    private int field60_ = -1;
+    public bool HasField60 {
+      get { return hasField60; }
+    }
+    public int Field60 {
+      get { return field60_; }
+    }
+
+    public const int Field271FieldNumber = 271;
+    private bool hasField271;
+    private int field271_ = -1;
+    public bool HasField271 {
+      get { return hasField271; }
+    }
+    public int Field271 {
+      get { return field271_; }
+    }
+
+    public const int Field272FieldNumber = 272;
+    private bool hasField272;
+    private int field272_ = -1;
+    public bool HasField272 {
+      get { return hasField272; }
+    }
+    public int Field272 {
+      get { return field272_; }
+    }
+
+    public const int Field150FieldNumber = 150;
+    private bool hasField150;
+    private int field150_;
+    public bool HasField150 {
+      get { return hasField150; }
+    }
+    public int Field150 {
+      get { return field150_; }
+    }
+
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private int field23_;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public int Field23 {
+      get { return field23_; }
+    }
+
+    public const int Field24FieldNumber = 24;
+    private bool hasField24;
+    private bool field24_;
+    public bool HasField24 {
+      get { return hasField24; }
+    }
+    public bool Field24 {
+      get { return field24_; }
+    }
+
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private int field25_;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public int Field25 {
+      get { return field25_; }
+    }
+
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage field15_;
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage Field15 {
+      get { return field15_ ?? global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance; }
+    }
+
+    public const int Field78FieldNumber = 78;
+    private bool hasField78;
+    private bool field78_;
+    public bool HasField78 {
+      get { return hasField78; }
+    }
+    public bool Field78 {
+      get { return field78_; }
+    }
+
+    public const int Field67FieldNumber = 67;
+    private bool hasField67;
+    private int field67_;
+    public bool HasField67 {
+      get { return hasField67; }
+    }
+    public int Field67 {
+      get { return field67_; }
+    }
+
+    public const int Field68FieldNumber = 68;
+    private bool hasField68;
+    private int field68_;
+    public bool HasField68 {
+      get { return hasField68; }
+    }
+    public int Field68 {
+      get { return field68_; }
+    }
+
+    public const int Field128FieldNumber = 128;
+    private bool hasField128;
+    private int field128_;
+    public bool HasField128 {
+      get { return hasField128; }
+    }
+    public int Field128 {
+      get { return field128_; }
+    }
+
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private string field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public string Field129 {
+      get { return field129_; }
+    }
+
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private int field131_;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public int Field131 {
+      get { return field131_; }
+    }
+
+    public static SizeMessage1 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SizeMessage1 MakeReadOnly() {
+      field5_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage1 prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage1, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SizeMessage1 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SizeMessage1 result;
+
+      private SizeMessage1 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SizeMessage1 original = result;
+          result = new SizeMessage1();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SizeMessage1 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage1.Descriptor; }
+      }
+
+      public override SizeMessage1 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage1.DefaultInstance; }
+      }
+
+      public override SizeMessage1 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = "";
+        return this;
+      }
+
+      public bool HasField9 {
+        get { return result.hasField9; }
+      }
+      public string Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        PrepareBuilder();
+        result.hasField9 = false;
+        result.field9_ = "";
+        return this;
+      }
+
+      public bool HasField18 {
+        get { return result.hasField18; }
+      }
+      public string Field18 {
+        get { return result.Field18; }
+        set { SetField18(value); }
+      }
+      public Builder SetField18(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField18 = true;
+        result.field18_ = value;
+        return this;
+      }
+      public Builder ClearField18() {
+        PrepareBuilder();
+        result.hasField18 = false;
+        result.field18_ = "";
+        return this;
+      }
+
+      public bool HasField80 {
+        get { return result.hasField80; }
+      }
+      public bool Field80 {
+        get { return result.Field80; }
+        set { SetField80(value); }
+      }
+      public Builder SetField80(bool value) {
+        PrepareBuilder();
+        result.hasField80 = true;
+        result.field80_ = value;
+        return this;
+      }
+      public Builder ClearField80() {
+        PrepareBuilder();
+        result.hasField80 = false;
+        result.field80_ = false;
+        return this;
+      }
+
+      public bool HasField81 {
+        get { return result.hasField81; }
+      }
+      public bool Field81 {
+        get { return result.Field81; }
+        set { SetField81(value); }
+      }
+      public Builder SetField81(bool value) {
+        PrepareBuilder();
+        result.hasField81 = true;
+        result.field81_ = value;
+        return this;
+      }
+      public Builder ClearField81() {
+        PrepareBuilder();
+        result.hasField81 = false;
+        result.field81_ = true;
+        return this;
+      }
+
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+
+      public bool HasField280 {
+        get { return result.hasField280; }
+      }
+      public int Field280 {
+        get { return result.Field280; }
+        set { SetField280(value); }
+      }
+      public Builder SetField280(int value) {
+        PrepareBuilder();
+        result.hasField280 = true;
+        result.field280_ = value;
+        return this;
+      }
+      public Builder ClearField280() {
+        PrepareBuilder();
+        result.hasField280 = false;
+        result.field280_ = 0;
+        return this;
+      }
+
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public int Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(int value) {
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = 0;
+        return this;
+      }
+
+      public bool HasField22 {
+        get { return result.hasField22; }
+      }
+      public long Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(long value) {
+        PrepareBuilder();
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        PrepareBuilder();
+        result.hasField22 = false;
+        result.field22_ = 0L;
+        return this;
+      }
+
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public string Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = "";
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> Field5List {
+        get { return PrepareBuilder().field5_; }
+      }
+      public int Field5Count {
+        get { return result.Field5Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetField5(int index) {
+        return result.GetField5(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField5(int index, ulong value) {
+        PrepareBuilder();
+        result.field5_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddField5(ulong value) {
+        PrepareBuilder();
+        result.field5_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeField5(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.field5_.Add(values);
+        return this;
+      }
+      public Builder ClearField5() {
+        PrepareBuilder();
+        result.field5_.Clear();
+        return this;
+      }
+
+      public bool HasField59 {
+        get { return result.hasField59; }
+      }
+      public bool Field59 {
+        get { return result.Field59; }
+        set { SetField59(value); }
+      }
+      public Builder SetField59(bool value) {
+        PrepareBuilder();
+        result.hasField59 = true;
+        result.field59_ = value;
+        return this;
+      }
+      public Builder ClearField59() {
+        PrepareBuilder();
+        result.hasField59 = false;
+        result.field59_ = false;
+        return this;
+      }
+
+      public bool HasField7 {
+        get { return result.hasField7; }
+      }
+      public string Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        PrepareBuilder();
+        result.hasField7 = false;
+        result.field7_ = "";
+        return this;
+      }
+
+      public bool HasField16 {
+        get { return result.hasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        PrepareBuilder();
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        PrepareBuilder();
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+
+      public bool HasField130 {
+        get { return result.hasField130; }
+      }
+      public int Field130 {
+        get { return result.Field130; }
+        set { SetField130(value); }
+      }
+      public Builder SetField130(int value) {
+        PrepareBuilder();
+        result.hasField130 = true;
+        result.field130_ = value;
+        return this;
+      }
+      public Builder ClearField130() {
+        PrepareBuilder();
+        result.hasField130 = false;
+        result.field130_ = 0;
+        return this;
+      }
+
+      public bool HasField12 {
+        get { return result.hasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        PrepareBuilder();
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        PrepareBuilder();
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+
+      public bool HasField17 {
+        get { return result.hasField17; }
+      }
+      public bool Field17 {
+        get { return result.Field17; }
+        set { SetField17(value); }
+      }
+      public Builder SetField17(bool value) {
+        PrepareBuilder();
+        result.hasField17 = true;
+        result.field17_ = value;
+        return this;
+      }
+      public Builder ClearField17() {
+        PrepareBuilder();
+        result.hasField17 = false;
+        result.field17_ = true;
+        return this;
+      }
+
+      public bool HasField13 {
+        get { return result.hasField13; }
+      }
+      public bool Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(bool value) {
+        PrepareBuilder();
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        PrepareBuilder();
+        result.hasField13 = false;
+        result.field13_ = true;
+        return this;
+      }
+
+      public bool HasField14 {
+        get { return result.hasField14; }
+      }
+      public bool Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(bool value) {
+        PrepareBuilder();
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        PrepareBuilder();
+        result.hasField14 = false;
+        result.field14_ = true;
+        return this;
+      }
+
+      public bool HasField104 {
+        get { return result.hasField104; }
+      }
+      public int Field104 {
+        get { return result.Field104; }
+        set { SetField104(value); }
+      }
+      public Builder SetField104(int value) {
+        PrepareBuilder();
+        result.hasField104 = true;
+        result.field104_ = value;
+        return this;
+      }
+      public Builder ClearField104() {
+        PrepareBuilder();
+        result.hasField104 = false;
+        result.field104_ = 0;
+        return this;
+      }
+
+      public bool HasField100 {
+        get { return result.hasField100; }
+      }
+      public int Field100 {
+        get { return result.Field100; }
+        set { SetField100(value); }
+      }
+      public Builder SetField100(int value) {
+        PrepareBuilder();
+        result.hasField100 = true;
+        result.field100_ = value;
+        return this;
+      }
+      public Builder ClearField100() {
+        PrepareBuilder();
+        result.hasField100 = false;
+        result.field100_ = 0;
+        return this;
+      }
+
+      public bool HasField101 {
+        get { return result.hasField101; }
+      }
+      public int Field101 {
+        get { return result.Field101; }
+        set { SetField101(value); }
+      }
+      public Builder SetField101(int value) {
+        PrepareBuilder();
+        result.hasField101 = true;
+        result.field101_ = value;
+        return this;
+      }
+      public Builder ClearField101() {
+        PrepareBuilder();
+        result.hasField101 = false;
+        result.field101_ = 0;
+        return this;
+      }
+
+      public bool HasField102 {
+        get { return result.hasField102; }
+      }
+      public string Field102 {
+        get { return result.Field102; }
+        set { SetField102(value); }
+      }
+      public Builder SetField102(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField102 = true;
+        result.field102_ = value;
+        return this;
+      }
+      public Builder ClearField102() {
+        PrepareBuilder();
+        result.hasField102 = false;
+        result.field102_ = "";
+        return this;
+      }
+
+      public bool HasField103 {
+        get { return result.hasField103; }
+      }
+      public string Field103 {
+        get { return result.Field103; }
+        set { SetField103(value); }
+      }
+      public Builder SetField103(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField103 = true;
+        result.field103_ = value;
+        return this;
+      }
+      public Builder ClearField103() {
+        PrepareBuilder();
+        result.hasField103 = false;
+        result.field103_ = "";
+        return this;
+      }
+
+      public bool HasField29 {
+        get { return result.hasField29; }
+      }
+      public int Field29 {
+        get { return result.Field29; }
+        set { SetField29(value); }
+      }
+      public Builder SetField29(int value) {
+        PrepareBuilder();
+        result.hasField29 = true;
+        result.field29_ = value;
+        return this;
+      }
+      public Builder ClearField29() {
+        PrepareBuilder();
+        result.hasField29 = false;
+        result.field29_ = 0;
+        return this;
+      }
+
+      public bool HasField30 {
+        get { return result.hasField30; }
+      }
+      public bool Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(bool value) {
+        PrepareBuilder();
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        PrepareBuilder();
+        result.hasField30 = false;
+        result.field30_ = false;
+        return this;
+      }
+
+      public bool HasField60 {
+        get { return result.hasField60; }
+      }
+      public int Field60 {
+        get { return result.Field60; }
+        set { SetField60(value); }
+      }
+      public Builder SetField60(int value) {
+        PrepareBuilder();
+        result.hasField60 = true;
+        result.field60_ = value;
+        return this;
+      }
+      public Builder ClearField60() {
+        PrepareBuilder();
+        result.hasField60 = false;
+        result.field60_ = -1;
+        return this;
+      }
+
+      public bool HasField271 {
+        get { return result.hasField271; }
+      }
+      public int Field271 {
+        get { return result.Field271; }
+        set { SetField271(value); }
+      }
+      public Builder SetField271(int value) {
+        PrepareBuilder();
+        result.hasField271 = true;
+        result.field271_ = value;
+        return this;
+      }
+      public Builder ClearField271() {
+        PrepareBuilder();
+        result.hasField271 = false;
+        result.field271_ = -1;
+        return this;
+      }
+
+      public bool HasField272 {
+        get { return result.hasField272; }
+      }
+      public int Field272 {
+        get { return result.Field272; }
+        set { SetField272(value); }
+      }
+      public Builder SetField272(int value) {
+        PrepareBuilder();
+        result.hasField272 = true;
+        result.field272_ = value;
+        return this;
+      }
+      public Builder ClearField272() {
+        PrepareBuilder();
+        result.hasField272 = false;
+        result.field272_ = -1;
+        return this;
+      }
+
+      public bool HasField150 {
+        get { return result.hasField150; }
+      }
+      public int Field150 {
+        get { return result.Field150; }
+        set { SetField150(value); }
+      }
+      public Builder SetField150(int value) {
+        PrepareBuilder();
+        result.hasField150 = true;
+        result.field150_ = value;
+        return this;
+      }
+      public Builder ClearField150() {
+        PrepareBuilder();
+        result.hasField150 = false;
+        result.field150_ = 0;
+        return this;
+      }
+
+      public bool HasField23 {
+        get { return result.hasField23; }
+      }
+      public int Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(int value) {
+        PrepareBuilder();
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        PrepareBuilder();
+        result.hasField23 = false;
+        result.field23_ = 0;
+        return this;
+      }
+
+      public bool HasField24 {
+        get { return result.hasField24; }
+      }
+      public bool Field24 {
+        get { return result.Field24; }
+        set { SetField24(value); }
+      }
+      public Builder SetField24(bool value) {
+        PrepareBuilder();
+        result.hasField24 = true;
+        result.field24_ = value;
+        return this;
+      }
+      public Builder ClearField24() {
+        PrepareBuilder();
+        result.hasField24 = false;
+        result.field24_ = false;
+        return this;
+      }
+
+      public bool HasField25 {
+        get { return result.hasField25; }
+      }
+      public int Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(int value) {
+        PrepareBuilder();
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        PrepareBuilder();
+        result.hasField25 = false;
+        result.field25_ = 0;
+        return this;
+      }
+
+      public bool HasField15 {
+       get { return result.hasField15; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeField15(global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasField15 &&
+            result.field15_ != global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance) {
+            result.field15_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.CreateBuilder(result.field15_).MergeFrom(value).BuildPartial();
+        } else {
+          result.field15_ = value;
+        }
+        result.hasField15 = true;
+        return this;
+      }
+      public Builder ClearField15() {
+        PrepareBuilder();
+        result.hasField15 = false;
+        result.field15_ = null;
+        return this;
+      }
+
+      public bool HasField78 {
+        get { return result.hasField78; }
+      }
+      public bool Field78 {
+        get { return result.Field78; }
+        set { SetField78(value); }
+      }
+      public Builder SetField78(bool value) {
+        PrepareBuilder();
+        result.hasField78 = true;
+        result.field78_ = value;
+        return this;
+      }
+      public Builder ClearField78() {
+        PrepareBuilder();
+        result.hasField78 = false;
+        result.field78_ = false;
+        return this;
+      }
+
+      public bool HasField67 {
+        get { return result.hasField67; }
+      }
+      public int Field67 {
+        get { return result.Field67; }
+        set { SetField67(value); }
+      }
+      public Builder SetField67(int value) {
+        PrepareBuilder();
+        result.hasField67 = true;
+        result.field67_ = value;
+        return this;
+      }
+      public Builder ClearField67() {
+        PrepareBuilder();
+        result.hasField67 = false;
+        result.field67_ = 0;
+        return this;
+      }
+
+      public bool HasField68 {
+        get { return result.hasField68; }
+      }
+      public int Field68 {
+        get { return result.Field68; }
+        set { SetField68(value); }
+      }
+      public Builder SetField68(int value) {
+        PrepareBuilder();
+        result.hasField68 = true;
+        result.field68_ = value;
+        return this;
+      }
+      public Builder ClearField68() {
+        PrepareBuilder();
+        result.hasField68 = false;
+        result.field68_ = 0;
+        return this;
+      }
+
+      public bool HasField128 {
+        get { return result.hasField128; }
+      }
+      public int Field128 {
+        get { return result.Field128; }
+        set { SetField128(value); }
+      }
+      public Builder SetField128(int value) {
+        PrepareBuilder();
+        result.hasField128 = true;
+        result.field128_ = value;
+        return this;
+      }
+      public Builder ClearField128() {
+        PrepareBuilder();
+        result.hasField128 = false;
+        result.field128_ = 0;
+        return this;
+      }
+
+      public bool HasField129 {
+        get { return result.hasField129; }
+      }
+      public string Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        PrepareBuilder();
+        result.hasField129 = false;
+        result.field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+        return this;
+      }
+
+      public bool HasField131 {
+        get { return result.hasField131; }
+      }
+      public int Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(int value) {
+        PrepareBuilder();
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        PrepareBuilder();
+        result.hasField131 = false;
+        result.field131_ = 0;
+        return this;
+      }
+    }
+    static SizeMessage1() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSize.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SizeMessage1SubMessage : pb::GeneratedMessage<SizeMessage1SubMessage, SizeMessage1SubMessage.Builder> {
+    private SizeMessage1SubMessage() { }
+    private static readonly SizeMessage1SubMessage defaultInstance = new SizeMessage1SubMessage().MakeReadOnly();
+    public static SizeMessage1SubMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SizeMessage1SubMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SizeMessage1SubMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage1SubMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage1SubMessage, SizeMessage1SubMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable; }
+    }
+
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private int field1_;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public int Field1 {
+      get { return field1_; }
+    }
+
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private string field15_ = "";
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public string Field15 {
+      get { return field15_; }
+    }
+
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private long field13_;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public long Field13 {
+      get { return field13_; }
+    }
+
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private long field14_;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public long Field14 {
+      get { return field14_; }
+    }
+
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+
+    public const int Field19FieldNumber = 19;
+    private bool hasField19;
+    private int field19_ = 2;
+    public bool HasField19 {
+      get { return hasField19; }
+    }
+    public int Field19 {
+      get { return field19_; }
+    }
+
+    public const int Field20FieldNumber = 20;
+    private bool hasField20;
+    private bool field20_ = true;
+    public bool HasField20 {
+      get { return hasField20; }
+    }
+    public bool Field20 {
+      get { return field20_; }
+    }
+
+    public const int Field28FieldNumber = 28;
+    private bool hasField28;
+    private bool field28_ = true;
+    public bool HasField28 {
+      get { return hasField28; }
+    }
+    public bool Field28 {
+      get { return field28_; }
+    }
+
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private ulong field21_;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field21 {
+      get { return field21_; }
+    }
+
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private int field22_;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public int Field22 {
+      get { return field22_; }
+    }
+
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private bool field23_;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public bool Field23 {
+      get { return field23_; }
+    }
+
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+
+    public const int Field203FieldNumber = 203;
+    private bool hasField203;
+    private uint field203_;
+    public bool HasField203 {
+      get { return hasField203; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint Field203 {
+      get { return field203_; }
+    }
+
+    public const int Field204FieldNumber = 204;
+    private bool hasField204;
+    private int field204_;
+    public bool HasField204 {
+      get { return hasField204; }
+    }
+    public int Field204 {
+      get { return field204_; }
+    }
+
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private string field205_ = "";
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public string Field205 {
+      get { return field205_; }
+    }
+
+    public const int Field207FieldNumber = 207;
+    private bool hasField207;
+    private ulong field207_;
+    public bool HasField207 {
+      get { return hasField207; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field207 {
+      get { return field207_; }
+    }
+
+    public const int Field300FieldNumber = 300;
+    private bool hasField300;
+    private ulong field300_;
+    public bool HasField300 {
+      get { return hasField300; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field300 {
+      get { return field300_; }
+    }
+
+    public static SizeMessage1SubMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SizeMessage1SubMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage1SubMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage1SubMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SizeMessage1SubMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SizeMessage1SubMessage result;
+
+      private SizeMessage1SubMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SizeMessage1SubMessage original = result;
+          result = new SizeMessage1SubMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SizeMessage1SubMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.Descriptor; }
+      }
+
+      public override SizeMessage1SubMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance; }
+      }
+
+      public override SizeMessage1SubMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public int Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(int value) {
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = 0;
+        return this;
+      }
+
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+
+      public bool HasField15 {
+        get { return result.hasField15; }
+      }
+      public string Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder ClearField15() {
+        PrepareBuilder();
+        result.hasField15 = false;
+        result.field15_ = "";
+        return this;
+      }
+
+      public bool HasField12 {
+        get { return result.hasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        PrepareBuilder();
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        PrepareBuilder();
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+
+      public bool HasField13 {
+        get { return result.hasField13; }
+      }
+      public long Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(long value) {
+        PrepareBuilder();
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        PrepareBuilder();
+        result.hasField13 = false;
+        result.field13_ = 0L;
+        return this;
+      }
+
+      public bool HasField14 {
+        get { return result.hasField14; }
+      }
+      public long Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(long value) {
+        PrepareBuilder();
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        PrepareBuilder();
+        result.hasField14 = false;
+        result.field14_ = 0L;
+        return this;
+      }
+
+      public bool HasField16 {
+        get { return result.hasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        PrepareBuilder();
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        PrepareBuilder();
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+
+      public bool HasField19 {
+        get { return result.hasField19; }
+      }
+      public int Field19 {
+        get { return result.Field19; }
+        set { SetField19(value); }
+      }
+      public Builder SetField19(int value) {
+        PrepareBuilder();
+        result.hasField19 = true;
+        result.field19_ = value;
+        return this;
+      }
+      public Builder ClearField19() {
+        PrepareBuilder();
+        result.hasField19 = false;
+        result.field19_ = 2;
+        return this;
+      }
+
+      public bool HasField20 {
+        get { return result.hasField20; }
+      }
+      public bool Field20 {
+        get { return result.Field20; }
+        set { SetField20(value); }
+      }
+      public Builder SetField20(bool value) {
+        PrepareBuilder();
+        result.hasField20 = true;
+        result.field20_ = value;
+        return this;
+      }
+      public Builder ClearField20() {
+        PrepareBuilder();
+        result.hasField20 = false;
+        result.field20_ = true;
+        return this;
+      }
+
+      public bool HasField28 {
+        get { return result.hasField28; }
+      }
+      public bool Field28 {
+        get { return result.Field28; }
+        set { SetField28(value); }
+      }
+      public Builder SetField28(bool value) {
+        PrepareBuilder();
+        result.hasField28 = true;
+        result.field28_ = value;
+        return this;
+      }
+      public Builder ClearField28() {
+        PrepareBuilder();
+        result.hasField28 = false;
+        result.field28_ = true;
+        return this;
+      }
+
+      public bool HasField21 {
+        get { return result.hasField21; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField21(ulong value) {
+        PrepareBuilder();
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        PrepareBuilder();
+        result.hasField21 = false;
+        result.field21_ = 0UL;
+        return this;
+      }
+
+      public bool HasField22 {
+        get { return result.hasField22; }
+      }
+      public int Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(int value) {
+        PrepareBuilder();
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        PrepareBuilder();
+        result.hasField22 = false;
+        result.field22_ = 0;
+        return this;
+      }
+
+      public bool HasField23 {
+        get { return result.hasField23; }
+      }
+      public bool Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(bool value) {
+        PrepareBuilder();
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        PrepareBuilder();
+        result.hasField23 = false;
+        result.field23_ = false;
+        return this;
+      }
+
+      public bool HasField206 {
+        get { return result.hasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        PrepareBuilder();
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        PrepareBuilder();
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+
+      public bool HasField203 {
+        get { return result.hasField203; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint Field203 {
+        get { return result.Field203; }
+        set { SetField203(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField203(uint value) {
+        PrepareBuilder();
+        result.hasField203 = true;
+        result.field203_ = value;
+        return this;
+      }
+      public Builder ClearField203() {
+        PrepareBuilder();
+        result.hasField203 = false;
+        result.field203_ = 0;
+        return this;
+      }
+
+      public bool HasField204 {
+        get { return result.hasField204; }
+      }
+      public int Field204 {
+        get { return result.Field204; }
+        set { SetField204(value); }
+      }
+      public Builder SetField204(int value) {
+        PrepareBuilder();
+        result.hasField204 = true;
+        result.field204_ = value;
+        return this;
+      }
+      public Builder ClearField204() {
+        PrepareBuilder();
+        result.hasField204 = false;
+        result.field204_ = 0;
+        return this;
+      }
+
+      public bool HasField205 {
+        get { return result.hasField205; }
+      }
+      public string Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        PrepareBuilder();
+        result.hasField205 = false;
+        result.field205_ = "";
+        return this;
+      }
+
+      public bool HasField207 {
+        get { return result.hasField207; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field207 {
+        get { return result.Field207; }
+        set { SetField207(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField207(ulong value) {
+        PrepareBuilder();
+        result.hasField207 = true;
+        result.field207_ = value;
+        return this;
+      }
+      public Builder ClearField207() {
+        PrepareBuilder();
+        result.hasField207 = false;
+        result.field207_ = 0UL;
+        return this;
+      }
+
+      public bool HasField300 {
+        get { return result.hasField300; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field300 {
+        get { return result.Field300; }
+        set { SetField300(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField300(ulong value) {
+        PrepareBuilder();
+        result.hasField300 = true;
+        result.field300_ = value;
+        return this;
+      }
+      public Builder ClearField300() {
+        PrepareBuilder();
+        result.hasField300 = false;
+        result.field300_ = 0UL;
+        return this;
+      }
+    }
+    static SizeMessage1SubMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSize.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SizeMessage2 : pb::GeneratedMessage<SizeMessage2, SizeMessage2.Builder> {
+    private SizeMessage2() { }
+    private static readonly SizeMessage2 defaultInstance = new SizeMessage2().MakeReadOnly();
+    public static SizeMessage2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SizeMessage2 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SizeMessage2 ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage2__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage2, SizeMessage2.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage2__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Group1 : pb::GeneratedMessage<Group1, Group1.Builder> {
+        private Group1() { }
+        private static readonly Group1 defaultInstance = new Group1().MakeReadOnly();
+        public static Group1 DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override Group1 DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override Group1 ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage2_Group1__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<Group1, Group1.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable; }
+        }
+
+        public const int Field11FieldNumber = 11;
+        private bool hasField11;
+        private float field11_;
+        public bool HasField11 {
+          get { return hasField11; }
+        }
+        public float Field11 {
+          get { return field11_; }
+        }
+
+        public const int Field26FieldNumber = 26;
+        private bool hasField26;
+        private float field26_;
+        public bool HasField26 {
+          get { return hasField26; }
+        }
+        public float Field26 {
+          get { return field26_; }
+        }
+
+        public const int Field12FieldNumber = 12;
+        private bool hasField12;
+        private string field12_ = "";
+        public bool HasField12 {
+          get { return hasField12; }
+        }
+        public string Field12 {
+          get { return field12_; }
+        }
+
+        public const int Field13FieldNumber = 13;
+        private bool hasField13;
+        private string field13_ = "";
+        public bool HasField13 {
+          get { return hasField13; }
+        }
+        public string Field13 {
+          get { return field13_; }
+        }
+
+        public const int Field14FieldNumber = 14;
+        private pbc::PopsicleList<string> field14_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field14List {
+          get { return pbc::Lists.AsReadOnly(field14_); }
+        }
+        public int Field14Count {
+          get { return field14_.Count; }
+        }
+        public string GetField14(int index) {
+          return field14_[index];
+        }
+
+        public const int Field15FieldNumber = 15;
+        private bool hasField15;
+        private ulong field15_;
+        public bool HasField15 {
+          get { return hasField15; }
+        }
+        [global::System.CLSCompliant(false)]
+        public ulong Field15 {
+          get { return field15_; }
+        }
+
+        public const int Field5FieldNumber = 5;
+        private bool hasField5;
+        private int field5_;
+        public bool HasField5 {
+          get { return hasField5; }
+        }
+        public int Field5 {
+          get { return field5_; }
+        }
+
+        public const int Field27FieldNumber = 27;
+        private bool hasField27;
+        private string field27_ = "";
+        public bool HasField27 {
+          get { return hasField27; }
+        }
+        public string Field27 {
+          get { return field27_; }
+        }
+
+        public const int Field28FieldNumber = 28;
+        private bool hasField28;
+        private int field28_;
+        public bool HasField28 {
+          get { return hasField28; }
+        }
+        public int Field28 {
+          get { return field28_; }
+        }
+
+        public const int Field29FieldNumber = 29;
+        private bool hasField29;
+        private string field29_ = "";
+        public bool HasField29 {
+          get { return hasField29; }
+        }
+        public string Field29 {
+          get { return field29_; }
+        }
+
+        public const int Field16FieldNumber = 16;
+        private bool hasField16;
+        private string field16_ = "";
+        public bool HasField16 {
+          get { return hasField16; }
+        }
+        public string Field16 {
+          get { return field16_; }
+        }
+
+        public const int Field22FieldNumber = 22;
+        private pbc::PopsicleList<string> field22_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field22List {
+          get { return pbc::Lists.AsReadOnly(field22_); }
+        }
+        public int Field22Count {
+          get { return field22_.Count; }
+        }
+        public string GetField22(int index) {
+          return field22_[index];
+        }
+
+        public const int Field73FieldNumber = 73;
+        private pbc::PopsicleList<int> field73_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> Field73List {
+          get { return pbc::Lists.AsReadOnly(field73_); }
+        }
+        public int Field73Count {
+          get { return field73_.Count; }
+        }
+        public int GetField73(int index) {
+          return field73_[index];
+        }
+
+        public const int Field20FieldNumber = 20;
+        private bool hasField20;
+        private int field20_;
+        public bool HasField20 {
+          get { return hasField20; }
+        }
+        public int Field20 {
+          get { return field20_; }
+        }
+
+        public const int Field24FieldNumber = 24;
+        private bool hasField24;
+        private string field24_ = "";
+        public bool HasField24 {
+          get { return hasField24; }
+        }
+        public string Field24 {
+          get { return field24_; }
+        }
+
+        public const int Field31FieldNumber = 31;
+        private bool hasField31;
+        private global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage field31_;
+        public bool HasField31 {
+          get { return hasField31; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage Field31 {
+          get { return field31_ ?? global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance; }
+        }
+
+        public static Group1 ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private Group1 MakeReadOnly() {
+          field14_.MakeReadOnly();
+          field22_.MakeReadOnly();
+          field73_.MakeReadOnly();
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Group1 prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<Group1, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(Group1 cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private Group1 result;
+
+          private Group1 PrepareBuilder() {
+            if (resultIsReadOnly) {
+              Group1 original = result;
+              result = new Group1();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override Group1 MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Descriptor; }
+          }
+
+          public override Group1 DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.DefaultInstance; }
+          }
+
+          public override Group1 BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+
+          public bool HasField11 {
+            get { return result.hasField11; }
+          }
+          public float Field11 {
+            get { return result.Field11; }
+            set { SetField11(value); }
+          }
+          public Builder SetField11(float value) {
+            PrepareBuilder();
+            result.hasField11 = true;
+            result.field11_ = value;
+            return this;
+          }
+          public Builder ClearField11() {
+            PrepareBuilder();
+            result.hasField11 = false;
+            result.field11_ = 0F;
+            return this;
+          }
+
+          public bool HasField26 {
+            get { return result.hasField26; }
+          }
+          public float Field26 {
+            get { return result.Field26; }
+            set { SetField26(value); }
+          }
+          public Builder SetField26(float value) {
+            PrepareBuilder();
+            result.hasField26 = true;
+            result.field26_ = value;
+            return this;
+          }
+          public Builder ClearField26() {
+            PrepareBuilder();
+            result.hasField26 = false;
+            result.field26_ = 0F;
+            return this;
+          }
+
+          public bool HasField12 {
+            get { return result.hasField12; }
+          }
+          public string Field12 {
+            get { return result.Field12; }
+            set { SetField12(value); }
+          }
+          public Builder SetField12(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField12 = true;
+            result.field12_ = value;
+            return this;
+          }
+          public Builder ClearField12() {
+            PrepareBuilder();
+            result.hasField12 = false;
+            result.field12_ = "";
+            return this;
+          }
+
+          public bool HasField13 {
+            get { return result.hasField13; }
+          }
+          public string Field13 {
+            get { return result.Field13; }
+            set { SetField13(value); }
+          }
+          public Builder SetField13(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField13 = true;
+            result.field13_ = value;
+            return this;
+          }
+          public Builder ClearField13() {
+            PrepareBuilder();
+            result.hasField13 = false;
+            result.field13_ = "";
+            return this;
+          }
+
+          public pbc::IPopsicleList<string> Field14List {
+            get { return PrepareBuilder().field14_; }
+          }
+          public int Field14Count {
+            get { return result.Field14Count; }
+          }
+          public string GetField14(int index) {
+            return result.GetField14(index);
+          }
+          public Builder SetField14(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field14_[index] = value;
+            return this;
+          }
+          public Builder AddField14(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field14_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField14(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.field14_.Add(values);
+            return this;
+          }
+          public Builder ClearField14() {
+            PrepareBuilder();
+            result.field14_.Clear();
+            return this;
+          }
+
+          public bool HasField15 {
+            get { return result.hasField15; }
+          }
+          [global::System.CLSCompliant(false)]
+          public ulong Field15 {
+            get { return result.Field15; }
+            set { SetField15(value); }
+          }
+          [global::System.CLSCompliant(false)]
+          public Builder SetField15(ulong value) {
+            PrepareBuilder();
+            result.hasField15 = true;
+            result.field15_ = value;
+            return this;
+          }
+          public Builder ClearField15() {
+            PrepareBuilder();
+            result.hasField15 = false;
+            result.field15_ = 0UL;
+            return this;
+          }
+
+          public bool HasField5 {
+            get { return result.hasField5; }
+          }
+          public int Field5 {
+            get { return result.Field5; }
+            set { SetField5(value); }
+          }
+          public Builder SetField5(int value) {
+            PrepareBuilder();
+            result.hasField5 = true;
+            result.field5_ = value;
+            return this;
+          }
+          public Builder ClearField5() {
+            PrepareBuilder();
+            result.hasField5 = false;
+            result.field5_ = 0;
+            return this;
+          }
+
+          public bool HasField27 {
+            get { return result.hasField27; }
+          }
+          public string Field27 {
+            get { return result.Field27; }
+            set { SetField27(value); }
+          }
+          public Builder SetField27(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField27 = true;
+            result.field27_ = value;
+            return this;
+          }
+          public Builder ClearField27() {
+            PrepareBuilder();
+            result.hasField27 = false;
+            result.field27_ = "";
+            return this;
+          }
+
+          public bool HasField28 {
+            get { return result.hasField28; }
+          }
+          public int Field28 {
+            get { return result.Field28; }
+            set { SetField28(value); }
+          }
+          public Builder SetField28(int value) {
+            PrepareBuilder();
+            result.hasField28 = true;
+            result.field28_ = value;
+            return this;
+          }
+          public Builder ClearField28() {
+            PrepareBuilder();
+            result.hasField28 = false;
+            result.field28_ = 0;
+            return this;
+          }
+
+          public bool HasField29 {
+            get { return result.hasField29; }
+          }
+          public string Field29 {
+            get { return result.Field29; }
+            set { SetField29(value); }
+          }
+          public Builder SetField29(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField29 = true;
+            result.field29_ = value;
+            return this;
+          }
+          public Builder ClearField29() {
+            PrepareBuilder();
+            result.hasField29 = false;
+            result.field29_ = "";
+            return this;
+          }
+
+          public bool HasField16 {
+            get { return result.hasField16; }
+          }
+          public string Field16 {
+            get { return result.Field16; }
+            set { SetField16(value); }
+          }
+          public Builder SetField16(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField16 = true;
+            result.field16_ = value;
+            return this;
+          }
+          public Builder ClearField16() {
+            PrepareBuilder();
+            result.hasField16 = false;
+            result.field16_ = "";
+            return this;
+          }
+
+          public pbc::IPopsicleList<string> Field22List {
+            get { return PrepareBuilder().field22_; }
+          }
+          public int Field22Count {
+            get { return result.Field22Count; }
+          }
+          public string GetField22(int index) {
+            return result.GetField22(index);
+          }
+          public Builder SetField22(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field22_[index] = value;
+            return this;
+          }
+          public Builder AddField22(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field22_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField22(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.field22_.Add(values);
+            return this;
+          }
+          public Builder ClearField22() {
+            PrepareBuilder();
+            result.field22_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<int> Field73List {
+            get { return PrepareBuilder().field73_; }
+          }
+          public int Field73Count {
+            get { return result.Field73Count; }
+          }
+          public int GetField73(int index) {
+            return result.GetField73(index);
+          }
+          public Builder SetField73(int index, int value) {
+            PrepareBuilder();
+            result.field73_[index] = value;
+            return this;
+          }
+          public Builder AddField73(int value) {
+            PrepareBuilder();
+            result.field73_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField73(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.field73_.Add(values);
+            return this;
+          }
+          public Builder ClearField73() {
+            PrepareBuilder();
+            result.field73_.Clear();
+            return this;
+          }
+
+          public bool HasField20 {
+            get { return result.hasField20; }
+          }
+          public int Field20 {
+            get { return result.Field20; }
+            set { SetField20(value); }
+          }
+          public Builder SetField20(int value) {
+            PrepareBuilder();
+            result.hasField20 = true;
+            result.field20_ = value;
+            return this;
+          }
+          public Builder ClearField20() {
+            PrepareBuilder();
+            result.hasField20 = false;
+            result.field20_ = 0;
+            return this;
+          }
+
+          public bool HasField24 {
+            get { return result.hasField24; }
+          }
+          public string Field24 {
+            get { return result.Field24; }
+            set { SetField24(value); }
+          }
+          public Builder SetField24(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField24 = true;
+            result.field24_ = value;
+            return this;
+          }
+          public Builder ClearField24() {
+            PrepareBuilder();
+            result.hasField24 = false;
+            result.field24_ = "";
+            return this;
+          }
+
+          public bool HasField31 {
+           get { return result.hasField31; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage Field31 {
+            get { return result.Field31; }
+            set { SetField31(value); }
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField31 = true;
+            result.field31_ = value;
+            return this;
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.hasField31 = true;
+            result.field31_ = builderForValue.Build();
+            return this;
+          }
+          public Builder MergeField31(global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            if (result.hasField31 &&
+                result.field31_ != global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance) {
+                result.field31_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.CreateBuilder(result.field31_).MergeFrom(value).BuildPartial();
+            } else {
+              result.field31_ = value;
+            }
+            result.hasField31 = true;
+            return this;
+          }
+          public Builder ClearField31() {
+            PrepareBuilder();
+            result.hasField31 = false;
+            result.field31_ = null;
+            return this;
+          }
+        }
+        static Group1() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSize.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private long field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public long Field3 {
+      get { return field3_; }
+    }
+
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private long field4_;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public long Field4 {
+      get { return field4_; }
+    }
+
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private long field30_;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public long Field30 {
+      get { return field30_; }
+    }
+
+    public const int Field75FieldNumber = 75;
+    private bool hasField75;
+    private bool field75_;
+    public bool HasField75 {
+      get { return hasField75; }
+    }
+    public bool Field75 {
+      get { return field75_; }
+    }
+
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private string field6_ = "";
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public string Field6 {
+      get { return field6_; }
+    }
+
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private pb::ByteString field2_ = pb::ByteString.Empty;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public pb::ByteString Field2 {
+      get { return field2_; }
+    }
+
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private int field21_;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    public int Field21 {
+      get { return field21_; }
+    }
+
+    public const int Field71FieldNumber = 71;
+    private bool hasField71;
+    private int field71_;
+    public bool HasField71 {
+      get { return hasField71; }
+    }
+    public int Field71 {
+      get { return field71_; }
+    }
+
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private float field25_;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public float Field25 {
+      get { return field25_; }
+    }
+
+    public const int Field109FieldNumber = 109;
+    private bool hasField109;
+    private int field109_;
+    public bool HasField109 {
+      get { return hasField109; }
+    }
+    public int Field109 {
+      get { return field109_; }
+    }
+
+    public const int Field210FieldNumber = 210;
+    private bool hasField210;
+    private int field210_;
+    public bool HasField210 {
+      get { return hasField210; }
+    }
+    public int Field210 {
+      get { return field210_; }
+    }
+
+    public const int Field211FieldNumber = 211;
+    private bool hasField211;
+    private int field211_;
+    public bool HasField211 {
+      get { return hasField211; }
+    }
+    public int Field211 {
+      get { return field211_; }
+    }
+
+    public const int Field212FieldNumber = 212;
+    private bool hasField212;
+    private int field212_;
+    public bool HasField212 {
+      get { return hasField212; }
+    }
+    public int Field212 {
+      get { return field212_; }
+    }
+
+    public const int Field213FieldNumber = 213;
+    private bool hasField213;
+    private int field213_;
+    public bool HasField213 {
+      get { return hasField213; }
+    }
+    public int Field213 {
+      get { return field213_; }
+    }
+
+    public const int Field216FieldNumber = 216;
+    private bool hasField216;
+    private int field216_;
+    public bool HasField216 {
+      get { return hasField216; }
+    }
+    public int Field216 {
+      get { return field216_; }
+    }
+
+    public const int Field217FieldNumber = 217;
+    private bool hasField217;
+    private int field217_;
+    public bool HasField217 {
+      get { return hasField217; }
+    }
+    public int Field217 {
+      get { return field217_; }
+    }
+
+    public const int Field218FieldNumber = 218;
+    private bool hasField218;
+    private int field218_;
+    public bool HasField218 {
+      get { return hasField218; }
+    }
+    public int Field218 {
+      get { return field218_; }
+    }
+
+    public const int Field220FieldNumber = 220;
+    private bool hasField220;
+    private int field220_;
+    public bool HasField220 {
+      get { return hasField220; }
+    }
+    public int Field220 {
+      get { return field220_; }
+    }
+
+    public const int Field221FieldNumber = 221;
+    private bool hasField221;
+    private int field221_;
+    public bool HasField221 {
+      get { return hasField221; }
+    }
+    public int Field221 {
+      get { return field221_; }
+    }
+
+    public const int Field222FieldNumber = 222;
+    private bool hasField222;
+    private float field222_;
+    public bool HasField222 {
+      get { return hasField222; }
+    }
+    public float Field222 {
+      get { return field222_; }
+    }
+
+    public const int Field63FieldNumber = 63;
+    private bool hasField63;
+    private int field63_;
+    public bool HasField63 {
+      get { return hasField63; }
+    }
+    public int Field63 {
+      get { return field63_; }
+    }
+
+    public const int Group1FieldNumber = 10;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1> group1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1> Group1List {
+      get { return group1_; }
+    }
+    public int Group1Count {
+      get { return group1_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1 GetGroup1(int index) {
+      return group1_[index];
+    }
+
+    public const int Field128FieldNumber = 128;
+    private pbc::PopsicleList<string> field128_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field128List {
+      get { return pbc::Lists.AsReadOnly(field128_); }
+    }
+    public int Field128Count {
+      get { return field128_.Count; }
+    }
+    public string GetField128(int index) {
+      return field128_[index];
+    }
+
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private long field131_;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public long Field131 {
+      get { return field131_; }
+    }
+
+    public const int Field127FieldNumber = 127;
+    private pbc::PopsicleList<string> field127_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field127List {
+      get { return pbc::Lists.AsReadOnly(field127_); }
+    }
+    public int Field127Count {
+      get { return field127_.Count; }
+    }
+    public string GetField127(int index) {
+      return field127_[index];
+    }
+
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private int field129_;
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public int Field129 {
+      get { return field129_; }
+    }
+
+    public const int Field130FieldNumber = 130;
+    private pbc::PopsicleList<long> field130_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> Field130List {
+      get { return pbc::Lists.AsReadOnly(field130_); }
+    }
+    public int Field130Count {
+      get { return field130_.Count; }
+    }
+    public long GetField130(int index) {
+      return field130_[index];
+    }
+
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private bool field205_;
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public bool Field205 {
+      get { return field205_; }
+    }
+
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+
+    public static SizeMessage2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SizeMessage2 MakeReadOnly() {
+      group1_.MakeReadOnly();
+      field128_.MakeReadOnly();
+      field127_.MakeReadOnly();
+      field130_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage2 prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage2, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SizeMessage2 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SizeMessage2 result;
+
+      private SizeMessage2 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SizeMessage2 original = result;
+          result = new SizeMessage2();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SizeMessage2 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Descriptor; }
+      }
+
+      public override SizeMessage2 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2.DefaultInstance; }
+      }
+
+      public override SizeMessage2 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = "";
+        return this;
+      }
+
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public long Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(long value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0L;
+        return this;
+      }
+
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public long Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(long value) {
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = 0L;
+        return this;
+      }
+
+      public bool HasField30 {
+        get { return result.hasField30; }
+      }
+      public long Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(long value) {
+        PrepareBuilder();
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        PrepareBuilder();
+        result.hasField30 = false;
+        result.field30_ = 0L;
+        return this;
+      }
+
+      public bool HasField75 {
+        get { return result.hasField75; }
+      }
+      public bool Field75 {
+        get { return result.Field75; }
+        set { SetField75(value); }
+      }
+      public Builder SetField75(bool value) {
+        PrepareBuilder();
+        result.hasField75 = true;
+        result.field75_ = value;
+        return this;
+      }
+      public Builder ClearField75() {
+        PrepareBuilder();
+        result.hasField75 = false;
+        result.field75_ = false;
+        return this;
+      }
+
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public string Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = "";
+        return this;
+      }
+
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public pb::ByteString Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = pb::ByteString.Empty;
+        return this;
+      }
+
+      public bool HasField21 {
+        get { return result.hasField21; }
+      }
+      public int Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      public Builder SetField21(int value) {
+        PrepareBuilder();
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        PrepareBuilder();
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+
+      public bool HasField71 {
+        get { return result.hasField71; }
+      }
+      public int Field71 {
+        get { return result.Field71; }
+        set { SetField71(value); }
+      }
+      public Builder SetField71(int value) {
+        PrepareBuilder();
+        result.hasField71 = true;
+        result.field71_ = value;
+        return this;
+      }
+      public Builder ClearField71() {
+        PrepareBuilder();
+        result.hasField71 = false;
+        result.field71_ = 0;
+        return this;
+      }
+
+      public bool HasField25 {
+        get { return result.hasField25; }
+      }
+      public float Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(float value) {
+        PrepareBuilder();
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        PrepareBuilder();
+        result.hasField25 = false;
+        result.field25_ = 0F;
+        return this;
+      }
+
+      public bool HasField109 {
+        get { return result.hasField109; }
+      }
+      public int Field109 {
+        get { return result.Field109; }
+        set { SetField109(value); }
+      }
+      public Builder SetField109(int value) {
+        PrepareBuilder();
+        result.hasField109 = true;
+        result.field109_ = value;
+        return this;
+      }
+      public Builder ClearField109() {
+        PrepareBuilder();
+        result.hasField109 = false;
+        result.field109_ = 0;
+        return this;
+      }
+
+      public bool HasField210 {
+        get { return result.hasField210; }
+      }
+      public int Field210 {
+        get { return result.Field210; }
+        set { SetField210(value); }
+      }
+      public Builder SetField210(int value) {
+        PrepareBuilder();
+        result.hasField210 = true;
+        result.field210_ = value;
+        return this;
+      }
+      public Builder ClearField210() {
+        PrepareBuilder();
+        result.hasField210 = false;
+        result.field210_ = 0;
+        return this;
+      }
+
+      public bool HasField211 {
+        get { return result.hasField211; }
+      }
+      public int Field211 {
+        get { return result.Field211; }
+        set { SetField211(value); }
+      }
+      public Builder SetField211(int value) {
+        PrepareBuilder();
+        result.hasField211 = true;
+        result.field211_ = value;
+        return this;
+      }
+      public Builder ClearField211() {
+        PrepareBuilder();
+        result.hasField211 = false;
+        result.field211_ = 0;
+        return this;
+      }
+
+      public bool HasField212 {
+        get { return result.hasField212; }
+      }
+      public int Field212 {
+        get { return result.Field212; }
+        set { SetField212(value); }
+      }
+      public Builder SetField212(int value) {
+        PrepareBuilder();
+        result.hasField212 = true;
+        result.field212_ = value;
+        return this;
+      }
+      public Builder ClearField212() {
+        PrepareBuilder();
+        result.hasField212 = false;
+        result.field212_ = 0;
+        return this;
+      }
+
+      public bool HasField213 {
+        get { return result.hasField213; }
+      }
+      public int Field213 {
+        get { return result.Field213; }
+        set { SetField213(value); }
+      }
+      public Builder SetField213(int value) {
+        PrepareBuilder();
+        result.hasField213 = true;
+        result.field213_ = value;
+        return this;
+      }
+      public Builder ClearField213() {
+        PrepareBuilder();
+        result.hasField213 = false;
+        result.field213_ = 0;
+        return this;
+      }
+
+      public bool HasField216 {
+        get { return result.hasField216; }
+      }
+      public int Field216 {
+        get { return result.Field216; }
+        set { SetField216(value); }
+      }
+      public Builder SetField216(int value) {
+        PrepareBuilder();
+        result.hasField216 = true;
+        result.field216_ = value;
+        return this;
+      }
+      public Builder ClearField216() {
+        PrepareBuilder();
+        result.hasField216 = false;
+        result.field216_ = 0;
+        return this;
+      }
+
+      public bool HasField217 {
+        get { return result.hasField217; }
+      }
+      public int Field217 {
+        get { return result.Field217; }
+        set { SetField217(value); }
+      }
+      public Builder SetField217(int value) {
+        PrepareBuilder();
+        result.hasField217 = true;
+        result.field217_ = value;
+        return this;
+      }
+      public Builder ClearField217() {
+        PrepareBuilder();
+        result.hasField217 = false;
+        result.field217_ = 0;
+        return this;
+      }
+
+      public bool HasField218 {
+        get { return result.hasField218; }
+      }
+      public int Field218 {
+        get { return result.Field218; }
+        set { SetField218(value); }
+      }
+      public Builder SetField218(int value) {
+        PrepareBuilder();
+        result.hasField218 = true;
+        result.field218_ = value;
+        return this;
+      }
+      public Builder ClearField218() {
+        PrepareBuilder();
+        result.hasField218 = false;
+        result.field218_ = 0;
+        return this;
+      }
+
+      public bool HasField220 {
+        get { return result.hasField220; }
+      }
+      public int Field220 {
+        get { return result.Field220; }
+        set { SetField220(value); }
+      }
+      public Builder SetField220(int value) {
+        PrepareBuilder();
+        result.hasField220 = true;
+        result.field220_ = value;
+        return this;
+      }
+      public Builder ClearField220() {
+        PrepareBuilder();
+        result.hasField220 = false;
+        result.field220_ = 0;
+        return this;
+      }
+
+      public bool HasField221 {
+        get { return result.hasField221; }
+      }
+      public int Field221 {
+        get { return result.Field221; }
+        set { SetField221(value); }
+      }
+      public Builder SetField221(int value) {
+        PrepareBuilder();
+        result.hasField221 = true;
+        result.field221_ = value;
+        return this;
+      }
+      public Builder ClearField221() {
+        PrepareBuilder();
+        result.hasField221 = false;
+        result.field221_ = 0;
+        return this;
+      }
+
+      public bool HasField222 {
+        get { return result.hasField222; }
+      }
+      public float Field222 {
+        get { return result.Field222; }
+        set { SetField222(value); }
+      }
+      public Builder SetField222(float value) {
+        PrepareBuilder();
+        result.hasField222 = true;
+        result.field222_ = value;
+        return this;
+      }
+      public Builder ClearField222() {
+        PrepareBuilder();
+        result.hasField222 = false;
+        result.field222_ = 0F;
+        return this;
+      }
+
+      public bool HasField63 {
+        get { return result.hasField63; }
+      }
+      public int Field63 {
+        get { return result.Field63; }
+        set { SetField63(value); }
+      }
+      public Builder SetField63(int value) {
+        PrepareBuilder();
+        result.hasField63 = true;
+        result.field63_ = value;
+        return this;
+      }
+      public Builder ClearField63() {
+        PrepareBuilder();
+        result.hasField63 = false;
+        result.field63_ = 0;
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1> Group1List {
+        get { return PrepareBuilder().group1_; }
+      }
+      public int Group1Count {
+        get { return result.Group1Count; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1 GetGroup1(int index) {
+        return result.GetGroup1(index);
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.group1_[index] = value;
+        return this;
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.group1_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.group1_.Add(value);
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.group1_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1> values) {
+        PrepareBuilder();
+        result.group1_.Add(values);
+        return this;
+      }
+      public Builder ClearGroup1() {
+        PrepareBuilder();
+        result.group1_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> Field128List {
+        get { return PrepareBuilder().field128_; }
+      }
+      public int Field128Count {
+        get { return result.Field128Count; }
+      }
+      public string GetField128(int index) {
+        return result.GetField128(index);
+      }
+      public Builder SetField128(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field128_[index] = value;
+        return this;
+      }
+      public Builder AddField128(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field128_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField128(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.field128_.Add(values);
+        return this;
+      }
+      public Builder ClearField128() {
+        PrepareBuilder();
+        result.field128_.Clear();
+        return this;
+      }
+
+      public bool HasField131 {
+        get { return result.hasField131; }
+      }
+      public long Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(long value) {
+        PrepareBuilder();
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        PrepareBuilder();
+        result.hasField131 = false;
+        result.field131_ = 0L;
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> Field127List {
+        get { return PrepareBuilder().field127_; }
+      }
+      public int Field127Count {
+        get { return result.Field127Count; }
+      }
+      public string GetField127(int index) {
+        return result.GetField127(index);
+      }
+      public Builder SetField127(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field127_[index] = value;
+        return this;
+      }
+      public Builder AddField127(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field127_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField127(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.field127_.Add(values);
+        return this;
+      }
+      public Builder ClearField127() {
+        PrepareBuilder();
+        result.field127_.Clear();
+        return this;
+      }
+
+      public bool HasField129 {
+        get { return result.hasField129; }
+      }
+      public int Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(int value) {
+        PrepareBuilder();
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        PrepareBuilder();
+        result.hasField129 = false;
+        result.field129_ = 0;
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> Field130List {
+        get { return PrepareBuilder().field130_; }
+      }
+      public int Field130Count {
+        get { return result.Field130Count; }
+      }
+      public long GetField130(int index) {
+        return result.GetField130(index);
+      }
+      public Builder SetField130(int index, long value) {
+        PrepareBuilder();
+        result.field130_[index] = value;
+        return this;
+      }
+      public Builder AddField130(long value) {
+        PrepareBuilder();
+        result.field130_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField130(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.field130_.Add(values);
+        return this;
+      }
+      public Builder ClearField130() {
+        PrepareBuilder();
+        result.field130_.Clear();
+        return this;
+      }
+
+      public bool HasField205 {
+        get { return result.hasField205; }
+      }
+      public bool Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(bool value) {
+        PrepareBuilder();
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        PrepareBuilder();
+        result.hasField205 = false;
+        result.field205_ = false;
+        return this;
+      }
+
+      public bool HasField206 {
+        get { return result.hasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        PrepareBuilder();
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        PrepareBuilder();
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+    }
+    static SizeMessage2() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSize.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SizeMessage2GroupedMessage : pb::GeneratedMessage<SizeMessage2GroupedMessage, SizeMessage2GroupedMessage.Builder> {
+    private SizeMessage2GroupedMessage() { }
+    private static readonly SizeMessage2GroupedMessage defaultInstance = new SizeMessage2GroupedMessage().MakeReadOnly();
+    public static SizeMessage2GroupedMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SizeMessage2GroupedMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SizeMessage2GroupedMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage2GroupedMessage, SizeMessage2GroupedMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSize.internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable; }
+    }
+
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private float field1_;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public float Field1 {
+      get { return field1_; }
+    }
+
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private float field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public float Field2 {
+      get { return field2_; }
+    }
+
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private float field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public float Field3 {
+      get { return field3_; }
+    }
+
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private bool field4_;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public bool Field4 {
+      get { return field4_; }
+    }
+
+    public const int Field5FieldNumber = 5;
+    private bool hasField5;
+    private bool field5_;
+    public bool HasField5 {
+      get { return hasField5; }
+    }
+    public bool Field5 {
+      get { return field5_; }
+    }
+
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private bool field6_ = true;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public bool Field6 {
+      get { return field6_; }
+    }
+
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private bool field7_;
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public bool Field7 {
+      get { return field7_; }
+    }
+
+    public const int Field8FieldNumber = 8;
+    private bool hasField8;
+    private float field8_;
+    public bool HasField8 {
+      get { return hasField8; }
+    }
+    public float Field8 {
+      get { return field8_; }
+    }
+
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private bool field9_;
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public bool Field9 {
+      get { return field9_; }
+    }
+
+    public const int Field10FieldNumber = 10;
+    private bool hasField10;
+    private float field10_;
+    public bool HasField10 {
+      get { return hasField10; }
+    }
+    public float Field10 {
+      get { return field10_; }
+    }
+
+    public const int Field11FieldNumber = 11;
+    private bool hasField11;
+    private long field11_;
+    public bool HasField11 {
+      get { return hasField11; }
+    }
+    public long Field11 {
+      get { return field11_; }
+    }
+
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SizeMessage2GroupedMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage2GroupedMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage2GroupedMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SizeMessage2GroupedMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SizeMessage2GroupedMessage result;
+
+      private SizeMessage2GroupedMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SizeMessage2GroupedMessage original = result;
+          result = new SizeMessage2GroupedMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SizeMessage2GroupedMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.Descriptor; }
+      }
+
+      public override SizeMessage2GroupedMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance; }
+      }
+
+      public override SizeMessage2GroupedMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public float Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(float value) {
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = 0F;
+        return this;
+      }
+
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public float Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(float value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0F;
+        return this;
+      }
+
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public float Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(float value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0F;
+        return this;
+      }
+
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public bool Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(bool value) {
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = false;
+        return this;
+      }
+
+      public bool HasField5 {
+        get { return result.hasField5; }
+      }
+      public bool Field5 {
+        get { return result.Field5; }
+        set { SetField5(value); }
+      }
+      public Builder SetField5(bool value) {
+        PrepareBuilder();
+        result.hasField5 = true;
+        result.field5_ = value;
+        return this;
+      }
+      public Builder ClearField5() {
+        PrepareBuilder();
+        result.hasField5 = false;
+        result.field5_ = false;
+        return this;
+      }
+
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public bool Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(bool value) {
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = true;
+        return this;
+      }
+
+      public bool HasField7 {
+        get { return result.hasField7; }
+      }
+      public bool Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(bool value) {
+        PrepareBuilder();
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        PrepareBuilder();
+        result.hasField7 = false;
+        result.field7_ = false;
+        return this;
+      }
+
+      public bool HasField8 {
+        get { return result.hasField8; }
+      }
+      public float Field8 {
+        get { return result.Field8; }
+        set { SetField8(value); }
+      }
+      public Builder SetField8(float value) {
+        PrepareBuilder();
+        result.hasField8 = true;
+        result.field8_ = value;
+        return this;
+      }
+      public Builder ClearField8() {
+        PrepareBuilder();
+        result.hasField8 = false;
+        result.field8_ = 0F;
+        return this;
+      }
+
+      public bool HasField9 {
+        get { return result.hasField9; }
+      }
+      public bool Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(bool value) {
+        PrepareBuilder();
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        PrepareBuilder();
+        result.hasField9 = false;
+        result.field9_ = false;
+        return this;
+      }
+
+      public bool HasField10 {
+        get { return result.hasField10; }
+      }
+      public float Field10 {
+        get { return result.Field10; }
+        set { SetField10(value); }
+      }
+      public Builder SetField10(float value) {
+        PrepareBuilder();
+        result.hasField10 = true;
+        result.field10_ = value;
+        return this;
+      }
+      public Builder ClearField10() {
+        PrepareBuilder();
+        result.hasField10 = false;
+        result.field10_ = 0F;
+        return this;
+      }
+
+      public bool HasField11 {
+        get { return result.hasField11; }
+      }
+      public long Field11 {
+        get { return result.Field11; }
+        set { SetField11(value); }
+      }
+      public Builder SetField11(long value) {
+        PrepareBuilder();
+        result.hasField11 = true;
+        result.field11_ = value;
+        return this;
+      }
+      public Builder ClearField11() {
+        PrepareBuilder();
+        result.hasField11 = false;
+        result.field11_ = 0L;
+        return this;
+      }
+    }
+    static SizeMessage2GroupedMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSize.Descriptor, null);
+    }
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code

+ 6634 - 0
csharp/src/ProtoBench/GoogleSpeed.cs

@@ -0,0 +1,6634 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google_speed.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class GoogleSpeed {
+
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Builder> internal__static_benchmarks_SpeedMessage1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder> internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Builder> internal__static_benchmarks_SpeedMessage2__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2_Group1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder> internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder> internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+
+    static GoogleSpeed() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChJnb29nbGVfc3BlZWQucHJvdG8SCmJlbmNobWFya3Mi+AYKDVNwZWVkTWVz", 
+            "c2FnZTESDgoGZmllbGQxGAEgAigJEg4KBmZpZWxkORgJIAEoCRIPCgdmaWVs", 
+            "ZDE4GBIgASgJEhYKB2ZpZWxkODAYUCABKAg6BWZhbHNlEhUKB2ZpZWxkODEY", 
+            "USABKAg6BHRydWUSDgoGZmllbGQyGAIgAigFEg4KBmZpZWxkMxgDIAIoBRIR", 
+            "CghmaWVsZDI4MBiYAiABKAUSEQoGZmllbGQ2GAYgASgFOgEwEg8KB2ZpZWxk", 
+            "MjIYFiABKAMSDgoGZmllbGQ0GAQgASgJEg4KBmZpZWxkNRgFIAMoBhIWCgdm", 
+            "aWVsZDU5GDsgASgIOgVmYWxzZRIOCgZmaWVsZDcYByABKAkSDwoHZmllbGQx", 
+            "NhgQIAEoBRIUCghmaWVsZDEzMBiCASABKAU6ATASFQoHZmllbGQxMhgMIAEo", 
+            "CDoEdHJ1ZRIVCgdmaWVsZDE3GBEgASgIOgR0cnVlEhUKB2ZpZWxkMTMYDSAB", 
+            "KAg6BHRydWUSFQoHZmllbGQxNBgOIAEoCDoEdHJ1ZRITCghmaWVsZDEwNBho", 
+            "IAEoBToBMBITCghmaWVsZDEwMBhkIAEoBToBMBITCghmaWVsZDEwMRhlIAEo", 
+            "BToBMBIQCghmaWVsZDEwMhhmIAEoCRIQCghmaWVsZDEwMxhnIAEoCRISCgdm", 
+            "aWVsZDI5GB0gASgFOgEwEhYKB2ZpZWxkMzAYHiABKAg6BWZhbHNlEhMKB2Zp", 
+            "ZWxkNjAYPCABKAU6Ai0xEhUKCGZpZWxkMjcxGI8CIAEoBToCLTESFQoIZmll", 
+            "bGQyNzIYkAIgASgFOgItMRIRCghmaWVsZDE1MBiWASABKAUSEgoHZmllbGQy", 
+            "MxgXIAEoBToBMBIWCgdmaWVsZDI0GBggASgIOgVmYWxzZRISCgdmaWVsZDI1", 
+            "GBkgASgFOgEwEjQKB2ZpZWxkMTUYDyABKAsyIy5iZW5jaG1hcmtzLlNwZWVk", 
+            "TWVzc2FnZTFTdWJNZXNzYWdlEg8KB2ZpZWxkNzgYTiABKAgSEgoHZmllbGQ2", 
+            "NxhDIAEoBToBMBIPCgdmaWVsZDY4GEQgASgFEhQKCGZpZWxkMTI4GIABIAEo", 
+            "BToBMBIoCghmaWVsZDEyORiBASABKAk6FXh4eHh4eHh4eHh4eHh4eHh4eHh4", 
+            "eBIUCghmaWVsZDEzMRiDASABKAU6ATAiogMKF1NwZWVkTWVzc2FnZTFTdWJN", 
+            "ZXNzYWdlEhEKBmZpZWxkMRgBIAEoBToBMBIRCgZmaWVsZDIYAiABKAU6ATAS", 
+            "EQoGZmllbGQzGAMgASgFOgEwEg8KB2ZpZWxkMTUYDyABKAkSFQoHZmllbGQx", 
+            "MhgMIAEoCDoEdHJ1ZRIPCgdmaWVsZDEzGA0gASgDEg8KB2ZpZWxkMTQYDiAB", 
+            "KAMSDwoHZmllbGQxNhgQIAEoBRISCgdmaWVsZDE5GBMgASgFOgEyEhUKB2Zp", 
+            "ZWxkMjAYFCABKAg6BHRydWUSFQoHZmllbGQyOBgcIAEoCDoEdHJ1ZRIPCgdm", 
+            "aWVsZDIxGBUgASgGEg8KB2ZpZWxkMjIYFiABKAUSFgoHZmllbGQyMxgXIAEo", 
+            "CDoFZmFsc2USGAoIZmllbGQyMDYYzgEgASgIOgVmYWxzZRIRCghmaWVsZDIw", 
+            "MxjLASABKAcSEQoIZmllbGQyMDQYzAEgASgFEhEKCGZpZWxkMjA1GM0BIAEo", 
+            "CRIRCghmaWVsZDIwNxjPASABKAQSEQoIZmllbGQzMDAYrAIgASgEIsoHCg1T", 
+            "cGVlZE1lc3NhZ2UyEg4KBmZpZWxkMRgBIAEoCRIOCgZmaWVsZDMYAyABKAMS", 
+            "DgoGZmllbGQ0GAQgASgDEg8KB2ZpZWxkMzAYHiABKAMSFgoHZmllbGQ3NRhL", 
+            "IAEoCDoFZmFsc2USDgoGZmllbGQ2GAYgASgJEg4KBmZpZWxkMhgCIAEoDBIS", 
+            "CgdmaWVsZDIxGBUgASgFOgEwEg8KB2ZpZWxkNzEYRyABKAUSDwoHZmllbGQy", 
+            "NRgZIAEoAhITCghmaWVsZDEwORhtIAEoBToBMBIUCghmaWVsZDIxMBjSASAB", 
+            "KAU6ATASFAoIZmllbGQyMTEY0wEgASgFOgEwEhQKCGZpZWxkMjEyGNQBIAEo", 
+            "BToBMBIUCghmaWVsZDIxMxjVASABKAU6ATASFAoIZmllbGQyMTYY2AEgASgF", 
+            "OgEwEhQKCGZpZWxkMjE3GNkBIAEoBToBMBIUCghmaWVsZDIxOBjaASABKAU6", 
+            "ATASFAoIZmllbGQyMjAY3AEgASgFOgEwEhQKCGZpZWxkMjIxGN0BIAEoBToB", 
+            "MBIUCghmaWVsZDIyMhjeASABKAI6ATASDwoHZmllbGQ2Mxg/IAEoBRIwCgZn", 
+            "cm91cDEYCiADKAoyIC5iZW5jaG1hcmtzLlNwZWVkTWVzc2FnZTIuR3JvdXAx", 
+            "EhEKCGZpZWxkMTI4GIABIAMoCRIRCghmaWVsZDEzMRiDASABKAMSEAoIZmll", 
+            "bGQxMjcYfyADKAkSEQoIZmllbGQxMjkYgQEgASgFEhEKCGZpZWxkMTMwGIIB", 
+            "IAMoAxIYCghmaWVsZDIwNRjNASABKAg6BWZhbHNlEhgKCGZpZWxkMjA2GM4B", 
+            "IAEoCDoFZmFsc2UawwIKBkdyb3VwMRIPCgdmaWVsZDExGAsgAigCEg8KB2Zp", 
+            "ZWxkMjYYGiABKAISDwoHZmllbGQxMhgMIAEoCRIPCgdmaWVsZDEzGA0gASgJ", 
+            "Eg8KB2ZpZWxkMTQYDiADKAkSDwoHZmllbGQxNRgPIAIoBBIOCgZmaWVsZDUY", 
+            "BSABKAUSDwoHZmllbGQyNxgbIAEoCRIPCgdmaWVsZDI4GBwgASgFEg8KB2Zp", 
+            "ZWxkMjkYHSABKAkSDwoHZmllbGQxNhgQIAEoCRIPCgdmaWVsZDIyGBYgAygJ", 
+            "Eg8KB2ZpZWxkNzMYSSADKAUSEgoHZmllbGQyMBgUIAEoBToBMBIPCgdmaWVs", 
+            "ZDI0GBggASgJEjgKB2ZpZWxkMzEYHyABKAsyJy5iZW5jaG1hcmtzLlNwZWVk", 
+            "TWVzc2FnZTJHcm91cGVkTWVzc2FnZSLfAQobU3BlZWRNZXNzYWdlMkdyb3Vw", 
+            "ZWRNZXNzYWdlEg4KBmZpZWxkMRgBIAEoAhIOCgZmaWVsZDIYAiABKAISEQoG", 
+            "ZmllbGQzGAMgASgCOgEwEg4KBmZpZWxkNBgEIAEoCBIOCgZmaWVsZDUYBSAB", 
+            "KAgSFAoGZmllbGQ2GAYgASgIOgR0cnVlEhUKBmZpZWxkNxgHIAEoCDoFZmFs", 
+            "c2USDgoGZmllbGQ4GAggASgCEg4KBmZpZWxkORgJIAEoCBIPCgdmaWVsZDEw", 
+            "GAogASgCEg8KB2ZpZWxkMTEYCyABKANCM0ILR29vZ2xlU3BlZWRIAaoCIUdv", 
+          "b2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcw=="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_benchmarks_SpeedMessage1__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_benchmarks_SpeedMessage1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Builder>(internal__static_benchmarks_SpeedMessage1__Descriptor,
+                new string[] { "Field1", "Field9", "Field18", "Field80", "Field81", "Field2", "Field3", "Field280", "Field6", "Field22", "Field4", "Field5", "Field59", "Field7", "Field16", "Field130", "Field12", "Field17", "Field13", "Field14", "Field104", "Field100", "Field101", "Field102", "Field103", "Field29", "Field30", "Field60", "Field271", "Field272", "Field150", "Field23", "Field24", "Field25", "Field15", "Field78", "Field67", "Field68", "Field128", "Field129", "Field131", });
+        internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder>(internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300", });
+        internal__static_benchmarks_SpeedMessage2__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_benchmarks_SpeedMessage2__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Builder>(internal__static_benchmarks_SpeedMessage2__Descriptor,
+                new string[] { "Field1", "Field3", "Field4", "Field30", "Field75", "Field6", "Field2", "Field21", "Field71", "Field25", "Field109", "Field210", "Field211", "Field212", "Field213", "Field216", "Field217", "Field218", "Field220", "Field221", "Field222", "Field63", "Group1", "Field128", "Field131", "Field127", "Field129", "Field130", "Field205", "Field206", });
+        internal__static_benchmarks_SpeedMessage2_Group1__Descriptor = internal__static_benchmarks_SpeedMessage2__Descriptor.NestedTypes[0];
+        internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder>(internal__static_benchmarks_SpeedMessage2_Group1__Descriptor,
+                new string[] { "Field11", "Field26", "Field12", "Field13", "Field14", "Field15", "Field5", "Field27", "Field28", "Field29", "Field16", "Field22", "Field73", "Field20", "Field24", "Field31", });
+        internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder>(internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field4", "Field5", "Field6", "Field7", "Field8", "Field9", "Field10", "Field11", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          }, assigner);
+    }
+    #endregion
+
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SpeedMessage1 : pb::GeneratedMessage<SpeedMessage1, SpeedMessage1.Builder> {
+    private SpeedMessage1() { }
+    private static readonly SpeedMessage1 defaultInstance = new SpeedMessage1().MakeReadOnly();
+    private static readonly string[] _speedMessage1FieldNames = new string[] { "field1", "field100", "field101", "field102", "field103", "field104", "field12", "field128", "field129", "field13", "field130", "field131", "field14", "field15", "field150", "field16", "field17", "field18", "field2", "field22", "field23", "field24", "field25", "field271", "field272", "field280", "field29", "field3", "field30", "field4", "field5", "field59", "field6", "field60", "field67", "field68", "field7", "field78", "field80", "field81", "field9" };
+    private static readonly uint[] _speedMessage1FieldTags = new uint[] { 10, 800, 808, 818, 826, 832, 96, 1024, 1034, 104, 1040, 1048, 112, 122, 1200, 128, 136, 146, 16, 176, 184, 192, 200, 2168, 2176, 2240, 232, 24, 240, 34, 41, 472, 48, 480, 536, 544, 58, 624, 640, 648, 74 };
+    public static SpeedMessage1 DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SpeedMessage1 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SpeedMessage1 ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage1__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage1, SpeedMessage1.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage1__FieldAccessorTable; }
+    }
+
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private string field9_ = "";
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public string Field9 {
+      get { return field9_; }
+    }
+
+    public const int Field18FieldNumber = 18;
+    private bool hasField18;
+    private string field18_ = "";
+    public bool HasField18 {
+      get { return hasField18; }
+    }
+    public string Field18 {
+      get { return field18_; }
+    }
+
+    public const int Field80FieldNumber = 80;
+    private bool hasField80;
+    private bool field80_;
+    public bool HasField80 {
+      get { return hasField80; }
+    }
+    public bool Field80 {
+      get { return field80_; }
+    }
+
+    public const int Field81FieldNumber = 81;
+    private bool hasField81;
+    private bool field81_ = true;
+    public bool HasField81 {
+      get { return hasField81; }
+    }
+    public bool Field81 {
+      get { return field81_; }
+    }
+
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+
+    public const int Field280FieldNumber = 280;
+    private bool hasField280;
+    private int field280_;
+    public bool HasField280 {
+      get { return hasField280; }
+    }
+    public int Field280 {
+      get { return field280_; }
+    }
+
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private int field6_;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public int Field6 {
+      get { return field6_; }
+    }
+
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private long field22_;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public long Field22 {
+      get { return field22_; }
+    }
+
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private string field4_ = "";
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public string Field4 {
+      get { return field4_; }
+    }
+
+    public const int Field5FieldNumber = 5;
+    private pbc::PopsicleList<ulong> field5_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> Field5List {
+      get { return pbc::Lists.AsReadOnly(field5_); }
+    }
+    public int Field5Count {
+      get { return field5_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetField5(int index) {
+      return field5_[index];
+    }
+
+    public const int Field59FieldNumber = 59;
+    private bool hasField59;
+    private bool field59_;
+    public bool HasField59 {
+      get { return hasField59; }
+    }
+    public bool Field59 {
+      get { return field59_; }
+    }
+
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private string field7_ = "";
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public string Field7 {
+      get { return field7_; }
+    }
+
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+
+    public const int Field130FieldNumber = 130;
+    private bool hasField130;
+    private int field130_;
+    public bool HasField130 {
+      get { return hasField130; }
+    }
+    public int Field130 {
+      get { return field130_; }
+    }
+
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+
+    public const int Field17FieldNumber = 17;
+    private bool hasField17;
+    private bool field17_ = true;
+    public bool HasField17 {
+      get { return hasField17; }
+    }
+    public bool Field17 {
+      get { return field17_; }
+    }
+
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private bool field13_ = true;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public bool Field13 {
+      get { return field13_; }
+    }
+
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private bool field14_ = true;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public bool Field14 {
+      get { return field14_; }
+    }
+
+    public const int Field104FieldNumber = 104;
+    private bool hasField104;
+    private int field104_;
+    public bool HasField104 {
+      get { return hasField104; }
+    }
+    public int Field104 {
+      get { return field104_; }
+    }
+
+    public const int Field100FieldNumber = 100;
+    private bool hasField100;
+    private int field100_;
+    public bool HasField100 {
+      get { return hasField100; }
+    }
+    public int Field100 {
+      get { return field100_; }
+    }
+
+    public const int Field101FieldNumber = 101;
+    private bool hasField101;
+    private int field101_;
+    public bool HasField101 {
+      get { return hasField101; }
+    }
+    public int Field101 {
+      get { return field101_; }
+    }
+
+    public const int Field102FieldNumber = 102;
+    private bool hasField102;
+    private string field102_ = "";
+    public bool HasField102 {
+      get { return hasField102; }
+    }
+    public string Field102 {
+      get { return field102_; }
+    }
+
+    public const int Field103FieldNumber = 103;
+    private bool hasField103;
+    private string field103_ = "";
+    public bool HasField103 {
+      get { return hasField103; }
+    }
+    public string Field103 {
+      get { return field103_; }
+    }
+
+    public const int Field29FieldNumber = 29;
+    private bool hasField29;
+    private int field29_;
+    public bool HasField29 {
+      get { return hasField29; }
+    }
+    public int Field29 {
+      get { return field29_; }
+    }
+
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private bool field30_;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public bool Field30 {
+      get { return field30_; }
+    }
+
+    public const int Field60FieldNumber = 60;
+    private bool hasField60;
+    private int field60_ = -1;
+    public bool HasField60 {
+      get { return hasField60; }
+    }
+    public int Field60 {
+      get { return field60_; }
+    }
+
+    public const int Field271FieldNumber = 271;
+    private bool hasField271;
+    private int field271_ = -1;
+    public bool HasField271 {
+      get { return hasField271; }
+    }
+    public int Field271 {
+      get { return field271_; }
+    }
+
+    public const int Field272FieldNumber = 272;
+    private bool hasField272;
+    private int field272_ = -1;
+    public bool HasField272 {
+      get { return hasField272; }
+    }
+    public int Field272 {
+      get { return field272_; }
+    }
+
+    public const int Field150FieldNumber = 150;
+    private bool hasField150;
+    private int field150_;
+    public bool HasField150 {
+      get { return hasField150; }
+    }
+    public int Field150 {
+      get { return field150_; }
+    }
+
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private int field23_;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public int Field23 {
+      get { return field23_; }
+    }
+
+    public const int Field24FieldNumber = 24;
+    private bool hasField24;
+    private bool field24_;
+    public bool HasField24 {
+      get { return hasField24; }
+    }
+    public bool Field24 {
+      get { return field24_; }
+    }
+
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private int field25_;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public int Field25 {
+      get { return field25_; }
+    }
+
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage field15_;
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage Field15 {
+      get { return field15_ ?? global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance; }
+    }
+
+    public const int Field78FieldNumber = 78;
+    private bool hasField78;
+    private bool field78_;
+    public bool HasField78 {
+      get { return hasField78; }
+    }
+    public bool Field78 {
+      get { return field78_; }
+    }
+
+    public const int Field67FieldNumber = 67;
+    private bool hasField67;
+    private int field67_;
+    public bool HasField67 {
+      get { return hasField67; }
+    }
+    public int Field67 {
+      get { return field67_; }
+    }
+
+    public const int Field68FieldNumber = 68;
+    private bool hasField68;
+    private int field68_;
+    public bool HasField68 {
+      get { return hasField68; }
+    }
+    public int Field68 {
+      get { return field68_; }
+    }
+
+    public const int Field128FieldNumber = 128;
+    private bool hasField128;
+    private int field128_;
+    public bool HasField128 {
+      get { return hasField128; }
+    }
+    public int Field128 {
+      get { return field128_; }
+    }
+
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private string field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public string Field129 {
+      get { return field129_; }
+    }
+
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private int field131_;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public int Field131 {
+      get { return field131_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!hasField1) return false;
+        if (!hasField2) return false;
+        if (!hasField3) return false;
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _speedMessage1FieldNames;
+      if (hasField1) {
+        output.WriteString(1, field_names[0], Field1);
+      }
+      if (hasField2) {
+        output.WriteInt32(2, field_names[18], Field2);
+      }
+      if (hasField3) {
+        output.WriteInt32(3, field_names[27], Field3);
+      }
+      if (hasField4) {
+        output.WriteString(4, field_names[29], Field4);
+      }
+      if (field5_.Count > 0) {
+        output.WriteFixed64Array(5, field_names[30], field5_);
+      }
+      if (hasField6) {
+        output.WriteInt32(6, field_names[32], Field6);
+      }
+      if (hasField7) {
+        output.WriteString(7, field_names[36], Field7);
+      }
+      if (hasField9) {
+        output.WriteString(9, field_names[40], Field9);
+      }
+      if (hasField12) {
+        output.WriteBool(12, field_names[6], Field12);
+      }
+      if (hasField13) {
+        output.WriteBool(13, field_names[9], Field13);
+      }
+      if (hasField14) {
+        output.WriteBool(14, field_names[12], Field14);
+      }
+      if (hasField15) {
+        output.WriteMessage(15, field_names[13], Field15);
+      }
+      if (hasField16) {
+        output.WriteInt32(16, field_names[15], Field16);
+      }
+      if (hasField17) {
+        output.WriteBool(17, field_names[16], Field17);
+      }
+      if (hasField18) {
+        output.WriteString(18, field_names[17], Field18);
+      }
+      if (hasField22) {
+        output.WriteInt64(22, field_names[19], Field22);
+      }
+      if (hasField23) {
+        output.WriteInt32(23, field_names[20], Field23);
+      }
+      if (hasField24) {
+        output.WriteBool(24, field_names[21], Field24);
+      }
+      if (hasField25) {
+        output.WriteInt32(25, field_names[22], Field25);
+      }
+      if (hasField29) {
+        output.WriteInt32(29, field_names[26], Field29);
+      }
+      if (hasField30) {
+        output.WriteBool(30, field_names[28], Field30);
+      }
+      if (hasField59) {
+        output.WriteBool(59, field_names[31], Field59);
+      }
+      if (hasField60) {
+        output.WriteInt32(60, field_names[33], Field60);
+      }
+      if (hasField67) {
+        output.WriteInt32(67, field_names[34], Field67);
+      }
+      if (hasField68) {
+        output.WriteInt32(68, field_names[35], Field68);
+      }
+      if (hasField78) {
+        output.WriteBool(78, field_names[37], Field78);
+      }
+      if (hasField80) {
+        output.WriteBool(80, field_names[38], Field80);
+      }
+      if (hasField81) {
+        output.WriteBool(81, field_names[39], Field81);
+      }
+      if (hasField100) {
+        output.WriteInt32(100, field_names[1], Field100);
+      }
+      if (hasField101) {
+        output.WriteInt32(101, field_names[2], Field101);
+      }
+      if (hasField102) {
+        output.WriteString(102, field_names[3], Field102);
+      }
+      if (hasField103) {
+        output.WriteString(103, field_names[4], Field103);
+      }
+      if (hasField104) {
+        output.WriteInt32(104, field_names[5], Field104);
+      }
+      if (hasField128) {
+        output.WriteInt32(128, field_names[7], Field128);
+      }
+      if (hasField129) {
+        output.WriteString(129, field_names[8], Field129);
+      }
+      if (hasField130) {
+        output.WriteInt32(130, field_names[10], Field130);
+      }
+      if (hasField131) {
+        output.WriteInt32(131, field_names[11], Field131);
+      }
+      if (hasField150) {
+        output.WriteInt32(150, field_names[14], Field150);
+      }
+      if (hasField271) {
+        output.WriteInt32(271, field_names[23], Field271);
+      }
+      if (hasField272) {
+        output.WriteInt32(272, field_names[24], Field272);
+      }
+      if (hasField280) {
+        output.WriteInt32(280, field_names[25], Field280);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasField1) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, Field1);
+      }
+      if (hasField9) {
+        size += pb::CodedOutputStream.ComputeStringSize(9, Field9);
+      }
+      if (hasField18) {
+        size += pb::CodedOutputStream.ComputeStringSize(18, Field18);
+      }
+      if (hasField80) {
+        size += pb::CodedOutputStream.ComputeBoolSize(80, Field80);
+      }
+      if (hasField81) {
+        size += pb::CodedOutputStream.ComputeBoolSize(81, Field81);
+      }
+      if (hasField2) {
+        size += pb::CodedOutputStream.ComputeInt32Size(2, Field2);
+      }
+      if (hasField3) {
+        size += pb::CodedOutputStream.ComputeInt32Size(3, Field3);
+      }
+      if (hasField280) {
+        size += pb::CodedOutputStream.ComputeInt32Size(280, Field280);
+      }
+      if (hasField6) {
+        size += pb::CodedOutputStream.ComputeInt32Size(6, Field6);
+      }
+      if (hasField22) {
+        size += pb::CodedOutputStream.ComputeInt64Size(22, Field22);
+      }
+      if (hasField4) {
+        size += pb::CodedOutputStream.ComputeStringSize(4, Field4);
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * field5_.Count;
+        size += dataSize;
+        size += 1 * field5_.Count;
+      }
+      if (hasField59) {
+        size += pb::CodedOutputStream.ComputeBoolSize(59, Field59);
+      }
+      if (hasField7) {
+        size += pb::CodedOutputStream.ComputeStringSize(7, Field7);
+      }
+      if (hasField16) {
+        size += pb::CodedOutputStream.ComputeInt32Size(16, Field16);
+      }
+      if (hasField130) {
+        size += pb::CodedOutputStream.ComputeInt32Size(130, Field130);
+      }
+      if (hasField12) {
+        size += pb::CodedOutputStream.ComputeBoolSize(12, Field12);
+      }
+      if (hasField17) {
+        size += pb::CodedOutputStream.ComputeBoolSize(17, Field17);
+      }
+      if (hasField13) {
+        size += pb::CodedOutputStream.ComputeBoolSize(13, Field13);
+      }
+      if (hasField14) {
+        size += pb::CodedOutputStream.ComputeBoolSize(14, Field14);
+      }
+      if (hasField104) {
+        size += pb::CodedOutputStream.ComputeInt32Size(104, Field104);
+      }
+      if (hasField100) {
+        size += pb::CodedOutputStream.ComputeInt32Size(100, Field100);
+      }
+      if (hasField101) {
+        size += pb::CodedOutputStream.ComputeInt32Size(101, Field101);
+      }
+      if (hasField102) {
+        size += pb::CodedOutputStream.ComputeStringSize(102, Field102);
+      }
+      if (hasField103) {
+        size += pb::CodedOutputStream.ComputeStringSize(103, Field103);
+      }
+      if (hasField29) {
+        size += pb::CodedOutputStream.ComputeInt32Size(29, Field29);
+      }
+      if (hasField30) {
+        size += pb::CodedOutputStream.ComputeBoolSize(30, Field30);
+      }
+      if (hasField60) {
+        size += pb::CodedOutputStream.ComputeInt32Size(60, Field60);
+      }
+      if (hasField271) {
+        size += pb::CodedOutputStream.ComputeInt32Size(271, Field271);
+      }
+      if (hasField272) {
+        size += pb::CodedOutputStream.ComputeInt32Size(272, Field272);
+      }
+      if (hasField150) {
+        size += pb::CodedOutputStream.ComputeInt32Size(150, Field150);
+      }
+      if (hasField23) {
+        size += pb::CodedOutputStream.ComputeInt32Size(23, Field23);
+      }
+      if (hasField24) {
+        size += pb::CodedOutputStream.ComputeBoolSize(24, Field24);
+      }
+      if (hasField25) {
+        size += pb::CodedOutputStream.ComputeInt32Size(25, Field25);
+      }
+      if (hasField15) {
+        size += pb::CodedOutputStream.ComputeMessageSize(15, Field15);
+      }
+      if (hasField78) {
+        size += pb::CodedOutputStream.ComputeBoolSize(78, Field78);
+      }
+      if (hasField67) {
+        size += pb::CodedOutputStream.ComputeInt32Size(67, Field67);
+      }
+      if (hasField68) {
+        size += pb::CodedOutputStream.ComputeInt32Size(68, Field68);
+      }
+      if (hasField128) {
+        size += pb::CodedOutputStream.ComputeInt32Size(128, Field128);
+      }
+      if (hasField129) {
+        size += pb::CodedOutputStream.ComputeStringSize(129, Field129);
+      }
+      if (hasField131) {
+        size += pb::CodedOutputStream.ComputeInt32Size(131, Field131);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SpeedMessage1 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SpeedMessage1 MakeReadOnly() {
+      field5_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage1 prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage1, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SpeedMessage1 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SpeedMessage1 result;
+
+      private SpeedMessage1 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SpeedMessage1 original = result;
+          result = new SpeedMessage1();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SpeedMessage1 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Descriptor; }
+      }
+
+      public override SpeedMessage1 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.DefaultInstance; }
+      }
+
+      public override SpeedMessage1 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage1) {
+          return MergeFrom((SpeedMessage1) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(SpeedMessage1 other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField9) {
+          Field9 = other.Field9;
+        }
+        if (other.HasField18) {
+          Field18 = other.Field18;
+        }
+        if (other.HasField80) {
+          Field80 = other.Field80;
+        }
+        if (other.HasField81) {
+          Field81 = other.Field81;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField280) {
+          Field280 = other.Field280;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField22) {
+          Field22 = other.Field22;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.field5_.Count != 0) {
+          result.field5_.Add(other.field5_);
+        }
+        if (other.HasField59) {
+          Field59 = other.Field59;
+        }
+        if (other.HasField7) {
+          Field7 = other.Field7;
+        }
+        if (other.HasField16) {
+          Field16 = other.Field16;
+        }
+        if (other.HasField130) {
+          Field130 = other.Field130;
+        }
+        if (other.HasField12) {
+          Field12 = other.Field12;
+        }
+        if (other.HasField17) {
+          Field17 = other.Field17;
+        }
+        if (other.HasField13) {
+          Field13 = other.Field13;
+        }
+        if (other.HasField14) {
+          Field14 = other.Field14;
+        }
+        if (other.HasField104) {
+          Field104 = other.Field104;
+        }
+        if (other.HasField100) {
+          Field100 = other.Field100;
+        }
+        if (other.HasField101) {
+          Field101 = other.Field101;
+        }
+        if (other.HasField102) {
+          Field102 = other.Field102;
+        }
+        if (other.HasField103) {
+          Field103 = other.Field103;
+        }
+        if (other.HasField29) {
+          Field29 = other.Field29;
+        }
+        if (other.HasField30) {
+          Field30 = other.Field30;
+        }
+        if (other.HasField60) {
+          Field60 = other.Field60;
+        }
+        if (other.HasField271) {
+          Field271 = other.Field271;
+        }
+        if (other.HasField272) {
+          Field272 = other.Field272;
+        }
+        if (other.HasField150) {
+          Field150 = other.Field150;
+        }
+        if (other.HasField23) {
+          Field23 = other.Field23;
+        }
+        if (other.HasField24) {
+          Field24 = other.Field24;
+        }
+        if (other.HasField25) {
+          Field25 = other.Field25;
+        }
+        if (other.HasField15) {
+          MergeField15(other.Field15);
+        }
+        if (other.HasField78) {
+          Field78 = other.Field78;
+        }
+        if (other.HasField67) {
+          Field67 = other.Field67;
+        }
+        if (other.HasField68) {
+          Field68 = other.Field68;
+        }
+        if (other.HasField128) {
+          Field128 = other.Field128;
+        }
+        if (other.HasField129) {
+          Field129 = other.Field129;
+        }
+        if (other.HasField131) {
+          Field131 = other.Field131;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_speedMessage1FieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _speedMessage1FieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasField1 = input.ReadString(ref result.field1_);
+              break;
+            }
+            case 16: {
+              result.hasField2 = input.ReadInt32(ref result.field2_);
+              break;
+            }
+            case 24: {
+              result.hasField3 = input.ReadInt32(ref result.field3_);
+              break;
+            }
+            case 34: {
+              result.hasField4 = input.ReadString(ref result.field4_);
+              break;
+            }
+            case 42:
+            case 41: {
+              input.ReadFixed64Array(tag, field_name, result.field5_);
+              break;
+            }
+            case 48: {
+              result.hasField6 = input.ReadInt32(ref result.field6_);
+              break;
+            }
+            case 58: {
+              result.hasField7 = input.ReadString(ref result.field7_);
+              break;
+            }
+            case 74: {
+              result.hasField9 = input.ReadString(ref result.field9_);
+              break;
+            }
+            case 96: {
+              result.hasField12 = input.ReadBool(ref result.field12_);
+              break;
+            }
+            case 104: {
+              result.hasField13 = input.ReadBool(ref result.field13_);
+              break;
+            }
+            case 112: {
+              result.hasField14 = input.ReadBool(ref result.field14_);
+              break;
+            }
+            case 122: {
+              global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.CreateBuilder();
+              if (result.hasField15) {
+                subBuilder.MergeFrom(Field15);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Field15 = subBuilder.BuildPartial();
+              break;
+            }
+            case 128: {
+              result.hasField16 = input.ReadInt32(ref result.field16_);
+              break;
+            }
+            case 136: {
+              result.hasField17 = input.ReadBool(ref result.field17_);
+              break;
+            }
+            case 146: {
+              result.hasField18 = input.ReadString(ref result.field18_);
+              break;
+            }
+            case 176: {
+              result.hasField22 = input.ReadInt64(ref result.field22_);
+              break;
+            }
+            case 184: {
+              result.hasField23 = input.ReadInt32(ref result.field23_);
+              break;
+            }
+            case 192: {
+              result.hasField24 = input.ReadBool(ref result.field24_);
+              break;
+            }
+            case 200: {
+              result.hasField25 = input.ReadInt32(ref result.field25_);
+              break;
+            }
+            case 232: {
+              result.hasField29 = input.ReadInt32(ref result.field29_);
+              break;
+            }
+            case 240: {
+              result.hasField30 = input.ReadBool(ref result.field30_);
+              break;
+            }
+            case 472: {
+              result.hasField59 = input.ReadBool(ref result.field59_);
+              break;
+            }
+            case 480: {
+              result.hasField60 = input.ReadInt32(ref result.field60_);
+              break;
+            }
+            case 536: {
+              result.hasField67 = input.ReadInt32(ref result.field67_);
+              break;
+            }
+            case 544: {
+              result.hasField68 = input.ReadInt32(ref result.field68_);
+              break;
+            }
+            case 624: {
+              result.hasField78 = input.ReadBool(ref result.field78_);
+              break;
+            }
+            case 640: {
+              result.hasField80 = input.ReadBool(ref result.field80_);
+              break;
+            }
+            case 648: {
+              result.hasField81 = input.ReadBool(ref result.field81_);
+              break;
+            }
+            case 800: {
+              result.hasField100 = input.ReadInt32(ref result.field100_);
+              break;
+            }
+            case 808: {
+              result.hasField101 = input.ReadInt32(ref result.field101_);
+              break;
+            }
+            case 818: {
+              result.hasField102 = input.ReadString(ref result.field102_);
+              break;
+            }
+            case 826: {
+              result.hasField103 = input.ReadString(ref result.field103_);
+              break;
+            }
+            case 832: {
+              result.hasField104 = input.ReadInt32(ref result.field104_);
+              break;
+            }
+            case 1024: {
+              result.hasField128 = input.ReadInt32(ref result.field128_);
+              break;
+            }
+            case 1034: {
+              result.hasField129 = input.ReadString(ref result.field129_);
+              break;
+            }
+            case 1040: {
+              result.hasField130 = input.ReadInt32(ref result.field130_);
+              break;
+            }
+            case 1048: {
+              result.hasField131 = input.ReadInt32(ref result.field131_);
+              break;
+            }
+            case 1200: {
+              result.hasField150 = input.ReadInt32(ref result.field150_);
+              break;
+            }
+            case 2168: {
+              result.hasField271 = input.ReadInt32(ref result.field271_);
+              break;
+            }
+            case 2176: {
+              result.hasField272 = input.ReadInt32(ref result.field272_);
+              break;
+            }
+            case 2240: {
+              result.hasField280 = input.ReadInt32(ref result.field280_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = "";
+        return this;
+      }
+
+      public bool HasField9 {
+        get { return result.hasField9; }
+      }
+      public string Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        PrepareBuilder();
+        result.hasField9 = false;
+        result.field9_ = "";
+        return this;
+      }
+
+      public bool HasField18 {
+        get { return result.hasField18; }
+      }
+      public string Field18 {
+        get { return result.Field18; }
+        set { SetField18(value); }
+      }
+      public Builder SetField18(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField18 = true;
+        result.field18_ = value;
+        return this;
+      }
+      public Builder ClearField18() {
+        PrepareBuilder();
+        result.hasField18 = false;
+        result.field18_ = "";
+        return this;
+      }
+
+      public bool HasField80 {
+        get { return result.hasField80; }
+      }
+      public bool Field80 {
+        get { return result.Field80; }
+        set { SetField80(value); }
+      }
+      public Builder SetField80(bool value) {
+        PrepareBuilder();
+        result.hasField80 = true;
+        result.field80_ = value;
+        return this;
+      }
+      public Builder ClearField80() {
+        PrepareBuilder();
+        result.hasField80 = false;
+        result.field80_ = false;
+        return this;
+      }
+
+      public bool HasField81 {
+        get { return result.hasField81; }
+      }
+      public bool Field81 {
+        get { return result.Field81; }
+        set { SetField81(value); }
+      }
+      public Builder SetField81(bool value) {
+        PrepareBuilder();
+        result.hasField81 = true;
+        result.field81_ = value;
+        return this;
+      }
+      public Builder ClearField81() {
+        PrepareBuilder();
+        result.hasField81 = false;
+        result.field81_ = true;
+        return this;
+      }
+
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+
+      public bool HasField280 {
+        get { return result.hasField280; }
+      }
+      public int Field280 {
+        get { return result.Field280; }
+        set { SetField280(value); }
+      }
+      public Builder SetField280(int value) {
+        PrepareBuilder();
+        result.hasField280 = true;
+        result.field280_ = value;
+        return this;
+      }
+      public Builder ClearField280() {
+        PrepareBuilder();
+        result.hasField280 = false;
+        result.field280_ = 0;
+        return this;
+      }
+
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public int Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(int value) {
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = 0;
+        return this;
+      }
+
+      public bool HasField22 {
+        get { return result.hasField22; }
+      }
+      public long Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(long value) {
+        PrepareBuilder();
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        PrepareBuilder();
+        result.hasField22 = false;
+        result.field22_ = 0L;
+        return this;
+      }
+
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public string Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = "";
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> Field5List {
+        get { return PrepareBuilder().field5_; }
+      }
+      public int Field5Count {
+        get { return result.Field5Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetField5(int index) {
+        return result.GetField5(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField5(int index, ulong value) {
+        PrepareBuilder();
+        result.field5_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddField5(ulong value) {
+        PrepareBuilder();
+        result.field5_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeField5(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.field5_.Add(values);
+        return this;
+      }
+      public Builder ClearField5() {
+        PrepareBuilder();
+        result.field5_.Clear();
+        return this;
+      }
+
+      public bool HasField59 {
+        get { return result.hasField59; }
+      }
+      public bool Field59 {
+        get { return result.Field59; }
+        set { SetField59(value); }
+      }
+      public Builder SetField59(bool value) {
+        PrepareBuilder();
+        result.hasField59 = true;
+        result.field59_ = value;
+        return this;
+      }
+      public Builder ClearField59() {
+        PrepareBuilder();
+        result.hasField59 = false;
+        result.field59_ = false;
+        return this;
+      }
+
+      public bool HasField7 {
+        get { return result.hasField7; }
+      }
+      public string Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        PrepareBuilder();
+        result.hasField7 = false;
+        result.field7_ = "";
+        return this;
+      }
+
+      public bool HasField16 {
+        get { return result.hasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        PrepareBuilder();
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        PrepareBuilder();
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+
+      public bool HasField130 {
+        get { return result.hasField130; }
+      }
+      public int Field130 {
+        get { return result.Field130; }
+        set { SetField130(value); }
+      }
+      public Builder SetField130(int value) {
+        PrepareBuilder();
+        result.hasField130 = true;
+        result.field130_ = value;
+        return this;
+      }
+      public Builder ClearField130() {
+        PrepareBuilder();
+        result.hasField130 = false;
+        result.field130_ = 0;
+        return this;
+      }
+
+      public bool HasField12 {
+        get { return result.hasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        PrepareBuilder();
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        PrepareBuilder();
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+
+      public bool HasField17 {
+        get { return result.hasField17; }
+      }
+      public bool Field17 {
+        get { return result.Field17; }
+        set { SetField17(value); }
+      }
+      public Builder SetField17(bool value) {
+        PrepareBuilder();
+        result.hasField17 = true;
+        result.field17_ = value;
+        return this;
+      }
+      public Builder ClearField17() {
+        PrepareBuilder();
+        result.hasField17 = false;
+        result.field17_ = true;
+        return this;
+      }
+
+      public bool HasField13 {
+        get { return result.hasField13; }
+      }
+      public bool Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(bool value) {
+        PrepareBuilder();
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        PrepareBuilder();
+        result.hasField13 = false;
+        result.field13_ = true;
+        return this;
+      }
+
+      public bool HasField14 {
+        get { return result.hasField14; }
+      }
+      public bool Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(bool value) {
+        PrepareBuilder();
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        PrepareBuilder();
+        result.hasField14 = false;
+        result.field14_ = true;
+        return this;
+      }
+
+      public bool HasField104 {
+        get { return result.hasField104; }
+      }
+      public int Field104 {
+        get { return result.Field104; }
+        set { SetField104(value); }
+      }
+      public Builder SetField104(int value) {
+        PrepareBuilder();
+        result.hasField104 = true;
+        result.field104_ = value;
+        return this;
+      }
+      public Builder ClearField104() {
+        PrepareBuilder();
+        result.hasField104 = false;
+        result.field104_ = 0;
+        return this;
+      }
+
+      public bool HasField100 {
+        get { return result.hasField100; }
+      }
+      public int Field100 {
+        get { return result.Field100; }
+        set { SetField100(value); }
+      }
+      public Builder SetField100(int value) {
+        PrepareBuilder();
+        result.hasField100 = true;
+        result.field100_ = value;
+        return this;
+      }
+      public Builder ClearField100() {
+        PrepareBuilder();
+        result.hasField100 = false;
+        result.field100_ = 0;
+        return this;
+      }
+
+      public bool HasField101 {
+        get { return result.hasField101; }
+      }
+      public int Field101 {
+        get { return result.Field101; }
+        set { SetField101(value); }
+      }
+      public Builder SetField101(int value) {
+        PrepareBuilder();
+        result.hasField101 = true;
+        result.field101_ = value;
+        return this;
+      }
+      public Builder ClearField101() {
+        PrepareBuilder();
+        result.hasField101 = false;
+        result.field101_ = 0;
+        return this;
+      }
+
+      public bool HasField102 {
+        get { return result.hasField102; }
+      }
+      public string Field102 {
+        get { return result.Field102; }
+        set { SetField102(value); }
+      }
+      public Builder SetField102(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField102 = true;
+        result.field102_ = value;
+        return this;
+      }
+      public Builder ClearField102() {
+        PrepareBuilder();
+        result.hasField102 = false;
+        result.field102_ = "";
+        return this;
+      }
+
+      public bool HasField103 {
+        get { return result.hasField103; }
+      }
+      public string Field103 {
+        get { return result.Field103; }
+        set { SetField103(value); }
+      }
+      public Builder SetField103(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField103 = true;
+        result.field103_ = value;
+        return this;
+      }
+      public Builder ClearField103() {
+        PrepareBuilder();
+        result.hasField103 = false;
+        result.field103_ = "";
+        return this;
+      }
+
+      public bool HasField29 {
+        get { return result.hasField29; }
+      }
+      public int Field29 {
+        get { return result.Field29; }
+        set { SetField29(value); }
+      }
+      public Builder SetField29(int value) {
+        PrepareBuilder();
+        result.hasField29 = true;
+        result.field29_ = value;
+        return this;
+      }
+      public Builder ClearField29() {
+        PrepareBuilder();
+        result.hasField29 = false;
+        result.field29_ = 0;
+        return this;
+      }
+
+      public bool HasField30 {
+        get { return result.hasField30; }
+      }
+      public bool Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(bool value) {
+        PrepareBuilder();
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        PrepareBuilder();
+        result.hasField30 = false;
+        result.field30_ = false;
+        return this;
+      }
+
+      public bool HasField60 {
+        get { return result.hasField60; }
+      }
+      public int Field60 {
+        get { return result.Field60; }
+        set { SetField60(value); }
+      }
+      public Builder SetField60(int value) {
+        PrepareBuilder();
+        result.hasField60 = true;
+        result.field60_ = value;
+        return this;
+      }
+      public Builder ClearField60() {
+        PrepareBuilder();
+        result.hasField60 = false;
+        result.field60_ = -1;
+        return this;
+      }
+
+      public bool HasField271 {
+        get { return result.hasField271; }
+      }
+      public int Field271 {
+        get { return result.Field271; }
+        set { SetField271(value); }
+      }
+      public Builder SetField271(int value) {
+        PrepareBuilder();
+        result.hasField271 = true;
+        result.field271_ = value;
+        return this;
+      }
+      public Builder ClearField271() {
+        PrepareBuilder();
+        result.hasField271 = false;
+        result.field271_ = -1;
+        return this;
+      }
+
+      public bool HasField272 {
+        get { return result.hasField272; }
+      }
+      public int Field272 {
+        get { return result.Field272; }
+        set { SetField272(value); }
+      }
+      public Builder SetField272(int value) {
+        PrepareBuilder();
+        result.hasField272 = true;
+        result.field272_ = value;
+        return this;
+      }
+      public Builder ClearField272() {
+        PrepareBuilder();
+        result.hasField272 = false;
+        result.field272_ = -1;
+        return this;
+      }
+
+      public bool HasField150 {
+        get { return result.hasField150; }
+      }
+      public int Field150 {
+        get { return result.Field150; }
+        set { SetField150(value); }
+      }
+      public Builder SetField150(int value) {
+        PrepareBuilder();
+        result.hasField150 = true;
+        result.field150_ = value;
+        return this;
+      }
+      public Builder ClearField150() {
+        PrepareBuilder();
+        result.hasField150 = false;
+        result.field150_ = 0;
+        return this;
+      }
+
+      public bool HasField23 {
+        get { return result.hasField23; }
+      }
+      public int Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(int value) {
+        PrepareBuilder();
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        PrepareBuilder();
+        result.hasField23 = false;
+        result.field23_ = 0;
+        return this;
+      }
+
+      public bool HasField24 {
+        get { return result.hasField24; }
+      }
+      public bool Field24 {
+        get { return result.Field24; }
+        set { SetField24(value); }
+      }
+      public Builder SetField24(bool value) {
+        PrepareBuilder();
+        result.hasField24 = true;
+        result.field24_ = value;
+        return this;
+      }
+      public Builder ClearField24() {
+        PrepareBuilder();
+        result.hasField24 = false;
+        result.field24_ = false;
+        return this;
+      }
+
+      public bool HasField25 {
+        get { return result.hasField25; }
+      }
+      public int Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(int value) {
+        PrepareBuilder();
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        PrepareBuilder();
+        result.hasField25 = false;
+        result.field25_ = 0;
+        return this;
+      }
+
+      public bool HasField15 {
+       get { return result.hasField15; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasField15 &&
+            result.field15_ != global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance) {
+            result.field15_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.CreateBuilder(result.field15_).MergeFrom(value).BuildPartial();
+        } else {
+          result.field15_ = value;
+        }
+        result.hasField15 = true;
+        return this;
+      }
+      public Builder ClearField15() {
+        PrepareBuilder();
+        result.hasField15 = false;
+        result.field15_ = null;
+        return this;
+      }
+
+      public bool HasField78 {
+        get { return result.hasField78; }
+      }
+      public bool Field78 {
+        get { return result.Field78; }
+        set { SetField78(value); }
+      }
+      public Builder SetField78(bool value) {
+        PrepareBuilder();
+        result.hasField78 = true;
+        result.field78_ = value;
+        return this;
+      }
+      public Builder ClearField78() {
+        PrepareBuilder();
+        result.hasField78 = false;
+        result.field78_ = false;
+        return this;
+      }
+
+      public bool HasField67 {
+        get { return result.hasField67; }
+      }
+      public int Field67 {
+        get { return result.Field67; }
+        set { SetField67(value); }
+      }
+      public Builder SetField67(int value) {
+        PrepareBuilder();
+        result.hasField67 = true;
+        result.field67_ = value;
+        return this;
+      }
+      public Builder ClearField67() {
+        PrepareBuilder();
+        result.hasField67 = false;
+        result.field67_ = 0;
+        return this;
+      }
+
+      public bool HasField68 {
+        get { return result.hasField68; }
+      }
+      public int Field68 {
+        get { return result.Field68; }
+        set { SetField68(value); }
+      }
+      public Builder SetField68(int value) {
+        PrepareBuilder();
+        result.hasField68 = true;
+        result.field68_ = value;
+        return this;
+      }
+      public Builder ClearField68() {
+        PrepareBuilder();
+        result.hasField68 = false;
+        result.field68_ = 0;
+        return this;
+      }
+
+      public bool HasField128 {
+        get { return result.hasField128; }
+      }
+      public int Field128 {
+        get { return result.Field128; }
+        set { SetField128(value); }
+      }
+      public Builder SetField128(int value) {
+        PrepareBuilder();
+        result.hasField128 = true;
+        result.field128_ = value;
+        return this;
+      }
+      public Builder ClearField128() {
+        PrepareBuilder();
+        result.hasField128 = false;
+        result.field128_ = 0;
+        return this;
+      }
+
+      public bool HasField129 {
+        get { return result.hasField129; }
+      }
+      public string Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        PrepareBuilder();
+        result.hasField129 = false;
+        result.field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+        return this;
+      }
+
+      public bool HasField131 {
+        get { return result.hasField131; }
+      }
+      public int Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(int value) {
+        PrepareBuilder();
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        PrepareBuilder();
+        result.hasField131 = false;
+        result.field131_ = 0;
+        return this;
+      }
+    }
+    static SpeedMessage1() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SpeedMessage1SubMessage : pb::GeneratedMessage<SpeedMessage1SubMessage, SpeedMessage1SubMessage.Builder> {
+    private SpeedMessage1SubMessage() { }
+    private static readonly SpeedMessage1SubMessage defaultInstance = new SpeedMessage1SubMessage().MakeReadOnly();
+    private static readonly string[] _speedMessage1SubMessageFieldNames = new string[] { "field1", "field12", "field13", "field14", "field15", "field16", "field19", "field2", "field20", "field203", "field204", "field205", "field206", "field207", "field21", "field22", "field23", "field28", "field3", "field300" };
+    private static readonly uint[] _speedMessage1SubMessageFieldTags = new uint[] { 8, 96, 104, 112, 122, 128, 152, 16, 160, 1629, 1632, 1642, 1648, 1656, 169, 176, 184, 224, 24, 2400 };
+    public static SpeedMessage1SubMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SpeedMessage1SubMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SpeedMessage1SubMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage1SubMessage, SpeedMessage1SubMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable; }
+    }
+
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private int field1_;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public int Field1 {
+      get { return field1_; }
+    }
+
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private string field15_ = "";
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public string Field15 {
+      get { return field15_; }
+    }
+
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private long field13_;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public long Field13 {
+      get { return field13_; }
+    }
+
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private long field14_;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public long Field14 {
+      get { return field14_; }
+    }
+
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+
+    public const int Field19FieldNumber = 19;
+    private bool hasField19;
+    private int field19_ = 2;
+    public bool HasField19 {
+      get { return hasField19; }
+    }
+    public int Field19 {
+      get { return field19_; }
+    }
+
+    public const int Field20FieldNumber = 20;
+    private bool hasField20;
+    private bool field20_ = true;
+    public bool HasField20 {
+      get { return hasField20; }
+    }
+    public bool Field20 {
+      get { return field20_; }
+    }
+
+    public const int Field28FieldNumber = 28;
+    private bool hasField28;
+    private bool field28_ = true;
+    public bool HasField28 {
+      get { return hasField28; }
+    }
+    public bool Field28 {
+      get { return field28_; }
+    }
+
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private ulong field21_;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field21 {
+      get { return field21_; }
+    }
+
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private int field22_;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public int Field22 {
+      get { return field22_; }
+    }
+
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private bool field23_;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public bool Field23 {
+      get { return field23_; }
+    }
+
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+
+    public const int Field203FieldNumber = 203;
+    private bool hasField203;
+    private uint field203_;
+    public bool HasField203 {
+      get { return hasField203; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint Field203 {
+      get { return field203_; }
+    }
+
+    public const int Field204FieldNumber = 204;
+    private bool hasField204;
+    private int field204_;
+    public bool HasField204 {
+      get { return hasField204; }
+    }
+    public int Field204 {
+      get { return field204_; }
+    }
+
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private string field205_ = "";
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public string Field205 {
+      get { return field205_; }
+    }
+
+    public const int Field207FieldNumber = 207;
+    private bool hasField207;
+    private ulong field207_;
+    public bool HasField207 {
+      get { return hasField207; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field207 {
+      get { return field207_; }
+    }
+
+    public const int Field300FieldNumber = 300;
+    private bool hasField300;
+    private ulong field300_;
+    public bool HasField300 {
+      get { return hasField300; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field300 {
+      get { return field300_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _speedMessage1SubMessageFieldNames;
+      if (hasField1) {
+        output.WriteInt32(1, field_names[0], Field1);
+      }
+      if (hasField2) {
+        output.WriteInt32(2, field_names[7], Field2);
+      }
+      if (hasField3) {
+        output.WriteInt32(3, field_names[18], Field3);
+      }
+      if (hasField12) {
+        output.WriteBool(12, field_names[1], Field12);
+      }
+      if (hasField13) {
+        output.WriteInt64(13, field_names[2], Field13);
+      }
+      if (hasField14) {
+        output.WriteInt64(14, field_names[3], Field14);
+      }
+      if (hasField15) {
+        output.WriteString(15, field_names[4], Field15);
+      }
+      if (hasField16) {
+        output.WriteInt32(16, field_names[5], Field16);
+      }
+      if (hasField19) {
+        output.WriteInt32(19, field_names[6], Field19);
+      }
+      if (hasField20) {
+        output.WriteBool(20, field_names[8], Field20);
+      }
+      if (hasField21) {
+        output.WriteFixed64(21, field_names[14], Field21);
+      }
+      if (hasField22) {
+        output.WriteInt32(22, field_names[15], Field22);
+      }
+      if (hasField23) {
+        output.WriteBool(23, field_names[16], Field23);
+      }
+      if (hasField28) {
+        output.WriteBool(28, field_names[17], Field28);
+      }
+      if (hasField203) {
+        output.WriteFixed32(203, field_names[9], Field203);
+      }
+      if (hasField204) {
+        output.WriteInt32(204, field_names[10], Field204);
+      }
+      if (hasField205) {
+        output.WriteString(205, field_names[11], Field205);
+      }
+      if (hasField206) {
+        output.WriteBool(206, field_names[12], Field206);
+      }
+      if (hasField207) {
+        output.WriteUInt64(207, field_names[13], Field207);
+      }
+      if (hasField300) {
+        output.WriteUInt64(300, field_names[19], Field300);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasField1) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, Field1);
+      }
+      if (hasField2) {
+        size += pb::CodedOutputStream.ComputeInt32Size(2, Field2);
+      }
+      if (hasField3) {
+        size += pb::CodedOutputStream.ComputeInt32Size(3, Field3);
+      }
+      if (hasField15) {
+        size += pb::CodedOutputStream.ComputeStringSize(15, Field15);
+      }
+      if (hasField12) {
+        size += pb::CodedOutputStream.ComputeBoolSize(12, Field12);
+      }
+      if (hasField13) {
+        size += pb::CodedOutputStream.ComputeInt64Size(13, Field13);
+      }
+      if (hasField14) {
+        size += pb::CodedOutputStream.ComputeInt64Size(14, Field14);
+      }
+      if (hasField16) {
+        size += pb::CodedOutputStream.ComputeInt32Size(16, Field16);
+      }
+      if (hasField19) {
+        size += pb::CodedOutputStream.ComputeInt32Size(19, Field19);
+      }
+      if (hasField20) {
+        size += pb::CodedOutputStream.ComputeBoolSize(20, Field20);
+      }
+      if (hasField28) {
+        size += pb::CodedOutputStream.ComputeBoolSize(28, Field28);
+      }
+      if (hasField21) {
+        size += pb::CodedOutputStream.ComputeFixed64Size(21, Field21);
+      }
+      if (hasField22) {
+        size += pb::CodedOutputStream.ComputeInt32Size(22, Field22);
+      }
+      if (hasField23) {
+        size += pb::CodedOutputStream.ComputeBoolSize(23, Field23);
+      }
+      if (hasField206) {
+        size += pb::CodedOutputStream.ComputeBoolSize(206, Field206);
+      }
+      if (hasField203) {
+        size += pb::CodedOutputStream.ComputeFixed32Size(203, Field203);
+      }
+      if (hasField204) {
+        size += pb::CodedOutputStream.ComputeInt32Size(204, Field204);
+      }
+      if (hasField205) {
+        size += pb::CodedOutputStream.ComputeStringSize(205, Field205);
+      }
+      if (hasField207) {
+        size += pb::CodedOutputStream.ComputeUInt64Size(207, Field207);
+      }
+      if (hasField300) {
+        size += pb::CodedOutputStream.ComputeUInt64Size(300, Field300);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SpeedMessage1SubMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage1SubMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage1SubMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SpeedMessage1SubMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SpeedMessage1SubMessage result;
+
+      private SpeedMessage1SubMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SpeedMessage1SubMessage original = result;
+          result = new SpeedMessage1SubMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SpeedMessage1SubMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Descriptor; }
+      }
+
+      public override SpeedMessage1SubMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance; }
+      }
+
+      public override SpeedMessage1SubMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage1SubMessage) {
+          return MergeFrom((SpeedMessage1SubMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(SpeedMessage1SubMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField15) {
+          Field15 = other.Field15;
+        }
+        if (other.HasField12) {
+          Field12 = other.Field12;
+        }
+        if (other.HasField13) {
+          Field13 = other.Field13;
+        }
+        if (other.HasField14) {
+          Field14 = other.Field14;
+        }
+        if (other.HasField16) {
+          Field16 = other.Field16;
+        }
+        if (other.HasField19) {
+          Field19 = other.Field19;
+        }
+        if (other.HasField20) {
+          Field20 = other.Field20;
+        }
+        if (other.HasField28) {
+          Field28 = other.Field28;
+        }
+        if (other.HasField21) {
+          Field21 = other.Field21;
+        }
+        if (other.HasField22) {
+          Field22 = other.Field22;
+        }
+        if (other.HasField23) {
+          Field23 = other.Field23;
+        }
+        if (other.HasField206) {
+          Field206 = other.Field206;
+        }
+        if (other.HasField203) {
+          Field203 = other.Field203;
+        }
+        if (other.HasField204) {
+          Field204 = other.Field204;
+        }
+        if (other.HasField205) {
+          Field205 = other.Field205;
+        }
+        if (other.HasField207) {
+          Field207 = other.Field207;
+        }
+        if (other.HasField300) {
+          Field300 = other.Field300;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_speedMessage1SubMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _speedMessage1SubMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasField1 = input.ReadInt32(ref result.field1_);
+              break;
+            }
+            case 16: {
+              result.hasField2 = input.ReadInt32(ref result.field2_);
+              break;
+            }
+            case 24: {
+              result.hasField3 = input.ReadInt32(ref result.field3_);
+              break;
+            }
+            case 96: {
+              result.hasField12 = input.ReadBool(ref result.field12_);
+              break;
+            }
+            case 104: {
+              result.hasField13 = input.ReadInt64(ref result.field13_);
+              break;
+            }
+            case 112: {
+              result.hasField14 = input.ReadInt64(ref result.field14_);
+              break;
+            }
+            case 122: {
+              result.hasField15 = input.ReadString(ref result.field15_);
+              break;
+            }
+            case 128: {
+              result.hasField16 = input.ReadInt32(ref result.field16_);
+              break;
+            }
+            case 152: {
+              result.hasField19 = input.ReadInt32(ref result.field19_);
+              break;
+            }
+            case 160: {
+              result.hasField20 = input.ReadBool(ref result.field20_);
+              break;
+            }
+            case 169: {
+              result.hasField21 = input.ReadFixed64(ref result.field21_);
+              break;
+            }
+            case 176: {
+              result.hasField22 = input.ReadInt32(ref result.field22_);
+              break;
+            }
+            case 184: {
+              result.hasField23 = input.ReadBool(ref result.field23_);
+              break;
+            }
+            case 224: {
+              result.hasField28 = input.ReadBool(ref result.field28_);
+              break;
+            }
+            case 1629: {
+              result.hasField203 = input.ReadFixed32(ref result.field203_);
+              break;
+            }
+            case 1632: {
+              result.hasField204 = input.ReadInt32(ref result.field204_);
+              break;
+            }
+            case 1642: {
+              result.hasField205 = input.ReadString(ref result.field205_);
+              break;
+            }
+            case 1648: {
+              result.hasField206 = input.ReadBool(ref result.field206_);
+              break;
+            }
+            case 1656: {
+              result.hasField207 = input.ReadUInt64(ref result.field207_);
+              break;
+            }
+            case 2400: {
+              result.hasField300 = input.ReadUInt64(ref result.field300_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public int Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(int value) {
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = 0;
+        return this;
+      }
+
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+
+      public bool HasField15 {
+        get { return result.hasField15; }
+      }
+      public string Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder ClearField15() {
+        PrepareBuilder();
+        result.hasField15 = false;
+        result.field15_ = "";
+        return this;
+      }
+
+      public bool HasField12 {
+        get { return result.hasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        PrepareBuilder();
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        PrepareBuilder();
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+
+      public bool HasField13 {
+        get { return result.hasField13; }
+      }
+      public long Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(long value) {
+        PrepareBuilder();
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        PrepareBuilder();
+        result.hasField13 = false;
+        result.field13_ = 0L;
+        return this;
+      }
+
+      public bool HasField14 {
+        get { return result.hasField14; }
+      }
+      public long Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(long value) {
+        PrepareBuilder();
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        PrepareBuilder();
+        result.hasField14 = false;
+        result.field14_ = 0L;
+        return this;
+      }
+
+      public bool HasField16 {
+        get { return result.hasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        PrepareBuilder();
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        PrepareBuilder();
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+
+      public bool HasField19 {
+        get { return result.hasField19; }
+      }
+      public int Field19 {
+        get { return result.Field19; }
+        set { SetField19(value); }
+      }
+      public Builder SetField19(int value) {
+        PrepareBuilder();
+        result.hasField19 = true;
+        result.field19_ = value;
+        return this;
+      }
+      public Builder ClearField19() {
+        PrepareBuilder();
+        result.hasField19 = false;
+        result.field19_ = 2;
+        return this;
+      }
+
+      public bool HasField20 {
+        get { return result.hasField20; }
+      }
+      public bool Field20 {
+        get { return result.Field20; }
+        set { SetField20(value); }
+      }
+      public Builder SetField20(bool value) {
+        PrepareBuilder();
+        result.hasField20 = true;
+        result.field20_ = value;
+        return this;
+      }
+      public Builder ClearField20() {
+        PrepareBuilder();
+        result.hasField20 = false;
+        result.field20_ = true;
+        return this;
+      }
+
+      public bool HasField28 {
+        get { return result.hasField28; }
+      }
+      public bool Field28 {
+        get { return result.Field28; }
+        set { SetField28(value); }
+      }
+      public Builder SetField28(bool value) {
+        PrepareBuilder();
+        result.hasField28 = true;
+        result.field28_ = value;
+        return this;
+      }
+      public Builder ClearField28() {
+        PrepareBuilder();
+        result.hasField28 = false;
+        result.field28_ = true;
+        return this;
+      }
+
+      public bool HasField21 {
+        get { return result.hasField21; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField21(ulong value) {
+        PrepareBuilder();
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        PrepareBuilder();
+        result.hasField21 = false;
+        result.field21_ = 0UL;
+        return this;
+      }
+
+      public bool HasField22 {
+        get { return result.hasField22; }
+      }
+      public int Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(int value) {
+        PrepareBuilder();
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        PrepareBuilder();
+        result.hasField22 = false;
+        result.field22_ = 0;
+        return this;
+      }
+
+      public bool HasField23 {
+        get { return result.hasField23; }
+      }
+      public bool Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(bool value) {
+        PrepareBuilder();
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        PrepareBuilder();
+        result.hasField23 = false;
+        result.field23_ = false;
+        return this;
+      }
+
+      public bool HasField206 {
+        get { return result.hasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        PrepareBuilder();
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        PrepareBuilder();
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+
+      public bool HasField203 {
+        get { return result.hasField203; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint Field203 {
+        get { return result.Field203; }
+        set { SetField203(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField203(uint value) {
+        PrepareBuilder();
+        result.hasField203 = true;
+        result.field203_ = value;
+        return this;
+      }
+      public Builder ClearField203() {
+        PrepareBuilder();
+        result.hasField203 = false;
+        result.field203_ = 0;
+        return this;
+      }
+
+      public bool HasField204 {
+        get { return result.hasField204; }
+      }
+      public int Field204 {
+        get { return result.Field204; }
+        set { SetField204(value); }
+      }
+      public Builder SetField204(int value) {
+        PrepareBuilder();
+        result.hasField204 = true;
+        result.field204_ = value;
+        return this;
+      }
+      public Builder ClearField204() {
+        PrepareBuilder();
+        result.hasField204 = false;
+        result.field204_ = 0;
+        return this;
+      }
+
+      public bool HasField205 {
+        get { return result.hasField205; }
+      }
+      public string Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        PrepareBuilder();
+        result.hasField205 = false;
+        result.field205_ = "";
+        return this;
+      }
+
+      public bool HasField207 {
+        get { return result.hasField207; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field207 {
+        get { return result.Field207; }
+        set { SetField207(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField207(ulong value) {
+        PrepareBuilder();
+        result.hasField207 = true;
+        result.field207_ = value;
+        return this;
+      }
+      public Builder ClearField207() {
+        PrepareBuilder();
+        result.hasField207 = false;
+        result.field207_ = 0UL;
+        return this;
+      }
+
+      public bool HasField300 {
+        get { return result.hasField300; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field300 {
+        get { return result.Field300; }
+        set { SetField300(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField300(ulong value) {
+        PrepareBuilder();
+        result.hasField300 = true;
+        result.field300_ = value;
+        return this;
+      }
+      public Builder ClearField300() {
+        PrepareBuilder();
+        result.hasField300 = false;
+        result.field300_ = 0UL;
+        return this;
+      }
+    }
+    static SpeedMessage1SubMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SpeedMessage2 : pb::GeneratedMessage<SpeedMessage2, SpeedMessage2.Builder> {
+    private SpeedMessage2() { }
+    private static readonly SpeedMessage2 defaultInstance = new SpeedMessage2().MakeReadOnly();
+    private static readonly string[] _speedMessage2FieldNames = new string[] { "field1", "field109", "field127", "field128", "field129", "field130", "field131", "field2", "field205", "field206", "field21", "field210", "field211", "field212", "field213", "field216", "field217", "field218", "field220", "field221", "field222", "field25", "field3", "field30", "field4", "field6", "field63", "field71", "field75", "group1" };
+    private static readonly uint[] _speedMessage2FieldTags = new uint[] { 10, 872, 1018, 1026, 1032, 1040, 1048, 18, 1640, 1648, 168, 1680, 1688, 1696, 1704, 1728, 1736, 1744, 1760, 1768, 1781, 205, 24, 240, 32, 50, 504, 568, 600, 83 };
+    public static SpeedMessage2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SpeedMessage2 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SpeedMessage2 ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage2, SpeedMessage2.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Group1 : pb::GeneratedMessage<Group1, Group1.Builder> {
+        private Group1() { }
+        private static readonly Group1 defaultInstance = new Group1().MakeReadOnly();
+        private static readonly string[] _group1FieldNames = new string[] { "field11", "field12", "field13", "field14", "field15", "field16", "field20", "field22", "field24", "field26", "field27", "field28", "field29", "field31", "field5", "field73" };
+        private static readonly uint[] _group1FieldTags = new uint[] { 93, 98, 106, 114, 120, 130, 160, 178, 194, 213, 218, 224, 234, 250, 40, 584 };
+        public static Group1 DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override Group1 DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override Group1 ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2_Group1__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<Group1, Group1.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable; }
+        }
+
+        public const int Field11FieldNumber = 11;
+        private bool hasField11;
+        private float field11_;
+        public bool HasField11 {
+          get { return hasField11; }
+        }
+        public float Field11 {
+          get { return field11_; }
+        }
+
+        public const int Field26FieldNumber = 26;
+        private bool hasField26;
+        private float field26_;
+        public bool HasField26 {
+          get { return hasField26; }
+        }
+        public float Field26 {
+          get { return field26_; }
+        }
+
+        public const int Field12FieldNumber = 12;
+        private bool hasField12;
+        private string field12_ = "";
+        public bool HasField12 {
+          get { return hasField12; }
+        }
+        public string Field12 {
+          get { return field12_; }
+        }
+
+        public const int Field13FieldNumber = 13;
+        private bool hasField13;
+        private string field13_ = "";
+        public bool HasField13 {
+          get { return hasField13; }
+        }
+        public string Field13 {
+          get { return field13_; }
+        }
+
+        public const int Field14FieldNumber = 14;
+        private pbc::PopsicleList<string> field14_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field14List {
+          get { return pbc::Lists.AsReadOnly(field14_); }
+        }
+        public int Field14Count {
+          get { return field14_.Count; }
+        }
+        public string GetField14(int index) {
+          return field14_[index];
+        }
+
+        public const int Field15FieldNumber = 15;
+        private bool hasField15;
+        private ulong field15_;
+        public bool HasField15 {
+          get { return hasField15; }
+        }
+        [global::System.CLSCompliant(false)]
+        public ulong Field15 {
+          get { return field15_; }
+        }
+
+        public const int Field5FieldNumber = 5;
+        private bool hasField5;
+        private int field5_;
+        public bool HasField5 {
+          get { return hasField5; }
+        }
+        public int Field5 {
+          get { return field5_; }
+        }
+
+        public const int Field27FieldNumber = 27;
+        private bool hasField27;
+        private string field27_ = "";
+        public bool HasField27 {
+          get { return hasField27; }
+        }
+        public string Field27 {
+          get { return field27_; }
+        }
+
+        public const int Field28FieldNumber = 28;
+        private bool hasField28;
+        private int field28_;
+        public bool HasField28 {
+          get { return hasField28; }
+        }
+        public int Field28 {
+          get { return field28_; }
+        }
+
+        public const int Field29FieldNumber = 29;
+        private bool hasField29;
+        private string field29_ = "";
+        public bool HasField29 {
+          get { return hasField29; }
+        }
+        public string Field29 {
+          get { return field29_; }
+        }
+
+        public const int Field16FieldNumber = 16;
+        private bool hasField16;
+        private string field16_ = "";
+        public bool HasField16 {
+          get { return hasField16; }
+        }
+        public string Field16 {
+          get { return field16_; }
+        }
+
+        public const int Field22FieldNumber = 22;
+        private pbc::PopsicleList<string> field22_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field22List {
+          get { return pbc::Lists.AsReadOnly(field22_); }
+        }
+        public int Field22Count {
+          get { return field22_.Count; }
+        }
+        public string GetField22(int index) {
+          return field22_[index];
+        }
+
+        public const int Field73FieldNumber = 73;
+        private pbc::PopsicleList<int> field73_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> Field73List {
+          get { return pbc::Lists.AsReadOnly(field73_); }
+        }
+        public int Field73Count {
+          get { return field73_.Count; }
+        }
+        public int GetField73(int index) {
+          return field73_[index];
+        }
+
+        public const int Field20FieldNumber = 20;
+        private bool hasField20;
+        private int field20_;
+        public bool HasField20 {
+          get { return hasField20; }
+        }
+        public int Field20 {
+          get { return field20_; }
+        }
+
+        public const int Field24FieldNumber = 24;
+        private bool hasField24;
+        private string field24_ = "";
+        public bool HasField24 {
+          get { return hasField24; }
+        }
+        public string Field24 {
+          get { return field24_; }
+        }
+
+        public const int Field31FieldNumber = 31;
+        private bool hasField31;
+        private global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage field31_;
+        public bool HasField31 {
+          get { return hasField31; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage Field31 {
+          get { return field31_ ?? global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            if (!hasField11) return false;
+            if (!hasField15) return false;
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _group1FieldNames;
+          if (hasField5) {
+            output.WriteInt32(5, field_names[14], Field5);
+          }
+          if (hasField11) {
+            output.WriteFloat(11, field_names[0], Field11);
+          }
+          if (hasField12) {
+            output.WriteString(12, field_names[1], Field12);
+          }
+          if (hasField13) {
+            output.WriteString(13, field_names[2], Field13);
+          }
+          if (field14_.Count > 0) {
+            output.WriteStringArray(14, field_names[3], field14_);
+          }
+          if (hasField15) {
+            output.WriteUInt64(15, field_names[4], Field15);
+          }
+          if (hasField16) {
+            output.WriteString(16, field_names[5], Field16);
+          }
+          if (hasField20) {
+            output.WriteInt32(20, field_names[6], Field20);
+          }
+          if (field22_.Count > 0) {
+            output.WriteStringArray(22, field_names[7], field22_);
+          }
+          if (hasField24) {
+            output.WriteString(24, field_names[8], Field24);
+          }
+          if (hasField26) {
+            output.WriteFloat(26, field_names[9], Field26);
+          }
+          if (hasField27) {
+            output.WriteString(27, field_names[10], Field27);
+          }
+          if (hasField28) {
+            output.WriteInt32(28, field_names[11], Field28);
+          }
+          if (hasField29) {
+            output.WriteString(29, field_names[12], Field29);
+          }
+          if (hasField31) {
+            output.WriteMessage(31, field_names[13], Field31);
+          }
+          if (field73_.Count > 0) {
+            output.WriteInt32Array(73, field_names[15], field73_);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasField11) {
+            size += pb::CodedOutputStream.ComputeFloatSize(11, Field11);
+          }
+          if (hasField26) {
+            size += pb::CodedOutputStream.ComputeFloatSize(26, Field26);
+          }
+          if (hasField12) {
+            size += pb::CodedOutputStream.ComputeStringSize(12, Field12);
+          }
+          if (hasField13) {
+            size += pb::CodedOutputStream.ComputeStringSize(13, Field13);
+          }
+          {
+            int dataSize = 0;
+            foreach (string element in Field14List) {
+              dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+            }
+            size += dataSize;
+            size += 1 * field14_.Count;
+          }
+          if (hasField15) {
+            size += pb::CodedOutputStream.ComputeUInt64Size(15, Field15);
+          }
+          if (hasField5) {
+            size += pb::CodedOutputStream.ComputeInt32Size(5, Field5);
+          }
+          if (hasField27) {
+            size += pb::CodedOutputStream.ComputeStringSize(27, Field27);
+          }
+          if (hasField28) {
+            size += pb::CodedOutputStream.ComputeInt32Size(28, Field28);
+          }
+          if (hasField29) {
+            size += pb::CodedOutputStream.ComputeStringSize(29, Field29);
+          }
+          if (hasField16) {
+            size += pb::CodedOutputStream.ComputeStringSize(16, Field16);
+          }
+          {
+            int dataSize = 0;
+            foreach (string element in Field22List) {
+              dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+            }
+            size += dataSize;
+            size += 2 * field22_.Count;
+          }
+          {
+            int dataSize = 0;
+            foreach (int element in Field73List) {
+              dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+            }
+            size += dataSize;
+            size += 2 * field73_.Count;
+          }
+          if (hasField20) {
+            size += pb::CodedOutputStream.ComputeInt32Size(20, Field20);
+          }
+          if (hasField24) {
+            size += pb::CodedOutputStream.ComputeStringSize(24, Field24);
+          }
+          if (hasField31) {
+            size += pb::CodedOutputStream.ComputeMessageSize(31, Field31);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static Group1 ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private Group1 MakeReadOnly() {
+          field14_.MakeReadOnly();
+          field22_.MakeReadOnly();
+          field73_.MakeReadOnly();
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Group1 prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<Group1, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(Group1 cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private Group1 result;
+
+          private Group1 PrepareBuilder() {
+            if (resultIsReadOnly) {
+              Group1 original = result;
+              result = new Group1();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override Group1 MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Descriptor; }
+          }
+
+          public override Group1 DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.DefaultInstance; }
+          }
+
+          public override Group1 BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is Group1) {
+              return MergeFrom((Group1) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(Group1 other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasField11) {
+              Field11 = other.Field11;
+            }
+            if (other.HasField26) {
+              Field26 = other.Field26;
+            }
+            if (other.HasField12) {
+              Field12 = other.Field12;
+            }
+            if (other.HasField13) {
+              Field13 = other.Field13;
+            }
+            if (other.field14_.Count != 0) {
+              result.field14_.Add(other.field14_);
+            }
+            if (other.HasField15) {
+              Field15 = other.Field15;
+            }
+            if (other.HasField5) {
+              Field5 = other.Field5;
+            }
+            if (other.HasField27) {
+              Field27 = other.Field27;
+            }
+            if (other.HasField28) {
+              Field28 = other.Field28;
+            }
+            if (other.HasField29) {
+              Field29 = other.Field29;
+            }
+            if (other.HasField16) {
+              Field16 = other.Field16;
+            }
+            if (other.field22_.Count != 0) {
+              result.field22_.Add(other.field22_);
+            }
+            if (other.field73_.Count != 0) {
+              result.field73_.Add(other.field73_);
+            }
+            if (other.HasField20) {
+              Field20 = other.Field20;
+            }
+            if (other.HasField24) {
+              Field24 = other.Field24;
+            }
+            if (other.HasField31) {
+              MergeField31(other.Field31);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_group1FieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _group1FieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 40: {
+                  result.hasField5 = input.ReadInt32(ref result.field5_);
+                  break;
+                }
+                case 93: {
+                  result.hasField11 = input.ReadFloat(ref result.field11_);
+                  break;
+                }
+                case 98: {
+                  result.hasField12 = input.ReadString(ref result.field12_);
+                  break;
+                }
+                case 106: {
+                  result.hasField13 = input.ReadString(ref result.field13_);
+                  break;
+                }
+                case 114: {
+                  input.ReadStringArray(tag, field_name, result.field14_);
+                  break;
+                }
+                case 120: {
+                  result.hasField15 = input.ReadUInt64(ref result.field15_);
+                  break;
+                }
+                case 130: {
+                  result.hasField16 = input.ReadString(ref result.field16_);
+                  break;
+                }
+                case 160: {
+                  result.hasField20 = input.ReadInt32(ref result.field20_);
+                  break;
+                }
+                case 178: {
+                  input.ReadStringArray(tag, field_name, result.field22_);
+                  break;
+                }
+                case 194: {
+                  result.hasField24 = input.ReadString(ref result.field24_);
+                  break;
+                }
+                case 213: {
+                  result.hasField26 = input.ReadFloat(ref result.field26_);
+                  break;
+                }
+                case 218: {
+                  result.hasField27 = input.ReadString(ref result.field27_);
+                  break;
+                }
+                case 224: {
+                  result.hasField28 = input.ReadInt32(ref result.field28_);
+                  break;
+                }
+                case 234: {
+                  result.hasField29 = input.ReadString(ref result.field29_);
+                  break;
+                }
+                case 250: {
+                  global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.CreateBuilder();
+                  if (result.hasField31) {
+                    subBuilder.MergeFrom(Field31);
+                  }
+                  input.ReadMessage(subBuilder, extensionRegistry);
+                  Field31 = subBuilder.BuildPartial();
+                  break;
+                }
+                case 586:
+                case 584: {
+                  input.ReadInt32Array(tag, field_name, result.field73_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasField11 {
+            get { return result.hasField11; }
+          }
+          public float Field11 {
+            get { return result.Field11; }
+            set { SetField11(value); }
+          }
+          public Builder SetField11(float value) {
+            PrepareBuilder();
+            result.hasField11 = true;
+            result.field11_ = value;
+            return this;
+          }
+          public Builder ClearField11() {
+            PrepareBuilder();
+            result.hasField11 = false;
+            result.field11_ = 0F;
+            return this;
+          }
+
+          public bool HasField26 {
+            get { return result.hasField26; }
+          }
+          public float Field26 {
+            get { return result.Field26; }
+            set { SetField26(value); }
+          }
+          public Builder SetField26(float value) {
+            PrepareBuilder();
+            result.hasField26 = true;
+            result.field26_ = value;
+            return this;
+          }
+          public Builder ClearField26() {
+            PrepareBuilder();
+            result.hasField26 = false;
+            result.field26_ = 0F;
+            return this;
+          }
+
+          public bool HasField12 {
+            get { return result.hasField12; }
+          }
+          public string Field12 {
+            get { return result.Field12; }
+            set { SetField12(value); }
+          }
+          public Builder SetField12(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField12 = true;
+            result.field12_ = value;
+            return this;
+          }
+          public Builder ClearField12() {
+            PrepareBuilder();
+            result.hasField12 = false;
+            result.field12_ = "";
+            return this;
+          }
+
+          public bool HasField13 {
+            get { return result.hasField13; }
+          }
+          public string Field13 {
+            get { return result.Field13; }
+            set { SetField13(value); }
+          }
+          public Builder SetField13(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField13 = true;
+            result.field13_ = value;
+            return this;
+          }
+          public Builder ClearField13() {
+            PrepareBuilder();
+            result.hasField13 = false;
+            result.field13_ = "";
+            return this;
+          }
+
+          public pbc::IPopsicleList<string> Field14List {
+            get { return PrepareBuilder().field14_; }
+          }
+          public int Field14Count {
+            get { return result.Field14Count; }
+          }
+          public string GetField14(int index) {
+            return result.GetField14(index);
+          }
+          public Builder SetField14(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field14_[index] = value;
+            return this;
+          }
+          public Builder AddField14(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field14_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField14(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.field14_.Add(values);
+            return this;
+          }
+          public Builder ClearField14() {
+            PrepareBuilder();
+            result.field14_.Clear();
+            return this;
+          }
+
+          public bool HasField15 {
+            get { return result.hasField15; }
+          }
+          [global::System.CLSCompliant(false)]
+          public ulong Field15 {
+            get { return result.Field15; }
+            set { SetField15(value); }
+          }
+          [global::System.CLSCompliant(false)]
+          public Builder SetField15(ulong value) {
+            PrepareBuilder();
+            result.hasField15 = true;
+            result.field15_ = value;
+            return this;
+          }
+          public Builder ClearField15() {
+            PrepareBuilder();
+            result.hasField15 = false;
+            result.field15_ = 0UL;
+            return this;
+          }
+
+          public bool HasField5 {
+            get { return result.hasField5; }
+          }
+          public int Field5 {
+            get { return result.Field5; }
+            set { SetField5(value); }
+          }
+          public Builder SetField5(int value) {
+            PrepareBuilder();
+            result.hasField5 = true;
+            result.field5_ = value;
+            return this;
+          }
+          public Builder ClearField5() {
+            PrepareBuilder();
+            result.hasField5 = false;
+            result.field5_ = 0;
+            return this;
+          }
+
+          public bool HasField27 {
+            get { return result.hasField27; }
+          }
+          public string Field27 {
+            get { return result.Field27; }
+            set { SetField27(value); }
+          }
+          public Builder SetField27(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField27 = true;
+            result.field27_ = value;
+            return this;
+          }
+          public Builder ClearField27() {
+            PrepareBuilder();
+            result.hasField27 = false;
+            result.field27_ = "";
+            return this;
+          }
+
+          public bool HasField28 {
+            get { return result.hasField28; }
+          }
+          public int Field28 {
+            get { return result.Field28; }
+            set { SetField28(value); }
+          }
+          public Builder SetField28(int value) {
+            PrepareBuilder();
+            result.hasField28 = true;
+            result.field28_ = value;
+            return this;
+          }
+          public Builder ClearField28() {
+            PrepareBuilder();
+            result.hasField28 = false;
+            result.field28_ = 0;
+            return this;
+          }
+
+          public bool HasField29 {
+            get { return result.hasField29; }
+          }
+          public string Field29 {
+            get { return result.Field29; }
+            set { SetField29(value); }
+          }
+          public Builder SetField29(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField29 = true;
+            result.field29_ = value;
+            return this;
+          }
+          public Builder ClearField29() {
+            PrepareBuilder();
+            result.hasField29 = false;
+            result.field29_ = "";
+            return this;
+          }
+
+          public bool HasField16 {
+            get { return result.hasField16; }
+          }
+          public string Field16 {
+            get { return result.Field16; }
+            set { SetField16(value); }
+          }
+          public Builder SetField16(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField16 = true;
+            result.field16_ = value;
+            return this;
+          }
+          public Builder ClearField16() {
+            PrepareBuilder();
+            result.hasField16 = false;
+            result.field16_ = "";
+            return this;
+          }
+
+          public pbc::IPopsicleList<string> Field22List {
+            get { return PrepareBuilder().field22_; }
+          }
+          public int Field22Count {
+            get { return result.Field22Count; }
+          }
+          public string GetField22(int index) {
+            return result.GetField22(index);
+          }
+          public Builder SetField22(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field22_[index] = value;
+            return this;
+          }
+          public Builder AddField22(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field22_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField22(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.field22_.Add(values);
+            return this;
+          }
+          public Builder ClearField22() {
+            PrepareBuilder();
+            result.field22_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<int> Field73List {
+            get { return PrepareBuilder().field73_; }
+          }
+          public int Field73Count {
+            get { return result.Field73Count; }
+          }
+          public int GetField73(int index) {
+            return result.GetField73(index);
+          }
+          public Builder SetField73(int index, int value) {
+            PrepareBuilder();
+            result.field73_[index] = value;
+            return this;
+          }
+          public Builder AddField73(int value) {
+            PrepareBuilder();
+            result.field73_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField73(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.field73_.Add(values);
+            return this;
+          }
+          public Builder ClearField73() {
+            PrepareBuilder();
+            result.field73_.Clear();
+            return this;
+          }
+
+          public bool HasField20 {
+            get { return result.hasField20; }
+          }
+          public int Field20 {
+            get { return result.Field20; }
+            set { SetField20(value); }
+          }
+          public Builder SetField20(int value) {
+            PrepareBuilder();
+            result.hasField20 = true;
+            result.field20_ = value;
+            return this;
+          }
+          public Builder ClearField20() {
+            PrepareBuilder();
+            result.hasField20 = false;
+            result.field20_ = 0;
+            return this;
+          }
+
+          public bool HasField24 {
+            get { return result.hasField24; }
+          }
+          public string Field24 {
+            get { return result.Field24; }
+            set { SetField24(value); }
+          }
+          public Builder SetField24(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField24 = true;
+            result.field24_ = value;
+            return this;
+          }
+          public Builder ClearField24() {
+            PrepareBuilder();
+            result.hasField24 = false;
+            result.field24_ = "";
+            return this;
+          }
+
+          public bool HasField31 {
+           get { return result.hasField31; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage Field31 {
+            get { return result.Field31; }
+            set { SetField31(value); }
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField31 = true;
+            result.field31_ = value;
+            return this;
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.hasField31 = true;
+            result.field31_ = builderForValue.Build();
+            return this;
+          }
+          public Builder MergeField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            if (result.hasField31 &&
+                result.field31_ != global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance) {
+                result.field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.CreateBuilder(result.field31_).MergeFrom(value).BuildPartial();
+            } else {
+              result.field31_ = value;
+            }
+            result.hasField31 = true;
+            return this;
+          }
+          public Builder ClearField31() {
+            PrepareBuilder();
+            result.hasField31 = false;
+            result.field31_ = null;
+            return this;
+          }
+        }
+        static Group1() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private long field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public long Field3 {
+      get { return field3_; }
+    }
+
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private long field4_;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public long Field4 {
+      get { return field4_; }
+    }
+
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private long field30_;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public long Field30 {
+      get { return field30_; }
+    }
+
+    public const int Field75FieldNumber = 75;
+    private bool hasField75;
+    private bool field75_;
+    public bool HasField75 {
+      get { return hasField75; }
+    }
+    public bool Field75 {
+      get { return field75_; }
+    }
+
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private string field6_ = "";
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public string Field6 {
+      get { return field6_; }
+    }
+
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private pb::ByteString field2_ = pb::ByteString.Empty;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public pb::ByteString Field2 {
+      get { return field2_; }
+    }
+
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private int field21_;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    public int Field21 {
+      get { return field21_; }
+    }
+
+    public const int Field71FieldNumber = 71;
+    private bool hasField71;
+    private int field71_;
+    public bool HasField71 {
+      get { return hasField71; }
+    }
+    public int Field71 {
+      get { return field71_; }
+    }
+
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private float field25_;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public float Field25 {
+      get { return field25_; }
+    }
+
+    public const int Field109FieldNumber = 109;
+    private bool hasField109;
+    private int field109_;
+    public bool HasField109 {
+      get { return hasField109; }
+    }
+    public int Field109 {
+      get { return field109_; }
+    }
+
+    public const int Field210FieldNumber = 210;
+    private bool hasField210;
+    private int field210_;
+    public bool HasField210 {
+      get { return hasField210; }
+    }
+    public int Field210 {
+      get { return field210_; }
+    }
+
+    public const int Field211FieldNumber = 211;
+    private bool hasField211;
+    private int field211_;
+    public bool HasField211 {
+      get { return hasField211; }
+    }
+    public int Field211 {
+      get { return field211_; }
+    }
+
+    public const int Field212FieldNumber = 212;
+    private bool hasField212;
+    private int field212_;
+    public bool HasField212 {
+      get { return hasField212; }
+    }
+    public int Field212 {
+      get { return field212_; }
+    }
+
+    public const int Field213FieldNumber = 213;
+    private bool hasField213;
+    private int field213_;
+    public bool HasField213 {
+      get { return hasField213; }
+    }
+    public int Field213 {
+      get { return field213_; }
+    }
+
+    public const int Field216FieldNumber = 216;
+    private bool hasField216;
+    private int field216_;
+    public bool HasField216 {
+      get { return hasField216; }
+    }
+    public int Field216 {
+      get { return field216_; }
+    }
+
+    public const int Field217FieldNumber = 217;
+    private bool hasField217;
+    private int field217_;
+    public bool HasField217 {
+      get { return hasField217; }
+    }
+    public int Field217 {
+      get { return field217_; }
+    }
+
+    public const int Field218FieldNumber = 218;
+    private bool hasField218;
+    private int field218_;
+    public bool HasField218 {
+      get { return hasField218; }
+    }
+    public int Field218 {
+      get { return field218_; }
+    }
+
+    public const int Field220FieldNumber = 220;
+    private bool hasField220;
+    private int field220_;
+    public bool HasField220 {
+      get { return hasField220; }
+    }
+    public int Field220 {
+      get { return field220_; }
+    }
+
+    public const int Field221FieldNumber = 221;
+    private bool hasField221;
+    private int field221_;
+    public bool HasField221 {
+      get { return hasField221; }
+    }
+    public int Field221 {
+      get { return field221_; }
+    }
+
+    public const int Field222FieldNumber = 222;
+    private bool hasField222;
+    private float field222_;
+    public bool HasField222 {
+      get { return hasField222; }
+    }
+    public float Field222 {
+      get { return field222_; }
+    }
+
+    public const int Field63FieldNumber = 63;
+    private bool hasField63;
+    private int field63_;
+    public bool HasField63 {
+      get { return hasField63; }
+    }
+    public int Field63 {
+      get { return field63_; }
+    }
+
+    public const int Group1FieldNumber = 10;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> group1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> Group1List {
+      get { return group1_; }
+    }
+    public int Group1Count {
+      get { return group1_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 GetGroup1(int index) {
+      return group1_[index];
+    }
+
+    public const int Field128FieldNumber = 128;
+    private pbc::PopsicleList<string> field128_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field128List {
+      get { return pbc::Lists.AsReadOnly(field128_); }
+    }
+    public int Field128Count {
+      get { return field128_.Count; }
+    }
+    public string GetField128(int index) {
+      return field128_[index];
+    }
+
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private long field131_;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public long Field131 {
+      get { return field131_; }
+    }
+
+    public const int Field127FieldNumber = 127;
+    private pbc::PopsicleList<string> field127_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field127List {
+      get { return pbc::Lists.AsReadOnly(field127_); }
+    }
+    public int Field127Count {
+      get { return field127_.Count; }
+    }
+    public string GetField127(int index) {
+      return field127_[index];
+    }
+
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private int field129_;
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public int Field129 {
+      get { return field129_; }
+    }
+
+    public const int Field130FieldNumber = 130;
+    private pbc::PopsicleList<long> field130_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> Field130List {
+      get { return pbc::Lists.AsReadOnly(field130_); }
+    }
+    public int Field130Count {
+      get { return field130_.Count; }
+    }
+    public long GetField130(int index) {
+      return field130_[index];
+    }
+
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private bool field205_;
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public bool Field205 {
+      get { return field205_; }
+    }
+
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _speedMessage2FieldNames;
+      if (hasField1) {
+        output.WriteString(1, field_names[0], Field1);
+      }
+      if (hasField2) {
+        output.WriteBytes(2, field_names[7], Field2);
+      }
+      if (hasField3) {
+        output.WriteInt64(3, field_names[22], Field3);
+      }
+      if (hasField4) {
+        output.WriteInt64(4, field_names[24], Field4);
+      }
+      if (hasField6) {
+        output.WriteString(6, field_names[25], Field6);
+      }
+      if (group1_.Count > 0) {
+        output.WriteGroupArray(10, field_names[29], group1_);
+      }
+      if (hasField21) {
+        output.WriteInt32(21, field_names[10], Field21);
+      }
+      if (hasField25) {
+        output.WriteFloat(25, field_names[21], Field25);
+      }
+      if (hasField30) {
+        output.WriteInt64(30, field_names[23], Field30);
+      }
+      if (hasField63) {
+        output.WriteInt32(63, field_names[26], Field63);
+      }
+      if (hasField71) {
+        output.WriteInt32(71, field_names[27], Field71);
+      }
+      if (hasField75) {
+        output.WriteBool(75, field_names[28], Field75);
+      }
+      if (hasField109) {
+        output.WriteInt32(109, field_names[1], Field109);
+      }
+      if (field127_.Count > 0) {
+        output.WriteStringArray(127, field_names[2], field127_);
+      }
+      if (field128_.Count > 0) {
+        output.WriteStringArray(128, field_names[3], field128_);
+      }
+      if (hasField129) {
+        output.WriteInt32(129, field_names[4], Field129);
+      }
+      if (field130_.Count > 0) {
+        output.WriteInt64Array(130, field_names[5], field130_);
+      }
+      if (hasField131) {
+        output.WriteInt64(131, field_names[6], Field131);
+      }
+      if (hasField205) {
+        output.WriteBool(205, field_names[8], Field205);
+      }
+      if (hasField206) {
+        output.WriteBool(206, field_names[9], Field206);
+      }
+      if (hasField210) {
+        output.WriteInt32(210, field_names[11], Field210);
+      }
+      if (hasField211) {
+        output.WriteInt32(211, field_names[12], Field211);
+      }
+      if (hasField212) {
+        output.WriteInt32(212, field_names[13], Field212);
+      }
+      if (hasField213) {
+        output.WriteInt32(213, field_names[14], Field213);
+      }
+      if (hasField216) {
+        output.WriteInt32(216, field_names[15], Field216);
+      }
+      if (hasField217) {
+        output.WriteInt32(217, field_names[16], Field217);
+      }
+      if (hasField218) {
+        output.WriteInt32(218, field_names[17], Field218);
+      }
+      if (hasField220) {
+        output.WriteInt32(220, field_names[18], Field220);
+      }
+      if (hasField221) {
+        output.WriteInt32(221, field_names[19], Field221);
+      }
+      if (hasField222) {
+        output.WriteFloat(222, field_names[20], Field222);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasField1) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, Field1);
+      }
+      if (hasField3) {
+        size += pb::CodedOutputStream.ComputeInt64Size(3, Field3);
+      }
+      if (hasField4) {
+        size += pb::CodedOutputStream.ComputeInt64Size(4, Field4);
+      }
+      if (hasField30) {
+        size += pb::CodedOutputStream.ComputeInt64Size(30, Field30);
+      }
+      if (hasField75) {
+        size += pb::CodedOutputStream.ComputeBoolSize(75, Field75);
+      }
+      if (hasField6) {
+        size += pb::CodedOutputStream.ComputeStringSize(6, Field6);
+      }
+      if (hasField2) {
+        size += pb::CodedOutputStream.ComputeBytesSize(2, Field2);
+      }
+      if (hasField21) {
+        size += pb::CodedOutputStream.ComputeInt32Size(21, Field21);
+      }
+      if (hasField71) {
+        size += pb::CodedOutputStream.ComputeInt32Size(71, Field71);
+      }
+      if (hasField25) {
+        size += pb::CodedOutputStream.ComputeFloatSize(25, Field25);
+      }
+      if (hasField109) {
+        size += pb::CodedOutputStream.ComputeInt32Size(109, Field109);
+      }
+      if (hasField210) {
+        size += pb::CodedOutputStream.ComputeInt32Size(210, Field210);
+      }
+      if (hasField211) {
+        size += pb::CodedOutputStream.ComputeInt32Size(211, Field211);
+      }
+      if (hasField212) {
+        size += pb::CodedOutputStream.ComputeInt32Size(212, Field212);
+      }
+      if (hasField213) {
+        size += pb::CodedOutputStream.ComputeInt32Size(213, Field213);
+      }
+      if (hasField216) {
+        size += pb::CodedOutputStream.ComputeInt32Size(216, Field216);
+      }
+      if (hasField217) {
+        size += pb::CodedOutputStream.ComputeInt32Size(217, Field217);
+      }
+      if (hasField218) {
+        size += pb::CodedOutputStream.ComputeInt32Size(218, Field218);
+      }
+      if (hasField220) {
+        size += pb::CodedOutputStream.ComputeInt32Size(220, Field220);
+      }
+      if (hasField221) {
+        size += pb::CodedOutputStream.ComputeInt32Size(221, Field221);
+      }
+      if (hasField222) {
+        size += pb::CodedOutputStream.ComputeFloatSize(222, Field222);
+      }
+      if (hasField63) {
+        size += pb::CodedOutputStream.ComputeInt32Size(63, Field63);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 element in Group1List) {
+        size += pb::CodedOutputStream.ComputeGroupSize(10, element);
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in Field128List) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * field128_.Count;
+      }
+      if (hasField131) {
+        size += pb::CodedOutputStream.ComputeInt64Size(131, Field131);
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in Field127List) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * field127_.Count;
+      }
+      if (hasField129) {
+        size += pb::CodedOutputStream.ComputeInt32Size(129, Field129);
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in Field130List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * field130_.Count;
+      }
+      if (hasField205) {
+        size += pb::CodedOutputStream.ComputeBoolSize(205, Field205);
+      }
+      if (hasField206) {
+        size += pb::CodedOutputStream.ComputeBoolSize(206, Field206);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SpeedMessage2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SpeedMessage2 MakeReadOnly() {
+      group1_.MakeReadOnly();
+      field128_.MakeReadOnly();
+      field127_.MakeReadOnly();
+      field130_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage2 prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage2, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SpeedMessage2 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SpeedMessage2 result;
+
+      private SpeedMessage2 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SpeedMessage2 original = result;
+          result = new SpeedMessage2();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SpeedMessage2 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Descriptor; }
+      }
+
+      public override SpeedMessage2 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.DefaultInstance; }
+      }
+
+      public override SpeedMessage2 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage2) {
+          return MergeFrom((SpeedMessage2) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(SpeedMessage2 other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.HasField30) {
+          Field30 = other.Field30;
+        }
+        if (other.HasField75) {
+          Field75 = other.Field75;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField21) {
+          Field21 = other.Field21;
+        }
+        if (other.HasField71) {
+          Field71 = other.Field71;
+        }
+        if (other.HasField25) {
+          Field25 = other.Field25;
+        }
+        if (other.HasField109) {
+          Field109 = other.Field109;
+        }
+        if (other.HasField210) {
+          Field210 = other.Field210;
+        }
+        if (other.HasField211) {
+          Field211 = other.Field211;
+        }
+        if (other.HasField212) {
+          Field212 = other.Field212;
+        }
+        if (other.HasField213) {
+          Field213 = other.Field213;
+        }
+        if (other.HasField216) {
+          Field216 = other.Field216;
+        }
+        if (other.HasField217) {
+          Field217 = other.Field217;
+        }
+        if (other.HasField218) {
+          Field218 = other.Field218;
+        }
+        if (other.HasField220) {
+          Field220 = other.Field220;
+        }
+        if (other.HasField221) {
+          Field221 = other.Field221;
+        }
+        if (other.HasField222) {
+          Field222 = other.Field222;
+        }
+        if (other.HasField63) {
+          Field63 = other.Field63;
+        }
+        if (other.group1_.Count != 0) {
+          result.group1_.Add(other.group1_);
+        }
+        if (other.field128_.Count != 0) {
+          result.field128_.Add(other.field128_);
+        }
+        if (other.HasField131) {
+          Field131 = other.Field131;
+        }
+        if (other.field127_.Count != 0) {
+          result.field127_.Add(other.field127_);
+        }
+        if (other.HasField129) {
+          Field129 = other.Field129;
+        }
+        if (other.field130_.Count != 0) {
+          result.field130_.Add(other.field130_);
+        }
+        if (other.HasField205) {
+          Field205 = other.Field205;
+        }
+        if (other.HasField206) {
+          Field206 = other.Field206;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_speedMessage2FieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _speedMessage2FieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasField1 = input.ReadString(ref result.field1_);
+              break;
+            }
+            case 18: {
+              result.hasField2 = input.ReadBytes(ref result.field2_);
+              break;
+            }
+            case 24: {
+              result.hasField3 = input.ReadInt64(ref result.field3_);
+              break;
+            }
+            case 32: {
+              result.hasField4 = input.ReadInt64(ref result.field4_);
+              break;
+            }
+            case 50: {
+              result.hasField6 = input.ReadString(ref result.field6_);
+              break;
+            }
+            case 83: {
+              input.ReadGroupArray(tag, field_name, result.group1_, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 168: {
+              result.hasField21 = input.ReadInt32(ref result.field21_);
+              break;
+            }
+            case 205: {
+              result.hasField25 = input.ReadFloat(ref result.field25_);
+              break;
+            }
+            case 240: {
+              result.hasField30 = input.ReadInt64(ref result.field30_);
+              break;
+            }
+            case 504: {
+              result.hasField63 = input.ReadInt32(ref result.field63_);
+              break;
+            }
+            case 568: {
+              result.hasField71 = input.ReadInt32(ref result.field71_);
+              break;
+            }
+            case 600: {
+              result.hasField75 = input.ReadBool(ref result.field75_);
+              break;
+            }
+            case 872: {
+              result.hasField109 = input.ReadInt32(ref result.field109_);
+              break;
+            }
+            case 1018: {
+              input.ReadStringArray(tag, field_name, result.field127_);
+              break;
+            }
+            case 1026: {
+              input.ReadStringArray(tag, field_name, result.field128_);
+              break;
+            }
+            case 1032: {
+              result.hasField129 = input.ReadInt32(ref result.field129_);
+              break;
+            }
+            case 1042:
+            case 1040: {
+              input.ReadInt64Array(tag, field_name, result.field130_);
+              break;
+            }
+            case 1048: {
+              result.hasField131 = input.ReadInt64(ref result.field131_);
+              break;
+            }
+            case 1640: {
+              result.hasField205 = input.ReadBool(ref result.field205_);
+              break;
+            }
+            case 1648: {
+              result.hasField206 = input.ReadBool(ref result.field206_);
+              break;
+            }
+            case 1680: {
+              result.hasField210 = input.ReadInt32(ref result.field210_);
+              break;
+            }
+            case 1688: {
+              result.hasField211 = input.ReadInt32(ref result.field211_);
+              break;
+            }
+            case 1696: {
+              result.hasField212 = input.ReadInt32(ref result.field212_);
+              break;
+            }
+            case 1704: {
+              result.hasField213 = input.ReadInt32(ref result.field213_);
+              break;
+            }
+            case 1728: {
+              result.hasField216 = input.ReadInt32(ref result.field216_);
+              break;
+            }
+            case 1736: {
+              result.hasField217 = input.ReadInt32(ref result.field217_);
+              break;
+            }
+            case 1744: {
+              result.hasField218 = input.ReadInt32(ref result.field218_);
+              break;
+            }
+            case 1760: {
+              result.hasField220 = input.ReadInt32(ref result.field220_);
+              break;
+            }
+            case 1768: {
+              result.hasField221 = input.ReadInt32(ref result.field221_);
+              break;
+            }
+            case 1781: {
+              result.hasField222 = input.ReadFloat(ref result.field222_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = "";
+        return this;
+      }
+
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public long Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(long value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0L;
+        return this;
+      }
+
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public long Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(long value) {
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = 0L;
+        return this;
+      }
+
+      public bool HasField30 {
+        get { return result.hasField30; }
+      }
+      public long Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(long value) {
+        PrepareBuilder();
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        PrepareBuilder();
+        result.hasField30 = false;
+        result.field30_ = 0L;
+        return this;
+      }
+
+      public bool HasField75 {
+        get { return result.hasField75; }
+      }
+      public bool Field75 {
+        get { return result.Field75; }
+        set { SetField75(value); }
+      }
+      public Builder SetField75(bool value) {
+        PrepareBuilder();
+        result.hasField75 = true;
+        result.field75_ = value;
+        return this;
+      }
+      public Builder ClearField75() {
+        PrepareBuilder();
+        result.hasField75 = false;
+        result.field75_ = false;
+        return this;
+      }
+
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public string Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = "";
+        return this;
+      }
+
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public pb::ByteString Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = pb::ByteString.Empty;
+        return this;
+      }
+
+      public bool HasField21 {
+        get { return result.hasField21; }
+      }
+      public int Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      public Builder SetField21(int value) {
+        PrepareBuilder();
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        PrepareBuilder();
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+
+      public bool HasField71 {
+        get { return result.hasField71; }
+      }
+      public int Field71 {
+        get { return result.Field71; }
+        set { SetField71(value); }
+      }
+      public Builder SetField71(int value) {
+        PrepareBuilder();
+        result.hasField71 = true;
+        result.field71_ = value;
+        return this;
+      }
+      public Builder ClearField71() {
+        PrepareBuilder();
+        result.hasField71 = false;
+        result.field71_ = 0;
+        return this;
+      }
+
+      public bool HasField25 {
+        get { return result.hasField25; }
+      }
+      public float Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(float value) {
+        PrepareBuilder();
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        PrepareBuilder();
+        result.hasField25 = false;
+        result.field25_ = 0F;
+        return this;
+      }
+
+      public bool HasField109 {
+        get { return result.hasField109; }
+      }
+      public int Field109 {
+        get { return result.Field109; }
+        set { SetField109(value); }
+      }
+      public Builder SetField109(int value) {
+        PrepareBuilder();
+        result.hasField109 = true;
+        result.field109_ = value;
+        return this;
+      }
+      public Builder ClearField109() {
+        PrepareBuilder();
+        result.hasField109 = false;
+        result.field109_ = 0;
+        return this;
+      }
+
+      public bool HasField210 {
+        get { return result.hasField210; }
+      }
+      public int Field210 {
+        get { return result.Field210; }
+        set { SetField210(value); }
+      }
+      public Builder SetField210(int value) {
+        PrepareBuilder();
+        result.hasField210 = true;
+        result.field210_ = value;
+        return this;
+      }
+      public Builder ClearField210() {
+        PrepareBuilder();
+        result.hasField210 = false;
+        result.field210_ = 0;
+        return this;
+      }
+
+      public bool HasField211 {
+        get { return result.hasField211; }
+      }
+      public int Field211 {
+        get { return result.Field211; }
+        set { SetField211(value); }
+      }
+      public Builder SetField211(int value) {
+        PrepareBuilder();
+        result.hasField211 = true;
+        result.field211_ = value;
+        return this;
+      }
+      public Builder ClearField211() {
+        PrepareBuilder();
+        result.hasField211 = false;
+        result.field211_ = 0;
+        return this;
+      }
+
+      public bool HasField212 {
+        get { return result.hasField212; }
+      }
+      public int Field212 {
+        get { return result.Field212; }
+        set { SetField212(value); }
+      }
+      public Builder SetField212(int value) {
+        PrepareBuilder();
+        result.hasField212 = true;
+        result.field212_ = value;
+        return this;
+      }
+      public Builder ClearField212() {
+        PrepareBuilder();
+        result.hasField212 = false;
+        result.field212_ = 0;
+        return this;
+      }
+
+      public bool HasField213 {
+        get { return result.hasField213; }
+      }
+      public int Field213 {
+        get { return result.Field213; }
+        set { SetField213(value); }
+      }
+      public Builder SetField213(int value) {
+        PrepareBuilder();
+        result.hasField213 = true;
+        result.field213_ = value;
+        return this;
+      }
+      public Builder ClearField213() {
+        PrepareBuilder();
+        result.hasField213 = false;
+        result.field213_ = 0;
+        return this;
+      }
+
+      public bool HasField216 {
+        get { return result.hasField216; }
+      }
+      public int Field216 {
+        get { return result.Field216; }
+        set { SetField216(value); }
+      }
+      public Builder SetField216(int value) {
+        PrepareBuilder();
+        result.hasField216 = true;
+        result.field216_ = value;
+        return this;
+      }
+      public Builder ClearField216() {
+        PrepareBuilder();
+        result.hasField216 = false;
+        result.field216_ = 0;
+        return this;
+      }
+
+      public bool HasField217 {
+        get { return result.hasField217; }
+      }
+      public int Field217 {
+        get { return result.Field217; }
+        set { SetField217(value); }
+      }
+      public Builder SetField217(int value) {
+        PrepareBuilder();
+        result.hasField217 = true;
+        result.field217_ = value;
+        return this;
+      }
+      public Builder ClearField217() {
+        PrepareBuilder();
+        result.hasField217 = false;
+        result.field217_ = 0;
+        return this;
+      }
+
+      public bool HasField218 {
+        get { return result.hasField218; }
+      }
+      public int Field218 {
+        get { return result.Field218; }
+        set { SetField218(value); }
+      }
+      public Builder SetField218(int value) {
+        PrepareBuilder();
+        result.hasField218 = true;
+        result.field218_ = value;
+        return this;
+      }
+      public Builder ClearField218() {
+        PrepareBuilder();
+        result.hasField218 = false;
+        result.field218_ = 0;
+        return this;
+      }
+
+      public bool HasField220 {
+        get { return result.hasField220; }
+      }
+      public int Field220 {
+        get { return result.Field220; }
+        set { SetField220(value); }
+      }
+      public Builder SetField220(int value) {
+        PrepareBuilder();
+        result.hasField220 = true;
+        result.field220_ = value;
+        return this;
+      }
+      public Builder ClearField220() {
+        PrepareBuilder();
+        result.hasField220 = false;
+        result.field220_ = 0;
+        return this;
+      }
+
+      public bool HasField221 {
+        get { return result.hasField221; }
+      }
+      public int Field221 {
+        get { return result.Field221; }
+        set { SetField221(value); }
+      }
+      public Builder SetField221(int value) {
+        PrepareBuilder();
+        result.hasField221 = true;
+        result.field221_ = value;
+        return this;
+      }
+      public Builder ClearField221() {
+        PrepareBuilder();
+        result.hasField221 = false;
+        result.field221_ = 0;
+        return this;
+      }
+
+      public bool HasField222 {
+        get { return result.hasField222; }
+      }
+      public float Field222 {
+        get { return result.Field222; }
+        set { SetField222(value); }
+      }
+      public Builder SetField222(float value) {
+        PrepareBuilder();
+        result.hasField222 = true;
+        result.field222_ = value;
+        return this;
+      }
+      public Builder ClearField222() {
+        PrepareBuilder();
+        result.hasField222 = false;
+        result.field222_ = 0F;
+        return this;
+      }
+
+      public bool HasField63 {
+        get { return result.hasField63; }
+      }
+      public int Field63 {
+        get { return result.Field63; }
+        set { SetField63(value); }
+      }
+      public Builder SetField63(int value) {
+        PrepareBuilder();
+        result.hasField63 = true;
+        result.field63_ = value;
+        return this;
+      }
+      public Builder ClearField63() {
+        PrepareBuilder();
+        result.hasField63 = false;
+        result.field63_ = 0;
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> Group1List {
+        get { return PrepareBuilder().group1_; }
+      }
+      public int Group1Count {
+        get { return result.Group1Count; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 GetGroup1(int index) {
+        return result.GetGroup1(index);
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.group1_[index] = value;
+        return this;
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.group1_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.group1_.Add(value);
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.group1_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> values) {
+        PrepareBuilder();
+        result.group1_.Add(values);
+        return this;
+      }
+      public Builder ClearGroup1() {
+        PrepareBuilder();
+        result.group1_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> Field128List {
+        get { return PrepareBuilder().field128_; }
+      }
+      public int Field128Count {
+        get { return result.Field128Count; }
+      }
+      public string GetField128(int index) {
+        return result.GetField128(index);
+      }
+      public Builder SetField128(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field128_[index] = value;
+        return this;
+      }
+      public Builder AddField128(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field128_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField128(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.field128_.Add(values);
+        return this;
+      }
+      public Builder ClearField128() {
+        PrepareBuilder();
+        result.field128_.Clear();
+        return this;
+      }
+
+      public bool HasField131 {
+        get { return result.hasField131; }
+      }
+      public long Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(long value) {
+        PrepareBuilder();
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        PrepareBuilder();
+        result.hasField131 = false;
+        result.field131_ = 0L;
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> Field127List {
+        get { return PrepareBuilder().field127_; }
+      }
+      public int Field127Count {
+        get { return result.Field127Count; }
+      }
+      public string GetField127(int index) {
+        return result.GetField127(index);
+      }
+      public Builder SetField127(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field127_[index] = value;
+        return this;
+      }
+      public Builder AddField127(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field127_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField127(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.field127_.Add(values);
+        return this;
+      }
+      public Builder ClearField127() {
+        PrepareBuilder();
+        result.field127_.Clear();
+        return this;
+      }
+
+      public bool HasField129 {
+        get { return result.hasField129; }
+      }
+      public int Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(int value) {
+        PrepareBuilder();
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        PrepareBuilder();
+        result.hasField129 = false;
+        result.field129_ = 0;
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> Field130List {
+        get { return PrepareBuilder().field130_; }
+      }
+      public int Field130Count {
+        get { return result.Field130Count; }
+      }
+      public long GetField130(int index) {
+        return result.GetField130(index);
+      }
+      public Builder SetField130(int index, long value) {
+        PrepareBuilder();
+        result.field130_[index] = value;
+        return this;
+      }
+      public Builder AddField130(long value) {
+        PrepareBuilder();
+        result.field130_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField130(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.field130_.Add(values);
+        return this;
+      }
+      public Builder ClearField130() {
+        PrepareBuilder();
+        result.field130_.Clear();
+        return this;
+      }
+
+      public bool HasField205 {
+        get { return result.hasField205; }
+      }
+      public bool Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(bool value) {
+        PrepareBuilder();
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        PrepareBuilder();
+        result.hasField205 = false;
+        result.field205_ = false;
+        return this;
+      }
+
+      public bool HasField206 {
+        get { return result.hasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        PrepareBuilder();
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        PrepareBuilder();
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+    }
+    static SpeedMessage2() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SpeedMessage2GroupedMessage : pb::GeneratedMessage<SpeedMessage2GroupedMessage, SpeedMessage2GroupedMessage.Builder> {
+    private SpeedMessage2GroupedMessage() { }
+    private static readonly SpeedMessage2GroupedMessage defaultInstance = new SpeedMessage2GroupedMessage().MakeReadOnly();
+    private static readonly string[] _speedMessage2GroupedMessageFieldNames = new string[] { "field1", "field10", "field11", "field2", "field3", "field4", "field5", "field6", "field7", "field8", "field9" };
+    private static readonly uint[] _speedMessage2GroupedMessageFieldTags = new uint[] { 13, 85, 88, 21, 29, 32, 40, 48, 56, 69, 72 };
+    public static SpeedMessage2GroupedMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SpeedMessage2GroupedMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SpeedMessage2GroupedMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage2GroupedMessage, SpeedMessage2GroupedMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable; }
+    }
+
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private float field1_;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public float Field1 {
+      get { return field1_; }
+    }
+
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private float field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public float Field2 {
+      get { return field2_; }
+    }
+
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private float field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public float Field3 {
+      get { return field3_; }
+    }
+
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private bool field4_;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public bool Field4 {
+      get { return field4_; }
+    }
+
+    public const int Field5FieldNumber = 5;
+    private bool hasField5;
+    private bool field5_;
+    public bool HasField5 {
+      get { return hasField5; }
+    }
+    public bool Field5 {
+      get { return field5_; }
+    }
+
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private bool field6_ = true;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public bool Field6 {
+      get { return field6_; }
+    }
+
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private bool field7_;
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public bool Field7 {
+      get { return field7_; }
+    }
+
+    public const int Field8FieldNumber = 8;
+    private bool hasField8;
+    private float field8_;
+    public bool HasField8 {
+      get { return hasField8; }
+    }
+    public float Field8 {
+      get { return field8_; }
+    }
+
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private bool field9_;
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public bool Field9 {
+      get { return field9_; }
+    }
+
+    public const int Field10FieldNumber = 10;
+    private bool hasField10;
+    private float field10_;
+    public bool HasField10 {
+      get { return hasField10; }
+    }
+    public float Field10 {
+      get { return field10_; }
+    }
+
+    public const int Field11FieldNumber = 11;
+    private bool hasField11;
+    private long field11_;
+    public bool HasField11 {
+      get { return hasField11; }
+    }
+    public long Field11 {
+      get { return field11_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _speedMessage2GroupedMessageFieldNames;
+      if (hasField1) {
+        output.WriteFloat(1, field_names[0], Field1);
+      }
+      if (hasField2) {
+        output.WriteFloat(2, field_names[3], Field2);
+      }
+      if (hasField3) {
+        output.WriteFloat(3, field_names[4], Field3);
+      }
+      if (hasField4) {
+        output.WriteBool(4, field_names[5], Field4);
+      }
+      if (hasField5) {
+        output.WriteBool(5, field_names[6], Field5);
+      }
+      if (hasField6) {
+        output.WriteBool(6, field_names[7], Field6);
+      }
+      if (hasField7) {
+        output.WriteBool(7, field_names[8], Field7);
+      }
+      if (hasField8) {
+        output.WriteFloat(8, field_names[9], Field8);
+      }
+      if (hasField9) {
+        output.WriteBool(9, field_names[10], Field9);
+      }
+      if (hasField10) {
+        output.WriteFloat(10, field_names[1], Field10);
+      }
+      if (hasField11) {
+        output.WriteInt64(11, field_names[2], Field11);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasField1) {
+        size += pb::CodedOutputStream.ComputeFloatSize(1, Field1);
+      }
+      if (hasField2) {
+        size += pb::CodedOutputStream.ComputeFloatSize(2, Field2);
+      }
+      if (hasField3) {
+        size += pb::CodedOutputStream.ComputeFloatSize(3, Field3);
+      }
+      if (hasField4) {
+        size += pb::CodedOutputStream.ComputeBoolSize(4, Field4);
+      }
+      if (hasField5) {
+        size += pb::CodedOutputStream.ComputeBoolSize(5, Field5);
+      }
+      if (hasField6) {
+        size += pb::CodedOutputStream.ComputeBoolSize(6, Field6);
+      }
+      if (hasField7) {
+        size += pb::CodedOutputStream.ComputeBoolSize(7, Field7);
+      }
+      if (hasField8) {
+        size += pb::CodedOutputStream.ComputeFloatSize(8, Field8);
+      }
+      if (hasField9) {
+        size += pb::CodedOutputStream.ComputeBoolSize(9, Field9);
+      }
+      if (hasField10) {
+        size += pb::CodedOutputStream.ComputeFloatSize(10, Field10);
+      }
+      if (hasField11) {
+        size += pb::CodedOutputStream.ComputeInt64Size(11, Field11);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SpeedMessage2GroupedMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage2GroupedMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage2GroupedMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SpeedMessage2GroupedMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SpeedMessage2GroupedMessage result;
+
+      private SpeedMessage2GroupedMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SpeedMessage2GroupedMessage original = result;
+          result = new SpeedMessage2GroupedMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SpeedMessage2GroupedMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Descriptor; }
+      }
+
+      public override SpeedMessage2GroupedMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance; }
+      }
+
+      public override SpeedMessage2GroupedMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage2GroupedMessage) {
+          return MergeFrom((SpeedMessage2GroupedMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(SpeedMessage2GroupedMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.HasField5) {
+          Field5 = other.Field5;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField7) {
+          Field7 = other.Field7;
+        }
+        if (other.HasField8) {
+          Field8 = other.Field8;
+        }
+        if (other.HasField9) {
+          Field9 = other.Field9;
+        }
+        if (other.HasField10) {
+          Field10 = other.Field10;
+        }
+        if (other.HasField11) {
+          Field11 = other.Field11;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_speedMessage2GroupedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _speedMessage2GroupedMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 13: {
+              result.hasField1 = input.ReadFloat(ref result.field1_);
+              break;
+            }
+            case 21: {
+              result.hasField2 = input.ReadFloat(ref result.field2_);
+              break;
+            }
+            case 29: {
+              result.hasField3 = input.ReadFloat(ref result.field3_);
+              break;
+            }
+            case 32: {
+              result.hasField4 = input.ReadBool(ref result.field4_);
+              break;
+            }
+            case 40: {
+              result.hasField5 = input.ReadBool(ref result.field5_);
+              break;
+            }
+            case 48: {
+              result.hasField6 = input.ReadBool(ref result.field6_);
+              break;
+            }
+            case 56: {
+              result.hasField7 = input.ReadBool(ref result.field7_);
+              break;
+            }
+            case 69: {
+              result.hasField8 = input.ReadFloat(ref result.field8_);
+              break;
+            }
+            case 72: {
+              result.hasField9 = input.ReadBool(ref result.field9_);
+              break;
+            }
+            case 85: {
+              result.hasField10 = input.ReadFloat(ref result.field10_);
+              break;
+            }
+            case 88: {
+              result.hasField11 = input.ReadInt64(ref result.field11_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public float Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(float value) {
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = 0F;
+        return this;
+      }
+
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public float Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(float value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0F;
+        return this;
+      }
+
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public float Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(float value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0F;
+        return this;
+      }
+
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public bool Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(bool value) {
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = false;
+        return this;
+      }
+
+      public bool HasField5 {
+        get { return result.hasField5; }
+      }
+      public bool Field5 {
+        get { return result.Field5; }
+        set { SetField5(value); }
+      }
+      public Builder SetField5(bool value) {
+        PrepareBuilder();
+        result.hasField5 = true;
+        result.field5_ = value;
+        return this;
+      }
+      public Builder ClearField5() {
+        PrepareBuilder();
+        result.hasField5 = false;
+        result.field5_ = false;
+        return this;
+      }
+
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public bool Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(bool value) {
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = true;
+        return this;
+      }
+
+      public bool HasField7 {
+        get { return result.hasField7; }
+      }
+      public bool Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(bool value) {
+        PrepareBuilder();
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        PrepareBuilder();
+        result.hasField7 = false;
+        result.field7_ = false;
+        return this;
+      }
+
+      public bool HasField8 {
+        get { return result.hasField8; }
+      }
+      public float Field8 {
+        get { return result.Field8; }
+        set { SetField8(value); }
+      }
+      public Builder SetField8(float value) {
+        PrepareBuilder();
+        result.hasField8 = true;
+        result.field8_ = value;
+        return this;
+      }
+      public Builder ClearField8() {
+        PrepareBuilder();
+        result.hasField8 = false;
+        result.field8_ = 0F;
+        return this;
+      }
+
+      public bool HasField9 {
+        get { return result.hasField9; }
+      }
+      public bool Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(bool value) {
+        PrepareBuilder();
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        PrepareBuilder();
+        result.hasField9 = false;
+        result.field9_ = false;
+        return this;
+      }
+
+      public bool HasField10 {
+        get { return result.hasField10; }
+      }
+      public float Field10 {
+        get { return result.Field10; }
+        set { SetField10(value); }
+      }
+      public Builder SetField10(float value) {
+        PrepareBuilder();
+        result.hasField10 = true;
+        result.field10_ = value;
+        return this;
+      }
+      public Builder ClearField10() {
+        PrepareBuilder();
+        result.hasField10 = false;
+        result.field10_ = 0F;
+        return this;
+      }
+
+      public bool HasField11 {
+        get { return result.hasField11; }
+      }
+      public long Field11 {
+        get { return result.Field11; }
+        set { SetField11(value); }
+      }
+      public Builder SetField11(long value) {
+        PrepareBuilder();
+        result.hasField11 = true;
+        result.field11_ = value;
+        return this;
+      }
+      public Builder ClearField11() {
+        PrepareBuilder();
+        result.hasField11 = false;
+        result.field11_ = 0L;
+        return this;
+      }
+    }
+    static SpeedMessage2GroupedMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.GoogleSpeed.Descriptor, null);
+    }
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code

+ 538 - 0
csharp/src/ProtoBench/Program.cs

@@ -0,0 +1,538 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Runtime.Serialization.Json;
+using System.Text;
+using System.Threading;
+using System.Xml;
+using Google.ProtocolBuffers.Serialization;
+using Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.ProtoBench
+{
+    /// <summary>
+    /// Simple benchmarking of arbitrary messages.
+    /// </summary>
+    public sealed class Program
+    {
+        private static TimeSpan MinSampleTime = TimeSpan.FromSeconds(2);
+        private static TimeSpan TargetTime = TimeSpan.FromSeconds(30);
+        private static bool Verbose = false, FastTest = false, OtherFormats = false;
+        // Avoid a .NET 3.5 dependency
+        private delegate void Action();
+
+        private delegate void BenchmarkTest(string name, long dataSize, Action action);
+
+        private static BenchmarkTest RunBenchmark;
+
+        private static string _logFile;
+        static void WriteLine(string format, params object[] arg)
+        {
+            if (arg.Length > 0) format = String.Format(format, arg);
+            Console.Out.WriteLine(format);
+            if (!String.IsNullOrEmpty(_logFile))
+                File.AppendAllText(_logFile, format + Environment.NewLine);
+        }
+
+        [STAThread]
+        public static int Main(string[] args)
+        {
+            List<string> temp = new List<string>(args);
+
+            Verbose = temp.Remove("/verbose") || temp.Remove("-verbose");
+            OtherFormats = temp.Remove("/formats") || temp.Remove("-formats");
+
+            foreach (string arg in temp)
+            {
+                if (arg.StartsWith("/log:", StringComparison.OrdinalIgnoreCase) || arg.StartsWith("-log:", StringComparison.OrdinalIgnoreCase))
+                {
+                    _logFile = arg.Substring(5);
+                    if (!String.IsNullOrEmpty(_logFile))
+                        File.AppendAllText(_logFile, Environment.NewLine + "Started benchmarks at " + DateTime.Now + Environment.NewLine);
+                    temp.Remove(arg);
+                    break;
+                }
+            }
+
+            if (true == (FastTest = (temp.Remove("/fast") || temp.Remove("-fast"))))
+            {
+                TargetTime = TimeSpan.FromSeconds(10);
+            }
+
+            RunBenchmark = BenchmarkV1;
+            if (temp.Remove("/v2") || temp.Remove("-v2"))
+            {
+                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
+                Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1);
+                RunBenchmark = BenchmarkV2;
+            }
+            if (temp.Remove("/all") || temp.Remove("-all"))
+            {
+                if (FastTest)
+                {
+                    TargetTime = TimeSpan.FromSeconds(5);
+                }
+                foreach (KeyValuePair<string, string> item in MakeTests())
+                {
+                    temp.Add(item.Key);
+                    temp.Add(item.Value);
+                }
+            }
+            args = temp.ToArray();
+
+            if (args.Length < 2 || (args.Length%2) != 0)
+            {
+                Console.Error.WriteLine("Usage: ProtoBench [/fast] <descriptor type name> <input data>");
+                Console.Error.WriteLine("The descriptor type name is the fully-qualified message name,");
+                Console.Error.WriteLine(
+                    "including assembly - e.g. Google.ProtocolBuffers.BenchmarkProtos.Message1,ProtoBench");
+                Console.Error.WriteLine("(You can specify multiple pairs of descriptor type name and input data.)");
+                return 1;
+            }
+
+            bool success = true;
+            for (int i = 0; i < args.Length; i += 2)
+            {
+                success &= RunTest(args[i], args[i + 1], null);
+            }
+            return success ? 0 : 1;
+        }
+
+        /// <summary>
+        /// Runs a single test. Error messages are displayed to Console.Error, and the return value indicates
+        /// general success/failure.
+        /// </summary>
+        public static bool RunTest(string typeName, string file, byte[] inputData)
+        {
+            WriteLine("Benchmarking {0} with file {1}", typeName, file);
+            IMessage defaultMessage;
+            try
+            {
+                defaultMessage = MessageUtil.GetDefaultMessage(typeName);
+            }
+            catch (ArgumentException e)
+            {
+                Console.Error.WriteLine(e.Message);
+                return false;
+            }
+            try
+            {
+                ExtensionRegistry registry = ExtensionRegistry.Empty;
+                inputData = inputData ?? File.ReadAllBytes(file);
+                MemoryStream inputStream = new MemoryStream(inputData);
+                ByteString inputString = ByteString.CopyFrom(inputData);
+                IMessage sampleMessage =
+                    defaultMessage.WeakCreateBuilderForType().WeakMergeFrom(inputString, registry).WeakBuild();
+
+                IDictionary<string, object> dictionary = null;
+                byte[] jsonBytes = null, xmlBytes = null; /*no pun intended, well... maybe for xml*/
+                if (OtherFormats)
+                {
+                    using (MemoryStream temp = new MemoryStream())
+                    {
+                        XmlFormatWriter.CreateInstance(temp).WriteMessage(sampleMessage);
+                        xmlBytes = temp.ToArray();
+                    }
+                    using (MemoryStream temp = new MemoryStream())
+                    {
+                        JsonFormatWriter.CreateInstance(temp).WriteMessage(sampleMessage);
+                        jsonBytes = temp.ToArray();
+                    }
+                    dictionary = new Dictionary<string, object>(StringComparer.Ordinal);
+                    new DictionaryWriter(dictionary).WriteMessage(sampleMessage);
+                }
+
+                //Serializers
+                if (!FastTest)
+                {
+                    RunBenchmark("Serialize to byte string", inputData.Length, () => sampleMessage.ToByteString());
+                }
+                RunBenchmark("Serialize to byte array", inputData.Length, () => sampleMessage.ToByteArray());
+                if (!FastTest)
+                {
+                    RunBenchmark("Serialize to memory stream", inputData.Length,
+                                 () => sampleMessage.WriteTo(new MemoryStream()));
+                }
+
+                if (OtherFormats)
+                {
+                    RunBenchmark("Serialize to xml", xmlBytes.Length,
+                                 () =>
+                                     {
+                                         XmlFormatWriter.CreateInstance(new MemoryStream(), Encoding.UTF8).WriteMessage(sampleMessage);
+                                     });
+                    RunBenchmark("Serialize to json", jsonBytes.Length,
+                                 () => { JsonFormatWriter.CreateInstance().WriteMessage(sampleMessage); });
+                    RunBenchmark("Serialize to json via xml", jsonBytes.Length,
+                                 () =>
+                                 XmlFormatWriter.CreateInstance(
+                                     JsonReaderWriterFactory.CreateJsonWriter(new MemoryStream(), Encoding.UTF8))
+                                     .SetOptions(XmlWriterOptions.OutputJsonTypes)
+                                     .WriteMessage(sampleMessage)
+                        );
+
+                    RunBenchmark("Serialize to dictionary", sampleMessage.SerializedSize,
+                                 () => new DictionaryWriter().WriteMessage(sampleMessage));
+                }
+                //Deserializers
+                if (!FastTest)
+                {
+                    RunBenchmark("Deserialize from byte string", inputData.Length,
+                                 () => defaultMessage.WeakCreateBuilderForType()
+                                           .WeakMergeFrom(inputString, registry)
+                                           .WeakBuild()
+                        );
+                }
+
+                RunBenchmark("Deserialize from byte array", inputData.Length,
+                             () => defaultMessage.WeakCreateBuilderForType()
+                                       .WeakMergeFrom(CodedInputStream.CreateInstance(inputData), registry)
+                                       .WeakBuild()
+                    );
+                if (!FastTest)
+                {
+                    RunBenchmark("Deserialize from memory stream", inputData.Length,
+                                 () =>
+                                     {
+                                         inputStream.Position = 0;
+                                         defaultMessage.WeakCreateBuilderForType().WeakMergeFrom(
+                                             CodedInputStream.CreateInstance(inputStream), registry)
+                                             .WeakBuild();
+                                     });
+                }
+
+                if (OtherFormats)
+                {
+                    RunBenchmark("Deserialize from xml", xmlBytes.Length,
+                                 () =>
+                                 XmlFormatReader.CreateInstance(xmlBytes).Merge(
+                                     defaultMessage.WeakCreateBuilderForType()).WeakBuild());
+                    RunBenchmark("Deserialize from json", jsonBytes.Length,
+                                 () =>
+                                 JsonFormatReader.CreateInstance(jsonBytes).Merge(
+                                     defaultMessage.WeakCreateBuilderForType()).WeakBuild());
+                    RunBenchmark("Deserialize from json via xml", jsonBytes.Length,
+                                 () =>
+                                 XmlFormatReader.CreateInstance(JsonReaderWriterFactory.CreateJsonReader(jsonBytes, XmlDictionaryReaderQuotas.Max))
+                                     .SetOptions(XmlReaderOptions.ReadNestedArrays).Merge(
+                                         defaultMessage.WeakCreateBuilderForType()).WeakBuild());
+
+                    RunBenchmark("Deserialize from dictionary", sampleMessage.SerializedSize,
+                                 () =>
+                                 new DictionaryReader(dictionary).Merge(defaultMessage.WeakCreateBuilderForType()).
+                                     WeakBuild());
+                }
+                WriteLine(String.Empty);
+                return true;
+            }
+            catch (Exception e)
+            {
+                Console.Error.WriteLine("Error: {0}", e.Message);
+                Console.Error.WriteLine();
+                Console.Error.WriteLine("Detailed exception information: {0}", e);
+                return false;
+            }
+        }
+
+        private static void BenchmarkV2(string name, long dataSize, Action action)
+        {
+            Thread.BeginThreadAffinity();
+            TimeSpan elapsed = TimeSpan.Zero;
+            long runs = 0;
+            long totalCount = 0;
+            double best = double.MinValue, worst = double.MaxValue;
+
+            action();
+            // Run it progressively more times until we've got a reasonable sample
+
+            int iterations = 100;
+            elapsed = TimeAction(action, iterations);
+            while (elapsed.TotalMilliseconds < 1000)
+            {
+                elapsed += TimeAction(action, iterations);
+                iterations *= 2;
+            }
+
+            TimeSpan target = TimeSpan.FromSeconds(1);
+
+            elapsed = TimeAction(action, iterations);
+            iterations = (int) ((target.Ticks*iterations)/(double) elapsed.Ticks);
+            elapsed = TimeAction(action, iterations);
+            iterations = (int) ((target.Ticks*iterations)/(double) elapsed.Ticks);
+            elapsed = TimeAction(action, iterations);
+            iterations = (int) ((target.Ticks*iterations)/(double) elapsed.Ticks);
+
+            double first = (iterations*dataSize)/(elapsed.TotalSeconds*1024*1024);
+            if (Verbose)
+            {
+                WriteLine("Round ---: Count = {1,6}, Bps = {2,8:f3}", 0, iterations, first);
+            }
+            elapsed = TimeSpan.Zero;
+            int max = (int) TargetTime.TotalSeconds;
+
+            while (runs < max)
+            {
+                TimeSpan cycle = TimeAction(action, iterations);
+                // Accumulate and scale for next cycle.
+
+                double bps = (iterations*dataSize)/(cycle.TotalSeconds*1024*1024);
+                if (Verbose)
+                {
+                    WriteLine("Round {1,3}: Count = {2,6}, Bps = {3,8:f3}",
+                                      0, runs, iterations, bps);
+                }
+
+                best = Math.Max(best, bps);
+                worst = Math.Min(worst, bps);
+
+                runs++;
+                elapsed += cycle;
+                totalCount += iterations;
+                iterations = (int) ((target.Ticks*totalCount)/(double) elapsed.Ticks);
+            }
+
+            Thread.EndThreadAffinity();
+            WriteLine(
+                "{1}: averages {2} per {3:f3}s for {4} runs; avg: {5:f3}mbps; best: {6:f3}mbps; worst: {7:f3}mbps",
+                0, name, totalCount/runs, elapsed.TotalSeconds/runs, runs,
+                (totalCount*dataSize)/(elapsed.TotalSeconds*1024*1024), best, worst);
+        }
+
+        private static void BenchmarkV1(string name, long dataSize, Action action)
+        {
+            // Make sure it's JITted
+            action();
+            // Run it progressively more times until we've got a reasonable sample
+
+            int iterations = 1;
+            TimeSpan elapsed = TimeAction(action, iterations);
+            while (elapsed < MinSampleTime)
+            {
+                iterations *= 2;
+                elapsed = TimeAction(action, iterations);
+            }
+            // Upscale the sample to the target time. Do this in floating point arithmetic
+            // to avoid overflow issues.
+            iterations = (int) ((TargetTime.Ticks/(double) elapsed.Ticks)*iterations);
+            elapsed = TimeAction(action, iterations);
+            WriteLine("{0}: {1} iterations in {2:f3}s; {3:f3}MB/s",
+                              name, iterations, elapsed.TotalSeconds,
+                              (iterations*dataSize)/(elapsed.TotalSeconds*1024*1024));
+        }
+
+        private static TimeSpan TimeAction(Action action, int iterations)
+        {
+            GC.Collect();
+            GC.GetTotalMemory(true);
+            GC.WaitForPendingFinalizers();
+
+            Stopwatch sw = Stopwatch.StartNew();
+            for (int i = 0; i < iterations; i++)
+            {
+                action();
+            }
+            sw.Stop();
+            return sw.Elapsed;
+        }
+
+        private static IEnumerable<KeyValuePair<string, string>> MakeTests()
+        {
+            //Aggregate Tests
+            yield return MakeWorkItem("all-types", MakeTestAllTypes());
+            yield return MakeWorkItem("repeated-100", MakeRepeatedTestAllTypes(100));
+            yield return MakeWorkItem("packed-100", MakeTestPackedTypes(100));
+
+            //Discrete Tests
+            foreach (KeyValuePair<string, Action<TestAllTypes.Builder>> item in MakeTestAllTypes())
+            {
+                yield return MakeWorkItem(item.Key, new[] {item});
+            }
+
+            foreach (KeyValuePair<string, Action<TestAllTypes.Builder>> item in MakeRepeatedTestAllTypes(100))
+            {
+                yield return MakeWorkItem(item.Key, new[] {item});
+            }
+
+            foreach (KeyValuePair<string, Action<TestPackedTypes.Builder>> item in MakeTestPackedTypes(100))
+            {
+                yield return MakeWorkItem(item.Key, new[] {item});
+            }
+        }
+
+        private static IEnumerable<KeyValuePair<string, Action<TestAllTypes.Builder>>> MakeTestAllTypes()
+        {
+            // Many of the raw type serializers below perform poorly due to the numerous fields defined
+            // in TestAllTypes.
+
+            //single values
+            yield return MakeItem<TestAllTypes.Builder>("int32", 1, x => x.SetOptionalInt32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("int64", 1, x => x.SetOptionalInt64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("uint32", 1, x => x.SetOptionalUint32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("uint64", 1, x => x.SetOptionalUint64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("sint32", 1, x => x.SetOptionalSint32(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("sint64", 1, x => x.SetOptionalSint64(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("fixed32", 1, x => x.SetOptionalFixed32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("fixed64", 1, x => x.SetOptionalFixed64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("sfixed32", 1, x => x.SetOptionalSfixed32(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("sfixed64", 1, x => x.SetOptionalSfixed64(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("float", 1, x => x.SetOptionalFloat(1001.1001f));
+            yield return MakeItem<TestAllTypes.Builder>("double", 1, x => x.SetOptionalDouble(1001.1001));
+            yield return MakeItem<TestAllTypes.Builder>("bool", 1, x => x.SetOptionalBool(true));
+            yield return MakeItem<TestAllTypes.Builder>("string", 1, x => x.SetOptionalString("this is a string value"))
+                ;
+            yield return
+                MakeItem<TestAllTypes.Builder>("bytes", 1,
+                                               x =>
+                                               x.SetOptionalBytes(ByteString.CopyFromUtf8("this is an array of bytes")))
+                ;
+            yield return
+                MakeItem<TestAllTypes.Builder>("group", 1,
+                                               x =>
+                                               x.SetOptionalGroup(
+                                                   new TestAllTypes.Types.OptionalGroup.Builder().SetA(1001)));
+            yield return
+                MakeItem<TestAllTypes.Builder>("message", 1,
+                                               x =>
+                                               x.SetOptionalNestedMessage(
+                                                   new TestAllTypes.Types.NestedMessage.Builder().SetBb(1001)));
+            yield return
+                MakeItem<TestAllTypes.Builder>("enum", 1,
+                                               x => x.SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.FOO));
+        }
+
+        private static IEnumerable<KeyValuePair<string, Action<TestAllTypes.Builder>>> MakeRepeatedTestAllTypes(int size)
+        {
+            //repeated values
+            yield return MakeItem<TestAllTypes.Builder>("repeated-int32", size, x => x.AddRepeatedInt32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-int64", size, x => x.AddRepeatedInt64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-uint32", size, x => x.AddRepeatedUint32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-uint64", size, x => x.AddRepeatedUint64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-sint32", size, x => x.AddRepeatedSint32(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-sint64", size, x => x.AddRepeatedSint64(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-fixed32", size, x => x.AddRepeatedFixed32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-fixed64", size, x => x.AddRepeatedFixed64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-sfixed32", size, x => x.AddRepeatedSfixed32(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-sfixed64", size, x => x.AddRepeatedSfixed64(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-float", size, x => x.AddRepeatedFloat(1001.1001f));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-double", size, x => x.AddRepeatedDouble(1001.1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-bool", size, x => x.AddRepeatedBool(true));
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-string", size,
+                                               x => x.AddRepeatedString("this is a string value"));
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-bytes", size,
+                                               x =>
+                                               x.AddRepeatedBytes(ByteString.CopyFromUtf8("this is an array of bytes")))
+                ;
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-group", size,
+                                               x =>
+                                               x.AddRepeatedGroup(
+                                                   new TestAllTypes.Types.RepeatedGroup.Builder().SetA(1001)));
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-message", size,
+                                               x =>
+                                               x.AddRepeatedNestedMessage(
+                                                   new TestAllTypes.Types.NestedMessage.Builder().SetBb(1001)));
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-enum", size,
+                                               x => x.AddRepeatedNestedEnum(TestAllTypes.Types.NestedEnum.FOO));
+        }
+
+        private static IEnumerable<KeyValuePair<string, Action<TestPackedTypes.Builder>>> MakeTestPackedTypes(int size)
+        {
+            //packed values
+            yield return MakeItem<TestPackedTypes.Builder>("packed-int32", size, x => x.AddPackedInt32(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-int64", size, x => x.AddPackedInt64(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-uint32", size, x => x.AddPackedUint32(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-uint64", size, x => x.AddPackedUint64(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-sint32", size, x => x.AddPackedSint32(-1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-sint64", size, x => x.AddPackedSint64(-1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-fixed32", size, x => x.AddPackedFixed32(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-fixed64", size, x => x.AddPackedFixed64(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-sfixed32", size, x => x.AddPackedSfixed32(-1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-sfixed64", size, x => x.AddPackedSfixed64(-1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-float", size, x => x.AddPackedFloat(1001.1001f));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-double", size, x => x.AddPackedDouble(1001.1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-bool", size, x => x.AddPackedBool(true));
+            yield return
+                MakeItem<TestPackedTypes.Builder>("packed-enum", size, x => x.AddPackedEnum(ForeignEnum.FOREIGN_FOO));
+        }
+
+        private static KeyValuePair<string, Action<T>> MakeItem<T>(string name, int repeated, Action<T> build)
+            where T : IBuilderLite, new()
+        {
+            if (repeated == 1)
+            {
+                return new KeyValuePair<string, Action<T>>(name, build);
+            }
+
+            return new KeyValuePair<string, Action<T>>(
+                String.Format("{0}[{1}]", name, repeated),
+                x =>
+                    {
+                        for (int i = 0; i < repeated; i++)
+                        {
+                            build(x);
+                        }
+                    }
+                );
+        }
+
+        private static KeyValuePair<string, string> MakeWorkItem<T>(string name,
+                                                                    IEnumerable<KeyValuePair<string, Action<T>>>
+                                                                        builders) where T : IBuilderLite, new()
+        {
+            T builder = new T();
+
+            foreach (KeyValuePair<string, Action<T>> item in builders)
+            {
+                item.Value(builder);
+            }
+
+            IMessageLite msg = builder.WeakBuild();
+            string fname = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "unittest_" + name + ".dat");
+            File.WriteAllBytes(fname, msg.ToByteArray());
+            return
+                new KeyValuePair<string, string>(
+                    String.Format("{0},{1}", msg.GetType().FullName, msg.GetType().Assembly.GetName().Name), fname);
+        }
+    }
+}

+ 31 - 0
csharp/src/ProtoBench/Properties/AssemblyInfo.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("ProtoBench")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtoBench")]
+[assembly: AssemblyCopyright("Copyright ©  2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+[assembly: AssemblyFileVersion("2.4.1.555")]

+ 88 - 0
csharp/src/ProtoBench/ProtoBench.csproj

@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C7A4A435-2813-41C8-AA87-BD914BA5223D}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.ProtoBench</RootNamespace>
+    <AssemblyName>ProtoBench</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="GoogleSize.cs" />
+    <Compile Include="GoogleSpeed.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Unittest.cs" />
+    <Compile Include="UnittestImport.cs" />
+    <Compile Include="UnittestImportPublic.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers.Serialization\ProtocolBuffers.Serialization.csproj">
+      <Project>{231391AF-449C-4a39-986C-AD7F270F4750}</Project>
+      <Name>ProtocolBuffers.Serialization</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+      <Private>True</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="google_message1.dat">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="google_message2.dat">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="TestProtos\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 33516 - 0
csharp/src/ProtoBench/Unittest.cs

@@ -0,0 +1,33516 @@
+// Manual changes:
+// - Search and replace of RepeatedFieldsGenerator.Group to RepeatedFieldsGenerator.Types.Group
+//
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/unittest.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class Unittest {
+
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalStringExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalBytesExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalGroupExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalNestedMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalForeignMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalImportMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalNestedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalForeignEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalImportEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalStringPieceExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalCordExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalPublicImportMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalLazyMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedStringExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedBytesExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedGroupExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedNestedMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedForeignMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedImportMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedNestedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedForeignEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedImportEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedStringPieceExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedCordExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedLazyMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultStringExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultBytesExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultNestedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultForeignEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultImportEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultStringPieceExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultCordExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OneofUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OneofNestedMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OneofStringExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.OneofBytesExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.MyExtensionString);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.MyExtensionInt);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.PackedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Test);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.NestedStringExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestRequired.Single);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestRequired.Multi);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.OptionalExt);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.RepeatedExt);
+    }
+    #endregion
+    #region Extensions
+    public const int OptionalInt32ExtensionFieldNumber = 1;
+    public static pb::GeneratedExtensionBase<int> OptionalInt32Extension;
+    public const int OptionalInt64ExtensionFieldNumber = 2;
+    public static pb::GeneratedExtensionBase<long> OptionalInt64Extension;
+    public const int OptionalUint32ExtensionFieldNumber = 3;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> OptionalUint32Extension;
+    public const int OptionalUint64ExtensionFieldNumber = 4;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<ulong> OptionalUint64Extension;
+    public const int OptionalSint32ExtensionFieldNumber = 5;
+    public static pb::GeneratedExtensionBase<int> OptionalSint32Extension;
+    public const int OptionalSint64ExtensionFieldNumber = 6;
+    public static pb::GeneratedExtensionBase<long> OptionalSint64Extension;
+    public const int OptionalFixed32ExtensionFieldNumber = 7;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> OptionalFixed32Extension;
+    public const int OptionalFixed64ExtensionFieldNumber = 8;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<ulong> OptionalFixed64Extension;
+    public const int OptionalSfixed32ExtensionFieldNumber = 9;
+    public static pb::GeneratedExtensionBase<int> OptionalSfixed32Extension;
+    public const int OptionalSfixed64ExtensionFieldNumber = 10;
+    public static pb::GeneratedExtensionBase<long> OptionalSfixed64Extension;
+    public const int OptionalFloatExtensionFieldNumber = 11;
+    public static pb::GeneratedExtensionBase<float> OptionalFloatExtension;
+    public const int OptionalDoubleExtensionFieldNumber = 12;
+    public static pb::GeneratedExtensionBase<double> OptionalDoubleExtension;
+    public const int OptionalBoolExtensionFieldNumber = 13;
+    public static pb::GeneratedExtensionBase<bool> OptionalBoolExtension;
+    public const int OptionalStringExtensionFieldNumber = 14;
+    public static pb::GeneratedExtensionBase<string> OptionalStringExtension;
+    public const int OptionalBytesExtensionFieldNumber = 15;
+    public static pb::GeneratedExtensionBase<pb::ByteString> OptionalBytesExtension;
+    public const int OptionalGroupExtensionFieldNumber = 16;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension> OptionalGroupExtension;
+    public const int OptionalNestedMessageExtensionFieldNumber = 18;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> OptionalNestedMessageExtension;
+    public const int OptionalForeignMessageExtensionFieldNumber = 19;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> OptionalForeignMessageExtension;
+    public const int OptionalImportMessageExtensionFieldNumber = 20;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ImportMessage> OptionalImportMessageExtension;
+    public const int OptionalNestedEnumExtensionFieldNumber = 21;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> OptionalNestedEnumExtension;
+    public const int OptionalForeignEnumExtensionFieldNumber = 22;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> OptionalForeignEnumExtension;
+    public const int OptionalImportEnumExtensionFieldNumber = 23;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ImportEnum> OptionalImportEnumExtension;
+    public const int OptionalStringPieceExtensionFieldNumber = 24;
+    public static pb::GeneratedExtensionBase<string> OptionalStringPieceExtension;
+    public const int OptionalCordExtensionFieldNumber = 25;
+    public static pb::GeneratedExtensionBase<string> OptionalCordExtension;
+    public const int OptionalPublicImportMessageExtensionFieldNumber = 26;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.PublicImportMessage> OptionalPublicImportMessageExtension;
+    public const int OptionalLazyMessageExtensionFieldNumber = 27;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> OptionalLazyMessageExtension;
+    public const int RepeatedInt32ExtensionFieldNumber = 31;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> RepeatedInt32Extension;
+    public const int RepeatedInt64ExtensionFieldNumber = 32;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> RepeatedInt64Extension;
+    public const int RepeatedUint32ExtensionFieldNumber = 33;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> RepeatedUint32Extension;
+    public const int RepeatedUint64ExtensionFieldNumber = 34;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> RepeatedUint64Extension;
+    public const int RepeatedSint32ExtensionFieldNumber = 35;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> RepeatedSint32Extension;
+    public const int RepeatedSint64ExtensionFieldNumber = 36;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> RepeatedSint64Extension;
+    public const int RepeatedFixed32ExtensionFieldNumber = 37;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> RepeatedFixed32Extension;
+    public const int RepeatedFixed64ExtensionFieldNumber = 38;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> RepeatedFixed64Extension;
+    public const int RepeatedSfixed32ExtensionFieldNumber = 39;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> RepeatedSfixed32Extension;
+    public const int RepeatedSfixed64ExtensionFieldNumber = 40;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> RepeatedSfixed64Extension;
+    public const int RepeatedFloatExtensionFieldNumber = 41;
+    public static pb::GeneratedExtensionBase<scg::IList<float>> RepeatedFloatExtension;
+    public const int RepeatedDoubleExtensionFieldNumber = 42;
+    public static pb::GeneratedExtensionBase<scg::IList<double>> RepeatedDoubleExtension;
+    public const int RepeatedBoolExtensionFieldNumber = 43;
+    public static pb::GeneratedExtensionBase<scg::IList<bool>> RepeatedBoolExtension;
+    public const int RepeatedStringExtensionFieldNumber = 44;
+    public static pb::GeneratedExtensionBase<scg::IList<string>> RepeatedStringExtension;
+    public const int RepeatedBytesExtensionFieldNumber = 45;
+    public static pb::GeneratedExtensionBase<scg::IList<pb::ByteString>> RepeatedBytesExtension;
+    public const int RepeatedGroupExtensionFieldNumber = 46;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension>> RepeatedGroupExtension;
+    public const int RepeatedNestedMessageExtensionFieldNumber = 48;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>> RepeatedNestedMessageExtension;
+    public const int RepeatedForeignMessageExtensionFieldNumber = 49;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>> RepeatedForeignMessageExtension;
+    public const int RepeatedImportMessageExtensionFieldNumber = 50;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ImportMessage>> RepeatedImportMessageExtension;
+    public const int RepeatedNestedEnumExtensionFieldNumber = 51;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>> RepeatedNestedEnumExtension;
+    public const int RepeatedForeignEnumExtensionFieldNumber = 52;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>> RepeatedForeignEnumExtension;
+    public const int RepeatedImportEnumExtensionFieldNumber = 53;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ImportEnum>> RepeatedImportEnumExtension;
+    public const int RepeatedStringPieceExtensionFieldNumber = 54;
+    public static pb::GeneratedExtensionBase<scg::IList<string>> RepeatedStringPieceExtension;
+    public const int RepeatedCordExtensionFieldNumber = 55;
+    public static pb::GeneratedExtensionBase<scg::IList<string>> RepeatedCordExtension;
+    public const int RepeatedLazyMessageExtensionFieldNumber = 57;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>> RepeatedLazyMessageExtension;
+    public const int DefaultInt32ExtensionFieldNumber = 61;
+    public static pb::GeneratedExtensionBase<int> DefaultInt32Extension;
+    public const int DefaultInt64ExtensionFieldNumber = 62;
+    public static pb::GeneratedExtensionBase<long> DefaultInt64Extension;
+    public const int DefaultUint32ExtensionFieldNumber = 63;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> DefaultUint32Extension;
+    public const int DefaultUint64ExtensionFieldNumber = 64;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<ulong> DefaultUint64Extension;
+    public const int DefaultSint32ExtensionFieldNumber = 65;
+    public static pb::GeneratedExtensionBase<int> DefaultSint32Extension;
+    public const int DefaultSint64ExtensionFieldNumber = 66;
+    public static pb::GeneratedExtensionBase<long> DefaultSint64Extension;
+    public const int DefaultFixed32ExtensionFieldNumber = 67;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> DefaultFixed32Extension;
+    public const int DefaultFixed64ExtensionFieldNumber = 68;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<ulong> DefaultFixed64Extension;
+    public const int DefaultSfixed32ExtensionFieldNumber = 69;
+    public static pb::GeneratedExtensionBase<int> DefaultSfixed32Extension;
+    public const int DefaultSfixed64ExtensionFieldNumber = 70;
+    public static pb::GeneratedExtensionBase<long> DefaultSfixed64Extension;
+    public const int DefaultFloatExtensionFieldNumber = 71;
+    public static pb::GeneratedExtensionBase<float> DefaultFloatExtension;
+    public const int DefaultDoubleExtensionFieldNumber = 72;
+    public static pb::GeneratedExtensionBase<double> DefaultDoubleExtension;
+    public const int DefaultBoolExtensionFieldNumber = 73;
+    public static pb::GeneratedExtensionBase<bool> DefaultBoolExtension;
+    public const int DefaultStringExtensionFieldNumber = 74;
+    public static pb::GeneratedExtensionBase<string> DefaultStringExtension;
+    public const int DefaultBytesExtensionFieldNumber = 75;
+    public static pb::GeneratedExtensionBase<pb::ByteString> DefaultBytesExtension;
+    public const int DefaultNestedEnumExtensionFieldNumber = 81;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> DefaultNestedEnumExtension;
+    public const int DefaultForeignEnumExtensionFieldNumber = 82;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> DefaultForeignEnumExtension;
+    public const int DefaultImportEnumExtensionFieldNumber = 83;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ImportEnum> DefaultImportEnumExtension;
+    public const int DefaultStringPieceExtensionFieldNumber = 84;
+    public static pb::GeneratedExtensionBase<string> DefaultStringPieceExtension;
+    public const int DefaultCordExtensionFieldNumber = 85;
+    public static pb::GeneratedExtensionBase<string> DefaultCordExtension;
+    public const int OneofUint32ExtensionFieldNumber = 111;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> OneofUint32Extension;
+    public const int OneofNestedMessageExtensionFieldNumber = 112;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> OneofNestedMessageExtension;
+    public const int OneofStringExtensionFieldNumber = 113;
+    public static pb::GeneratedExtensionBase<string> OneofStringExtension;
+    public const int OneofBytesExtensionFieldNumber = 114;
+    public static pb::GeneratedExtensionBase<pb::ByteString> OneofBytesExtension;
+    public const int MyExtensionStringFieldNumber = 50;
+    public static pb::GeneratedExtensionBase<string> MyExtensionString;
+    public const int MyExtensionIntFieldNumber = 5;
+    public static pb::GeneratedExtensionBase<int> MyExtensionInt;
+    public const int PackedInt32ExtensionFieldNumber = 90;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> PackedInt32Extension;
+    public const int PackedInt64ExtensionFieldNumber = 91;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> PackedInt64Extension;
+    public const int PackedUint32ExtensionFieldNumber = 92;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> PackedUint32Extension;
+    public const int PackedUint64ExtensionFieldNumber = 93;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> PackedUint64Extension;
+    public const int PackedSint32ExtensionFieldNumber = 94;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> PackedSint32Extension;
+    public const int PackedSint64ExtensionFieldNumber = 95;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> PackedSint64Extension;
+    public const int PackedFixed32ExtensionFieldNumber = 96;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> PackedFixed32Extension;
+    public const int PackedFixed64ExtensionFieldNumber = 97;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> PackedFixed64Extension;
+    public const int PackedSfixed32ExtensionFieldNumber = 98;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> PackedSfixed32Extension;
+    public const int PackedSfixed64ExtensionFieldNumber = 99;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> PackedSfixed64Extension;
+    public const int PackedFloatExtensionFieldNumber = 100;
+    public static pb::GeneratedExtensionBase<scg::IList<float>> PackedFloatExtension;
+    public const int PackedDoubleExtensionFieldNumber = 101;
+    public static pb::GeneratedExtensionBase<scg::IList<double>> PackedDoubleExtension;
+    public const int PackedBoolExtensionFieldNumber = 102;
+    public static pb::GeneratedExtensionBase<scg::IList<bool>> PackedBoolExtension;
+    public const int PackedEnumExtensionFieldNumber = 103;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>> PackedEnumExtension;
+    public const int UnpackedInt32ExtensionFieldNumber = 90;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> UnpackedInt32Extension;
+    public const int UnpackedInt64ExtensionFieldNumber = 91;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> UnpackedInt64Extension;
+    public const int UnpackedUint32ExtensionFieldNumber = 92;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> UnpackedUint32Extension;
+    public const int UnpackedUint64ExtensionFieldNumber = 93;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> UnpackedUint64Extension;
+    public const int UnpackedSint32ExtensionFieldNumber = 94;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> UnpackedSint32Extension;
+    public const int UnpackedSint64ExtensionFieldNumber = 95;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> UnpackedSint64Extension;
+    public const int UnpackedFixed32ExtensionFieldNumber = 96;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> UnpackedFixed32Extension;
+    public const int UnpackedFixed64ExtensionFieldNumber = 97;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> UnpackedFixed64Extension;
+    public const int UnpackedSfixed32ExtensionFieldNumber = 98;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> UnpackedSfixed32Extension;
+    public const int UnpackedSfixed64ExtensionFieldNumber = 99;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> UnpackedSfixed64Extension;
+    public const int UnpackedFloatExtensionFieldNumber = 100;
+    public static pb::GeneratedExtensionBase<scg::IList<float>> UnpackedFloatExtension;
+    public const int UnpackedDoubleExtensionFieldNumber = 101;
+    public static pb::GeneratedExtensionBase<scg::IList<double>> UnpackedDoubleExtension;
+    public const int UnpackedBoolExtensionFieldNumber = 102;
+    public static pb::GeneratedExtensionBase<scg::IList<bool>> UnpackedBoolExtension;
+    public const int UnpackedEnumExtensionFieldNumber = 103;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>> UnpackedEnumExtension;
+    #endregion
+
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder> internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder> internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder> internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_NestedTestAllTypes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes, global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.Builder> internal__static_protobuf_unittest_NestedTestAllTypes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDeprecatedFields__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields, global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.Builder> internal__static_protobuf_unittest_TestDeprecatedFields__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_ForeignMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder> internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllExtensions, global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Builder> internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension, global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Builder> internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension, global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Builder> internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedExtension__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedExtension, global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Builder> internal__static_protobuf_unittest_TestNestedExtension__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequired__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequired, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder> internal__static_protobuf_unittest_TestRequired__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequiredForeign__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign, global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Builder> internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestForeignNested__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestForeignNested, global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Builder> internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Builder> internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Builder> internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMultipleExtensionRanges__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges, global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.Builder> internal__static_protobuf_unittest_TestMultipleExtensionRanges__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber, global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Builder> internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage, global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder> internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder> internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder> internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Builder> internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder> internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder> internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestEagerMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEagerMessage, global::Google.ProtocolBuffers.TestProtos.TestEagerMessage.Builder> internal__static_protobuf_unittest_TestEagerMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestLazyMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestLazyMessage, global::Google.ProtocolBuffers.TestProtos.TestLazyMessage.Builder> internal__static_protobuf_unittest_TestLazyMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Builder> internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames, global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Builder> internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestFieldOrderings__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings, global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Builder> internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestFieldOrderings_NestedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestFieldOrderings_NestedMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues, global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Builder> internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_SparseEnumMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage, global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.Builder> internal__static_protobuf_unittest_SparseEnumMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_OneString__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OneString, global::Google.ProtocolBuffers.TestProtos.OneString.Builder> internal__static_protobuf_unittest_OneString__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_MoreString__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.MoreString, global::Google.ProtocolBuffers.TestProtos.MoreString.Builder> internal__static_protobuf_unittest_MoreString__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_OneBytes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OneBytes, global::Google.ProtocolBuffers.TestProtos.OneBytes.Builder> internal__static_protobuf_unittest_OneBytes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_MoreBytes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.MoreBytes, global::Google.ProtocolBuffers.TestProtos.MoreBytes.Builder> internal__static_protobuf_unittest_MoreBytes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_Int32Message__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.Int32Message, global::Google.ProtocolBuffers.TestProtos.Int32Message.Builder> internal__static_protobuf_unittest_Int32Message__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_Uint32Message__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.Uint32Message, global::Google.ProtocolBuffers.TestProtos.Uint32Message.Builder> internal__static_protobuf_unittest_Uint32Message__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_Int64Message__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.Int64Message, global::Google.ProtocolBuffers.TestProtos.Int64Message.Builder> internal__static_protobuf_unittest_Int64Message__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_Uint64Message__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.Uint64Message, global::Google.ProtocolBuffers.TestProtos.Uint64Message.Builder> internal__static_protobuf_unittest_Uint64Message__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_BoolMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BoolMessage, global::Google.ProtocolBuffers.TestProtos.BoolMessage.Builder> internal__static_protobuf_unittest_BoolMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestOneof__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof, global::Google.ProtocolBuffers.TestProtos.TestOneof.Builder> internal__static_protobuf_unittest_TestOneof__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestOneof_FooGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup, global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.Builder> internal__static_protobuf_unittest_TestOneof_FooGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestOneofBackwardsCompatible__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible, global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Builder> internal__static_protobuf_unittest_TestOneofBackwardsCompatible__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestOneofBackwardsCompatible_FooGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup, global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.Builder> internal__static_protobuf_unittest_TestOneofBackwardsCompatible_FooGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestOneof2__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof2, global::Google.ProtocolBuffers.TestProtos.TestOneof2.Builder> internal__static_protobuf_unittest_TestOneof2__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestOneof2_FooGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup, global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.Builder> internal__static_protobuf_unittest_TestOneof2_FooGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestOneof2_NestedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestOneof2_NestedMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequiredOneof__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof, global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Builder> internal__static_protobuf_unittest_TestRequiredOneof__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequiredOneof_NestedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestRequiredOneof_NestedMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestPackedTypes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestPackedTypes, global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.Builder> internal__static_protobuf_unittest_TestPackedTypes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestUnpackedTypes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes, global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.Builder> internal__static_protobuf_unittest_TestUnpackedTypes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestPackedExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions, global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.Builder> internal__static_protobuf_unittest_TestPackedExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestUnpackedExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestUnpackedExtensions, global::Google.ProtocolBuffers.TestProtos.TestUnpackedExtensions.Builder> internal__static_protobuf_unittest_TestUnpackedExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions, global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Builder> internal__static_protobuf_unittest_TestDynamicExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType, global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder> internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes, global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.Builder> internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestParsingMerge__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Builder> internal__static_protobuf_unittest_TestParsingMerge__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Builder> internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1.Builder> internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group2__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2.Builder> internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group2__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestParsingMerge_OptionalGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.Builder> internal__static_protobuf_unittest_TestParsingMerge_OptionalGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestParsingMerge_RepeatedGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup.Builder> internal__static_protobuf_unittest_TestParsingMerge_RepeatedGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestCommentInjectionMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestCommentInjectionMessage, global::Google.ProtocolBuffers.TestProtos.TestCommentInjectionMessage.Builder> internal__static_protobuf_unittest_TestCommentInjectionMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_FooRequest__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooRequest, global::Google.ProtocolBuffers.TestProtos.FooRequest.Builder> internal__static_protobuf_unittest_FooRequest__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_FooResponse__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder> internal__static_protobuf_unittest_FooResponse__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_FooClientMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooClientMessage, global::Google.ProtocolBuffers.TestProtos.FooClientMessage.Builder> internal__static_protobuf_unittest_FooClientMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_FooServerMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooServerMessage, global::Google.ProtocolBuffers.TestProtos.FooServerMessage.Builder> internal__static_protobuf_unittest_FooServerMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_BarRequest__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarRequest, global::Google.ProtocolBuffers.TestProtos.BarRequest.Builder> internal__static_protobuf_unittest_BarRequest__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_BarResponse__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder> internal__static_protobuf_unittest_BarResponse__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+
+    static Unittest() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ch5nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8SEXByb3RvYnVmX3Vu", 
+            "aXR0ZXN0GiVnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3Rv", 
+            "Iu0YCgxUZXN0QWxsVHlwZXMSFgoOb3B0aW9uYWxfaW50MzIYASABKAUSFgoO", 
+            "b3B0aW9uYWxfaW50NjQYAiABKAMSFwoPb3B0aW9uYWxfdWludDMyGAMgASgN", 
+            "EhcKD29wdGlvbmFsX3VpbnQ2NBgEIAEoBBIXCg9vcHRpb25hbF9zaW50MzIY", 
+            "BSABKBESFwoPb3B0aW9uYWxfc2ludDY0GAYgASgSEhgKEG9wdGlvbmFsX2Zp", 
+            "eGVkMzIYByABKAcSGAoQb3B0aW9uYWxfZml4ZWQ2NBgIIAEoBhIZChFvcHRp", 
+            "b25hbF9zZml4ZWQzMhgJIAEoDxIZChFvcHRpb25hbF9zZml4ZWQ2NBgKIAEo", 
+            "EBIWCg5vcHRpb25hbF9mbG9hdBgLIAEoAhIXCg9vcHRpb25hbF9kb3VibGUY", 
+            "DCABKAESFQoNb3B0aW9uYWxfYm9vbBgNIAEoCBIXCg9vcHRpb25hbF9zdHJp", 
+            "bmcYDiABKAkSFgoOb3B0aW9uYWxfYnl0ZXMYDyABKAwSRAoNb3B0aW9uYWxn", 
+            "cm91cBgQIAEoCjItLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5P", 
+            "cHRpb25hbEdyb3VwEk4KF29wdGlvbmFsX25lc3RlZF9tZXNzYWdlGBIgASgL", 
+            "Mi0ucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3Nh", 
+            "Z2USQwoYb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlGBMgASgLMiEucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2USSAoXb3B0aW9uYWxfaW1wb3J0", 
+            "X21lc3NhZ2UYFCABKAsyJy5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1w", 
+            "b3J0TWVzc2FnZRJIChRvcHRpb25hbF9uZXN0ZWRfZW51bRgVIAEoDjIqLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtEj0KFW9w", 
+            "dGlvbmFsX2ZvcmVpZ25fZW51bRgWIAEoDjIeLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LkZvcmVpZ25FbnVtEkIKFG9wdGlvbmFsX2ltcG9ydF9lbnVtGBcgASgOMiQu", 
+            "cHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0SIQoVb3B0aW9u", 
+            "YWxfc3RyaW5nX3BpZWNlGBggASgJQgIIAhIZCg1vcHRpb25hbF9jb3JkGBkg", 
+            "ASgJQgIIARJVCh5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UYGiAB", 
+            "KAsyLS5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVz", 
+            "c2FnZRJQChVvcHRpb25hbF9sYXp5X21lc3NhZ2UYGyABKAsyLS5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZUICKAESFgoO", 
+            "cmVwZWF0ZWRfaW50MzIYHyADKAUSFgoOcmVwZWF0ZWRfaW50NjQYICADKAMS", 
+            "FwoPcmVwZWF0ZWRfdWludDMyGCEgAygNEhcKD3JlcGVhdGVkX3VpbnQ2NBgi", 
+            "IAMoBBIXCg9yZXBlYXRlZF9zaW50MzIYIyADKBESFwoPcmVwZWF0ZWRfc2lu", 
+            "dDY0GCQgAygSEhgKEHJlcGVhdGVkX2ZpeGVkMzIYJSADKAcSGAoQcmVwZWF0", 
+            "ZWRfZml4ZWQ2NBgmIAMoBhIZChFyZXBlYXRlZF9zZml4ZWQzMhgnIAMoDxIZ", 
+            "ChFyZXBlYXRlZF9zZml4ZWQ2NBgoIAMoEBIWCg5yZXBlYXRlZF9mbG9hdBgp", 
+            "IAMoAhIXCg9yZXBlYXRlZF9kb3VibGUYKiADKAESFQoNcmVwZWF0ZWRfYm9v", 
+            "bBgrIAMoCBIXCg9yZXBlYXRlZF9zdHJpbmcYLCADKAkSFgoOcmVwZWF0ZWRf", 
+            "Ynl0ZXMYLSADKAwSRAoNcmVwZWF0ZWRncm91cBguIAMoCjItLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwEk4KF3JlcGVh", 
+            "dGVkX25lc3RlZF9tZXNzYWdlGDAgAygLMi0ucHJvdG9idWZfdW5pdHRlc3Qu", 
+            "VGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2USQwoYcmVwZWF0ZWRfZm9yZWln", 
+            "bl9tZXNzYWdlGDEgAygLMiEucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1l", 
+            "c3NhZ2USSAoXcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UYMiADKAsyJy5wcm90", 
+            "b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZRJIChRyZXBlYXRl", 
+            "ZF9uZXN0ZWRfZW51bRgzIAMoDjIqLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RB", 
+            "bGxUeXBlcy5OZXN0ZWRFbnVtEj0KFXJlcGVhdGVkX2ZvcmVpZ25fZW51bRg0", 
+            "IAMoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtEkIKFHJlcGVh", 
+            "dGVkX2ltcG9ydF9lbnVtGDUgAygOMiQucHJvdG9idWZfdW5pdHRlc3RfaW1w", 
+            "b3J0LkltcG9ydEVudW0SIQoVcmVwZWF0ZWRfc3RyaW5nX3BpZWNlGDYgAygJ", 
+            "QgIIAhIZCg1yZXBlYXRlZF9jb3JkGDcgAygJQgIIARJQChVyZXBlYXRlZF9s", 
+            "YXp5X21lc3NhZ2UYOSADKAsyLS5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxs", 
+            "VHlwZXMuTmVzdGVkTWVzc2FnZUICKAESGQoNZGVmYXVsdF9pbnQzMhg9IAEo", 
+            "BToCNDESGQoNZGVmYXVsdF9pbnQ2NBg+IAEoAzoCNDISGgoOZGVmYXVsdF91", 
+            "aW50MzIYPyABKA06AjQzEhoKDmRlZmF1bHRfdWludDY0GEAgASgEOgI0NBIb", 
+            "Cg5kZWZhdWx0X3NpbnQzMhhBIAEoEToDLTQ1EhoKDmRlZmF1bHRfc2ludDY0", 
+            "GEIgASgSOgI0NhIbCg9kZWZhdWx0X2ZpeGVkMzIYQyABKAc6AjQ3EhsKD2Rl", 
+            "ZmF1bHRfZml4ZWQ2NBhEIAEoBjoCNDgSHAoQZGVmYXVsdF9zZml4ZWQzMhhF", 
+            "IAEoDzoCNDkSHQoQZGVmYXVsdF9zZml4ZWQ2NBhGIAEoEDoDLTUwEhsKDWRl", 
+            "ZmF1bHRfZmxvYXQYRyABKAI6BDUxLjUSHQoOZGVmYXVsdF9kb3VibGUYSCAB", 
+            "KAE6BTUyMDAwEhoKDGRlZmF1bHRfYm9vbBhJIAEoCDoEdHJ1ZRIdCg5kZWZh", 
+            "dWx0X3N0cmluZxhKIAEoCToFaGVsbG8SHAoNZGVmYXVsdF9ieXRlcxhLIAEo", 
+            "DDoFd29ybGQSTAoTZGVmYXVsdF9uZXN0ZWRfZW51bRhRIAEoDjIqLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtOgNCQVISSQoU", 
+            "ZGVmYXVsdF9mb3JlaWduX2VudW0YUiABKA4yHi5wcm90b2J1Zl91bml0dGVz", 
+            "dC5Gb3JlaWduRW51bToLRk9SRUlHTl9CQVISTQoTZGVmYXVsdF9pbXBvcnRf", 
+            "ZW51bRhTIAEoDjIkLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRF", 
+            "bnVtOgpJTVBPUlRfQkFSEiUKFGRlZmF1bHRfc3RyaW5nX3BpZWNlGFQgASgJ", 
+            "OgNhYmNCAggCEh0KDGRlZmF1bHRfY29yZBhVIAEoCToDMTIzQgIIARIWCgxv", 
+            "bmVvZl91aW50MzIYbyABKA1IABJNChRvbmVvZl9uZXN0ZWRfbWVzc2FnZRhw", 
+            "IAEoCzItLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRN", 
+            "ZXNzYWdlSAASFgoMb25lb2Zfc3RyaW5nGHEgASgJSAASFQoLb25lb2ZfYnl0", 
+            "ZXMYciABKAxIABobCg1OZXN0ZWRNZXNzYWdlEgoKAmJiGAEgASgFGhoKDU9w", 
+            "dGlvbmFsR3JvdXASCQoBYRgRIAEoBRoaCg1SZXBlYXRlZEdyb3VwEgkKAWEY", 
+            "LyABKAUiOQoKTmVzdGVkRW51bRIHCgNGT08QARIHCgNCQVIQAhIHCgNCQVoQ", 
+            "AxIQCgNORUcQ////////////AUINCgtvbmVvZl9maWVsZCJ8ChJOZXN0ZWRU", 
+            "ZXN0QWxsVHlwZXMSNAoFY2hpbGQYASABKAsyJS5wcm90b2J1Zl91bml0dGVz", 
+            "dC5OZXN0ZWRUZXN0QWxsVHlwZXMSMAoHcGF5bG9hZBgCIAEoCzIfLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyI0ChRUZXN0RGVwcmVjYXRlZEZp", 
+            "ZWxkcxIcChBkZXByZWNhdGVkX2ludDMyGAEgASgFQgIYASIbCg5Gb3JlaWdu", 
+            "TWVzc2FnZRIJCgFjGAEgASgFIh0KEVRlc3RBbGxFeHRlbnNpb25zKggIARCA", 
+            "gICAAiIkChdPcHRpb25hbEdyb3VwX2V4dGVuc2lvbhIJCgFhGBEgASgFIiQK", 
+            "F1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uEgkKAWEYLyABKAUimAEKE1Rlc3RO", 
+            "ZXN0ZWRFeHRlbnNpb24yOQoEdGVzdBIkLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxFeHRlbnNpb25zGOoHIAEoCToEdGVzdDJGChduZXN0ZWRfc3RyaW5n", 
+            "X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNp", 
+            "b25zGOsHIAEoCSLVBQoMVGVzdFJlcXVpcmVkEgkKAWEYASACKAUSDgoGZHVt", 
+            "bXkyGAIgASgFEgkKAWIYAyACKAUSDgoGZHVtbXk0GAQgASgFEg4KBmR1bW15", 
+            "NRgFIAEoBRIOCgZkdW1teTYYBiABKAUSDgoGZHVtbXk3GAcgASgFEg4KBmR1", 
+            "bW15OBgIIAEoBRIOCgZkdW1teTkYCSABKAUSDwoHZHVtbXkxMBgKIAEoBRIP", 
+            "CgdkdW1teTExGAsgASgFEg8KB2R1bW15MTIYDCABKAUSDwoHZHVtbXkxMxgN", 
+            "IAEoBRIPCgdkdW1teTE0GA4gASgFEg8KB2R1bW15MTUYDyABKAUSDwoHZHVt", 
+            "bXkxNhgQIAEoBRIPCgdkdW1teTE3GBEgASgFEg8KB2R1bW15MTgYEiABKAUS", 
+            "DwoHZHVtbXkxORgTIAEoBRIPCgdkdW1teTIwGBQgASgFEg8KB2R1bW15MjEY", 
+            "FSABKAUSDwoHZHVtbXkyMhgWIAEoBRIPCgdkdW1teTIzGBcgASgFEg8KB2R1", 
+            "bW15MjQYGCABKAUSDwoHZHVtbXkyNRgZIAEoBRIPCgdkdW1teTI2GBogASgF", 
+            "Eg8KB2R1bW15MjcYGyABKAUSDwoHZHVtbXkyOBgcIAEoBRIPCgdkdW1teTI5", 
+            "GB0gASgFEg8KB2R1bW15MzAYHiABKAUSDwoHZHVtbXkzMRgfIAEoBRIPCgdk", 
+            "dW1teTMyGCAgASgFEgkKAWMYISACKAUyVgoGc2luZ2xlEiQucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMY6AcgASgLMh8ucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdFJlcXVpcmVkMlUKBW11bHRpEiQucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMY6QcgAygLMh8ucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdFJlcXVpcmVkIpoBChNUZXN0UmVxdWlyZWRGb3JlaWduEjkK", 
+            "EG9wdGlvbmFsX21lc3NhZ2UYASABKAsyHy5wcm90b2J1Zl91bml0dGVzdC5U", 
+            "ZXN0UmVxdWlyZWQSOQoQcmVwZWF0ZWRfbWVzc2FnZRgCIAMoCzIfLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZBINCgVkdW1teRgDIAEoBSJaChFU", 
+            "ZXN0Rm9yZWlnbk5lc3RlZBJFCg5mb3JlaWduX25lc3RlZBgBIAEoCzItLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIhIK", 
+            "EFRlc3RFbXB0eU1lc3NhZ2UiKgoeVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRl", 
+            "bnNpb25zKggIARCAgICAAiI3ChtUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5n", 
+            "ZXMqBAgqECsqBgivIBCUISoKCICABBCAgICAAiI0ChhUZXN0UmVhbGx5TGFy", 
+            "Z2VUYWdOdW1iZXISCQoBYRgBIAEoBRINCgJiYhj///9/IAEoBSJVChRUZXN0", 
+            "UmVjdXJzaXZlTWVzc2FnZRIyCgFhGAEgASgLMicucHJvdG9idWZfdW5pdHRl", 
+            "c3QuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2USCQoBaRgCIAEoBSJLChRUZXN0TXV0", 
+            "dWFsUmVjdXJzaW9uQRIzCgJiYhgBIAEoCzInLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3RNdXR1YWxSZWN1cnNpb25CImIKFFRlc3RNdXR1YWxSZWN1cnNpb25C", 
+            "EjIKAWEYASABKAsyJy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TXV0dWFsUmVj", 
+            "dXJzaW9uQRIWCg5vcHRpb25hbF9pbnQzMhgCIAEoBSKzAQoSVGVzdER1cEZp", 
+            "ZWxkTnVtYmVyEgkKAWEYASABKAUSNgoDZm9vGAIgASgKMikucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdER1cEZpZWxkTnVtYmVyLkZvbxI2CgNiYXIYAyABKAoy", 
+            "KS5wcm90b2J1Zl91bml0dGVzdC5UZXN0RHVwRmllbGROdW1iZXIuQmFyGhAK", 
+            "A0ZvbxIJCgFhGAEgASgFGhAKA0JhchIJCgFhGAEgASgFIkwKEFRlc3RFYWdl", 
+            "ck1lc3NhZ2USOAoLc3ViX21lc3NhZ2UYASABKAsyHy5wcm90b2J1Zl91bml0", 
+            "dGVzdC5UZXN0QWxsVHlwZXNCAigAIksKD1Rlc3RMYXp5TWVzc2FnZRI4Cgtz", 
+            "dWJfbWVzc2FnZRgBIAEoCzIfLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxU", 
+            "eXBlc0ICKAEigAIKGFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cxJaChdvcHRp", 
+            "b25hbF9uZXN0ZWRfbWVzc2FnZRgBIAEoCzI5LnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5OZXN0ZWRNZXNzYWdlGocBCg1O", 
+            "ZXN0ZWRNZXNzYWdlEiQKHG5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfaW50MzIY", 
+            "ASADKAUSUAolbmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9mb3JlaWdubWVzc2Fn", 
+            "ZRgCIAMoCzIhLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25NZXNzYWdlIuUD", 
+            "ChdUZXN0Q2FtZWxDYXNlRmllbGROYW1lcxIWCg5QcmltaXRpdmVGaWVsZBgB", 
+            "IAEoBRITCgtTdHJpbmdGaWVsZBgCIAEoCRIxCglFbnVtRmllbGQYAyABKA4y", 
+            "Hi5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bRI3CgxNZXNzYWdlRmll", 
+            "bGQYBCABKAsyIS5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZRIc", 
+            "ChBTdHJpbmdQaWVjZUZpZWxkGAUgASgJQgIIAhIVCglDb3JkRmllbGQYBiAB", 
+            "KAlCAggBEh4KFlJlcGVhdGVkUHJpbWl0aXZlRmllbGQYByADKAUSGwoTUmVw", 
+            "ZWF0ZWRTdHJpbmdGaWVsZBgIIAMoCRI5ChFSZXBlYXRlZEVudW1GaWVsZBgJ", 
+            "IAMoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtEj8KFFJlcGVh", 
+            "dGVkTWVzc2FnZUZpZWxkGAogAygLMiEucHJvdG9idWZfdW5pdHRlc3QuRm9y", 
+            "ZWlnbk1lc3NhZ2USJAoYUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkGAsgAygJ", 
+            "QgIIAhIdChFSZXBlYXRlZENvcmRGaWVsZBgMIAMoCUICCAEi1QEKElRlc3RG", 
+            "aWVsZE9yZGVyaW5ncxIRCglteV9zdHJpbmcYCyABKAkSDgoGbXlfaW50GAEg", 
+            "ASgDEhAKCG15X2Zsb2F0GGUgASgCElUKF29wdGlvbmFsX25lc3RlZF9tZXNz", 
+            "YWdlGMgBIAEoCzIzLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RGaWVsZE9yZGVy", 
+            "aW5ncy5OZXN0ZWRNZXNzYWdlGicKDU5lc3RlZE1lc3NhZ2USCgoCb28YAiAB", 
+            "KAMSCgoCYmIYASABKAUqBAgCEAsqBAgMEGUitgcKGFRlc3RFeHRyZW1lRGVm", 
+            "YXVsdFZhbHVlcxI/Cg1lc2NhcGVkX2J5dGVzGAEgASgMOihcMDAwXDAwMVww", 
+            "MDdcMDEwXDAxNFxuXHJcdFwwMTNcXFwnXCJcMzc2EiAKDGxhcmdlX3VpbnQz", 
+            "MhgCIAEoDToKNDI5NDk2NzI5NRIqCgxsYXJnZV91aW50NjQYAyABKAQ6FDE4", 
+            "NDQ2NzQ0MDczNzA5NTUxNjE1EiAKC3NtYWxsX2ludDMyGAQgASgFOgstMjE0", 
+            "NzQ4MzY0NxIpCgtzbWFsbF9pbnQ2NBgFIAEoAzoULTkyMjMzNzIwMzY4NTQ3", 
+            "NzU4MDcSJwoScmVhbGx5X3NtYWxsX2ludDMyGBUgASgFOgstMjE0NzQ4MzY0", 
+            "OBIwChJyZWFsbHlfc21hbGxfaW50NjQYFiABKAM6FC05MjIzMzcyMDM2ODU0", 
+            "Nzc1ODA4EhgKC3V0Zjhfc3RyaW5nGAYgASgJOgPhiLQSFQoKemVyb19mbG9h", 
+            "dBgHIAEoAjoBMBIUCglvbmVfZmxvYXQYCCABKAI6ATESGAoLc21hbGxfZmxv", 
+            "YXQYCSABKAI6AzEuNRIeChJuZWdhdGl2ZV9vbmVfZmxvYXQYCiABKAI6Ai0x", 
+            "EhwKDm5lZ2F0aXZlX2Zsb2F0GAsgASgCOgQtMS41EhoKC2xhcmdlX2Zsb2F0", 
+            "GAwgASgCOgUyZSswOBIkChRzbWFsbF9uZWdhdGl2ZV9mbG9hdBgNIAEoAjoG", 
+            "LThlLTI4EhcKCmluZl9kb3VibGUYDiABKAE6A2luZhIcCg5uZWdfaW5mX2Rv", 
+            "dWJsZRgPIAEoAToELWluZhIXCgpuYW5fZG91YmxlGBAgASgBOgNuYW4SFgoJ", 
+            "aW5mX2Zsb2F0GBEgASgCOgNpbmYSGwoNbmVnX2luZl9mbG9hdBgSIAEoAjoE", 
+            "LWluZhIWCgluYW5fZmxvYXQYEyABKAI6A25hbhIrCgxjcHBfdHJpZ3JhcGgY", 
+            "FCABKAk6FT8gPyA/PyA/PyA/Pz8gPz8vID8/LRIgChBzdHJpbmdfd2l0aF96", 
+            "ZXJvGBcgASgJOgZoZWwAbG8SIgoPYnl0ZXNfd2l0aF96ZXJvGBggASgMOgl3", 
+            "b3JcMDAwbGQSKAoWc3RyaW5nX3BpZWNlX3dpdGhfemVybxgZIAEoCToEYWIA", 
+            "Y0ICCAISIAoOY29yZF93aXRoX3plcm8YGiABKAk6BDEyADNCAggBEiYKEnJl", 
+            "cGxhY2VtZW50X3N0cmluZxgbIAEoCToKJHt1bmtub3dufSJLChFTcGFyc2VF", 
+            "bnVtTWVzc2FnZRI2CgtzcGFyc2VfZW51bRgBIAEoDjIhLnByb3RvYnVmX3Vu", 
+            "aXR0ZXN0LlRlc3RTcGFyc2VFbnVtIhkKCU9uZVN0cmluZxIMCgRkYXRhGAEg", 
+            "ASgJIhoKCk1vcmVTdHJpbmcSDAoEZGF0YRgBIAMoCSIYCghPbmVCeXRlcxIM", 
+            "CgRkYXRhGAEgASgMIhkKCU1vcmVCeXRlcxIMCgRkYXRhGAEgAygMIhwKDElu", 
+            "dDMyTWVzc2FnZRIMCgRkYXRhGAEgASgFIh0KDVVpbnQzMk1lc3NhZ2USDAoE", 
+            "ZGF0YRgBIAEoDSIcCgxJbnQ2NE1lc3NhZ2USDAoEZGF0YRgBIAEoAyIdCg1V", 
+            "aW50NjRNZXNzYWdlEgwKBGRhdGEYASABKAQiGwoLQm9vbE1lc3NhZ2USDAoE", 
+            "ZGF0YRgBIAEoCCLQAQoJVGVzdE9uZW9mEhEKB2Zvb19pbnQYASABKAVIABIU", 
+            "Cgpmb29fc3RyaW5nGAIgASgJSAASNgoLZm9vX21lc3NhZ2UYAyABKAsyHy5w", 
+            "cm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNIABI5Cghmb29ncm91cBgE", 
+            "IAEoCjIlLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RPbmVvZi5Gb29Hcm91cEgA", 
+            "GiAKCEZvb0dyb3VwEgkKAWEYBSABKAUSCQoBYhgGIAEoCUIFCgNmb28i5wEK", 
+            "HFRlc3RPbmVvZkJhY2t3YXJkc0NvbXBhdGlibGUSDwoHZm9vX2ludBgBIAEo", 
+            "BRISCgpmb29fc3RyaW5nGAIgASgJEjQKC2Zvb19tZXNzYWdlGAMgASgLMh8u", 
+            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzEkoKCGZvb2dyb3VwGAQg", 
+            "ASgKMjgucHJvdG9idWZfdW5pdHRlc3QuVGVzdE9uZW9mQmFja3dhcmRzQ29t", 
+            "cGF0aWJsZS5Gb29Hcm91cBogCghGb29Hcm91cBIJCgFhGAUgASgFEgkKAWIY", 
+            "BiABKAkingYKClRlc3RPbmVvZjISEQoHZm9vX2ludBgBIAEoBUgAEhQKCmZv", 
+            "b19zdHJpbmcYAiABKAlIABIWCghmb29fY29yZBgDIAEoCUICCAFIABIeChBm", 
+            "b29fc3RyaW5nX3BpZWNlGAQgASgJQgIIAkgAEhMKCWZvb19ieXRlcxgFIAEo", 
+            "DEgAEjwKCGZvb19lbnVtGAYgASgOMigucHJvdG9idWZfdW5pdHRlc3QuVGVz", 
+            "dE9uZW9mMi5OZXN0ZWRFbnVtSAASQgoLZm9vX21lc3NhZ2UYByABKAsyKy5w", 
+            "cm90b2J1Zl91bml0dGVzdC5UZXN0T25lb2YyLk5lc3RlZE1lc3NhZ2VIABI6", 
+            "Cghmb29ncm91cBgIIAEoCjImLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RPbmVv", 
+            "ZjIuRm9vR3JvdXBIABJLChBmb29fbGF6eV9tZXNzYWdlGAsgASgLMisucHJv", 
+            "dG9idWZfdW5pdHRlc3QuVGVzdE9uZW9mMi5OZXN0ZWRNZXNzYWdlQgIoAUgA", 
+            "EhQKB2Jhcl9pbnQYDCABKAU6ATVIARIcCgpiYXJfc3RyaW5nGA0gASgJOgZT", 
+            "VFJJTkdIARIcCghiYXJfY29yZBgOIAEoCToEQ09SREICCAFIARImChBiYXJf", 
+            "c3RyaW5nX3BpZWNlGA8gASgJOgZTUElFQ0VCAggCSAESGgoJYmFyX2J5dGVz", 
+            "GBAgASgMOgVCWVRFU0gBEkEKCGJhcl9lbnVtGBEgASgOMigucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdE9uZW9mMi5OZXN0ZWRFbnVtOgNCQVJIARIPCgdiYXpf", 
+            "aW50GBIgASgFEhcKCmJhel9zdHJpbmcYEyABKAk6A0JBWhogCghGb29Hcm91", 
+            "cBIJCgFhGAkgASgFEgkKAWIYCiABKAkaMwoNTmVzdGVkTWVzc2FnZRIPCgdx", 
+            "dXhfaW50GAEgASgDEhEKCWNvcmdlX2ludBgCIAMoBSInCgpOZXN0ZWRFbnVt", 
+            "EgcKA0ZPTxABEgcKA0JBUhACEgcKA0JBWhADQgUKA2Zvb0IFCgNiYXIiuAEK", 
+            "EVRlc3RSZXF1aXJlZE9uZW9mEhEKB2Zvb19pbnQYASABKAVIABIUCgpmb29f", 
+            "c3RyaW5nGAIgASgJSAASSQoLZm9vX21lc3NhZ2UYAyABKAsyMi5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0UmVxdWlyZWRPbmVvZi5OZXN0ZWRNZXNzYWdlSAAa", 
+            "KAoNTmVzdGVkTWVzc2FnZRIXCg9yZXF1aXJlZF9kb3VibGUYASACKAFCBQoD", 
+            "Zm9vIqoDCg9UZXN0UGFja2VkVHlwZXMSGAoMcGFja2VkX2ludDMyGFogAygF", 
+            "QgIQARIYCgxwYWNrZWRfaW50NjQYWyADKANCAhABEhkKDXBhY2tlZF91aW50", 
+            "MzIYXCADKA1CAhABEhkKDXBhY2tlZF91aW50NjQYXSADKARCAhABEhkKDXBh", 
+            "Y2tlZF9zaW50MzIYXiADKBFCAhABEhkKDXBhY2tlZF9zaW50NjQYXyADKBJC", 
+            "AhABEhoKDnBhY2tlZF9maXhlZDMyGGAgAygHQgIQARIaCg5wYWNrZWRfZml4", 
+            "ZWQ2NBhhIAMoBkICEAESGwoPcGFja2VkX3NmaXhlZDMyGGIgAygPQgIQARIb", 
+            "Cg9wYWNrZWRfc2ZpeGVkNjQYYyADKBBCAhABEhgKDHBhY2tlZF9mbG9hdBhk", 
+            "IAMoAkICEAESGQoNcGFja2VkX2RvdWJsZRhlIAMoAUICEAESFwoLcGFja2Vk", 
+            "X2Jvb2wYZiADKAhCAhABEjcKC3BhY2tlZF9lbnVtGGcgAygOMh4ucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuRm9yZWlnbkVudW1CAhABIsgDChFUZXN0VW5wYWNrZWRU", 
+            "eXBlcxIaCg51bnBhY2tlZF9pbnQzMhhaIAMoBUICEAASGgoOdW5wYWNrZWRf", 
+            "aW50NjQYWyADKANCAhAAEhsKD3VucGFja2VkX3VpbnQzMhhcIAMoDUICEAAS", 
+            "GwoPdW5wYWNrZWRfdWludDY0GF0gAygEQgIQABIbCg91bnBhY2tlZF9zaW50", 
+            "MzIYXiADKBFCAhAAEhsKD3VucGFja2VkX3NpbnQ2NBhfIAMoEkICEAASHAoQ", 
+            "dW5wYWNrZWRfZml4ZWQzMhhgIAMoB0ICEAASHAoQdW5wYWNrZWRfZml4ZWQ2", 
+            "NBhhIAMoBkICEAASHQoRdW5wYWNrZWRfc2ZpeGVkMzIYYiADKA9CAhAAEh0K", 
+            "EXVucGFja2VkX3NmaXhlZDY0GGMgAygQQgIQABIaCg51bnBhY2tlZF9mbG9h", 
+            "dBhkIAMoAkICEAASGwoPdW5wYWNrZWRfZG91YmxlGGUgAygBQgIQABIZCg11", 
+            "bnBhY2tlZF9ib29sGGYgAygIQgIQABI5Cg11bnBhY2tlZF9lbnVtGGcgAygO", 
+            "Mh4ucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW1CAhAAIiAKFFRlc3RQ", 
+            "YWNrZWRFeHRlbnNpb25zKggIARCAgICAAiIiChZUZXN0VW5wYWNrZWRFeHRl", 
+            "bnNpb25zKggIARCAgICAAiKZBAoVVGVzdER5bmFtaWNFeHRlbnNpb25zEhkK", 
+            "EHNjYWxhcl9leHRlbnNpb24Y0A8gASgHEjcKDmVudW1fZXh0ZW5zaW9uGNEP", 
+            "IAEoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtElkKFmR5bmFt", 
+            "aWNfZW51bV9leHRlbnNpb24Y0g8gASgOMjgucHJvdG9idWZfdW5pdHRlc3Qu", 
+            "VGVzdER5bmFtaWNFeHRlbnNpb25zLkR5bmFtaWNFbnVtVHlwZRI9ChFtZXNz", 
+            "YWdlX2V4dGVuc2lvbhjTDyABKAsyIS5wcm90b2J1Zl91bml0dGVzdC5Gb3Jl", 
+            "aWduTWVzc2FnZRJfChlkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uGNQPIAEo", 
+            "CzI7LnByb3RvYnVmX3VuaXR0ZXN0LlRlc3REeW5hbWljRXh0ZW5zaW9ucy5E", 
+            "eW5hbWljTWVzc2FnZVR5cGUSGwoScmVwZWF0ZWRfZXh0ZW5zaW9uGNUPIAMo", 
+            "CRIdChBwYWNrZWRfZXh0ZW5zaW9uGNYPIAMoEUICEAEaLAoSRHluYW1pY01l", 
+            "c3NhZ2VUeXBlEhYKDWR5bmFtaWNfZmllbGQYtBAgASgFIkcKD0R5bmFtaWNF", 
+            "bnVtVHlwZRIQCgtEWU5BTUlDX0ZPTxCYERIQCgtEWU5BTUlDX0JBUhCZERIQ", 
+            "CgtEWU5BTUlDX0JBWhCaESLAAQojVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVy", 
+            "ZW50VGFnU2l6ZXMSGAoQcmVwZWF0ZWRfZml4ZWQzMhgMIAMoBxIWCg5yZXBl", 
+            "YXRlZF9pbnQzMhgNIAMoBRIZChByZXBlYXRlZF9maXhlZDY0GP4PIAMoBhIX", 
+            "Cg5yZXBlYXRlZF9pbnQ2NBj/DyADKAMSGAoOcmVwZWF0ZWRfZmxvYXQY/v8P", 
+            "IAMoAhIZCg9yZXBlYXRlZF91aW50NjQY//8PIAMoBCL3CQoQVGVzdFBhcnNp", 
+            "bmdNZXJnZRI7ChJyZXF1aXJlZF9hbGxfdHlwZXMYASACKAsyHy5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMSOwoSb3B0aW9uYWxfYWxsX3R5cGVz", 
+            "GAIgASgLMh8ucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzEjsKEnJl", 
+            "cGVhdGVkX2FsbF90eXBlcxgDIAMoCzIfLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxUeXBlcxJICg1vcHRpb25hbGdyb3VwGAogASgKMjEucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdFBhcnNpbmdNZXJnZS5PcHRpb25hbEdyb3VwEkgKDXJl", 
+            "cGVhdGVkZ3JvdXAYFCADKAoyMS5wcm90b2J1Zl91bml0dGVzdC5UZXN0UGFy", 
+            "c2luZ01lcmdlLlJlcGVhdGVkR3JvdXAaqgQKF1JlcGVhdGVkRmllbGRzR2Vu", 
+            "ZXJhdG9yEi8KBmZpZWxkMRgBIAMoCzIfLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxUeXBlcxIvCgZmaWVsZDIYAiADKAsyHy5wcm90b2J1Zl91bml0dGVz", 
+            "dC5UZXN0QWxsVHlwZXMSLwoGZmllbGQzGAMgAygLMh8ucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdEFsbFR5cGVzElIKBmdyb3VwMRgKIAMoCjJCLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5l", 
+            "cmF0b3IuR3JvdXAxElIKBmdyb3VwMhgUIAMoCjJCLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3Iu", 
+            "R3JvdXAyEi4KBGV4dDEY6AcgAygLMh8ucHJvdG9idWZfdW5pdHRlc3QuVGVz", 
+            "dEFsbFR5cGVzEi4KBGV4dDIY6QcgAygLMh8ucHJvdG9idWZfdW5pdHRlc3Qu", 
+            "VGVzdEFsbFR5cGVzGjkKBkdyb3VwMRIvCgZmaWVsZDEYCyABKAsyHy5wcm90", 
+            "b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMaOQoGR3JvdXAyEi8KBmZpZWxk", 
+            "MRgVIAEoCzIfLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcxpSCg1P", 
+            "cHRpb25hbEdyb3VwEkEKGG9wdGlvbmFsX2dyb3VwX2FsbF90eXBlcxgLIAEo", 
+            "CzIfLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcxpSCg1SZXBlYXRl", 
+            "ZEdyb3VwEkEKGHJlcGVhdGVkX2dyb3VwX2FsbF90eXBlcxgVIAEoCzIfLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyoJCOgHEICAgIACMlsKDG9w", 
+            "dGlvbmFsX2V4dBIjLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYXJzaW5nTWVy", 
+            "Z2UY6AcgASgLMh8ucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzMlsK", 
+            "DHJlcGVhdGVkX2V4dBIjLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYXJzaW5n", 
+            "TWVyZ2UY6QcgAygLMh8ucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVz", 
+            "IkQKG1Rlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZRIlCgFhGAEgASgJOhoq", 
+            "LyA8LSBOZWl0aGVyIHNob3VsZCB0aGlzLiIMCgpGb29SZXF1ZXN0Ig0KC0Zv", 
+            "b1Jlc3BvbnNlIhIKEEZvb0NsaWVudE1lc3NhZ2UiEgoQRm9vU2VydmVyTWVz", 
+            "c2FnZSIMCgpCYXJSZXF1ZXN0Ig0KC0JhclJlc3BvbnNlKkAKC0ZvcmVpZ25F", 
+            "bnVtEg8KC0ZPUkVJR05fRk9PEAQSDwoLRk9SRUlHTl9CQVIQBRIPCgtGT1JF", 
+            "SUdOX0JBWhAGKksKFFRlc3RFbnVtV2l0aER1cFZhbHVlEggKBEZPTzEQARII", 
+            "CgRCQVIxEAISBwoDQkFaEAMSCAoERk9PMhABEggKBEJBUjIQAhoCEAEqiQEK", 
+            "DlRlc3RTcGFyc2VFbnVtEgwKCFNQQVJTRV9BEHsSDgoIU1BBUlNFX0IQpucD", 
+            "Eg8KCFNQQVJTRV9DELKxgAYSFQoIU1BBUlNFX0QQ8f//////////ARIVCghT", 
+            "UEFSU0VfRRC03vz///////8BEgwKCFNQQVJTRV9GEAASDAoIU1BBUlNFX0cQ", 
+            "AjKZAQoLVGVzdFNlcnZpY2USRAoDRm9vEh0ucHJvdG9idWZfdW5pdHRlc3Qu", 
+            "Rm9vUmVxdWVzdBoeLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1Jlc3BvbnNlEkQK", 
+            "A0JhchIdLnByb3RvYnVmX3VuaXR0ZXN0LkJhclJlcXVlc3QaHi5wcm90b2J1", 
+            "Zl91bml0dGVzdC5CYXJSZXNwb25zZTpGChhvcHRpb25hbF9pbnQzMl9leHRl", 
+            "bnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgB", 
+            "IAEoBTpGChhvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24SJC5wcm90b2J1Zl91", 
+            "bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgCIAEoAzpHChlvcHRpb25hbF91", 
+            "aW50MzJfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4", 
+            "dGVuc2lvbnMYAyABKA06RwoZb3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbhIk", 
+            "LnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGAQgASgEOkcK", 
+            "GW9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVz", 
+            "dC5UZXN0QWxsRXh0ZW5zaW9ucxgFIAEoETpHChlvcHRpb25hbF9zaW50NjRf", 
+            "ZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lv", 
+            "bnMYBiABKBI6SAoab3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24SJC5wcm90", 
+            "b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgHIAEoBzpIChpvcHRp", 
+            "b25hbF9maXhlZDY0X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxFeHRlbnNpb25zGAggASgGOkkKG29wdGlvbmFsX3NmaXhlZDMyX2V4", 
+            "dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25z", 
+            "GAkgASgPOkkKG29wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbhIkLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGAogASgQOkYKGG9wdGlv", 
+            "bmFsX2Zsb2F0X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RB", 
+            "bGxFeHRlbnNpb25zGAsgASgCOkcKGW9wdGlvbmFsX2RvdWJsZV9leHRlbnNp", 
+            "b24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgMIAEo", 
+            "ATpFChdvcHRpb25hbF9ib29sX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RBbGxFeHRlbnNpb25zGA0gASgIOkcKGW9wdGlvbmFsX3N0cmlu", 
+            "Z19leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5z", 
+            "aW9ucxgOIAEoCTpGChhvcHRpb25hbF9ieXRlc19leHRlbnNpb24SJC5wcm90", 
+            "b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgPIAEoDDpxChdvcHRp", 
+            "b25hbGdyb3VwX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RB", 
+            "bGxFeHRlbnNpb25zGBAgASgKMioucHJvdG9idWZfdW5pdHRlc3QuT3B0aW9u", 
+            "YWxHcm91cF9leHRlbnNpb246fgohb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Vf", 
+            "ZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lv", 
+            "bnMYEiABKAsyLS5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVz", 
+            "dGVkTWVzc2FnZTpzCiJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5z", 
+            "aW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYEyAB", 
+            "KAsyIS5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZTp4CiFvcHRp", 
+            "b25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0", 
+            "dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgUIAEoCzInLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlOngKHm9wdGlvbmFsX25lc3RlZF9l", 
+            "bnVtX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRl", 
+            "bnNpb25zGBUgASgOMioucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVz", 
+            "Lk5lc3RlZEVudW06bQofb3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lv", 
+            "bhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGBYgASgO", 
+            "Mh4ucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW06cgoeb3B0aW9uYWxf", 
+            "aW1wb3J0X2VudW1fZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVz", 
+            "dEFsbEV4dGVuc2lvbnMYFyABKA4yJC5wcm90b2J1Zl91bml0dGVzdF9pbXBv", 
+            "cnQuSW1wb3J0RW51bTpRCh9vcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5z", 
+            "aW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYGCAB", 
+            "KAlCAggCOkkKF29wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uEiQucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYGSABKAlCAggBOoUBCihvcHRp", 
+            "b25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uEiQucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYGiABKAsyLS5wcm90b2J1", 
+            "Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZTqAAQofb3B0", 
+            "aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RBbGxFeHRlbnNpb25zGBsgASgLMi0ucHJvdG9idWZfdW5pdHRl", 
+            "c3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2VCAigBOkYKGHJlcGVhdGVk", 
+            "X2ludDMyX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxF", 
+            "eHRlbnNpb25zGB8gAygFOkYKGHJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbhIk", 
+            "LnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGCAgAygDOkcK", 
+            "GXJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVz", 
+            "dC5UZXN0QWxsRXh0ZW5zaW9ucxghIAMoDTpHChlyZXBlYXRlZF91aW50NjRf", 
+            "ZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lv", 
+            "bnMYIiADKAQ6RwoZcmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbhIkLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGCMgAygROkcKGXJlcGVh", 
+            "dGVkX3NpbnQ2NF9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0", 
+            "QWxsRXh0ZW5zaW9ucxgkIAMoEjpIChpyZXBlYXRlZF9maXhlZDMyX2V4dGVu", 
+            "c2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGCUg", 
+            "AygHOkgKGnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uEiQucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYJiADKAY6SQobcmVwZWF0ZWRf", 
+            "c2ZpeGVkMzJfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFs", 
+            "bEV4dGVuc2lvbnMYJyADKA86SQobcmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5z", 
+            "aW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYKCAD", 
+            "KBA6RgoYcmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYKSADKAI6RwoZcmVwZWF0ZWRfZG91", 
+            "YmxlX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRl", 
+            "bnNpb25zGCogAygBOkUKF3JlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uEiQucHJv", 
+            "dG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYKyADKAg6RwoZcmVw", 
+            "ZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxFeHRlbnNpb25zGCwgAygJOkYKGHJlcGVhdGVkX2J5dGVzX2V4dGVu", 
+            "c2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGC0g", 
+            "AygMOnEKF3JlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYLiADKAoyKi5wcm90b2J1Zl91bml0", 
+            "dGVzdC5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbjp+CiFyZXBlYXRlZF9uZXN0", 
+            "ZWRfbWVzc2FnZV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0", 
+            "QWxsRXh0ZW5zaW9ucxgwIAMoCzItLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RB", 
+            "bGxUeXBlcy5OZXN0ZWRNZXNzYWdlOnMKInJlcGVhdGVkX2ZvcmVpZ25fbWVz", 
+            "c2FnZV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0", 
+            "ZW5zaW9ucxgxIAMoCzIhLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25NZXNz", 
+            "YWdlOngKIXJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbhIkLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGDIgAygLMicucHJv", 
+            "dG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2U6eAoecmVwZWF0", 
+            "ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3Qu", 
+            "VGVzdEFsbEV4dGVuc2lvbnMYMyADKA4yKi5wcm90b2J1Zl91bml0dGVzdC5U", 
+            "ZXN0QWxsVHlwZXMuTmVzdGVkRW51bTptCh9yZXBlYXRlZF9mb3JlaWduX2Vu", 
+            "dW1fZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVu", 
+            "c2lvbnMYNCADKA4yHi5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bTpy", 
+            "Ch5yZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24SJC5wcm90b2J1Zl91", 
+            "bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxg1IAMoDjIkLnByb3RvYnVmX3Vu", 
+            "aXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtOlEKH3JlcGVhdGVkX3N0cmluZ19w", 
+            "aWVjZV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0", 
+            "ZW5zaW9ucxg2IAMoCUICCAI6SQoXcmVwZWF0ZWRfY29yZF9leHRlbnNpb24S", 
+            "JC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxg3IAMoCUIC", 
+            "CAE6gAEKH3JlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24SJC5wcm90", 
+            "b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxg5IAMoCzItLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlQgIoATpJ", 
+            "ChdkZWZhdWx0X2ludDMyX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3RBbGxFeHRlbnNpb25zGD0gASgFOgI0MTpJChdkZWZhdWx0X2ludDY0", 
+            "X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNp", 
+            "b25zGD4gASgDOgI0MjpKChhkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24SJC5w", 
+            "cm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxg/IAEoDToCNDM6", 
+            "SgoYZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRl", 
+            "c3QuVGVzdEFsbEV4dGVuc2lvbnMYQCABKAQ6AjQ0OksKGGRlZmF1bHRfc2lu", 
+            "dDMyX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRl", 
+            "bnNpb25zGEEgASgROgMtNDU6SgoYZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9u", 
+            "EiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYQiABKBI6", 
+            "AjQ2OksKGWRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb24SJC5wcm90b2J1Zl91", 
+            "bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxhDIAEoBzoCNDc6SwoZZGVmYXVs", 
+            "dF9maXhlZDY0X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RB", 
+            "bGxFeHRlbnNpb25zGEQgASgGOgI0ODpMChpkZWZhdWx0X3NmaXhlZDMyX2V4", 
+            "dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25z", 
+            "GEUgASgPOgI0OTpNChpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbhIkLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGEYgASgQOgMtNTA6", 
+            "SwoXZGVmYXVsdF9mbG9hdF9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVz", 
+            "dC5UZXN0QWxsRXh0ZW5zaW9ucxhHIAEoAjoENTEuNTpNChhkZWZhdWx0X2Rv", 
+            "dWJsZV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0", 
+            "ZW5zaW9ucxhIIAEoAToFNTIwMDA6SgoWZGVmYXVsdF9ib29sX2V4dGVuc2lv", 
+            "bhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGEkgASgI", 
+            "OgR0cnVlOk0KGGRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbhIkLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGEogASgJOgVoZWxsbzpMChdk", 
+            "ZWZhdWx0X2J5dGVzX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxFeHRlbnNpb25zGEsgASgMOgV3b3JsZDp8Ch1kZWZhdWx0X25lc3Rl", 
+            "ZF9lbnVtX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxF", 
+            "eHRlbnNpb25zGFEgASgOMioucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5", 
+            "cGVzLk5lc3RlZEVudW06A0JBUjp5Ch5kZWZhdWx0X2ZvcmVpZ25fZW51bV9l", 
+            "eHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9u", 
+            "cxhSIAEoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtOgtGT1JF", 
+            "SUdOX0JBUjp9Ch1kZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbhIkLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGFMgASgOMiQucHJv", 
+            "dG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW06CklNUE9SVF9CQVI6", 
+            "VQoeZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uEiQucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYVCABKAk6A2FiY0ICCAI6TQoW", 
+            "ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxFeHRlbnNpb25zGFUgASgJOgMxMjNCAggBOkQKFm9uZW9mX3VpbnQz", 
+            "Ml9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5z", 
+            "aW9ucxhvIAEoDTp7Ch5vbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24S", 
+            "JC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxhwIAEoCzIt", 
+            "LnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdl", 
+            "OkQKFm9uZW9mX3N0cmluZ19leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVz", 
+            "dC5UZXN0QWxsRXh0ZW5zaW9ucxhxIAEoCTpDChVvbmVvZl9ieXRlc19leHRl", 
+            "bnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxhy", 
+            "IAEoDDpCChNteV9leHRlbnNpb25fc3RyaW5nEiUucHJvdG9idWZfdW5pdHRl", 
+            "c3QuVGVzdEZpZWxkT3JkZXJpbmdzGDIgASgJOj8KEG15X2V4dGVuc2lvbl9p", 
+            "bnQSJS5wcm90b2J1Zl91bml0dGVzdC5UZXN0RmllbGRPcmRlcmluZ3MYBSAB", 
+            "KAU6SwoWcGFja2VkX2ludDMyX2V4dGVuc2lvbhInLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RQYWNrZWRFeHRlbnNpb25zGFogAygFQgIQATpLChZwYWNrZWRf", 
+            "aW50NjRfZXh0ZW5zaW9uEicucHJvdG9idWZfdW5pdHRlc3QuVGVzdFBhY2tl", 
+            "ZEV4dGVuc2lvbnMYWyADKANCAhABOkwKF3BhY2tlZF91aW50MzJfZXh0ZW5z", 
+            "aW9uEicucHJvdG9idWZfdW5pdHRlc3QuVGVzdFBhY2tlZEV4dGVuc2lvbnMY", 
+            "XCADKA1CAhABOkwKF3BhY2tlZF91aW50NjRfZXh0ZW5zaW9uEicucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuVGVzdFBhY2tlZEV4dGVuc2lvbnMYXSADKARCAhABOkwK", 
+            "F3BhY2tlZF9zaW50MzJfZXh0ZW5zaW9uEicucHJvdG9idWZfdW5pdHRlc3Qu", 
+            "VGVzdFBhY2tlZEV4dGVuc2lvbnMYXiADKBFCAhABOkwKF3BhY2tlZF9zaW50", 
+            "NjRfZXh0ZW5zaW9uEicucHJvdG9idWZfdW5pdHRlc3QuVGVzdFBhY2tlZEV4", 
+            "dGVuc2lvbnMYXyADKBJCAhABOk0KGHBhY2tlZF9maXhlZDMyX2V4dGVuc2lv", 
+            "bhInLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYWNrZWRFeHRlbnNpb25zGGAg", 
+            "AygHQgIQATpNChhwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24SJy5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0UGFja2VkRXh0ZW5zaW9ucxhhIAMoBkICEAE6TgoZ", 
+            "cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbhInLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3RQYWNrZWRFeHRlbnNpb25zGGIgAygPQgIQATpOChlwYWNrZWRfc2Zp", 
+            "eGVkNjRfZXh0ZW5zaW9uEicucHJvdG9idWZfdW5pdHRlc3QuVGVzdFBhY2tl", 
+            "ZEV4dGVuc2lvbnMYYyADKBBCAhABOksKFnBhY2tlZF9mbG9hdF9leHRlbnNp", 
+            "b24SJy5wcm90b2J1Zl91bml0dGVzdC5UZXN0UGFja2VkRXh0ZW5zaW9ucxhk", 
+            "IAMoAkICEAE6TAoXcGFja2VkX2RvdWJsZV9leHRlbnNpb24SJy5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0UGFja2VkRXh0ZW5zaW9ucxhlIAMoAUICEAE6SgoV", 
+            "cGFja2VkX2Jvb2xfZXh0ZW5zaW9uEicucHJvdG9idWZfdW5pdHRlc3QuVGVz", 
+            "dFBhY2tlZEV4dGVuc2lvbnMYZiADKAhCAhABOmoKFXBhY2tlZF9lbnVtX2V4", 
+            "dGVuc2lvbhInLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYWNrZWRFeHRlbnNp", 
+            "b25zGGcgAygOMh4ucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW1CAhAB", 
+            "Ok8KGHVucGFja2VkX2ludDMyX2V4dGVuc2lvbhIpLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMYWiADKAVCAhAAOk8KGHVucGFj", 
+            "a2VkX2ludDY0X2V4dGVuc2lvbhIpLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RV", 
+            "bnBhY2tlZEV4dGVuc2lvbnMYWyADKANCAhAAOlAKGXVucGFja2VkX3VpbnQz", 
+            "Ml9leHRlbnNpb24SKS5wcm90b2J1Zl91bml0dGVzdC5UZXN0VW5wYWNrZWRF", 
+            "eHRlbnNpb25zGFwgAygNQgIQADpQChl1bnBhY2tlZF91aW50NjRfZXh0ZW5z", 
+            "aW9uEikucHJvdG9idWZfdW5pdHRlc3QuVGVzdFVucGFja2VkRXh0ZW5zaW9u", 
+            "cxhdIAMoBEICEAA6UAoZdW5wYWNrZWRfc2ludDMyX2V4dGVuc2lvbhIpLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMYXiADKBFC", 
+            "AhAAOlAKGXVucGFja2VkX3NpbnQ2NF9leHRlbnNpb24SKS5wcm90b2J1Zl91", 
+            "bml0dGVzdC5UZXN0VW5wYWNrZWRFeHRlbnNpb25zGF8gAygSQgIQADpRChp1", 
+            "bnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbhIpLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMYYCADKAdCAhAAOlEKGnVucGFja2Vk", 
+            "X2ZpeGVkNjRfZXh0ZW5zaW9uEikucHJvdG9idWZfdW5pdHRlc3QuVGVzdFVu", 
+            "cGFja2VkRXh0ZW5zaW9ucxhhIAMoBkICEAA6UgobdW5wYWNrZWRfc2ZpeGVk", 
+            "MzJfZXh0ZW5zaW9uEikucHJvdG9idWZfdW5pdHRlc3QuVGVzdFVucGFja2Vk", 
+            "RXh0ZW5zaW9ucxhiIAMoD0ICEAA6UgobdW5wYWNrZWRfc2ZpeGVkNjRfZXh0", 
+            "ZW5zaW9uEikucHJvdG9idWZfdW5pdHRlc3QuVGVzdFVucGFja2VkRXh0ZW5z", 
+            "aW9ucxhjIAMoEEICEAA6TwoYdW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uEiku", 
+            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdFVucGFja2VkRXh0ZW5zaW9ucxhkIAMo", 
+            "AkICEAA6UAoZdW5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbhIpLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMYZSADKAFCAhAAOk4K", 
+            "F3VucGFja2VkX2Jvb2xfZXh0ZW5zaW9uEikucHJvdG9idWZfdW5pdHRlc3Qu", 
+            "VGVzdFVucGFja2VkRXh0ZW5zaW9ucxhmIAMoCEICEAA6bgoXdW5wYWNrZWRf", 
+            "ZW51bV9leHRlbnNpb24SKS5wcm90b2J1Zl91bml0dGVzdC5UZXN0VW5wYWNr", 
+            "ZWRFeHRlbnNpb25zGGcgAygOMh4ucHJvdG9idWZfdW5pdHRlc3QuRm9yZWln", 
+            "bkVudW1CAhAAQkFCDVVuaXR0ZXN0UHJvdG9IAYABAYgBAZABAfgBAaoCIUdv", 
+          "b2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFByb3Rvcw=="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_protobuf_unittest_TestAllTypes__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder>(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", "OptionalPublicImportMessage", "OptionalLazyMessage", "RepeatedInt32", "RepeatedInt64", "RepeatedUint32", "RepeatedUint64", "RepeatedSint32", "RepeatedSint64", "RepeatedFixed32", "RepeatedFixed64", "RepeatedSfixed32", "RepeatedSfixed64", "RepeatedFloat", "RepeatedDouble", "RepeatedBool", "RepeatedString", "RepeatedBytes", "RepeatedGroup", "RepeatedNestedMessage", "RepeatedForeignMessage", "RepeatedImportMessage", "RepeatedNestedEnum", "RepeatedForeignEnum", "RepeatedImportEnum", "RepeatedStringPiece", "RepeatedCord", "RepeatedLazyMessage", "DefaultInt32", "DefaultInt64", "DefaultUint32", "DefaultUint64", "DefaultSint32", "DefaultSint64", "DefaultFixed32", "DefaultFixed64", "DefaultSfixed32", "DefaultSfixed64", "DefaultFloat", "DefaultDouble", "DefaultBool", "DefaultString", "DefaultBytes", "DefaultNestedEnum", "DefaultForeignEnum", "DefaultImportEnum", "DefaultStringPiece", "DefaultCord", "OneofUint32", "OneofNestedMessage", "OneofString", "OneofBytes", });
+        internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor,
+                new string[] { "Bb", });
+        internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder>(internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[2];
+        internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder>(internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_NestedTestAllTypes__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_protobuf_unittest_NestedTestAllTypes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes, global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.Builder>(internal__static_protobuf_unittest_NestedTestAllTypes__Descriptor,
+                new string[] { "Child", "Payload", });
+        internal__static_protobuf_unittest_TestDeprecatedFields__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_protobuf_unittest_TestDeprecatedFields__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields, global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.Builder>(internal__static_protobuf_unittest_TestDeprecatedFields__Descriptor,
+                new string[] { "DeprecatedInt32", });
+        internal__static_protobuf_unittest_ForeignMessage__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder>(internal__static_protobuf_unittest_ForeignMessage__Descriptor,
+                new string[] { "C", });
+        internal__static_protobuf_unittest_TestAllExtensions__Descriptor = Descriptor.MessageTypes[4];
+        internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllExtensions, global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Builder>(internal__static_protobuf_unittest_TestAllExtensions__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor = Descriptor.MessageTypes[5];
+        internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension, global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Builder>(internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor = Descriptor.MessageTypes[6];
+        internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension, global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Builder>(internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestNestedExtension__Descriptor = Descriptor.MessageTypes[7];
+        internal__static_protobuf_unittest_TestNestedExtension__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedExtension, global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Builder>(internal__static_protobuf_unittest_TestNestedExtension__Descriptor,
+                new string[] { });
+        global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Test = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Descriptor.Extensions[0]);
+        global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.NestedStringExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Descriptor.Extensions[1]);
+        internal__static_protobuf_unittest_TestRequired__Descriptor = Descriptor.MessageTypes[8];
+        internal__static_protobuf_unittest_TestRequired__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequired, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder>(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", });
+        global::Google.ProtocolBuffers.TestProtos.TestRequired.Single = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestRequired>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestRequired.Descriptor.Extensions[0]);
+        global::Google.ProtocolBuffers.TestProtos.TestRequired.Multi = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.TestRequired>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestRequired.Descriptor.Extensions[1]);
+        internal__static_protobuf_unittest_TestRequiredForeign__Descriptor = Descriptor.MessageTypes[9];
+        internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign, global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Builder>(internal__static_protobuf_unittest_TestRequiredForeign__Descriptor,
+                new string[] { "OptionalMessage", "RepeatedMessage", "Dummy", });
+        internal__static_protobuf_unittest_TestForeignNested__Descriptor = Descriptor.MessageTypes[10];
+        internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestForeignNested, global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Builder>(internal__static_protobuf_unittest_TestForeignNested__Descriptor,
+                new string[] { "ForeignNested", });
+        internal__static_protobuf_unittest_TestEmptyMessage__Descriptor = Descriptor.MessageTypes[11];
+        internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Builder>(internal__static_protobuf_unittest_TestEmptyMessage__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor = Descriptor.MessageTypes[12];
+        internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Builder>(internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestMultipleExtensionRanges__Descriptor = Descriptor.MessageTypes[13];
+        internal__static_protobuf_unittest_TestMultipleExtensionRanges__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges, global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.Builder>(internal__static_protobuf_unittest_TestMultipleExtensionRanges__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor = Descriptor.MessageTypes[14];
+        internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber, global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Builder>(internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor,
+                new string[] { "A", "Bb", });
+        internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor = Descriptor.MessageTypes[15];
+        internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage, global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder>(internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor,
+                new string[] { "A", "I", });
+        internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor = Descriptor.MessageTypes[16];
+        internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder>(internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor,
+                new string[] { "Bb", });
+        internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor = Descriptor.MessageTypes[17];
+        internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder>(internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor,
+                new string[] { "A", "OptionalInt32", });
+        internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor = Descriptor.MessageTypes[18];
+        internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor,
+                new string[] { "A", "Foo", "Bar", });
+        internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestEagerMessage__Descriptor = Descriptor.MessageTypes[19];
+        internal__static_protobuf_unittest_TestEagerMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEagerMessage, global::Google.ProtocolBuffers.TestProtos.TestEagerMessage.Builder>(internal__static_protobuf_unittest_TestEagerMessage__Descriptor,
+                new string[] { "SubMessage", });
+        internal__static_protobuf_unittest_TestLazyMessage__Descriptor = Descriptor.MessageTypes[20];
+        internal__static_protobuf_unittest_TestLazyMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestLazyMessage, global::Google.ProtocolBuffers.TestProtos.TestLazyMessage.Builder>(internal__static_protobuf_unittest_TestLazyMessage__Descriptor,
+                new string[] { "SubMessage", });
+        internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor = Descriptor.MessageTypes[21];
+        internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Builder>(internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor,
+                new string[] { "OptionalNestedMessage", });
+        internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor = internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor,
+                new string[] { "NestedmessageRepeatedInt32", "NestedmessageRepeatedForeignmessage", });
+        internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor = Descriptor.MessageTypes[22];
+        internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames, global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Builder>(internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor,
+                new string[] { "PrimitiveField", "StringField", "EnumField", "MessageField", "StringPieceField", "CordField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedStringPieceField", "RepeatedCordField", });
+        internal__static_protobuf_unittest_TestFieldOrderings__Descriptor = Descriptor.MessageTypes[23];
+        internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings, global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Builder>(internal__static_protobuf_unittest_TestFieldOrderings__Descriptor,
+                new string[] { "MyString", "MyInt", "MyFloat", "OptionalNestedMessage", });
+        internal__static_protobuf_unittest_TestFieldOrderings_NestedMessage__Descriptor = internal__static_protobuf_unittest_TestFieldOrderings__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestFieldOrderings_NestedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestFieldOrderings_NestedMessage__Descriptor,
+                new string[] { "Oo", "Bb", });
+        internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor = Descriptor.MessageTypes[24];
+        internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues, global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Builder>(internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor,
+                new string[] { "EscapedBytes", "LargeUint32", "LargeUint64", "SmallInt32", "SmallInt64", "ReallySmallInt32", "ReallySmallInt64", "Utf8String", "ZeroFloat", "OneFloat", "SmallFloat", "NegativeOneFloat", "NegativeFloat", "LargeFloat", "SmallNegativeFloat", "InfDouble", "NegInfDouble", "NanDouble", "InfFloat", "NegInfFloat", "NanFloat", "CppTrigraph", "StringWithZero", "BytesWithZero", "StringPieceWithZero", "CordWithZero", "ReplacementString", });
+        internal__static_protobuf_unittest_SparseEnumMessage__Descriptor = Descriptor.MessageTypes[25];
+        internal__static_protobuf_unittest_SparseEnumMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage, global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.Builder>(internal__static_protobuf_unittest_SparseEnumMessage__Descriptor,
+                new string[] { "SparseEnum", });
+        internal__static_protobuf_unittest_OneString__Descriptor = Descriptor.MessageTypes[26];
+        internal__static_protobuf_unittest_OneString__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OneString, global::Google.ProtocolBuffers.TestProtos.OneString.Builder>(internal__static_protobuf_unittest_OneString__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_MoreString__Descriptor = Descriptor.MessageTypes[27];
+        internal__static_protobuf_unittest_MoreString__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.MoreString, global::Google.ProtocolBuffers.TestProtos.MoreString.Builder>(internal__static_protobuf_unittest_MoreString__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_OneBytes__Descriptor = Descriptor.MessageTypes[28];
+        internal__static_protobuf_unittest_OneBytes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OneBytes, global::Google.ProtocolBuffers.TestProtos.OneBytes.Builder>(internal__static_protobuf_unittest_OneBytes__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_MoreBytes__Descriptor = Descriptor.MessageTypes[29];
+        internal__static_protobuf_unittest_MoreBytes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.MoreBytes, global::Google.ProtocolBuffers.TestProtos.MoreBytes.Builder>(internal__static_protobuf_unittest_MoreBytes__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_Int32Message__Descriptor = Descriptor.MessageTypes[30];
+        internal__static_protobuf_unittest_Int32Message__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.Int32Message, global::Google.ProtocolBuffers.TestProtos.Int32Message.Builder>(internal__static_protobuf_unittest_Int32Message__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_Uint32Message__Descriptor = Descriptor.MessageTypes[31];
+        internal__static_protobuf_unittest_Uint32Message__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.Uint32Message, global::Google.ProtocolBuffers.TestProtos.Uint32Message.Builder>(internal__static_protobuf_unittest_Uint32Message__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_Int64Message__Descriptor = Descriptor.MessageTypes[32];
+        internal__static_protobuf_unittest_Int64Message__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.Int64Message, global::Google.ProtocolBuffers.TestProtos.Int64Message.Builder>(internal__static_protobuf_unittest_Int64Message__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_Uint64Message__Descriptor = Descriptor.MessageTypes[33];
+        internal__static_protobuf_unittest_Uint64Message__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.Uint64Message, global::Google.ProtocolBuffers.TestProtos.Uint64Message.Builder>(internal__static_protobuf_unittest_Uint64Message__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_BoolMessage__Descriptor = Descriptor.MessageTypes[34];
+        internal__static_protobuf_unittest_BoolMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BoolMessage, global::Google.ProtocolBuffers.TestProtos.BoolMessage.Builder>(internal__static_protobuf_unittest_BoolMessage__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_TestOneof__Descriptor = Descriptor.MessageTypes[35];
+        internal__static_protobuf_unittest_TestOneof__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof, global::Google.ProtocolBuffers.TestProtos.TestOneof.Builder>(internal__static_protobuf_unittest_TestOneof__Descriptor,
+                new string[] { "FooInt", "FooString", "FooMessage", "FooGroup", });
+        internal__static_protobuf_unittest_TestOneof_FooGroup__Descriptor = internal__static_protobuf_unittest_TestOneof__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestOneof_FooGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup, global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.Builder>(internal__static_protobuf_unittest_TestOneof_FooGroup__Descriptor,
+                new string[] { "A", "B", });
+        internal__static_protobuf_unittest_TestOneofBackwardsCompatible__Descriptor = Descriptor.MessageTypes[36];
+        internal__static_protobuf_unittest_TestOneofBackwardsCompatible__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible, global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Builder>(internal__static_protobuf_unittest_TestOneofBackwardsCompatible__Descriptor,
+                new string[] { "FooInt", "FooString", "FooMessage", "FooGroup", });
+        internal__static_protobuf_unittest_TestOneofBackwardsCompatible_FooGroup__Descriptor = internal__static_protobuf_unittest_TestOneofBackwardsCompatible__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestOneofBackwardsCompatible_FooGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup, global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.Builder>(internal__static_protobuf_unittest_TestOneofBackwardsCompatible_FooGroup__Descriptor,
+                new string[] { "A", "B", });
+        internal__static_protobuf_unittest_TestOneof2__Descriptor = Descriptor.MessageTypes[37];
+        internal__static_protobuf_unittest_TestOneof2__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof2, global::Google.ProtocolBuffers.TestProtos.TestOneof2.Builder>(internal__static_protobuf_unittest_TestOneof2__Descriptor,
+                new string[] { "FooInt", "FooString", "FooCord", "FooStringPiece", "FooBytes", "FooEnum", "FooMessage", "FooGroup", "FooLazyMessage", "BarInt", "BarString", "BarCord", "BarStringPiece", "BarBytes", "BarEnum", "BazInt", "BazString", });
+        internal__static_protobuf_unittest_TestOneof2_FooGroup__Descriptor = internal__static_protobuf_unittest_TestOneof2__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestOneof2_FooGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup, global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.Builder>(internal__static_protobuf_unittest_TestOneof2_FooGroup__Descriptor,
+                new string[] { "A", "B", });
+        internal__static_protobuf_unittest_TestOneof2_NestedMessage__Descriptor = internal__static_protobuf_unittest_TestOneof2__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestOneof2_NestedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestOneof2_NestedMessage__Descriptor,
+                new string[] { "QuxInt", "CorgeInt", });
+        internal__static_protobuf_unittest_TestRequiredOneof__Descriptor = Descriptor.MessageTypes[38];
+        internal__static_protobuf_unittest_TestRequiredOneof__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof, global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Builder>(internal__static_protobuf_unittest_TestRequiredOneof__Descriptor,
+                new string[] { "FooInt", "FooString", "FooMessage", });
+        internal__static_protobuf_unittest_TestRequiredOneof_NestedMessage__Descriptor = internal__static_protobuf_unittest_TestRequiredOneof__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestRequiredOneof_NestedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestRequiredOneof_NestedMessage__Descriptor,
+                new string[] { "RequiredDouble", });
+        internal__static_protobuf_unittest_TestPackedTypes__Descriptor = Descriptor.MessageTypes[39];
+        internal__static_protobuf_unittest_TestPackedTypes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestPackedTypes, global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.Builder>(internal__static_protobuf_unittest_TestPackedTypes__Descriptor,
+                new string[] { "PackedInt32", "PackedInt64", "PackedUint32", "PackedUint64", "PackedSint32", "PackedSint64", "PackedFixed32", "PackedFixed64", "PackedSfixed32", "PackedSfixed64", "PackedFloat", "PackedDouble", "PackedBool", "PackedEnum", });
+        internal__static_protobuf_unittest_TestUnpackedTypes__Descriptor = Descriptor.MessageTypes[40];
+        internal__static_protobuf_unittest_TestUnpackedTypes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes, global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.Builder>(internal__static_protobuf_unittest_TestUnpackedTypes__Descriptor,
+                new string[] { "UnpackedInt32", "UnpackedInt64", "UnpackedUint32", "UnpackedUint64", "UnpackedSint32", "UnpackedSint64", "UnpackedFixed32", "UnpackedFixed64", "UnpackedSfixed32", "UnpackedSfixed64", "UnpackedFloat", "UnpackedDouble", "UnpackedBool", "UnpackedEnum", });
+        internal__static_protobuf_unittest_TestPackedExtensions__Descriptor = Descriptor.MessageTypes[41];
+        internal__static_protobuf_unittest_TestPackedExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions, global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.Builder>(internal__static_protobuf_unittest_TestPackedExtensions__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestUnpackedExtensions__Descriptor = Descriptor.MessageTypes[42];
+        internal__static_protobuf_unittest_TestUnpackedExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestUnpackedExtensions, global::Google.ProtocolBuffers.TestProtos.TestUnpackedExtensions.Builder>(internal__static_protobuf_unittest_TestUnpackedExtensions__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor = Descriptor.MessageTypes[43];
+        internal__static_protobuf_unittest_TestDynamicExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions, global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Builder>(internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor,
+                new string[] { "ScalarExtension", "EnumExtension", "DynamicEnumExtension", "MessageExtension", "DynamicMessageExtension", "RepeatedExtension", "PackedExtension", });
+        internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__Descriptor = internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType, global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder>(internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__Descriptor,
+                new string[] { "DynamicField", });
+        internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__Descriptor = Descriptor.MessageTypes[44];
+        internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes, global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.Builder>(internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__Descriptor,
+                new string[] { "RepeatedFixed32", "RepeatedInt32", "RepeatedFixed64", "RepeatedInt64", "RepeatedFloat", "RepeatedUint64", });
+        internal__static_protobuf_unittest_TestParsingMerge__Descriptor = Descriptor.MessageTypes[45];
+        internal__static_protobuf_unittest_TestParsingMerge__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Builder>(internal__static_protobuf_unittest_TestParsingMerge__Descriptor,
+                new string[] { "RequiredAllTypes", "OptionalAllTypes", "RepeatedAllTypes", "OptionalGroup", "RepeatedGroup", });
+        internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__Descriptor = internal__static_protobuf_unittest_TestParsingMerge__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Builder>(internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Group1", "Group2", "Ext1", "Ext2", });
+        internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group1__Descriptor = internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1.Builder>(internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group1__Descriptor,
+                new string[] { "Field1", });
+        internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group2__Descriptor = internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group2__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2.Builder>(internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group2__Descriptor,
+                new string[] { "Field1", });
+        internal__static_protobuf_unittest_TestParsingMerge_OptionalGroup__Descriptor = internal__static_protobuf_unittest_TestParsingMerge__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestParsingMerge_OptionalGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.Builder>(internal__static_protobuf_unittest_TestParsingMerge_OptionalGroup__Descriptor,
+                new string[] { "OptionalGroupAllTypes", });
+        internal__static_protobuf_unittest_TestParsingMerge_RepeatedGroup__Descriptor = internal__static_protobuf_unittest_TestParsingMerge__Descriptor.NestedTypes[2];
+        internal__static_protobuf_unittest_TestParsingMerge_RepeatedGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup.Builder>(internal__static_protobuf_unittest_TestParsingMerge_RepeatedGroup__Descriptor,
+                new string[] { "RepeatedGroupAllTypes", });
+        global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.OptionalExt = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Descriptor.Extensions[0]);
+        global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.RepeatedExt = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Descriptor.Extensions[1]);
+        internal__static_protobuf_unittest_TestCommentInjectionMessage__Descriptor = Descriptor.MessageTypes[46];
+        internal__static_protobuf_unittest_TestCommentInjectionMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestCommentInjectionMessage, global::Google.ProtocolBuffers.TestProtos.TestCommentInjectionMessage.Builder>(internal__static_protobuf_unittest_TestCommentInjectionMessage__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_FooRequest__Descriptor = Descriptor.MessageTypes[47];
+        internal__static_protobuf_unittest_FooRequest__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooRequest, global::Google.ProtocolBuffers.TestProtos.FooRequest.Builder>(internal__static_protobuf_unittest_FooRequest__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_FooResponse__Descriptor = Descriptor.MessageTypes[48];
+        internal__static_protobuf_unittest_FooResponse__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder>(internal__static_protobuf_unittest_FooResponse__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_FooClientMessage__Descriptor = Descriptor.MessageTypes[49];
+        internal__static_protobuf_unittest_FooClientMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooClientMessage, global::Google.ProtocolBuffers.TestProtos.FooClientMessage.Builder>(internal__static_protobuf_unittest_FooClientMessage__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_FooServerMessage__Descriptor = Descriptor.MessageTypes[50];
+        internal__static_protobuf_unittest_FooServerMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooServerMessage, global::Google.ProtocolBuffers.TestProtos.FooServerMessage.Builder>(internal__static_protobuf_unittest_FooServerMessage__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_BarRequest__Descriptor = Descriptor.MessageTypes[51];
+        internal__static_protobuf_unittest_BarRequest__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarRequest, global::Google.ProtocolBuffers.TestProtos.BarRequest.Builder>(internal__static_protobuf_unittest_BarRequest__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_BarResponse__Descriptor = Descriptor.MessageTypes[52];
+        internal__static_protobuf_unittest_BarResponse__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder>(internal__static_protobuf_unittest_BarResponse__Descriptor,
+                new string[] { });
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalInt32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[0]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalInt64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[1]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalUint32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[2]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalUint64Extension = pb::GeneratedSingleExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[3]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalSint32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[4]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalSint64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[5]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalFixed32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[6]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalFixed64Extension = pb::GeneratedSingleExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[7]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalSfixed32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[8]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalSfixed64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[9]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalFloatExtension = pb::GeneratedSingleExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[10]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalDoubleExtension = pb::GeneratedSingleExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[11]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalBoolExtension = pb::GeneratedSingleExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[12]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalStringExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[13]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalBytesExtension = pb::GeneratedSingleExtension<pb::ByteString>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[14]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalGroupExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[15]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalNestedMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[16]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalForeignMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[17]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalImportMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ImportMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[18]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalNestedEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[19]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalForeignEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[20]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalImportEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ImportEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[21]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalStringPieceExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[22]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalCordExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[23]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalPublicImportMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.PublicImportMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[24]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OptionalLazyMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[25]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedInt32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[26]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedInt64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[27]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedUint32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[28]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedUint64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[29]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedSint32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[30]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedSint64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[31]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedFixed32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[32]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedFixed64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[33]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedSfixed32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[34]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedSfixed64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[35]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedFloatExtension = pb::GeneratedRepeatExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[36]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedDoubleExtension = pb::GeneratedRepeatExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[37]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedBoolExtension = pb::GeneratedRepeatExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[38]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedStringExtension = pb::GeneratedRepeatExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[39]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedBytesExtension = pb::GeneratedRepeatExtension<pb::ByteString>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[40]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedGroupExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[41]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedNestedMessageExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[42]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedForeignMessageExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[43]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedImportMessageExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ImportMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[44]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedNestedEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[45]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedForeignEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[46]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedImportEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ImportEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[47]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedStringPieceExtension = pb::GeneratedRepeatExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[48]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedCordExtension = pb::GeneratedRepeatExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[49]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.RepeatedLazyMessageExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[50]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultInt32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[51]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultInt64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[52]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultUint32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[53]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultUint64Extension = pb::GeneratedSingleExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[54]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultSint32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[55]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultSint64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[56]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultFixed32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[57]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultFixed64Extension = pb::GeneratedSingleExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[58]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultSfixed32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[59]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultSfixed64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[60]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultFloatExtension = pb::GeneratedSingleExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[61]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultDoubleExtension = pb::GeneratedSingleExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[62]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultBoolExtension = pb::GeneratedSingleExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[63]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultStringExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[64]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultBytesExtension = pb::GeneratedSingleExtension<pb::ByteString>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[65]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultNestedEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[66]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultForeignEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[67]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultImportEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ImportEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[68]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultStringPieceExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[69]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.DefaultCordExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[70]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OneofUint32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[71]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OneofNestedMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[72]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OneofStringExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[73]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.OneofBytesExtension = pb::GeneratedSingleExtension<pb::ByteString>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[74]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.MyExtensionString = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[75]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.MyExtensionInt = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[76]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedInt32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[77]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedInt64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[78]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedUint32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[79]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedUint64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[80]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedSint32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[81]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedSint64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[82]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedFixed32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[83]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedFixed64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[84]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedSfixed32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[85]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedSfixed64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[86]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedFloatExtension = pb::GeneratedRepeatExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[87]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedDoubleExtension = pb::GeneratedRepeatExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[88]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedBoolExtension = pb::GeneratedRepeatExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[89]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.PackedEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[90]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedInt32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[91]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedInt64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[92]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedUint32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[93]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedUint64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[94]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedSint32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[95]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedSint64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[96]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedFixed32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[97]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedFixed64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[98]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedSfixed32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[99]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedSfixed64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[100]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedFloatExtension = pb::GeneratedRepeatExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[101]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedDoubleExtension = pb::GeneratedRepeatExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[102]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedBoolExtension = pb::GeneratedRepeatExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[103]);
+        global::Google.ProtocolBuffers.TestProtos.Unittest.UnpackedEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor.Extensions[104]);
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.TestProtos.UnittestImport.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.TestProtos.UnittestImport.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ForeignEnum {
+    FOREIGN_FOO = 4,
+    FOREIGN_BAR = 5,
+    FOREIGN_BAZ = 6,
+  }
+
+  public enum TestEnumWithDupValue {
+    FOO1 = 1,
+    BAR1 = 2,
+    BAZ = 3,
+    FOO2 = 1,
+    BAR2 = 2,
+  }
+
+  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
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestAllTypes : pb::GeneratedMessage<TestAllTypes, TestAllTypes.Builder> {
+    private TestAllTypes() { }
+    private static readonly TestAllTypes defaultInstance = new TestAllTypes().MakeReadOnly();
+    private static readonly string[] _testAllTypesFieldNames = new string[] { "default_bool", "default_bytes", "default_cord", "default_double", "default_fixed32", "default_fixed64", "default_float", "default_foreign_enum", "default_import_enum", "default_int32", "default_int64", "default_nested_enum", "default_sfixed32", "default_sfixed64", "default_sint32", "default_sint64", "default_string", "default_string_piece", "default_uint32", "default_uint64", "oneof_bytes", "oneof_nested_message", "oneof_string", "oneof_uint32", "optional_bool", "optional_bytes", "optional_cord", "optional_double", "optional_fixed32", "optional_fixed64", "optional_float", "optional_foreign_enum", "optional_foreign_message", "optional_import_enum", "optional_import_message", "optional_int32", "optional_int64", "optional_lazy_message", "optional_nested_enum", "optional_nested_message", "optional_public_import_message", "optional_sfixed32", "optional_sfixed64", "optional_sint32", "optional_sint64", "optional_string", "optional_string_piece", "optional_uint32", "optional_uint64", "optionalgroup", "repeated_bool", "repeated_bytes", "repeated_cord", "repeated_double", "repeated_fixed32", "repeated_fixed64", "repeated_float", "repeated_foreign_enum", "repeated_foreign_message", "repeated_import_enum", "repeated_import_message", "repeated_int32", "repeated_int64", "repeated_lazy_message", "repeated_nested_enum", "repeated_nested_message", "repeated_sfixed32", "repeated_sfixed64", "repeated_sint32", "repeated_sint64", "repeated_string", "repeated_string_piece", "repeated_uint32", "repeated_uint64", "repeatedgroup" };
+    private static readonly uint[] _testAllTypesFieldTags = new uint[] { 584, 602, 682, 577, 541, 545, 573, 656, 664, 488, 496, 648, 557, 561, 520, 528, 594, 674, 504, 512, 914, 898, 906, 888, 104, 122, 202, 97, 61, 65, 93, 176, 154, 184, 162, 8, 16, 218, 168, 146, 210, 77, 81, 40, 48, 114, 194, 24, 32, 131, 344, 362, 442, 337, 301, 305, 333, 416, 394, 424, 402, 248, 256, 458, 408, 386, 317, 321, 280, 288, 354, 434, 264, 272, 371 };
+    public static TestAllTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestAllTypes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestAllTypes ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllTypes__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestAllTypes, TestAllTypes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum NestedEnum {
+        FOO = 1,
+        BAR = 2,
+        BAZ = 3,
+        NEG = -1,
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        private NestedMessage() { }
+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();
+        private static readonly string[] _nestedMessageFieldNames = new string[] { "bb" };
+        private static readonly uint[] _nestedMessageFieldTags = new uint[] { 8 };
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override NestedMessage DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable; }
+        }
+
+        public const int BbFieldNumber = 1;
+        private bool hasBb;
+        private int bb_;
+        public bool HasBb {
+          get { return hasBb; }
+        }
+        public int Bb {
+          get { return bb_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _nestedMessageFieldNames;
+          if (hasBb) {
+            output.WriteInt32(1, field_names[0], Bb);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          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 NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private NestedMessage MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(NestedMessage prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<NestedMessage, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(NestedMessage cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private NestedMessage result;
+
+          private NestedMessage PrepareBuilder() {
+            if (resultIsReadOnly) {
+              NestedMessage original = result;
+              result = new NestedMessage();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override NestedMessage MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Descriptor; }
+          }
+
+          public override NestedMessage DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }
+          }
+
+          public override NestedMessage BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is NestedMessage) {
+              return MergeFrom((NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(NestedMessage other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasBb) {
+              Bb = other.Bb;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_nestedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _nestedMessageFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 8: {
+                  result.hasBb = input.ReadInt32(ref result.bb_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasBb {
+            get { return result.hasBb; }
+          }
+          public int Bb {
+            get { return result.Bb; }
+            set { SetBb(value); }
+          }
+          public Builder SetBb(int value) {
+            PrepareBuilder();
+            result.hasBb = true;
+            result.bb_ = value;
+            return this;
+          }
+          public Builder ClearBb() {
+            PrepareBuilder();
+            result.hasBb = false;
+            result.bb_ = 0;
+            return this;
+          }
+        }
+        static NestedMessage() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class OptionalGroup : pb::GeneratedMessage<OptionalGroup, OptionalGroup.Builder> {
+        private OptionalGroup() { }
+        private static readonly OptionalGroup defaultInstance = new OptionalGroup().MakeReadOnly();
+        private static readonly string[] _optionalGroupFieldNames = new string[] { "a" };
+        private static readonly uint[] _optionalGroupFieldTags = new uint[] { 136 };
+        public static OptionalGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override OptionalGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override OptionalGroup ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<OptionalGroup, OptionalGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable; }
+        }
+
+        public const int AFieldNumber = 17;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _optionalGroupFieldNames;
+          if (hasA) {
+            output.WriteInt32(17, field_names[0], A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          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 OptionalGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static OptionalGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private OptionalGroup MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(OptionalGroup prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<OptionalGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(OptionalGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private OptionalGroup result;
+
+          private OptionalGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              OptionalGroup original = result;
+              result = new OptionalGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override OptionalGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Descriptor; }
+          }
+
+          public override OptionalGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance; }
+          }
+
+          public override OptionalGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is OptionalGroup) {
+              return MergeFrom((OptionalGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(OptionalGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_optionalGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _optionalGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 136: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+        static OptionalGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class RepeatedGroup : pb::GeneratedMessage<RepeatedGroup, RepeatedGroup.Builder> {
+        private RepeatedGroup() { }
+        private static readonly RepeatedGroup defaultInstance = new RepeatedGroup().MakeReadOnly();
+        private static readonly string[] _repeatedGroupFieldNames = new string[] { "a" };
+        private static readonly uint[] _repeatedGroupFieldTags = new uint[] { 376 };
+        public static RepeatedGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override RepeatedGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override RepeatedGroup ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<RepeatedGroup, RepeatedGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable; }
+        }
+
+        public const int AFieldNumber = 47;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _repeatedGroupFieldNames;
+          if (hasA) {
+            output.WriteInt32(47, field_names[0], A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          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 RepeatedGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static RepeatedGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private RepeatedGroup MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(RepeatedGroup prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<RepeatedGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(RepeatedGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private RepeatedGroup result;
+
+          private RepeatedGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              RepeatedGroup original = result;
+              result = new RepeatedGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override RepeatedGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Descriptor; }
+          }
+
+          public override RepeatedGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.DefaultInstance; }
+          }
+
+          public override RepeatedGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is RepeatedGroup) {
+              return MergeFrom((RepeatedGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(RepeatedGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_repeatedGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _repeatedGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 376: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+        static RepeatedGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int OptionalInt32FieldNumber = 1;
+    private bool hasOptionalInt32;
+    private int optionalInt32_;
+    public bool HasOptionalInt32 {
+      get { return hasOptionalInt32; }
+    }
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+    }
+
+    public const int OptionalInt64FieldNumber = 2;
+    private bool hasOptionalInt64;
+    private long optionalInt64_;
+    public bool HasOptionalInt64 {
+      get { return hasOptionalInt64; }
+    }
+    public long OptionalInt64 {
+      get { return optionalInt64_; }
+    }
+
+    public const int OptionalUint32FieldNumber = 3;
+    private bool hasOptionalUint32;
+    private uint optionalUint32_;
+    public bool HasOptionalUint32 {
+      get { return hasOptionalUint32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint OptionalUint32 {
+      get { return optionalUint32_; }
+    }
+
+    public const int OptionalUint64FieldNumber = 4;
+    private bool hasOptionalUint64;
+    private ulong optionalUint64_;
+    public bool HasOptionalUint64 {
+      get { return hasOptionalUint64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong OptionalUint64 {
+      get { return optionalUint64_; }
+    }
+
+    public const int OptionalSint32FieldNumber = 5;
+    private bool hasOptionalSint32;
+    private int optionalSint32_;
+    public bool HasOptionalSint32 {
+      get { return hasOptionalSint32; }
+    }
+    public int OptionalSint32 {
+      get { return optionalSint32_; }
+    }
+
+    public const int OptionalSint64FieldNumber = 6;
+    private bool hasOptionalSint64;
+    private long optionalSint64_;
+    public bool HasOptionalSint64 {
+      get { return hasOptionalSint64; }
+    }
+    public long OptionalSint64 {
+      get { return optionalSint64_; }
+    }
+
+    public const int OptionalFixed32FieldNumber = 7;
+    private bool hasOptionalFixed32;
+    private uint optionalFixed32_;
+    public bool HasOptionalFixed32 {
+      get { return hasOptionalFixed32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint OptionalFixed32 {
+      get { return optionalFixed32_; }
+    }
+
+    public const int OptionalFixed64FieldNumber = 8;
+    private bool hasOptionalFixed64;
+    private ulong optionalFixed64_;
+    public bool HasOptionalFixed64 {
+      get { return hasOptionalFixed64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong OptionalFixed64 {
+      get { return optionalFixed64_; }
+    }
+
+    public const int OptionalSfixed32FieldNumber = 9;
+    private bool hasOptionalSfixed32;
+    private int optionalSfixed32_;
+    public bool HasOptionalSfixed32 {
+      get { return hasOptionalSfixed32; }
+    }
+    public int OptionalSfixed32 {
+      get { return optionalSfixed32_; }
+    }
+
+    public const int OptionalSfixed64FieldNumber = 10;
+    private bool hasOptionalSfixed64;
+    private long optionalSfixed64_;
+    public bool HasOptionalSfixed64 {
+      get { return hasOptionalSfixed64; }
+    }
+    public long OptionalSfixed64 {
+      get { return optionalSfixed64_; }
+    }
+
+    public const int OptionalFloatFieldNumber = 11;
+    private bool hasOptionalFloat;
+    private float optionalFloat_;
+    public bool HasOptionalFloat {
+      get { return hasOptionalFloat; }
+    }
+    public float OptionalFloat {
+      get { return optionalFloat_; }
+    }
+
+    public const int OptionalDoubleFieldNumber = 12;
+    private bool hasOptionalDouble;
+    private double optionalDouble_;
+    public bool HasOptionalDouble {
+      get { return hasOptionalDouble; }
+    }
+    public double OptionalDouble {
+      get { return optionalDouble_; }
+    }
+
+    public const int OptionalBoolFieldNumber = 13;
+    private bool hasOptionalBool;
+    private bool optionalBool_;
+    public bool HasOptionalBool {
+      get { return hasOptionalBool; }
+    }
+    public bool OptionalBool {
+      get { return optionalBool_; }
+    }
+
+    public const int OptionalStringFieldNumber = 14;
+    private bool hasOptionalString;
+    private string optionalString_ = "";
+    public bool HasOptionalString {
+      get { return hasOptionalString; }
+    }
+    public string OptionalString {
+      get { return optionalString_; }
+    }
+
+    public const int OptionalBytesFieldNumber = 15;
+    private bool hasOptionalBytes;
+    private pb::ByteString optionalBytes_ = pb::ByteString.Empty;
+    public bool HasOptionalBytes {
+      get { return hasOptionalBytes; }
+    }
+    public pb::ByteString OptionalBytes {
+      get { return optionalBytes_; }
+    }
+
+    public const int OptionalGroupFieldNumber = 16;
+    private bool hasOptionalGroup;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup optionalGroup_;
+    public bool HasOptionalGroup {
+      get { return hasOptionalGroup; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup OptionalGroup {
+      get { return optionalGroup_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance; }
+    }
+
+    public const int OptionalNestedMessageFieldNumber = 18;
+    private bool hasOptionalNestedMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage optionalNestedMessage_;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public const int OptionalForeignMessageFieldNumber = 19;
+    private bool hasOptionalForeignMessage;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage optionalForeignMessage_;
+    public bool HasOptionalForeignMessage {
+      get { return hasOptionalForeignMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage OptionalForeignMessage {
+      get { return optionalForeignMessage_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }
+    }
+
+    public const int OptionalImportMessageFieldNumber = 20;
+    private bool hasOptionalImportMessage;
+    private global::Google.ProtocolBuffers.TestProtos.ImportMessage optionalImportMessage_;
+    public bool HasOptionalImportMessage {
+      get { return hasOptionalImportMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportMessage OptionalImportMessage {
+      get { return optionalImportMessage_ ?? global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance; }
+    }
+
+    public const int OptionalNestedEnumFieldNumber = 21;
+    private bool hasOptionalNestedEnum;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum optionalNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.FOO;
+    public bool HasOptionalNestedEnum {
+      get { return hasOptionalNestedEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum OptionalNestedEnum {
+      get { return optionalNestedEnum_; }
+    }
+
+    public const int OptionalForeignEnumFieldNumber = 22;
+    private bool hasOptionalForeignEnum;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignEnum optionalForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+    public bool HasOptionalForeignEnum {
+      get { return hasOptionalForeignEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum OptionalForeignEnum {
+      get { return optionalForeignEnum_; }
+    }
+
+    public const int OptionalImportEnumFieldNumber = 23;
+    private bool hasOptionalImportEnum;
+    private global::Google.ProtocolBuffers.TestProtos.ImportEnum optionalImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_FOO;
+    public bool HasOptionalImportEnum {
+      get { return hasOptionalImportEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportEnum OptionalImportEnum {
+      get { return optionalImportEnum_; }
+    }
+
+    public const int OptionalStringPieceFieldNumber = 24;
+    private bool hasOptionalStringPiece;
+    private string optionalStringPiece_ = "";
+    public bool HasOptionalStringPiece {
+      get { return hasOptionalStringPiece; }
+    }
+    public string OptionalStringPiece {
+      get { return optionalStringPiece_; }
+    }
+
+    public const int OptionalCordFieldNumber = 25;
+    private bool hasOptionalCord;
+    private string optionalCord_ = "";
+    public bool HasOptionalCord {
+      get { return hasOptionalCord; }
+    }
+    public string OptionalCord {
+      get { return optionalCord_; }
+    }
+
+    public const int OptionalPublicImportMessageFieldNumber = 26;
+    private bool hasOptionalPublicImportMessage;
+    private global::Google.ProtocolBuffers.TestProtos.PublicImportMessage optionalPublicImportMessage_;
+    public bool HasOptionalPublicImportMessage {
+      get { return hasOptionalPublicImportMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.PublicImportMessage OptionalPublicImportMessage {
+      get { return optionalPublicImportMessage_ ?? global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.DefaultInstance; }
+    }
+
+    public const int OptionalLazyMessageFieldNumber = 27;
+    private bool hasOptionalLazyMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage optionalLazyMessage_;
+    public bool HasOptionalLazyMessage {
+      get { return hasOptionalLazyMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OptionalLazyMessage {
+      get { return optionalLazyMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public const int RepeatedInt32FieldNumber = 31;
+    private pbc::PopsicleList<int> repeatedInt32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedInt32List {
+      get { return pbc::Lists.AsReadOnly(repeatedInt32_); }
+    }
+    public int RepeatedInt32Count {
+      get { return repeatedInt32_.Count; }
+    }
+    public int GetRepeatedInt32(int index) {
+      return repeatedInt32_[index];
+    }
+
+    public const int RepeatedInt64FieldNumber = 32;
+    private pbc::PopsicleList<long> repeatedInt64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> RepeatedInt64List {
+      get { return pbc::Lists.AsReadOnly(repeatedInt64_); }
+    }
+    public int RepeatedInt64Count {
+      get { return repeatedInt64_.Count; }
+    }
+    public long GetRepeatedInt64(int index) {
+      return repeatedInt64_[index];
+    }
+
+    public const int RepeatedUint32FieldNumber = 33;
+    private pbc::PopsicleList<uint> repeatedUint32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> RepeatedUint32List {
+      get { return pbc::Lists.AsReadOnly(repeatedUint32_); }
+    }
+    public int RepeatedUint32Count {
+      get { return repeatedUint32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetRepeatedUint32(int index) {
+      return repeatedUint32_[index];
+    }
+
+    public const int RepeatedUint64FieldNumber = 34;
+    private pbc::PopsicleList<ulong> repeatedUint64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> RepeatedUint64List {
+      get { return pbc::Lists.AsReadOnly(repeatedUint64_); }
+    }
+    public int RepeatedUint64Count {
+      get { return repeatedUint64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetRepeatedUint64(int index) {
+      return repeatedUint64_[index];
+    }
+
+    public const int RepeatedSint32FieldNumber = 35;
+    private pbc::PopsicleList<int> repeatedSint32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedSint32List {
+      get { return pbc::Lists.AsReadOnly(repeatedSint32_); }
+    }
+    public int RepeatedSint32Count {
+      get { return repeatedSint32_.Count; }
+    }
+    public int GetRepeatedSint32(int index) {
+      return repeatedSint32_[index];
+    }
+
+    public const int RepeatedSint64FieldNumber = 36;
+    private pbc::PopsicleList<long> repeatedSint64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> RepeatedSint64List {
+      get { return pbc::Lists.AsReadOnly(repeatedSint64_); }
+    }
+    public int RepeatedSint64Count {
+      get { return repeatedSint64_.Count; }
+    }
+    public long GetRepeatedSint64(int index) {
+      return repeatedSint64_[index];
+    }
+
+    public const int RepeatedFixed32FieldNumber = 37;
+    private pbc::PopsicleList<uint> repeatedFixed32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> RepeatedFixed32List {
+      get { return pbc::Lists.AsReadOnly(repeatedFixed32_); }
+    }
+    public int RepeatedFixed32Count {
+      get { return repeatedFixed32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetRepeatedFixed32(int index) {
+      return repeatedFixed32_[index];
+    }
+
+    public const int RepeatedFixed64FieldNumber = 38;
+    private pbc::PopsicleList<ulong> repeatedFixed64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> RepeatedFixed64List {
+      get { return pbc::Lists.AsReadOnly(repeatedFixed64_); }
+    }
+    public int RepeatedFixed64Count {
+      get { return repeatedFixed64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetRepeatedFixed64(int index) {
+      return repeatedFixed64_[index];
+    }
+
+    public const int RepeatedSfixed32FieldNumber = 39;
+    private pbc::PopsicleList<int> repeatedSfixed32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedSfixed32List {
+      get { return pbc::Lists.AsReadOnly(repeatedSfixed32_); }
+    }
+    public int RepeatedSfixed32Count {
+      get { return repeatedSfixed32_.Count; }
+    }
+    public int GetRepeatedSfixed32(int index) {
+      return repeatedSfixed32_[index];
+    }
+
+    public const int RepeatedSfixed64FieldNumber = 40;
+    private pbc::PopsicleList<long> repeatedSfixed64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> RepeatedSfixed64List {
+      get { return pbc::Lists.AsReadOnly(repeatedSfixed64_); }
+    }
+    public int RepeatedSfixed64Count {
+      get { return repeatedSfixed64_.Count; }
+    }
+    public long GetRepeatedSfixed64(int index) {
+      return repeatedSfixed64_[index];
+    }
+
+    public const int RepeatedFloatFieldNumber = 41;
+    private pbc::PopsicleList<float> repeatedFloat_ = new pbc::PopsicleList<float>();
+    public scg::IList<float> RepeatedFloatList {
+      get { return pbc::Lists.AsReadOnly(repeatedFloat_); }
+    }
+    public int RepeatedFloatCount {
+      get { return repeatedFloat_.Count; }
+    }
+    public float GetRepeatedFloat(int index) {
+      return repeatedFloat_[index];
+    }
+
+    public const int RepeatedDoubleFieldNumber = 42;
+    private pbc::PopsicleList<double> repeatedDouble_ = new pbc::PopsicleList<double>();
+    public scg::IList<double> RepeatedDoubleList {
+      get { return pbc::Lists.AsReadOnly(repeatedDouble_); }
+    }
+    public int RepeatedDoubleCount {
+      get { return repeatedDouble_.Count; }
+    }
+    public double GetRepeatedDouble(int index) {
+      return repeatedDouble_[index];
+    }
+
+    public const int RepeatedBoolFieldNumber = 43;
+    private pbc::PopsicleList<bool> repeatedBool_ = new pbc::PopsicleList<bool>();
+    public scg::IList<bool> RepeatedBoolList {
+      get { return pbc::Lists.AsReadOnly(repeatedBool_); }
+    }
+    public int RepeatedBoolCount {
+      get { return repeatedBool_.Count; }
+    }
+    public bool GetRepeatedBool(int index) {
+      return repeatedBool_[index];
+    }
+
+    public const int RepeatedStringFieldNumber = 44;
+    private pbc::PopsicleList<string> repeatedString_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedStringList {
+      get { return pbc::Lists.AsReadOnly(repeatedString_); }
+    }
+    public int RepeatedStringCount {
+      get { return repeatedString_.Count; }
+    }
+    public string GetRepeatedString(int index) {
+      return repeatedString_[index];
+    }
+
+    public const int RepeatedBytesFieldNumber = 45;
+    private pbc::PopsicleList<pb::ByteString> repeatedBytes_ = new pbc::PopsicleList<pb::ByteString>();
+    public scg::IList<pb::ByteString> RepeatedBytesList {
+      get { return pbc::Lists.AsReadOnly(repeatedBytes_); }
+    }
+    public int RepeatedBytesCount {
+      get { return repeatedBytes_.Count; }
+    }
+    public pb::ByteString GetRepeatedBytes(int index) {
+      return repeatedBytes_[index];
+    }
+
+    public const int RepeatedGroupFieldNumber = 46;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> repeatedGroup_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {
+      get { return repeatedGroup_; }
+    }
+    public int RepeatedGroupCount {
+      get { return repeatedGroup_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup GetRepeatedGroup(int index) {
+      return repeatedGroup_[index];
+    }
+
+    public const int RepeatedNestedMessageFieldNumber = 48;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> repeatedNestedMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {
+      get { return repeatedNestedMessage_; }
+    }
+    public int RepeatedNestedMessageCount {
+      get { return repeatedNestedMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage GetRepeatedNestedMessage(int index) {
+      return repeatedNestedMessage_[index];
+    }
+
+    public const int RepeatedForeignMessageFieldNumber = 49;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> repeatedForeignMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedForeignMessageList {
+      get { return repeatedForeignMessage_; }
+    }
+    public int RepeatedForeignMessageCount {
+      get { return repeatedForeignMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetRepeatedForeignMessage(int index) {
+      return repeatedForeignMessage_[index];
+    }
+
+    public const int RepeatedImportMessageFieldNumber = 50;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportMessage> repeatedImportMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ImportMessage> RepeatedImportMessageList {
+      get { return repeatedImportMessage_; }
+    }
+    public int RepeatedImportMessageCount {
+      get { return repeatedImportMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportMessage GetRepeatedImportMessage(int index) {
+      return repeatedImportMessage_[index];
+    }
+
+    public const int RepeatedNestedEnumFieldNumber = 51;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> repeatedNestedEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedNestedEnum_); }
+    }
+    public int RepeatedNestedEnumCount {
+      get { return repeatedNestedEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum GetRepeatedNestedEnum(int index) {
+      return repeatedNestedEnum_[index];
+    }
+
+    public const int RepeatedForeignEnumFieldNumber = 52;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> repeatedForeignEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedForeignEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedForeignEnum_); }
+    }
+    public int RepeatedForeignEnumCount {
+      get { return repeatedForeignEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetRepeatedForeignEnum(int index) {
+      return repeatedForeignEnum_[index];
+    }
+
+    public const int RepeatedImportEnumFieldNumber = 53;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportEnum> repeatedImportEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ImportEnum> RepeatedImportEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedImportEnum_); }
+    }
+    public int RepeatedImportEnumCount {
+      get { return repeatedImportEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportEnum GetRepeatedImportEnum(int index) {
+      return repeatedImportEnum_[index];
+    }
+
+    public const int RepeatedStringPieceFieldNumber = 54;
+    private pbc::PopsicleList<string> repeatedStringPiece_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedStringPieceList {
+      get { return pbc::Lists.AsReadOnly(repeatedStringPiece_); }
+    }
+    public int RepeatedStringPieceCount {
+      get { return repeatedStringPiece_.Count; }
+    }
+    public string GetRepeatedStringPiece(int index) {
+      return repeatedStringPiece_[index];
+    }
+
+    public const int RepeatedCordFieldNumber = 55;
+    private pbc::PopsicleList<string> repeatedCord_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedCordList {
+      get { return pbc::Lists.AsReadOnly(repeatedCord_); }
+    }
+    public int RepeatedCordCount {
+      get { return repeatedCord_.Count; }
+    }
+    public string GetRepeatedCord(int index) {
+      return repeatedCord_[index];
+    }
+
+    public const int RepeatedLazyMessageFieldNumber = 57;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> repeatedLazyMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> RepeatedLazyMessageList {
+      get { return repeatedLazyMessage_; }
+    }
+    public int RepeatedLazyMessageCount {
+      get { return repeatedLazyMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage GetRepeatedLazyMessage(int index) {
+      return repeatedLazyMessage_[index];
+    }
+
+    public const int DefaultInt32FieldNumber = 61;
+    private bool hasDefaultInt32;
+    private int defaultInt32_ = 41;
+    public bool HasDefaultInt32 {
+      get { return hasDefaultInt32; }
+    }
+    public int DefaultInt32 {
+      get { return defaultInt32_; }
+    }
+
+    public const int DefaultInt64FieldNumber = 62;
+    private bool hasDefaultInt64;
+    private long defaultInt64_ = 42L;
+    public bool HasDefaultInt64 {
+      get { return hasDefaultInt64; }
+    }
+    public long DefaultInt64 {
+      get { return defaultInt64_; }
+    }
+
+    public const int DefaultUint32FieldNumber = 63;
+    private bool hasDefaultUint32;
+    private uint defaultUint32_ = 43;
+    public bool HasDefaultUint32 {
+      get { return hasDefaultUint32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint DefaultUint32 {
+      get { return defaultUint32_; }
+    }
+
+    public const int DefaultUint64FieldNumber = 64;
+    private bool hasDefaultUint64;
+    private ulong defaultUint64_ = 44UL;
+    public bool HasDefaultUint64 {
+      get { return hasDefaultUint64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong DefaultUint64 {
+      get { return defaultUint64_; }
+    }
+
+    public const int DefaultSint32FieldNumber = 65;
+    private bool hasDefaultSint32;
+    private int defaultSint32_ = -45;
+    public bool HasDefaultSint32 {
+      get { return hasDefaultSint32; }
+    }
+    public int DefaultSint32 {
+      get { return defaultSint32_; }
+    }
+
+    public const int DefaultSint64FieldNumber = 66;
+    private bool hasDefaultSint64;
+    private long defaultSint64_ = 46L;
+    public bool HasDefaultSint64 {
+      get { return hasDefaultSint64; }
+    }
+    public long DefaultSint64 {
+      get { return defaultSint64_; }
+    }
+
+    public const int DefaultFixed32FieldNumber = 67;
+    private bool hasDefaultFixed32;
+    private uint defaultFixed32_ = 47;
+    public bool HasDefaultFixed32 {
+      get { return hasDefaultFixed32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint DefaultFixed32 {
+      get { return defaultFixed32_; }
+    }
+
+    public const int DefaultFixed64FieldNumber = 68;
+    private bool hasDefaultFixed64;
+    private ulong defaultFixed64_ = 48UL;
+    public bool HasDefaultFixed64 {
+      get { return hasDefaultFixed64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong DefaultFixed64 {
+      get { return defaultFixed64_; }
+    }
+
+    public const int DefaultSfixed32FieldNumber = 69;
+    private bool hasDefaultSfixed32;
+    private int defaultSfixed32_ = 49;
+    public bool HasDefaultSfixed32 {
+      get { return hasDefaultSfixed32; }
+    }
+    public int DefaultSfixed32 {
+      get { return defaultSfixed32_; }
+    }
+
+    public const int DefaultSfixed64FieldNumber = 70;
+    private bool hasDefaultSfixed64;
+    private long defaultSfixed64_ = -50L;
+    public bool HasDefaultSfixed64 {
+      get { return hasDefaultSfixed64; }
+    }
+    public long DefaultSfixed64 {
+      get { return defaultSfixed64_; }
+    }
+
+    public const int DefaultFloatFieldNumber = 71;
+    private bool hasDefaultFloat;
+    private float defaultFloat_ = 51.5F;
+    public bool HasDefaultFloat {
+      get { return hasDefaultFloat; }
+    }
+    public float DefaultFloat {
+      get { return defaultFloat_; }
+    }
+
+    public const int DefaultDoubleFieldNumber = 72;
+    private bool hasDefaultDouble;
+    private double defaultDouble_ = 52000D;
+    public bool HasDefaultDouble {
+      get { return hasDefaultDouble; }
+    }
+    public double DefaultDouble {
+      get { return defaultDouble_; }
+    }
+
+    public const int DefaultBoolFieldNumber = 73;
+    private bool hasDefaultBool;
+    private bool defaultBool_ = true;
+    public bool HasDefaultBool {
+      get { return hasDefaultBool; }
+    }
+    public bool DefaultBool {
+      get { return defaultBool_; }
+    }
+
+    public const int DefaultStringFieldNumber = 74;
+    private bool hasDefaultString;
+    private string defaultString_ = "hello";
+    public bool HasDefaultString {
+      get { return hasDefaultString; }
+    }
+    public string DefaultString {
+      get { return defaultString_; }
+    }
+
+    public const int DefaultBytesFieldNumber = 75;
+    private bool hasDefaultBytes;
+    private pb::ByteString defaultBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Descriptor.Fields[65].DefaultValue;
+    public bool HasDefaultBytes {
+      get { return hasDefaultBytes; }
+    }
+    public pb::ByteString DefaultBytes {
+      get { return defaultBytes_; }
+    }
+
+    public const int DefaultNestedEnumFieldNumber = 81;
+    private bool hasDefaultNestedEnum;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum defaultNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.BAR;
+    public bool HasDefaultNestedEnum {
+      get { return hasDefaultNestedEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum DefaultNestedEnum {
+      get { return defaultNestedEnum_; }
+    }
+
+    public const int DefaultForeignEnumFieldNumber = 82;
+    private bool hasDefaultForeignEnum;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignEnum defaultForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_BAR;
+    public bool HasDefaultForeignEnum {
+      get { return hasDefaultForeignEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum DefaultForeignEnum {
+      get { return defaultForeignEnum_; }
+    }
+
+    public const int DefaultImportEnumFieldNumber = 83;
+    private bool hasDefaultImportEnum;
+    private global::Google.ProtocolBuffers.TestProtos.ImportEnum defaultImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_BAR;
+    public bool HasDefaultImportEnum {
+      get { return hasDefaultImportEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportEnum DefaultImportEnum {
+      get { return defaultImportEnum_; }
+    }
+
+    public const int DefaultStringPieceFieldNumber = 84;
+    private bool hasDefaultStringPiece;
+    private string defaultStringPiece_ = "abc";
+    public bool HasDefaultStringPiece {
+      get { return hasDefaultStringPiece; }
+    }
+    public string DefaultStringPiece {
+      get { return defaultStringPiece_; }
+    }
+
+    public const int DefaultCordFieldNumber = 85;
+    private bool hasDefaultCord;
+    private string defaultCord_ = "123";
+    public bool HasDefaultCord {
+      get { return hasDefaultCord; }
+    }
+    public string DefaultCord {
+      get { return defaultCord_; }
+    }
+
+    public const int OneofUint32FieldNumber = 111;
+    private bool hasOneofUint32;
+    private uint oneofUint32_;
+    public bool HasOneofUint32 {
+      get { return hasOneofUint32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint OneofUint32 {
+      get { return oneofUint32_; }
+    }
+
+    public const int OneofNestedMessageFieldNumber = 112;
+    private bool hasOneofNestedMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage oneofNestedMessage_;
+    public bool HasOneofNestedMessage {
+      get { return hasOneofNestedMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OneofNestedMessage {
+      get { return oneofNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public const int OneofStringFieldNumber = 113;
+    private bool hasOneofString;
+    private string oneofString_ = "";
+    public bool HasOneofString {
+      get { return hasOneofString; }
+    }
+    public string OneofString {
+      get { return oneofString_; }
+    }
+
+    public const int OneofBytesFieldNumber = 114;
+    private bool hasOneofBytes;
+    private pb::ByteString oneofBytes_ = pb::ByteString.Empty;
+    public bool HasOneofBytes {
+      get { return hasOneofBytes; }
+    }
+    public pb::ByteString OneofBytes {
+      get { return oneofBytes_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testAllTypesFieldNames;
+      if (hasOptionalInt32) {
+        output.WriteInt32(1, field_names[35], OptionalInt32);
+      }
+      if (hasOptionalInt64) {
+        output.WriteInt64(2, field_names[36], OptionalInt64);
+      }
+      if (hasOptionalUint32) {
+        output.WriteUInt32(3, field_names[47], OptionalUint32);
+      }
+      if (hasOptionalUint64) {
+        output.WriteUInt64(4, field_names[48], OptionalUint64);
+      }
+      if (hasOptionalSint32) {
+        output.WriteSInt32(5, field_names[43], OptionalSint32);
+      }
+      if (hasOptionalSint64) {
+        output.WriteSInt64(6, field_names[44], OptionalSint64);
+      }
+      if (hasOptionalFixed32) {
+        output.WriteFixed32(7, field_names[28], OptionalFixed32);
+      }
+      if (hasOptionalFixed64) {
+        output.WriteFixed64(8, field_names[29], OptionalFixed64);
+      }
+      if (hasOptionalSfixed32) {
+        output.WriteSFixed32(9, field_names[41], OptionalSfixed32);
+      }
+      if (hasOptionalSfixed64) {
+        output.WriteSFixed64(10, field_names[42], OptionalSfixed64);
+      }
+      if (hasOptionalFloat) {
+        output.WriteFloat(11, field_names[30], OptionalFloat);
+      }
+      if (hasOptionalDouble) {
+        output.WriteDouble(12, field_names[27], OptionalDouble);
+      }
+      if (hasOptionalBool) {
+        output.WriteBool(13, field_names[24], OptionalBool);
+      }
+      if (hasOptionalString) {
+        output.WriteString(14, field_names[45], OptionalString);
+      }
+      if (hasOptionalBytes) {
+        output.WriteBytes(15, field_names[25], OptionalBytes);
+      }
+      if (hasOptionalGroup) {
+        output.WriteGroup(16, field_names[49], OptionalGroup);
+      }
+      if (hasOptionalNestedMessage) {
+        output.WriteMessage(18, field_names[39], OptionalNestedMessage);
+      }
+      if (hasOptionalForeignMessage) {
+        output.WriteMessage(19, field_names[32], OptionalForeignMessage);
+      }
+      if (hasOptionalImportMessage) {
+        output.WriteMessage(20, field_names[34], OptionalImportMessage);
+      }
+      if (hasOptionalNestedEnum) {
+        output.WriteEnum(21, field_names[38], (int) OptionalNestedEnum, OptionalNestedEnum);
+      }
+      if (hasOptionalForeignEnum) {
+        output.WriteEnum(22, field_names[31], (int) OptionalForeignEnum, OptionalForeignEnum);
+      }
+      if (hasOptionalImportEnum) {
+        output.WriteEnum(23, field_names[33], (int) OptionalImportEnum, OptionalImportEnum);
+      }
+      if (hasOptionalStringPiece) {
+        output.WriteString(24, field_names[46], OptionalStringPiece);
+      }
+      if (hasOptionalCord) {
+        output.WriteString(25, field_names[26], OptionalCord);
+      }
+      if (hasOptionalPublicImportMessage) {
+        output.WriteMessage(26, field_names[40], OptionalPublicImportMessage);
+      }
+      if (hasOptionalLazyMessage) {
+        output.WriteMessage(27, field_names[37], OptionalLazyMessage);
+      }
+      if (repeatedInt32_.Count > 0) {
+        output.WriteInt32Array(31, field_names[61], repeatedInt32_);
+      }
+      if (repeatedInt64_.Count > 0) {
+        output.WriteInt64Array(32, field_names[62], repeatedInt64_);
+      }
+      if (repeatedUint32_.Count > 0) {
+        output.WriteUInt32Array(33, field_names[72], repeatedUint32_);
+      }
+      if (repeatedUint64_.Count > 0) {
+        output.WriteUInt64Array(34, field_names[73], repeatedUint64_);
+      }
+      if (repeatedSint32_.Count > 0) {
+        output.WriteSInt32Array(35, field_names[68], repeatedSint32_);
+      }
+      if (repeatedSint64_.Count > 0) {
+        output.WriteSInt64Array(36, field_names[69], repeatedSint64_);
+      }
+      if (repeatedFixed32_.Count > 0) {
+        output.WriteFixed32Array(37, field_names[54], repeatedFixed32_);
+      }
+      if (repeatedFixed64_.Count > 0) {
+        output.WriteFixed64Array(38, field_names[55], repeatedFixed64_);
+      }
+      if (repeatedSfixed32_.Count > 0) {
+        output.WriteSFixed32Array(39, field_names[66], repeatedSfixed32_);
+      }
+      if (repeatedSfixed64_.Count > 0) {
+        output.WriteSFixed64Array(40, field_names[67], repeatedSfixed64_);
+      }
+      if (repeatedFloat_.Count > 0) {
+        output.WriteFloatArray(41, field_names[56], repeatedFloat_);
+      }
+      if (repeatedDouble_.Count > 0) {
+        output.WriteDoubleArray(42, field_names[53], repeatedDouble_);
+      }
+      if (repeatedBool_.Count > 0) {
+        output.WriteBoolArray(43, field_names[50], repeatedBool_);
+      }
+      if (repeatedString_.Count > 0) {
+        output.WriteStringArray(44, field_names[70], repeatedString_);
+      }
+      if (repeatedBytes_.Count > 0) {
+        output.WriteBytesArray(45, field_names[51], repeatedBytes_);
+      }
+      if (repeatedGroup_.Count > 0) {
+        output.WriteGroupArray(46, field_names[74], repeatedGroup_);
+      }
+      if (repeatedNestedMessage_.Count > 0) {
+        output.WriteMessageArray(48, field_names[65], repeatedNestedMessage_);
+      }
+      if (repeatedForeignMessage_.Count > 0) {
+        output.WriteMessageArray(49, field_names[58], repeatedForeignMessage_);
+      }
+      if (repeatedImportMessage_.Count > 0) {
+        output.WriteMessageArray(50, field_names[60], repeatedImportMessage_);
+      }
+      if (repeatedNestedEnum_.Count > 0) {
+        output.WriteEnumArray(51, field_names[64], repeatedNestedEnum_);
+      }
+      if (repeatedForeignEnum_.Count > 0) {
+        output.WriteEnumArray(52, field_names[57], repeatedForeignEnum_);
+      }
+      if (repeatedImportEnum_.Count > 0) {
+        output.WriteEnumArray(53, field_names[59], repeatedImportEnum_);
+      }
+      if (repeatedStringPiece_.Count > 0) {
+        output.WriteStringArray(54, field_names[71], repeatedStringPiece_);
+      }
+      if (repeatedCord_.Count > 0) {
+        output.WriteStringArray(55, field_names[52], repeatedCord_);
+      }
+      if (repeatedLazyMessage_.Count > 0) {
+        output.WriteMessageArray(57, field_names[63], repeatedLazyMessage_);
+      }
+      if (hasDefaultInt32) {
+        output.WriteInt32(61, field_names[9], DefaultInt32);
+      }
+      if (hasDefaultInt64) {
+        output.WriteInt64(62, field_names[10], DefaultInt64);
+      }
+      if (hasDefaultUint32) {
+        output.WriteUInt32(63, field_names[18], DefaultUint32);
+      }
+      if (hasDefaultUint64) {
+        output.WriteUInt64(64, field_names[19], DefaultUint64);
+      }
+      if (hasDefaultSint32) {
+        output.WriteSInt32(65, field_names[14], DefaultSint32);
+      }
+      if (hasDefaultSint64) {
+        output.WriteSInt64(66, field_names[15], DefaultSint64);
+      }
+      if (hasDefaultFixed32) {
+        output.WriteFixed32(67, field_names[4], DefaultFixed32);
+      }
+      if (hasDefaultFixed64) {
+        output.WriteFixed64(68, field_names[5], DefaultFixed64);
+      }
+      if (hasDefaultSfixed32) {
+        output.WriteSFixed32(69, field_names[12], DefaultSfixed32);
+      }
+      if (hasDefaultSfixed64) {
+        output.WriteSFixed64(70, field_names[13], DefaultSfixed64);
+      }
+      if (hasDefaultFloat) {
+        output.WriteFloat(71, field_names[6], DefaultFloat);
+      }
+      if (hasDefaultDouble) {
+        output.WriteDouble(72, field_names[3], DefaultDouble);
+      }
+      if (hasDefaultBool) {
+        output.WriteBool(73, field_names[0], DefaultBool);
+      }
+      if (hasDefaultString) {
+        output.WriteString(74, field_names[16], DefaultString);
+      }
+      if (hasDefaultBytes) {
+        output.WriteBytes(75, field_names[1], DefaultBytes);
+      }
+      if (hasDefaultNestedEnum) {
+        output.WriteEnum(81, field_names[11], (int) DefaultNestedEnum, DefaultNestedEnum);
+      }
+      if (hasDefaultForeignEnum) {
+        output.WriteEnum(82, field_names[7], (int) DefaultForeignEnum, DefaultForeignEnum);
+      }
+      if (hasDefaultImportEnum) {
+        output.WriteEnum(83, field_names[8], (int) DefaultImportEnum, DefaultImportEnum);
+      }
+      if (hasDefaultStringPiece) {
+        output.WriteString(84, field_names[17], DefaultStringPiece);
+      }
+      if (hasDefaultCord) {
+        output.WriteString(85, field_names[2], DefaultCord);
+      }
+      if (hasOneofUint32) {
+        output.WriteUInt32(111, field_names[23], OneofUint32);
+      }
+      if (hasOneofNestedMessage) {
+        output.WriteMessage(112, field_names[21], OneofNestedMessage);
+      }
+      if (hasOneofString) {
+        output.WriteString(113, field_names[22], OneofString);
+      }
+      if (hasOneofBytes) {
+        output.WriteBytes(114, field_names[20], OneofBytes);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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);
+      }
+      if (hasOptionalPublicImportMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(26, OptionalPublicImportMessage);
+      }
+      if (hasOptionalLazyMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(27, OptionalLazyMessage);
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in RepeatedInt32List) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedInt32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in RepeatedInt64List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedInt64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (uint element in RepeatedUint32List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedUint32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (ulong element in RepeatedUint64List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedUint64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in RepeatedSint32List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedSint32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in RepeatedSint64List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedSint64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedFixed32_.Count;
+        size += dataSize;
+        size += 2 * repeatedFixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * repeatedFixed64_.Count;
+        size += dataSize;
+        size += 2 * repeatedFixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedSfixed32_.Count;
+        size += dataSize;
+        size += 2 * repeatedSfixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * repeatedSfixed64_.Count;
+        size += dataSize;
+        size += 2 * repeatedSfixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedFloat_.Count;
+        size += dataSize;
+        size += 2 * repeatedFloat_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * repeatedDouble_.Count;
+        size += dataSize;
+        size += 2 * repeatedDouble_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 1 * repeatedBool_.Count;
+        size += dataSize;
+        size += 2 * repeatedBool_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedStringList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedString_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (pb::ByteString element in RepeatedBytesList) {
+          dataSize += pb::CodedOutputStream.ComputeBytesSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedBytes_.Count;
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup element in RepeatedGroupList) {
+        size += pb::CodedOutputStream.ComputeGroupSize(46, element);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage element in RepeatedNestedMessageList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(48, element);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.ForeignMessage element in RepeatedForeignMessageList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(49, element);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.ImportMessage element in RepeatedImportMessageList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(50, element);
+      }
+      {
+        int dataSize = 0;
+        if (repeatedNestedEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum element in repeatedNestedEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2 * repeatedNestedEnum_.Count;
+        }
+      }
+      {
+        int dataSize = 0;
+        if (repeatedForeignEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignEnum element in repeatedForeignEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2 * repeatedForeignEnum_.Count;
+        }
+      }
+      {
+        int dataSize = 0;
+        if (repeatedImportEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ImportEnum element in repeatedImportEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2 * repeatedImportEnum_.Count;
+        }
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedStringPieceList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedStringPiece_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedCordList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedCord_.Count;
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage element in RepeatedLazyMessageList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(57, 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);
+      }
+      if (hasOneofUint32) {
+        size += pb::CodedOutputStream.ComputeUInt32Size(111, OneofUint32);
+      }
+      if (hasOneofNestedMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(112, OneofNestedMessage);
+      }
+      if (hasOneofString) {
+        size += pb::CodedOutputStream.ComputeStringSize(113, OneofString);
+      }
+      if (hasOneofBytes) {
+        size += pb::CodedOutputStream.ComputeBytesSize(114, OneofBytes);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestAllTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllTypes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestAllTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestAllTypes MakeReadOnly() {
+      repeatedInt32_.MakeReadOnly();
+      repeatedInt64_.MakeReadOnly();
+      repeatedUint32_.MakeReadOnly();
+      repeatedUint64_.MakeReadOnly();
+      repeatedSint32_.MakeReadOnly();
+      repeatedSint64_.MakeReadOnly();
+      repeatedFixed32_.MakeReadOnly();
+      repeatedFixed64_.MakeReadOnly();
+      repeatedSfixed32_.MakeReadOnly();
+      repeatedSfixed64_.MakeReadOnly();
+      repeatedFloat_.MakeReadOnly();
+      repeatedDouble_.MakeReadOnly();
+      repeatedBool_.MakeReadOnly();
+      repeatedString_.MakeReadOnly();
+      repeatedBytes_.MakeReadOnly();
+      repeatedGroup_.MakeReadOnly();
+      repeatedNestedMessage_.MakeReadOnly();
+      repeatedForeignMessage_.MakeReadOnly();
+      repeatedImportMessage_.MakeReadOnly();
+      repeatedNestedEnum_.MakeReadOnly();
+      repeatedForeignEnum_.MakeReadOnly();
+      repeatedImportEnum_.MakeReadOnly();
+      repeatedStringPiece_.MakeReadOnly();
+      repeatedCord_.MakeReadOnly();
+      repeatedLazyMessage_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestAllTypes prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestAllTypes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestAllTypes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestAllTypes result;
+
+      private TestAllTypes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestAllTypes original = result;
+          result = new TestAllTypes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestAllTypes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Descriptor; }
+      }
+
+      public override TestAllTypes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+      }
+
+      public override TestAllTypes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestAllTypes) {
+          return MergeFrom((TestAllTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestAllTypes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) return this;
+        PrepareBuilder();
+        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.HasOptionalPublicImportMessage) {
+          MergeOptionalPublicImportMessage(other.OptionalPublicImportMessage);
+        }
+        if (other.HasOptionalLazyMessage) {
+          MergeOptionalLazyMessage(other.OptionalLazyMessage);
+        }
+        if (other.repeatedInt32_.Count != 0) {
+          result.repeatedInt32_.Add(other.repeatedInt32_);
+        }
+        if (other.repeatedInt64_.Count != 0) {
+          result.repeatedInt64_.Add(other.repeatedInt64_);
+        }
+        if (other.repeatedUint32_.Count != 0) {
+          result.repeatedUint32_.Add(other.repeatedUint32_);
+        }
+        if (other.repeatedUint64_.Count != 0) {
+          result.repeatedUint64_.Add(other.repeatedUint64_);
+        }
+        if (other.repeatedSint32_.Count != 0) {
+          result.repeatedSint32_.Add(other.repeatedSint32_);
+        }
+        if (other.repeatedSint64_.Count != 0) {
+          result.repeatedSint64_.Add(other.repeatedSint64_);
+        }
+        if (other.repeatedFixed32_.Count != 0) {
+          result.repeatedFixed32_.Add(other.repeatedFixed32_);
+        }
+        if (other.repeatedFixed64_.Count != 0) {
+          result.repeatedFixed64_.Add(other.repeatedFixed64_);
+        }
+        if (other.repeatedSfixed32_.Count != 0) {
+          result.repeatedSfixed32_.Add(other.repeatedSfixed32_);
+        }
+        if (other.repeatedSfixed64_.Count != 0) {
+          result.repeatedSfixed64_.Add(other.repeatedSfixed64_);
+        }
+        if (other.repeatedFloat_.Count != 0) {
+          result.repeatedFloat_.Add(other.repeatedFloat_);
+        }
+        if (other.repeatedDouble_.Count != 0) {
+          result.repeatedDouble_.Add(other.repeatedDouble_);
+        }
+        if (other.repeatedBool_.Count != 0) {
+          result.repeatedBool_.Add(other.repeatedBool_);
+        }
+        if (other.repeatedString_.Count != 0) {
+          result.repeatedString_.Add(other.repeatedString_);
+        }
+        if (other.repeatedBytes_.Count != 0) {
+          result.repeatedBytes_.Add(other.repeatedBytes_);
+        }
+        if (other.repeatedGroup_.Count != 0) {
+          result.repeatedGroup_.Add(other.repeatedGroup_);
+        }
+        if (other.repeatedNestedMessage_.Count != 0) {
+          result.repeatedNestedMessage_.Add(other.repeatedNestedMessage_);
+        }
+        if (other.repeatedForeignMessage_.Count != 0) {
+          result.repeatedForeignMessage_.Add(other.repeatedForeignMessage_);
+        }
+        if (other.repeatedImportMessage_.Count != 0) {
+          result.repeatedImportMessage_.Add(other.repeatedImportMessage_);
+        }
+        if (other.repeatedNestedEnum_.Count != 0) {
+          result.repeatedNestedEnum_.Add(other.repeatedNestedEnum_);
+        }
+        if (other.repeatedForeignEnum_.Count != 0) {
+          result.repeatedForeignEnum_.Add(other.repeatedForeignEnum_);
+        }
+        if (other.repeatedImportEnum_.Count != 0) {
+          result.repeatedImportEnum_.Add(other.repeatedImportEnum_);
+        }
+        if (other.repeatedStringPiece_.Count != 0) {
+          result.repeatedStringPiece_.Add(other.repeatedStringPiece_);
+        }
+        if (other.repeatedCord_.Count != 0) {
+          result.repeatedCord_.Add(other.repeatedCord_);
+        }
+        if (other.repeatedLazyMessage_.Count != 0) {
+          result.repeatedLazyMessage_.Add(other.repeatedLazyMessage_);
+        }
+        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;
+        }
+        if (other.HasOneofUint32) {
+          OneofUint32 = other.OneofUint32;
+        }
+        if (other.HasOneofNestedMessage) {
+          MergeOneofNestedMessage(other.OneofNestedMessage);
+        }
+        if (other.HasOneofString) {
+          OneofString = other.OneofString;
+        }
+        if (other.HasOneofBytes) {
+          OneofBytes = other.OneofBytes;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testAllTypesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testAllTypesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasOptionalInt32 = input.ReadInt32(ref result.optionalInt32_);
+              break;
+            }
+            case 16: {
+              result.hasOptionalInt64 = input.ReadInt64(ref result.optionalInt64_);
+              break;
+            }
+            case 24: {
+              result.hasOptionalUint32 = input.ReadUInt32(ref result.optionalUint32_);
+              break;
+            }
+            case 32: {
+              result.hasOptionalUint64 = input.ReadUInt64(ref result.optionalUint64_);
+              break;
+            }
+            case 40: {
+              result.hasOptionalSint32 = input.ReadSInt32(ref result.optionalSint32_);
+              break;
+            }
+            case 48: {
+              result.hasOptionalSint64 = input.ReadSInt64(ref result.optionalSint64_);
+              break;
+            }
+            case 61: {
+              result.hasOptionalFixed32 = input.ReadFixed32(ref result.optionalFixed32_);
+              break;
+            }
+            case 65: {
+              result.hasOptionalFixed64 = input.ReadFixed64(ref result.optionalFixed64_);
+              break;
+            }
+            case 77: {
+              result.hasOptionalSfixed32 = input.ReadSFixed32(ref result.optionalSfixed32_);
+              break;
+            }
+            case 81: {
+              result.hasOptionalSfixed64 = input.ReadSFixed64(ref result.optionalSfixed64_);
+              break;
+            }
+            case 93: {
+              result.hasOptionalFloat = input.ReadFloat(ref result.optionalFloat_);
+              break;
+            }
+            case 97: {
+              result.hasOptionalDouble = input.ReadDouble(ref result.optionalDouble_);
+              break;
+            }
+            case 104: {
+              result.hasOptionalBool = input.ReadBool(ref result.optionalBool_);
+              break;
+            }
+            case 114: {
+              result.hasOptionalString = input.ReadString(ref result.optionalString_);
+              break;
+            }
+            case 122: {
+              result.hasOptionalBytes = input.ReadBytes(ref result.optionalBytes_);
+              break;
+            }
+            case 131: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.CreateBuilder();
+              if (result.hasOptionalGroup) {
+                subBuilder.MergeFrom(OptionalGroup);
+              }
+              input.ReadGroup(16, subBuilder, extensionRegistry);
+              OptionalGroup = subBuilder.BuildPartial();
+              break;
+            }
+            case 146: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (result.hasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 154: {
+              global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder();
+              if (result.hasOptionalForeignMessage) {
+                subBuilder.MergeFrom(OptionalForeignMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalForeignMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 162: {
+              global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.ImportMessage.CreateBuilder();
+              if (result.hasOptionalImportMessage) {
+                subBuilder.MergeFrom(OptionalImportMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalImportMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 168: {
+              object unknown;
+              if(input.ReadEnum(ref result.optionalNestedEnum_, out unknown)) {
+                result.hasOptionalNestedEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(21, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 176: {
+              object unknown;
+              if(input.ReadEnum(ref result.optionalForeignEnum_, out unknown)) {
+                result.hasOptionalForeignEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(22, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 184: {
+              object unknown;
+              if(input.ReadEnum(ref result.optionalImportEnum_, out unknown)) {
+                result.hasOptionalImportEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(23, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 194: {
+              result.hasOptionalStringPiece = input.ReadString(ref result.optionalStringPiece_);
+              break;
+            }
+            case 202: {
+              result.hasOptionalCord = input.ReadString(ref result.optionalCord_);
+              break;
+            }
+            case 210: {
+              global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.CreateBuilder();
+              if (result.hasOptionalPublicImportMessage) {
+                subBuilder.MergeFrom(OptionalPublicImportMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalPublicImportMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 218: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (result.hasOptionalLazyMessage) {
+                subBuilder.MergeFrom(OptionalLazyMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalLazyMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 250:
+            case 248: {
+              input.ReadInt32Array(tag, field_name, result.repeatedInt32_);
+              break;
+            }
+            case 258:
+            case 256: {
+              input.ReadInt64Array(tag, field_name, result.repeatedInt64_);
+              break;
+            }
+            case 266:
+            case 264: {
+              input.ReadUInt32Array(tag, field_name, result.repeatedUint32_);
+              break;
+            }
+            case 274:
+            case 272: {
+              input.ReadUInt64Array(tag, field_name, result.repeatedUint64_);
+              break;
+            }
+            case 282:
+            case 280: {
+              input.ReadSInt32Array(tag, field_name, result.repeatedSint32_);
+              break;
+            }
+            case 290:
+            case 288: {
+              input.ReadSInt64Array(tag, field_name, result.repeatedSint64_);
+              break;
+            }
+            case 298:
+            case 301: {
+              input.ReadFixed32Array(tag, field_name, result.repeatedFixed32_);
+              break;
+            }
+            case 306:
+            case 305: {
+              input.ReadFixed64Array(tag, field_name, result.repeatedFixed64_);
+              break;
+            }
+            case 314:
+            case 317: {
+              input.ReadSFixed32Array(tag, field_name, result.repeatedSfixed32_);
+              break;
+            }
+            case 322:
+            case 321: {
+              input.ReadSFixed64Array(tag, field_name, result.repeatedSfixed64_);
+              break;
+            }
+            case 330:
+            case 333: {
+              input.ReadFloatArray(tag, field_name, result.repeatedFloat_);
+              break;
+            }
+            case 338:
+            case 337: {
+              input.ReadDoubleArray(tag, field_name, result.repeatedDouble_);
+              break;
+            }
+            case 346:
+            case 344: {
+              input.ReadBoolArray(tag, field_name, result.repeatedBool_);
+              break;
+            }
+            case 354: {
+              input.ReadStringArray(tag, field_name, result.repeatedString_);
+              break;
+            }
+            case 362: {
+              input.ReadBytesArray(tag, field_name, result.repeatedBytes_);
+              break;
+            }
+            case 371: {
+              input.ReadGroupArray(tag, field_name, result.repeatedGroup_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 386: {
+              input.ReadMessageArray(tag, field_name, result.repeatedNestedMessage_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 394: {
+              input.ReadMessageArray(tag, field_name, result.repeatedForeignMessage_, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 402: {
+              input.ReadMessageArray(tag, field_name, result.repeatedImportMessage_, global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 410:
+            case 408: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>(tag, field_name, result.repeatedNestedEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(51, (ulong)(int)rawValue);
+              }
+              break;
+            }
+            case 418:
+            case 416: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>(tag, field_name, result.repeatedForeignEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(52, (ulong)(int)rawValue);
+              }
+              break;
+            }
+            case 426:
+            case 424: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ImportEnum>(tag, field_name, result.repeatedImportEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(53, (ulong)(int)rawValue);
+              }
+              break;
+            }
+            case 434: {
+              input.ReadStringArray(tag, field_name, result.repeatedStringPiece_);
+              break;
+            }
+            case 442: {
+              input.ReadStringArray(tag, field_name, result.repeatedCord_);
+              break;
+            }
+            case 458: {
+              input.ReadMessageArray(tag, field_name, result.repeatedLazyMessage_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 488: {
+              result.hasDefaultInt32 = input.ReadInt32(ref result.defaultInt32_);
+              break;
+            }
+            case 496: {
+              result.hasDefaultInt64 = input.ReadInt64(ref result.defaultInt64_);
+              break;
+            }
+            case 504: {
+              result.hasDefaultUint32 = input.ReadUInt32(ref result.defaultUint32_);
+              break;
+            }
+            case 512: {
+              result.hasDefaultUint64 = input.ReadUInt64(ref result.defaultUint64_);
+              break;
+            }
+            case 520: {
+              result.hasDefaultSint32 = input.ReadSInt32(ref result.defaultSint32_);
+              break;
+            }
+            case 528: {
+              result.hasDefaultSint64 = input.ReadSInt64(ref result.defaultSint64_);
+              break;
+            }
+            case 541: {
+              result.hasDefaultFixed32 = input.ReadFixed32(ref result.defaultFixed32_);
+              break;
+            }
+            case 545: {
+              result.hasDefaultFixed64 = input.ReadFixed64(ref result.defaultFixed64_);
+              break;
+            }
+            case 557: {
+              result.hasDefaultSfixed32 = input.ReadSFixed32(ref result.defaultSfixed32_);
+              break;
+            }
+            case 561: {
+              result.hasDefaultSfixed64 = input.ReadSFixed64(ref result.defaultSfixed64_);
+              break;
+            }
+            case 573: {
+              result.hasDefaultFloat = input.ReadFloat(ref result.defaultFloat_);
+              break;
+            }
+            case 577: {
+              result.hasDefaultDouble = input.ReadDouble(ref result.defaultDouble_);
+              break;
+            }
+            case 584: {
+              result.hasDefaultBool = input.ReadBool(ref result.defaultBool_);
+              break;
+            }
+            case 594: {
+              result.hasDefaultString = input.ReadString(ref result.defaultString_);
+              break;
+            }
+            case 602: {
+              result.hasDefaultBytes = input.ReadBytes(ref result.defaultBytes_);
+              break;
+            }
+            case 648: {
+              object unknown;
+              if(input.ReadEnum(ref result.defaultNestedEnum_, out unknown)) {
+                result.hasDefaultNestedEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(81, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 656: {
+              object unknown;
+              if(input.ReadEnum(ref result.defaultForeignEnum_, out unknown)) {
+                result.hasDefaultForeignEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(82, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 664: {
+              object unknown;
+              if(input.ReadEnum(ref result.defaultImportEnum_, out unknown)) {
+                result.hasDefaultImportEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(83, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 674: {
+              result.hasDefaultStringPiece = input.ReadString(ref result.defaultStringPiece_);
+              break;
+            }
+            case 682: {
+              result.hasDefaultCord = input.ReadString(ref result.defaultCord_);
+              break;
+            }
+            case 888: {
+              result.hasOneofUint32 = input.ReadUInt32(ref result.oneofUint32_);
+              break;
+            }
+            case 898: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (result.hasOneofNestedMessage) {
+                subBuilder.MergeFrom(OneofNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OneofNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 906: {
+              result.hasOneofString = input.ReadString(ref result.oneofString_);
+              break;
+            }
+            case 914: {
+              result.hasOneofBytes = input.ReadBytes(ref result.oneofBytes_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasOptionalInt32 {
+        get { return result.hasOptionalInt32; }
+      }
+      public int OptionalInt32 {
+        get { return result.OptionalInt32; }
+        set { SetOptionalInt32(value); }
+      }
+      public Builder SetOptionalInt32(int value) {
+        PrepareBuilder();
+        result.hasOptionalInt32 = true;
+        result.optionalInt32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt32() {
+        PrepareBuilder();
+        result.hasOptionalInt32 = false;
+        result.optionalInt32_ = 0;
+        return this;
+      }
+
+      public bool HasOptionalInt64 {
+        get { return result.hasOptionalInt64; }
+      }
+      public long OptionalInt64 {
+        get { return result.OptionalInt64; }
+        set { SetOptionalInt64(value); }
+      }
+      public Builder SetOptionalInt64(long value) {
+        PrepareBuilder();
+        result.hasOptionalInt64 = true;
+        result.optionalInt64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt64() {
+        PrepareBuilder();
+        result.hasOptionalInt64 = false;
+        result.optionalInt64_ = 0L;
+        return this;
+      }
+
+      public bool HasOptionalUint32 {
+        get { return result.hasOptionalUint32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint OptionalUint32 {
+        get { return result.OptionalUint32; }
+        set { SetOptionalUint32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOptionalUint32(uint value) {
+        PrepareBuilder();
+        result.hasOptionalUint32 = true;
+        result.optionalUint32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalUint32() {
+        PrepareBuilder();
+        result.hasOptionalUint32 = false;
+        result.optionalUint32_ = 0;
+        return this;
+      }
+
+      public bool HasOptionalUint64 {
+        get { return result.hasOptionalUint64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong OptionalUint64 {
+        get { return result.OptionalUint64; }
+        set { SetOptionalUint64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOptionalUint64(ulong value) {
+        PrepareBuilder();
+        result.hasOptionalUint64 = true;
+        result.optionalUint64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalUint64() {
+        PrepareBuilder();
+        result.hasOptionalUint64 = false;
+        result.optionalUint64_ = 0UL;
+        return this;
+      }
+
+      public bool HasOptionalSint32 {
+        get { return result.hasOptionalSint32; }
+      }
+      public int OptionalSint32 {
+        get { return result.OptionalSint32; }
+        set { SetOptionalSint32(value); }
+      }
+      public Builder SetOptionalSint32(int value) {
+        PrepareBuilder();
+        result.hasOptionalSint32 = true;
+        result.optionalSint32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSint32() {
+        PrepareBuilder();
+        result.hasOptionalSint32 = false;
+        result.optionalSint32_ = 0;
+        return this;
+      }
+
+      public bool HasOptionalSint64 {
+        get { return result.hasOptionalSint64; }
+      }
+      public long OptionalSint64 {
+        get { return result.OptionalSint64; }
+        set { SetOptionalSint64(value); }
+      }
+      public Builder SetOptionalSint64(long value) {
+        PrepareBuilder();
+        result.hasOptionalSint64 = true;
+        result.optionalSint64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSint64() {
+        PrepareBuilder();
+        result.hasOptionalSint64 = false;
+        result.optionalSint64_ = 0L;
+        return this;
+      }
+
+      public bool HasOptionalFixed32 {
+        get { return result.hasOptionalFixed32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint OptionalFixed32 {
+        get { return result.OptionalFixed32; }
+        set { SetOptionalFixed32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOptionalFixed32(uint value) {
+        PrepareBuilder();
+        result.hasOptionalFixed32 = true;
+        result.optionalFixed32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFixed32() {
+        PrepareBuilder();
+        result.hasOptionalFixed32 = false;
+        result.optionalFixed32_ = 0;
+        return this;
+      }
+
+      public bool HasOptionalFixed64 {
+        get { return result.hasOptionalFixed64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong OptionalFixed64 {
+        get { return result.OptionalFixed64; }
+        set { SetOptionalFixed64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOptionalFixed64(ulong value) {
+        PrepareBuilder();
+        result.hasOptionalFixed64 = true;
+        result.optionalFixed64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFixed64() {
+        PrepareBuilder();
+        result.hasOptionalFixed64 = false;
+        result.optionalFixed64_ = 0UL;
+        return this;
+      }
+
+      public bool HasOptionalSfixed32 {
+        get { return result.hasOptionalSfixed32; }
+      }
+      public int OptionalSfixed32 {
+        get { return result.OptionalSfixed32; }
+        set { SetOptionalSfixed32(value); }
+      }
+      public Builder SetOptionalSfixed32(int value) {
+        PrepareBuilder();
+        result.hasOptionalSfixed32 = true;
+        result.optionalSfixed32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSfixed32() {
+        PrepareBuilder();
+        result.hasOptionalSfixed32 = false;
+        result.optionalSfixed32_ = 0;
+        return this;
+      }
+
+      public bool HasOptionalSfixed64 {
+        get { return result.hasOptionalSfixed64; }
+      }
+      public long OptionalSfixed64 {
+        get { return result.OptionalSfixed64; }
+        set { SetOptionalSfixed64(value); }
+      }
+      public Builder SetOptionalSfixed64(long value) {
+        PrepareBuilder();
+        result.hasOptionalSfixed64 = true;
+        result.optionalSfixed64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSfixed64() {
+        PrepareBuilder();
+        result.hasOptionalSfixed64 = false;
+        result.optionalSfixed64_ = 0L;
+        return this;
+      }
+
+      public bool HasOptionalFloat {
+        get { return result.hasOptionalFloat; }
+      }
+      public float OptionalFloat {
+        get { return result.OptionalFloat; }
+        set { SetOptionalFloat(value); }
+      }
+      public Builder SetOptionalFloat(float value) {
+        PrepareBuilder();
+        result.hasOptionalFloat = true;
+        result.optionalFloat_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFloat() {
+        PrepareBuilder();
+        result.hasOptionalFloat = false;
+        result.optionalFloat_ = 0F;
+        return this;
+      }
+
+      public bool HasOptionalDouble {
+        get { return result.hasOptionalDouble; }
+      }
+      public double OptionalDouble {
+        get { return result.OptionalDouble; }
+        set { SetOptionalDouble(value); }
+      }
+      public Builder SetOptionalDouble(double value) {
+        PrepareBuilder();
+        result.hasOptionalDouble = true;
+        result.optionalDouble_ = value;
+        return this;
+      }
+      public Builder ClearOptionalDouble() {
+        PrepareBuilder();
+        result.hasOptionalDouble = false;
+        result.optionalDouble_ = 0D;
+        return this;
+      }
+
+      public bool HasOptionalBool {
+        get { return result.hasOptionalBool; }
+      }
+      public bool OptionalBool {
+        get { return result.OptionalBool; }
+        set { SetOptionalBool(value); }
+      }
+      public Builder SetOptionalBool(bool value) {
+        PrepareBuilder();
+        result.hasOptionalBool = true;
+        result.optionalBool_ = value;
+        return this;
+      }
+      public Builder ClearOptionalBool() {
+        PrepareBuilder();
+        result.hasOptionalBool = false;
+        result.optionalBool_ = false;
+        return this;
+      }
+
+      public bool HasOptionalString {
+        get { return result.hasOptionalString; }
+      }
+      public string OptionalString {
+        get { return result.OptionalString; }
+        set { SetOptionalString(value); }
+      }
+      public Builder SetOptionalString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalString = true;
+        result.optionalString_ = value;
+        return this;
+      }
+      public Builder ClearOptionalString() {
+        PrepareBuilder();
+        result.hasOptionalString = false;
+        result.optionalString_ = "";
+        return this;
+      }
+
+      public bool HasOptionalBytes {
+        get { return result.hasOptionalBytes; }
+      }
+      public pb::ByteString OptionalBytes {
+        get { return result.OptionalBytes; }
+        set { SetOptionalBytes(value); }
+      }
+      public Builder SetOptionalBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalBytes = true;
+        result.optionalBytes_ = value;
+        return this;
+      }
+      public Builder ClearOptionalBytes() {
+        PrepareBuilder();
+        result.hasOptionalBytes = false;
+        result.optionalBytes_ = pb::ByteString.Empty;
+        return this;
+      }
+
+      public bool HasOptionalGroup {
+       get { return result.hasOptionalGroup; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup OptionalGroup {
+        get { return result.OptionalGroup; }
+        set { SetOptionalGroup(value); }
+      }
+      public Builder SetOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = value;
+        return this;
+      }
+      public Builder SetOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalGroup &&
+            result.optionalGroup_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance) {
+            result.optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.CreateBuilder(result.optionalGroup_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalGroup_ = value;
+        }
+        result.hasOptionalGroup = true;
+        return this;
+      }
+      public Builder ClearOptionalGroup() {
+        PrepareBuilder();
+        result.hasOptionalGroup = false;
+        result.optionalGroup_ = null;
+        return this;
+      }
+
+      public bool HasOptionalNestedMessage {
+       get { return result.hasOptionalNestedMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) {
+            result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = null;
+        return this;
+      }
+
+      public bool HasOptionalForeignMessage {
+       get { return result.hasOptionalForeignMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage OptionalForeignMessage {
+        get { return result.OptionalForeignMessage; }
+        set { SetOptionalForeignMessage(value); }
+      }
+      public Builder SetOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalForeignMessage = true;
+        result.optionalForeignMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalForeignMessage = true;
+        result.optionalForeignMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalForeignMessage &&
+            result.optionalForeignMessage_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {
+            result.optionalForeignMessage_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.optionalForeignMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalForeignMessage_ = value;
+        }
+        result.hasOptionalForeignMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalForeignMessage() {
+        PrepareBuilder();
+        result.hasOptionalForeignMessage = false;
+        result.optionalForeignMessage_ = null;
+        return this;
+      }
+
+      public bool HasOptionalImportMessage {
+       get { return result.hasOptionalImportMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportMessage OptionalImportMessage {
+        get { return result.OptionalImportMessage; }
+        set { SetOptionalImportMessage(value); }
+      }
+      public Builder SetOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalImportMessage = true;
+        result.optionalImportMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalImportMessage = true;
+        result.optionalImportMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalImportMessage &&
+            result.optionalImportMessage_ != global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) {
+            result.optionalImportMessage_ = global::Google.ProtocolBuffers.TestProtos.ImportMessage.CreateBuilder(result.optionalImportMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalImportMessage_ = value;
+        }
+        result.hasOptionalImportMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalImportMessage() {
+        PrepareBuilder();
+        result.hasOptionalImportMessage = false;
+        result.optionalImportMessage_ = null;
+        return this;
+      }
+
+      public bool HasOptionalNestedEnum {
+       get { return result.hasOptionalNestedEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum OptionalNestedEnum {
+        get { return result.OptionalNestedEnum; }
+        set { SetOptionalNestedEnum(value); }
+      }
+      public Builder SetOptionalNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.hasOptionalNestedEnum = true;
+        result.optionalNestedEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalNestedEnum() {
+        PrepareBuilder();
+        result.hasOptionalNestedEnum = false;
+        result.optionalNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.FOO;
+        return this;
+      }
+
+      public bool HasOptionalForeignEnum {
+       get { return result.hasOptionalForeignEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum OptionalForeignEnum {
+        get { return result.OptionalForeignEnum; }
+        set { SetOptionalForeignEnum(value); }
+      }
+      public Builder SetOptionalForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.hasOptionalForeignEnum = true;
+        result.optionalForeignEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalForeignEnum() {
+        PrepareBuilder();
+        result.hasOptionalForeignEnum = false;
+        result.optionalForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+
+      public bool HasOptionalImportEnum {
+       get { return result.hasOptionalImportEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportEnum OptionalImportEnum {
+        get { return result.OptionalImportEnum; }
+        set { SetOptionalImportEnum(value); }
+      }
+      public Builder SetOptionalImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {
+        PrepareBuilder();
+        result.hasOptionalImportEnum = true;
+        result.optionalImportEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalImportEnum() {
+        PrepareBuilder();
+        result.hasOptionalImportEnum = false;
+        result.optionalImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_FOO;
+        return this;
+      }
+
+      public bool HasOptionalStringPiece {
+        get { return result.hasOptionalStringPiece; }
+      }
+      public string OptionalStringPiece {
+        get { return result.OptionalStringPiece; }
+        set { SetOptionalStringPiece(value); }
+      }
+      public Builder SetOptionalStringPiece(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalStringPiece = true;
+        result.optionalStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearOptionalStringPiece() {
+        PrepareBuilder();
+        result.hasOptionalStringPiece = false;
+        result.optionalStringPiece_ = "";
+        return this;
+      }
+
+      public bool HasOptionalCord {
+        get { return result.hasOptionalCord; }
+      }
+      public string OptionalCord {
+        get { return result.OptionalCord; }
+        set { SetOptionalCord(value); }
+      }
+      public Builder SetOptionalCord(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalCord = true;
+        result.optionalCord_ = value;
+        return this;
+      }
+      public Builder ClearOptionalCord() {
+        PrepareBuilder();
+        result.hasOptionalCord = false;
+        result.optionalCord_ = "";
+        return this;
+      }
+
+      public bool HasOptionalPublicImportMessage {
+       get { return result.hasOptionalPublicImportMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.PublicImportMessage OptionalPublicImportMessage {
+        get { return result.OptionalPublicImportMessage; }
+        set { SetOptionalPublicImportMessage(value); }
+      }
+      public Builder SetOptionalPublicImportMessage(global::Google.ProtocolBuffers.TestProtos.PublicImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalPublicImportMessage = true;
+        result.optionalPublicImportMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalPublicImportMessage(global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalPublicImportMessage = true;
+        result.optionalPublicImportMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalPublicImportMessage(global::Google.ProtocolBuffers.TestProtos.PublicImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalPublicImportMessage &&
+            result.optionalPublicImportMessage_ != global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.DefaultInstance) {
+            result.optionalPublicImportMessage_ = global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.CreateBuilder(result.optionalPublicImportMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalPublicImportMessage_ = value;
+        }
+        result.hasOptionalPublicImportMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalPublicImportMessage() {
+        PrepareBuilder();
+        result.hasOptionalPublicImportMessage = false;
+        result.optionalPublicImportMessage_ = null;
+        return this;
+      }
+
+      public bool HasOptionalLazyMessage {
+       get { return result.hasOptionalLazyMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OptionalLazyMessage {
+        get { return result.OptionalLazyMessage; }
+        set { SetOptionalLazyMessage(value); }
+      }
+      public Builder SetOptionalLazyMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalLazyMessage = true;
+        result.optionalLazyMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalLazyMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalLazyMessage = true;
+        result.optionalLazyMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalLazyMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalLazyMessage &&
+            result.optionalLazyMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) {
+            result.optionalLazyMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder(result.optionalLazyMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalLazyMessage_ = value;
+        }
+        result.hasOptionalLazyMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalLazyMessage() {
+        PrepareBuilder();
+        result.hasOptionalLazyMessage = false;
+        result.optionalLazyMessage_ = null;
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> RepeatedInt32List {
+        get { return PrepareBuilder().repeatedInt32_; }
+      }
+      public int RepeatedInt32Count {
+        get { return result.RepeatedInt32Count; }
+      }
+      public int GetRepeatedInt32(int index) {
+        return result.GetRepeatedInt32(index);
+      }
+      public Builder SetRepeatedInt32(int index, int value) {
+        PrepareBuilder();
+        result.repeatedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt32(int value) {
+        PrepareBuilder();
+        result.repeatedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedInt32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedInt32() {
+        PrepareBuilder();
+        result.repeatedInt32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> RepeatedInt64List {
+        get { return PrepareBuilder().repeatedInt64_; }
+      }
+      public int RepeatedInt64Count {
+        get { return result.RepeatedInt64Count; }
+      }
+      public long GetRepeatedInt64(int index) {
+        return result.GetRepeatedInt64(index);
+      }
+      public Builder SetRepeatedInt64(int index, long value) {
+        PrepareBuilder();
+        result.repeatedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt64(long value) {
+        PrepareBuilder();
+        result.repeatedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.repeatedInt64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedInt64() {
+        PrepareBuilder();
+        result.repeatedInt64_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> RepeatedUint32List {
+        get { return PrepareBuilder().repeatedUint32_; }
+      }
+      public int RepeatedUint32Count {
+        get { return result.RepeatedUint32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetRepeatedUint32(int index) {
+        return result.GetRepeatedUint32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedUint32(int index, uint value) {
+        PrepareBuilder();
+        result.repeatedUint32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedUint32(uint value) {
+        PrepareBuilder();
+        result.repeatedUint32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedUint32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.repeatedUint32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedUint32() {
+        PrepareBuilder();
+        result.repeatedUint32_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> RepeatedUint64List {
+        get { return PrepareBuilder().repeatedUint64_; }
+      }
+      public int RepeatedUint64Count {
+        get { return result.RepeatedUint64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetRepeatedUint64(int index) {
+        return result.GetRepeatedUint64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedUint64(int index, ulong value) {
+        PrepareBuilder();
+        result.repeatedUint64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedUint64(ulong value) {
+        PrepareBuilder();
+        result.repeatedUint64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedUint64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.repeatedUint64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedUint64() {
+        PrepareBuilder();
+        result.repeatedUint64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> RepeatedSint32List {
+        get { return PrepareBuilder().repeatedSint32_; }
+      }
+      public int RepeatedSint32Count {
+        get { return result.RepeatedSint32Count; }
+      }
+      public int GetRepeatedSint32(int index) {
+        return result.GetRepeatedSint32(index);
+      }
+      public Builder SetRepeatedSint32(int index, int value) {
+        PrepareBuilder();
+        result.repeatedSint32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSint32(int value) {
+        PrepareBuilder();
+        result.repeatedSint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSint32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedSint32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedSint32() {
+        PrepareBuilder();
+        result.repeatedSint32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> RepeatedSint64List {
+        get { return PrepareBuilder().repeatedSint64_; }
+      }
+      public int RepeatedSint64Count {
+        get { return result.RepeatedSint64Count; }
+      }
+      public long GetRepeatedSint64(int index) {
+        return result.GetRepeatedSint64(index);
+      }
+      public Builder SetRepeatedSint64(int index, long value) {
+        PrepareBuilder();
+        result.repeatedSint64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSint64(long value) {
+        PrepareBuilder();
+        result.repeatedSint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSint64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.repeatedSint64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedSint64() {
+        PrepareBuilder();
+        result.repeatedSint64_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> RepeatedFixed32List {
+        get { return PrepareBuilder().repeatedFixed32_; }
+      }
+      public int RepeatedFixed32Count {
+        get { return result.RepeatedFixed32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetRepeatedFixed32(int index) {
+        return result.GetRepeatedFixed32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedFixed32(int index, uint value) {
+        PrepareBuilder();
+        result.repeatedFixed32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedFixed32(uint value) {
+        PrepareBuilder();
+        result.repeatedFixed32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedFixed32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.repeatedFixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFixed32() {
+        PrepareBuilder();
+        result.repeatedFixed32_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> RepeatedFixed64List {
+        get { return PrepareBuilder().repeatedFixed64_; }
+      }
+      public int RepeatedFixed64Count {
+        get { return result.RepeatedFixed64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetRepeatedFixed64(int index) {
+        return result.GetRepeatedFixed64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedFixed64(int index, ulong value) {
+        PrepareBuilder();
+        result.repeatedFixed64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedFixed64(ulong value) {
+        PrepareBuilder();
+        result.repeatedFixed64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedFixed64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.repeatedFixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFixed64() {
+        PrepareBuilder();
+        result.repeatedFixed64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> RepeatedSfixed32List {
+        get { return PrepareBuilder().repeatedSfixed32_; }
+      }
+      public int RepeatedSfixed32Count {
+        get { return result.RepeatedSfixed32Count; }
+      }
+      public int GetRepeatedSfixed32(int index) {
+        return result.GetRepeatedSfixed32(index);
+      }
+      public Builder SetRepeatedSfixed32(int index, int value) {
+        PrepareBuilder();
+        result.repeatedSfixed32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSfixed32(int value) {
+        PrepareBuilder();
+        result.repeatedSfixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSfixed32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedSfixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedSfixed32() {
+        PrepareBuilder();
+        result.repeatedSfixed32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> RepeatedSfixed64List {
+        get { return PrepareBuilder().repeatedSfixed64_; }
+      }
+      public int RepeatedSfixed64Count {
+        get { return result.RepeatedSfixed64Count; }
+      }
+      public long GetRepeatedSfixed64(int index) {
+        return result.GetRepeatedSfixed64(index);
+      }
+      public Builder SetRepeatedSfixed64(int index, long value) {
+        PrepareBuilder();
+        result.repeatedSfixed64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSfixed64(long value) {
+        PrepareBuilder();
+        result.repeatedSfixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSfixed64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.repeatedSfixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedSfixed64() {
+        PrepareBuilder();
+        result.repeatedSfixed64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<float> RepeatedFloatList {
+        get { return PrepareBuilder().repeatedFloat_; }
+      }
+      public int RepeatedFloatCount {
+        get { return result.RepeatedFloatCount; }
+      }
+      public float GetRepeatedFloat(int index) {
+        return result.GetRepeatedFloat(index);
+      }
+      public Builder SetRepeatedFloat(int index, float value) {
+        PrepareBuilder();
+        result.repeatedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFloat(float value) {
+        PrepareBuilder();
+        result.repeatedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFloat(scg::IEnumerable<float> values) {
+        PrepareBuilder();
+        result.repeatedFloat_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFloat() {
+        PrepareBuilder();
+        result.repeatedFloat_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<double> RepeatedDoubleList {
+        get { return PrepareBuilder().repeatedDouble_; }
+      }
+      public int RepeatedDoubleCount {
+        get { return result.RepeatedDoubleCount; }
+      }
+      public double GetRepeatedDouble(int index) {
+        return result.GetRepeatedDouble(index);
+      }
+      public Builder SetRepeatedDouble(int index, double value) {
+        PrepareBuilder();
+        result.repeatedDouble_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedDouble(double value) {
+        PrepareBuilder();
+        result.repeatedDouble_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedDouble(scg::IEnumerable<double> values) {
+        PrepareBuilder();
+        result.repeatedDouble_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedDouble() {
+        PrepareBuilder();
+        result.repeatedDouble_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<bool> RepeatedBoolList {
+        get { return PrepareBuilder().repeatedBool_; }
+      }
+      public int RepeatedBoolCount {
+        get { return result.RepeatedBoolCount; }
+      }
+      public bool GetRepeatedBool(int index) {
+        return result.GetRepeatedBool(index);
+      }
+      public Builder SetRepeatedBool(int index, bool value) {
+        PrepareBuilder();
+        result.repeatedBool_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedBool(bool value) {
+        PrepareBuilder();
+        result.repeatedBool_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedBool(scg::IEnumerable<bool> values) {
+        PrepareBuilder();
+        result.repeatedBool_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedBool() {
+        PrepareBuilder();
+        result.repeatedBool_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> RepeatedStringList {
+        get { return PrepareBuilder().repeatedString_; }
+      }
+      public int RepeatedStringCount {
+        get { return result.RepeatedStringCount; }
+      }
+      public string GetRepeatedString(int index) {
+        return result.GetRepeatedString(index);
+      }
+      public Builder SetRepeatedString(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedString_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedString_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedString(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedString_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedString() {
+        PrepareBuilder();
+        result.repeatedString_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<pb::ByteString> RepeatedBytesList {
+        get { return PrepareBuilder().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) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedBytes_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedBytes_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedBytes(scg::IEnumerable<pb::ByteString> values) {
+        PrepareBuilder();
+        result.repeatedBytes_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedBytes() {
+        PrepareBuilder();
+        result.repeatedBytes_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {
+        get { return PrepareBuilder().repeatedGroup_; }
+      }
+      public int RepeatedGroupCount {
+        get { return result.RepeatedGroupCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup GetRepeatedGroup(int index) {
+        return result.GetRepeatedGroup(index);
+      }
+      public Builder SetRepeatedGroup(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedGroup_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedGroup(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedGroup_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedGroup_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedGroup_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedGroup(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> values) {
+        PrepareBuilder();
+        result.repeatedGroup_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedGroup() {
+        PrepareBuilder();
+        result.repeatedGroup_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {
+        get { return PrepareBuilder().repeatedNestedMessage_; }
+      }
+      public int RepeatedNestedMessageCount {
+        get { return result.RepeatedNestedMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage GetRepeatedNestedMessage(int index) {
+        return result.GetRepeatedNestedMessage(index);
+      }
+      public Builder SetRepeatedNestedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedNestedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedNestedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedNestedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedNestedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedNestedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedNestedMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> values) {
+        PrepareBuilder();
+        result.repeatedNestedMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedNestedMessage() {
+        PrepareBuilder();
+        result.repeatedNestedMessage_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedForeignMessageList {
+        get { return PrepareBuilder().repeatedForeignMessage_; }
+      }
+      public int RepeatedForeignMessageCount {
+        get { return result.RepeatedForeignMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetRepeatedForeignMessage(int index) {
+        return result.GetRepeatedForeignMessage(index);
+      }
+      public Builder SetRepeatedForeignMessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedForeignMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedForeignMessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedForeignMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedForeignMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedForeignMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedForeignMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {
+        PrepareBuilder();
+        result.repeatedForeignMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedForeignMessage() {
+        PrepareBuilder();
+        result.repeatedForeignMessage_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportMessage> RepeatedImportMessageList {
+        get { return PrepareBuilder().repeatedImportMessage_; }
+      }
+      public int RepeatedImportMessageCount {
+        get { return result.RepeatedImportMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportMessage GetRepeatedImportMessage(int index) {
+        return result.GetRepeatedImportMessage(index);
+      }
+      public Builder SetRepeatedImportMessage(int index, global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedImportMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedImportMessage(int index, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedImportMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedImportMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedImportMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedImportMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ImportMessage> values) {
+        PrepareBuilder();
+        result.repeatedImportMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedImportMessage() {
+        PrepareBuilder();
+        result.repeatedImportMessage_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {
+        get { return PrepareBuilder().repeatedNestedEnum_; }
+      }
+      public int RepeatedNestedEnumCount {
+        get { return result.RepeatedNestedEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum GetRepeatedNestedEnum(int index) {
+        return result.GetRepeatedNestedEnum(index);
+      }
+      public Builder SetRepeatedNestedEnum(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.repeatedNestedEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.repeatedNestedEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedNestedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> values) {
+        PrepareBuilder();
+        result.repeatedNestedEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedNestedEnum() {
+        PrepareBuilder();
+        result.repeatedNestedEnum_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedForeignEnumList {
+        get { return PrepareBuilder().repeatedForeignEnum_; }
+      }
+      public int RepeatedForeignEnumCount {
+        get { return result.RepeatedForeignEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetRepeatedForeignEnum(int index) {
+        return result.GetRepeatedForeignEnum(index);
+      }
+      public Builder SetRepeatedForeignEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.repeatedForeignEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.repeatedForeignEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedForeignEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {
+        PrepareBuilder();
+        result.repeatedForeignEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedForeignEnum() {
+        PrepareBuilder();
+        result.repeatedForeignEnum_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportEnum> RepeatedImportEnumList {
+        get { return PrepareBuilder().repeatedImportEnum_; }
+      }
+      public int RepeatedImportEnumCount {
+        get { return result.RepeatedImportEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportEnum GetRepeatedImportEnum(int index) {
+        return result.GetRepeatedImportEnum(index);
+      }
+      public Builder SetRepeatedImportEnum(int index, global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {
+        PrepareBuilder();
+        result.repeatedImportEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {
+        PrepareBuilder();
+        result.repeatedImportEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedImportEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ImportEnum> values) {
+        PrepareBuilder();
+        result.repeatedImportEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedImportEnum() {
+        PrepareBuilder();
+        result.repeatedImportEnum_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> RepeatedStringPieceList {
+        get { return PrepareBuilder().repeatedStringPiece_; }
+      }
+      public int RepeatedStringPieceCount {
+        get { return result.RepeatedStringPieceCount; }
+      }
+      public string GetRepeatedStringPiece(int index) {
+        return result.GetRepeatedStringPiece(index);
+      }
+      public Builder SetRepeatedStringPiece(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringPiece_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringPiece(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringPiece_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringPiece(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedStringPiece_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedStringPiece() {
+        PrepareBuilder();
+        result.repeatedStringPiece_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> RepeatedCordList {
+        get { return PrepareBuilder().repeatedCord_; }
+      }
+      public int RepeatedCordCount {
+        get { return result.RepeatedCordCount; }
+      }
+      public string GetRepeatedCord(int index) {
+        return result.GetRepeatedCord(index);
+      }
+      public Builder SetRepeatedCord(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedCord_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedCord(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedCord_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedCord(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedCord_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedCord() {
+        PrepareBuilder();
+        result.repeatedCord_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> RepeatedLazyMessageList {
+        get { return PrepareBuilder().repeatedLazyMessage_; }
+      }
+      public int RepeatedLazyMessageCount {
+        get { return result.RepeatedLazyMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage GetRepeatedLazyMessage(int index) {
+        return result.GetRepeatedLazyMessage(index);
+      }
+      public Builder SetRepeatedLazyMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedLazyMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedLazyMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedLazyMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedLazyMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedLazyMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedLazyMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedLazyMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedLazyMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> values) {
+        PrepareBuilder();
+        result.repeatedLazyMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedLazyMessage() {
+        PrepareBuilder();
+        result.repeatedLazyMessage_.Clear();
+        return this;
+      }
+
+      public bool HasDefaultInt32 {
+        get { return result.hasDefaultInt32; }
+      }
+      public int DefaultInt32 {
+        get { return result.DefaultInt32; }
+        set { SetDefaultInt32(value); }
+      }
+      public Builder SetDefaultInt32(int value) {
+        PrepareBuilder();
+        result.hasDefaultInt32 = true;
+        result.defaultInt32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultInt32() {
+        PrepareBuilder();
+        result.hasDefaultInt32 = false;
+        result.defaultInt32_ = 41;
+        return this;
+      }
+
+      public bool HasDefaultInt64 {
+        get { return result.hasDefaultInt64; }
+      }
+      public long DefaultInt64 {
+        get { return result.DefaultInt64; }
+        set { SetDefaultInt64(value); }
+      }
+      public Builder SetDefaultInt64(long value) {
+        PrepareBuilder();
+        result.hasDefaultInt64 = true;
+        result.defaultInt64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultInt64() {
+        PrepareBuilder();
+        result.hasDefaultInt64 = false;
+        result.defaultInt64_ = 42L;
+        return this;
+      }
+
+      public bool HasDefaultUint32 {
+        get { return result.hasDefaultUint32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint DefaultUint32 {
+        get { return result.DefaultUint32; }
+        set { SetDefaultUint32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetDefaultUint32(uint value) {
+        PrepareBuilder();
+        result.hasDefaultUint32 = true;
+        result.defaultUint32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultUint32() {
+        PrepareBuilder();
+        result.hasDefaultUint32 = false;
+        result.defaultUint32_ = 43;
+        return this;
+      }
+
+      public bool HasDefaultUint64 {
+        get { return result.hasDefaultUint64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong DefaultUint64 {
+        get { return result.DefaultUint64; }
+        set { SetDefaultUint64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetDefaultUint64(ulong value) {
+        PrepareBuilder();
+        result.hasDefaultUint64 = true;
+        result.defaultUint64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultUint64() {
+        PrepareBuilder();
+        result.hasDefaultUint64 = false;
+        result.defaultUint64_ = 44UL;
+        return this;
+      }
+
+      public bool HasDefaultSint32 {
+        get { return result.hasDefaultSint32; }
+      }
+      public int DefaultSint32 {
+        get { return result.DefaultSint32; }
+        set { SetDefaultSint32(value); }
+      }
+      public Builder SetDefaultSint32(int value) {
+        PrepareBuilder();
+        result.hasDefaultSint32 = true;
+        result.defaultSint32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSint32() {
+        PrepareBuilder();
+        result.hasDefaultSint32 = false;
+        result.defaultSint32_ = -45;
+        return this;
+      }
+
+      public bool HasDefaultSint64 {
+        get { return result.hasDefaultSint64; }
+      }
+      public long DefaultSint64 {
+        get { return result.DefaultSint64; }
+        set { SetDefaultSint64(value); }
+      }
+      public Builder SetDefaultSint64(long value) {
+        PrepareBuilder();
+        result.hasDefaultSint64 = true;
+        result.defaultSint64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSint64() {
+        PrepareBuilder();
+        result.hasDefaultSint64 = false;
+        result.defaultSint64_ = 46L;
+        return this;
+      }
+
+      public bool HasDefaultFixed32 {
+        get { return result.hasDefaultFixed32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint DefaultFixed32 {
+        get { return result.DefaultFixed32; }
+        set { SetDefaultFixed32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetDefaultFixed32(uint value) {
+        PrepareBuilder();
+        result.hasDefaultFixed32 = true;
+        result.defaultFixed32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFixed32() {
+        PrepareBuilder();
+        result.hasDefaultFixed32 = false;
+        result.defaultFixed32_ = 47;
+        return this;
+      }
+
+      public bool HasDefaultFixed64 {
+        get { return result.hasDefaultFixed64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong DefaultFixed64 {
+        get { return result.DefaultFixed64; }
+        set { SetDefaultFixed64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetDefaultFixed64(ulong value) {
+        PrepareBuilder();
+        result.hasDefaultFixed64 = true;
+        result.defaultFixed64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFixed64() {
+        PrepareBuilder();
+        result.hasDefaultFixed64 = false;
+        result.defaultFixed64_ = 48UL;
+        return this;
+      }
+
+      public bool HasDefaultSfixed32 {
+        get { return result.hasDefaultSfixed32; }
+      }
+      public int DefaultSfixed32 {
+        get { return result.DefaultSfixed32; }
+        set { SetDefaultSfixed32(value); }
+      }
+      public Builder SetDefaultSfixed32(int value) {
+        PrepareBuilder();
+        result.hasDefaultSfixed32 = true;
+        result.defaultSfixed32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSfixed32() {
+        PrepareBuilder();
+        result.hasDefaultSfixed32 = false;
+        result.defaultSfixed32_ = 49;
+        return this;
+      }
+
+      public bool HasDefaultSfixed64 {
+        get { return result.hasDefaultSfixed64; }
+      }
+      public long DefaultSfixed64 {
+        get { return result.DefaultSfixed64; }
+        set { SetDefaultSfixed64(value); }
+      }
+      public Builder SetDefaultSfixed64(long value) {
+        PrepareBuilder();
+        result.hasDefaultSfixed64 = true;
+        result.defaultSfixed64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSfixed64() {
+        PrepareBuilder();
+        result.hasDefaultSfixed64 = false;
+        result.defaultSfixed64_ = -50L;
+        return this;
+      }
+
+      public bool HasDefaultFloat {
+        get { return result.hasDefaultFloat; }
+      }
+      public float DefaultFloat {
+        get { return result.DefaultFloat; }
+        set { SetDefaultFloat(value); }
+      }
+      public Builder SetDefaultFloat(float value) {
+        PrepareBuilder();
+        result.hasDefaultFloat = true;
+        result.defaultFloat_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFloat() {
+        PrepareBuilder();
+        result.hasDefaultFloat = false;
+        result.defaultFloat_ = 51.5F;
+        return this;
+      }
+
+      public bool HasDefaultDouble {
+        get { return result.hasDefaultDouble; }
+      }
+      public double DefaultDouble {
+        get { return result.DefaultDouble; }
+        set { SetDefaultDouble(value); }
+      }
+      public Builder SetDefaultDouble(double value) {
+        PrepareBuilder();
+        result.hasDefaultDouble = true;
+        result.defaultDouble_ = value;
+        return this;
+      }
+      public Builder ClearDefaultDouble() {
+        PrepareBuilder();
+        result.hasDefaultDouble = false;
+        result.defaultDouble_ = 52000D;
+        return this;
+      }
+
+      public bool HasDefaultBool {
+        get { return result.hasDefaultBool; }
+      }
+      public bool DefaultBool {
+        get { return result.DefaultBool; }
+        set { SetDefaultBool(value); }
+      }
+      public Builder SetDefaultBool(bool value) {
+        PrepareBuilder();
+        result.hasDefaultBool = true;
+        result.defaultBool_ = value;
+        return this;
+      }
+      public Builder ClearDefaultBool() {
+        PrepareBuilder();
+        result.hasDefaultBool = false;
+        result.defaultBool_ = true;
+        return this;
+      }
+
+      public bool HasDefaultString {
+        get { return result.hasDefaultString; }
+      }
+      public string DefaultString {
+        get { return result.DefaultString; }
+        set { SetDefaultString(value); }
+      }
+      public Builder SetDefaultString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDefaultString = true;
+        result.defaultString_ = value;
+        return this;
+      }
+      public Builder ClearDefaultString() {
+        PrepareBuilder();
+        result.hasDefaultString = false;
+        result.defaultString_ = "hello";
+        return this;
+      }
+
+      public bool HasDefaultBytes {
+        get { return result.hasDefaultBytes; }
+      }
+      public pb::ByteString DefaultBytes {
+        get { return result.DefaultBytes; }
+        set { SetDefaultBytes(value); }
+      }
+      public Builder SetDefaultBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDefaultBytes = true;
+        result.defaultBytes_ = value;
+        return this;
+      }
+      public Builder ClearDefaultBytes() {
+        PrepareBuilder();
+        result.hasDefaultBytes = false;
+        result.defaultBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Descriptor.Fields[65].DefaultValue;
+        return this;
+      }
+
+      public bool HasDefaultNestedEnum {
+       get { return result.hasDefaultNestedEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum DefaultNestedEnum {
+        get { return result.DefaultNestedEnum; }
+        set { SetDefaultNestedEnum(value); }
+      }
+      public Builder SetDefaultNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.hasDefaultNestedEnum = true;
+        result.defaultNestedEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultNestedEnum() {
+        PrepareBuilder();
+        result.hasDefaultNestedEnum = false;
+        result.defaultNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.BAR;
+        return this;
+      }
+
+      public bool HasDefaultForeignEnum {
+       get { return result.hasDefaultForeignEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum DefaultForeignEnum {
+        get { return result.DefaultForeignEnum; }
+        set { SetDefaultForeignEnum(value); }
+      }
+      public Builder SetDefaultForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.hasDefaultForeignEnum = true;
+        result.defaultForeignEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultForeignEnum() {
+        PrepareBuilder();
+        result.hasDefaultForeignEnum = false;
+        result.defaultForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_BAR;
+        return this;
+      }
+
+      public bool HasDefaultImportEnum {
+       get { return result.hasDefaultImportEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportEnum DefaultImportEnum {
+        get { return result.DefaultImportEnum; }
+        set { SetDefaultImportEnum(value); }
+      }
+      public Builder SetDefaultImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {
+        PrepareBuilder();
+        result.hasDefaultImportEnum = true;
+        result.defaultImportEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultImportEnum() {
+        PrepareBuilder();
+        result.hasDefaultImportEnum = false;
+        result.defaultImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_BAR;
+        return this;
+      }
+
+      public bool HasDefaultStringPiece {
+        get { return result.hasDefaultStringPiece; }
+      }
+      public string DefaultStringPiece {
+        get { return result.DefaultStringPiece; }
+        set { SetDefaultStringPiece(value); }
+      }
+      public Builder SetDefaultStringPiece(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDefaultStringPiece = true;
+        result.defaultStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearDefaultStringPiece() {
+        PrepareBuilder();
+        result.hasDefaultStringPiece = false;
+        result.defaultStringPiece_ = "abc";
+        return this;
+      }
+
+      public bool HasDefaultCord {
+        get { return result.hasDefaultCord; }
+      }
+      public string DefaultCord {
+        get { return result.DefaultCord; }
+        set { SetDefaultCord(value); }
+      }
+      public Builder SetDefaultCord(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDefaultCord = true;
+        result.defaultCord_ = value;
+        return this;
+      }
+      public Builder ClearDefaultCord() {
+        PrepareBuilder();
+        result.hasDefaultCord = false;
+        result.defaultCord_ = "123";
+        return this;
+      }
+
+      public bool HasOneofUint32 {
+        get { return result.hasOneofUint32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint OneofUint32 {
+        get { return result.OneofUint32; }
+        set { SetOneofUint32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOneofUint32(uint value) {
+        PrepareBuilder();
+        result.hasOneofUint32 = true;
+        result.oneofUint32_ = value;
+        return this;
+      }
+      public Builder ClearOneofUint32() {
+        PrepareBuilder();
+        result.hasOneofUint32 = false;
+        result.oneofUint32_ = 0;
+        return this;
+      }
+
+      public bool HasOneofNestedMessage {
+       get { return result.hasOneofNestedMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OneofNestedMessage {
+        get { return result.OneofNestedMessage; }
+        set { SetOneofNestedMessage(value); }
+      }
+      public Builder SetOneofNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOneofNestedMessage = true;
+        result.oneofNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOneofNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOneofNestedMessage = true;
+        result.oneofNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOneofNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOneofNestedMessage &&
+            result.oneofNestedMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) {
+            result.oneofNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder(result.oneofNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.oneofNestedMessage_ = value;
+        }
+        result.hasOneofNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOneofNestedMessage() {
+        PrepareBuilder();
+        result.hasOneofNestedMessage = false;
+        result.oneofNestedMessage_ = null;
+        return this;
+      }
+
+      public bool HasOneofString {
+        get { return result.hasOneofString; }
+      }
+      public string OneofString {
+        get { return result.OneofString; }
+        set { SetOneofString(value); }
+      }
+      public Builder SetOneofString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOneofString = true;
+        result.oneofString_ = value;
+        return this;
+      }
+      public Builder ClearOneofString() {
+        PrepareBuilder();
+        result.hasOneofString = false;
+        result.oneofString_ = "";
+        return this;
+      }
+
+      public bool HasOneofBytes {
+        get { return result.hasOneofBytes; }
+      }
+      public pb::ByteString OneofBytes {
+        get { return result.OneofBytes; }
+        set { SetOneofBytes(value); }
+      }
+      public Builder SetOneofBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOneofBytes = true;
+        result.oneofBytes_ = value;
+        return this;
+      }
+      public Builder ClearOneofBytes() {
+        PrepareBuilder();
+        result.hasOneofBytes = false;
+        result.oneofBytes_ = pb::ByteString.Empty;
+        return this;
+      }
+    }
+    static TestAllTypes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class NestedTestAllTypes : pb::GeneratedMessage<NestedTestAllTypes, NestedTestAllTypes.Builder> {
+    private NestedTestAllTypes() { }
+    private static readonly NestedTestAllTypes defaultInstance = new NestedTestAllTypes().MakeReadOnly();
+    private static readonly string[] _nestedTestAllTypesFieldNames = new string[] { "child", "payload" };
+    private static readonly uint[] _nestedTestAllTypesFieldTags = new uint[] { 10, 18 };
+    public static NestedTestAllTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override NestedTestAllTypes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override NestedTestAllTypes ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_NestedTestAllTypes__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<NestedTestAllTypes, NestedTestAllTypes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_NestedTestAllTypes__FieldAccessorTable; }
+    }
+
+    public const int ChildFieldNumber = 1;
+    private bool hasChild;
+    private global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes child_;
+    public bool HasChild {
+      get { return hasChild; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes Child {
+      get { return child_ ?? global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.DefaultInstance; }
+    }
+
+    public const int PayloadFieldNumber = 2;
+    private bool hasPayload;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes payload_;
+    public bool HasPayload {
+      get { return hasPayload; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes Payload {
+      get { return payload_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _nestedTestAllTypesFieldNames;
+      if (hasChild) {
+        output.WriteMessage(1, field_names[0], Child);
+      }
+      if (hasPayload) {
+        output.WriteMessage(2, field_names[1], Payload);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasChild) {
+        size += pb::CodedOutputStream.ComputeMessageSize(1, Child);
+      }
+      if (hasPayload) {
+        size += pb::CodedOutputStream.ComputeMessageSize(2, Payload);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static NestedTestAllTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static NestedTestAllTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private NestedTestAllTypes MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(NestedTestAllTypes prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<NestedTestAllTypes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(NestedTestAllTypes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private NestedTestAllTypes result;
+
+      private NestedTestAllTypes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          NestedTestAllTypes original = result;
+          result = new NestedTestAllTypes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override NestedTestAllTypes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.Descriptor; }
+      }
+
+      public override NestedTestAllTypes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.DefaultInstance; }
+      }
+
+      public override NestedTestAllTypes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is NestedTestAllTypes) {
+          return MergeFrom((NestedTestAllTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(NestedTestAllTypes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasChild) {
+          MergeChild(other.Child);
+        }
+        if (other.HasPayload) {
+          MergePayload(other.Payload);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_nestedTestAllTypesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _nestedTestAllTypesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.CreateBuilder();
+              if (result.hasChild) {
+                subBuilder.MergeFrom(Child);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Child = subBuilder.BuildPartial();
+              break;
+            }
+            case 18: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+              if (result.hasPayload) {
+                subBuilder.MergeFrom(Payload);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Payload = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasChild {
+       get { return result.hasChild; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes Child {
+        get { return result.Child; }
+        set { SetChild(value); }
+      }
+      public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasChild = true;
+        result.child_ = value;
+        return this;
+      }
+      public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasChild = true;
+        result.child_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeChild(global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasChild &&
+            result.child_ != global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.DefaultInstance) {
+            result.child_ = global::Google.ProtocolBuffers.TestProtos.NestedTestAllTypes.CreateBuilder(result.child_).MergeFrom(value).BuildPartial();
+        } else {
+          result.child_ = value;
+        }
+        result.hasChild = true;
+        return this;
+      }
+      public Builder ClearChild() {
+        PrepareBuilder();
+        result.hasChild = false;
+        result.child_ = null;
+        return this;
+      }
+
+      public bool HasPayload {
+       get { return result.hasPayload; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes Payload {
+        get { return result.Payload; }
+        set { SetPayload(value); }
+      }
+      public Builder SetPayload(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasPayload = true;
+        result.payload_ = value;
+        return this;
+      }
+      public Builder SetPayload(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasPayload = true;
+        result.payload_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergePayload(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasPayload &&
+            result.payload_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+            result.payload_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.payload_).MergeFrom(value).BuildPartial();
+        } else {
+          result.payload_ = value;
+        }
+        result.hasPayload = true;
+        return this;
+      }
+      public Builder ClearPayload() {
+        PrepareBuilder();
+        result.hasPayload = false;
+        result.payload_ = null;
+        return this;
+      }
+    }
+    static NestedTestAllTypes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestDeprecatedFields : pb::GeneratedMessage<TestDeprecatedFields, TestDeprecatedFields.Builder> {
+    private TestDeprecatedFields() { }
+    private static readonly TestDeprecatedFields defaultInstance = new TestDeprecatedFields().MakeReadOnly();
+    private static readonly string[] _testDeprecatedFieldsFieldNames = new string[] { "deprecated_int32" };
+    private static readonly uint[] _testDeprecatedFieldsFieldTags = new uint[] { 8 };
+    public static TestDeprecatedFields DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestDeprecatedFields DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestDeprecatedFields ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDeprecatedFields__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestDeprecatedFields, TestDeprecatedFields.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDeprecatedFields__FieldAccessorTable; }
+    }
+
+    public const int DeprecatedInt32FieldNumber = 1;
+    private bool hasDeprecatedInt32;
+    private int deprecatedInt32_;
+    [global::System.ObsoleteAttribute()]
+    public bool HasDeprecatedInt32 {
+      get { return hasDeprecatedInt32; }
+    }
+    [global::System.ObsoleteAttribute()]
+    public int DeprecatedInt32 {
+      get { return deprecatedInt32_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testDeprecatedFieldsFieldNames;
+      if (hasDeprecatedInt32) {
+        output.WriteInt32(1, field_names[0], DeprecatedInt32);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasDeprecatedInt32) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, DeprecatedInt32);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestDeprecatedFields ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestDeprecatedFields MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestDeprecatedFields prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestDeprecatedFields, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestDeprecatedFields cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestDeprecatedFields result;
+
+      private TestDeprecatedFields PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestDeprecatedFields original = result;
+          result = new TestDeprecatedFields();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestDeprecatedFields MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.Descriptor; }
+      }
+
+      public override TestDeprecatedFields DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.DefaultInstance; }
+      }
+
+      public override TestDeprecatedFields BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestDeprecatedFields) {
+          return MergeFrom((TestDeprecatedFields) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestDeprecatedFields other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasDeprecatedInt32) {
+          DeprecatedInt32 = other.DeprecatedInt32;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testDeprecatedFieldsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testDeprecatedFieldsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasDeprecatedInt32 = input.ReadInt32(ref result.deprecatedInt32_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      [global::System.ObsoleteAttribute()]
+      public bool HasDeprecatedInt32 {
+        get { return result.hasDeprecatedInt32; }
+      }
+      [global::System.ObsoleteAttribute()]
+      public int DeprecatedInt32 {
+        get { return result.DeprecatedInt32; }
+        set { SetDeprecatedInt32(value); }
+      }
+      [global::System.ObsoleteAttribute()]
+      public Builder SetDeprecatedInt32(int value) {
+        PrepareBuilder();
+        result.hasDeprecatedInt32 = true;
+        result.deprecatedInt32_ = value;
+        return this;
+      }
+      [global::System.ObsoleteAttribute()]
+      public Builder ClearDeprecatedInt32() {
+        PrepareBuilder();
+        result.hasDeprecatedInt32 = false;
+        result.deprecatedInt32_ = 0;
+        return this;
+      }
+    }
+    static TestDeprecatedFields() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class ForeignMessage : pb::GeneratedMessage<ForeignMessage, ForeignMessage.Builder> {
+    private ForeignMessage() { }
+    private static readonly ForeignMessage defaultInstance = new ForeignMessage().MakeReadOnly();
+    private static readonly string[] _foreignMessageFieldNames = new string[] { "c" };
+    private static readonly uint[] _foreignMessageFieldTags = new uint[] { 8 };
+    public static ForeignMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override ForeignMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override ForeignMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_ForeignMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<ForeignMessage, ForeignMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable; }
+    }
+
+    public const int CFieldNumber = 1;
+    private bool hasC;
+    private int c_;
+    public bool HasC {
+      get { return hasC; }
+    }
+    public int C {
+      get { return c_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _foreignMessageFieldNames;
+      if (hasC) {
+        output.WriteInt32(1, field_names[0], C);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 ForeignMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static ForeignMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static ForeignMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private ForeignMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(ForeignMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<ForeignMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(ForeignMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private ForeignMessage result;
+
+      private ForeignMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          ForeignMessage original = result;
+          result = new ForeignMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override ForeignMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Descriptor; }
+      }
+
+      public override ForeignMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }
+      }
+
+      public override ForeignMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is ForeignMessage) {
+          return MergeFrom((ForeignMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(ForeignMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasC) {
+          C = other.C;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_foreignMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _foreignMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasC = input.ReadInt32(ref result.c_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasC {
+        get { return result.hasC; }
+      }
+      public int C {
+        get { return result.C; }
+        set { SetC(value); }
+      }
+      public Builder SetC(int value) {
+        PrepareBuilder();
+        result.hasC = true;
+        result.c_ = value;
+        return this;
+      }
+      public Builder ClearC() {
+        PrepareBuilder();
+        result.hasC = false;
+        result.c_ = 0;
+        return this;
+      }
+    }
+    static ForeignMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestAllExtensions : pb::ExtendableMessage<TestAllExtensions, TestAllExtensions.Builder> {
+    private TestAllExtensions() { }
+    private static readonly TestAllExtensions defaultInstance = new TestAllExtensions().MakeReadOnly();
+    private static readonly string[] _testAllExtensionsFieldNames = new string[] {  };
+    private static readonly uint[] _testAllExtensionsFieldTags = new uint[] {  };
+    public static TestAllExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestAllExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestAllExtensions ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllExtensions__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestAllExtensions, TestAllExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testAllExtensionsFieldNames;
+      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;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestAllExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestAllExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestAllExtensions MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestAllExtensions prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestAllExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestAllExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestAllExtensions result;
+
+      private TestAllExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestAllExtensions original = result;
+          result = new TestAllExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestAllExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Descriptor; }
+      }
+
+      public override TestAllExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.DefaultInstance; }
+      }
+
+      public override TestAllExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestAllExtensions) {
+          return MergeFrom((TestAllExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestAllExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testAllExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testAllExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static TestAllExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class OptionalGroup_extension : pb::GeneratedMessage<OptionalGroup_extension, OptionalGroup_extension.Builder> {
+    private OptionalGroup_extension() { }
+    private static readonly OptionalGroup_extension defaultInstance = new OptionalGroup_extension().MakeReadOnly();
+    private static readonly string[] _optionalGroupExtensionFieldNames = new string[] { "a" };
+    private static readonly uint[] _optionalGroupExtensionFieldTags = new uint[] { 136 };
+    public static OptionalGroup_extension DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override OptionalGroup_extension DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override OptionalGroup_extension ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<OptionalGroup_extension, OptionalGroup_extension.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable; }
+    }
+
+    public const int AFieldNumber = 17;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _optionalGroupExtensionFieldNames;
+      if (hasA) {
+        output.WriteInt32(17, field_names[0], A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 OptionalGroup_extension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private OptionalGroup_extension MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(OptionalGroup_extension prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<OptionalGroup_extension, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(OptionalGroup_extension cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private OptionalGroup_extension result;
+
+      private OptionalGroup_extension PrepareBuilder() {
+        if (resultIsReadOnly) {
+          OptionalGroup_extension original = result;
+          result = new OptionalGroup_extension();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override OptionalGroup_extension MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Descriptor; }
+      }
+
+      public override OptionalGroup_extension DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.DefaultInstance; }
+      }
+
+      public override OptionalGroup_extension BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is OptionalGroup_extension) {
+          return MergeFrom((OptionalGroup_extension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(OptionalGroup_extension other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_optionalGroupExtensionFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _optionalGroupExtensionFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 136: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+    }
+    static OptionalGroup_extension() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class RepeatedGroup_extension : pb::GeneratedMessage<RepeatedGroup_extension, RepeatedGroup_extension.Builder> {
+    private RepeatedGroup_extension() { }
+    private static readonly RepeatedGroup_extension defaultInstance = new RepeatedGroup_extension().MakeReadOnly();
+    private static readonly string[] _repeatedGroupExtensionFieldNames = new string[] { "a" };
+    private static readonly uint[] _repeatedGroupExtensionFieldTags = new uint[] { 376 };
+    public static RepeatedGroup_extension DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override RepeatedGroup_extension DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override RepeatedGroup_extension ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<RepeatedGroup_extension, RepeatedGroup_extension.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable; }
+    }
+
+    public const int AFieldNumber = 47;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _repeatedGroupExtensionFieldNames;
+      if (hasA) {
+        output.WriteInt32(47, field_names[0], A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 RepeatedGroup_extension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private RepeatedGroup_extension MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(RepeatedGroup_extension prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<RepeatedGroup_extension, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(RepeatedGroup_extension cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private RepeatedGroup_extension result;
+
+      private RepeatedGroup_extension PrepareBuilder() {
+        if (resultIsReadOnly) {
+          RepeatedGroup_extension original = result;
+          result = new RepeatedGroup_extension();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override RepeatedGroup_extension MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Descriptor; }
+      }
+
+      public override RepeatedGroup_extension DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.DefaultInstance; }
+      }
+
+      public override RepeatedGroup_extension BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is RepeatedGroup_extension) {
+          return MergeFrom((RepeatedGroup_extension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(RepeatedGroup_extension other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_repeatedGroupExtensionFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _repeatedGroupExtensionFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 376: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+    }
+    static RepeatedGroup_extension() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestNestedExtension : pb::GeneratedMessage<TestNestedExtension, TestNestedExtension.Builder> {
+    private TestNestedExtension() { }
+    private static readonly TestNestedExtension defaultInstance = new TestNestedExtension().MakeReadOnly();
+    private static readonly string[] _testNestedExtensionFieldNames = new string[] {  };
+    private static readonly uint[] _testNestedExtensionFieldTags = new uint[] {  };
+    public static TestNestedExtension DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestNestedExtension DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestNestedExtension ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestNestedExtension__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestNestedExtension, TestNestedExtension.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestNestedExtension__FieldAccessorTable; }
+    }
+
+    public const int TestFieldNumber = 1002;
+    public static pb::GeneratedExtensionBase<string> Test;
+    public const int NestedStringExtensionFieldNumber = 1003;
+    public static pb::GeneratedExtensionBase<string> NestedStringExtension;
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testNestedExtensionFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestNestedExtension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedExtension ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestNestedExtension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestNestedExtension MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestNestedExtension prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestNestedExtension, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestNestedExtension cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestNestedExtension result;
+
+      private TestNestedExtension PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestNestedExtension original = result;
+          result = new TestNestedExtension();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestNestedExtension MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Descriptor; }
+      }
+
+      public override TestNestedExtension DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.DefaultInstance; }
+      }
+
+      public override TestNestedExtension BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestNestedExtension) {
+          return MergeFrom((TestNestedExtension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestNestedExtension other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testNestedExtensionFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testNestedExtensionFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static TestNestedExtension() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRequired : pb::GeneratedMessage<TestRequired, TestRequired.Builder> {
+    private TestRequired() { }
+    private static readonly TestRequired defaultInstance = new TestRequired().MakeReadOnly();
+    private static readonly string[] _testRequiredFieldNames = new string[] { "a", "b", "c", "dummy10", "dummy11", "dummy12", "dummy13", "dummy14", "dummy15", "dummy16", "dummy17", "dummy18", "dummy19", "dummy2", "dummy20", "dummy21", "dummy22", "dummy23", "dummy24", "dummy25", "dummy26", "dummy27", "dummy28", "dummy29", "dummy30", "dummy31", "dummy32", "dummy4", "dummy5", "dummy6", "dummy7", "dummy8", "dummy9" };
+    private static readonly uint[] _testRequiredFieldTags = new uint[] { 8, 24, 264, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 16, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 32, 40, 48, 56, 64, 72 };
+    public static TestRequired DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestRequired DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestRequired ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRequired__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestRequired, TestRequired.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRequired__FieldAccessorTable; }
+    }
+
+    public const int SingleFieldNumber = 1000;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestRequired> Single;
+    public const int MultiFieldNumber = 1001;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.TestRequired>> Multi;
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+
+    public const int Dummy2FieldNumber = 2;
+    private bool hasDummy2;
+    private int dummy2_;
+    public bool HasDummy2 {
+      get { return hasDummy2; }
+    }
+    public int Dummy2 {
+      get { return dummy2_; }
+    }
+
+    public const int BFieldNumber = 3;
+    private bool hasB;
+    private int b_;
+    public bool HasB {
+      get { return hasB; }
+    }
+    public int B {
+      get { return b_; }
+    }
+
+    public const int Dummy4FieldNumber = 4;
+    private bool hasDummy4;
+    private int dummy4_;
+    public bool HasDummy4 {
+      get { return hasDummy4; }
+    }
+    public int Dummy4 {
+      get { return dummy4_; }
+    }
+
+    public const int Dummy5FieldNumber = 5;
+    private bool hasDummy5;
+    private int dummy5_;
+    public bool HasDummy5 {
+      get { return hasDummy5; }
+    }
+    public int Dummy5 {
+      get { return dummy5_; }
+    }
+
+    public const int Dummy6FieldNumber = 6;
+    private bool hasDummy6;
+    private int dummy6_;
+    public bool HasDummy6 {
+      get { return hasDummy6; }
+    }
+    public int Dummy6 {
+      get { return dummy6_; }
+    }
+
+    public const int Dummy7FieldNumber = 7;
+    private bool hasDummy7;
+    private int dummy7_;
+    public bool HasDummy7 {
+      get { return hasDummy7; }
+    }
+    public int Dummy7 {
+      get { return dummy7_; }
+    }
+
+    public const int Dummy8FieldNumber = 8;
+    private bool hasDummy8;
+    private int dummy8_;
+    public bool HasDummy8 {
+      get { return hasDummy8; }
+    }
+    public int Dummy8 {
+      get { return dummy8_; }
+    }
+
+    public const int Dummy9FieldNumber = 9;
+    private bool hasDummy9;
+    private int dummy9_;
+    public bool HasDummy9 {
+      get { return hasDummy9; }
+    }
+    public int Dummy9 {
+      get { return dummy9_; }
+    }
+
+    public const int Dummy10FieldNumber = 10;
+    private bool hasDummy10;
+    private int dummy10_;
+    public bool HasDummy10 {
+      get { return hasDummy10; }
+    }
+    public int Dummy10 {
+      get { return dummy10_; }
+    }
+
+    public const int Dummy11FieldNumber = 11;
+    private bool hasDummy11;
+    private int dummy11_;
+    public bool HasDummy11 {
+      get { return hasDummy11; }
+    }
+    public int Dummy11 {
+      get { return dummy11_; }
+    }
+
+    public const int Dummy12FieldNumber = 12;
+    private bool hasDummy12;
+    private int dummy12_;
+    public bool HasDummy12 {
+      get { return hasDummy12; }
+    }
+    public int Dummy12 {
+      get { return dummy12_; }
+    }
+
+    public const int Dummy13FieldNumber = 13;
+    private bool hasDummy13;
+    private int dummy13_;
+    public bool HasDummy13 {
+      get { return hasDummy13; }
+    }
+    public int Dummy13 {
+      get { return dummy13_; }
+    }
+
+    public const int Dummy14FieldNumber = 14;
+    private bool hasDummy14;
+    private int dummy14_;
+    public bool HasDummy14 {
+      get { return hasDummy14; }
+    }
+    public int Dummy14 {
+      get { return dummy14_; }
+    }
+
+    public const int Dummy15FieldNumber = 15;
+    private bool hasDummy15;
+    private int dummy15_;
+    public bool HasDummy15 {
+      get { return hasDummy15; }
+    }
+    public int Dummy15 {
+      get { return dummy15_; }
+    }
+
+    public const int Dummy16FieldNumber = 16;
+    private bool hasDummy16;
+    private int dummy16_;
+    public bool HasDummy16 {
+      get { return hasDummy16; }
+    }
+    public int Dummy16 {
+      get { return dummy16_; }
+    }
+
+    public const int Dummy17FieldNumber = 17;
+    private bool hasDummy17;
+    private int dummy17_;
+    public bool HasDummy17 {
+      get { return hasDummy17; }
+    }
+    public int Dummy17 {
+      get { return dummy17_; }
+    }
+
+    public const int Dummy18FieldNumber = 18;
+    private bool hasDummy18;
+    private int dummy18_;
+    public bool HasDummy18 {
+      get { return hasDummy18; }
+    }
+    public int Dummy18 {
+      get { return dummy18_; }
+    }
+
+    public const int Dummy19FieldNumber = 19;
+    private bool hasDummy19;
+    private int dummy19_;
+    public bool HasDummy19 {
+      get { return hasDummy19; }
+    }
+    public int Dummy19 {
+      get { return dummy19_; }
+    }
+
+    public const int Dummy20FieldNumber = 20;
+    private bool hasDummy20;
+    private int dummy20_;
+    public bool HasDummy20 {
+      get { return hasDummy20; }
+    }
+    public int Dummy20 {
+      get { return dummy20_; }
+    }
+
+    public const int Dummy21FieldNumber = 21;
+    private bool hasDummy21;
+    private int dummy21_;
+    public bool HasDummy21 {
+      get { return hasDummy21; }
+    }
+    public int Dummy21 {
+      get { return dummy21_; }
+    }
+
+    public const int Dummy22FieldNumber = 22;
+    private bool hasDummy22;
+    private int dummy22_;
+    public bool HasDummy22 {
+      get { return hasDummy22; }
+    }
+    public int Dummy22 {
+      get { return dummy22_; }
+    }
+
+    public const int Dummy23FieldNumber = 23;
+    private bool hasDummy23;
+    private int dummy23_;
+    public bool HasDummy23 {
+      get { return hasDummy23; }
+    }
+    public int Dummy23 {
+      get { return dummy23_; }
+    }
+
+    public const int Dummy24FieldNumber = 24;
+    private bool hasDummy24;
+    private int dummy24_;
+    public bool HasDummy24 {
+      get { return hasDummy24; }
+    }
+    public int Dummy24 {
+      get { return dummy24_; }
+    }
+
+    public const int Dummy25FieldNumber = 25;
+    private bool hasDummy25;
+    private int dummy25_;
+    public bool HasDummy25 {
+      get { return hasDummy25; }
+    }
+    public int Dummy25 {
+      get { return dummy25_; }
+    }
+
+    public const int Dummy26FieldNumber = 26;
+    private bool hasDummy26;
+    private int dummy26_;
+    public bool HasDummy26 {
+      get { return hasDummy26; }
+    }
+    public int Dummy26 {
+      get { return dummy26_; }
+    }
+
+    public const int Dummy27FieldNumber = 27;
+    private bool hasDummy27;
+    private int dummy27_;
+    public bool HasDummy27 {
+      get { return hasDummy27; }
+    }
+    public int Dummy27 {
+      get { return dummy27_; }
+    }
+
+    public const int Dummy28FieldNumber = 28;
+    private bool hasDummy28;
+    private int dummy28_;
+    public bool HasDummy28 {
+      get { return hasDummy28; }
+    }
+    public int Dummy28 {
+      get { return dummy28_; }
+    }
+
+    public const int Dummy29FieldNumber = 29;
+    private bool hasDummy29;
+    private int dummy29_;
+    public bool HasDummy29 {
+      get { return hasDummy29; }
+    }
+    public int Dummy29 {
+      get { return dummy29_; }
+    }
+
+    public const int Dummy30FieldNumber = 30;
+    private bool hasDummy30;
+    private int dummy30_;
+    public bool HasDummy30 {
+      get { return hasDummy30; }
+    }
+    public int Dummy30 {
+      get { return dummy30_; }
+    }
+
+    public const int Dummy31FieldNumber = 31;
+    private bool hasDummy31;
+    private int dummy31_;
+    public bool HasDummy31 {
+      get { return hasDummy31; }
+    }
+    public int Dummy31 {
+      get { return dummy31_; }
+    }
+
+    public const int Dummy32FieldNumber = 32;
+    private bool hasDummy32;
+    private int dummy32_;
+    public bool HasDummy32 {
+      get { return hasDummy32; }
+    }
+    public int Dummy32 {
+      get { return dummy32_; }
+    }
+
+    public const int CFieldNumber = 33;
+    private bool hasC;
+    private int c_;
+    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::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRequiredFieldNames;
+      if (hasA) {
+        output.WriteInt32(1, field_names[0], A);
+      }
+      if (hasDummy2) {
+        output.WriteInt32(2, field_names[13], Dummy2);
+      }
+      if (hasB) {
+        output.WriteInt32(3, field_names[1], B);
+      }
+      if (hasDummy4) {
+        output.WriteInt32(4, field_names[27], Dummy4);
+      }
+      if (hasDummy5) {
+        output.WriteInt32(5, field_names[28], Dummy5);
+      }
+      if (hasDummy6) {
+        output.WriteInt32(6, field_names[29], Dummy6);
+      }
+      if (hasDummy7) {
+        output.WriteInt32(7, field_names[30], Dummy7);
+      }
+      if (hasDummy8) {
+        output.WriteInt32(8, field_names[31], Dummy8);
+      }
+      if (hasDummy9) {
+        output.WriteInt32(9, field_names[32], Dummy9);
+      }
+      if (hasDummy10) {
+        output.WriteInt32(10, field_names[3], Dummy10);
+      }
+      if (hasDummy11) {
+        output.WriteInt32(11, field_names[4], Dummy11);
+      }
+      if (hasDummy12) {
+        output.WriteInt32(12, field_names[5], Dummy12);
+      }
+      if (hasDummy13) {
+        output.WriteInt32(13, field_names[6], Dummy13);
+      }
+      if (hasDummy14) {
+        output.WriteInt32(14, field_names[7], Dummy14);
+      }
+      if (hasDummy15) {
+        output.WriteInt32(15, field_names[8], Dummy15);
+      }
+      if (hasDummy16) {
+        output.WriteInt32(16, field_names[9], Dummy16);
+      }
+      if (hasDummy17) {
+        output.WriteInt32(17, field_names[10], Dummy17);
+      }
+      if (hasDummy18) {
+        output.WriteInt32(18, field_names[11], Dummy18);
+      }
+      if (hasDummy19) {
+        output.WriteInt32(19, field_names[12], Dummy19);
+      }
+      if (hasDummy20) {
+        output.WriteInt32(20, field_names[14], Dummy20);
+      }
+      if (hasDummy21) {
+        output.WriteInt32(21, field_names[15], Dummy21);
+      }
+      if (hasDummy22) {
+        output.WriteInt32(22, field_names[16], Dummy22);
+      }
+      if (hasDummy23) {
+        output.WriteInt32(23, field_names[17], Dummy23);
+      }
+      if (hasDummy24) {
+        output.WriteInt32(24, field_names[18], Dummy24);
+      }
+      if (hasDummy25) {
+        output.WriteInt32(25, field_names[19], Dummy25);
+      }
+      if (hasDummy26) {
+        output.WriteInt32(26, field_names[20], Dummy26);
+      }
+      if (hasDummy27) {
+        output.WriteInt32(27, field_names[21], Dummy27);
+      }
+      if (hasDummy28) {
+        output.WriteInt32(28, field_names[22], Dummy28);
+      }
+      if (hasDummy29) {
+        output.WriteInt32(29, field_names[23], Dummy29);
+      }
+      if (hasDummy30) {
+        output.WriteInt32(30, field_names[24], Dummy30);
+      }
+      if (hasDummy31) {
+        output.WriteInt32(31, field_names[25], Dummy31);
+      }
+      if (hasDummy32) {
+        output.WriteInt32(32, field_names[26], Dummy32);
+      }
+      if (hasC) {
+        output.WriteInt32(33, field_names[2], C);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 TestRequired ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequired ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRequired ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRequired ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRequired MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRequired prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRequired, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRequired cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestRequired result;
+
+      private TestRequired PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRequired original = result;
+          result = new TestRequired();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestRequired MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequired.Descriptor; }
+      }
+
+      public override TestRequired DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance; }
+      }
+
+      public override TestRequired BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRequired) {
+          return MergeFrom((TestRequired) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestRequired other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance) return this;
+        PrepareBuilder();
+        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 Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRequiredFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRequiredFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+            case 16: {
+              result.hasDummy2 = input.ReadInt32(ref result.dummy2_);
+              break;
+            }
+            case 24: {
+              result.hasB = input.ReadInt32(ref result.b_);
+              break;
+            }
+            case 32: {
+              result.hasDummy4 = input.ReadInt32(ref result.dummy4_);
+              break;
+            }
+            case 40: {
+              result.hasDummy5 = input.ReadInt32(ref result.dummy5_);
+              break;
+            }
+            case 48: {
+              result.hasDummy6 = input.ReadInt32(ref result.dummy6_);
+              break;
+            }
+            case 56: {
+              result.hasDummy7 = input.ReadInt32(ref result.dummy7_);
+              break;
+            }
+            case 64: {
+              result.hasDummy8 = input.ReadInt32(ref result.dummy8_);
+              break;
+            }
+            case 72: {
+              result.hasDummy9 = input.ReadInt32(ref result.dummy9_);
+              break;
+            }
+            case 80: {
+              result.hasDummy10 = input.ReadInt32(ref result.dummy10_);
+              break;
+            }
+            case 88: {
+              result.hasDummy11 = input.ReadInt32(ref result.dummy11_);
+              break;
+            }
+            case 96: {
+              result.hasDummy12 = input.ReadInt32(ref result.dummy12_);
+              break;
+            }
+            case 104: {
+              result.hasDummy13 = input.ReadInt32(ref result.dummy13_);
+              break;
+            }
+            case 112: {
+              result.hasDummy14 = input.ReadInt32(ref result.dummy14_);
+              break;
+            }
+            case 120: {
+              result.hasDummy15 = input.ReadInt32(ref result.dummy15_);
+              break;
+            }
+            case 128: {
+              result.hasDummy16 = input.ReadInt32(ref result.dummy16_);
+              break;
+            }
+            case 136: {
+              result.hasDummy17 = input.ReadInt32(ref result.dummy17_);
+              break;
+            }
+            case 144: {
+              result.hasDummy18 = input.ReadInt32(ref result.dummy18_);
+              break;
+            }
+            case 152: {
+              result.hasDummy19 = input.ReadInt32(ref result.dummy19_);
+              break;
+            }
+            case 160: {
+              result.hasDummy20 = input.ReadInt32(ref result.dummy20_);
+              break;
+            }
+            case 168: {
+              result.hasDummy21 = input.ReadInt32(ref result.dummy21_);
+              break;
+            }
+            case 176: {
+              result.hasDummy22 = input.ReadInt32(ref result.dummy22_);
+              break;
+            }
+            case 184: {
+              result.hasDummy23 = input.ReadInt32(ref result.dummy23_);
+              break;
+            }
+            case 192: {
+              result.hasDummy24 = input.ReadInt32(ref result.dummy24_);
+              break;
+            }
+            case 200: {
+              result.hasDummy25 = input.ReadInt32(ref result.dummy25_);
+              break;
+            }
+            case 208: {
+              result.hasDummy26 = input.ReadInt32(ref result.dummy26_);
+              break;
+            }
+            case 216: {
+              result.hasDummy27 = input.ReadInt32(ref result.dummy27_);
+              break;
+            }
+            case 224: {
+              result.hasDummy28 = input.ReadInt32(ref result.dummy28_);
+              break;
+            }
+            case 232: {
+              result.hasDummy29 = input.ReadInt32(ref result.dummy29_);
+              break;
+            }
+            case 240: {
+              result.hasDummy30 = input.ReadInt32(ref result.dummy30_);
+              break;
+            }
+            case 248: {
+              result.hasDummy31 = input.ReadInt32(ref result.dummy31_);
+              break;
+            }
+            case 256: {
+              result.hasDummy32 = input.ReadInt32(ref result.dummy32_);
+              break;
+            }
+            case 264: {
+              result.hasC = input.ReadInt32(ref result.c_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+
+      public bool HasDummy2 {
+        get { return result.hasDummy2; }
+      }
+      public int Dummy2 {
+        get { return result.Dummy2; }
+        set { SetDummy2(value); }
+      }
+      public Builder SetDummy2(int value) {
+        PrepareBuilder();
+        result.hasDummy2 = true;
+        result.dummy2_ = value;
+        return this;
+      }
+      public Builder ClearDummy2() {
+        PrepareBuilder();
+        result.hasDummy2 = false;
+        result.dummy2_ = 0;
+        return this;
+      }
+
+      public bool HasB {
+        get { return result.hasB; }
+      }
+      public int B {
+        get { return result.B; }
+        set { SetB(value); }
+      }
+      public Builder SetB(int value) {
+        PrepareBuilder();
+        result.hasB = true;
+        result.b_ = value;
+        return this;
+      }
+      public Builder ClearB() {
+        PrepareBuilder();
+        result.hasB = false;
+        result.b_ = 0;
+        return this;
+      }
+
+      public bool HasDummy4 {
+        get { return result.hasDummy4; }
+      }
+      public int Dummy4 {
+        get { return result.Dummy4; }
+        set { SetDummy4(value); }
+      }
+      public Builder SetDummy4(int value) {
+        PrepareBuilder();
+        result.hasDummy4 = true;
+        result.dummy4_ = value;
+        return this;
+      }
+      public Builder ClearDummy4() {
+        PrepareBuilder();
+        result.hasDummy4 = false;
+        result.dummy4_ = 0;
+        return this;
+      }
+
+      public bool HasDummy5 {
+        get { return result.hasDummy5; }
+      }
+      public int Dummy5 {
+        get { return result.Dummy5; }
+        set { SetDummy5(value); }
+      }
+      public Builder SetDummy5(int value) {
+        PrepareBuilder();
+        result.hasDummy5 = true;
+        result.dummy5_ = value;
+        return this;
+      }
+      public Builder ClearDummy5() {
+        PrepareBuilder();
+        result.hasDummy5 = false;
+        result.dummy5_ = 0;
+        return this;
+      }
+
+      public bool HasDummy6 {
+        get { return result.hasDummy6; }
+      }
+      public int Dummy6 {
+        get { return result.Dummy6; }
+        set { SetDummy6(value); }
+      }
+      public Builder SetDummy6(int value) {
+        PrepareBuilder();
+        result.hasDummy6 = true;
+        result.dummy6_ = value;
+        return this;
+      }
+      public Builder ClearDummy6() {
+        PrepareBuilder();
+        result.hasDummy6 = false;
+        result.dummy6_ = 0;
+        return this;
+      }
+
+      public bool HasDummy7 {
+        get { return result.hasDummy7; }
+      }
+      public int Dummy7 {
+        get { return result.Dummy7; }
+        set { SetDummy7(value); }
+      }
+      public Builder SetDummy7(int value) {
+        PrepareBuilder();
+        result.hasDummy7 = true;
+        result.dummy7_ = value;
+        return this;
+      }
+      public Builder ClearDummy7() {
+        PrepareBuilder();
+        result.hasDummy7 = false;
+        result.dummy7_ = 0;
+        return this;
+      }
+
+      public bool HasDummy8 {
+        get { return result.hasDummy8; }
+      }
+      public int Dummy8 {
+        get { return result.Dummy8; }
+        set { SetDummy8(value); }
+      }
+      public Builder SetDummy8(int value) {
+        PrepareBuilder();
+        result.hasDummy8 = true;
+        result.dummy8_ = value;
+        return this;
+      }
+      public Builder ClearDummy8() {
+        PrepareBuilder();
+        result.hasDummy8 = false;
+        result.dummy8_ = 0;
+        return this;
+      }
+
+      public bool HasDummy9 {
+        get { return result.hasDummy9; }
+      }
+      public int Dummy9 {
+        get { return result.Dummy9; }
+        set { SetDummy9(value); }
+      }
+      public Builder SetDummy9(int value) {
+        PrepareBuilder();
+        result.hasDummy9 = true;
+        result.dummy9_ = value;
+        return this;
+      }
+      public Builder ClearDummy9() {
+        PrepareBuilder();
+        result.hasDummy9 = false;
+        result.dummy9_ = 0;
+        return this;
+      }
+
+      public bool HasDummy10 {
+        get { return result.hasDummy10; }
+      }
+      public int Dummy10 {
+        get { return result.Dummy10; }
+        set { SetDummy10(value); }
+      }
+      public Builder SetDummy10(int value) {
+        PrepareBuilder();
+        result.hasDummy10 = true;
+        result.dummy10_ = value;
+        return this;
+      }
+      public Builder ClearDummy10() {
+        PrepareBuilder();
+        result.hasDummy10 = false;
+        result.dummy10_ = 0;
+        return this;
+      }
+
+      public bool HasDummy11 {
+        get { return result.hasDummy11; }
+      }
+      public int Dummy11 {
+        get { return result.Dummy11; }
+        set { SetDummy11(value); }
+      }
+      public Builder SetDummy11(int value) {
+        PrepareBuilder();
+        result.hasDummy11 = true;
+        result.dummy11_ = value;
+        return this;
+      }
+      public Builder ClearDummy11() {
+        PrepareBuilder();
+        result.hasDummy11 = false;
+        result.dummy11_ = 0;
+        return this;
+      }
+
+      public bool HasDummy12 {
+        get { return result.hasDummy12; }
+      }
+      public int Dummy12 {
+        get { return result.Dummy12; }
+        set { SetDummy12(value); }
+      }
+      public Builder SetDummy12(int value) {
+        PrepareBuilder();
+        result.hasDummy12 = true;
+        result.dummy12_ = value;
+        return this;
+      }
+      public Builder ClearDummy12() {
+        PrepareBuilder();
+        result.hasDummy12 = false;
+        result.dummy12_ = 0;
+        return this;
+      }
+
+      public bool HasDummy13 {
+        get { return result.hasDummy13; }
+      }
+      public int Dummy13 {
+        get { return result.Dummy13; }
+        set { SetDummy13(value); }
+      }
+      public Builder SetDummy13(int value) {
+        PrepareBuilder();
+        result.hasDummy13 = true;
+        result.dummy13_ = value;
+        return this;
+      }
+      public Builder ClearDummy13() {
+        PrepareBuilder();
+        result.hasDummy13 = false;
+        result.dummy13_ = 0;
+        return this;
+      }
+
+      public bool HasDummy14 {
+        get { return result.hasDummy14; }
+      }
+      public int Dummy14 {
+        get { return result.Dummy14; }
+        set { SetDummy14(value); }
+      }
+      public Builder SetDummy14(int value) {
+        PrepareBuilder();
+        result.hasDummy14 = true;
+        result.dummy14_ = value;
+        return this;
+      }
+      public Builder ClearDummy14() {
+        PrepareBuilder();
+        result.hasDummy14 = false;
+        result.dummy14_ = 0;
+        return this;
+      }
+
+      public bool HasDummy15 {
+        get { return result.hasDummy15; }
+      }
+      public int Dummy15 {
+        get { return result.Dummy15; }
+        set { SetDummy15(value); }
+      }
+      public Builder SetDummy15(int value) {
+        PrepareBuilder();
+        result.hasDummy15 = true;
+        result.dummy15_ = value;
+        return this;
+      }
+      public Builder ClearDummy15() {
+        PrepareBuilder();
+        result.hasDummy15 = false;
+        result.dummy15_ = 0;
+        return this;
+      }
+
+      public bool HasDummy16 {
+        get { return result.hasDummy16; }
+      }
+      public int Dummy16 {
+        get { return result.Dummy16; }
+        set { SetDummy16(value); }
+      }
+      public Builder SetDummy16(int value) {
+        PrepareBuilder();
+        result.hasDummy16 = true;
+        result.dummy16_ = value;
+        return this;
+      }
+      public Builder ClearDummy16() {
+        PrepareBuilder();
+        result.hasDummy16 = false;
+        result.dummy16_ = 0;
+        return this;
+      }
+
+      public bool HasDummy17 {
+        get { return result.hasDummy17; }
+      }
+      public int Dummy17 {
+        get { return result.Dummy17; }
+        set { SetDummy17(value); }
+      }
+      public Builder SetDummy17(int value) {
+        PrepareBuilder();
+        result.hasDummy17 = true;
+        result.dummy17_ = value;
+        return this;
+      }
+      public Builder ClearDummy17() {
+        PrepareBuilder();
+        result.hasDummy17 = false;
+        result.dummy17_ = 0;
+        return this;
+      }
+
+      public bool HasDummy18 {
+        get { return result.hasDummy18; }
+      }
+      public int Dummy18 {
+        get { return result.Dummy18; }
+        set { SetDummy18(value); }
+      }
+      public Builder SetDummy18(int value) {
+        PrepareBuilder();
+        result.hasDummy18 = true;
+        result.dummy18_ = value;
+        return this;
+      }
+      public Builder ClearDummy18() {
+        PrepareBuilder();
+        result.hasDummy18 = false;
+        result.dummy18_ = 0;
+        return this;
+      }
+
+      public bool HasDummy19 {
+        get { return result.hasDummy19; }
+      }
+      public int Dummy19 {
+        get { return result.Dummy19; }
+        set { SetDummy19(value); }
+      }
+      public Builder SetDummy19(int value) {
+        PrepareBuilder();
+        result.hasDummy19 = true;
+        result.dummy19_ = value;
+        return this;
+      }
+      public Builder ClearDummy19() {
+        PrepareBuilder();
+        result.hasDummy19 = false;
+        result.dummy19_ = 0;
+        return this;
+      }
+
+      public bool HasDummy20 {
+        get { return result.hasDummy20; }
+      }
+      public int Dummy20 {
+        get { return result.Dummy20; }
+        set { SetDummy20(value); }
+      }
+      public Builder SetDummy20(int value) {
+        PrepareBuilder();
+        result.hasDummy20 = true;
+        result.dummy20_ = value;
+        return this;
+      }
+      public Builder ClearDummy20() {
+        PrepareBuilder();
+        result.hasDummy20 = false;
+        result.dummy20_ = 0;
+        return this;
+      }
+
+      public bool HasDummy21 {
+        get { return result.hasDummy21; }
+      }
+      public int Dummy21 {
+        get { return result.Dummy21; }
+        set { SetDummy21(value); }
+      }
+      public Builder SetDummy21(int value) {
+        PrepareBuilder();
+        result.hasDummy21 = true;
+        result.dummy21_ = value;
+        return this;
+      }
+      public Builder ClearDummy21() {
+        PrepareBuilder();
+        result.hasDummy21 = false;
+        result.dummy21_ = 0;
+        return this;
+      }
+
+      public bool HasDummy22 {
+        get { return result.hasDummy22; }
+      }
+      public int Dummy22 {
+        get { return result.Dummy22; }
+        set { SetDummy22(value); }
+      }
+      public Builder SetDummy22(int value) {
+        PrepareBuilder();
+        result.hasDummy22 = true;
+        result.dummy22_ = value;
+        return this;
+      }
+      public Builder ClearDummy22() {
+        PrepareBuilder();
+        result.hasDummy22 = false;
+        result.dummy22_ = 0;
+        return this;
+      }
+
+      public bool HasDummy23 {
+        get { return result.hasDummy23; }
+      }
+      public int Dummy23 {
+        get { return result.Dummy23; }
+        set { SetDummy23(value); }
+      }
+      public Builder SetDummy23(int value) {
+        PrepareBuilder();
+        result.hasDummy23 = true;
+        result.dummy23_ = value;
+        return this;
+      }
+      public Builder ClearDummy23() {
+        PrepareBuilder();
+        result.hasDummy23 = false;
+        result.dummy23_ = 0;
+        return this;
+      }
+
+      public bool HasDummy24 {
+        get { return result.hasDummy24; }
+      }
+      public int Dummy24 {
+        get { return result.Dummy24; }
+        set { SetDummy24(value); }
+      }
+      public Builder SetDummy24(int value) {
+        PrepareBuilder();
+        result.hasDummy24 = true;
+        result.dummy24_ = value;
+        return this;
+      }
+      public Builder ClearDummy24() {
+        PrepareBuilder();
+        result.hasDummy24 = false;
+        result.dummy24_ = 0;
+        return this;
+      }
+
+      public bool HasDummy25 {
+        get { return result.hasDummy25; }
+      }
+      public int Dummy25 {
+        get { return result.Dummy25; }
+        set { SetDummy25(value); }
+      }
+      public Builder SetDummy25(int value) {
+        PrepareBuilder();
+        result.hasDummy25 = true;
+        result.dummy25_ = value;
+        return this;
+      }
+      public Builder ClearDummy25() {
+        PrepareBuilder();
+        result.hasDummy25 = false;
+        result.dummy25_ = 0;
+        return this;
+      }
+
+      public bool HasDummy26 {
+        get { return result.hasDummy26; }
+      }
+      public int Dummy26 {
+        get { return result.Dummy26; }
+        set { SetDummy26(value); }
+      }
+      public Builder SetDummy26(int value) {
+        PrepareBuilder();
+        result.hasDummy26 = true;
+        result.dummy26_ = value;
+        return this;
+      }
+      public Builder ClearDummy26() {
+        PrepareBuilder();
+        result.hasDummy26 = false;
+        result.dummy26_ = 0;
+        return this;
+      }
+
+      public bool HasDummy27 {
+        get { return result.hasDummy27; }
+      }
+      public int Dummy27 {
+        get { return result.Dummy27; }
+        set { SetDummy27(value); }
+      }
+      public Builder SetDummy27(int value) {
+        PrepareBuilder();
+        result.hasDummy27 = true;
+        result.dummy27_ = value;
+        return this;
+      }
+      public Builder ClearDummy27() {
+        PrepareBuilder();
+        result.hasDummy27 = false;
+        result.dummy27_ = 0;
+        return this;
+      }
+
+      public bool HasDummy28 {
+        get { return result.hasDummy28; }
+      }
+      public int Dummy28 {
+        get { return result.Dummy28; }
+        set { SetDummy28(value); }
+      }
+      public Builder SetDummy28(int value) {
+        PrepareBuilder();
+        result.hasDummy28 = true;
+        result.dummy28_ = value;
+        return this;
+      }
+      public Builder ClearDummy28() {
+        PrepareBuilder();
+        result.hasDummy28 = false;
+        result.dummy28_ = 0;
+        return this;
+      }
+
+      public bool HasDummy29 {
+        get { return result.hasDummy29; }
+      }
+      public int Dummy29 {
+        get { return result.Dummy29; }
+        set { SetDummy29(value); }
+      }
+      public Builder SetDummy29(int value) {
+        PrepareBuilder();
+        result.hasDummy29 = true;
+        result.dummy29_ = value;
+        return this;
+      }
+      public Builder ClearDummy29() {
+        PrepareBuilder();
+        result.hasDummy29 = false;
+        result.dummy29_ = 0;
+        return this;
+      }
+
+      public bool HasDummy30 {
+        get { return result.hasDummy30; }
+      }
+      public int Dummy30 {
+        get { return result.Dummy30; }
+        set { SetDummy30(value); }
+      }
+      public Builder SetDummy30(int value) {
+        PrepareBuilder();
+        result.hasDummy30 = true;
+        result.dummy30_ = value;
+        return this;
+      }
+      public Builder ClearDummy30() {
+        PrepareBuilder();
+        result.hasDummy30 = false;
+        result.dummy30_ = 0;
+        return this;
+      }
+
+      public bool HasDummy31 {
+        get { return result.hasDummy31; }
+      }
+      public int Dummy31 {
+        get { return result.Dummy31; }
+        set { SetDummy31(value); }
+      }
+      public Builder SetDummy31(int value) {
+        PrepareBuilder();
+        result.hasDummy31 = true;
+        result.dummy31_ = value;
+        return this;
+      }
+      public Builder ClearDummy31() {
+        PrepareBuilder();
+        result.hasDummy31 = false;
+        result.dummy31_ = 0;
+        return this;
+      }
+
+      public bool HasDummy32 {
+        get { return result.hasDummy32; }
+      }
+      public int Dummy32 {
+        get { return result.Dummy32; }
+        set { SetDummy32(value); }
+      }
+      public Builder SetDummy32(int value) {
+        PrepareBuilder();
+        result.hasDummy32 = true;
+        result.dummy32_ = value;
+        return this;
+      }
+      public Builder ClearDummy32() {
+        PrepareBuilder();
+        result.hasDummy32 = false;
+        result.dummy32_ = 0;
+        return this;
+      }
+
+      public bool HasC {
+        get { return result.hasC; }
+      }
+      public int C {
+        get { return result.C; }
+        set { SetC(value); }
+      }
+      public Builder SetC(int value) {
+        PrepareBuilder();
+        result.hasC = true;
+        result.c_ = value;
+        return this;
+      }
+      public Builder ClearC() {
+        PrepareBuilder();
+        result.hasC = false;
+        result.c_ = 0;
+        return this;
+      }
+    }
+    static TestRequired() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRequiredForeign : pb::GeneratedMessage<TestRequiredForeign, TestRequiredForeign.Builder> {
+    private TestRequiredForeign() { }
+    private static readonly TestRequiredForeign defaultInstance = new TestRequiredForeign().MakeReadOnly();
+    private static readonly string[] _testRequiredForeignFieldNames = new string[] { "dummy", "optional_message", "repeated_message" };
+    private static readonly uint[] _testRequiredForeignFieldTags = new uint[] { 24, 10, 18 };
+    public static TestRequiredForeign DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestRequiredForeign DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestRequiredForeign ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRequiredForeign__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestRequiredForeign, TestRequiredForeign.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable; }
+    }
+
+    public const int OptionalMessageFieldNumber = 1;
+    private bool hasOptionalMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestRequired optionalMessage_;
+    public bool HasOptionalMessage {
+      get { return hasOptionalMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestRequired OptionalMessage {
+      get { return optionalMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance; }
+    }
+
+    public const int RepeatedMessageFieldNumber = 2;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestRequired> repeatedMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestRequired>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestRequired> RepeatedMessageList {
+      get { return repeatedMessage_; }
+    }
+    public int RepeatedMessageCount {
+      get { return repeatedMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestRequired GetRepeatedMessage(int index) {
+      return repeatedMessage_[index];
+    }
+
+    public const int DummyFieldNumber = 3;
+    private bool hasDummy;
+    private int dummy_;
+    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 (global::Google.ProtocolBuffers.TestProtos.TestRequired element in RepeatedMessageList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRequiredForeignFieldNames;
+      if (hasOptionalMessage) {
+        output.WriteMessage(1, field_names[1], OptionalMessage);
+      }
+      if (repeatedMessage_.Count > 0) {
+        output.WriteMessageArray(2, field_names[2], repeatedMessage_);
+      }
+      if (hasDummy) {
+        output.WriteInt32(3, field_names[0], Dummy);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasOptionalMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(1, OptionalMessage);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.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 TestRequiredForeign ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRequiredForeign ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRequiredForeign MakeReadOnly() {
+      repeatedMessage_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRequiredForeign prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRequiredForeign, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRequiredForeign cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestRequiredForeign result;
+
+      private TestRequiredForeign PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRequiredForeign original = result;
+          result = new TestRequiredForeign();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestRequiredForeign MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Descriptor; }
+      }
+
+      public override TestRequiredForeign DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.DefaultInstance; }
+      }
+
+      public override TestRequiredForeign BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRequiredForeign) {
+          return MergeFrom((TestRequiredForeign) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestRequiredForeign other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasOptionalMessage) {
+          MergeOptionalMessage(other.OptionalMessage);
+        }
+        if (other.repeatedMessage_.Count != 0) {
+          result.repeatedMessage_.Add(other.repeatedMessage_);
+        }
+        if (other.HasDummy) {
+          Dummy = other.Dummy;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRequiredForeignFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRequiredForeignFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestRequired.CreateBuilder();
+              if (result.hasOptionalMessage) {
+                subBuilder.MergeFrom(OptionalMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 18: {
+              input.ReadMessageArray(tag, field_name, result.repeatedMessage_, global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 24: {
+              result.hasDummy = input.ReadInt32(ref result.dummy_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasOptionalMessage {
+       get { return result.hasOptionalMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestRequired OptionalMessage {
+        get { return result.OptionalMessage; }
+        set { SetOptionalMessage(value); }
+      }
+      public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalMessage &&
+            result.optionalMessage_ != global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance) {
+            result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestRequired.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalMessage_ = value;
+        }
+        result.hasOptionalMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalMessage() {
+        PrepareBuilder();
+        result.hasOptionalMessage = false;
+        result.optionalMessage_ = null;
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestRequired> RepeatedMessageList {
+        get { return PrepareBuilder().repeatedMessage_; }
+      }
+      public int RepeatedMessageCount {
+        get { return result.RepeatedMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestRequired GetRepeatedMessage(int index) {
+        return result.GetRepeatedMessage(index);
+      }
+      public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestRequired value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestRequired> values) {
+        PrepareBuilder();
+        result.repeatedMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedMessage() {
+        PrepareBuilder();
+        result.repeatedMessage_.Clear();
+        return this;
+      }
+
+      public bool HasDummy {
+        get { return result.hasDummy; }
+      }
+      public int Dummy {
+        get { return result.Dummy; }
+        set { SetDummy(value); }
+      }
+      public Builder SetDummy(int value) {
+        PrepareBuilder();
+        result.hasDummy = true;
+        result.dummy_ = value;
+        return this;
+      }
+      public Builder ClearDummy() {
+        PrepareBuilder();
+        result.hasDummy = false;
+        result.dummy_ = 0;
+        return this;
+      }
+    }
+    static TestRequiredForeign() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestForeignNested : pb::GeneratedMessage<TestForeignNested, TestForeignNested.Builder> {
+    private TestForeignNested() { }
+    private static readonly TestForeignNested defaultInstance = new TestForeignNested().MakeReadOnly();
+    private static readonly string[] _testForeignNestedFieldNames = new string[] { "foreign_nested" };
+    private static readonly uint[] _testForeignNestedFieldTags = new uint[] { 10 };
+    public static TestForeignNested DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestForeignNested DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestForeignNested ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestForeignNested__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestForeignNested, TestForeignNested.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable; }
+    }
+
+    public const int ForeignNestedFieldNumber = 1;
+    private bool hasForeignNested;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage foreignNested_;
+    public bool HasForeignNested {
+      get { return hasForeignNested; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage ForeignNested {
+      get { return foreignNested_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testForeignNestedFieldNames;
+      if (hasForeignNested) {
+        output.WriteMessage(1, field_names[0], ForeignNested);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 TestForeignNested ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestForeignNested ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestForeignNested ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestForeignNested MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestForeignNested prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestForeignNested, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestForeignNested cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestForeignNested result;
+
+      private TestForeignNested PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestForeignNested original = result;
+          result = new TestForeignNested();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestForeignNested MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Descriptor; }
+      }
+
+      public override TestForeignNested DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestForeignNested.DefaultInstance; }
+      }
+
+      public override TestForeignNested BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestForeignNested) {
+          return MergeFrom((TestForeignNested) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestForeignNested other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestForeignNested.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasForeignNested) {
+          MergeForeignNested(other.ForeignNested);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testForeignNestedFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testForeignNestedFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (result.hasForeignNested) {
+                subBuilder.MergeFrom(ForeignNested);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              ForeignNested = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasForeignNested {
+       get { return result.hasForeignNested; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage ForeignNested {
+        get { return result.ForeignNested; }
+        set { SetForeignNested(value); }
+      }
+      public Builder SetForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasForeignNested = true;
+        result.foreignNested_ = value;
+        return this;
+      }
+      public Builder SetForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasForeignNested = true;
+        result.foreignNested_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasForeignNested &&
+            result.foreignNested_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) {
+            result.foreignNested_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder(result.foreignNested_).MergeFrom(value).BuildPartial();
+        } else {
+          result.foreignNested_ = value;
+        }
+        result.hasForeignNested = true;
+        return this;
+      }
+      public Builder ClearForeignNested() {
+        PrepareBuilder();
+        result.hasForeignNested = false;
+        result.foreignNested_ = null;
+        return this;
+      }
+    }
+    static TestForeignNested() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestEmptyMessage : pb::GeneratedMessage<TestEmptyMessage, TestEmptyMessage.Builder> {
+    private TestEmptyMessage() { }
+    private static readonly TestEmptyMessage defaultInstance = new TestEmptyMessage().MakeReadOnly();
+    private static readonly string[] _testEmptyMessageFieldNames = new string[] {  };
+    private static readonly uint[] _testEmptyMessageFieldTags = new uint[] {  };
+    public static TestEmptyMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestEmptyMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestEmptyMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestEmptyMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestEmptyMessage, TestEmptyMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testEmptyMessageFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestEmptyMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestEmptyMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestEmptyMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestEmptyMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestEmptyMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestEmptyMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestEmptyMessage result;
+
+      private TestEmptyMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestEmptyMessage original = result;
+          result = new TestEmptyMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestEmptyMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Descriptor; }
+      }
+
+      public override TestEmptyMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.DefaultInstance; }
+      }
+
+      public override TestEmptyMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestEmptyMessage) {
+          return MergeFrom((TestEmptyMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestEmptyMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testEmptyMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testEmptyMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static TestEmptyMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestEmptyMessageWithExtensions : pb::ExtendableMessage<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder> {
+    private TestEmptyMessageWithExtensions() { }
+    private static readonly TestEmptyMessageWithExtensions defaultInstance = new TestEmptyMessageWithExtensions().MakeReadOnly();
+    private static readonly string[] _testEmptyMessageWithExtensionsFieldNames = new string[] {  };
+    private static readonly uint[] _testEmptyMessageWithExtensionsFieldTags = new uint[] {  };
+    public static TestEmptyMessageWithExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestEmptyMessageWithExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestEmptyMessageWithExtensions ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testEmptyMessageWithExtensionsFieldNames;
+      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;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestEmptyMessageWithExtensions MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestEmptyMessageWithExtensions prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestEmptyMessageWithExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestEmptyMessageWithExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestEmptyMessageWithExtensions result;
+
+      private TestEmptyMessageWithExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestEmptyMessageWithExtensions original = result;
+          result = new TestEmptyMessageWithExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestEmptyMessageWithExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Descriptor; }
+      }
+
+      public override TestEmptyMessageWithExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.DefaultInstance; }
+      }
+
+      public override TestEmptyMessageWithExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestEmptyMessageWithExtensions) {
+          return MergeFrom((TestEmptyMessageWithExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestEmptyMessageWithExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testEmptyMessageWithExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testEmptyMessageWithExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static TestEmptyMessageWithExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMultipleExtensionRanges : pb::ExtendableMessage<TestMultipleExtensionRanges, TestMultipleExtensionRanges.Builder> {
+    private TestMultipleExtensionRanges() { }
+    private static readonly TestMultipleExtensionRanges defaultInstance = new TestMultipleExtensionRanges().MakeReadOnly();
+    private static readonly string[] _testMultipleExtensionRangesFieldNames = new string[] {  };
+    private static readonly uint[] _testMultipleExtensionRangesFieldTags = new uint[] {  };
+    public static TestMultipleExtensionRanges DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestMultipleExtensionRanges DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestMultipleExtensionRanges ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestMultipleExtensionRanges__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestMultipleExtensionRanges, TestMultipleExtensionRanges.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestMultipleExtensionRanges__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testMultipleExtensionRangesFieldNames;
+      pb::ExtendableMessage<TestMultipleExtensionRanges, TestMultipleExtensionRanges.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      extensionWriter.WriteUntil(43, output);
+      extensionWriter.WriteUntil(4244, output);
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestMultipleExtensionRanges ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestMultipleExtensionRanges MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestMultipleExtensionRanges prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestMultipleExtensionRanges, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestMultipleExtensionRanges cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestMultipleExtensionRanges result;
+
+      private TestMultipleExtensionRanges PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestMultipleExtensionRanges original = result;
+          result = new TestMultipleExtensionRanges();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestMultipleExtensionRanges MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.Descriptor; }
+      }
+
+      public override TestMultipleExtensionRanges DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.DefaultInstance; }
+      }
+
+      public override TestMultipleExtensionRanges BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestMultipleExtensionRanges) {
+          return MergeFrom((TestMultipleExtensionRanges) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestMultipleExtensionRanges other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testMultipleExtensionRangesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testMultipleExtensionRangesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static TestMultipleExtensionRanges() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestReallyLargeTagNumber : pb::GeneratedMessage<TestReallyLargeTagNumber, TestReallyLargeTagNumber.Builder> {
+    private TestReallyLargeTagNumber() { }
+    private static readonly TestReallyLargeTagNumber defaultInstance = new TestReallyLargeTagNumber().MakeReadOnly();
+    private static readonly string[] _testReallyLargeTagNumberFieldNames = new string[] { "a", "bb" };
+    private static readonly uint[] _testReallyLargeTagNumberFieldTags = new uint[] { 8, 2147483640 };
+    public static TestReallyLargeTagNumber DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestReallyLargeTagNumber DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestReallyLargeTagNumber ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestReallyLargeTagNumber, TestReallyLargeTagNumber.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable; }
+    }
+
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+
+    public const int BbFieldNumber = 268435455;
+    private bool hasBb;
+    private int bb_;
+    public bool HasBb {
+      get { return hasBb; }
+    }
+    public int Bb {
+      get { return bb_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testReallyLargeTagNumberFieldNames;
+      if (hasA) {
+        output.WriteInt32(1, field_names[0], A);
+      }
+      if (hasBb) {
+        output.WriteInt32(268435455, field_names[1], Bb);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 TestReallyLargeTagNumber ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestReallyLargeTagNumber MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestReallyLargeTagNumber prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestReallyLargeTagNumber, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestReallyLargeTagNumber cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestReallyLargeTagNumber result;
+
+      private TestReallyLargeTagNumber PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestReallyLargeTagNumber original = result;
+          result = new TestReallyLargeTagNumber();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestReallyLargeTagNumber MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Descriptor; }
+      }
+
+      public override TestReallyLargeTagNumber DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.DefaultInstance; }
+      }
+
+      public override TestReallyLargeTagNumber BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestReallyLargeTagNumber) {
+          return MergeFrom((TestReallyLargeTagNumber) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestReallyLargeTagNumber other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          A = other.A;
+        }
+        if (other.HasBb) {
+          Bb = other.Bb;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testReallyLargeTagNumberFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testReallyLargeTagNumberFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+            case 2147483640: {
+              result.hasBb = input.ReadInt32(ref result.bb_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+
+      public bool HasBb {
+        get { return result.hasBb; }
+      }
+      public int Bb {
+        get { return result.Bb; }
+        set { SetBb(value); }
+      }
+      public Builder SetBb(int value) {
+        PrepareBuilder();
+        result.hasBb = true;
+        result.bb_ = value;
+        return this;
+      }
+      public Builder ClearBb() {
+        PrepareBuilder();
+        result.hasBb = false;
+        result.bb_ = 0;
+        return this;
+      }
+    }
+    static TestReallyLargeTagNumber() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRecursiveMessage : pb::GeneratedMessage<TestRecursiveMessage, TestRecursiveMessage.Builder> {
+    private TestRecursiveMessage() { }
+    private static readonly TestRecursiveMessage defaultInstance = new TestRecursiveMessage().MakeReadOnly();
+    private static readonly string[] _testRecursiveMessageFieldNames = new string[] { "a", "i" };
+    private static readonly uint[] _testRecursiveMessageFieldTags = new uint[] { 10, 16 };
+    public static TestRecursiveMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestRecursiveMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestRecursiveMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestRecursiveMessage, TestRecursiveMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable; }
+    }
+
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage A {
+      get { return a_ ?? global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance; }
+    }
+
+    public const int IFieldNumber = 2;
+    private bool hasI;
+    private int i_;
+    public bool HasI {
+      get { return hasI; }
+    }
+    public int I {
+      get { return i_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRecursiveMessageFieldNames;
+      if (hasA) {
+        output.WriteMessage(1, field_names[0], A);
+      }
+      if (hasI) {
+        output.WriteInt32(2, field_names[1], I);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 TestRecursiveMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRecursiveMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRecursiveMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRecursiveMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRecursiveMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestRecursiveMessage result;
+
+      private TestRecursiveMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRecursiveMessage original = result;
+          result = new TestRecursiveMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestRecursiveMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Descriptor; }
+      }
+
+      public override TestRecursiveMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance; }
+      }
+
+      public override TestRecursiveMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRecursiveMessage) {
+          return MergeFrom((TestRecursiveMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestRecursiveMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          MergeA(other.A);
+        }
+        if (other.HasI) {
+          I = other.I;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRecursiveMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRecursiveMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.CreateBuilder();
+              if (result.hasA) {
+                subBuilder.MergeFrom(A);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              A = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              result.hasI = input.ReadInt32(ref result.i_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasA {
+       get { return result.hasA; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasA &&
+            result.a_ != global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance) {
+            result.a_ = global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();
+        } else {
+          result.a_ = value;
+        }
+        result.hasA = true;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = null;
+        return this;
+      }
+
+      public bool HasI {
+        get { return result.hasI; }
+      }
+      public int I {
+        get { return result.I; }
+        set { SetI(value); }
+      }
+      public Builder SetI(int value) {
+        PrepareBuilder();
+        result.hasI = true;
+        result.i_ = value;
+        return this;
+      }
+      public Builder ClearI() {
+        PrepareBuilder();
+        result.hasI = false;
+        result.i_ = 0;
+        return this;
+      }
+    }
+    static TestRecursiveMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMutualRecursionA : pb::GeneratedMessage<TestMutualRecursionA, TestMutualRecursionA.Builder> {
+    private TestMutualRecursionA() { }
+    private static readonly TestMutualRecursionA defaultInstance = new TestMutualRecursionA().MakeReadOnly();
+    private static readonly string[] _testMutualRecursionAFieldNames = new string[] { "bb" };
+    private static readonly uint[] _testMutualRecursionAFieldTags = new uint[] { 10 };
+    public static TestMutualRecursionA DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestMutualRecursionA DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestMutualRecursionA ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestMutualRecursionA, TestMutualRecursionA.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable; }
+    }
+
+    public const int BbFieldNumber = 1;
+    private bool hasBb;
+    private global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB bb_;
+    public bool HasBb {
+      get { return hasBb; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB Bb {
+      get { return bb_ ?? global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testMutualRecursionAFieldNames;
+      if (hasBb) {
+        output.WriteMessage(1, field_names[0], Bb);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 TestMutualRecursionA ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestMutualRecursionA MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestMutualRecursionA prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestMutualRecursionA, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestMutualRecursionA cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestMutualRecursionA result;
+
+      private TestMutualRecursionA PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestMutualRecursionA original = result;
+          result = new TestMutualRecursionA();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestMutualRecursionA MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Descriptor; }
+      }
+
+      public override TestMutualRecursionA DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance; }
+      }
+
+      public override TestMutualRecursionA BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestMutualRecursionA) {
+          return MergeFrom((TestMutualRecursionA) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestMutualRecursionA other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasBb) {
+          MergeBb(other.Bb);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testMutualRecursionAFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testMutualRecursionAFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.CreateBuilder();
+              if (result.hasBb) {
+                subBuilder.MergeFrom(Bb);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Bb = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasBb {
+       get { return result.hasBb; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB Bb {
+        get { return result.Bb; }
+        set { SetBb(value); }
+      }
+      public Builder SetBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBb = true;
+        result.bb_ = value;
+        return this;
+      }
+      public Builder SetBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasBb = true;
+        result.bb_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasBb &&
+            result.bb_ != global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance) {
+            result.bb_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.CreateBuilder(result.bb_).MergeFrom(value).BuildPartial();
+        } else {
+          result.bb_ = value;
+        }
+        result.hasBb = true;
+        return this;
+      }
+      public Builder ClearBb() {
+        PrepareBuilder();
+        result.hasBb = false;
+        result.bb_ = null;
+        return this;
+      }
+    }
+    static TestMutualRecursionA() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMutualRecursionB : pb::GeneratedMessage<TestMutualRecursionB, TestMutualRecursionB.Builder> {
+    private TestMutualRecursionB() { }
+    private static readonly TestMutualRecursionB defaultInstance = new TestMutualRecursionB().MakeReadOnly();
+    private static readonly string[] _testMutualRecursionBFieldNames = new string[] { "a", "optional_int32" };
+    private static readonly uint[] _testMutualRecursionBFieldTags = new uint[] { 10, 16 };
+    public static TestMutualRecursionB DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestMutualRecursionB DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestMutualRecursionB ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestMutualRecursionB, TestMutualRecursionB.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable; }
+    }
+
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA A {
+      get { return a_ ?? global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance; }
+    }
+
+    public const int OptionalInt32FieldNumber = 2;
+    private bool hasOptionalInt32;
+    private int optionalInt32_;
+    public bool HasOptionalInt32 {
+      get { return hasOptionalInt32; }
+    }
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testMutualRecursionBFieldNames;
+      if (hasA) {
+        output.WriteMessage(1, field_names[0], A);
+      }
+      if (hasOptionalInt32) {
+        output.WriteInt32(2, field_names[1], OptionalInt32);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 TestMutualRecursionB ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestMutualRecursionB MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestMutualRecursionB prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestMutualRecursionB, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestMutualRecursionB cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestMutualRecursionB result;
+
+      private TestMutualRecursionB PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestMutualRecursionB original = result;
+          result = new TestMutualRecursionB();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestMutualRecursionB MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Descriptor; }
+      }
+
+      public override TestMutualRecursionB DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance; }
+      }
+
+      public override TestMutualRecursionB BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestMutualRecursionB) {
+          return MergeFrom((TestMutualRecursionB) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestMutualRecursionB other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          MergeA(other.A);
+        }
+        if (other.HasOptionalInt32) {
+          OptionalInt32 = other.OptionalInt32;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testMutualRecursionBFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testMutualRecursionBFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.CreateBuilder();
+              if (result.hasA) {
+                subBuilder.MergeFrom(A);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              A = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              result.hasOptionalInt32 = input.ReadInt32(ref result.optionalInt32_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasA {
+       get { return result.hasA; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasA &&
+            result.a_ != global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance) {
+            result.a_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();
+        } else {
+          result.a_ = value;
+        }
+        result.hasA = true;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = null;
+        return this;
+      }
+
+      public bool HasOptionalInt32 {
+        get { return result.hasOptionalInt32; }
+      }
+      public int OptionalInt32 {
+        get { return result.OptionalInt32; }
+        set { SetOptionalInt32(value); }
+      }
+      public Builder SetOptionalInt32(int value) {
+        PrepareBuilder();
+        result.hasOptionalInt32 = true;
+        result.optionalInt32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt32() {
+        PrepareBuilder();
+        result.hasOptionalInt32 = false;
+        result.optionalInt32_ = 0;
+        return this;
+      }
+    }
+    static TestMutualRecursionB() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestDupFieldNumber : pb::GeneratedMessage<TestDupFieldNumber, TestDupFieldNumber.Builder> {
+    private TestDupFieldNumber() { }
+    private static readonly TestDupFieldNumber defaultInstance = new TestDupFieldNumber().MakeReadOnly();
+    private static readonly string[] _testDupFieldNumberFieldNames = new string[] { "a", "bar", "foo" };
+    private static readonly uint[] _testDupFieldNumberFieldTags = new uint[] { 8, 27, 19 };
+    public static TestDupFieldNumber DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestDupFieldNumber DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestDupFieldNumber ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestDupFieldNumber, TestDupFieldNumber.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Foo : pb::GeneratedMessage<Foo, Foo.Builder> {
+        private Foo() { }
+        private static readonly Foo defaultInstance = new Foo().MakeReadOnly();
+        private static readonly string[] _fooFieldNames = new string[] { "a" };
+        private static readonly uint[] _fooFieldTags = new uint[] { 8 };
+        public static Foo DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override Foo DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override Foo ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<Foo, Foo.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable; }
+        }
+
+        public const int AFieldNumber = 1;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _fooFieldNames;
+          if (hasA) {
+            output.WriteInt32(1, field_names[0], A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          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 Foo ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Foo ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Foo ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Foo ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Foo ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Foo ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Foo ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Foo ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Foo ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Foo ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private Foo MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Foo prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<Foo, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(Foo cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private Foo result;
+
+          private Foo PrepareBuilder() {
+            if (resultIsReadOnly) {
+              Foo original = result;
+              result = new Foo();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override Foo MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Descriptor; }
+          }
+
+          public override Foo DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance; }
+          }
+
+          public override Foo BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is Foo) {
+              return MergeFrom((Foo) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(Foo other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_fooFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _fooFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 8: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+        static Foo() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Bar : pb::GeneratedMessage<Bar, Bar.Builder> {
+        private Bar() { }
+        private static readonly Bar defaultInstance = new Bar().MakeReadOnly();
+        private static readonly string[] _barFieldNames = new string[] { "a" };
+        private static readonly uint[] _barFieldTags = new uint[] { 8 };
+        public static Bar DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override Bar DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override Bar ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<Bar, Bar.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable; }
+        }
+
+        public const int AFieldNumber = 1;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _barFieldNames;
+          if (hasA) {
+            output.WriteInt32(1, field_names[0], A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          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 Bar ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Bar ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Bar ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Bar ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Bar ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Bar ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Bar ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Bar ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Bar ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Bar ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private Bar MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Bar prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<Bar, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(Bar cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private Bar result;
+
+          private Bar PrepareBuilder() {
+            if (resultIsReadOnly) {
+              Bar original = result;
+              result = new Bar();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override Bar MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Descriptor; }
+          }
+
+          public override Bar DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance; }
+          }
+
+          public override Bar BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is Bar) {
+              return MergeFrom((Bar) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(Bar other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_barFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _barFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 8: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+        static Bar() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+
+    public const int FooFieldNumber = 2;
+    private bool hasFoo;
+    private global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo foo_;
+    public bool HasFoo {
+      get { return hasFoo; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo Foo {
+      get { return foo_ ?? global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance; }
+    }
+
+    public const int BarFieldNumber = 3;
+    private bool hasBar;
+    private global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar bar_;
+    public bool HasBar {
+      get { return hasBar; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar Bar {
+      get { return bar_ ?? global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testDupFieldNumberFieldNames;
+      if (hasA) {
+        output.WriteInt32(1, field_names[0], A);
+      }
+      if (hasFoo) {
+        output.WriteGroup(2, field_names[2], Foo);
+      }
+      if (hasBar) {
+        output.WriteGroup(3, field_names[1], Bar);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 TestDupFieldNumber ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestDupFieldNumber MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestDupFieldNumber prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestDupFieldNumber, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestDupFieldNumber cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestDupFieldNumber result;
+
+      private TestDupFieldNumber PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestDupFieldNumber original = result;
+          result = new TestDupFieldNumber();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestDupFieldNumber MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Descriptor; }
+      }
+
+      public override TestDupFieldNumber DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.DefaultInstance; }
+      }
+
+      public override TestDupFieldNumber BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestDupFieldNumber) {
+          return MergeFrom((TestDupFieldNumber) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestDupFieldNumber other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.DefaultInstance) return this;
+        PrepareBuilder();
+        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 Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testDupFieldNumberFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testDupFieldNumberFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+            case 19: {
+              global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.CreateBuilder();
+              if (result.hasFoo) {
+                subBuilder.MergeFrom(Foo);
+              }
+              input.ReadGroup(2, subBuilder, extensionRegistry);
+              Foo = subBuilder.BuildPartial();
+              break;
+            }
+            case 27: {
+              global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.CreateBuilder();
+              if (result.hasBar) {
+                subBuilder.MergeFrom(Bar);
+              }
+              input.ReadGroup(3, subBuilder, extensionRegistry);
+              Bar = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+
+      public bool HasFoo {
+       get { return result.hasFoo; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo Foo {
+        get { return result.Foo; }
+        set { SetFoo(value); }
+      }
+      public Builder SetFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFoo = true;
+        result.foo_ = value;
+        return this;
+      }
+      public Builder SetFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFoo = true;
+        result.foo_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFoo &&
+            result.foo_ != global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance) {
+            result.foo_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.CreateBuilder(result.foo_).MergeFrom(value).BuildPartial();
+        } else {
+          result.foo_ = value;
+        }
+        result.hasFoo = true;
+        return this;
+      }
+      public Builder ClearFoo() {
+        PrepareBuilder();
+        result.hasFoo = false;
+        result.foo_ = null;
+        return this;
+      }
+
+      public bool HasBar {
+       get { return result.hasBar; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar Bar {
+        get { return result.Bar; }
+        set { SetBar(value); }
+      }
+      public Builder SetBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBar = true;
+        result.bar_ = value;
+        return this;
+      }
+      public Builder SetBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasBar = true;
+        result.bar_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasBar &&
+            result.bar_ != global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance) {
+            result.bar_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.CreateBuilder(result.bar_).MergeFrom(value).BuildPartial();
+        } else {
+          result.bar_ = value;
+        }
+        result.hasBar = true;
+        return this;
+      }
+      public Builder ClearBar() {
+        PrepareBuilder();
+        result.hasBar = false;
+        result.bar_ = null;
+        return this;
+      }
+    }
+    static TestDupFieldNumber() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestEagerMessage : pb::GeneratedMessage<TestEagerMessage, TestEagerMessage.Builder> {
+    private TestEagerMessage() { }
+    private static readonly TestEagerMessage defaultInstance = new TestEagerMessage().MakeReadOnly();
+    private static readonly string[] _testEagerMessageFieldNames = new string[] { "sub_message" };
+    private static readonly uint[] _testEagerMessageFieldTags = new uint[] { 10 };
+    public static TestEagerMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestEagerMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestEagerMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestEagerMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestEagerMessage, TestEagerMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestEagerMessage__FieldAccessorTable; }
+    }
+
+    public const int SubMessageFieldNumber = 1;
+    private bool hasSubMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes subMessage_;
+    public bool HasSubMessage {
+      get { return hasSubMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes SubMessage {
+      get { return subMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testEagerMessageFieldNames;
+      if (hasSubMessage) {
+        output.WriteMessage(1, field_names[0], SubMessage);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasSubMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(1, SubMessage);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestEagerMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEagerMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEagerMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEagerMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEagerMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEagerMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestEagerMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestEagerMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestEagerMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEagerMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestEagerMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestEagerMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestEagerMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestEagerMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestEagerMessage result;
+
+      private TestEagerMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestEagerMessage original = result;
+          result = new TestEagerMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestEagerMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEagerMessage.Descriptor; }
+      }
+
+      public override TestEagerMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEagerMessage.DefaultInstance; }
+      }
+
+      public override TestEagerMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestEagerMessage) {
+          return MergeFrom((TestEagerMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestEagerMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestEagerMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasSubMessage) {
+          MergeSubMessage(other.SubMessage);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testEagerMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testEagerMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+              if (result.hasSubMessage) {
+                subBuilder.MergeFrom(SubMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              SubMessage = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasSubMessage {
+       get { return result.hasSubMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes SubMessage {
+        get { return result.SubMessage; }
+        set { SetSubMessage(value); }
+      }
+      public Builder SetSubMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasSubMessage = true;
+        result.subMessage_ = value;
+        return this;
+      }
+      public Builder SetSubMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasSubMessage = true;
+        result.subMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeSubMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasSubMessage &&
+            result.subMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+            result.subMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.subMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.subMessage_ = value;
+        }
+        result.hasSubMessage = true;
+        return this;
+      }
+      public Builder ClearSubMessage() {
+        PrepareBuilder();
+        result.hasSubMessage = false;
+        result.subMessage_ = null;
+        return this;
+      }
+    }
+    static TestEagerMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestLazyMessage : pb::GeneratedMessage<TestLazyMessage, TestLazyMessage.Builder> {
+    private TestLazyMessage() { }
+    private static readonly TestLazyMessage defaultInstance = new TestLazyMessage().MakeReadOnly();
+    private static readonly string[] _testLazyMessageFieldNames = new string[] { "sub_message" };
+    private static readonly uint[] _testLazyMessageFieldTags = new uint[] { 10 };
+    public static TestLazyMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestLazyMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestLazyMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestLazyMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestLazyMessage, TestLazyMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestLazyMessage__FieldAccessorTable; }
+    }
+
+    public const int SubMessageFieldNumber = 1;
+    private bool hasSubMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes subMessage_;
+    public bool HasSubMessage {
+      get { return hasSubMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes SubMessage {
+      get { return subMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testLazyMessageFieldNames;
+      if (hasSubMessage) {
+        output.WriteMessage(1, field_names[0], SubMessage);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasSubMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(1, SubMessage);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestLazyMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestLazyMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestLazyMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestLazyMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestLazyMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestLazyMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestLazyMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestLazyMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestLazyMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestLazyMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestLazyMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestLazyMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestLazyMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestLazyMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestLazyMessage result;
+
+      private TestLazyMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestLazyMessage original = result;
+          result = new TestLazyMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestLazyMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestLazyMessage.Descriptor; }
+      }
+
+      public override TestLazyMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestLazyMessage.DefaultInstance; }
+      }
+
+      public override TestLazyMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestLazyMessage) {
+          return MergeFrom((TestLazyMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestLazyMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestLazyMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasSubMessage) {
+          MergeSubMessage(other.SubMessage);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testLazyMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testLazyMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+              if (result.hasSubMessage) {
+                subBuilder.MergeFrom(SubMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              SubMessage = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasSubMessage {
+       get { return result.hasSubMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes SubMessage {
+        get { return result.SubMessage; }
+        set { SetSubMessage(value); }
+      }
+      public Builder SetSubMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasSubMessage = true;
+        result.subMessage_ = value;
+        return this;
+      }
+      public Builder SetSubMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasSubMessage = true;
+        result.subMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeSubMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasSubMessage &&
+            result.subMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+            result.subMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.subMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.subMessage_ = value;
+        }
+        result.hasSubMessage = true;
+        return this;
+      }
+      public Builder ClearSubMessage() {
+        PrepareBuilder();
+        result.hasSubMessage = false;
+        result.subMessage_ = null;
+        return this;
+      }
+    }
+    static TestLazyMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestNestedMessageHasBits : pb::GeneratedMessage<TestNestedMessageHasBits, TestNestedMessageHasBits.Builder> {
+    private TestNestedMessageHasBits() { }
+    private static readonly TestNestedMessageHasBits defaultInstance = new TestNestedMessageHasBits().MakeReadOnly();
+    private static readonly string[] _testNestedMessageHasBitsFieldNames = new string[] { "optional_nested_message" };
+    private static readonly uint[] _testNestedMessageHasBitsFieldTags = new uint[] { 10 };
+    public static TestNestedMessageHasBits DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestNestedMessageHasBits DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestNestedMessageHasBits ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestNestedMessageHasBits, TestNestedMessageHasBits.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        private NestedMessage() { }
+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();
+        private static readonly string[] _nestedMessageFieldNames = new string[] { "nestedmessage_repeated_foreignmessage", "nestedmessage_repeated_int32" };
+        private static readonly uint[] _nestedMessageFieldTags = new uint[] { 18, 8 };
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override NestedMessage DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable; }
+        }
+
+        public const int NestedmessageRepeatedInt32FieldNumber = 1;
+        private pbc::PopsicleList<int> nestedmessageRepeatedInt32_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> NestedmessageRepeatedInt32List {
+          get { return pbc::Lists.AsReadOnly(nestedmessageRepeatedInt32_); }
+        }
+        public int NestedmessageRepeatedInt32Count {
+          get { return nestedmessageRepeatedInt32_.Count; }
+        }
+        public int GetNestedmessageRepeatedInt32(int index) {
+          return nestedmessageRepeatedInt32_[index];
+        }
+
+        public const int NestedmessageRepeatedForeignmessageFieldNumber = 2;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> nestedmessageRepeatedForeignmessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> NestedmessageRepeatedForeignmessageList {
+          get { return nestedmessageRepeatedForeignmessage_; }
+        }
+        public int NestedmessageRepeatedForeignmessageCount {
+          get { return nestedmessageRepeatedForeignmessage_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetNestedmessageRepeatedForeignmessage(int index) {
+          return nestedmessageRepeatedForeignmessage_[index];
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _nestedMessageFieldNames;
+          if (nestedmessageRepeatedInt32_.Count > 0) {
+            output.WriteInt32Array(1, field_names[1], nestedmessageRepeatedInt32_);
+          }
+          if (nestedmessageRepeatedForeignmessage_.Count > 0) {
+            output.WriteMessageArray(2, field_names[0], nestedmessageRepeatedForeignmessage_);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          {
+            int dataSize = 0;
+            foreach (int element in NestedmessageRepeatedInt32List) {
+              dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+            }
+            size += dataSize;
+            size += 1 * nestedmessageRepeatedInt32_.Count;
+          }
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignMessage element in NestedmessageRepeatedForeignmessageList) {
+            size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private NestedMessage MakeReadOnly() {
+          nestedmessageRepeatedInt32_.MakeReadOnly();
+          nestedmessageRepeatedForeignmessage_.MakeReadOnly();
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(NestedMessage prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<NestedMessage, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(NestedMessage cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private NestedMessage result;
+
+          private NestedMessage PrepareBuilder() {
+            if (resultIsReadOnly) {
+              NestedMessage original = result;
+              result = new NestedMessage();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override NestedMessage MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Descriptor; }
+          }
+
+          public override NestedMessage DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance; }
+          }
+
+          public override NestedMessage BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is NestedMessage) {
+              return MergeFrom((NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(NestedMessage other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.nestedmessageRepeatedInt32_.Count != 0) {
+              result.nestedmessageRepeatedInt32_.Add(other.nestedmessageRepeatedInt32_);
+            }
+            if (other.nestedmessageRepeatedForeignmessage_.Count != 0) {
+              result.nestedmessageRepeatedForeignmessage_.Add(other.nestedmessageRepeatedForeignmessage_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_nestedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _nestedMessageFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10:
+                case 8: {
+                  input.ReadInt32Array(tag, field_name, result.nestedmessageRepeatedInt32_);
+                  break;
+                }
+                case 18: {
+                  input.ReadMessageArray(tag, field_name, result.nestedmessageRepeatedForeignmessage_, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance, extensionRegistry);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public pbc::IPopsicleList<int> NestedmessageRepeatedInt32List {
+            get { return PrepareBuilder().nestedmessageRepeatedInt32_; }
+          }
+          public int NestedmessageRepeatedInt32Count {
+            get { return result.NestedmessageRepeatedInt32Count; }
+          }
+          public int GetNestedmessageRepeatedInt32(int index) {
+            return result.GetNestedmessageRepeatedInt32(index);
+          }
+          public Builder SetNestedmessageRepeatedInt32(int index, int value) {
+            PrepareBuilder();
+            result.nestedmessageRepeatedInt32_[index] = value;
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedInt32(int value) {
+            PrepareBuilder();
+            result.nestedmessageRepeatedInt32_.Add(value);
+            return this;
+          }
+          public Builder AddRangeNestedmessageRepeatedInt32(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.nestedmessageRepeatedInt32_.Add(values);
+            return this;
+          }
+          public Builder ClearNestedmessageRepeatedInt32() {
+            PrepareBuilder();
+            result.nestedmessageRepeatedInt32_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> NestedmessageRepeatedForeignmessageList {
+            get { return PrepareBuilder().nestedmessageRepeatedForeignmessage_; }
+          }
+          public int NestedmessageRepeatedForeignmessageCount {
+            get { return result.NestedmessageRepeatedForeignmessageCount; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetNestedmessageRepeatedForeignmessage(int index) {
+            return result.GetNestedmessageRepeatedForeignmessage(index);
+          }
+          public Builder SetNestedmessageRepeatedForeignmessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_[index] = value;
+            return this;
+          }
+          public Builder SetNestedmessageRepeatedForeignmessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedForeignmessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_.Add(value);
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedForeignmessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeNestedmessageRepeatedForeignmessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_.Add(values);
+            return this;
+          }
+          public Builder ClearNestedmessageRepeatedForeignmessage() {
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_.Clear();
+            return this;
+          }
+        }
+        static NestedMessage() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int OptionalNestedMessageFieldNumber = 1;
+    private bool hasOptionalNestedMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage optionalNestedMessage_;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testNestedMessageHasBitsFieldNames;
+      if (hasOptionalNestedMessage) {
+        output.WriteMessage(1, field_names[0], OptionalNestedMessage);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 TestNestedMessageHasBits ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestNestedMessageHasBits MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestNestedMessageHasBits prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestNestedMessageHasBits, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestNestedMessageHasBits cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestNestedMessageHasBits result;
+
+      private TestNestedMessageHasBits PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestNestedMessageHasBits original = result;
+          result = new TestNestedMessageHasBits();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestNestedMessageHasBits MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Descriptor; }
+      }
+
+      public override TestNestedMessageHasBits DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.DefaultInstance; }
+      }
+
+      public override TestNestedMessageHasBits BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestNestedMessageHasBits) {
+          return MergeFrom((TestNestedMessageHasBits) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestNestedMessageHasBits other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasOptionalNestedMessage) {
+          MergeOptionalNestedMessage(other.OptionalNestedMessage);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testNestedMessageHasBitsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testNestedMessageHasBitsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder();
+              if (result.hasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasOptionalNestedMessage {
+       get { return result.hasOptionalNestedMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) {
+            result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = null;
+        return this;
+      }
+    }
+    static TestNestedMessageHasBits() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestCamelCaseFieldNames : pb::GeneratedMessage<TestCamelCaseFieldNames, TestCamelCaseFieldNames.Builder> {
+    private TestCamelCaseFieldNames() { }
+    private static readonly TestCamelCaseFieldNames defaultInstance = new TestCamelCaseFieldNames().MakeReadOnly();
+    private static readonly string[] _testCamelCaseFieldNamesFieldNames = new string[] { "CordField", "EnumField", "MessageField", "PrimitiveField", "RepeatedCordField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedStringPieceField", "StringField", "StringPieceField" };
+    private static readonly uint[] _testCamelCaseFieldNamesFieldTags = new uint[] { 50, 24, 34, 8, 98, 72, 82, 56, 66, 90, 18, 42 };
+    public static TestCamelCaseFieldNames DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestCamelCaseFieldNames DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestCamelCaseFieldNames ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestCamelCaseFieldNames, TestCamelCaseFieldNames.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable; }
+    }
+
+    public const int PrimitiveFieldFieldNumber = 1;
+    private bool hasPrimitiveField;
+    private int primitiveField_;
+    public bool HasPrimitiveField {
+      get { return hasPrimitiveField; }
+    }
+    public int PrimitiveField {
+      get { return primitiveField_; }
+    }
+
+    public const int StringFieldFieldNumber = 2;
+    private bool hasStringField;
+    private string stringField_ = "";
+    public bool HasStringField {
+      get { return hasStringField; }
+    }
+    public string StringField {
+      get { return stringField_; }
+    }
+
+    public const int EnumFieldFieldNumber = 3;
+    private bool hasEnumField;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignEnum enumField_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+    public bool HasEnumField {
+      get { return hasEnumField; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum EnumField {
+      get { return enumField_; }
+    }
+
+    public const int MessageFieldFieldNumber = 4;
+    private bool hasMessageField;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage messageField_;
+    public bool HasMessageField {
+      get { return hasMessageField; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageField {
+      get { return messageField_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }
+    }
+
+    public const int StringPieceFieldFieldNumber = 5;
+    private bool hasStringPieceField;
+    private string stringPieceField_ = "";
+    public bool HasStringPieceField {
+      get { return hasStringPieceField; }
+    }
+    public string StringPieceField {
+      get { return stringPieceField_; }
+    }
+
+    public const int CordFieldFieldNumber = 6;
+    private bool hasCordField;
+    private string cordField_ = "";
+    public bool HasCordField {
+      get { return hasCordField; }
+    }
+    public string CordField {
+      get { return cordField_; }
+    }
+
+    public const int RepeatedPrimitiveFieldFieldNumber = 7;
+    private pbc::PopsicleList<int> repeatedPrimitiveField_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedPrimitiveFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedPrimitiveField_); }
+    }
+    public int RepeatedPrimitiveFieldCount {
+      get { return repeatedPrimitiveField_.Count; }
+    }
+    public int GetRepeatedPrimitiveField(int index) {
+      return repeatedPrimitiveField_[index];
+    }
+
+    public const int RepeatedStringFieldFieldNumber = 8;
+    private pbc::PopsicleList<string> repeatedStringField_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedStringFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedStringField_); }
+    }
+    public int RepeatedStringFieldCount {
+      get { return repeatedStringField_.Count; }
+    }
+    public string GetRepeatedStringField(int index) {
+      return repeatedStringField_[index];
+    }
+
+    public const int RepeatedEnumFieldFieldNumber = 9;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> repeatedEnumField_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedEnumFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedEnumField_); }
+    }
+    public int RepeatedEnumFieldCount {
+      get { return repeatedEnumField_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetRepeatedEnumField(int index) {
+      return repeatedEnumField_[index];
+    }
+
+    public const int RepeatedMessageFieldFieldNumber = 10;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> repeatedMessageField_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedMessageFieldList {
+      get { return repeatedMessageField_; }
+    }
+    public int RepeatedMessageFieldCount {
+      get { return repeatedMessageField_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetRepeatedMessageField(int index) {
+      return repeatedMessageField_[index];
+    }
+
+    public const int RepeatedStringPieceFieldFieldNumber = 11;
+    private pbc::PopsicleList<string> repeatedStringPieceField_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedStringPieceFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedStringPieceField_); }
+    }
+    public int RepeatedStringPieceFieldCount {
+      get { return repeatedStringPieceField_.Count; }
+    }
+    public string GetRepeatedStringPieceField(int index) {
+      return repeatedStringPieceField_[index];
+    }
+
+    public const int RepeatedCordFieldFieldNumber = 12;
+    private pbc::PopsicleList<string> repeatedCordField_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedCordFieldList {
+      get { return pbc::Lists.AsReadOnly(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::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testCamelCaseFieldNamesFieldNames;
+      if (hasPrimitiveField) {
+        output.WriteInt32(1, field_names[3], PrimitiveField);
+      }
+      if (hasStringField) {
+        output.WriteString(2, field_names[10], StringField);
+      }
+      if (hasEnumField) {
+        output.WriteEnum(3, field_names[1], (int) EnumField, EnumField);
+      }
+      if (hasMessageField) {
+        output.WriteMessage(4, field_names[2], MessageField);
+      }
+      if (hasStringPieceField) {
+        output.WriteString(5, field_names[11], StringPieceField);
+      }
+      if (hasCordField) {
+        output.WriteString(6, field_names[0], CordField);
+      }
+      if (repeatedPrimitiveField_.Count > 0) {
+        output.WriteInt32Array(7, field_names[7], repeatedPrimitiveField_);
+      }
+      if (repeatedStringField_.Count > 0) {
+        output.WriteStringArray(8, field_names[8], repeatedStringField_);
+      }
+      if (repeatedEnumField_.Count > 0) {
+        output.WriteEnumArray(9, field_names[5], repeatedEnumField_);
+      }
+      if (repeatedMessageField_.Count > 0) {
+        output.WriteMessageArray(10, field_names[6], repeatedMessageField_);
+      }
+      if (repeatedStringPieceField_.Count > 0) {
+        output.WriteStringArray(11, field_names[9], repeatedStringPieceField_);
+      }
+      if (repeatedCordField_.Count > 0) {
+        output.WriteStringArray(12, field_names[4], repeatedCordField_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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);
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in RepeatedPrimitiveFieldList) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedPrimitiveField_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedStringFieldList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedStringField_.Count;
+      }
+      {
+        int dataSize = 0;
+        if (repeatedEnumField_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignEnum element in repeatedEnumField_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 1 * repeatedEnumField_.Count;
+        }
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.ForeignMessage element in RepeatedMessageFieldList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(10, element);
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedStringPieceFieldList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedStringPieceField_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedCordFieldList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedCordField_.Count;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestCamelCaseFieldNames ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestCamelCaseFieldNames MakeReadOnly() {
+      repeatedPrimitiveField_.MakeReadOnly();
+      repeatedStringField_.MakeReadOnly();
+      repeatedEnumField_.MakeReadOnly();
+      repeatedMessageField_.MakeReadOnly();
+      repeatedStringPieceField_.MakeReadOnly();
+      repeatedCordField_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestCamelCaseFieldNames prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestCamelCaseFieldNames, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestCamelCaseFieldNames cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestCamelCaseFieldNames result;
+
+      private TestCamelCaseFieldNames PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestCamelCaseFieldNames original = result;
+          result = new TestCamelCaseFieldNames();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestCamelCaseFieldNames MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Descriptor; }
+      }
+
+      public override TestCamelCaseFieldNames DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.DefaultInstance; }
+      }
+
+      public override TestCamelCaseFieldNames BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestCamelCaseFieldNames) {
+          return MergeFrom((TestCamelCaseFieldNames) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestCamelCaseFieldNames other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.DefaultInstance) return this;
+        PrepareBuilder();
+        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) {
+          result.repeatedPrimitiveField_.Add(other.repeatedPrimitiveField_);
+        }
+        if (other.repeatedStringField_.Count != 0) {
+          result.repeatedStringField_.Add(other.repeatedStringField_);
+        }
+        if (other.repeatedEnumField_.Count != 0) {
+          result.repeatedEnumField_.Add(other.repeatedEnumField_);
+        }
+        if (other.repeatedMessageField_.Count != 0) {
+          result.repeatedMessageField_.Add(other.repeatedMessageField_);
+        }
+        if (other.repeatedStringPieceField_.Count != 0) {
+          result.repeatedStringPieceField_.Add(other.repeatedStringPieceField_);
+        }
+        if (other.repeatedCordField_.Count != 0) {
+          result.repeatedCordField_.Add(other.repeatedCordField_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testCamelCaseFieldNamesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testCamelCaseFieldNamesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasPrimitiveField = input.ReadInt32(ref result.primitiveField_);
+              break;
+            }
+            case 18: {
+              result.hasStringField = input.ReadString(ref result.stringField_);
+              break;
+            }
+            case 24: {
+              object unknown;
+              if(input.ReadEnum(ref result.enumField_, out unknown)) {
+                result.hasEnumField = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(3, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 34: {
+              global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder();
+              if (result.hasMessageField) {
+                subBuilder.MergeFrom(MessageField);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              MessageField = subBuilder.BuildPartial();
+              break;
+            }
+            case 42: {
+              result.hasStringPieceField = input.ReadString(ref result.stringPieceField_);
+              break;
+            }
+            case 50: {
+              result.hasCordField = input.ReadString(ref result.cordField_);
+              break;
+            }
+            case 58:
+            case 56: {
+              input.ReadInt32Array(tag, field_name, result.repeatedPrimitiveField_);
+              break;
+            }
+            case 66: {
+              input.ReadStringArray(tag, field_name, result.repeatedStringField_);
+              break;
+            }
+            case 74:
+            case 72: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>(tag, field_name, result.repeatedEnumField_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(9, (ulong)(int)rawValue);
+              }
+              break;
+            }
+            case 82: {
+              input.ReadMessageArray(tag, field_name, result.repeatedMessageField_, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 90: {
+              input.ReadStringArray(tag, field_name, result.repeatedStringPieceField_);
+              break;
+            }
+            case 98: {
+              input.ReadStringArray(tag, field_name, result.repeatedCordField_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasPrimitiveField {
+        get { return result.hasPrimitiveField; }
+      }
+      public int PrimitiveField {
+        get { return result.PrimitiveField; }
+        set { SetPrimitiveField(value); }
+      }
+      public Builder SetPrimitiveField(int value) {
+        PrepareBuilder();
+        result.hasPrimitiveField = true;
+        result.primitiveField_ = value;
+        return this;
+      }
+      public Builder ClearPrimitiveField() {
+        PrepareBuilder();
+        result.hasPrimitiveField = false;
+        result.primitiveField_ = 0;
+        return this;
+      }
+
+      public bool HasStringField {
+        get { return result.hasStringField; }
+      }
+      public string StringField {
+        get { return result.StringField; }
+        set { SetStringField(value); }
+      }
+      public Builder SetStringField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasStringField = true;
+        result.stringField_ = value;
+        return this;
+      }
+      public Builder ClearStringField() {
+        PrepareBuilder();
+        result.hasStringField = false;
+        result.stringField_ = "";
+        return this;
+      }
+
+      public bool HasEnumField {
+       get { return result.hasEnumField; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum EnumField {
+        get { return result.EnumField; }
+        set { SetEnumField(value); }
+      }
+      public Builder SetEnumField(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.hasEnumField = true;
+        result.enumField_ = value;
+        return this;
+      }
+      public Builder ClearEnumField() {
+        PrepareBuilder();
+        result.hasEnumField = false;
+        result.enumField_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+
+      public bool HasMessageField {
+       get { return result.hasMessageField; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageField {
+        get { return result.MessageField; }
+        set { SetMessageField(value); }
+      }
+      public Builder SetMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasMessageField = true;
+        result.messageField_ = value;
+        return this;
+      }
+      public Builder SetMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasMessageField = true;
+        result.messageField_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasMessageField &&
+            result.messageField_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {
+            result.messageField_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.messageField_).MergeFrom(value).BuildPartial();
+        } else {
+          result.messageField_ = value;
+        }
+        result.hasMessageField = true;
+        return this;
+      }
+      public Builder ClearMessageField() {
+        PrepareBuilder();
+        result.hasMessageField = false;
+        result.messageField_ = null;
+        return this;
+      }
+
+      public bool HasStringPieceField {
+        get { return result.hasStringPieceField; }
+      }
+      public string StringPieceField {
+        get { return result.StringPieceField; }
+        set { SetStringPieceField(value); }
+      }
+      public Builder SetStringPieceField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasStringPieceField = true;
+        result.stringPieceField_ = value;
+        return this;
+      }
+      public Builder ClearStringPieceField() {
+        PrepareBuilder();
+        result.hasStringPieceField = false;
+        result.stringPieceField_ = "";
+        return this;
+      }
+
+      public bool HasCordField {
+        get { return result.hasCordField; }
+      }
+      public string CordField {
+        get { return result.CordField; }
+        set { SetCordField(value); }
+      }
+      public Builder SetCordField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasCordField = true;
+        result.cordField_ = value;
+        return this;
+      }
+      public Builder ClearCordField() {
+        PrepareBuilder();
+        result.hasCordField = false;
+        result.cordField_ = "";
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> RepeatedPrimitiveFieldList {
+        get { return PrepareBuilder().repeatedPrimitiveField_; }
+      }
+      public int RepeatedPrimitiveFieldCount {
+        get { return result.RepeatedPrimitiveFieldCount; }
+      }
+      public int GetRepeatedPrimitiveField(int index) {
+        return result.GetRepeatedPrimitiveField(index);
+      }
+      public Builder SetRepeatedPrimitiveField(int index, int value) {
+        PrepareBuilder();
+        result.repeatedPrimitiveField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedPrimitiveField(int value) {
+        PrepareBuilder();
+        result.repeatedPrimitiveField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedPrimitiveField(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedPrimitiveField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedPrimitiveField() {
+        PrepareBuilder();
+        result.repeatedPrimitiveField_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> RepeatedStringFieldList {
+        get { return PrepareBuilder().repeatedStringField_; }
+      }
+      public int RepeatedStringFieldCount {
+        get { return result.RepeatedStringFieldCount; }
+      }
+      public string GetRepeatedStringField(int index) {
+        return result.GetRepeatedStringField(index);
+      }
+      public Builder SetRepeatedStringField(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringField(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedStringField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedStringField() {
+        PrepareBuilder();
+        result.repeatedStringField_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedEnumFieldList {
+        get { return PrepareBuilder().repeatedEnumField_; }
+      }
+      public int RepeatedEnumFieldCount {
+        get { return result.RepeatedEnumFieldCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetRepeatedEnumField(int index) {
+        return result.GetRepeatedEnumField(index);
+      }
+      public Builder SetRepeatedEnumField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.repeatedEnumField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedEnumField(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.repeatedEnumField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedEnumField(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {
+        PrepareBuilder();
+        result.repeatedEnumField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedEnumField() {
+        PrepareBuilder();
+        result.repeatedEnumField_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedMessageFieldList {
+        get { return PrepareBuilder().repeatedMessageField_; }
+      }
+      public int RepeatedMessageFieldCount {
+        get { return result.RepeatedMessageFieldCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetRepeatedMessageField(int index) {
+        return result.GetRepeatedMessageField(index);
+      }
+      public Builder SetRepeatedMessageField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedMessageField_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessageField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedMessageField_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedMessageField_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedMessageField_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessageField(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {
+        PrepareBuilder();
+        result.repeatedMessageField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedMessageField() {
+        PrepareBuilder();
+        result.repeatedMessageField_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> RepeatedStringPieceFieldList {
+        get { return PrepareBuilder().repeatedStringPieceField_; }
+      }
+      public int RepeatedStringPieceFieldCount {
+        get { return result.RepeatedStringPieceFieldCount; }
+      }
+      public string GetRepeatedStringPieceField(int index) {
+        return result.GetRepeatedStringPieceField(index);
+      }
+      public Builder SetRepeatedStringPieceField(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringPieceField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringPieceField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringPieceField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringPieceField(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedStringPieceField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedStringPieceField() {
+        PrepareBuilder();
+        result.repeatedStringPieceField_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> RepeatedCordFieldList {
+        get { return PrepareBuilder().repeatedCordField_; }
+      }
+      public int RepeatedCordFieldCount {
+        get { return result.RepeatedCordFieldCount; }
+      }
+      public string GetRepeatedCordField(int index) {
+        return result.GetRepeatedCordField(index);
+      }
+      public Builder SetRepeatedCordField(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedCordField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedCordField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedCordField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedCordField(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedCordField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedCordField() {
+        PrepareBuilder();
+        result.repeatedCordField_.Clear();
+        return this;
+      }
+    }
+    static TestCamelCaseFieldNames() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestFieldOrderings : pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder> {
+    private TestFieldOrderings() { }
+    private static readonly TestFieldOrderings defaultInstance = new TestFieldOrderings().MakeReadOnly();
+    private static readonly string[] _testFieldOrderingsFieldNames = new string[] { "my_float", "my_int", "my_string", "optional_nested_message" };
+    private static readonly uint[] _testFieldOrderingsFieldTags = new uint[] { 813, 8, 90, 1602 };
+    public static TestFieldOrderings DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestFieldOrderings DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestFieldOrderings ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestFieldOrderings__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestFieldOrderings, TestFieldOrderings.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        private NestedMessage() { }
+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();
+        private static readonly string[] _nestedMessageFieldNames = new string[] { "bb", "oo" };
+        private static readonly uint[] _nestedMessageFieldTags = new uint[] { 8, 16 };
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override NestedMessage DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestFieldOrderings_NestedMessage__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestFieldOrderings_NestedMessage__FieldAccessorTable; }
+        }
+
+        public const int OoFieldNumber = 2;
+        private bool hasOo;
+        private long oo_;
+        public bool HasOo {
+          get { return hasOo; }
+        }
+        public long Oo {
+          get { return oo_; }
+        }
+
+        public const int BbFieldNumber = 1;
+        private bool hasBb;
+        private int bb_;
+        public bool HasBb {
+          get { return hasBb; }
+        }
+        public int Bb {
+          get { return bb_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _nestedMessageFieldNames;
+          if (hasBb) {
+            output.WriteInt32(1, field_names[0], Bb);
+          }
+          if (hasOo) {
+            output.WriteInt64(2, field_names[1], Oo);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasOo) {
+            size += pb::CodedOutputStream.ComputeInt64Size(2, Oo);
+          }
+          if (hasBb) {
+            size += pb::CodedOutputStream.ComputeInt32Size(1, Bb);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private NestedMessage MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(NestedMessage prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<NestedMessage, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(NestedMessage cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private NestedMessage result;
+
+          private NestedMessage PrepareBuilder() {
+            if (resultIsReadOnly) {
+              NestedMessage original = result;
+              result = new NestedMessage();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override NestedMessage MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.Descriptor; }
+          }
+
+          public override NestedMessage DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.DefaultInstance; }
+          }
+
+          public override NestedMessage BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is NestedMessage) {
+              return MergeFrom((NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(NestedMessage other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasOo) {
+              Oo = other.Oo;
+            }
+            if (other.HasBb) {
+              Bb = other.Bb;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_nestedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _nestedMessageFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 8: {
+                  result.hasBb = input.ReadInt32(ref result.bb_);
+                  break;
+                }
+                case 16: {
+                  result.hasOo = input.ReadInt64(ref result.oo_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasOo {
+            get { return result.hasOo; }
+          }
+          public long Oo {
+            get { return result.Oo; }
+            set { SetOo(value); }
+          }
+          public Builder SetOo(long value) {
+            PrepareBuilder();
+            result.hasOo = true;
+            result.oo_ = value;
+            return this;
+          }
+          public Builder ClearOo() {
+            PrepareBuilder();
+            result.hasOo = false;
+            result.oo_ = 0L;
+            return this;
+          }
+
+          public bool HasBb {
+            get { return result.hasBb; }
+          }
+          public int Bb {
+            get { return result.Bb; }
+            set { SetBb(value); }
+          }
+          public Builder SetBb(int value) {
+            PrepareBuilder();
+            result.hasBb = true;
+            result.bb_ = value;
+            return this;
+          }
+          public Builder ClearBb() {
+            PrepareBuilder();
+            result.hasBb = false;
+            result.bb_ = 0;
+            return this;
+          }
+        }
+        static NestedMessage() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int MyStringFieldNumber = 11;
+    private bool hasMyString;
+    private string myString_ = "";
+    public bool HasMyString {
+      get { return hasMyString; }
+    }
+    public string MyString {
+      get { return myString_; }
+    }
+
+    public const int MyIntFieldNumber = 1;
+    private bool hasMyInt;
+    private long myInt_;
+    public bool HasMyInt {
+      get { return hasMyInt; }
+    }
+    public long MyInt {
+      get { return myInt_; }
+    }
+
+    public const int MyFloatFieldNumber = 101;
+    private bool hasMyFloat;
+    private float myFloat_;
+    public bool HasMyFloat {
+      get { return hasMyFloat; }
+    }
+    public float MyFloat {
+      get { return myFloat_; }
+    }
+
+    public const int OptionalNestedMessageFieldNumber = 200;
+    private bool hasOptionalNestedMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage optionalNestedMessage_;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testFieldOrderingsFieldNames;
+      pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (hasMyInt) {
+        output.WriteInt64(1, field_names[1], MyInt);
+      }
+      extensionWriter.WriteUntil(11, output);
+      if (hasMyString) {
+        output.WriteString(11, field_names[2], MyString);
+      }
+      extensionWriter.WriteUntil(101, output);
+      if (hasMyFloat) {
+        output.WriteFloat(101, field_names[0], MyFloat);
+      }
+      if (hasOptionalNestedMessage) {
+        output.WriteMessage(200, field_names[3], OptionalNestedMessage);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasMyString) {
+        size += pb::CodedOutputStream.ComputeStringSize(11, MyString);
+      }
+      if (hasMyInt) {
+        size += pb::CodedOutputStream.ComputeInt64Size(1, MyInt);
+      }
+      if (hasMyFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(101, MyFloat);
+      }
+      if (hasOptionalNestedMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(200, OptionalNestedMessage);
+      }
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestFieldOrderings ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestFieldOrderings ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestFieldOrderings MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestFieldOrderings prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestFieldOrderings, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestFieldOrderings cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestFieldOrderings result;
+
+      private TestFieldOrderings PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestFieldOrderings original = result;
+          result = new TestFieldOrderings();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestFieldOrderings MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Descriptor; }
+      }
+
+      public override TestFieldOrderings DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.DefaultInstance; }
+      }
+
+      public override TestFieldOrderings BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestFieldOrderings) {
+          return MergeFrom((TestFieldOrderings) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestFieldOrderings other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasMyString) {
+          MyString = other.MyString;
+        }
+        if (other.HasMyInt) {
+          MyInt = other.MyInt;
+        }
+        if (other.HasMyFloat) {
+          MyFloat = other.MyFloat;
+        }
+        if (other.HasOptionalNestedMessage) {
+          MergeOptionalNestedMessage(other.OptionalNestedMessage);
+        }
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testFieldOrderingsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testFieldOrderingsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasMyInt = input.ReadInt64(ref result.myInt_);
+              break;
+            }
+            case 90: {
+              result.hasMyString = input.ReadString(ref result.myString_);
+              break;
+            }
+            case 813: {
+              result.hasMyFloat = input.ReadFloat(ref result.myFloat_);
+              break;
+            }
+            case 1602: {
+              global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.CreateBuilder();
+              if (result.hasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasMyString {
+        get { return result.hasMyString; }
+      }
+      public string MyString {
+        get { return result.MyString; }
+        set { SetMyString(value); }
+      }
+      public Builder SetMyString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasMyString = true;
+        result.myString_ = value;
+        return this;
+      }
+      public Builder ClearMyString() {
+        PrepareBuilder();
+        result.hasMyString = false;
+        result.myString_ = "";
+        return this;
+      }
+
+      public bool HasMyInt {
+        get { return result.hasMyInt; }
+      }
+      public long MyInt {
+        get { return result.MyInt; }
+        set { SetMyInt(value); }
+      }
+      public Builder SetMyInt(long value) {
+        PrepareBuilder();
+        result.hasMyInt = true;
+        result.myInt_ = value;
+        return this;
+      }
+      public Builder ClearMyInt() {
+        PrepareBuilder();
+        result.hasMyInt = false;
+        result.myInt_ = 0L;
+        return this;
+      }
+
+      public bool HasMyFloat {
+        get { return result.hasMyFloat; }
+      }
+      public float MyFloat {
+        get { return result.MyFloat; }
+        set { SetMyFloat(value); }
+      }
+      public Builder SetMyFloat(float value) {
+        PrepareBuilder();
+        result.hasMyFloat = true;
+        result.myFloat_ = value;
+        return this;
+      }
+      public Builder ClearMyFloat() {
+        PrepareBuilder();
+        result.hasMyFloat = false;
+        result.myFloat_ = 0F;
+        return this;
+      }
+
+      public bool HasOptionalNestedMessage {
+       get { return result.hasOptionalNestedMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.DefaultInstance) {
+            result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = null;
+        return this;
+      }
+    }
+    static TestFieldOrderings() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestExtremeDefaultValues : pb::GeneratedMessage<TestExtremeDefaultValues, TestExtremeDefaultValues.Builder> {
+    private TestExtremeDefaultValues() { }
+    private static readonly TestExtremeDefaultValues defaultInstance = new TestExtremeDefaultValues().MakeReadOnly();
+    private static readonly string[] _testExtremeDefaultValuesFieldNames = new string[] { "bytes_with_zero", "cord_with_zero", "cpp_trigraph", "escaped_bytes", "inf_double", "inf_float", "large_float", "large_uint32", "large_uint64", "nan_double", "nan_float", "neg_inf_double", "neg_inf_float", "negative_float", "negative_one_float", "one_float", "really_small_int32", "really_small_int64", "replacement_string", "small_float", "small_int32", "small_int64", "small_negative_float", "string_piece_with_zero", "string_with_zero", "utf8_string", "zero_float" };
+    private static readonly uint[] _testExtremeDefaultValuesFieldTags = new uint[] { 194, 210, 162, 10, 113, 141, 101, 16, 24, 129, 157, 121, 149, 93, 85, 69, 168, 176, 218, 77, 32, 40, 109, 202, 186, 50, 61 };
+    public static TestExtremeDefaultValues DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestExtremeDefaultValues DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestExtremeDefaultValues ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestExtremeDefaultValues, TestExtremeDefaultValues.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable; }
+    }
+
+    public const int EscapedBytesFieldNumber = 1;
+    private bool hasEscapedBytes;
+    private pb::ByteString escapedBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue;
+    public bool HasEscapedBytes {
+      get { return hasEscapedBytes; }
+    }
+    public pb::ByteString EscapedBytes {
+      get { return escapedBytes_; }
+    }
+
+    public const int LargeUint32FieldNumber = 2;
+    private bool hasLargeUint32;
+    private uint largeUint32_ = 4294967295;
+    public bool HasLargeUint32 {
+      get { return hasLargeUint32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint LargeUint32 {
+      get { return largeUint32_; }
+    }
+
+    public const int LargeUint64FieldNumber = 3;
+    private bool hasLargeUint64;
+    private ulong largeUint64_ = 18446744073709551615UL;
+    public bool HasLargeUint64 {
+      get { return hasLargeUint64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong LargeUint64 {
+      get { return largeUint64_; }
+    }
+
+    public const int SmallInt32FieldNumber = 4;
+    private bool hasSmallInt32;
+    private int smallInt32_ = -2147483647;
+    public bool HasSmallInt32 {
+      get { return hasSmallInt32; }
+    }
+    public int SmallInt32 {
+      get { return smallInt32_; }
+    }
+
+    public const int SmallInt64FieldNumber = 5;
+    private bool hasSmallInt64;
+    private long smallInt64_ = -9223372036854775807L;
+    public bool HasSmallInt64 {
+      get { return hasSmallInt64; }
+    }
+    public long SmallInt64 {
+      get { return smallInt64_; }
+    }
+
+    public const int ReallySmallInt32FieldNumber = 21;
+    private bool hasReallySmallInt32;
+    private int reallySmallInt32_ = -2147483648;
+    public bool HasReallySmallInt32 {
+      get { return hasReallySmallInt32; }
+    }
+    public int ReallySmallInt32 {
+      get { return reallySmallInt32_; }
+    }
+
+    public const int ReallySmallInt64FieldNumber = 22;
+    private bool hasReallySmallInt64;
+    private long reallySmallInt64_ = -9223372036854775808L;
+    public bool HasReallySmallInt64 {
+      get { return hasReallySmallInt64; }
+    }
+    public long ReallySmallInt64 {
+      get { return reallySmallInt64_; }
+    }
+
+    public const int Utf8StringFieldNumber = 6;
+    private bool hasUtf8String;
+    private string utf8String_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[7].DefaultValue;
+    public bool HasUtf8String {
+      get { return hasUtf8String; }
+    }
+    public string Utf8String {
+      get { return utf8String_; }
+    }
+
+    public const int ZeroFloatFieldNumber = 7;
+    private bool hasZeroFloat;
+    private float zeroFloat_;
+    public bool HasZeroFloat {
+      get { return hasZeroFloat; }
+    }
+    public float ZeroFloat {
+      get { return zeroFloat_; }
+    }
+
+    public const int OneFloatFieldNumber = 8;
+    private bool hasOneFloat;
+    private float oneFloat_ = 1F;
+    public bool HasOneFloat {
+      get { return hasOneFloat; }
+    }
+    public float OneFloat {
+      get { return oneFloat_; }
+    }
+
+    public const int SmallFloatFieldNumber = 9;
+    private bool hasSmallFloat;
+    private float smallFloat_ = 1.5F;
+    public bool HasSmallFloat {
+      get { return hasSmallFloat; }
+    }
+    public float SmallFloat {
+      get { return smallFloat_; }
+    }
+
+    public const int NegativeOneFloatFieldNumber = 10;
+    private bool hasNegativeOneFloat;
+    private float negativeOneFloat_ = -1F;
+    public bool HasNegativeOneFloat {
+      get { return hasNegativeOneFloat; }
+    }
+    public float NegativeOneFloat {
+      get { return negativeOneFloat_; }
+    }
+
+    public const int NegativeFloatFieldNumber = 11;
+    private bool hasNegativeFloat;
+    private float negativeFloat_ = -1.5F;
+    public bool HasNegativeFloat {
+      get { return hasNegativeFloat; }
+    }
+    public float NegativeFloat {
+      get { return negativeFloat_; }
+    }
+
+    public const int LargeFloatFieldNumber = 12;
+    private bool hasLargeFloat;
+    private float largeFloat_ = 2e+08F;
+    public bool HasLargeFloat {
+      get { return hasLargeFloat; }
+    }
+    public float LargeFloat {
+      get { return largeFloat_; }
+    }
+
+    public const int SmallNegativeFloatFieldNumber = 13;
+    private bool hasSmallNegativeFloat;
+    private float smallNegativeFloat_ = -8e-28F;
+    public bool HasSmallNegativeFloat {
+      get { return hasSmallNegativeFloat; }
+    }
+    public float SmallNegativeFloat {
+      get { return smallNegativeFloat_; }
+    }
+
+    public const int InfDoubleFieldNumber = 14;
+    private bool hasInfDouble;
+    private double infDouble_ = double.PositiveInfinity;
+    public bool HasInfDouble {
+      get { return hasInfDouble; }
+    }
+    public double InfDouble {
+      get { return infDouble_; }
+    }
+
+    public const int NegInfDoubleFieldNumber = 15;
+    private bool hasNegInfDouble;
+    private double negInfDouble_ = double.NegativeInfinity;
+    public bool HasNegInfDouble {
+      get { return hasNegInfDouble; }
+    }
+    public double NegInfDouble {
+      get { return negInfDouble_; }
+    }
+
+    public const int NanDoubleFieldNumber = 16;
+    private bool hasNanDouble;
+    private double nanDouble_ = double.NaN;
+    public bool HasNanDouble {
+      get { return hasNanDouble; }
+    }
+    public double NanDouble {
+      get { return nanDouble_; }
+    }
+
+    public const int InfFloatFieldNumber = 17;
+    private bool hasInfFloat;
+    private float infFloat_ = float.PositiveInfinity;
+    public bool HasInfFloat {
+      get { return hasInfFloat; }
+    }
+    public float InfFloat {
+      get { return infFloat_; }
+    }
+
+    public const int NegInfFloatFieldNumber = 18;
+    private bool hasNegInfFloat;
+    private float negInfFloat_ = float.NegativeInfinity;
+    public bool HasNegInfFloat {
+      get { return hasNegInfFloat; }
+    }
+    public float NegInfFloat {
+      get { return negInfFloat_; }
+    }
+
+    public const int NanFloatFieldNumber = 19;
+    private bool hasNanFloat;
+    private float nanFloat_ = float.NaN;
+    public bool HasNanFloat {
+      get { return hasNanFloat; }
+    }
+    public float NanFloat {
+      get { return nanFloat_; }
+    }
+
+    public const int CppTrigraphFieldNumber = 20;
+    private bool hasCppTrigraph;
+    private string cppTrigraph_ = "? ? ?? ?? ??? ??/ ??-";
+    public bool HasCppTrigraph {
+      get { return hasCppTrigraph; }
+    }
+    public string CppTrigraph {
+      get { return cppTrigraph_; }
+    }
+
+    public const int StringWithZeroFieldNumber = 23;
+    private bool hasStringWithZero;
+    private string stringWithZero_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[22].DefaultValue;
+    public bool HasStringWithZero {
+      get { return hasStringWithZero; }
+    }
+    public string StringWithZero {
+      get { return stringWithZero_; }
+    }
+
+    public const int BytesWithZeroFieldNumber = 24;
+    private bool hasBytesWithZero;
+    private pb::ByteString bytesWithZero_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[23].DefaultValue;
+    public bool HasBytesWithZero {
+      get { return hasBytesWithZero; }
+    }
+    public pb::ByteString BytesWithZero {
+      get { return bytesWithZero_; }
+    }
+
+    public const int StringPieceWithZeroFieldNumber = 25;
+    private bool hasStringPieceWithZero;
+    private string stringPieceWithZero_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[24].DefaultValue;
+    public bool HasStringPieceWithZero {
+      get { return hasStringPieceWithZero; }
+    }
+    public string StringPieceWithZero {
+      get { return stringPieceWithZero_; }
+    }
+
+    public const int CordWithZeroFieldNumber = 26;
+    private bool hasCordWithZero;
+    private string cordWithZero_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[25].DefaultValue;
+    public bool HasCordWithZero {
+      get { return hasCordWithZero; }
+    }
+    public string CordWithZero {
+      get { return cordWithZero_; }
+    }
+
+    public const int ReplacementStringFieldNumber = 27;
+    private bool hasReplacementString;
+    private string replacementString_ = "${unknown}";
+    public bool HasReplacementString {
+      get { return hasReplacementString; }
+    }
+    public string ReplacementString {
+      get { return replacementString_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testExtremeDefaultValuesFieldNames;
+      if (hasEscapedBytes) {
+        output.WriteBytes(1, field_names[3], EscapedBytes);
+      }
+      if (hasLargeUint32) {
+        output.WriteUInt32(2, field_names[7], LargeUint32);
+      }
+      if (hasLargeUint64) {
+        output.WriteUInt64(3, field_names[8], LargeUint64);
+      }
+      if (hasSmallInt32) {
+        output.WriteInt32(4, field_names[20], SmallInt32);
+      }
+      if (hasSmallInt64) {
+        output.WriteInt64(5, field_names[21], SmallInt64);
+      }
+      if (hasUtf8String) {
+        output.WriteString(6, field_names[25], Utf8String);
+      }
+      if (hasZeroFloat) {
+        output.WriteFloat(7, field_names[26], ZeroFloat);
+      }
+      if (hasOneFloat) {
+        output.WriteFloat(8, field_names[15], OneFloat);
+      }
+      if (hasSmallFloat) {
+        output.WriteFloat(9, field_names[19], SmallFloat);
+      }
+      if (hasNegativeOneFloat) {
+        output.WriteFloat(10, field_names[14], NegativeOneFloat);
+      }
+      if (hasNegativeFloat) {
+        output.WriteFloat(11, field_names[13], NegativeFloat);
+      }
+      if (hasLargeFloat) {
+        output.WriteFloat(12, field_names[6], LargeFloat);
+      }
+      if (hasSmallNegativeFloat) {
+        output.WriteFloat(13, field_names[22], SmallNegativeFloat);
+      }
+      if (hasInfDouble) {
+        output.WriteDouble(14, field_names[4], InfDouble);
+      }
+      if (hasNegInfDouble) {
+        output.WriteDouble(15, field_names[11], NegInfDouble);
+      }
+      if (hasNanDouble) {
+        output.WriteDouble(16, field_names[9], NanDouble);
+      }
+      if (hasInfFloat) {
+        output.WriteFloat(17, field_names[5], InfFloat);
+      }
+      if (hasNegInfFloat) {
+        output.WriteFloat(18, field_names[12], NegInfFloat);
+      }
+      if (hasNanFloat) {
+        output.WriteFloat(19, field_names[10], NanFloat);
+      }
+      if (hasCppTrigraph) {
+        output.WriteString(20, field_names[2], CppTrigraph);
+      }
+      if (hasReallySmallInt32) {
+        output.WriteInt32(21, field_names[16], ReallySmallInt32);
+      }
+      if (hasReallySmallInt64) {
+        output.WriteInt64(22, field_names[17], ReallySmallInt64);
+      }
+      if (hasStringWithZero) {
+        output.WriteString(23, field_names[24], StringWithZero);
+      }
+      if (hasBytesWithZero) {
+        output.WriteBytes(24, field_names[0], BytesWithZero);
+      }
+      if (hasStringPieceWithZero) {
+        output.WriteString(25, field_names[23], StringPieceWithZero);
+      }
+      if (hasCordWithZero) {
+        output.WriteString(26, field_names[1], CordWithZero);
+      }
+      if (hasReplacementString) {
+        output.WriteString(27, field_names[18], ReplacementString);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 (hasReallySmallInt32) {
+        size += pb::CodedOutputStream.ComputeInt32Size(21, ReallySmallInt32);
+      }
+      if (hasReallySmallInt64) {
+        size += pb::CodedOutputStream.ComputeInt64Size(22, ReallySmallInt64);
+      }
+      if (hasUtf8String) {
+        size += pb::CodedOutputStream.ComputeStringSize(6, Utf8String);
+      }
+      if (hasZeroFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(7, ZeroFloat);
+      }
+      if (hasOneFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(8, OneFloat);
+      }
+      if (hasSmallFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(9, SmallFloat);
+      }
+      if (hasNegativeOneFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(10, NegativeOneFloat);
+      }
+      if (hasNegativeFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(11, NegativeFloat);
+      }
+      if (hasLargeFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(12, LargeFloat);
+      }
+      if (hasSmallNegativeFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(13, SmallNegativeFloat);
+      }
+      if (hasInfDouble) {
+        size += pb::CodedOutputStream.ComputeDoubleSize(14, InfDouble);
+      }
+      if (hasNegInfDouble) {
+        size += pb::CodedOutputStream.ComputeDoubleSize(15, NegInfDouble);
+      }
+      if (hasNanDouble) {
+        size += pb::CodedOutputStream.ComputeDoubleSize(16, NanDouble);
+      }
+      if (hasInfFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(17, InfFloat);
+      }
+      if (hasNegInfFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(18, NegInfFloat);
+      }
+      if (hasNanFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(19, NanFloat);
+      }
+      if (hasCppTrigraph) {
+        size += pb::CodedOutputStream.ComputeStringSize(20, CppTrigraph);
+      }
+      if (hasStringWithZero) {
+        size += pb::CodedOutputStream.ComputeStringSize(23, StringWithZero);
+      }
+      if (hasBytesWithZero) {
+        size += pb::CodedOutputStream.ComputeBytesSize(24, BytesWithZero);
+      }
+      if (hasStringPieceWithZero) {
+        size += pb::CodedOutputStream.ComputeStringSize(25, StringPieceWithZero);
+      }
+      if (hasCordWithZero) {
+        size += pb::CodedOutputStream.ComputeStringSize(26, CordWithZero);
+      }
+      if (hasReplacementString) {
+        size += pb::CodedOutputStream.ComputeStringSize(27, ReplacementString);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestExtremeDefaultValues ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestExtremeDefaultValues MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestExtremeDefaultValues prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestExtremeDefaultValues, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestExtremeDefaultValues cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestExtremeDefaultValues result;
+
+      private TestExtremeDefaultValues PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestExtremeDefaultValues original = result;
+          result = new TestExtremeDefaultValues();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestExtremeDefaultValues MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor; }
+      }
+
+      public override TestExtremeDefaultValues DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.DefaultInstance; }
+      }
+
+      public override TestExtremeDefaultValues BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestExtremeDefaultValues) {
+          return MergeFrom((TestExtremeDefaultValues) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestExtremeDefaultValues other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.DefaultInstance) return this;
+        PrepareBuilder();
+        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.HasReallySmallInt32) {
+          ReallySmallInt32 = other.ReallySmallInt32;
+        }
+        if (other.HasReallySmallInt64) {
+          ReallySmallInt64 = other.ReallySmallInt64;
+        }
+        if (other.HasUtf8String) {
+          Utf8String = other.Utf8String;
+        }
+        if (other.HasZeroFloat) {
+          ZeroFloat = other.ZeroFloat;
+        }
+        if (other.HasOneFloat) {
+          OneFloat = other.OneFloat;
+        }
+        if (other.HasSmallFloat) {
+          SmallFloat = other.SmallFloat;
+        }
+        if (other.HasNegativeOneFloat) {
+          NegativeOneFloat = other.NegativeOneFloat;
+        }
+        if (other.HasNegativeFloat) {
+          NegativeFloat = other.NegativeFloat;
+        }
+        if (other.HasLargeFloat) {
+          LargeFloat = other.LargeFloat;
+        }
+        if (other.HasSmallNegativeFloat) {
+          SmallNegativeFloat = other.SmallNegativeFloat;
+        }
+        if (other.HasInfDouble) {
+          InfDouble = other.InfDouble;
+        }
+        if (other.HasNegInfDouble) {
+          NegInfDouble = other.NegInfDouble;
+        }
+        if (other.HasNanDouble) {
+          NanDouble = other.NanDouble;
+        }
+        if (other.HasInfFloat) {
+          InfFloat = other.InfFloat;
+        }
+        if (other.HasNegInfFloat) {
+          NegInfFloat = other.NegInfFloat;
+        }
+        if (other.HasNanFloat) {
+          NanFloat = other.NanFloat;
+        }
+        if (other.HasCppTrigraph) {
+          CppTrigraph = other.CppTrigraph;
+        }
+        if (other.HasStringWithZero) {
+          StringWithZero = other.StringWithZero;
+        }
+        if (other.HasBytesWithZero) {
+          BytesWithZero = other.BytesWithZero;
+        }
+        if (other.HasStringPieceWithZero) {
+          StringPieceWithZero = other.StringPieceWithZero;
+        }
+        if (other.HasCordWithZero) {
+          CordWithZero = other.CordWithZero;
+        }
+        if (other.HasReplacementString) {
+          ReplacementString = other.ReplacementString;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testExtremeDefaultValuesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testExtremeDefaultValuesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasEscapedBytes = input.ReadBytes(ref result.escapedBytes_);
+              break;
+            }
+            case 16: {
+              result.hasLargeUint32 = input.ReadUInt32(ref result.largeUint32_);
+              break;
+            }
+            case 24: {
+              result.hasLargeUint64 = input.ReadUInt64(ref result.largeUint64_);
+              break;
+            }
+            case 32: {
+              result.hasSmallInt32 = input.ReadInt32(ref result.smallInt32_);
+              break;
+            }
+            case 40: {
+              result.hasSmallInt64 = input.ReadInt64(ref result.smallInt64_);
+              break;
+            }
+            case 50: {
+              result.hasUtf8String = input.ReadString(ref result.utf8String_);
+              break;
+            }
+            case 61: {
+              result.hasZeroFloat = input.ReadFloat(ref result.zeroFloat_);
+              break;
+            }
+            case 69: {
+              result.hasOneFloat = input.ReadFloat(ref result.oneFloat_);
+              break;
+            }
+            case 77: {
+              result.hasSmallFloat = input.ReadFloat(ref result.smallFloat_);
+              break;
+            }
+            case 85: {
+              result.hasNegativeOneFloat = input.ReadFloat(ref result.negativeOneFloat_);
+              break;
+            }
+            case 93: {
+              result.hasNegativeFloat = input.ReadFloat(ref result.negativeFloat_);
+              break;
+            }
+            case 101: {
+              result.hasLargeFloat = input.ReadFloat(ref result.largeFloat_);
+              break;
+            }
+            case 109: {
+              result.hasSmallNegativeFloat = input.ReadFloat(ref result.smallNegativeFloat_);
+              break;
+            }
+            case 113: {
+              result.hasInfDouble = input.ReadDouble(ref result.infDouble_);
+              break;
+            }
+            case 121: {
+              result.hasNegInfDouble = input.ReadDouble(ref result.negInfDouble_);
+              break;
+            }
+            case 129: {
+              result.hasNanDouble = input.ReadDouble(ref result.nanDouble_);
+              break;
+            }
+            case 141: {
+              result.hasInfFloat = input.ReadFloat(ref result.infFloat_);
+              break;
+            }
+            case 149: {
+              result.hasNegInfFloat = input.ReadFloat(ref result.negInfFloat_);
+              break;
+            }
+            case 157: {
+              result.hasNanFloat = input.ReadFloat(ref result.nanFloat_);
+              break;
+            }
+            case 162: {
+              result.hasCppTrigraph = input.ReadString(ref result.cppTrigraph_);
+              break;
+            }
+            case 168: {
+              result.hasReallySmallInt32 = input.ReadInt32(ref result.reallySmallInt32_);
+              break;
+            }
+            case 176: {
+              result.hasReallySmallInt64 = input.ReadInt64(ref result.reallySmallInt64_);
+              break;
+            }
+            case 186: {
+              result.hasStringWithZero = input.ReadString(ref result.stringWithZero_);
+              break;
+            }
+            case 194: {
+              result.hasBytesWithZero = input.ReadBytes(ref result.bytesWithZero_);
+              break;
+            }
+            case 202: {
+              result.hasStringPieceWithZero = input.ReadString(ref result.stringPieceWithZero_);
+              break;
+            }
+            case 210: {
+              result.hasCordWithZero = input.ReadString(ref result.cordWithZero_);
+              break;
+            }
+            case 218: {
+              result.hasReplacementString = input.ReadString(ref result.replacementString_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasEscapedBytes {
+        get { return result.hasEscapedBytes; }
+      }
+      public pb::ByteString EscapedBytes {
+        get { return result.EscapedBytes; }
+        set { SetEscapedBytes(value); }
+      }
+      public Builder SetEscapedBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasEscapedBytes = true;
+        result.escapedBytes_ = value;
+        return this;
+      }
+      public Builder ClearEscapedBytes() {
+        PrepareBuilder();
+        result.hasEscapedBytes = false;
+        result.escapedBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue;
+        return this;
+      }
+
+      public bool HasLargeUint32 {
+        get { return result.hasLargeUint32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint LargeUint32 {
+        get { return result.LargeUint32; }
+        set { SetLargeUint32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetLargeUint32(uint value) {
+        PrepareBuilder();
+        result.hasLargeUint32 = true;
+        result.largeUint32_ = value;
+        return this;
+      }
+      public Builder ClearLargeUint32() {
+        PrepareBuilder();
+        result.hasLargeUint32 = false;
+        result.largeUint32_ = 4294967295;
+        return this;
+      }
+
+      public bool HasLargeUint64 {
+        get { return result.hasLargeUint64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong LargeUint64 {
+        get { return result.LargeUint64; }
+        set { SetLargeUint64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetLargeUint64(ulong value) {
+        PrepareBuilder();
+        result.hasLargeUint64 = true;
+        result.largeUint64_ = value;
+        return this;
+      }
+      public Builder ClearLargeUint64() {
+        PrepareBuilder();
+        result.hasLargeUint64 = false;
+        result.largeUint64_ = 18446744073709551615UL;
+        return this;
+      }
+
+      public bool HasSmallInt32 {
+        get { return result.hasSmallInt32; }
+      }
+      public int SmallInt32 {
+        get { return result.SmallInt32; }
+        set { SetSmallInt32(value); }
+      }
+      public Builder SetSmallInt32(int value) {
+        PrepareBuilder();
+        result.hasSmallInt32 = true;
+        result.smallInt32_ = value;
+        return this;
+      }
+      public Builder ClearSmallInt32() {
+        PrepareBuilder();
+        result.hasSmallInt32 = false;
+        result.smallInt32_ = -2147483647;
+        return this;
+      }
+
+      public bool HasSmallInt64 {
+        get { return result.hasSmallInt64; }
+      }
+      public long SmallInt64 {
+        get { return result.SmallInt64; }
+        set { SetSmallInt64(value); }
+      }
+      public Builder SetSmallInt64(long value) {
+        PrepareBuilder();
+        result.hasSmallInt64 = true;
+        result.smallInt64_ = value;
+        return this;
+      }
+      public Builder ClearSmallInt64() {
+        PrepareBuilder();
+        result.hasSmallInt64 = false;
+        result.smallInt64_ = -9223372036854775807L;
+        return this;
+      }
+
+      public bool HasReallySmallInt32 {
+        get { return result.hasReallySmallInt32; }
+      }
+      public int ReallySmallInt32 {
+        get { return result.ReallySmallInt32; }
+        set { SetReallySmallInt32(value); }
+      }
+      public Builder SetReallySmallInt32(int value) {
+        PrepareBuilder();
+        result.hasReallySmallInt32 = true;
+        result.reallySmallInt32_ = value;
+        return this;
+      }
+      public Builder ClearReallySmallInt32() {
+        PrepareBuilder();
+        result.hasReallySmallInt32 = false;
+        result.reallySmallInt32_ = -2147483648;
+        return this;
+      }
+
+      public bool HasReallySmallInt64 {
+        get { return result.hasReallySmallInt64; }
+      }
+      public long ReallySmallInt64 {
+        get { return result.ReallySmallInt64; }
+        set { SetReallySmallInt64(value); }
+      }
+      public Builder SetReallySmallInt64(long value) {
+        PrepareBuilder();
+        result.hasReallySmallInt64 = true;
+        result.reallySmallInt64_ = value;
+        return this;
+      }
+      public Builder ClearReallySmallInt64() {
+        PrepareBuilder();
+        result.hasReallySmallInt64 = false;
+        result.reallySmallInt64_ = -9223372036854775808L;
+        return this;
+      }
+
+      public bool HasUtf8String {
+        get { return result.hasUtf8String; }
+      }
+      public string Utf8String {
+        get { return result.Utf8String; }
+        set { SetUtf8String(value); }
+      }
+      public Builder SetUtf8String(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasUtf8String = true;
+        result.utf8String_ = value;
+        return this;
+      }
+      public Builder ClearUtf8String() {
+        PrepareBuilder();
+        result.hasUtf8String = false;
+        result.utf8String_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[7].DefaultValue;
+        return this;
+      }
+
+      public bool HasZeroFloat {
+        get { return result.hasZeroFloat; }
+      }
+      public float ZeroFloat {
+        get { return result.ZeroFloat; }
+        set { SetZeroFloat(value); }
+      }
+      public Builder SetZeroFloat(float value) {
+        PrepareBuilder();
+        result.hasZeroFloat = true;
+        result.zeroFloat_ = value;
+        return this;
+      }
+      public Builder ClearZeroFloat() {
+        PrepareBuilder();
+        result.hasZeroFloat = false;
+        result.zeroFloat_ = 0F;
+        return this;
+      }
+
+      public bool HasOneFloat {
+        get { return result.hasOneFloat; }
+      }
+      public float OneFloat {
+        get { return result.OneFloat; }
+        set { SetOneFloat(value); }
+      }
+      public Builder SetOneFloat(float value) {
+        PrepareBuilder();
+        result.hasOneFloat = true;
+        result.oneFloat_ = value;
+        return this;
+      }
+      public Builder ClearOneFloat() {
+        PrepareBuilder();
+        result.hasOneFloat = false;
+        result.oneFloat_ = 1F;
+        return this;
+      }
+
+      public bool HasSmallFloat {
+        get { return result.hasSmallFloat; }
+      }
+      public float SmallFloat {
+        get { return result.SmallFloat; }
+        set { SetSmallFloat(value); }
+      }
+      public Builder SetSmallFloat(float value) {
+        PrepareBuilder();
+        result.hasSmallFloat = true;
+        result.smallFloat_ = value;
+        return this;
+      }
+      public Builder ClearSmallFloat() {
+        PrepareBuilder();
+        result.hasSmallFloat = false;
+        result.smallFloat_ = 1.5F;
+        return this;
+      }
+
+      public bool HasNegativeOneFloat {
+        get { return result.hasNegativeOneFloat; }
+      }
+      public float NegativeOneFloat {
+        get { return result.NegativeOneFloat; }
+        set { SetNegativeOneFloat(value); }
+      }
+      public Builder SetNegativeOneFloat(float value) {
+        PrepareBuilder();
+        result.hasNegativeOneFloat = true;
+        result.negativeOneFloat_ = value;
+        return this;
+      }
+      public Builder ClearNegativeOneFloat() {
+        PrepareBuilder();
+        result.hasNegativeOneFloat = false;
+        result.negativeOneFloat_ = -1F;
+        return this;
+      }
+
+      public bool HasNegativeFloat {
+        get { return result.hasNegativeFloat; }
+      }
+      public float NegativeFloat {
+        get { return result.NegativeFloat; }
+        set { SetNegativeFloat(value); }
+      }
+      public Builder SetNegativeFloat(float value) {
+        PrepareBuilder();
+        result.hasNegativeFloat = true;
+        result.negativeFloat_ = value;
+        return this;
+      }
+      public Builder ClearNegativeFloat() {
+        PrepareBuilder();
+        result.hasNegativeFloat = false;
+        result.negativeFloat_ = -1.5F;
+        return this;
+      }
+
+      public bool HasLargeFloat {
+        get { return result.hasLargeFloat; }
+      }
+      public float LargeFloat {
+        get { return result.LargeFloat; }
+        set { SetLargeFloat(value); }
+      }
+      public Builder SetLargeFloat(float value) {
+        PrepareBuilder();
+        result.hasLargeFloat = true;
+        result.largeFloat_ = value;
+        return this;
+      }
+      public Builder ClearLargeFloat() {
+        PrepareBuilder();
+        result.hasLargeFloat = false;
+        result.largeFloat_ = 2e+08F;
+        return this;
+      }
+
+      public bool HasSmallNegativeFloat {
+        get { return result.hasSmallNegativeFloat; }
+      }
+      public float SmallNegativeFloat {
+        get { return result.SmallNegativeFloat; }
+        set { SetSmallNegativeFloat(value); }
+      }
+      public Builder SetSmallNegativeFloat(float value) {
+        PrepareBuilder();
+        result.hasSmallNegativeFloat = true;
+        result.smallNegativeFloat_ = value;
+        return this;
+      }
+      public Builder ClearSmallNegativeFloat() {
+        PrepareBuilder();
+        result.hasSmallNegativeFloat = false;
+        result.smallNegativeFloat_ = -8e-28F;
+        return this;
+      }
+
+      public bool HasInfDouble {
+        get { return result.hasInfDouble; }
+      }
+      public double InfDouble {
+        get { return result.InfDouble; }
+        set { SetInfDouble(value); }
+      }
+      public Builder SetInfDouble(double value) {
+        PrepareBuilder();
+        result.hasInfDouble = true;
+        result.infDouble_ = value;
+        return this;
+      }
+      public Builder ClearInfDouble() {
+        PrepareBuilder();
+        result.hasInfDouble = false;
+        result.infDouble_ = double.PositiveInfinity;
+        return this;
+      }
+
+      public bool HasNegInfDouble {
+        get { return result.hasNegInfDouble; }
+      }
+      public double NegInfDouble {
+        get { return result.NegInfDouble; }
+        set { SetNegInfDouble(value); }
+      }
+      public Builder SetNegInfDouble(double value) {
+        PrepareBuilder();
+        result.hasNegInfDouble = true;
+        result.negInfDouble_ = value;
+        return this;
+      }
+      public Builder ClearNegInfDouble() {
+        PrepareBuilder();
+        result.hasNegInfDouble = false;
+        result.negInfDouble_ = double.NegativeInfinity;
+        return this;
+      }
+
+      public bool HasNanDouble {
+        get { return result.hasNanDouble; }
+      }
+      public double NanDouble {
+        get { return result.NanDouble; }
+        set { SetNanDouble(value); }
+      }
+      public Builder SetNanDouble(double value) {
+        PrepareBuilder();
+        result.hasNanDouble = true;
+        result.nanDouble_ = value;
+        return this;
+      }
+      public Builder ClearNanDouble() {
+        PrepareBuilder();
+        result.hasNanDouble = false;
+        result.nanDouble_ = double.NaN;
+        return this;
+      }
+
+      public bool HasInfFloat {
+        get { return result.hasInfFloat; }
+      }
+      public float InfFloat {
+        get { return result.InfFloat; }
+        set { SetInfFloat(value); }
+      }
+      public Builder SetInfFloat(float value) {
+        PrepareBuilder();
+        result.hasInfFloat = true;
+        result.infFloat_ = value;
+        return this;
+      }
+      public Builder ClearInfFloat() {
+        PrepareBuilder();
+        result.hasInfFloat = false;
+        result.infFloat_ = float.PositiveInfinity;
+        return this;
+      }
+
+      public bool HasNegInfFloat {
+        get { return result.hasNegInfFloat; }
+      }
+      public float NegInfFloat {
+        get { return result.NegInfFloat; }
+        set { SetNegInfFloat(value); }
+      }
+      public Builder SetNegInfFloat(float value) {
+        PrepareBuilder();
+        result.hasNegInfFloat = true;
+        result.negInfFloat_ = value;
+        return this;
+      }
+      public Builder ClearNegInfFloat() {
+        PrepareBuilder();
+        result.hasNegInfFloat = false;
+        result.negInfFloat_ = float.NegativeInfinity;
+        return this;
+      }
+
+      public bool HasNanFloat {
+        get { return result.hasNanFloat; }
+      }
+      public float NanFloat {
+        get { return result.NanFloat; }
+        set { SetNanFloat(value); }
+      }
+      public Builder SetNanFloat(float value) {
+        PrepareBuilder();
+        result.hasNanFloat = true;
+        result.nanFloat_ = value;
+        return this;
+      }
+      public Builder ClearNanFloat() {
+        PrepareBuilder();
+        result.hasNanFloat = false;
+        result.nanFloat_ = float.NaN;
+        return this;
+      }
+
+      public bool HasCppTrigraph {
+        get { return result.hasCppTrigraph; }
+      }
+      public string CppTrigraph {
+        get { return result.CppTrigraph; }
+        set { SetCppTrigraph(value); }
+      }
+      public Builder SetCppTrigraph(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasCppTrigraph = true;
+        result.cppTrigraph_ = value;
+        return this;
+      }
+      public Builder ClearCppTrigraph() {
+        PrepareBuilder();
+        result.hasCppTrigraph = false;
+        result.cppTrigraph_ = "? ? ?? ?? ??? ??/ ??-";
+        return this;
+      }
+
+      public bool HasStringWithZero {
+        get { return result.hasStringWithZero; }
+      }
+      public string StringWithZero {
+        get { return result.StringWithZero; }
+        set { SetStringWithZero(value); }
+      }
+      public Builder SetStringWithZero(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasStringWithZero = true;
+        result.stringWithZero_ = value;
+        return this;
+      }
+      public Builder ClearStringWithZero() {
+        PrepareBuilder();
+        result.hasStringWithZero = false;
+        result.stringWithZero_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[22].DefaultValue;
+        return this;
+      }
+
+      public bool HasBytesWithZero {
+        get { return result.hasBytesWithZero; }
+      }
+      public pb::ByteString BytesWithZero {
+        get { return result.BytesWithZero; }
+        set { SetBytesWithZero(value); }
+      }
+      public Builder SetBytesWithZero(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBytesWithZero = true;
+        result.bytesWithZero_ = value;
+        return this;
+      }
+      public Builder ClearBytesWithZero() {
+        PrepareBuilder();
+        result.hasBytesWithZero = false;
+        result.bytesWithZero_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[23].DefaultValue;
+        return this;
+      }
+
+      public bool HasStringPieceWithZero {
+        get { return result.hasStringPieceWithZero; }
+      }
+      public string StringPieceWithZero {
+        get { return result.StringPieceWithZero; }
+        set { SetStringPieceWithZero(value); }
+      }
+      public Builder SetStringPieceWithZero(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasStringPieceWithZero = true;
+        result.stringPieceWithZero_ = value;
+        return this;
+      }
+      public Builder ClearStringPieceWithZero() {
+        PrepareBuilder();
+        result.hasStringPieceWithZero = false;
+        result.stringPieceWithZero_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[24].DefaultValue;
+        return this;
+      }
+
+      public bool HasCordWithZero {
+        get { return result.hasCordWithZero; }
+      }
+      public string CordWithZero {
+        get { return result.CordWithZero; }
+        set { SetCordWithZero(value); }
+      }
+      public Builder SetCordWithZero(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasCordWithZero = true;
+        result.cordWithZero_ = value;
+        return this;
+      }
+      public Builder ClearCordWithZero() {
+        PrepareBuilder();
+        result.hasCordWithZero = false;
+        result.cordWithZero_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[25].DefaultValue;
+        return this;
+      }
+
+      public bool HasReplacementString {
+        get { return result.hasReplacementString; }
+      }
+      public string ReplacementString {
+        get { return result.ReplacementString; }
+        set { SetReplacementString(value); }
+      }
+      public Builder SetReplacementString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasReplacementString = true;
+        result.replacementString_ = value;
+        return this;
+      }
+      public Builder ClearReplacementString() {
+        PrepareBuilder();
+        result.hasReplacementString = false;
+        result.replacementString_ = "${unknown}";
+        return this;
+      }
+    }
+    static TestExtremeDefaultValues() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SparseEnumMessage : pb::GeneratedMessage<SparseEnumMessage, SparseEnumMessage.Builder> {
+    private SparseEnumMessage() { }
+    private static readonly SparseEnumMessage defaultInstance = new SparseEnumMessage().MakeReadOnly();
+    private static readonly string[] _sparseEnumMessageFieldNames = new string[] { "sparse_enum" };
+    private static readonly uint[] _sparseEnumMessageFieldTags = new uint[] { 8 };
+    public static SparseEnumMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override SparseEnumMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override SparseEnumMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_SparseEnumMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<SparseEnumMessage, SparseEnumMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_SparseEnumMessage__FieldAccessorTable; }
+    }
+
+    public const int SparseEnumFieldNumber = 1;
+    private bool hasSparseEnum;
+    private global::Google.ProtocolBuffers.TestProtos.TestSparseEnum sparseEnum_ = global::Google.ProtocolBuffers.TestProtos.TestSparseEnum.SPARSE_A;
+    public bool HasSparseEnum {
+      get { return hasSparseEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestSparseEnum SparseEnum {
+      get { return sparseEnum_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _sparseEnumMessageFieldNames;
+      if (hasSparseEnum) {
+        output.WriteEnum(1, field_names[0], (int) SparseEnum, SparseEnum);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasSparseEnum) {
+        size += pb::CodedOutputStream.ComputeEnumSize(1, (int) SparseEnum);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SparseEnumMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SparseEnumMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SparseEnumMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SparseEnumMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SparseEnumMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SparseEnumMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private SparseEnumMessage result;
+
+      private SparseEnumMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SparseEnumMessage original = result;
+          result = new SparseEnumMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override SparseEnumMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.Descriptor; }
+      }
+
+      public override SparseEnumMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.DefaultInstance; }
+      }
+
+      public override SparseEnumMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SparseEnumMessage) {
+          return MergeFrom((SparseEnumMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(SparseEnumMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasSparseEnum) {
+          SparseEnum = other.SparseEnum;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_sparseEnumMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _sparseEnumMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              object unknown;
+              if(input.ReadEnum(ref result.sparseEnum_, out unknown)) {
+                result.hasSparseEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(1, (ulong)(int)unknown);
+              }
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasSparseEnum {
+       get { return result.hasSparseEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestSparseEnum SparseEnum {
+        get { return result.SparseEnum; }
+        set { SetSparseEnum(value); }
+      }
+      public Builder SetSparseEnum(global::Google.ProtocolBuffers.TestProtos.TestSparseEnum value) {
+        PrepareBuilder();
+        result.hasSparseEnum = true;
+        result.sparseEnum_ = value;
+        return this;
+      }
+      public Builder ClearSparseEnum() {
+        PrepareBuilder();
+        result.hasSparseEnum = false;
+        result.sparseEnum_ = global::Google.ProtocolBuffers.TestProtos.TestSparseEnum.SPARSE_A;
+        return this;
+      }
+    }
+    static SparseEnumMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class OneString : pb::GeneratedMessage<OneString, OneString.Builder> {
+    private OneString() { }
+    private static readonly OneString defaultInstance = new OneString().MakeReadOnly();
+    private static readonly string[] _oneStringFieldNames = new string[] { "data" };
+    private static readonly uint[] _oneStringFieldTags = new uint[] { 10 };
+    public static OneString DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override OneString DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override OneString ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_OneString__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<OneString, OneString.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_OneString__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private string data_ = "";
+    public bool HasData {
+      get { return hasData; }
+    }
+    public string Data {
+      get { return data_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _oneStringFieldNames;
+      if (hasData) {
+        output.WriteString(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static OneString ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OneString ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OneString ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OneString ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OneString ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OneString ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static OneString ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static OneString ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static OneString ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OneString ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private OneString MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(OneString prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<OneString, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(OneString cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private OneString result;
+
+      private OneString PrepareBuilder() {
+        if (resultIsReadOnly) {
+          OneString original = result;
+          result = new OneString();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override OneString MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OneString.Descriptor; }
+      }
+
+      public override OneString DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OneString.DefaultInstance; }
+      }
+
+      public override OneString BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is OneString) {
+          return MergeFrom((OneString) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(OneString other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.OneString.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_oneStringFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _oneStringFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasData = input.ReadString(ref result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      public string Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      public Builder SetData(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = "";
+        return this;
+      }
+    }
+    static OneString() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class MoreString : pb::GeneratedMessage<MoreString, MoreString.Builder> {
+    private MoreString() { }
+    private static readonly MoreString defaultInstance = new MoreString().MakeReadOnly();
+    private static readonly string[] _moreStringFieldNames = new string[] { "data" };
+    private static readonly uint[] _moreStringFieldTags = new uint[] { 10 };
+    public static MoreString DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override MoreString DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override MoreString ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_MoreString__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<MoreString, MoreString.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_MoreString__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private pbc::PopsicleList<string> data_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> DataList {
+      get { return pbc::Lists.AsReadOnly(data_); }
+    }
+    public int DataCount {
+      get { return data_.Count; }
+    }
+    public string GetData(int index) {
+      return data_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _moreStringFieldNames;
+      if (data_.Count > 0) {
+        output.WriteStringArray(1, field_names[0], data_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      {
+        int dataSize = 0;
+        foreach (string element in DataList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * data_.Count;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static MoreString ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static MoreString ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static MoreString ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static MoreString ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static MoreString ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static MoreString ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static MoreString ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static MoreString ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static MoreString ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static MoreString ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private MoreString MakeReadOnly() {
+      data_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(MoreString prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<MoreString, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(MoreString cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private MoreString result;
+
+      private MoreString PrepareBuilder() {
+        if (resultIsReadOnly) {
+          MoreString original = result;
+          result = new MoreString();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override MoreString MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.MoreString.Descriptor; }
+      }
+
+      public override MoreString DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.MoreString.DefaultInstance; }
+      }
+
+      public override MoreString BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is MoreString) {
+          return MergeFrom((MoreString) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(MoreString other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.MoreString.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.data_.Count != 0) {
+          result.data_.Add(other.data_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_moreStringFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _moreStringFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              input.ReadStringArray(tag, field_name, result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public pbc::IPopsicleList<string> DataList {
+        get { return PrepareBuilder().data_; }
+      }
+      public int DataCount {
+        get { return result.DataCount; }
+      }
+      public string GetData(int index) {
+        return result.GetData(index);
+      }
+      public Builder SetData(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.data_[index] = value;
+        return this;
+      }
+      public Builder AddData(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.data_.Add(value);
+        return this;
+      }
+      public Builder AddRangeData(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.data_.Add(values);
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.data_.Clear();
+        return this;
+      }
+    }
+    static MoreString() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class OneBytes : pb::GeneratedMessage<OneBytes, OneBytes.Builder> {
+    private OneBytes() { }
+    private static readonly OneBytes defaultInstance = new OneBytes().MakeReadOnly();
+    private static readonly string[] _oneBytesFieldNames = new string[] { "data" };
+    private static readonly uint[] _oneBytesFieldTags = new uint[] { 10 };
+    public static OneBytes DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override OneBytes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override OneBytes ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_OneBytes__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<OneBytes, OneBytes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_OneBytes__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private pb::ByteString data_ = pb::ByteString.Empty;
+    public bool HasData {
+      get { return hasData; }
+    }
+    public pb::ByteString Data {
+      get { return data_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _oneBytesFieldNames;
+      if (hasData) {
+        output.WriteBytes(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeBytesSize(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static OneBytes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static OneBytes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static OneBytes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static OneBytes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private OneBytes MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(OneBytes prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<OneBytes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(OneBytes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private OneBytes result;
+
+      private OneBytes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          OneBytes original = result;
+          result = new OneBytes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override OneBytes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OneBytes.Descriptor; }
+      }
+
+      public override OneBytes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OneBytes.DefaultInstance; }
+      }
+
+      public override OneBytes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is OneBytes) {
+          return MergeFrom((OneBytes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(OneBytes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.OneBytes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_oneBytesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _oneBytesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasData = input.ReadBytes(ref result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      public pb::ByteString Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      public Builder SetData(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = pb::ByteString.Empty;
+        return this;
+      }
+    }
+    static OneBytes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class MoreBytes : pb::GeneratedMessage<MoreBytes, MoreBytes.Builder> {
+    private MoreBytes() { }
+    private static readonly MoreBytes defaultInstance = new MoreBytes().MakeReadOnly();
+    private static readonly string[] _moreBytesFieldNames = new string[] { "data" };
+    private static readonly uint[] _moreBytesFieldTags = new uint[] { 10 };
+    public static MoreBytes DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override MoreBytes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override MoreBytes ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_MoreBytes__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<MoreBytes, MoreBytes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_MoreBytes__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private pbc::PopsicleList<pb::ByteString> data_ = new pbc::PopsicleList<pb::ByteString>();
+    public scg::IList<pb::ByteString> DataList {
+      get { return pbc::Lists.AsReadOnly(data_); }
+    }
+    public int DataCount {
+      get { return data_.Count; }
+    }
+    public pb::ByteString GetData(int index) {
+      return data_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _moreBytesFieldNames;
+      if (data_.Count > 0) {
+        output.WriteBytesArray(1, field_names[0], data_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      {
+        int dataSize = 0;
+        foreach (pb::ByteString element in DataList) {
+          dataSize += pb::CodedOutputStream.ComputeBytesSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * data_.Count;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static MoreBytes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static MoreBytes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static MoreBytes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static MoreBytes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static MoreBytes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static MoreBytes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static MoreBytes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static MoreBytes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static MoreBytes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static MoreBytes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private MoreBytes MakeReadOnly() {
+      data_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(MoreBytes prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<MoreBytes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(MoreBytes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private MoreBytes result;
+
+      private MoreBytes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          MoreBytes original = result;
+          result = new MoreBytes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override MoreBytes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.MoreBytes.Descriptor; }
+      }
+
+      public override MoreBytes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.MoreBytes.DefaultInstance; }
+      }
+
+      public override MoreBytes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is MoreBytes) {
+          return MergeFrom((MoreBytes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(MoreBytes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.MoreBytes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.data_.Count != 0) {
+          result.data_.Add(other.data_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_moreBytesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _moreBytesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              input.ReadBytesArray(tag, field_name, result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public pbc::IPopsicleList<pb::ByteString> DataList {
+        get { return PrepareBuilder().data_; }
+      }
+      public int DataCount {
+        get { return result.DataCount; }
+      }
+      public pb::ByteString GetData(int index) {
+        return result.GetData(index);
+      }
+      public Builder SetData(int index, pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.data_[index] = value;
+        return this;
+      }
+      public Builder AddData(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.data_.Add(value);
+        return this;
+      }
+      public Builder AddRangeData(scg::IEnumerable<pb::ByteString> values) {
+        PrepareBuilder();
+        result.data_.Add(values);
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.data_.Clear();
+        return this;
+      }
+    }
+    static MoreBytes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class Int32Message : pb::GeneratedMessage<Int32Message, Int32Message.Builder> {
+    private Int32Message() { }
+    private static readonly Int32Message defaultInstance = new Int32Message().MakeReadOnly();
+    private static readonly string[] _int32MessageFieldNames = new string[] { "data" };
+    private static readonly uint[] _int32MessageFieldTags = new uint[] { 8 };
+    public static Int32Message DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override Int32Message DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override Int32Message ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_Int32Message__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<Int32Message, Int32Message.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_Int32Message__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private int data_;
+    public bool HasData {
+      get { return hasData; }
+    }
+    public int Data {
+      get { return data_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _int32MessageFieldNames;
+      if (hasData) {
+        output.WriteInt32(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static Int32Message ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Int32Message ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Int32Message ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Int32Message ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Int32Message ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Int32Message ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Int32Message ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static Int32Message ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static Int32Message ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Int32Message ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private Int32Message MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(Int32Message prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<Int32Message, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(Int32Message cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private Int32Message result;
+
+      private Int32Message PrepareBuilder() {
+        if (resultIsReadOnly) {
+          Int32Message original = result;
+          result = new Int32Message();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override Int32Message MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.Int32Message.Descriptor; }
+      }
+
+      public override Int32Message DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.Int32Message.DefaultInstance; }
+      }
+
+      public override Int32Message BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is Int32Message) {
+          return MergeFrom((Int32Message) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(Int32Message other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.Int32Message.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_int32MessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _int32MessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasData = input.ReadInt32(ref result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      public int Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      public Builder SetData(int value) {
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = 0;
+        return this;
+      }
+    }
+    static Int32Message() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class Uint32Message : pb::GeneratedMessage<Uint32Message, Uint32Message.Builder> {
+    private Uint32Message() { }
+    private static readonly Uint32Message defaultInstance = new Uint32Message().MakeReadOnly();
+    private static readonly string[] _uint32MessageFieldNames = new string[] { "data" };
+    private static readonly uint[] _uint32MessageFieldTags = new uint[] { 8 };
+    public static Uint32Message DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override Uint32Message DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override Uint32Message ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_Uint32Message__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<Uint32Message, Uint32Message.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_Uint32Message__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private uint data_;
+    public bool HasData {
+      get { return hasData; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint Data {
+      get { return data_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _uint32MessageFieldNames;
+      if (hasData) {
+        output.WriteUInt32(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeUInt32Size(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static Uint32Message ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Uint32Message ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Uint32Message ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Uint32Message ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Uint32Message ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Uint32Message ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Uint32Message ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static Uint32Message ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static Uint32Message ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Uint32Message ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private Uint32Message MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(Uint32Message prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<Uint32Message, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(Uint32Message cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private Uint32Message result;
+
+      private Uint32Message PrepareBuilder() {
+        if (resultIsReadOnly) {
+          Uint32Message original = result;
+          result = new Uint32Message();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override Uint32Message MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.Uint32Message.Descriptor; }
+      }
+
+      public override Uint32Message DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.Uint32Message.DefaultInstance; }
+      }
+
+      public override Uint32Message BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is Uint32Message) {
+          return MergeFrom((Uint32Message) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(Uint32Message other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.Uint32Message.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_uint32MessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _uint32MessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasData = input.ReadUInt32(ref result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetData(uint value) {
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = 0;
+        return this;
+      }
+    }
+    static Uint32Message() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class Int64Message : pb::GeneratedMessage<Int64Message, Int64Message.Builder> {
+    private Int64Message() { }
+    private static readonly Int64Message defaultInstance = new Int64Message().MakeReadOnly();
+    private static readonly string[] _int64MessageFieldNames = new string[] { "data" };
+    private static readonly uint[] _int64MessageFieldTags = new uint[] { 8 };
+    public static Int64Message DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override Int64Message DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override Int64Message ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_Int64Message__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<Int64Message, Int64Message.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_Int64Message__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private long data_;
+    public bool HasData {
+      get { return hasData; }
+    }
+    public long Data {
+      get { return data_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _int64MessageFieldNames;
+      if (hasData) {
+        output.WriteInt64(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeInt64Size(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static Int64Message ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Int64Message ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Int64Message ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Int64Message ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Int64Message ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Int64Message ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Int64Message ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static Int64Message ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static Int64Message ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Int64Message ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private Int64Message MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(Int64Message prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<Int64Message, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(Int64Message cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private Int64Message result;
+
+      private Int64Message PrepareBuilder() {
+        if (resultIsReadOnly) {
+          Int64Message original = result;
+          result = new Int64Message();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override Int64Message MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.Int64Message.Descriptor; }
+      }
+
+      public override Int64Message DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.Int64Message.DefaultInstance; }
+      }
+
+      public override Int64Message BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is Int64Message) {
+          return MergeFrom((Int64Message) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(Int64Message other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.Int64Message.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_int64MessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _int64MessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasData = input.ReadInt64(ref result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      public long Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      public Builder SetData(long value) {
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = 0L;
+        return this;
+      }
+    }
+    static Int64Message() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class Uint64Message : pb::GeneratedMessage<Uint64Message, Uint64Message.Builder> {
+    private Uint64Message() { }
+    private static readonly Uint64Message defaultInstance = new Uint64Message().MakeReadOnly();
+    private static readonly string[] _uint64MessageFieldNames = new string[] { "data" };
+    private static readonly uint[] _uint64MessageFieldTags = new uint[] { 8 };
+    public static Uint64Message DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override Uint64Message DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override Uint64Message ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_Uint64Message__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<Uint64Message, Uint64Message.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_Uint64Message__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private ulong data_;
+    public bool HasData {
+      get { return hasData; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Data {
+      get { return data_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _uint64MessageFieldNames;
+      if (hasData) {
+        output.WriteUInt64(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeUInt64Size(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static Uint64Message ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Uint64Message ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Uint64Message ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Uint64Message ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Uint64Message ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Uint64Message ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Uint64Message ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static Uint64Message ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static Uint64Message ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Uint64Message ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private Uint64Message MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(Uint64Message prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<Uint64Message, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(Uint64Message cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private Uint64Message result;
+
+      private Uint64Message PrepareBuilder() {
+        if (resultIsReadOnly) {
+          Uint64Message original = result;
+          result = new Uint64Message();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override Uint64Message MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.Uint64Message.Descriptor; }
+      }
+
+      public override Uint64Message DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.Uint64Message.DefaultInstance; }
+      }
+
+      public override Uint64Message BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is Uint64Message) {
+          return MergeFrom((Uint64Message) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(Uint64Message other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.Uint64Message.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_uint64MessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _uint64MessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasData = input.ReadUInt64(ref result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetData(ulong value) {
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = 0UL;
+        return this;
+      }
+    }
+    static Uint64Message() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class BoolMessage : pb::GeneratedMessage<BoolMessage, BoolMessage.Builder> {
+    private BoolMessage() { }
+    private static readonly BoolMessage defaultInstance = new BoolMessage().MakeReadOnly();
+    private static readonly string[] _boolMessageFieldNames = new string[] { "data" };
+    private static readonly uint[] _boolMessageFieldTags = new uint[] { 8 };
+    public static BoolMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override BoolMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override BoolMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_BoolMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<BoolMessage, BoolMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_BoolMessage__FieldAccessorTable; }
+    }
+
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private bool data_;
+    public bool HasData {
+      get { return hasData; }
+    }
+    public bool Data {
+      get { return data_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _boolMessageFieldNames;
+      if (hasData) {
+        output.WriteBool(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeBoolSize(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static BoolMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BoolMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BoolMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BoolMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BoolMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BoolMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static BoolMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static BoolMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static BoolMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BoolMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private BoolMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(BoolMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<BoolMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(BoolMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private BoolMessage result;
+
+      private BoolMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          BoolMessage original = result;
+          result = new BoolMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override BoolMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BoolMessage.Descriptor; }
+      }
+
+      public override BoolMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BoolMessage.DefaultInstance; }
+      }
+
+      public override BoolMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is BoolMessage) {
+          return MergeFrom((BoolMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(BoolMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.BoolMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_boolMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _boolMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasData = input.ReadBool(ref result.data_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      public bool Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      public Builder SetData(bool value) {
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = false;
+        return this;
+      }
+    }
+    static BoolMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestOneof : pb::GeneratedMessage<TestOneof, TestOneof.Builder> {
+    private TestOneof() { }
+    private static readonly TestOneof defaultInstance = new TestOneof().MakeReadOnly();
+    private static readonly string[] _testOneofFieldNames = new string[] { "foo_int", "foo_message", "foo_string", "foogroup" };
+    private static readonly uint[] _testOneofFieldTags = new uint[] { 8, 26, 18, 35 };
+    public static TestOneof DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestOneof DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestOneof ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestOneof, TestOneof.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class FooGroup : pb::GeneratedMessage<FooGroup, FooGroup.Builder> {
+        private FooGroup() { }
+        private static readonly FooGroup defaultInstance = new FooGroup().MakeReadOnly();
+        private static readonly string[] _fooGroupFieldNames = new string[] { "a", "b" };
+        private static readonly uint[] _fooGroupFieldTags = new uint[] { 40, 50 };
+        public static FooGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override FooGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override FooGroup ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof_FooGroup__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<FooGroup, FooGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof_FooGroup__FieldAccessorTable; }
+        }
+
+        public const int AFieldNumber = 5;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+
+        public const int BFieldNumber = 6;
+        private bool hasB;
+        private string b_ = "";
+        public bool HasB {
+          get { return hasB; }
+        }
+        public string B {
+          get { return b_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _fooGroupFieldNames;
+          if (hasA) {
+            output.WriteInt32(5, field_names[0], A);
+          }
+          if (hasB) {
+            output.WriteString(6, field_names[1], B);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasA) {
+            size += pb::CodedOutputStream.ComputeInt32Size(5, A);
+          }
+          if (hasB) {
+            size += pb::CodedOutputStream.ComputeStringSize(6, B);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static FooGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static FooGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private FooGroup MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(FooGroup prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<FooGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(FooGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private FooGroup result;
+
+          private FooGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              FooGroup original = result;
+              result = new FooGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override FooGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.Descriptor; }
+          }
+
+          public override FooGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.DefaultInstance; }
+          }
+
+          public override FooGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is FooGroup) {
+              return MergeFrom((FooGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(FooGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            if (other.HasB) {
+              B = other.B;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_fooGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _fooGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 40: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+                case 50: {
+                  result.hasB = input.ReadString(ref result.b_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+
+          public bool HasB {
+            get { return result.hasB; }
+          }
+          public string B {
+            get { return result.B; }
+            set { SetB(value); }
+          }
+          public Builder SetB(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasB = true;
+            result.b_ = value;
+            return this;
+          }
+          public Builder ClearB() {
+            PrepareBuilder();
+            result.hasB = false;
+            result.b_ = "";
+            return this;
+          }
+        }
+        static FooGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int FooIntFieldNumber = 1;
+    private bool hasFooInt;
+    private int fooInt_;
+    public bool HasFooInt {
+      get { return hasFooInt; }
+    }
+    public int FooInt {
+      get { return fooInt_; }
+    }
+
+    public const int FooStringFieldNumber = 2;
+    private bool hasFooString;
+    private string fooString_ = "";
+    public bool HasFooString {
+      get { return hasFooString; }
+    }
+    public string FooString {
+      get { return fooString_; }
+    }
+
+    public const int FooMessageFieldNumber = 3;
+    private bool hasFooMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes fooMessage_;
+    public bool HasFooMessage {
+      get { return hasFooMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes FooMessage {
+      get { return fooMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+    }
+
+    public const int FooGroupFieldNumber = 4;
+    private bool hasFooGroup;
+    private global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup fooGroup_;
+    public bool HasFooGroup {
+      get { return hasFooGroup; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup FooGroup {
+      get { return fooGroup_ ?? global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testOneofFieldNames;
+      if (hasFooInt) {
+        output.WriteInt32(1, field_names[0], FooInt);
+      }
+      if (hasFooString) {
+        output.WriteString(2, field_names[2], FooString);
+      }
+      if (hasFooMessage) {
+        output.WriteMessage(3, field_names[1], FooMessage);
+      }
+      if (hasFooGroup) {
+        output.WriteGroup(4, field_names[3], FooGroup);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasFooInt) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, FooInt);
+      }
+      if (hasFooString) {
+        size += pb::CodedOutputStream.ComputeStringSize(2, FooString);
+      }
+      if (hasFooMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(3, FooMessage);
+      }
+      if (hasFooGroup) {
+        size += pb::CodedOutputStream.ComputeGroupSize(4, FooGroup);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestOneof ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestOneof ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneof ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestOneof ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneof ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestOneof ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneof ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestOneof ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestOneof ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestOneof ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestOneof MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestOneof prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestOneof, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestOneof cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestOneof result;
+
+      private TestOneof PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestOneof original = result;
+          result = new TestOneof();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestOneof MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestOneof.Descriptor; }
+      }
+
+      public override TestOneof DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestOneof.DefaultInstance; }
+      }
+
+      public override TestOneof BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestOneof) {
+          return MergeFrom((TestOneof) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestOneof other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestOneof.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasFooInt) {
+          FooInt = other.FooInt;
+        }
+        if (other.HasFooString) {
+          FooString = other.FooString;
+        }
+        if (other.HasFooMessage) {
+          MergeFooMessage(other.FooMessage);
+        }
+        if (other.HasFooGroup) {
+          MergeFooGroup(other.FooGroup);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testOneofFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testOneofFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasFooInt = input.ReadInt32(ref result.fooInt_);
+              break;
+            }
+            case 18: {
+              result.hasFooString = input.ReadString(ref result.fooString_);
+              break;
+            }
+            case 26: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+              if (result.hasFooMessage) {
+                subBuilder.MergeFrom(FooMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              FooMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 35: {
+              global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.CreateBuilder();
+              if (result.hasFooGroup) {
+                subBuilder.MergeFrom(FooGroup);
+              }
+              input.ReadGroup(4, subBuilder, extensionRegistry);
+              FooGroup = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasFooInt {
+        get { return result.hasFooInt; }
+      }
+      public int FooInt {
+        get { return result.FooInt; }
+        set { SetFooInt(value); }
+      }
+      public Builder SetFooInt(int value) {
+        PrepareBuilder();
+        result.hasFooInt = true;
+        result.fooInt_ = value;
+        return this;
+      }
+      public Builder ClearFooInt() {
+        PrepareBuilder();
+        result.hasFooInt = false;
+        result.fooInt_ = 0;
+        return this;
+      }
+
+      public bool HasFooString {
+        get { return result.hasFooString; }
+      }
+      public string FooString {
+        get { return result.FooString; }
+        set { SetFooString(value); }
+      }
+      public Builder SetFooString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooString = true;
+        result.fooString_ = value;
+        return this;
+      }
+      public Builder ClearFooString() {
+        PrepareBuilder();
+        result.hasFooString = false;
+        result.fooString_ = "";
+        return this;
+      }
+
+      public bool HasFooMessage {
+       get { return result.hasFooMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes FooMessage {
+        get { return result.FooMessage; }
+        set { SetFooMessage(value); }
+      }
+      public Builder SetFooMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooMessage = true;
+        result.fooMessage_ = value;
+        return this;
+      }
+      public Builder SetFooMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFooMessage = true;
+        result.fooMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFooMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFooMessage &&
+            result.fooMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+            result.fooMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.fooMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.fooMessage_ = value;
+        }
+        result.hasFooMessage = true;
+        return this;
+      }
+      public Builder ClearFooMessage() {
+        PrepareBuilder();
+        result.hasFooMessage = false;
+        result.fooMessage_ = null;
+        return this;
+      }
+
+      public bool HasFooGroup {
+       get { return result.hasFooGroup; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup FooGroup {
+        get { return result.FooGroup; }
+        set { SetFooGroup(value); }
+      }
+      public Builder SetFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooGroup = true;
+        result.fooGroup_ = value;
+        return this;
+      }
+      public Builder SetFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFooGroup = true;
+        result.fooGroup_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFooGroup &&
+            result.fooGroup_ != global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.DefaultInstance) {
+            result.fooGroup_ = global::Google.ProtocolBuffers.TestProtos.TestOneof.Types.FooGroup.CreateBuilder(result.fooGroup_).MergeFrom(value).BuildPartial();
+        } else {
+          result.fooGroup_ = value;
+        }
+        result.hasFooGroup = true;
+        return this;
+      }
+      public Builder ClearFooGroup() {
+        PrepareBuilder();
+        result.hasFooGroup = false;
+        result.fooGroup_ = null;
+        return this;
+      }
+    }
+    static TestOneof() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestOneofBackwardsCompatible : pb::GeneratedMessage<TestOneofBackwardsCompatible, TestOneofBackwardsCompatible.Builder> {
+    private TestOneofBackwardsCompatible() { }
+    private static readonly TestOneofBackwardsCompatible defaultInstance = new TestOneofBackwardsCompatible().MakeReadOnly();
+    private static readonly string[] _testOneofBackwardsCompatibleFieldNames = new string[] { "foo_int", "foo_message", "foo_string", "foogroup" };
+    private static readonly uint[] _testOneofBackwardsCompatibleFieldTags = new uint[] { 8, 26, 18, 35 };
+    public static TestOneofBackwardsCompatible DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestOneofBackwardsCompatible DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestOneofBackwardsCompatible ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneofBackwardsCompatible__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestOneofBackwardsCompatible, TestOneofBackwardsCompatible.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneofBackwardsCompatible__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class FooGroup : pb::GeneratedMessage<FooGroup, FooGroup.Builder> {
+        private FooGroup() { }
+        private static readonly FooGroup defaultInstance = new FooGroup().MakeReadOnly();
+        private static readonly string[] _fooGroupFieldNames = new string[] { "a", "b" };
+        private static readonly uint[] _fooGroupFieldTags = new uint[] { 40, 50 };
+        public static FooGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override FooGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override FooGroup ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneofBackwardsCompatible_FooGroup__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<FooGroup, FooGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneofBackwardsCompatible_FooGroup__FieldAccessorTable; }
+        }
+
+        public const int AFieldNumber = 5;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+
+        public const int BFieldNumber = 6;
+        private bool hasB;
+        private string b_ = "";
+        public bool HasB {
+          get { return hasB; }
+        }
+        public string B {
+          get { return b_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _fooGroupFieldNames;
+          if (hasA) {
+            output.WriteInt32(5, field_names[0], A);
+          }
+          if (hasB) {
+            output.WriteString(6, field_names[1], B);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasA) {
+            size += pb::CodedOutputStream.ComputeInt32Size(5, A);
+          }
+          if (hasB) {
+            size += pb::CodedOutputStream.ComputeStringSize(6, B);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static FooGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static FooGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private FooGroup MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(FooGroup prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<FooGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(FooGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private FooGroup result;
+
+          private FooGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              FooGroup original = result;
+              result = new FooGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override FooGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.Descriptor; }
+          }
+
+          public override FooGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.DefaultInstance; }
+          }
+
+          public override FooGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is FooGroup) {
+              return MergeFrom((FooGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(FooGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            if (other.HasB) {
+              B = other.B;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_fooGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _fooGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 40: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+                case 50: {
+                  result.hasB = input.ReadString(ref result.b_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+
+          public bool HasB {
+            get { return result.hasB; }
+          }
+          public string B {
+            get { return result.B; }
+            set { SetB(value); }
+          }
+          public Builder SetB(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasB = true;
+            result.b_ = value;
+            return this;
+          }
+          public Builder ClearB() {
+            PrepareBuilder();
+            result.hasB = false;
+            result.b_ = "";
+            return this;
+          }
+        }
+        static FooGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int FooIntFieldNumber = 1;
+    private bool hasFooInt;
+    private int fooInt_;
+    public bool HasFooInt {
+      get { return hasFooInt; }
+    }
+    public int FooInt {
+      get { return fooInt_; }
+    }
+
+    public const int FooStringFieldNumber = 2;
+    private bool hasFooString;
+    private string fooString_ = "";
+    public bool HasFooString {
+      get { return hasFooString; }
+    }
+    public string FooString {
+      get { return fooString_; }
+    }
+
+    public const int FooMessageFieldNumber = 3;
+    private bool hasFooMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes fooMessage_;
+    public bool HasFooMessage {
+      get { return hasFooMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes FooMessage {
+      get { return fooMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+    }
+
+    public const int FooGroupFieldNumber = 4;
+    private bool hasFooGroup;
+    private global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup fooGroup_;
+    public bool HasFooGroup {
+      get { return hasFooGroup; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup FooGroup {
+      get { return fooGroup_ ?? global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testOneofBackwardsCompatibleFieldNames;
+      if (hasFooInt) {
+        output.WriteInt32(1, field_names[0], FooInt);
+      }
+      if (hasFooString) {
+        output.WriteString(2, field_names[2], FooString);
+      }
+      if (hasFooMessage) {
+        output.WriteMessage(3, field_names[1], FooMessage);
+      }
+      if (hasFooGroup) {
+        output.WriteGroup(4, field_names[3], FooGroup);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasFooInt) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, FooInt);
+      }
+      if (hasFooString) {
+        size += pb::CodedOutputStream.ComputeStringSize(2, FooString);
+      }
+      if (hasFooMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(3, FooMessage);
+      }
+      if (hasFooGroup) {
+        size += pb::CodedOutputStream.ComputeGroupSize(4, FooGroup);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestOneofBackwardsCompatible ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestOneofBackwardsCompatible ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestOneofBackwardsCompatible MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestOneofBackwardsCompatible prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestOneofBackwardsCompatible, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestOneofBackwardsCompatible cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestOneofBackwardsCompatible result;
+
+      private TestOneofBackwardsCompatible PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestOneofBackwardsCompatible original = result;
+          result = new TestOneofBackwardsCompatible();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestOneofBackwardsCompatible MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Descriptor; }
+      }
+
+      public override TestOneofBackwardsCompatible DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.DefaultInstance; }
+      }
+
+      public override TestOneofBackwardsCompatible BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestOneofBackwardsCompatible) {
+          return MergeFrom((TestOneofBackwardsCompatible) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestOneofBackwardsCompatible other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasFooInt) {
+          FooInt = other.FooInt;
+        }
+        if (other.HasFooString) {
+          FooString = other.FooString;
+        }
+        if (other.HasFooMessage) {
+          MergeFooMessage(other.FooMessage);
+        }
+        if (other.HasFooGroup) {
+          MergeFooGroup(other.FooGroup);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testOneofBackwardsCompatibleFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testOneofBackwardsCompatibleFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasFooInt = input.ReadInt32(ref result.fooInt_);
+              break;
+            }
+            case 18: {
+              result.hasFooString = input.ReadString(ref result.fooString_);
+              break;
+            }
+            case 26: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+              if (result.hasFooMessage) {
+                subBuilder.MergeFrom(FooMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              FooMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 35: {
+              global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.CreateBuilder();
+              if (result.hasFooGroup) {
+                subBuilder.MergeFrom(FooGroup);
+              }
+              input.ReadGroup(4, subBuilder, extensionRegistry);
+              FooGroup = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasFooInt {
+        get { return result.hasFooInt; }
+      }
+      public int FooInt {
+        get { return result.FooInt; }
+        set { SetFooInt(value); }
+      }
+      public Builder SetFooInt(int value) {
+        PrepareBuilder();
+        result.hasFooInt = true;
+        result.fooInt_ = value;
+        return this;
+      }
+      public Builder ClearFooInt() {
+        PrepareBuilder();
+        result.hasFooInt = false;
+        result.fooInt_ = 0;
+        return this;
+      }
+
+      public bool HasFooString {
+        get { return result.hasFooString; }
+      }
+      public string FooString {
+        get { return result.FooString; }
+        set { SetFooString(value); }
+      }
+      public Builder SetFooString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooString = true;
+        result.fooString_ = value;
+        return this;
+      }
+      public Builder ClearFooString() {
+        PrepareBuilder();
+        result.hasFooString = false;
+        result.fooString_ = "";
+        return this;
+      }
+
+      public bool HasFooMessage {
+       get { return result.hasFooMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes FooMessage {
+        get { return result.FooMessage; }
+        set { SetFooMessage(value); }
+      }
+      public Builder SetFooMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooMessage = true;
+        result.fooMessage_ = value;
+        return this;
+      }
+      public Builder SetFooMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFooMessage = true;
+        result.fooMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFooMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFooMessage &&
+            result.fooMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+            result.fooMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.fooMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.fooMessage_ = value;
+        }
+        result.hasFooMessage = true;
+        return this;
+      }
+      public Builder ClearFooMessage() {
+        PrepareBuilder();
+        result.hasFooMessage = false;
+        result.fooMessage_ = null;
+        return this;
+      }
+
+      public bool HasFooGroup {
+       get { return result.hasFooGroup; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup FooGroup {
+        get { return result.FooGroup; }
+        set { SetFooGroup(value); }
+      }
+      public Builder SetFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooGroup = true;
+        result.fooGroup_ = value;
+        return this;
+      }
+      public Builder SetFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFooGroup = true;
+        result.fooGroup_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFooGroup &&
+            result.fooGroup_ != global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.DefaultInstance) {
+            result.fooGroup_ = global::Google.ProtocolBuffers.TestProtos.TestOneofBackwardsCompatible.Types.FooGroup.CreateBuilder(result.fooGroup_).MergeFrom(value).BuildPartial();
+        } else {
+          result.fooGroup_ = value;
+        }
+        result.hasFooGroup = true;
+        return this;
+      }
+      public Builder ClearFooGroup() {
+        PrepareBuilder();
+        result.hasFooGroup = false;
+        result.fooGroup_ = null;
+        return this;
+      }
+    }
+    static TestOneofBackwardsCompatible() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestOneof2 : pb::GeneratedMessage<TestOneof2, TestOneof2.Builder> {
+    private TestOneof2() { }
+    private static readonly TestOneof2 defaultInstance = new TestOneof2().MakeReadOnly();
+    private static readonly string[] _testOneof2FieldNames = new string[] { "bar_bytes", "bar_cord", "bar_enum", "bar_int", "bar_string", "bar_string_piece", "baz_int", "baz_string", "foo_bytes", "foo_cord", "foo_enum", "foo_int", "foo_lazy_message", "foo_message", "foo_string", "foo_string_piece", "foogroup" };
+    private static readonly uint[] _testOneof2FieldTags = new uint[] { 130, 114, 136, 96, 106, 122, 144, 154, 42, 26, 48, 8, 90, 58, 18, 34, 67 };
+    public static TestOneof2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestOneof2 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestOneof2 ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof2__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestOneof2, TestOneof2.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof2__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum NestedEnum {
+        FOO = 1,
+        BAR = 2,
+        BAZ = 3,
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class FooGroup : pb::GeneratedMessage<FooGroup, FooGroup.Builder> {
+        private FooGroup() { }
+        private static readonly FooGroup defaultInstance = new FooGroup().MakeReadOnly();
+        private static readonly string[] _fooGroupFieldNames = new string[] { "a", "b" };
+        private static readonly uint[] _fooGroupFieldTags = new uint[] { 72, 82 };
+        public static FooGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override FooGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override FooGroup ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof2_FooGroup__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<FooGroup, FooGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof2_FooGroup__FieldAccessorTable; }
+        }
+
+        public const int AFieldNumber = 9;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+
+        public const int BFieldNumber = 10;
+        private bool hasB;
+        private string b_ = "";
+        public bool HasB {
+          get { return hasB; }
+        }
+        public string B {
+          get { return b_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _fooGroupFieldNames;
+          if (hasA) {
+            output.WriteInt32(9, field_names[0], A);
+          }
+          if (hasB) {
+            output.WriteString(10, field_names[1], B);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasA) {
+            size += pb::CodedOutputStream.ComputeInt32Size(9, A);
+          }
+          if (hasB) {
+            size += pb::CodedOutputStream.ComputeStringSize(10, B);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static FooGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static FooGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static FooGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static FooGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private FooGroup MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(FooGroup prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<FooGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(FooGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private FooGroup result;
+
+          private FooGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              FooGroup original = result;
+              result = new FooGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override FooGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.Descriptor; }
+          }
+
+          public override FooGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.DefaultInstance; }
+          }
+
+          public override FooGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is FooGroup) {
+              return MergeFrom((FooGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(FooGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            if (other.HasB) {
+              B = other.B;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_fooGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _fooGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 72: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+                case 82: {
+                  result.hasB = input.ReadString(ref result.b_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+
+          public bool HasB {
+            get { return result.hasB; }
+          }
+          public string B {
+            get { return result.B; }
+            set { SetB(value); }
+          }
+          public Builder SetB(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasB = true;
+            result.b_ = value;
+            return this;
+          }
+          public Builder ClearB() {
+            PrepareBuilder();
+            result.hasB = false;
+            result.b_ = "";
+            return this;
+          }
+        }
+        static FooGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        private NestedMessage() { }
+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();
+        private static readonly string[] _nestedMessageFieldNames = new string[] { "corge_int", "qux_int" };
+        private static readonly uint[] _nestedMessageFieldTags = new uint[] { 16, 8 };
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override NestedMessage DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof2_NestedMessage__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestOneof2_NestedMessage__FieldAccessorTable; }
+        }
+
+        public const int QuxIntFieldNumber = 1;
+        private bool hasQuxInt;
+        private long quxInt_;
+        public bool HasQuxInt {
+          get { return hasQuxInt; }
+        }
+        public long QuxInt {
+          get { return quxInt_; }
+        }
+
+        public const int CorgeIntFieldNumber = 2;
+        private pbc::PopsicleList<int> corgeInt_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> CorgeIntList {
+          get { return pbc::Lists.AsReadOnly(corgeInt_); }
+        }
+        public int CorgeIntCount {
+          get { return corgeInt_.Count; }
+        }
+        public int GetCorgeInt(int index) {
+          return corgeInt_[index];
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _nestedMessageFieldNames;
+          if (hasQuxInt) {
+            output.WriteInt64(1, field_names[1], QuxInt);
+          }
+          if (corgeInt_.Count > 0) {
+            output.WriteInt32Array(2, field_names[0], corgeInt_);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasQuxInt) {
+            size += pb::CodedOutputStream.ComputeInt64Size(1, QuxInt);
+          }
+          {
+            int dataSize = 0;
+            foreach (int element in CorgeIntList) {
+              dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+            }
+            size += dataSize;
+            size += 1 * corgeInt_.Count;
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private NestedMessage MakeReadOnly() {
+          corgeInt_.MakeReadOnly();
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(NestedMessage prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<NestedMessage, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(NestedMessage cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private NestedMessage result;
+
+          private NestedMessage PrepareBuilder() {
+            if (resultIsReadOnly) {
+              NestedMessage original = result;
+              result = new NestedMessage();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override NestedMessage MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.Descriptor; }
+          }
+
+          public override NestedMessage DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance; }
+          }
+
+          public override NestedMessage BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is NestedMessage) {
+              return MergeFrom((NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(NestedMessage other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasQuxInt) {
+              QuxInt = other.QuxInt;
+            }
+            if (other.corgeInt_.Count != 0) {
+              result.corgeInt_.Add(other.corgeInt_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_nestedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _nestedMessageFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 8: {
+                  result.hasQuxInt = input.ReadInt64(ref result.quxInt_);
+                  break;
+                }
+                case 18:
+                case 16: {
+                  input.ReadInt32Array(tag, field_name, result.corgeInt_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasQuxInt {
+            get { return result.hasQuxInt; }
+          }
+          public long QuxInt {
+            get { return result.QuxInt; }
+            set { SetQuxInt(value); }
+          }
+          public Builder SetQuxInt(long value) {
+            PrepareBuilder();
+            result.hasQuxInt = true;
+            result.quxInt_ = value;
+            return this;
+          }
+          public Builder ClearQuxInt() {
+            PrepareBuilder();
+            result.hasQuxInt = false;
+            result.quxInt_ = 0L;
+            return this;
+          }
+
+          public pbc::IPopsicleList<int> CorgeIntList {
+            get { return PrepareBuilder().corgeInt_; }
+          }
+          public int CorgeIntCount {
+            get { return result.CorgeIntCount; }
+          }
+          public int GetCorgeInt(int index) {
+            return result.GetCorgeInt(index);
+          }
+          public Builder SetCorgeInt(int index, int value) {
+            PrepareBuilder();
+            result.corgeInt_[index] = value;
+            return this;
+          }
+          public Builder AddCorgeInt(int value) {
+            PrepareBuilder();
+            result.corgeInt_.Add(value);
+            return this;
+          }
+          public Builder AddRangeCorgeInt(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.corgeInt_.Add(values);
+            return this;
+          }
+          public Builder ClearCorgeInt() {
+            PrepareBuilder();
+            result.corgeInt_.Clear();
+            return this;
+          }
+        }
+        static NestedMessage() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int FooIntFieldNumber = 1;
+    private bool hasFooInt;
+    private int fooInt_;
+    public bool HasFooInt {
+      get { return hasFooInt; }
+    }
+    public int FooInt {
+      get { return fooInt_; }
+    }
+
+    public const int FooStringFieldNumber = 2;
+    private bool hasFooString;
+    private string fooString_ = "";
+    public bool HasFooString {
+      get { return hasFooString; }
+    }
+    public string FooString {
+      get { return fooString_; }
+    }
+
+    public const int FooCordFieldNumber = 3;
+    private bool hasFooCord;
+    private string fooCord_ = "";
+    public bool HasFooCord {
+      get { return hasFooCord; }
+    }
+    public string FooCord {
+      get { return fooCord_; }
+    }
+
+    public const int FooStringPieceFieldNumber = 4;
+    private bool hasFooStringPiece;
+    private string fooStringPiece_ = "";
+    public bool HasFooStringPiece {
+      get { return hasFooStringPiece; }
+    }
+    public string FooStringPiece {
+      get { return fooStringPiece_; }
+    }
+
+    public const int FooBytesFieldNumber = 5;
+    private bool hasFooBytes;
+    private pb::ByteString fooBytes_ = pb::ByteString.Empty;
+    public bool HasFooBytes {
+      get { return hasFooBytes; }
+    }
+    public pb::ByteString FooBytes {
+      get { return fooBytes_; }
+    }
+
+    public const int FooEnumFieldNumber = 6;
+    private bool hasFooEnum;
+    private global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum fooEnum_ = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum.FOO;
+    public bool HasFooEnum {
+      get { return hasFooEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum FooEnum {
+      get { return fooEnum_; }
+    }
+
+    public const int FooMessageFieldNumber = 7;
+    private bool hasFooMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage fooMessage_;
+    public bool HasFooMessage {
+      get { return hasFooMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage FooMessage {
+      get { return fooMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public const int FooGroupFieldNumber = 8;
+    private bool hasFooGroup;
+    private global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup fooGroup_;
+    public bool HasFooGroup {
+      get { return hasFooGroup; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup FooGroup {
+      get { return fooGroup_ ?? global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.DefaultInstance; }
+    }
+
+    public const int FooLazyMessageFieldNumber = 11;
+    private bool hasFooLazyMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage fooLazyMessage_;
+    public bool HasFooLazyMessage {
+      get { return hasFooLazyMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage FooLazyMessage {
+      get { return fooLazyMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public const int BarIntFieldNumber = 12;
+    private bool hasBarInt;
+    private int barInt_ = 5;
+    public bool HasBarInt {
+      get { return hasBarInt; }
+    }
+    public int BarInt {
+      get { return barInt_; }
+    }
+
+    public const int BarStringFieldNumber = 13;
+    private bool hasBarString;
+    private string barString_ = "STRING";
+    public bool HasBarString {
+      get { return hasBarString; }
+    }
+    public string BarString {
+      get { return barString_; }
+    }
+
+    public const int BarCordFieldNumber = 14;
+    private bool hasBarCord;
+    private string barCord_ = "CORD";
+    public bool HasBarCord {
+      get { return hasBarCord; }
+    }
+    public string BarCord {
+      get { return barCord_; }
+    }
+
+    public const int BarStringPieceFieldNumber = 15;
+    private bool hasBarStringPiece;
+    private string barStringPiece_ = "SPIECE";
+    public bool HasBarStringPiece {
+      get { return hasBarStringPiece; }
+    }
+    public string BarStringPiece {
+      get { return barStringPiece_; }
+    }
+
+    public const int BarBytesFieldNumber = 16;
+    private bool hasBarBytes;
+    private pb::ByteString barBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestOneof2.Descriptor.Fields[13].DefaultValue;
+    public bool HasBarBytes {
+      get { return hasBarBytes; }
+    }
+    public pb::ByteString BarBytes {
+      get { return barBytes_; }
+    }
+
+    public const int BarEnumFieldNumber = 17;
+    private bool hasBarEnum;
+    private global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum barEnum_ = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum.BAR;
+    public bool HasBarEnum {
+      get { return hasBarEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum BarEnum {
+      get { return barEnum_; }
+    }
+
+    public const int BazIntFieldNumber = 18;
+    private bool hasBazInt;
+    private int bazInt_;
+    public bool HasBazInt {
+      get { return hasBazInt; }
+    }
+    public int BazInt {
+      get { return bazInt_; }
+    }
+
+    public const int BazStringFieldNumber = 19;
+    private bool hasBazString;
+    private string bazString_ = "BAZ";
+    public bool HasBazString {
+      get { return hasBazString; }
+    }
+    public string BazString {
+      get { return bazString_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testOneof2FieldNames;
+      if (hasFooInt) {
+        output.WriteInt32(1, field_names[11], FooInt);
+      }
+      if (hasFooString) {
+        output.WriteString(2, field_names[14], FooString);
+      }
+      if (hasFooCord) {
+        output.WriteString(3, field_names[9], FooCord);
+      }
+      if (hasFooStringPiece) {
+        output.WriteString(4, field_names[15], FooStringPiece);
+      }
+      if (hasFooBytes) {
+        output.WriteBytes(5, field_names[8], FooBytes);
+      }
+      if (hasFooEnum) {
+        output.WriteEnum(6, field_names[10], (int) FooEnum, FooEnum);
+      }
+      if (hasFooMessage) {
+        output.WriteMessage(7, field_names[13], FooMessage);
+      }
+      if (hasFooGroup) {
+        output.WriteGroup(8, field_names[16], FooGroup);
+      }
+      if (hasFooLazyMessage) {
+        output.WriteMessage(11, field_names[12], FooLazyMessage);
+      }
+      if (hasBarInt) {
+        output.WriteInt32(12, field_names[3], BarInt);
+      }
+      if (hasBarString) {
+        output.WriteString(13, field_names[4], BarString);
+      }
+      if (hasBarCord) {
+        output.WriteString(14, field_names[1], BarCord);
+      }
+      if (hasBarStringPiece) {
+        output.WriteString(15, field_names[5], BarStringPiece);
+      }
+      if (hasBarBytes) {
+        output.WriteBytes(16, field_names[0], BarBytes);
+      }
+      if (hasBarEnum) {
+        output.WriteEnum(17, field_names[2], (int) BarEnum, BarEnum);
+      }
+      if (hasBazInt) {
+        output.WriteInt32(18, field_names[6], BazInt);
+      }
+      if (hasBazString) {
+        output.WriteString(19, field_names[7], BazString);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasFooInt) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, FooInt);
+      }
+      if (hasFooString) {
+        size += pb::CodedOutputStream.ComputeStringSize(2, FooString);
+      }
+      if (hasFooCord) {
+        size += pb::CodedOutputStream.ComputeStringSize(3, FooCord);
+      }
+      if (hasFooStringPiece) {
+        size += pb::CodedOutputStream.ComputeStringSize(4, FooStringPiece);
+      }
+      if (hasFooBytes) {
+        size += pb::CodedOutputStream.ComputeBytesSize(5, FooBytes);
+      }
+      if (hasFooEnum) {
+        size += pb::CodedOutputStream.ComputeEnumSize(6, (int) FooEnum);
+      }
+      if (hasFooMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(7, FooMessage);
+      }
+      if (hasFooGroup) {
+        size += pb::CodedOutputStream.ComputeGroupSize(8, FooGroup);
+      }
+      if (hasFooLazyMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(11, FooLazyMessage);
+      }
+      if (hasBarInt) {
+        size += pb::CodedOutputStream.ComputeInt32Size(12, BarInt);
+      }
+      if (hasBarString) {
+        size += pb::CodedOutputStream.ComputeStringSize(13, BarString);
+      }
+      if (hasBarCord) {
+        size += pb::CodedOutputStream.ComputeStringSize(14, BarCord);
+      }
+      if (hasBarStringPiece) {
+        size += pb::CodedOutputStream.ComputeStringSize(15, BarStringPiece);
+      }
+      if (hasBarBytes) {
+        size += pb::CodedOutputStream.ComputeBytesSize(16, BarBytes);
+      }
+      if (hasBarEnum) {
+        size += pb::CodedOutputStream.ComputeEnumSize(17, (int) BarEnum);
+      }
+      if (hasBazInt) {
+        size += pb::CodedOutputStream.ComputeInt32Size(18, BazInt);
+      }
+      if (hasBazString) {
+        size += pb::CodedOutputStream.ComputeStringSize(19, BazString);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestOneof2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestOneof2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneof2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestOneof2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneof2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestOneof2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestOneof2 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestOneof2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestOneof2 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestOneof2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestOneof2 MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestOneof2 prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestOneof2, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestOneof2 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestOneof2 result;
+
+      private TestOneof2 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestOneof2 original = result;
+          result = new TestOneof2();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestOneof2 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestOneof2.Descriptor; }
+      }
+
+      public override TestOneof2 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestOneof2.DefaultInstance; }
+      }
+
+      public override TestOneof2 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestOneof2) {
+          return MergeFrom((TestOneof2) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestOneof2 other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestOneof2.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasFooInt) {
+          FooInt = other.FooInt;
+        }
+        if (other.HasFooString) {
+          FooString = other.FooString;
+        }
+        if (other.HasFooCord) {
+          FooCord = other.FooCord;
+        }
+        if (other.HasFooStringPiece) {
+          FooStringPiece = other.FooStringPiece;
+        }
+        if (other.HasFooBytes) {
+          FooBytes = other.FooBytes;
+        }
+        if (other.HasFooEnum) {
+          FooEnum = other.FooEnum;
+        }
+        if (other.HasFooMessage) {
+          MergeFooMessage(other.FooMessage);
+        }
+        if (other.HasFooGroup) {
+          MergeFooGroup(other.FooGroup);
+        }
+        if (other.HasFooLazyMessage) {
+          MergeFooLazyMessage(other.FooLazyMessage);
+        }
+        if (other.HasBarInt) {
+          BarInt = other.BarInt;
+        }
+        if (other.HasBarString) {
+          BarString = other.BarString;
+        }
+        if (other.HasBarCord) {
+          BarCord = other.BarCord;
+        }
+        if (other.HasBarStringPiece) {
+          BarStringPiece = other.BarStringPiece;
+        }
+        if (other.HasBarBytes) {
+          BarBytes = other.BarBytes;
+        }
+        if (other.HasBarEnum) {
+          BarEnum = other.BarEnum;
+        }
+        if (other.HasBazInt) {
+          BazInt = other.BazInt;
+        }
+        if (other.HasBazString) {
+          BazString = other.BazString;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testOneof2FieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testOneof2FieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasFooInt = input.ReadInt32(ref result.fooInt_);
+              break;
+            }
+            case 18: {
+              result.hasFooString = input.ReadString(ref result.fooString_);
+              break;
+            }
+            case 26: {
+              result.hasFooCord = input.ReadString(ref result.fooCord_);
+              break;
+            }
+            case 34: {
+              result.hasFooStringPiece = input.ReadString(ref result.fooStringPiece_);
+              break;
+            }
+            case 42: {
+              result.hasFooBytes = input.ReadBytes(ref result.fooBytes_);
+              break;
+            }
+            case 48: {
+              object unknown;
+              if(input.ReadEnum(ref result.fooEnum_, out unknown)) {
+                result.hasFooEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(6, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 58: {
+              global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.CreateBuilder();
+              if (result.hasFooMessage) {
+                subBuilder.MergeFrom(FooMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              FooMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 67: {
+              global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.CreateBuilder();
+              if (result.hasFooGroup) {
+                subBuilder.MergeFrom(FooGroup);
+              }
+              input.ReadGroup(8, subBuilder, extensionRegistry);
+              FooGroup = subBuilder.BuildPartial();
+              break;
+            }
+            case 90: {
+              global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.CreateBuilder();
+              if (result.hasFooLazyMessage) {
+                subBuilder.MergeFrom(FooLazyMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              FooLazyMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 96: {
+              result.hasBarInt = input.ReadInt32(ref result.barInt_);
+              break;
+            }
+            case 106: {
+              result.hasBarString = input.ReadString(ref result.barString_);
+              break;
+            }
+            case 114: {
+              result.hasBarCord = input.ReadString(ref result.barCord_);
+              break;
+            }
+            case 122: {
+              result.hasBarStringPiece = input.ReadString(ref result.barStringPiece_);
+              break;
+            }
+            case 130: {
+              result.hasBarBytes = input.ReadBytes(ref result.barBytes_);
+              break;
+            }
+            case 136: {
+              object unknown;
+              if(input.ReadEnum(ref result.barEnum_, out unknown)) {
+                result.hasBarEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(17, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 144: {
+              result.hasBazInt = input.ReadInt32(ref result.bazInt_);
+              break;
+            }
+            case 154: {
+              result.hasBazString = input.ReadString(ref result.bazString_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasFooInt {
+        get { return result.hasFooInt; }
+      }
+      public int FooInt {
+        get { return result.FooInt; }
+        set { SetFooInt(value); }
+      }
+      public Builder SetFooInt(int value) {
+        PrepareBuilder();
+        result.hasFooInt = true;
+        result.fooInt_ = value;
+        return this;
+      }
+      public Builder ClearFooInt() {
+        PrepareBuilder();
+        result.hasFooInt = false;
+        result.fooInt_ = 0;
+        return this;
+      }
+
+      public bool HasFooString {
+        get { return result.hasFooString; }
+      }
+      public string FooString {
+        get { return result.FooString; }
+        set { SetFooString(value); }
+      }
+      public Builder SetFooString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooString = true;
+        result.fooString_ = value;
+        return this;
+      }
+      public Builder ClearFooString() {
+        PrepareBuilder();
+        result.hasFooString = false;
+        result.fooString_ = "";
+        return this;
+      }
+
+      public bool HasFooCord {
+        get { return result.hasFooCord; }
+      }
+      public string FooCord {
+        get { return result.FooCord; }
+        set { SetFooCord(value); }
+      }
+      public Builder SetFooCord(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooCord = true;
+        result.fooCord_ = value;
+        return this;
+      }
+      public Builder ClearFooCord() {
+        PrepareBuilder();
+        result.hasFooCord = false;
+        result.fooCord_ = "";
+        return this;
+      }
+
+      public bool HasFooStringPiece {
+        get { return result.hasFooStringPiece; }
+      }
+      public string FooStringPiece {
+        get { return result.FooStringPiece; }
+        set { SetFooStringPiece(value); }
+      }
+      public Builder SetFooStringPiece(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooStringPiece = true;
+        result.fooStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearFooStringPiece() {
+        PrepareBuilder();
+        result.hasFooStringPiece = false;
+        result.fooStringPiece_ = "";
+        return this;
+      }
+
+      public bool HasFooBytes {
+        get { return result.hasFooBytes; }
+      }
+      public pb::ByteString FooBytes {
+        get { return result.FooBytes; }
+        set { SetFooBytes(value); }
+      }
+      public Builder SetFooBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooBytes = true;
+        result.fooBytes_ = value;
+        return this;
+      }
+      public Builder ClearFooBytes() {
+        PrepareBuilder();
+        result.hasFooBytes = false;
+        result.fooBytes_ = pb::ByteString.Empty;
+        return this;
+      }
+
+      public bool HasFooEnum {
+       get { return result.hasFooEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum FooEnum {
+        get { return result.FooEnum; }
+        set { SetFooEnum(value); }
+      }
+      public Builder SetFooEnum(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.hasFooEnum = true;
+        result.fooEnum_ = value;
+        return this;
+      }
+      public Builder ClearFooEnum() {
+        PrepareBuilder();
+        result.hasFooEnum = false;
+        result.fooEnum_ = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum.FOO;
+        return this;
+      }
+
+      public bool HasFooMessage {
+       get { return result.hasFooMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage FooMessage {
+        get { return result.FooMessage; }
+        set { SetFooMessage(value); }
+      }
+      public Builder SetFooMessage(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooMessage = true;
+        result.fooMessage_ = value;
+        return this;
+      }
+      public Builder SetFooMessage(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFooMessage = true;
+        result.fooMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFooMessage(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFooMessage &&
+            result.fooMessage_ != global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance) {
+            result.fooMessage_ = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.CreateBuilder(result.fooMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.fooMessage_ = value;
+        }
+        result.hasFooMessage = true;
+        return this;
+      }
+      public Builder ClearFooMessage() {
+        PrepareBuilder();
+        result.hasFooMessage = false;
+        result.fooMessage_ = null;
+        return this;
+      }
+
+      public bool HasFooGroup {
+       get { return result.hasFooGroup; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup FooGroup {
+        get { return result.FooGroup; }
+        set { SetFooGroup(value); }
+      }
+      public Builder SetFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooGroup = true;
+        result.fooGroup_ = value;
+        return this;
+      }
+      public Builder SetFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFooGroup = true;
+        result.fooGroup_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFooGroup(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFooGroup &&
+            result.fooGroup_ != global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.DefaultInstance) {
+            result.fooGroup_ = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.FooGroup.CreateBuilder(result.fooGroup_).MergeFrom(value).BuildPartial();
+        } else {
+          result.fooGroup_ = value;
+        }
+        result.hasFooGroup = true;
+        return this;
+      }
+      public Builder ClearFooGroup() {
+        PrepareBuilder();
+        result.hasFooGroup = false;
+        result.fooGroup_ = null;
+        return this;
+      }
+
+      public bool HasFooLazyMessage {
+       get { return result.hasFooLazyMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage FooLazyMessage {
+        get { return result.FooLazyMessage; }
+        set { SetFooLazyMessage(value); }
+      }
+      public Builder SetFooLazyMessage(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooLazyMessage = true;
+        result.fooLazyMessage_ = value;
+        return this;
+      }
+      public Builder SetFooLazyMessage(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFooLazyMessage = true;
+        result.fooLazyMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFooLazyMessage(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFooLazyMessage &&
+            result.fooLazyMessage_ != global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.DefaultInstance) {
+            result.fooLazyMessage_ = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedMessage.CreateBuilder(result.fooLazyMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.fooLazyMessage_ = value;
+        }
+        result.hasFooLazyMessage = true;
+        return this;
+      }
+      public Builder ClearFooLazyMessage() {
+        PrepareBuilder();
+        result.hasFooLazyMessage = false;
+        result.fooLazyMessage_ = null;
+        return this;
+      }
+
+      public bool HasBarInt {
+        get { return result.hasBarInt; }
+      }
+      public int BarInt {
+        get { return result.BarInt; }
+        set { SetBarInt(value); }
+      }
+      public Builder SetBarInt(int value) {
+        PrepareBuilder();
+        result.hasBarInt = true;
+        result.barInt_ = value;
+        return this;
+      }
+      public Builder ClearBarInt() {
+        PrepareBuilder();
+        result.hasBarInt = false;
+        result.barInt_ = 5;
+        return this;
+      }
+
+      public bool HasBarString {
+        get { return result.hasBarString; }
+      }
+      public string BarString {
+        get { return result.BarString; }
+        set { SetBarString(value); }
+      }
+      public Builder SetBarString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBarString = true;
+        result.barString_ = value;
+        return this;
+      }
+      public Builder ClearBarString() {
+        PrepareBuilder();
+        result.hasBarString = false;
+        result.barString_ = "STRING";
+        return this;
+      }
+
+      public bool HasBarCord {
+        get { return result.hasBarCord; }
+      }
+      public string BarCord {
+        get { return result.BarCord; }
+        set { SetBarCord(value); }
+      }
+      public Builder SetBarCord(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBarCord = true;
+        result.barCord_ = value;
+        return this;
+      }
+      public Builder ClearBarCord() {
+        PrepareBuilder();
+        result.hasBarCord = false;
+        result.barCord_ = "CORD";
+        return this;
+      }
+
+      public bool HasBarStringPiece {
+        get { return result.hasBarStringPiece; }
+      }
+      public string BarStringPiece {
+        get { return result.BarStringPiece; }
+        set { SetBarStringPiece(value); }
+      }
+      public Builder SetBarStringPiece(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBarStringPiece = true;
+        result.barStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearBarStringPiece() {
+        PrepareBuilder();
+        result.hasBarStringPiece = false;
+        result.barStringPiece_ = "SPIECE";
+        return this;
+      }
+
+      public bool HasBarBytes {
+        get { return result.hasBarBytes; }
+      }
+      public pb::ByteString BarBytes {
+        get { return result.BarBytes; }
+        set { SetBarBytes(value); }
+      }
+      public Builder SetBarBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBarBytes = true;
+        result.barBytes_ = value;
+        return this;
+      }
+      public Builder ClearBarBytes() {
+        PrepareBuilder();
+        result.hasBarBytes = false;
+        result.barBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestOneof2.Descriptor.Fields[13].DefaultValue;
+        return this;
+      }
+
+      public bool HasBarEnum {
+       get { return result.hasBarEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum BarEnum {
+        get { return result.BarEnum; }
+        set { SetBarEnum(value); }
+      }
+      public Builder SetBarEnum(global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.hasBarEnum = true;
+        result.barEnum_ = value;
+        return this;
+      }
+      public Builder ClearBarEnum() {
+        PrepareBuilder();
+        result.hasBarEnum = false;
+        result.barEnum_ = global::Google.ProtocolBuffers.TestProtos.TestOneof2.Types.NestedEnum.BAR;
+        return this;
+      }
+
+      public bool HasBazInt {
+        get { return result.hasBazInt; }
+      }
+      public int BazInt {
+        get { return result.BazInt; }
+        set { SetBazInt(value); }
+      }
+      public Builder SetBazInt(int value) {
+        PrepareBuilder();
+        result.hasBazInt = true;
+        result.bazInt_ = value;
+        return this;
+      }
+      public Builder ClearBazInt() {
+        PrepareBuilder();
+        result.hasBazInt = false;
+        result.bazInt_ = 0;
+        return this;
+      }
+
+      public bool HasBazString {
+        get { return result.hasBazString; }
+      }
+      public string BazString {
+        get { return result.BazString; }
+        set { SetBazString(value); }
+      }
+      public Builder SetBazString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBazString = true;
+        result.bazString_ = value;
+        return this;
+      }
+      public Builder ClearBazString() {
+        PrepareBuilder();
+        result.hasBazString = false;
+        result.bazString_ = "BAZ";
+        return this;
+      }
+    }
+    static TestOneof2() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRequiredOneof : pb::GeneratedMessage<TestRequiredOneof, TestRequiredOneof.Builder> {
+    private TestRequiredOneof() { }
+    private static readonly TestRequiredOneof defaultInstance = new TestRequiredOneof().MakeReadOnly();
+    private static readonly string[] _testRequiredOneofFieldNames = new string[] { "foo_int", "foo_message", "foo_string" };
+    private static readonly uint[] _testRequiredOneofFieldTags = new uint[] { 8, 26, 18 };
+    public static TestRequiredOneof DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestRequiredOneof DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestRequiredOneof ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRequiredOneof__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestRequiredOneof, TestRequiredOneof.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRequiredOneof__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        private NestedMessage() { }
+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();
+        private static readonly string[] _nestedMessageFieldNames = new string[] { "required_double" };
+        private static readonly uint[] _nestedMessageFieldTags = new uint[] { 9 };
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override NestedMessage DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRequiredOneof_NestedMessage__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRequiredOneof_NestedMessage__FieldAccessorTable; }
+        }
+
+        public const int RequiredDoubleFieldNumber = 1;
+        private bool hasRequiredDouble;
+        private double requiredDouble_;
+        public bool HasRequiredDouble {
+          get { return hasRequiredDouble; }
+        }
+        public double RequiredDouble {
+          get { return requiredDouble_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            if (!hasRequiredDouble) return false;
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _nestedMessageFieldNames;
+          if (hasRequiredDouble) {
+            output.WriteDouble(1, field_names[0], RequiredDouble);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasRequiredDouble) {
+            size += pb::CodedOutputStream.ComputeDoubleSize(1, RequiredDouble);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private NestedMessage MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(NestedMessage prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<NestedMessage, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(NestedMessage cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private NestedMessage result;
+
+          private NestedMessage PrepareBuilder() {
+            if (resultIsReadOnly) {
+              NestedMessage original = result;
+              result = new NestedMessage();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override NestedMessage MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.Descriptor; }
+          }
+
+          public override NestedMessage DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.DefaultInstance; }
+          }
+
+          public override NestedMessage BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is NestedMessage) {
+              return MergeFrom((NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(NestedMessage other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasRequiredDouble) {
+              RequiredDouble = other.RequiredDouble;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_nestedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _nestedMessageFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 9: {
+                  result.hasRequiredDouble = input.ReadDouble(ref result.requiredDouble_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasRequiredDouble {
+            get { return result.hasRequiredDouble; }
+          }
+          public double RequiredDouble {
+            get { return result.RequiredDouble; }
+            set { SetRequiredDouble(value); }
+          }
+          public Builder SetRequiredDouble(double value) {
+            PrepareBuilder();
+            result.hasRequiredDouble = true;
+            result.requiredDouble_ = value;
+            return this;
+          }
+          public Builder ClearRequiredDouble() {
+            PrepareBuilder();
+            result.hasRequiredDouble = false;
+            result.requiredDouble_ = 0D;
+            return this;
+          }
+        }
+        static NestedMessage() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int FooIntFieldNumber = 1;
+    private bool hasFooInt;
+    private int fooInt_;
+    public bool HasFooInt {
+      get { return hasFooInt; }
+    }
+    public int FooInt {
+      get { return fooInt_; }
+    }
+
+    public const int FooStringFieldNumber = 2;
+    private bool hasFooString;
+    private string fooString_ = "";
+    public bool HasFooString {
+      get { return hasFooString; }
+    }
+    public string FooString {
+      get { return fooString_; }
+    }
+
+    public const int FooMessageFieldNumber = 3;
+    private bool hasFooMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage fooMessage_;
+    public bool HasFooMessage {
+      get { return hasFooMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage FooMessage {
+      get { return fooMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.DefaultInstance; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (HasFooMessage) {
+          if (!FooMessage.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRequiredOneofFieldNames;
+      if (hasFooInt) {
+        output.WriteInt32(1, field_names[0], FooInt);
+      }
+      if (hasFooString) {
+        output.WriteString(2, field_names[2], FooString);
+      }
+      if (hasFooMessage) {
+        output.WriteMessage(3, field_names[1], FooMessage);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasFooInt) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, FooInt);
+      }
+      if (hasFooString) {
+        size += pb::CodedOutputStream.ComputeStringSize(2, FooString);
+      }
+      if (hasFooMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(3, FooMessage);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestRequiredOneof ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequiredOneof ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredOneof ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequiredOneof ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredOneof ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequiredOneof ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredOneof ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRequiredOneof ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRequiredOneof ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequiredOneof ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRequiredOneof MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRequiredOneof prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRequiredOneof, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRequiredOneof cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestRequiredOneof result;
+
+      private TestRequiredOneof PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRequiredOneof original = result;
+          result = new TestRequiredOneof();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestRequiredOneof MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Descriptor; }
+      }
+
+      public override TestRequiredOneof DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.DefaultInstance; }
+      }
+
+      public override TestRequiredOneof BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRequiredOneof) {
+          return MergeFrom((TestRequiredOneof) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestRequiredOneof other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasFooInt) {
+          FooInt = other.FooInt;
+        }
+        if (other.HasFooString) {
+          FooString = other.FooString;
+        }
+        if (other.HasFooMessage) {
+          MergeFooMessage(other.FooMessage);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRequiredOneofFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRequiredOneofFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasFooInt = input.ReadInt32(ref result.fooInt_);
+              break;
+            }
+            case 18: {
+              result.hasFooString = input.ReadString(ref result.fooString_);
+              break;
+            }
+            case 26: {
+              global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.CreateBuilder();
+              if (result.hasFooMessage) {
+                subBuilder.MergeFrom(FooMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              FooMessage = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasFooInt {
+        get { return result.hasFooInt; }
+      }
+      public int FooInt {
+        get { return result.FooInt; }
+        set { SetFooInt(value); }
+      }
+      public Builder SetFooInt(int value) {
+        PrepareBuilder();
+        result.hasFooInt = true;
+        result.fooInt_ = value;
+        return this;
+      }
+      public Builder ClearFooInt() {
+        PrepareBuilder();
+        result.hasFooInt = false;
+        result.fooInt_ = 0;
+        return this;
+      }
+
+      public bool HasFooString {
+        get { return result.hasFooString; }
+      }
+      public string FooString {
+        get { return result.FooString; }
+        set { SetFooString(value); }
+      }
+      public Builder SetFooString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooString = true;
+        result.fooString_ = value;
+        return this;
+      }
+      public Builder ClearFooString() {
+        PrepareBuilder();
+        result.hasFooString = false;
+        result.fooString_ = "";
+        return this;
+      }
+
+      public bool HasFooMessage {
+       get { return result.hasFooMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage FooMessage {
+        get { return result.FooMessage; }
+        set { SetFooMessage(value); }
+      }
+      public Builder SetFooMessage(global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFooMessage = true;
+        result.fooMessage_ = value;
+        return this;
+      }
+      public Builder SetFooMessage(global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFooMessage = true;
+        result.fooMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFooMessage(global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFooMessage &&
+            result.fooMessage_ != global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.DefaultInstance) {
+            result.fooMessage_ = global::Google.ProtocolBuffers.TestProtos.TestRequiredOneof.Types.NestedMessage.CreateBuilder(result.fooMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.fooMessage_ = value;
+        }
+        result.hasFooMessage = true;
+        return this;
+      }
+      public Builder ClearFooMessage() {
+        PrepareBuilder();
+        result.hasFooMessage = false;
+        result.fooMessage_ = null;
+        return this;
+      }
+    }
+    static TestRequiredOneof() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestPackedTypes : pb::GeneratedMessage<TestPackedTypes, TestPackedTypes.Builder> {
+    private TestPackedTypes() { }
+    private static readonly TestPackedTypes defaultInstance = new TestPackedTypes().MakeReadOnly();
+    private static readonly string[] _testPackedTypesFieldNames = new string[] { "packed_bool", "packed_double", "packed_enum", "packed_fixed32", "packed_fixed64", "packed_float", "packed_int32", "packed_int64", "packed_sfixed32", "packed_sfixed64", "packed_sint32", "packed_sint64", "packed_uint32", "packed_uint64" };
+    private static readonly uint[] _testPackedTypesFieldTags = new uint[] { 818, 810, 826, 770, 778, 802, 722, 730, 786, 794, 754, 762, 738, 746 };
+    public static TestPackedTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestPackedTypes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestPackedTypes ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestPackedTypes__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestPackedTypes, TestPackedTypes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestPackedTypes__FieldAccessorTable; }
+    }
+
+    public const int PackedInt32FieldNumber = 90;
+    private int packedInt32MemoizedSerializedSize;
+    private pbc::PopsicleList<int> packedInt32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> PackedInt32List {
+      get { return pbc::Lists.AsReadOnly(packedInt32_); }
+    }
+    public int PackedInt32Count {
+      get { return packedInt32_.Count; }
+    }
+    public int GetPackedInt32(int index) {
+      return packedInt32_[index];
+    }
+
+    public const int PackedInt64FieldNumber = 91;
+    private int packedInt64MemoizedSerializedSize;
+    private pbc::PopsicleList<long> packedInt64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> PackedInt64List {
+      get { return pbc::Lists.AsReadOnly(packedInt64_); }
+    }
+    public int PackedInt64Count {
+      get { return packedInt64_.Count; }
+    }
+    public long GetPackedInt64(int index) {
+      return packedInt64_[index];
+    }
+
+    public const int PackedUint32FieldNumber = 92;
+    private int packedUint32MemoizedSerializedSize;
+    private pbc::PopsicleList<uint> packedUint32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> PackedUint32List {
+      get { return pbc::Lists.AsReadOnly(packedUint32_); }
+    }
+    public int PackedUint32Count {
+      get { return packedUint32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetPackedUint32(int index) {
+      return packedUint32_[index];
+    }
+
+    public const int PackedUint64FieldNumber = 93;
+    private int packedUint64MemoizedSerializedSize;
+    private pbc::PopsicleList<ulong> packedUint64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> PackedUint64List {
+      get { return pbc::Lists.AsReadOnly(packedUint64_); }
+    }
+    public int PackedUint64Count {
+      get { return packedUint64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetPackedUint64(int index) {
+      return packedUint64_[index];
+    }
+
+    public const int PackedSint32FieldNumber = 94;
+    private int packedSint32MemoizedSerializedSize;
+    private pbc::PopsicleList<int> packedSint32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> PackedSint32List {
+      get { return pbc::Lists.AsReadOnly(packedSint32_); }
+    }
+    public int PackedSint32Count {
+      get { return packedSint32_.Count; }
+    }
+    public int GetPackedSint32(int index) {
+      return packedSint32_[index];
+    }
+
+    public const int PackedSint64FieldNumber = 95;
+    private int packedSint64MemoizedSerializedSize;
+    private pbc::PopsicleList<long> packedSint64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> PackedSint64List {
+      get { return pbc::Lists.AsReadOnly(packedSint64_); }
+    }
+    public int PackedSint64Count {
+      get { return packedSint64_.Count; }
+    }
+    public long GetPackedSint64(int index) {
+      return packedSint64_[index];
+    }
+
+    public const int PackedFixed32FieldNumber = 96;
+    private int packedFixed32MemoizedSerializedSize;
+    private pbc::PopsicleList<uint> packedFixed32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> PackedFixed32List {
+      get { return pbc::Lists.AsReadOnly(packedFixed32_); }
+    }
+    public int PackedFixed32Count {
+      get { return packedFixed32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetPackedFixed32(int index) {
+      return packedFixed32_[index];
+    }
+
+    public const int PackedFixed64FieldNumber = 97;
+    private int packedFixed64MemoizedSerializedSize;
+    private pbc::PopsicleList<ulong> packedFixed64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> PackedFixed64List {
+      get { return pbc::Lists.AsReadOnly(packedFixed64_); }
+    }
+    public int PackedFixed64Count {
+      get { return packedFixed64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetPackedFixed64(int index) {
+      return packedFixed64_[index];
+    }
+
+    public const int PackedSfixed32FieldNumber = 98;
+    private int packedSfixed32MemoizedSerializedSize;
+    private pbc::PopsicleList<int> packedSfixed32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> PackedSfixed32List {
+      get { return pbc::Lists.AsReadOnly(packedSfixed32_); }
+    }
+    public int PackedSfixed32Count {
+      get { return packedSfixed32_.Count; }
+    }
+    public int GetPackedSfixed32(int index) {
+      return packedSfixed32_[index];
+    }
+
+    public const int PackedSfixed64FieldNumber = 99;
+    private int packedSfixed64MemoizedSerializedSize;
+    private pbc::PopsicleList<long> packedSfixed64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> PackedSfixed64List {
+      get { return pbc::Lists.AsReadOnly(packedSfixed64_); }
+    }
+    public int PackedSfixed64Count {
+      get { return packedSfixed64_.Count; }
+    }
+    public long GetPackedSfixed64(int index) {
+      return packedSfixed64_[index];
+    }
+
+    public const int PackedFloatFieldNumber = 100;
+    private int packedFloatMemoizedSerializedSize;
+    private pbc::PopsicleList<float> packedFloat_ = new pbc::PopsicleList<float>();
+    public scg::IList<float> PackedFloatList {
+      get { return pbc::Lists.AsReadOnly(packedFloat_); }
+    }
+    public int PackedFloatCount {
+      get { return packedFloat_.Count; }
+    }
+    public float GetPackedFloat(int index) {
+      return packedFloat_[index];
+    }
+
+    public const int PackedDoubleFieldNumber = 101;
+    private int packedDoubleMemoizedSerializedSize;
+    private pbc::PopsicleList<double> packedDouble_ = new pbc::PopsicleList<double>();
+    public scg::IList<double> PackedDoubleList {
+      get { return pbc::Lists.AsReadOnly(packedDouble_); }
+    }
+    public int PackedDoubleCount {
+      get { return packedDouble_.Count; }
+    }
+    public double GetPackedDouble(int index) {
+      return packedDouble_[index];
+    }
+
+    public const int PackedBoolFieldNumber = 102;
+    private int packedBoolMemoizedSerializedSize;
+    private pbc::PopsicleList<bool> packedBool_ = new pbc::PopsicleList<bool>();
+    public scg::IList<bool> PackedBoolList {
+      get { return pbc::Lists.AsReadOnly(packedBool_); }
+    }
+    public int PackedBoolCount {
+      get { return packedBool_.Count; }
+    }
+    public bool GetPackedBool(int index) {
+      return packedBool_[index];
+    }
+
+    public const int PackedEnumFieldNumber = 103;
+    private int packedEnumMemoizedSerializedSize;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> packedEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> PackedEnumList {
+      get { return pbc::Lists.AsReadOnly(packedEnum_); }
+    }
+    public int PackedEnumCount {
+      get { return packedEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetPackedEnum(int index) {
+      return packedEnum_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testPackedTypesFieldNames;
+      if (packedInt32_.Count > 0) {
+        output.WritePackedInt32Array(90, field_names[6], packedInt32MemoizedSerializedSize, packedInt32_);
+      }
+      if (packedInt64_.Count > 0) {
+        output.WritePackedInt64Array(91, field_names[7], packedInt64MemoizedSerializedSize, packedInt64_);
+      }
+      if (packedUint32_.Count > 0) {
+        output.WritePackedUInt32Array(92, field_names[12], packedUint32MemoizedSerializedSize, packedUint32_);
+      }
+      if (packedUint64_.Count > 0) {
+        output.WritePackedUInt64Array(93, field_names[13], packedUint64MemoizedSerializedSize, packedUint64_);
+      }
+      if (packedSint32_.Count > 0) {
+        output.WritePackedSInt32Array(94, field_names[10], packedSint32MemoizedSerializedSize, packedSint32_);
+      }
+      if (packedSint64_.Count > 0) {
+        output.WritePackedSInt64Array(95, field_names[11], packedSint64MemoizedSerializedSize, packedSint64_);
+      }
+      if (packedFixed32_.Count > 0) {
+        output.WritePackedFixed32Array(96, field_names[3], packedFixed32MemoizedSerializedSize, packedFixed32_);
+      }
+      if (packedFixed64_.Count > 0) {
+        output.WritePackedFixed64Array(97, field_names[4], packedFixed64MemoizedSerializedSize, packedFixed64_);
+      }
+      if (packedSfixed32_.Count > 0) {
+        output.WritePackedSFixed32Array(98, field_names[8], packedSfixed32MemoizedSerializedSize, packedSfixed32_);
+      }
+      if (packedSfixed64_.Count > 0) {
+        output.WritePackedSFixed64Array(99, field_names[9], packedSfixed64MemoizedSerializedSize, packedSfixed64_);
+      }
+      if (packedFloat_.Count > 0) {
+        output.WritePackedFloatArray(100, field_names[5], packedFloatMemoizedSerializedSize, packedFloat_);
+      }
+      if (packedDouble_.Count > 0) {
+        output.WritePackedDoubleArray(101, field_names[1], packedDoubleMemoizedSerializedSize, packedDouble_);
+      }
+      if (packedBool_.Count > 0) {
+        output.WritePackedBoolArray(102, field_names[0], packedBoolMemoizedSerializedSize, packedBool_);
+      }
+      if (packedEnum_.Count > 0) {
+        output.WritePackedEnumArray(103, field_names[2], packedEnumMemoizedSerializedSize, packedEnum_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      {
+        int dataSize = 0;
+        foreach (int element in PackedInt32List) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedInt32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedInt32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in PackedInt64List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedInt64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedInt64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (uint element in PackedUint32List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedUint32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedUint32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (ulong element in PackedUint64List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedUint64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedUint64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in PackedSint32List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedSint32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedSint32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in PackedSint64List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedSint64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedSint64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * packedFixed32_.Count;
+        size += dataSize;
+        if (packedFixed32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedFixed32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * packedFixed64_.Count;
+        size += dataSize;
+        if (packedFixed64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedFixed64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * packedSfixed32_.Count;
+        size += dataSize;
+        if (packedSfixed32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedSfixed32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * packedSfixed64_.Count;
+        size += dataSize;
+        if (packedSfixed64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedSfixed64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * packedFloat_.Count;
+        size += dataSize;
+        if (packedFloat_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedFloatMemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * packedDouble_.Count;
+        size += dataSize;
+        if (packedDouble_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedDoubleMemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 1 * packedBool_.Count;
+        size += dataSize;
+        if (packedBool_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedBoolMemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        if (packedEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignEnum element in packedEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2;
+          size += pb::CodedOutputStream.ComputeRawVarint32Size((uint) dataSize);
+        }
+        packedEnumMemoizedSerializedSize = dataSize;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestPackedTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedTypes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestPackedTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestPackedTypes MakeReadOnly() {
+      packedInt32_.MakeReadOnly();
+      packedInt64_.MakeReadOnly();
+      packedUint32_.MakeReadOnly();
+      packedUint64_.MakeReadOnly();
+      packedSint32_.MakeReadOnly();
+      packedSint64_.MakeReadOnly();
+      packedFixed32_.MakeReadOnly();
+      packedFixed64_.MakeReadOnly();
+      packedSfixed32_.MakeReadOnly();
+      packedSfixed64_.MakeReadOnly();
+      packedFloat_.MakeReadOnly();
+      packedDouble_.MakeReadOnly();
+      packedBool_.MakeReadOnly();
+      packedEnum_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestPackedTypes prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestPackedTypes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestPackedTypes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestPackedTypes result;
+
+      private TestPackedTypes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestPackedTypes original = result;
+          result = new TestPackedTypes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestPackedTypes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.Descriptor; }
+      }
+
+      public override TestPackedTypes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.DefaultInstance; }
+      }
+
+      public override TestPackedTypes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestPackedTypes) {
+          return MergeFrom((TestPackedTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestPackedTypes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.packedInt32_.Count != 0) {
+          result.packedInt32_.Add(other.packedInt32_);
+        }
+        if (other.packedInt64_.Count != 0) {
+          result.packedInt64_.Add(other.packedInt64_);
+        }
+        if (other.packedUint32_.Count != 0) {
+          result.packedUint32_.Add(other.packedUint32_);
+        }
+        if (other.packedUint64_.Count != 0) {
+          result.packedUint64_.Add(other.packedUint64_);
+        }
+        if (other.packedSint32_.Count != 0) {
+          result.packedSint32_.Add(other.packedSint32_);
+        }
+        if (other.packedSint64_.Count != 0) {
+          result.packedSint64_.Add(other.packedSint64_);
+        }
+        if (other.packedFixed32_.Count != 0) {
+          result.packedFixed32_.Add(other.packedFixed32_);
+        }
+        if (other.packedFixed64_.Count != 0) {
+          result.packedFixed64_.Add(other.packedFixed64_);
+        }
+        if (other.packedSfixed32_.Count != 0) {
+          result.packedSfixed32_.Add(other.packedSfixed32_);
+        }
+        if (other.packedSfixed64_.Count != 0) {
+          result.packedSfixed64_.Add(other.packedSfixed64_);
+        }
+        if (other.packedFloat_.Count != 0) {
+          result.packedFloat_.Add(other.packedFloat_);
+        }
+        if (other.packedDouble_.Count != 0) {
+          result.packedDouble_.Add(other.packedDouble_);
+        }
+        if (other.packedBool_.Count != 0) {
+          result.packedBool_.Add(other.packedBool_);
+        }
+        if (other.packedEnum_.Count != 0) {
+          result.packedEnum_.Add(other.packedEnum_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testPackedTypesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testPackedTypesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 722:
+            case 720: {
+              input.ReadInt32Array(tag, field_name, result.packedInt32_);
+              break;
+            }
+            case 730:
+            case 728: {
+              input.ReadInt64Array(tag, field_name, result.packedInt64_);
+              break;
+            }
+            case 738:
+            case 736: {
+              input.ReadUInt32Array(tag, field_name, result.packedUint32_);
+              break;
+            }
+            case 746:
+            case 744: {
+              input.ReadUInt64Array(tag, field_name, result.packedUint64_);
+              break;
+            }
+            case 754:
+            case 752: {
+              input.ReadSInt32Array(tag, field_name, result.packedSint32_);
+              break;
+            }
+            case 762:
+            case 760: {
+              input.ReadSInt64Array(tag, field_name, result.packedSint64_);
+              break;
+            }
+            case 770:
+            case 773: {
+              input.ReadFixed32Array(tag, field_name, result.packedFixed32_);
+              break;
+            }
+            case 778:
+            case 777: {
+              input.ReadFixed64Array(tag, field_name, result.packedFixed64_);
+              break;
+            }
+            case 786:
+            case 789: {
+              input.ReadSFixed32Array(tag, field_name, result.packedSfixed32_);
+              break;
+            }
+            case 794:
+            case 793: {
+              input.ReadSFixed64Array(tag, field_name, result.packedSfixed64_);
+              break;
+            }
+            case 802:
+            case 805: {
+              input.ReadFloatArray(tag, field_name, result.packedFloat_);
+              break;
+            }
+            case 810:
+            case 809: {
+              input.ReadDoubleArray(tag, field_name, result.packedDouble_);
+              break;
+            }
+            case 818:
+            case 816: {
+              input.ReadBoolArray(tag, field_name, result.packedBool_);
+              break;
+            }
+            case 826:
+            case 824: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>(tag, field_name, result.packedEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(103, (ulong)(int)rawValue);
+              }
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public pbc::IPopsicleList<int> PackedInt32List {
+        get { return PrepareBuilder().packedInt32_; }
+      }
+      public int PackedInt32Count {
+        get { return result.PackedInt32Count; }
+      }
+      public int GetPackedInt32(int index) {
+        return result.GetPackedInt32(index);
+      }
+      public Builder SetPackedInt32(int index, int value) {
+        PrepareBuilder();
+        result.packedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddPackedInt32(int value) {
+        PrepareBuilder();
+        result.packedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedInt32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.packedInt32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedInt32() {
+        PrepareBuilder();
+        result.packedInt32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> PackedInt64List {
+        get { return PrepareBuilder().packedInt64_; }
+      }
+      public int PackedInt64Count {
+        get { return result.PackedInt64Count; }
+      }
+      public long GetPackedInt64(int index) {
+        return result.GetPackedInt64(index);
+      }
+      public Builder SetPackedInt64(int index, long value) {
+        PrepareBuilder();
+        result.packedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddPackedInt64(long value) {
+        PrepareBuilder();
+        result.packedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedInt64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.packedInt64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedInt64() {
+        PrepareBuilder();
+        result.packedInt64_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> PackedUint32List {
+        get { return PrepareBuilder().packedUint32_; }
+      }
+      public int PackedUint32Count {
+        get { return result.PackedUint32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetPackedUint32(int index) {
+        return result.GetPackedUint32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetPackedUint32(int index, uint value) {
+        PrepareBuilder();
+        result.packedUint32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddPackedUint32(uint value) {
+        PrepareBuilder();
+        result.packedUint32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangePackedUint32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.packedUint32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedUint32() {
+        PrepareBuilder();
+        result.packedUint32_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> PackedUint64List {
+        get { return PrepareBuilder().packedUint64_; }
+      }
+      public int PackedUint64Count {
+        get { return result.PackedUint64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetPackedUint64(int index) {
+        return result.GetPackedUint64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetPackedUint64(int index, ulong value) {
+        PrepareBuilder();
+        result.packedUint64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddPackedUint64(ulong value) {
+        PrepareBuilder();
+        result.packedUint64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangePackedUint64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.packedUint64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedUint64() {
+        PrepareBuilder();
+        result.packedUint64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> PackedSint32List {
+        get { return PrepareBuilder().packedSint32_; }
+      }
+      public int PackedSint32Count {
+        get { return result.PackedSint32Count; }
+      }
+      public int GetPackedSint32(int index) {
+        return result.GetPackedSint32(index);
+      }
+      public Builder SetPackedSint32(int index, int value) {
+        PrepareBuilder();
+        result.packedSint32_[index] = value;
+        return this;
+      }
+      public Builder AddPackedSint32(int value) {
+        PrepareBuilder();
+        result.packedSint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedSint32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.packedSint32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedSint32() {
+        PrepareBuilder();
+        result.packedSint32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> PackedSint64List {
+        get { return PrepareBuilder().packedSint64_; }
+      }
+      public int PackedSint64Count {
+        get { return result.PackedSint64Count; }
+      }
+      public long GetPackedSint64(int index) {
+        return result.GetPackedSint64(index);
+      }
+      public Builder SetPackedSint64(int index, long value) {
+        PrepareBuilder();
+        result.packedSint64_[index] = value;
+        return this;
+      }
+      public Builder AddPackedSint64(long value) {
+        PrepareBuilder();
+        result.packedSint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedSint64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.packedSint64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedSint64() {
+        PrepareBuilder();
+        result.packedSint64_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> PackedFixed32List {
+        get { return PrepareBuilder().packedFixed32_; }
+      }
+      public int PackedFixed32Count {
+        get { return result.PackedFixed32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetPackedFixed32(int index) {
+        return result.GetPackedFixed32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetPackedFixed32(int index, uint value) {
+        PrepareBuilder();
+        result.packedFixed32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddPackedFixed32(uint value) {
+        PrepareBuilder();
+        result.packedFixed32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangePackedFixed32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.packedFixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedFixed32() {
+        PrepareBuilder();
+        result.packedFixed32_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> PackedFixed64List {
+        get { return PrepareBuilder().packedFixed64_; }
+      }
+      public int PackedFixed64Count {
+        get { return result.PackedFixed64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetPackedFixed64(int index) {
+        return result.GetPackedFixed64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetPackedFixed64(int index, ulong value) {
+        PrepareBuilder();
+        result.packedFixed64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddPackedFixed64(ulong value) {
+        PrepareBuilder();
+        result.packedFixed64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangePackedFixed64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.packedFixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedFixed64() {
+        PrepareBuilder();
+        result.packedFixed64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> PackedSfixed32List {
+        get { return PrepareBuilder().packedSfixed32_; }
+      }
+      public int PackedSfixed32Count {
+        get { return result.PackedSfixed32Count; }
+      }
+      public int GetPackedSfixed32(int index) {
+        return result.GetPackedSfixed32(index);
+      }
+      public Builder SetPackedSfixed32(int index, int value) {
+        PrepareBuilder();
+        result.packedSfixed32_[index] = value;
+        return this;
+      }
+      public Builder AddPackedSfixed32(int value) {
+        PrepareBuilder();
+        result.packedSfixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedSfixed32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.packedSfixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedSfixed32() {
+        PrepareBuilder();
+        result.packedSfixed32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> PackedSfixed64List {
+        get { return PrepareBuilder().packedSfixed64_; }
+      }
+      public int PackedSfixed64Count {
+        get { return result.PackedSfixed64Count; }
+      }
+      public long GetPackedSfixed64(int index) {
+        return result.GetPackedSfixed64(index);
+      }
+      public Builder SetPackedSfixed64(int index, long value) {
+        PrepareBuilder();
+        result.packedSfixed64_[index] = value;
+        return this;
+      }
+      public Builder AddPackedSfixed64(long value) {
+        PrepareBuilder();
+        result.packedSfixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedSfixed64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.packedSfixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedSfixed64() {
+        PrepareBuilder();
+        result.packedSfixed64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<float> PackedFloatList {
+        get { return PrepareBuilder().packedFloat_; }
+      }
+      public int PackedFloatCount {
+        get { return result.PackedFloatCount; }
+      }
+      public float GetPackedFloat(int index) {
+        return result.GetPackedFloat(index);
+      }
+      public Builder SetPackedFloat(int index, float value) {
+        PrepareBuilder();
+        result.packedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddPackedFloat(float value) {
+        PrepareBuilder();
+        result.packedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedFloat(scg::IEnumerable<float> values) {
+        PrepareBuilder();
+        result.packedFloat_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedFloat() {
+        PrepareBuilder();
+        result.packedFloat_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<double> PackedDoubleList {
+        get { return PrepareBuilder().packedDouble_; }
+      }
+      public int PackedDoubleCount {
+        get { return result.PackedDoubleCount; }
+      }
+      public double GetPackedDouble(int index) {
+        return result.GetPackedDouble(index);
+      }
+      public Builder SetPackedDouble(int index, double value) {
+        PrepareBuilder();
+        result.packedDouble_[index] = value;
+        return this;
+      }
+      public Builder AddPackedDouble(double value) {
+        PrepareBuilder();
+        result.packedDouble_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedDouble(scg::IEnumerable<double> values) {
+        PrepareBuilder();
+        result.packedDouble_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedDouble() {
+        PrepareBuilder();
+        result.packedDouble_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<bool> PackedBoolList {
+        get { return PrepareBuilder().packedBool_; }
+      }
+      public int PackedBoolCount {
+        get { return result.PackedBoolCount; }
+      }
+      public bool GetPackedBool(int index) {
+        return result.GetPackedBool(index);
+      }
+      public Builder SetPackedBool(int index, bool value) {
+        PrepareBuilder();
+        result.packedBool_[index] = value;
+        return this;
+      }
+      public Builder AddPackedBool(bool value) {
+        PrepareBuilder();
+        result.packedBool_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedBool(scg::IEnumerable<bool> values) {
+        PrepareBuilder();
+        result.packedBool_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedBool() {
+        PrepareBuilder();
+        result.packedBool_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> PackedEnumList {
+        get { return PrepareBuilder().packedEnum_; }
+      }
+      public int PackedEnumCount {
+        get { return result.PackedEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetPackedEnum(int index) {
+        return result.GetPackedEnum(index);
+      }
+      public Builder SetPackedEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.packedEnum_[index] = value;
+        return this;
+      }
+      public Builder AddPackedEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.packedEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {
+        PrepareBuilder();
+        result.packedEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedEnum() {
+        PrepareBuilder();
+        result.packedEnum_.Clear();
+        return this;
+      }
+    }
+    static TestPackedTypes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestUnpackedTypes : pb::GeneratedMessage<TestUnpackedTypes, TestUnpackedTypes.Builder> {
+    private TestUnpackedTypes() { }
+    private static readonly TestUnpackedTypes defaultInstance = new TestUnpackedTypes().MakeReadOnly();
+    private static readonly string[] _testUnpackedTypesFieldNames = new string[] { "unpacked_bool", "unpacked_double", "unpacked_enum", "unpacked_fixed32", "unpacked_fixed64", "unpacked_float", "unpacked_int32", "unpacked_int64", "unpacked_sfixed32", "unpacked_sfixed64", "unpacked_sint32", "unpacked_sint64", "unpacked_uint32", "unpacked_uint64" };
+    private static readonly uint[] _testUnpackedTypesFieldTags = new uint[] { 816, 809, 824, 773, 777, 805, 720, 728, 789, 793, 752, 760, 736, 744 };
+    public static TestUnpackedTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestUnpackedTypes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestUnpackedTypes ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestUnpackedTypes__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestUnpackedTypes, TestUnpackedTypes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestUnpackedTypes__FieldAccessorTable; }
+    }
+
+    public const int UnpackedInt32FieldNumber = 90;
+    private pbc::PopsicleList<int> unpackedInt32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> UnpackedInt32List {
+      get { return pbc::Lists.AsReadOnly(unpackedInt32_); }
+    }
+    public int UnpackedInt32Count {
+      get { return unpackedInt32_.Count; }
+    }
+    public int GetUnpackedInt32(int index) {
+      return unpackedInt32_[index];
+    }
+
+    public const int UnpackedInt64FieldNumber = 91;
+    private pbc::PopsicleList<long> unpackedInt64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> UnpackedInt64List {
+      get { return pbc::Lists.AsReadOnly(unpackedInt64_); }
+    }
+    public int UnpackedInt64Count {
+      get { return unpackedInt64_.Count; }
+    }
+    public long GetUnpackedInt64(int index) {
+      return unpackedInt64_[index];
+    }
+
+    public const int UnpackedUint32FieldNumber = 92;
+    private pbc::PopsicleList<uint> unpackedUint32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> UnpackedUint32List {
+      get { return pbc::Lists.AsReadOnly(unpackedUint32_); }
+    }
+    public int UnpackedUint32Count {
+      get { return unpackedUint32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetUnpackedUint32(int index) {
+      return unpackedUint32_[index];
+    }
+
+    public const int UnpackedUint64FieldNumber = 93;
+    private pbc::PopsicleList<ulong> unpackedUint64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> UnpackedUint64List {
+      get { return pbc::Lists.AsReadOnly(unpackedUint64_); }
+    }
+    public int UnpackedUint64Count {
+      get { return unpackedUint64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetUnpackedUint64(int index) {
+      return unpackedUint64_[index];
+    }
+
+    public const int UnpackedSint32FieldNumber = 94;
+    private pbc::PopsicleList<int> unpackedSint32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> UnpackedSint32List {
+      get { return pbc::Lists.AsReadOnly(unpackedSint32_); }
+    }
+    public int UnpackedSint32Count {
+      get { return unpackedSint32_.Count; }
+    }
+    public int GetUnpackedSint32(int index) {
+      return unpackedSint32_[index];
+    }
+
+    public const int UnpackedSint64FieldNumber = 95;
+    private pbc::PopsicleList<long> unpackedSint64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> UnpackedSint64List {
+      get { return pbc::Lists.AsReadOnly(unpackedSint64_); }
+    }
+    public int UnpackedSint64Count {
+      get { return unpackedSint64_.Count; }
+    }
+    public long GetUnpackedSint64(int index) {
+      return unpackedSint64_[index];
+    }
+
+    public const int UnpackedFixed32FieldNumber = 96;
+    private pbc::PopsicleList<uint> unpackedFixed32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> UnpackedFixed32List {
+      get { return pbc::Lists.AsReadOnly(unpackedFixed32_); }
+    }
+    public int UnpackedFixed32Count {
+      get { return unpackedFixed32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetUnpackedFixed32(int index) {
+      return unpackedFixed32_[index];
+    }
+
+    public const int UnpackedFixed64FieldNumber = 97;
+    private pbc::PopsicleList<ulong> unpackedFixed64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> UnpackedFixed64List {
+      get { return pbc::Lists.AsReadOnly(unpackedFixed64_); }
+    }
+    public int UnpackedFixed64Count {
+      get { return unpackedFixed64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetUnpackedFixed64(int index) {
+      return unpackedFixed64_[index];
+    }
+
+    public const int UnpackedSfixed32FieldNumber = 98;
+    private pbc::PopsicleList<int> unpackedSfixed32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> UnpackedSfixed32List {
+      get { return pbc::Lists.AsReadOnly(unpackedSfixed32_); }
+    }
+    public int UnpackedSfixed32Count {
+      get { return unpackedSfixed32_.Count; }
+    }
+    public int GetUnpackedSfixed32(int index) {
+      return unpackedSfixed32_[index];
+    }
+
+    public const int UnpackedSfixed64FieldNumber = 99;
+    private pbc::PopsicleList<long> unpackedSfixed64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> UnpackedSfixed64List {
+      get { return pbc::Lists.AsReadOnly(unpackedSfixed64_); }
+    }
+    public int UnpackedSfixed64Count {
+      get { return unpackedSfixed64_.Count; }
+    }
+    public long GetUnpackedSfixed64(int index) {
+      return unpackedSfixed64_[index];
+    }
+
+    public const int UnpackedFloatFieldNumber = 100;
+    private pbc::PopsicleList<float> unpackedFloat_ = new pbc::PopsicleList<float>();
+    public scg::IList<float> UnpackedFloatList {
+      get { return pbc::Lists.AsReadOnly(unpackedFloat_); }
+    }
+    public int UnpackedFloatCount {
+      get { return unpackedFloat_.Count; }
+    }
+    public float GetUnpackedFloat(int index) {
+      return unpackedFloat_[index];
+    }
+
+    public const int UnpackedDoubleFieldNumber = 101;
+    private pbc::PopsicleList<double> unpackedDouble_ = new pbc::PopsicleList<double>();
+    public scg::IList<double> UnpackedDoubleList {
+      get { return pbc::Lists.AsReadOnly(unpackedDouble_); }
+    }
+    public int UnpackedDoubleCount {
+      get { return unpackedDouble_.Count; }
+    }
+    public double GetUnpackedDouble(int index) {
+      return unpackedDouble_[index];
+    }
+
+    public const int UnpackedBoolFieldNumber = 102;
+    private pbc::PopsicleList<bool> unpackedBool_ = new pbc::PopsicleList<bool>();
+    public scg::IList<bool> UnpackedBoolList {
+      get { return pbc::Lists.AsReadOnly(unpackedBool_); }
+    }
+    public int UnpackedBoolCount {
+      get { return unpackedBool_.Count; }
+    }
+    public bool GetUnpackedBool(int index) {
+      return unpackedBool_[index];
+    }
+
+    public const int UnpackedEnumFieldNumber = 103;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> unpackedEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> UnpackedEnumList {
+      get { return pbc::Lists.AsReadOnly(unpackedEnum_); }
+    }
+    public int UnpackedEnumCount {
+      get { return unpackedEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetUnpackedEnum(int index) {
+      return unpackedEnum_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testUnpackedTypesFieldNames;
+      if (unpackedInt32_.Count > 0) {
+        output.WriteInt32Array(90, field_names[6], unpackedInt32_);
+      }
+      if (unpackedInt64_.Count > 0) {
+        output.WriteInt64Array(91, field_names[7], unpackedInt64_);
+      }
+      if (unpackedUint32_.Count > 0) {
+        output.WriteUInt32Array(92, field_names[12], unpackedUint32_);
+      }
+      if (unpackedUint64_.Count > 0) {
+        output.WriteUInt64Array(93, field_names[13], unpackedUint64_);
+      }
+      if (unpackedSint32_.Count > 0) {
+        output.WriteSInt32Array(94, field_names[10], unpackedSint32_);
+      }
+      if (unpackedSint64_.Count > 0) {
+        output.WriteSInt64Array(95, field_names[11], unpackedSint64_);
+      }
+      if (unpackedFixed32_.Count > 0) {
+        output.WriteFixed32Array(96, field_names[3], unpackedFixed32_);
+      }
+      if (unpackedFixed64_.Count > 0) {
+        output.WriteFixed64Array(97, field_names[4], unpackedFixed64_);
+      }
+      if (unpackedSfixed32_.Count > 0) {
+        output.WriteSFixed32Array(98, field_names[8], unpackedSfixed32_);
+      }
+      if (unpackedSfixed64_.Count > 0) {
+        output.WriteSFixed64Array(99, field_names[9], unpackedSfixed64_);
+      }
+      if (unpackedFloat_.Count > 0) {
+        output.WriteFloatArray(100, field_names[5], unpackedFloat_);
+      }
+      if (unpackedDouble_.Count > 0) {
+        output.WriteDoubleArray(101, field_names[1], unpackedDouble_);
+      }
+      if (unpackedBool_.Count > 0) {
+        output.WriteBoolArray(102, field_names[0], unpackedBool_);
+      }
+      if (unpackedEnum_.Count > 0) {
+        output.WriteEnumArray(103, field_names[2], unpackedEnum_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      {
+        int dataSize = 0;
+        foreach (int element in UnpackedInt32List) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedInt32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in UnpackedInt64List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedInt64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (uint element in UnpackedUint32List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedUint32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (ulong element in UnpackedUint64List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedUint64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in UnpackedSint32List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedSint32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in UnpackedSint64List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedSint64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * unpackedFixed32_.Count;
+        size += dataSize;
+        size += 2 * unpackedFixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * unpackedFixed64_.Count;
+        size += dataSize;
+        size += 2 * unpackedFixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * unpackedSfixed32_.Count;
+        size += dataSize;
+        size += 2 * unpackedSfixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * unpackedSfixed64_.Count;
+        size += dataSize;
+        size += 2 * unpackedSfixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * unpackedFloat_.Count;
+        size += dataSize;
+        size += 2 * unpackedFloat_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * unpackedDouble_.Count;
+        size += dataSize;
+        size += 2 * unpackedDouble_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 1 * unpackedBool_.Count;
+        size += dataSize;
+        size += 2 * unpackedBool_.Count;
+      }
+      {
+        int dataSize = 0;
+        if (unpackedEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignEnum element in unpackedEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2 * unpackedEnum_.Count;
+        }
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestUnpackedTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestUnpackedTypes MakeReadOnly() {
+      unpackedInt32_.MakeReadOnly();
+      unpackedInt64_.MakeReadOnly();
+      unpackedUint32_.MakeReadOnly();
+      unpackedUint64_.MakeReadOnly();
+      unpackedSint32_.MakeReadOnly();
+      unpackedSint64_.MakeReadOnly();
+      unpackedFixed32_.MakeReadOnly();
+      unpackedFixed64_.MakeReadOnly();
+      unpackedSfixed32_.MakeReadOnly();
+      unpackedSfixed64_.MakeReadOnly();
+      unpackedFloat_.MakeReadOnly();
+      unpackedDouble_.MakeReadOnly();
+      unpackedBool_.MakeReadOnly();
+      unpackedEnum_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestUnpackedTypes prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestUnpackedTypes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestUnpackedTypes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestUnpackedTypes result;
+
+      private TestUnpackedTypes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestUnpackedTypes original = result;
+          result = new TestUnpackedTypes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestUnpackedTypes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.Descriptor; }
+      }
+
+      public override TestUnpackedTypes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.DefaultInstance; }
+      }
+
+      public override TestUnpackedTypes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestUnpackedTypes) {
+          return MergeFrom((TestUnpackedTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestUnpackedTypes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.unpackedInt32_.Count != 0) {
+          result.unpackedInt32_.Add(other.unpackedInt32_);
+        }
+        if (other.unpackedInt64_.Count != 0) {
+          result.unpackedInt64_.Add(other.unpackedInt64_);
+        }
+        if (other.unpackedUint32_.Count != 0) {
+          result.unpackedUint32_.Add(other.unpackedUint32_);
+        }
+        if (other.unpackedUint64_.Count != 0) {
+          result.unpackedUint64_.Add(other.unpackedUint64_);
+        }
+        if (other.unpackedSint32_.Count != 0) {
+          result.unpackedSint32_.Add(other.unpackedSint32_);
+        }
+        if (other.unpackedSint64_.Count != 0) {
+          result.unpackedSint64_.Add(other.unpackedSint64_);
+        }
+        if (other.unpackedFixed32_.Count != 0) {
+          result.unpackedFixed32_.Add(other.unpackedFixed32_);
+        }
+        if (other.unpackedFixed64_.Count != 0) {
+          result.unpackedFixed64_.Add(other.unpackedFixed64_);
+        }
+        if (other.unpackedSfixed32_.Count != 0) {
+          result.unpackedSfixed32_.Add(other.unpackedSfixed32_);
+        }
+        if (other.unpackedSfixed64_.Count != 0) {
+          result.unpackedSfixed64_.Add(other.unpackedSfixed64_);
+        }
+        if (other.unpackedFloat_.Count != 0) {
+          result.unpackedFloat_.Add(other.unpackedFloat_);
+        }
+        if (other.unpackedDouble_.Count != 0) {
+          result.unpackedDouble_.Add(other.unpackedDouble_);
+        }
+        if (other.unpackedBool_.Count != 0) {
+          result.unpackedBool_.Add(other.unpackedBool_);
+        }
+        if (other.unpackedEnum_.Count != 0) {
+          result.unpackedEnum_.Add(other.unpackedEnum_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testUnpackedTypesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testUnpackedTypesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 722:
+            case 720: {
+              input.ReadInt32Array(tag, field_name, result.unpackedInt32_);
+              break;
+            }
+            case 730:
+            case 728: {
+              input.ReadInt64Array(tag, field_name, result.unpackedInt64_);
+              break;
+            }
+            case 738:
+            case 736: {
+              input.ReadUInt32Array(tag, field_name, result.unpackedUint32_);
+              break;
+            }
+            case 746:
+            case 744: {
+              input.ReadUInt64Array(tag, field_name, result.unpackedUint64_);
+              break;
+            }
+            case 754:
+            case 752: {
+              input.ReadSInt32Array(tag, field_name, result.unpackedSint32_);
+              break;
+            }
+            case 762:
+            case 760: {
+              input.ReadSInt64Array(tag, field_name, result.unpackedSint64_);
+              break;
+            }
+            case 770:
+            case 773: {
+              input.ReadFixed32Array(tag, field_name, result.unpackedFixed32_);
+              break;
+            }
+            case 778:
+            case 777: {
+              input.ReadFixed64Array(tag, field_name, result.unpackedFixed64_);
+              break;
+            }
+            case 786:
+            case 789: {
+              input.ReadSFixed32Array(tag, field_name, result.unpackedSfixed32_);
+              break;
+            }
+            case 794:
+            case 793: {
+              input.ReadSFixed64Array(tag, field_name, result.unpackedSfixed64_);
+              break;
+            }
+            case 802:
+            case 805: {
+              input.ReadFloatArray(tag, field_name, result.unpackedFloat_);
+              break;
+            }
+            case 810:
+            case 809: {
+              input.ReadDoubleArray(tag, field_name, result.unpackedDouble_);
+              break;
+            }
+            case 818:
+            case 816: {
+              input.ReadBoolArray(tag, field_name, result.unpackedBool_);
+              break;
+            }
+            case 826:
+            case 824: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>(tag, field_name, result.unpackedEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(103, (ulong)(int)rawValue);
+              }
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public pbc::IPopsicleList<int> UnpackedInt32List {
+        get { return PrepareBuilder().unpackedInt32_; }
+      }
+      public int UnpackedInt32Count {
+        get { return result.UnpackedInt32Count; }
+      }
+      public int GetUnpackedInt32(int index) {
+        return result.GetUnpackedInt32(index);
+      }
+      public Builder SetUnpackedInt32(int index, int value) {
+        PrepareBuilder();
+        result.unpackedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedInt32(int value) {
+        PrepareBuilder();
+        result.unpackedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedInt32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.unpackedInt32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedInt32() {
+        PrepareBuilder();
+        result.unpackedInt32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> UnpackedInt64List {
+        get { return PrepareBuilder().unpackedInt64_; }
+      }
+      public int UnpackedInt64Count {
+        get { return result.UnpackedInt64Count; }
+      }
+      public long GetUnpackedInt64(int index) {
+        return result.GetUnpackedInt64(index);
+      }
+      public Builder SetUnpackedInt64(int index, long value) {
+        PrepareBuilder();
+        result.unpackedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedInt64(long value) {
+        PrepareBuilder();
+        result.unpackedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedInt64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.unpackedInt64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedInt64() {
+        PrepareBuilder();
+        result.unpackedInt64_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> UnpackedUint32List {
+        get { return PrepareBuilder().unpackedUint32_; }
+      }
+      public int UnpackedUint32Count {
+        get { return result.UnpackedUint32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetUnpackedUint32(int index) {
+        return result.GetUnpackedUint32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetUnpackedUint32(int index, uint value) {
+        PrepareBuilder();
+        result.unpackedUint32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddUnpackedUint32(uint value) {
+        PrepareBuilder();
+        result.unpackedUint32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeUnpackedUint32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.unpackedUint32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedUint32() {
+        PrepareBuilder();
+        result.unpackedUint32_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> UnpackedUint64List {
+        get { return PrepareBuilder().unpackedUint64_; }
+      }
+      public int UnpackedUint64Count {
+        get { return result.UnpackedUint64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetUnpackedUint64(int index) {
+        return result.GetUnpackedUint64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetUnpackedUint64(int index, ulong value) {
+        PrepareBuilder();
+        result.unpackedUint64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddUnpackedUint64(ulong value) {
+        PrepareBuilder();
+        result.unpackedUint64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeUnpackedUint64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.unpackedUint64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedUint64() {
+        PrepareBuilder();
+        result.unpackedUint64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> UnpackedSint32List {
+        get { return PrepareBuilder().unpackedSint32_; }
+      }
+      public int UnpackedSint32Count {
+        get { return result.UnpackedSint32Count; }
+      }
+      public int GetUnpackedSint32(int index) {
+        return result.GetUnpackedSint32(index);
+      }
+      public Builder SetUnpackedSint32(int index, int value) {
+        PrepareBuilder();
+        result.unpackedSint32_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedSint32(int value) {
+        PrepareBuilder();
+        result.unpackedSint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedSint32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.unpackedSint32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedSint32() {
+        PrepareBuilder();
+        result.unpackedSint32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> UnpackedSint64List {
+        get { return PrepareBuilder().unpackedSint64_; }
+      }
+      public int UnpackedSint64Count {
+        get { return result.UnpackedSint64Count; }
+      }
+      public long GetUnpackedSint64(int index) {
+        return result.GetUnpackedSint64(index);
+      }
+      public Builder SetUnpackedSint64(int index, long value) {
+        PrepareBuilder();
+        result.unpackedSint64_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedSint64(long value) {
+        PrepareBuilder();
+        result.unpackedSint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedSint64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.unpackedSint64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedSint64() {
+        PrepareBuilder();
+        result.unpackedSint64_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> UnpackedFixed32List {
+        get { return PrepareBuilder().unpackedFixed32_; }
+      }
+      public int UnpackedFixed32Count {
+        get { return result.UnpackedFixed32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetUnpackedFixed32(int index) {
+        return result.GetUnpackedFixed32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetUnpackedFixed32(int index, uint value) {
+        PrepareBuilder();
+        result.unpackedFixed32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddUnpackedFixed32(uint value) {
+        PrepareBuilder();
+        result.unpackedFixed32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeUnpackedFixed32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.unpackedFixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedFixed32() {
+        PrepareBuilder();
+        result.unpackedFixed32_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> UnpackedFixed64List {
+        get { return PrepareBuilder().unpackedFixed64_; }
+      }
+      public int UnpackedFixed64Count {
+        get { return result.UnpackedFixed64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetUnpackedFixed64(int index) {
+        return result.GetUnpackedFixed64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetUnpackedFixed64(int index, ulong value) {
+        PrepareBuilder();
+        result.unpackedFixed64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddUnpackedFixed64(ulong value) {
+        PrepareBuilder();
+        result.unpackedFixed64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeUnpackedFixed64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.unpackedFixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedFixed64() {
+        PrepareBuilder();
+        result.unpackedFixed64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> UnpackedSfixed32List {
+        get { return PrepareBuilder().unpackedSfixed32_; }
+      }
+      public int UnpackedSfixed32Count {
+        get { return result.UnpackedSfixed32Count; }
+      }
+      public int GetUnpackedSfixed32(int index) {
+        return result.GetUnpackedSfixed32(index);
+      }
+      public Builder SetUnpackedSfixed32(int index, int value) {
+        PrepareBuilder();
+        result.unpackedSfixed32_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedSfixed32(int value) {
+        PrepareBuilder();
+        result.unpackedSfixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedSfixed32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.unpackedSfixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedSfixed32() {
+        PrepareBuilder();
+        result.unpackedSfixed32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> UnpackedSfixed64List {
+        get { return PrepareBuilder().unpackedSfixed64_; }
+      }
+      public int UnpackedSfixed64Count {
+        get { return result.UnpackedSfixed64Count; }
+      }
+      public long GetUnpackedSfixed64(int index) {
+        return result.GetUnpackedSfixed64(index);
+      }
+      public Builder SetUnpackedSfixed64(int index, long value) {
+        PrepareBuilder();
+        result.unpackedSfixed64_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedSfixed64(long value) {
+        PrepareBuilder();
+        result.unpackedSfixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedSfixed64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.unpackedSfixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedSfixed64() {
+        PrepareBuilder();
+        result.unpackedSfixed64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<float> UnpackedFloatList {
+        get { return PrepareBuilder().unpackedFloat_; }
+      }
+      public int UnpackedFloatCount {
+        get { return result.UnpackedFloatCount; }
+      }
+      public float GetUnpackedFloat(int index) {
+        return result.GetUnpackedFloat(index);
+      }
+      public Builder SetUnpackedFloat(int index, float value) {
+        PrepareBuilder();
+        result.unpackedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedFloat(float value) {
+        PrepareBuilder();
+        result.unpackedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedFloat(scg::IEnumerable<float> values) {
+        PrepareBuilder();
+        result.unpackedFloat_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedFloat() {
+        PrepareBuilder();
+        result.unpackedFloat_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<double> UnpackedDoubleList {
+        get { return PrepareBuilder().unpackedDouble_; }
+      }
+      public int UnpackedDoubleCount {
+        get { return result.UnpackedDoubleCount; }
+      }
+      public double GetUnpackedDouble(int index) {
+        return result.GetUnpackedDouble(index);
+      }
+      public Builder SetUnpackedDouble(int index, double value) {
+        PrepareBuilder();
+        result.unpackedDouble_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedDouble(double value) {
+        PrepareBuilder();
+        result.unpackedDouble_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedDouble(scg::IEnumerable<double> values) {
+        PrepareBuilder();
+        result.unpackedDouble_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedDouble() {
+        PrepareBuilder();
+        result.unpackedDouble_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<bool> UnpackedBoolList {
+        get { return PrepareBuilder().unpackedBool_; }
+      }
+      public int UnpackedBoolCount {
+        get { return result.UnpackedBoolCount; }
+      }
+      public bool GetUnpackedBool(int index) {
+        return result.GetUnpackedBool(index);
+      }
+      public Builder SetUnpackedBool(int index, bool value) {
+        PrepareBuilder();
+        result.unpackedBool_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedBool(bool value) {
+        PrepareBuilder();
+        result.unpackedBool_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedBool(scg::IEnumerable<bool> values) {
+        PrepareBuilder();
+        result.unpackedBool_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedBool() {
+        PrepareBuilder();
+        result.unpackedBool_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> UnpackedEnumList {
+        get { return PrepareBuilder().unpackedEnum_; }
+      }
+      public int UnpackedEnumCount {
+        get { return result.UnpackedEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetUnpackedEnum(int index) {
+        return result.GetUnpackedEnum(index);
+      }
+      public Builder SetUnpackedEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.unpackedEnum_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.unpackedEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {
+        PrepareBuilder();
+        result.unpackedEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedEnum() {
+        PrepareBuilder();
+        result.unpackedEnum_.Clear();
+        return this;
+      }
+    }
+    static TestUnpackedTypes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestPackedExtensions : pb::ExtendableMessage<TestPackedExtensions, TestPackedExtensions.Builder> {
+    private TestPackedExtensions() { }
+    private static readonly TestPackedExtensions defaultInstance = new TestPackedExtensions().MakeReadOnly();
+    private static readonly string[] _testPackedExtensionsFieldNames = new string[] {  };
+    private static readonly uint[] _testPackedExtensionsFieldTags = new uint[] {  };
+    public static TestPackedExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestPackedExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestPackedExtensions ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestPackedExtensions__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestPackedExtensions, TestPackedExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestPackedExtensions__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testPackedExtensionsFieldNames;
+      pb::ExtendableMessage<TestPackedExtensions, TestPackedExtensions.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;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestPackedExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestPackedExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestPackedExtensions MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestPackedExtensions prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestPackedExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestPackedExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestPackedExtensions result;
+
+      private TestPackedExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestPackedExtensions original = result;
+          result = new TestPackedExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestPackedExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.Descriptor; }
+      }
+
+      public override TestPackedExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.DefaultInstance; }
+      }
+
+      public override TestPackedExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestPackedExtensions) {
+          return MergeFrom((TestPackedExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestPackedExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testPackedExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testPackedExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static TestPackedExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestUnpackedExtensions : pb::ExtendableMessage<TestUnpackedExtensions, TestUnpackedExtensions.Builder> {
+    private TestUnpackedExtensions() { }
+    private static readonly TestUnpackedExtensions defaultInstance = new TestUnpackedExtensions().MakeReadOnly();
+    private static readonly string[] _testUnpackedExtensionsFieldNames = new string[] {  };
+    private static readonly uint[] _testUnpackedExtensionsFieldTags = new uint[] {  };
+    public static TestUnpackedExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestUnpackedExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestUnpackedExtensions ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestUnpackedExtensions__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestUnpackedExtensions, TestUnpackedExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestUnpackedExtensions__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testUnpackedExtensionsFieldNames;
+      pb::ExtendableMessage<TestUnpackedExtensions, TestUnpackedExtensions.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;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestUnpackedExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestUnpackedExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestUnpackedExtensions MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestUnpackedExtensions prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestUnpackedExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestUnpackedExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestUnpackedExtensions result;
+
+      private TestUnpackedExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestUnpackedExtensions original = result;
+          result = new TestUnpackedExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestUnpackedExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestUnpackedExtensions.Descriptor; }
+      }
+
+      public override TestUnpackedExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestUnpackedExtensions.DefaultInstance; }
+      }
+
+      public override TestUnpackedExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestUnpackedExtensions) {
+          return MergeFrom((TestUnpackedExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestUnpackedExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestUnpackedExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testUnpackedExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testUnpackedExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static TestUnpackedExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestDynamicExtensions : pb::GeneratedMessage<TestDynamicExtensions, TestDynamicExtensions.Builder> {
+    private TestDynamicExtensions() { }
+    private static readonly TestDynamicExtensions defaultInstance = new TestDynamicExtensions().MakeReadOnly();
+    private static readonly string[] _testDynamicExtensionsFieldNames = new string[] { "dynamic_enum_extension", "dynamic_message_extension", "enum_extension", "message_extension", "packed_extension", "repeated_extension", "scalar_extension" };
+    private static readonly uint[] _testDynamicExtensionsFieldTags = new uint[] { 16016, 16034, 16008, 16026, 16050, 16042, 16005 };
+    public static TestDynamicExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestDynamicExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestDynamicExtensions ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestDynamicExtensions, TestDynamicExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDynamicExtensions__FieldAccessorTable; }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum DynamicEnumType {
+        DYNAMIC_FOO = 2200,
+        DYNAMIC_BAR = 2201,
+        DYNAMIC_BAZ = 2202,
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class DynamicMessageType : pb::GeneratedMessage<DynamicMessageType, DynamicMessageType.Builder> {
+        private DynamicMessageType() { }
+        private static readonly DynamicMessageType defaultInstance = new DynamicMessageType().MakeReadOnly();
+        private static readonly string[] _dynamicMessageTypeFieldNames = new string[] { "dynamic_field" };
+        private static readonly uint[] _dynamicMessageTypeFieldTags = new uint[] { 16800 };
+        public static DynamicMessageType DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override DynamicMessageType DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override DynamicMessageType ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<DynamicMessageType, DynamicMessageType.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__FieldAccessorTable; }
+        }
+
+        public const int DynamicFieldFieldNumber = 2100;
+        private bool hasDynamicField;
+        private int dynamicField_;
+        public bool HasDynamicField {
+          get { return hasDynamicField; }
+        }
+        public int DynamicField {
+          get { return dynamicField_; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _dynamicMessageTypeFieldNames;
+          if (hasDynamicField) {
+            output.WriteInt32(2100, field_names[0], DynamicField);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasDynamicField) {
+            size += pb::CodedOutputStream.ComputeInt32Size(2100, DynamicField);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static DynamicMessageType ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static DynamicMessageType ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static DynamicMessageType ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private DynamicMessageType MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(DynamicMessageType prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<DynamicMessageType, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(DynamicMessageType cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private DynamicMessageType result;
+
+          private DynamicMessageType PrepareBuilder() {
+            if (resultIsReadOnly) {
+              DynamicMessageType original = result;
+              result = new DynamicMessageType();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override DynamicMessageType MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Descriptor; }
+          }
+
+          public override DynamicMessageType DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance; }
+          }
+
+          public override DynamicMessageType BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is DynamicMessageType) {
+              return MergeFrom((DynamicMessageType) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(DynamicMessageType other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasDynamicField) {
+              DynamicField = other.DynamicField;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_dynamicMessageTypeFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _dynamicMessageTypeFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 16800: {
+                  result.hasDynamicField = input.ReadInt32(ref result.dynamicField_);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasDynamicField {
+            get { return result.hasDynamicField; }
+          }
+          public int DynamicField {
+            get { return result.DynamicField; }
+            set { SetDynamicField(value); }
+          }
+          public Builder SetDynamicField(int value) {
+            PrepareBuilder();
+            result.hasDynamicField = true;
+            result.dynamicField_ = value;
+            return this;
+          }
+          public Builder ClearDynamicField() {
+            PrepareBuilder();
+            result.hasDynamicField = false;
+            result.dynamicField_ = 0;
+            return this;
+          }
+        }
+        static DynamicMessageType() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int ScalarExtensionFieldNumber = 2000;
+    private bool hasScalarExtension;
+    private uint scalarExtension_;
+    public bool HasScalarExtension {
+      get { return hasScalarExtension; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint ScalarExtension {
+      get { return scalarExtension_; }
+    }
+
+    public const int EnumExtensionFieldNumber = 2001;
+    private bool hasEnumExtension;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignEnum enumExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+    public bool HasEnumExtension {
+      get { return hasEnumExtension; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum EnumExtension {
+      get { return enumExtension_; }
+    }
+
+    public const int DynamicEnumExtensionFieldNumber = 2002;
+    private bool hasDynamicEnumExtension;
+    private global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType dynamicEnumExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType.DYNAMIC_FOO;
+    public bool HasDynamicEnumExtension {
+      get { return hasDynamicEnumExtension; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType DynamicEnumExtension {
+      get { return dynamicEnumExtension_; }
+    }
+
+    public const int MessageExtensionFieldNumber = 2003;
+    private bool hasMessageExtension;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage messageExtension_;
+    public bool HasMessageExtension {
+      get { return hasMessageExtension; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageExtension {
+      get { return messageExtension_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }
+    }
+
+    public const int DynamicMessageExtensionFieldNumber = 2004;
+    private bool hasDynamicMessageExtension;
+    private global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType dynamicMessageExtension_;
+    public bool HasDynamicMessageExtension {
+      get { return hasDynamicMessageExtension; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType DynamicMessageExtension {
+      get { return dynamicMessageExtension_ ?? global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance; }
+    }
+
+    public const int RepeatedExtensionFieldNumber = 2005;
+    private pbc::PopsicleList<string> repeatedExtension_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedExtensionList {
+      get { return pbc::Lists.AsReadOnly(repeatedExtension_); }
+    }
+    public int RepeatedExtensionCount {
+      get { return repeatedExtension_.Count; }
+    }
+    public string GetRepeatedExtension(int index) {
+      return repeatedExtension_[index];
+    }
+
+    public const int PackedExtensionFieldNumber = 2006;
+    private int packedExtensionMemoizedSerializedSize;
+    private pbc::PopsicleList<int> packedExtension_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> PackedExtensionList {
+      get { return pbc::Lists.AsReadOnly(packedExtension_); }
+    }
+    public int PackedExtensionCount {
+      get { return packedExtension_.Count; }
+    }
+    public int GetPackedExtension(int index) {
+      return packedExtension_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testDynamicExtensionsFieldNames;
+      if (hasScalarExtension) {
+        output.WriteFixed32(2000, field_names[6], ScalarExtension);
+      }
+      if (hasEnumExtension) {
+        output.WriteEnum(2001, field_names[2], (int) EnumExtension, EnumExtension);
+      }
+      if (hasDynamicEnumExtension) {
+        output.WriteEnum(2002, field_names[0], (int) DynamicEnumExtension, DynamicEnumExtension);
+      }
+      if (hasMessageExtension) {
+        output.WriteMessage(2003, field_names[3], MessageExtension);
+      }
+      if (hasDynamicMessageExtension) {
+        output.WriteMessage(2004, field_names[1], DynamicMessageExtension);
+      }
+      if (repeatedExtension_.Count > 0) {
+        output.WriteStringArray(2005, field_names[5], repeatedExtension_);
+      }
+      if (packedExtension_.Count > 0) {
+        output.WritePackedSInt32Array(2006, field_names[4], packedExtensionMemoizedSerializedSize, packedExtension_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasScalarExtension) {
+        size += pb::CodedOutputStream.ComputeFixed32Size(2000, ScalarExtension);
+      }
+      if (hasEnumExtension) {
+        size += pb::CodedOutputStream.ComputeEnumSize(2001, (int) EnumExtension);
+      }
+      if (hasDynamicEnumExtension) {
+        size += pb::CodedOutputStream.ComputeEnumSize(2002, (int) DynamicEnumExtension);
+      }
+      if (hasMessageExtension) {
+        size += pb::CodedOutputStream.ComputeMessageSize(2003, MessageExtension);
+      }
+      if (hasDynamicMessageExtension) {
+        size += pb::CodedOutputStream.ComputeMessageSize(2004, DynamicMessageExtension);
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedExtensionList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedExtension_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in PackedExtensionList) {
+          dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedExtension_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedExtensionMemoizedSerializedSize = dataSize;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestDynamicExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestDynamicExtensions MakeReadOnly() {
+      repeatedExtension_.MakeReadOnly();
+      packedExtension_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestDynamicExtensions prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestDynamicExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestDynamicExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestDynamicExtensions result;
+
+      private TestDynamicExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestDynamicExtensions original = result;
+          result = new TestDynamicExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestDynamicExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Descriptor; }
+      }
+
+      public override TestDynamicExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.DefaultInstance; }
+      }
+
+      public override TestDynamicExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestDynamicExtensions) {
+          return MergeFrom((TestDynamicExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestDynamicExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasScalarExtension) {
+          ScalarExtension = other.ScalarExtension;
+        }
+        if (other.HasEnumExtension) {
+          EnumExtension = other.EnumExtension;
+        }
+        if (other.HasDynamicEnumExtension) {
+          DynamicEnumExtension = other.DynamicEnumExtension;
+        }
+        if (other.HasMessageExtension) {
+          MergeMessageExtension(other.MessageExtension);
+        }
+        if (other.HasDynamicMessageExtension) {
+          MergeDynamicMessageExtension(other.DynamicMessageExtension);
+        }
+        if (other.repeatedExtension_.Count != 0) {
+          result.repeatedExtension_.Add(other.repeatedExtension_);
+        }
+        if (other.packedExtension_.Count != 0) {
+          result.packedExtension_.Add(other.packedExtension_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testDynamicExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testDynamicExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 16005: {
+              result.hasScalarExtension = input.ReadFixed32(ref result.scalarExtension_);
+              break;
+            }
+            case 16008: {
+              object unknown;
+              if(input.ReadEnum(ref result.enumExtension_, out unknown)) {
+                result.hasEnumExtension = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(2001, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 16016: {
+              object unknown;
+              if(input.ReadEnum(ref result.dynamicEnumExtension_, out unknown)) {
+                result.hasDynamicEnumExtension = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(2002, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 16026: {
+              global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder();
+              if (result.hasMessageExtension) {
+                subBuilder.MergeFrom(MessageExtension);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              MessageExtension = subBuilder.BuildPartial();
+              break;
+            }
+            case 16034: {
+              global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.CreateBuilder();
+              if (result.hasDynamicMessageExtension) {
+                subBuilder.MergeFrom(DynamicMessageExtension);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              DynamicMessageExtension = subBuilder.BuildPartial();
+              break;
+            }
+            case 16042: {
+              input.ReadStringArray(tag, field_name, result.repeatedExtension_);
+              break;
+            }
+            case 16050:
+            case 16048: {
+              input.ReadSInt32Array(tag, field_name, result.packedExtension_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasScalarExtension {
+        get { return result.hasScalarExtension; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint ScalarExtension {
+        get { return result.ScalarExtension; }
+        set { SetScalarExtension(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetScalarExtension(uint value) {
+        PrepareBuilder();
+        result.hasScalarExtension = true;
+        result.scalarExtension_ = value;
+        return this;
+      }
+      public Builder ClearScalarExtension() {
+        PrepareBuilder();
+        result.hasScalarExtension = false;
+        result.scalarExtension_ = 0;
+        return this;
+      }
+
+      public bool HasEnumExtension {
+       get { return result.hasEnumExtension; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum EnumExtension {
+        get { return result.EnumExtension; }
+        set { SetEnumExtension(value); }
+      }
+      public Builder SetEnumExtension(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.hasEnumExtension = true;
+        result.enumExtension_ = value;
+        return this;
+      }
+      public Builder ClearEnumExtension() {
+        PrepareBuilder();
+        result.hasEnumExtension = false;
+        result.enumExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+
+      public bool HasDynamicEnumExtension {
+       get { return result.hasDynamicEnumExtension; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType DynamicEnumExtension {
+        get { return result.DynamicEnumExtension; }
+        set { SetDynamicEnumExtension(value); }
+      }
+      public Builder SetDynamicEnumExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType value) {
+        PrepareBuilder();
+        result.hasDynamicEnumExtension = true;
+        result.dynamicEnumExtension_ = value;
+        return this;
+      }
+      public Builder ClearDynamicEnumExtension() {
+        PrepareBuilder();
+        result.hasDynamicEnumExtension = false;
+        result.dynamicEnumExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType.DYNAMIC_FOO;
+        return this;
+      }
+
+      public bool HasMessageExtension {
+       get { return result.hasMessageExtension; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageExtension {
+        get { return result.MessageExtension; }
+        set { SetMessageExtension(value); }
+      }
+      public Builder SetMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasMessageExtension = true;
+        result.messageExtension_ = value;
+        return this;
+      }
+      public Builder SetMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasMessageExtension = true;
+        result.messageExtension_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasMessageExtension &&
+            result.messageExtension_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {
+            result.messageExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.messageExtension_).MergeFrom(value).BuildPartial();
+        } else {
+          result.messageExtension_ = value;
+        }
+        result.hasMessageExtension = true;
+        return this;
+      }
+      public Builder ClearMessageExtension() {
+        PrepareBuilder();
+        result.hasMessageExtension = false;
+        result.messageExtension_ = null;
+        return this;
+      }
+
+      public bool HasDynamicMessageExtension {
+       get { return result.hasDynamicMessageExtension; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType DynamicMessageExtension {
+        get { return result.DynamicMessageExtension; }
+        set { SetDynamicMessageExtension(value); }
+      }
+      public Builder SetDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDynamicMessageExtension = true;
+        result.dynamicMessageExtension_ = value;
+        return this;
+      }
+      public Builder SetDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasDynamicMessageExtension = true;
+        result.dynamicMessageExtension_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasDynamicMessageExtension &&
+            result.dynamicMessageExtension_ != global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance) {
+            result.dynamicMessageExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.CreateBuilder(result.dynamicMessageExtension_).MergeFrom(value).BuildPartial();
+        } else {
+          result.dynamicMessageExtension_ = value;
+        }
+        result.hasDynamicMessageExtension = true;
+        return this;
+      }
+      public Builder ClearDynamicMessageExtension() {
+        PrepareBuilder();
+        result.hasDynamicMessageExtension = false;
+        result.dynamicMessageExtension_ = null;
+        return this;
+      }
+
+      public pbc::IPopsicleList<string> RepeatedExtensionList {
+        get { return PrepareBuilder().repeatedExtension_; }
+      }
+      public int RepeatedExtensionCount {
+        get { return result.RepeatedExtensionCount; }
+      }
+      public string GetRepeatedExtension(int index) {
+        return result.GetRepeatedExtension(index);
+      }
+      public Builder SetRepeatedExtension(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedExtension_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedExtension(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedExtension_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedExtension(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedExtension_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedExtension() {
+        PrepareBuilder();
+        result.repeatedExtension_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> PackedExtensionList {
+        get { return PrepareBuilder().packedExtension_; }
+      }
+      public int PackedExtensionCount {
+        get { return result.PackedExtensionCount; }
+      }
+      public int GetPackedExtension(int index) {
+        return result.GetPackedExtension(index);
+      }
+      public Builder SetPackedExtension(int index, int value) {
+        PrepareBuilder();
+        result.packedExtension_[index] = value;
+        return this;
+      }
+      public Builder AddPackedExtension(int value) {
+        PrepareBuilder();
+        result.packedExtension_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedExtension(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.packedExtension_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedExtension() {
+        PrepareBuilder();
+        result.packedExtension_.Clear();
+        return this;
+      }
+    }
+    static TestDynamicExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRepeatedScalarDifferentTagSizes : pb::GeneratedMessage<TestRepeatedScalarDifferentTagSizes, TestRepeatedScalarDifferentTagSizes.Builder> {
+    private TestRepeatedScalarDifferentTagSizes() { }
+    private static readonly TestRepeatedScalarDifferentTagSizes defaultInstance = new TestRepeatedScalarDifferentTagSizes().MakeReadOnly();
+    private static readonly string[] _testRepeatedScalarDifferentTagSizesFieldNames = new string[] { "repeated_fixed32", "repeated_fixed64", "repeated_float", "repeated_int32", "repeated_int64", "repeated_uint64" };
+    private static readonly uint[] _testRepeatedScalarDifferentTagSizesFieldTags = new uint[] { 101, 16369, 2097141, 104, 16376, 2097144 };
+    public static TestRepeatedScalarDifferentTagSizes DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestRepeatedScalarDifferentTagSizes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestRepeatedScalarDifferentTagSizes ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestRepeatedScalarDifferentTagSizes, TestRepeatedScalarDifferentTagSizes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__FieldAccessorTable; }
+    }
+
+    public const int RepeatedFixed32FieldNumber = 12;
+    private pbc::PopsicleList<uint> repeatedFixed32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> RepeatedFixed32List {
+      get { return pbc::Lists.AsReadOnly(repeatedFixed32_); }
+    }
+    public int RepeatedFixed32Count {
+      get { return repeatedFixed32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetRepeatedFixed32(int index) {
+      return repeatedFixed32_[index];
+    }
+
+    public const int RepeatedInt32FieldNumber = 13;
+    private pbc::PopsicleList<int> repeatedInt32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedInt32List {
+      get { return pbc::Lists.AsReadOnly(repeatedInt32_); }
+    }
+    public int RepeatedInt32Count {
+      get { return repeatedInt32_.Count; }
+    }
+    public int GetRepeatedInt32(int index) {
+      return repeatedInt32_[index];
+    }
+
+    public const int RepeatedFixed64FieldNumber = 2046;
+    private pbc::PopsicleList<ulong> repeatedFixed64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> RepeatedFixed64List {
+      get { return pbc::Lists.AsReadOnly(repeatedFixed64_); }
+    }
+    public int RepeatedFixed64Count {
+      get { return repeatedFixed64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetRepeatedFixed64(int index) {
+      return repeatedFixed64_[index];
+    }
+
+    public const int RepeatedInt64FieldNumber = 2047;
+    private pbc::PopsicleList<long> repeatedInt64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> RepeatedInt64List {
+      get { return pbc::Lists.AsReadOnly(repeatedInt64_); }
+    }
+    public int RepeatedInt64Count {
+      get { return repeatedInt64_.Count; }
+    }
+    public long GetRepeatedInt64(int index) {
+      return repeatedInt64_[index];
+    }
+
+    public const int RepeatedFloatFieldNumber = 262142;
+    private pbc::PopsicleList<float> repeatedFloat_ = new pbc::PopsicleList<float>();
+    public scg::IList<float> RepeatedFloatList {
+      get { return pbc::Lists.AsReadOnly(repeatedFloat_); }
+    }
+    public int RepeatedFloatCount {
+      get { return repeatedFloat_.Count; }
+    }
+    public float GetRepeatedFloat(int index) {
+      return repeatedFloat_[index];
+    }
+
+    public const int RepeatedUint64FieldNumber = 262143;
+    private pbc::PopsicleList<ulong> repeatedUint64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> RepeatedUint64List {
+      get { return pbc::Lists.AsReadOnly(repeatedUint64_); }
+    }
+    public int RepeatedUint64Count {
+      get { return repeatedUint64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetRepeatedUint64(int index) {
+      return repeatedUint64_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRepeatedScalarDifferentTagSizesFieldNames;
+      if (repeatedFixed32_.Count > 0) {
+        output.WriteFixed32Array(12, field_names[0], repeatedFixed32_);
+      }
+      if (repeatedInt32_.Count > 0) {
+        output.WriteInt32Array(13, field_names[3], repeatedInt32_);
+      }
+      if (repeatedFixed64_.Count > 0) {
+        output.WriteFixed64Array(2046, field_names[1], repeatedFixed64_);
+      }
+      if (repeatedInt64_.Count > 0) {
+        output.WriteInt64Array(2047, field_names[4], repeatedInt64_);
+      }
+      if (repeatedFloat_.Count > 0) {
+        output.WriteFloatArray(262142, field_names[2], repeatedFloat_);
+      }
+      if (repeatedUint64_.Count > 0) {
+        output.WriteUInt64Array(262143, field_names[5], repeatedUint64_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedFixed32_.Count;
+        size += dataSize;
+        size += 1 * repeatedFixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in RepeatedInt32List) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedInt32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * repeatedFixed64_.Count;
+        size += dataSize;
+        size += 2 * repeatedFixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in RepeatedInt64List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedInt64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedFloat_.Count;
+        size += dataSize;
+        size += 3 * repeatedFloat_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (ulong element in RepeatedUint64List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 3 * repeatedUint64_.Count;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRepeatedScalarDifferentTagSizes MakeReadOnly() {
+      repeatedFixed32_.MakeReadOnly();
+      repeatedInt32_.MakeReadOnly();
+      repeatedFixed64_.MakeReadOnly();
+      repeatedInt64_.MakeReadOnly();
+      repeatedFloat_.MakeReadOnly();
+      repeatedUint64_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRepeatedScalarDifferentTagSizes prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRepeatedScalarDifferentTagSizes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRepeatedScalarDifferentTagSizes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestRepeatedScalarDifferentTagSizes result;
+
+      private TestRepeatedScalarDifferentTagSizes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRepeatedScalarDifferentTagSizes original = result;
+          result = new TestRepeatedScalarDifferentTagSizes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestRepeatedScalarDifferentTagSizes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.Descriptor; }
+      }
+
+      public override TestRepeatedScalarDifferentTagSizes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.DefaultInstance; }
+      }
+
+      public override TestRepeatedScalarDifferentTagSizes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRepeatedScalarDifferentTagSizes) {
+          return MergeFrom((TestRepeatedScalarDifferentTagSizes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestRepeatedScalarDifferentTagSizes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.repeatedFixed32_.Count != 0) {
+          result.repeatedFixed32_.Add(other.repeatedFixed32_);
+        }
+        if (other.repeatedInt32_.Count != 0) {
+          result.repeatedInt32_.Add(other.repeatedInt32_);
+        }
+        if (other.repeatedFixed64_.Count != 0) {
+          result.repeatedFixed64_.Add(other.repeatedFixed64_);
+        }
+        if (other.repeatedInt64_.Count != 0) {
+          result.repeatedInt64_.Add(other.repeatedInt64_);
+        }
+        if (other.repeatedFloat_.Count != 0) {
+          result.repeatedFloat_.Add(other.repeatedFloat_);
+        }
+        if (other.repeatedUint64_.Count != 0) {
+          result.repeatedUint64_.Add(other.repeatedUint64_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRepeatedScalarDifferentTagSizesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRepeatedScalarDifferentTagSizesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 98:
+            case 101: {
+              input.ReadFixed32Array(tag, field_name, result.repeatedFixed32_);
+              break;
+            }
+            case 106:
+            case 104: {
+              input.ReadInt32Array(tag, field_name, result.repeatedInt32_);
+              break;
+            }
+            case 16370:
+            case 16369: {
+              input.ReadFixed64Array(tag, field_name, result.repeatedFixed64_);
+              break;
+            }
+            case 16378:
+            case 16376: {
+              input.ReadInt64Array(tag, field_name, result.repeatedInt64_);
+              break;
+            }
+            case 2097138:
+            case 2097141: {
+              input.ReadFloatArray(tag, field_name, result.repeatedFloat_);
+              break;
+            }
+            case 2097146:
+            case 2097144: {
+              input.ReadUInt64Array(tag, field_name, result.repeatedUint64_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> RepeatedFixed32List {
+        get { return PrepareBuilder().repeatedFixed32_; }
+      }
+      public int RepeatedFixed32Count {
+        get { return result.RepeatedFixed32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetRepeatedFixed32(int index) {
+        return result.GetRepeatedFixed32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedFixed32(int index, uint value) {
+        PrepareBuilder();
+        result.repeatedFixed32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedFixed32(uint value) {
+        PrepareBuilder();
+        result.repeatedFixed32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedFixed32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.repeatedFixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFixed32() {
+        PrepareBuilder();
+        result.repeatedFixed32_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<int> RepeatedInt32List {
+        get { return PrepareBuilder().repeatedInt32_; }
+      }
+      public int RepeatedInt32Count {
+        get { return result.RepeatedInt32Count; }
+      }
+      public int GetRepeatedInt32(int index) {
+        return result.GetRepeatedInt32(index);
+      }
+      public Builder SetRepeatedInt32(int index, int value) {
+        PrepareBuilder();
+        result.repeatedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt32(int value) {
+        PrepareBuilder();
+        result.repeatedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedInt32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedInt32() {
+        PrepareBuilder();
+        result.repeatedInt32_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> RepeatedFixed64List {
+        get { return PrepareBuilder().repeatedFixed64_; }
+      }
+      public int RepeatedFixed64Count {
+        get { return result.RepeatedFixed64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetRepeatedFixed64(int index) {
+        return result.GetRepeatedFixed64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedFixed64(int index, ulong value) {
+        PrepareBuilder();
+        result.repeatedFixed64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedFixed64(ulong value) {
+        PrepareBuilder();
+        result.repeatedFixed64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedFixed64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.repeatedFixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFixed64() {
+        PrepareBuilder();
+        result.repeatedFixed64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<long> RepeatedInt64List {
+        get { return PrepareBuilder().repeatedInt64_; }
+      }
+      public int RepeatedInt64Count {
+        get { return result.RepeatedInt64Count; }
+      }
+      public long GetRepeatedInt64(int index) {
+        return result.GetRepeatedInt64(index);
+      }
+      public Builder SetRepeatedInt64(int index, long value) {
+        PrepareBuilder();
+        result.repeatedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt64(long value) {
+        PrepareBuilder();
+        result.repeatedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.repeatedInt64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedInt64() {
+        PrepareBuilder();
+        result.repeatedInt64_.Clear();
+        return this;
+      }
+
+      public pbc::IPopsicleList<float> RepeatedFloatList {
+        get { return PrepareBuilder().repeatedFloat_; }
+      }
+      public int RepeatedFloatCount {
+        get { return result.RepeatedFloatCount; }
+      }
+      public float GetRepeatedFloat(int index) {
+        return result.GetRepeatedFloat(index);
+      }
+      public Builder SetRepeatedFloat(int index, float value) {
+        PrepareBuilder();
+        result.repeatedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFloat(float value) {
+        PrepareBuilder();
+        result.repeatedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFloat(scg::IEnumerable<float> values) {
+        PrepareBuilder();
+        result.repeatedFloat_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFloat() {
+        PrepareBuilder();
+        result.repeatedFloat_.Clear();
+        return this;
+      }
+
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> RepeatedUint64List {
+        get { return PrepareBuilder().repeatedUint64_; }
+      }
+      public int RepeatedUint64Count {
+        get { return result.RepeatedUint64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetRepeatedUint64(int index) {
+        return result.GetRepeatedUint64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedUint64(int index, ulong value) {
+        PrepareBuilder();
+        result.repeatedUint64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedUint64(ulong value) {
+        PrepareBuilder();
+        result.repeatedUint64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedUint64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.repeatedUint64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedUint64() {
+        PrepareBuilder();
+        result.repeatedUint64_.Clear();
+        return this;
+      }
+    }
+    static TestRepeatedScalarDifferentTagSizes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestParsingMerge : pb::ExtendableMessage<TestParsingMerge, TestParsingMerge.Builder> {
+    private TestParsingMerge() { }
+    private static readonly TestParsingMerge defaultInstance = new TestParsingMerge().MakeReadOnly();
+    private static readonly string[] _testParsingMergeFieldNames = new string[] { "optional_all_types", "optionalgroup", "repeated_all_types", "repeatedgroup", "required_all_types" };
+    private static readonly uint[] _testParsingMergeFieldTags = new uint[] { 18, 83, 26, 163, 10 };
+    public static TestParsingMerge DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestParsingMerge DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestParsingMerge ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestParsingMerge, TestParsingMerge.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge__FieldAccessorTable; }
+    }
+
+    public const int OptionalExtFieldNumber = 1000;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> OptionalExt;
+    public const int RepeatedExtFieldNumber = 1001;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>> RepeatedExt;
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class RepeatedFieldsGenerator : pb::GeneratedMessage<RepeatedFieldsGenerator, RepeatedFieldsGenerator.Builder> {
+        private RepeatedFieldsGenerator() { }
+        private static readonly RepeatedFieldsGenerator defaultInstance = new RepeatedFieldsGenerator().MakeReadOnly();
+        private static readonly string[] _repeatedFieldsGeneratorFieldNames = new string[] { "ext1", "ext2", "field1", "field2", "field3", "group1", "group2" };
+        private static readonly uint[] _repeatedFieldsGeneratorFieldTags = new uint[] { 8002, 8010, 10, 18, 26, 83, 163 };
+        public static RepeatedFieldsGenerator DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override RepeatedFieldsGenerator DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override RepeatedFieldsGenerator ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<RepeatedFieldsGenerator, RepeatedFieldsGenerator.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator__FieldAccessorTable; }
+        }
+
+        #region Nested types
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public static partial class Types {
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class Group1 : pb::GeneratedMessage<Group1, Group1.Builder> {
+            private Group1() { }
+            private static readonly Group1 defaultInstance = new Group1().MakeReadOnly();
+            private static readonly string[] _group1FieldNames = new string[] { "field1" };
+            private static readonly uint[] _group1FieldTags = new uint[] { 90 };
+            public static Group1 DefaultInstance {
+              get { return defaultInstance; }
+            }
+
+            public override Group1 DefaultInstanceForType {
+              get { return DefaultInstance; }
+            }
+
+            protected override Group1 ThisMessage {
+              get { return this; }
+            }
+
+            public static pbd::MessageDescriptor Descriptor {
+              get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group1__Descriptor; }
+            }
+
+            protected override pb::FieldAccess.FieldAccessorTable<Group1, Group1.Builder> InternalFieldAccessors {
+              get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group1__FieldAccessorTable; }
+            }
+
+            public const int Field1FieldNumber = 11;
+            private bool hasField1;
+            private global::Google.ProtocolBuffers.TestProtos.TestAllTypes field1_;
+            public bool HasField1 {
+              get { return hasField1; }
+            }
+            public global::Google.ProtocolBuffers.TestProtos.TestAllTypes Field1 {
+              get { return field1_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+            }
+
+            public override bool IsInitialized {
+              get {
+                return true;
+              }
+            }
+
+            public override void WriteTo(pb::ICodedOutputStream output) {
+              CalcSerializedSize();
+              string[] field_names = _group1FieldNames;
+              if (hasField1) {
+                output.WriteMessage(11, field_names[0], Field1);
+              }
+              UnknownFields.WriteTo(output);
+            }
+
+            private int memoizedSerializedSize = -1;
+            public override int SerializedSize {
+              get {
+                int size = memoizedSerializedSize;
+                if (size != -1) return size;
+                return CalcSerializedSize();
+              }
+            }
+
+            private int CalcSerializedSize() {
+              int size = memoizedSerializedSize;
+              if (size != -1) return size;
+
+              size = 0;
+              if (hasField1) {
+                size += pb::CodedOutputStream.ComputeMessageSize(11, Field1);
+              }
+              size += UnknownFields.SerializedSize;
+              memoizedSerializedSize = size;
+              return size;
+            }
+            public static Group1 ParseFrom(pb::ByteString data) {
+              return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+            }
+            public static Group1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+              return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+            }
+            public static Group1 ParseFrom(byte[] data) {
+              return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+            }
+            public static Group1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+              return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+            }
+            public static Group1 ParseFrom(global::System.IO.Stream input) {
+              return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+            }
+            public static Group1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+              return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+            }
+            public static Group1 ParseDelimitedFrom(global::System.IO.Stream input) {
+              return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+            }
+            public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+              return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+            }
+            public static Group1 ParseFrom(pb::ICodedInputStream input) {
+              return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+            }
+            public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+              return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+            }
+            private Group1 MakeReadOnly() {
+              return this;
+            }
+
+            public static Builder CreateBuilder() { return new Builder(); }
+            public override Builder ToBuilder() { return CreateBuilder(this); }
+            public override Builder CreateBuilderForType() { return new Builder(); }
+            public static Builder CreateBuilder(Group1 prototype) {
+              return new Builder(prototype);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            public sealed partial class Builder : pb::GeneratedBuilder<Group1, Builder> {
+              protected override Builder ThisBuilder {
+                get { return this; }
+              }
+              public Builder() {
+                result = DefaultInstance;
+                resultIsReadOnly = true;
+              }
+              internal Builder(Group1 cloneFrom) {
+                result = cloneFrom;
+                resultIsReadOnly = true;
+              }
+
+              private bool resultIsReadOnly;
+              private Group1 result;
+
+              private Group1 PrepareBuilder() {
+                if (resultIsReadOnly) {
+                  Group1 original = result;
+                  result = new Group1();
+                  resultIsReadOnly = false;
+                  MergeFrom(original);
+                }
+                return result;
+              }
+
+              public override bool IsInitialized {
+                get { return result.IsInitialized; }
+              }
+
+              protected override Group1 MessageBeingBuilt {
+                get { return PrepareBuilder(); }
+              }
+
+              public override Builder Clear() {
+                result = DefaultInstance;
+                resultIsReadOnly = true;
+                return this;
+              }
+
+              public override Builder Clone() {
+                if (resultIsReadOnly) {
+                  return new Builder(result);
+                } else {
+                  return new Builder().MergeFrom(result);
+                }
+              }
+
+              public override pbd::MessageDescriptor DescriptorForType {
+                get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1.Descriptor; }
+              }
+
+              public override Group1 DefaultInstanceForType {
+                get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1.DefaultInstance; }
+              }
+
+              public override Group1 BuildPartial() {
+                if (resultIsReadOnly) {
+                  return result;
+                }
+                resultIsReadOnly = true;
+                return result.MakeReadOnly();
+              }
+
+              public override Builder MergeFrom(pb::IMessage other) {
+                if (other is Group1) {
+                  return MergeFrom((Group1) other);
+                } else {
+                  base.MergeFrom(other);
+                  return this;
+                }
+              }
+
+              public override Builder MergeFrom(Group1 other) {
+                if (other == global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1.DefaultInstance) return this;
+                PrepareBuilder();
+                if (other.HasField1) {
+                  MergeField1(other.Field1);
+                }
+                this.MergeUnknownFields(other.UnknownFields);
+                return this;
+              }
+
+              public override Builder MergeFrom(pb::ICodedInputStream input) {
+                return MergeFrom(input, pb::ExtensionRegistry.Empty);
+              }
+
+              public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+                PrepareBuilder();
+                pb::UnknownFieldSet.Builder unknownFields = null;
+                uint tag;
+                string field_name;
+                while (input.ReadTag(out tag, out field_name)) {
+                  if(tag == 0 && field_name != null) {
+                    int field_ordinal = global::System.Array.BinarySearch(_group1FieldNames, field_name, global::System.StringComparer.Ordinal);
+                    if(field_ordinal >= 0)
+                      tag = _group1FieldTags[field_ordinal];
+                    else {
+                      if (unknownFields == null) {
+                        unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                      }
+                      ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                      continue;
+                    }
+                  }
+                  switch (tag) {
+                    case 0: {
+                      throw pb::InvalidProtocolBufferException.InvalidTag();
+                    }
+                    default: {
+                      if (pb::WireFormat.IsEndGroupTag(tag)) {
+                        if (unknownFields != null) {
+                          this.UnknownFields = unknownFields.Build();
+                        }
+                        return this;
+                      }
+                      if (unknownFields == null) {
+                        unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                      }
+                      ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                      break;
+                    }
+                    case 90: {
+                      global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+                      if (result.hasField1) {
+                        subBuilder.MergeFrom(Field1);
+                      }
+                      input.ReadMessage(subBuilder, extensionRegistry);
+                      Field1 = subBuilder.BuildPartial();
+                      break;
+                    }
+                  }
+                }
+
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+
+
+              public bool HasField1 {
+               get { return result.hasField1; }
+              }
+              public global::Google.ProtocolBuffers.TestProtos.TestAllTypes Field1 {
+                get { return result.Field1; }
+                set { SetField1(value); }
+              }
+              public Builder SetField1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+                pb::ThrowHelper.ThrowIfNull(value, "value");
+                PrepareBuilder();
+                result.hasField1 = true;
+                result.field1_ = value;
+                return this;
+              }
+              public Builder SetField1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+                pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+                PrepareBuilder();
+                result.hasField1 = true;
+                result.field1_ = builderForValue.Build();
+                return this;
+              }
+              public Builder MergeField1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+                pb::ThrowHelper.ThrowIfNull(value, "value");
+                PrepareBuilder();
+                if (result.hasField1 &&
+                    result.field1_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+                    result.field1_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.field1_).MergeFrom(value).BuildPartial();
+                } else {
+                  result.field1_ = value;
+                }
+                result.hasField1 = true;
+                return this;
+              }
+              public Builder ClearField1() {
+                PrepareBuilder();
+                result.hasField1 = false;
+                result.field1_ = null;
+                return this;
+              }
+            }
+            static Group1() {
+              object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+            }
+          }
+
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class Group2 : pb::GeneratedMessage<Group2, Group2.Builder> {
+            private Group2() { }
+            private static readonly Group2 defaultInstance = new Group2().MakeReadOnly();
+            private static readonly string[] _group2FieldNames = new string[] { "field1" };
+            private static readonly uint[] _group2FieldTags = new uint[] { 170 };
+            public static Group2 DefaultInstance {
+              get { return defaultInstance; }
+            }
+
+            public override Group2 DefaultInstanceForType {
+              get { return DefaultInstance; }
+            }
+
+            protected override Group2 ThisMessage {
+              get { return this; }
+            }
+
+            public static pbd::MessageDescriptor Descriptor {
+              get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group2__Descriptor; }
+            }
+
+            protected override pb::FieldAccess.FieldAccessorTable<Group2, Group2.Builder> InternalFieldAccessors {
+              get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_RepeatedFieldsGenerator_Group2__FieldAccessorTable; }
+            }
+
+            public const int Field1FieldNumber = 21;
+            private bool hasField1;
+            private global::Google.ProtocolBuffers.TestProtos.TestAllTypes field1_;
+            public bool HasField1 {
+              get { return hasField1; }
+            }
+            public global::Google.ProtocolBuffers.TestProtos.TestAllTypes Field1 {
+              get { return field1_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+            }
+
+            public override bool IsInitialized {
+              get {
+                return true;
+              }
+            }
+
+            public override void WriteTo(pb::ICodedOutputStream output) {
+              CalcSerializedSize();
+              string[] field_names = _group2FieldNames;
+              if (hasField1) {
+                output.WriteMessage(21, field_names[0], Field1);
+              }
+              UnknownFields.WriteTo(output);
+            }
+
+            private int memoizedSerializedSize = -1;
+            public override int SerializedSize {
+              get {
+                int size = memoizedSerializedSize;
+                if (size != -1) return size;
+                return CalcSerializedSize();
+              }
+            }
+
+            private int CalcSerializedSize() {
+              int size = memoizedSerializedSize;
+              if (size != -1) return size;
+
+              size = 0;
+              if (hasField1) {
+                size += pb::CodedOutputStream.ComputeMessageSize(21, Field1);
+              }
+              size += UnknownFields.SerializedSize;
+              memoizedSerializedSize = size;
+              return size;
+            }
+            public static Group2 ParseFrom(pb::ByteString data) {
+              return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+            }
+            public static Group2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+              return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+            }
+            public static Group2 ParseFrom(byte[] data) {
+              return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+            }
+            public static Group2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+              return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+            }
+            public static Group2 ParseFrom(global::System.IO.Stream input) {
+              return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+            }
+            public static Group2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+              return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+            }
+            public static Group2 ParseDelimitedFrom(global::System.IO.Stream input) {
+              return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+            }
+            public static Group2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+              return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+            }
+            public static Group2 ParseFrom(pb::ICodedInputStream input) {
+              return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+            }
+            public static Group2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+              return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+            }
+            private Group2 MakeReadOnly() {
+              return this;
+            }
+
+            public static Builder CreateBuilder() { return new Builder(); }
+            public override Builder ToBuilder() { return CreateBuilder(this); }
+            public override Builder CreateBuilderForType() { return new Builder(); }
+            public static Builder CreateBuilder(Group2 prototype) {
+              return new Builder(prototype);
+            }
+
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            public sealed partial class Builder : pb::GeneratedBuilder<Group2, Builder> {
+              protected override Builder ThisBuilder {
+                get { return this; }
+              }
+              public Builder() {
+                result = DefaultInstance;
+                resultIsReadOnly = true;
+              }
+              internal Builder(Group2 cloneFrom) {
+                result = cloneFrom;
+                resultIsReadOnly = true;
+              }
+
+              private bool resultIsReadOnly;
+              private Group2 result;
+
+              private Group2 PrepareBuilder() {
+                if (resultIsReadOnly) {
+                  Group2 original = result;
+                  result = new Group2();
+                  resultIsReadOnly = false;
+                  MergeFrom(original);
+                }
+                return result;
+              }
+
+              public override bool IsInitialized {
+                get { return result.IsInitialized; }
+              }
+
+              protected override Group2 MessageBeingBuilt {
+                get { return PrepareBuilder(); }
+              }
+
+              public override Builder Clear() {
+                result = DefaultInstance;
+                resultIsReadOnly = true;
+                return this;
+              }
+
+              public override Builder Clone() {
+                if (resultIsReadOnly) {
+                  return new Builder(result);
+                } else {
+                  return new Builder().MergeFrom(result);
+                }
+              }
+
+              public override pbd::MessageDescriptor DescriptorForType {
+                get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2.Descriptor; }
+              }
+
+              public override Group2 DefaultInstanceForType {
+                get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2.DefaultInstance; }
+              }
+
+              public override Group2 BuildPartial() {
+                if (resultIsReadOnly) {
+                  return result;
+                }
+                resultIsReadOnly = true;
+                return result.MakeReadOnly();
+              }
+
+              public override Builder MergeFrom(pb::IMessage other) {
+                if (other is Group2) {
+                  return MergeFrom((Group2) other);
+                } else {
+                  base.MergeFrom(other);
+                  return this;
+                }
+              }
+
+              public override Builder MergeFrom(Group2 other) {
+                if (other == global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2.DefaultInstance) return this;
+                PrepareBuilder();
+                if (other.HasField1) {
+                  MergeField1(other.Field1);
+                }
+                this.MergeUnknownFields(other.UnknownFields);
+                return this;
+              }
+
+              public override Builder MergeFrom(pb::ICodedInputStream input) {
+                return MergeFrom(input, pb::ExtensionRegistry.Empty);
+              }
+
+              public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+                PrepareBuilder();
+                pb::UnknownFieldSet.Builder unknownFields = null;
+                uint tag;
+                string field_name;
+                while (input.ReadTag(out tag, out field_name)) {
+                  if(tag == 0 && field_name != null) {
+                    int field_ordinal = global::System.Array.BinarySearch(_group2FieldNames, field_name, global::System.StringComparer.Ordinal);
+                    if(field_ordinal >= 0)
+                      tag = _group2FieldTags[field_ordinal];
+                    else {
+                      if (unknownFields == null) {
+                        unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                      }
+                      ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                      continue;
+                    }
+                  }
+                  switch (tag) {
+                    case 0: {
+                      throw pb::InvalidProtocolBufferException.InvalidTag();
+                    }
+                    default: {
+                      if (pb::WireFormat.IsEndGroupTag(tag)) {
+                        if (unknownFields != null) {
+                          this.UnknownFields = unknownFields.Build();
+                        }
+                        return this;
+                      }
+                      if (unknownFields == null) {
+                        unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                      }
+                      ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                      break;
+                    }
+                    case 170: {
+                      global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+                      if (result.hasField1) {
+                        subBuilder.MergeFrom(Field1);
+                      }
+                      input.ReadMessage(subBuilder, extensionRegistry);
+                      Field1 = subBuilder.BuildPartial();
+                      break;
+                    }
+                  }
+                }
+
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+
+
+              public bool HasField1 {
+               get { return result.hasField1; }
+              }
+              public global::Google.ProtocolBuffers.TestProtos.TestAllTypes Field1 {
+                get { return result.Field1; }
+                set { SetField1(value); }
+              }
+              public Builder SetField1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+                pb::ThrowHelper.ThrowIfNull(value, "value");
+                PrepareBuilder();
+                result.hasField1 = true;
+                result.field1_ = value;
+                return this;
+              }
+              public Builder SetField1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+                pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+                PrepareBuilder();
+                result.hasField1 = true;
+                result.field1_ = builderForValue.Build();
+                return this;
+              }
+              public Builder MergeField1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+                pb::ThrowHelper.ThrowIfNull(value, "value");
+                PrepareBuilder();
+                if (result.hasField1 &&
+                    result.field1_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+                    result.field1_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.field1_).MergeFrom(value).BuildPartial();
+                } else {
+                  result.field1_ = value;
+                }
+                result.hasField1 = true;
+                return this;
+              }
+              public Builder ClearField1() {
+                PrepareBuilder();
+                result.hasField1 = false;
+                result.field1_ = null;
+                return this;
+              }
+            }
+            static Group2() {
+              object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+            }
+          }
+
+        }
+        #endregion
+
+        public const int Field1FieldNumber = 1;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> field1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Field1List {
+          get { return field1_; }
+        }
+        public int Field1Count {
+          get { return field1_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetField1(int index) {
+          return field1_[index];
+        }
+
+        public const int Field2FieldNumber = 2;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> field2_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Field2List {
+          get { return field2_; }
+        }
+        public int Field2Count {
+          get { return field2_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetField2(int index) {
+          return field2_[index];
+        }
+
+        public const int Field3FieldNumber = 3;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> field3_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Field3List {
+          get { return field3_; }
+        }
+        public int Field3Count {
+          get { return field3_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetField3(int index) {
+          return field3_[index];
+        }
+
+        public const int Group1FieldNumber = 10;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1> group1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1> Group1List {
+          get { return group1_; }
+        }
+        public int Group1Count {
+          get { return group1_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1 GetGroup1(int index) {
+          return group1_[index];
+        }
+
+        public const int Group2FieldNumber = 20;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2> group2_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2> Group2List {
+          get { return group2_; }
+        }
+        public int Group2Count {
+          get { return group2_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2 GetGroup2(int index) {
+          return group2_[index];
+        }
+
+        public const int Ext1FieldNumber = 1000;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> ext1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Ext1List {
+          get { return ext1_; }
+        }
+        public int Ext1Count {
+          get { return ext1_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetExt1(int index) {
+          return ext1_[index];
+        }
+
+        public const int Ext2FieldNumber = 1001;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> ext2_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Ext2List {
+          get { return ext2_; }
+        }
+        public int Ext2Count {
+          get { return ext2_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetExt2(int index) {
+          return ext2_[index];
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _repeatedFieldsGeneratorFieldNames;
+          if (field1_.Count > 0) {
+            output.WriteMessageArray(1, field_names[2], field1_);
+          }
+          if (field2_.Count > 0) {
+            output.WriteMessageArray(2, field_names[3], field2_);
+          }
+          if (field3_.Count > 0) {
+            output.WriteMessageArray(3, field_names[4], field3_);
+          }
+          if (group1_.Count > 0) {
+            output.WriteGroupArray(10, field_names[5], group1_);
+          }
+          if (group2_.Count > 0) {
+            output.WriteGroupArray(20, field_names[6], group2_);
+          }
+          if (ext1_.Count > 0) {
+            output.WriteMessageArray(1000, field_names[0], ext1_);
+          }
+          if (ext2_.Count > 0) {
+            output.WriteMessageArray(1001, field_names[1], ext2_);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes element in Field1List) {
+            size += pb::CodedOutputStream.ComputeMessageSize(1, element);
+          }
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes element in Field2List) {
+            size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+          }
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes element in Field3List) {
+            size += pb::CodedOutputStream.ComputeMessageSize(3, element);
+          }
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1 element in Group1List) {
+            size += pb::CodedOutputStream.ComputeGroupSize(10, element);
+          }
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2 element in Group2List) {
+            size += pb::CodedOutputStream.ComputeGroupSize(20, element);
+          }
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes element in Ext1List) {
+            size += pb::CodedOutputStream.ComputeMessageSize(1000, element);
+          }
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes element in Ext2List) {
+            size += pb::CodedOutputStream.ComputeMessageSize(1001, element);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static RepeatedFieldsGenerator ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RepeatedFieldsGenerator ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private RepeatedFieldsGenerator MakeReadOnly() {
+          field1_.MakeReadOnly();
+          field2_.MakeReadOnly();
+          field3_.MakeReadOnly();
+          group1_.MakeReadOnly();
+          group2_.MakeReadOnly();
+          ext1_.MakeReadOnly();
+          ext2_.MakeReadOnly();
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(RepeatedFieldsGenerator prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<RepeatedFieldsGenerator, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(RepeatedFieldsGenerator cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private RepeatedFieldsGenerator result;
+
+          private RepeatedFieldsGenerator PrepareBuilder() {
+            if (resultIsReadOnly) {
+              RepeatedFieldsGenerator original = result;
+              result = new RepeatedFieldsGenerator();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override RepeatedFieldsGenerator MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Descriptor; }
+          }
+
+          public override RepeatedFieldsGenerator DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.DefaultInstance; }
+          }
+
+          public override RepeatedFieldsGenerator BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is RepeatedFieldsGenerator) {
+              return MergeFrom((RepeatedFieldsGenerator) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(RepeatedFieldsGenerator other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.field1_.Count != 0) {
+              result.field1_.Add(other.field1_);
+            }
+            if (other.field2_.Count != 0) {
+              result.field2_.Add(other.field2_);
+            }
+            if (other.field3_.Count != 0) {
+              result.field3_.Add(other.field3_);
+            }
+            if (other.group1_.Count != 0) {
+              result.group1_.Add(other.group1_);
+            }
+            if (other.group2_.Count != 0) {
+              result.group2_.Add(other.group2_);
+            }
+            if (other.ext1_.Count != 0) {
+              result.ext1_.Add(other.ext1_);
+            }
+            if (other.ext2_.Count != 0) {
+              result.ext2_.Add(other.ext2_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_repeatedFieldsGeneratorFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _repeatedFieldsGeneratorFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  input.ReadMessageArray(tag, field_name, result.field1_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance, extensionRegistry);
+                  break;
+                }
+                case 18: {
+                  input.ReadMessageArray(tag, field_name, result.field2_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance, extensionRegistry);
+                  break;
+                }
+                case 26: {
+                  input.ReadMessageArray(tag, field_name, result.field3_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance, extensionRegistry);
+                  break;
+                }
+                case 83: {
+                  input.ReadGroupArray(tag, field_name, result.group1_, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1.DefaultInstance, extensionRegistry);
+                  break;
+                }
+                case 163: {
+                  input.ReadGroupArray(tag, field_name, result.group2_, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2.DefaultInstance, extensionRegistry);
+                  break;
+                }
+                case 8002: {
+                  input.ReadMessageArray(tag, field_name, result.ext1_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance, extensionRegistry);
+                  break;
+                }
+                case 8010: {
+                  input.ReadMessageArray(tag, field_name, result.ext2_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance, extensionRegistry);
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Field1List {
+            get { return PrepareBuilder().field1_; }
+          }
+          public int Field1Count {
+            get { return result.Field1Count; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetField1(int index) {
+            return result.GetField1(index);
+          }
+          public Builder SetField1(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field1_[index] = value;
+            return this;
+          }
+          public Builder SetField1(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.field1_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddField1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field1_.Add(value);
+            return this;
+          }
+          public Builder AddField1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.field1_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeField1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> values) {
+            PrepareBuilder();
+            result.field1_.Add(values);
+            return this;
+          }
+          public Builder ClearField1() {
+            PrepareBuilder();
+            result.field1_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Field2List {
+            get { return PrepareBuilder().field2_; }
+          }
+          public int Field2Count {
+            get { return result.Field2Count; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetField2(int index) {
+            return result.GetField2(index);
+          }
+          public Builder SetField2(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field2_[index] = value;
+            return this;
+          }
+          public Builder SetField2(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.field2_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddField2(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field2_.Add(value);
+            return this;
+          }
+          public Builder AddField2(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.field2_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeField2(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> values) {
+            PrepareBuilder();
+            result.field2_.Add(values);
+            return this;
+          }
+          public Builder ClearField2() {
+            PrepareBuilder();
+            result.field2_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Field3List {
+            get { return PrepareBuilder().field3_; }
+          }
+          public int Field3Count {
+            get { return result.Field3Count; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetField3(int index) {
+            return result.GetField3(index);
+          }
+          public Builder SetField3(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field3_[index] = value;
+            return this;
+          }
+          public Builder SetField3(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.field3_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddField3(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field3_.Add(value);
+            return this;
+          }
+          public Builder AddField3(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.field3_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeField3(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> values) {
+            PrepareBuilder();
+            result.field3_.Add(values);
+            return this;
+          }
+          public Builder ClearField3() {
+            PrepareBuilder();
+            result.field3_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1> Group1List {
+            get { return PrepareBuilder().group1_; }
+          }
+          public int Group1Count {
+            get { return result.Group1Count; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1 GetGroup1(int index) {
+            return result.GetGroup1(index);
+          }
+          public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1 value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.group1_[index] = value;
+            return this;
+          }
+          public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.group1_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1 value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.group1_.Add(value);
+            return this;
+          }
+          public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.group1_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group1> values) {
+            PrepareBuilder();
+            result.group1_.Add(values);
+            return this;
+          }
+          public Builder ClearGroup1() {
+            PrepareBuilder();
+            result.group1_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2> Group2List {
+            get { return PrepareBuilder().group2_; }
+          }
+          public int Group2Count {
+            get { return result.Group2Count; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2 GetGroup2(int index) {
+            return result.GetGroup2(index);
+          }
+          public Builder SetGroup2(int index, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2 value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.group2_[index] = value;
+            return this;
+          }
+          public Builder SetGroup2(int index, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.group2_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddGroup2(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2 value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.group2_.Add(value);
+            return this;
+          }
+          public Builder AddGroup2(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.group2_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeGroup2(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedFieldsGenerator.Types.Group2> values) {
+            PrepareBuilder();
+            result.group2_.Add(values);
+            return this;
+          }
+          public Builder ClearGroup2() {
+            PrepareBuilder();
+            result.group2_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Ext1List {
+            get { return PrepareBuilder().ext1_; }
+          }
+          public int Ext1Count {
+            get { return result.Ext1Count; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetExt1(int index) {
+            return result.GetExt1(index);
+          }
+          public Builder SetExt1(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.ext1_[index] = value;
+            return this;
+          }
+          public Builder SetExt1(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.ext1_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddExt1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.ext1_.Add(value);
+            return this;
+          }
+          public Builder AddExt1(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.ext1_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeExt1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> values) {
+            PrepareBuilder();
+            result.ext1_.Add(values);
+            return this;
+          }
+          public Builder ClearExt1() {
+            PrepareBuilder();
+            result.ext1_.Clear();
+            return this;
+          }
+
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> Ext2List {
+            get { return PrepareBuilder().ext2_; }
+          }
+          public int Ext2Count {
+            get { return result.Ext2Count; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetExt2(int index) {
+            return result.GetExt2(index);
+          }
+          public Builder SetExt2(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.ext2_[index] = value;
+            return this;
+          }
+          public Builder SetExt2(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.ext2_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddExt2(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.ext2_.Add(value);
+            return this;
+          }
+          public Builder AddExt2(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.ext2_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeExt2(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> values) {
+            PrepareBuilder();
+            result.ext2_.Add(values);
+            return this;
+          }
+          public Builder ClearExt2() {
+            PrepareBuilder();
+            result.ext2_.Clear();
+            return this;
+          }
+        }
+        static RepeatedFieldsGenerator() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class OptionalGroup : pb::GeneratedMessage<OptionalGroup, OptionalGroup.Builder> {
+        private OptionalGroup() { }
+        private static readonly OptionalGroup defaultInstance = new OptionalGroup().MakeReadOnly();
+        private static readonly string[] _optionalGroupFieldNames = new string[] { "optional_group_all_types" };
+        private static readonly uint[] _optionalGroupFieldTags = new uint[] { 90 };
+        public static OptionalGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override OptionalGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override OptionalGroup ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_OptionalGroup__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<OptionalGroup, OptionalGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_OptionalGroup__FieldAccessorTable; }
+        }
+
+        public const int OptionalGroupAllTypesFieldNumber = 11;
+        private bool hasOptionalGroupAllTypes;
+        private global::Google.ProtocolBuffers.TestProtos.TestAllTypes optionalGroupAllTypes_;
+        public bool HasOptionalGroupAllTypes {
+          get { return hasOptionalGroupAllTypes; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestAllTypes OptionalGroupAllTypes {
+          get { return optionalGroupAllTypes_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _optionalGroupFieldNames;
+          if (hasOptionalGroupAllTypes) {
+            output.WriteMessage(11, field_names[0], OptionalGroupAllTypes);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasOptionalGroupAllTypes) {
+            size += pb::CodedOutputStream.ComputeMessageSize(11, OptionalGroupAllTypes);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static OptionalGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static OptionalGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private OptionalGroup MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(OptionalGroup prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<OptionalGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(OptionalGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private OptionalGroup result;
+
+          private OptionalGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              OptionalGroup original = result;
+              result = new OptionalGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override OptionalGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.Descriptor; }
+          }
+
+          public override OptionalGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.DefaultInstance; }
+          }
+
+          public override OptionalGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is OptionalGroup) {
+              return MergeFrom((OptionalGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(OptionalGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasOptionalGroupAllTypes) {
+              MergeOptionalGroupAllTypes(other.OptionalGroupAllTypes);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_optionalGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _optionalGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 90: {
+                  global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+                  if (result.hasOptionalGroupAllTypes) {
+                    subBuilder.MergeFrom(OptionalGroupAllTypes);
+                  }
+                  input.ReadMessage(subBuilder, extensionRegistry);
+                  OptionalGroupAllTypes = subBuilder.BuildPartial();
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasOptionalGroupAllTypes {
+           get { return result.hasOptionalGroupAllTypes; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestAllTypes OptionalGroupAllTypes {
+            get { return result.OptionalGroupAllTypes; }
+            set { SetOptionalGroupAllTypes(value); }
+          }
+          public Builder SetOptionalGroupAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasOptionalGroupAllTypes = true;
+            result.optionalGroupAllTypes_ = value;
+            return this;
+          }
+          public Builder SetOptionalGroupAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.hasOptionalGroupAllTypes = true;
+            result.optionalGroupAllTypes_ = builderForValue.Build();
+            return this;
+          }
+          public Builder MergeOptionalGroupAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            if (result.hasOptionalGroupAllTypes &&
+                result.optionalGroupAllTypes_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+                result.optionalGroupAllTypes_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.optionalGroupAllTypes_).MergeFrom(value).BuildPartial();
+            } else {
+              result.optionalGroupAllTypes_ = value;
+            }
+            result.hasOptionalGroupAllTypes = true;
+            return this;
+          }
+          public Builder ClearOptionalGroupAllTypes() {
+            PrepareBuilder();
+            result.hasOptionalGroupAllTypes = false;
+            result.optionalGroupAllTypes_ = null;
+            return this;
+          }
+        }
+        static OptionalGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class RepeatedGroup : pb::GeneratedMessage<RepeatedGroup, RepeatedGroup.Builder> {
+        private RepeatedGroup() { }
+        private static readonly RepeatedGroup defaultInstance = new RepeatedGroup().MakeReadOnly();
+        private static readonly string[] _repeatedGroupFieldNames = new string[] { "repeated_group_all_types" };
+        private static readonly uint[] _repeatedGroupFieldTags = new uint[] { 170 };
+        public static RepeatedGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+
+        public override RepeatedGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+
+        protected override RepeatedGroup ThisMessage {
+          get { return this; }
+        }
+
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_RepeatedGroup__Descriptor; }
+        }
+
+        protected override pb::FieldAccess.FieldAccessorTable<RepeatedGroup, RepeatedGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestParsingMerge_RepeatedGroup__FieldAccessorTable; }
+        }
+
+        public const int RepeatedGroupAllTypesFieldNumber = 21;
+        private bool hasRepeatedGroupAllTypes;
+        private global::Google.ProtocolBuffers.TestProtos.TestAllTypes repeatedGroupAllTypes_;
+        public bool HasRepeatedGroupAllTypes {
+          get { return hasRepeatedGroupAllTypes; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestAllTypes RepeatedGroupAllTypes {
+          get { return repeatedGroupAllTypes_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+        }
+
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _repeatedGroupFieldNames;
+          if (hasRepeatedGroupAllTypes) {
+            output.WriteMessage(21, field_names[0], RepeatedGroupAllTypes);
+          }
+          UnknownFields.WriteTo(output);
+        }
+
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (hasRepeatedGroupAllTypes) {
+            size += pb::CodedOutputStream.ComputeMessageSize(21, RepeatedGroupAllTypes);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static RepeatedGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static RepeatedGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private RepeatedGroup MakeReadOnly() {
+          return this;
+        }
+
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(RepeatedGroup prototype) {
+          return new Builder(prototype);
+        }
+
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<RepeatedGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(RepeatedGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+
+          private bool resultIsReadOnly;
+          private RepeatedGroup result;
+
+          private RepeatedGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              RepeatedGroup original = result;
+              result = new RepeatedGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+
+          protected override RepeatedGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup.Descriptor; }
+          }
+
+          public override RepeatedGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup.DefaultInstance; }
+          }
+
+          public override RepeatedGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is RepeatedGroup) {
+              return MergeFrom((RepeatedGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+
+          public override Builder MergeFrom(RepeatedGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasRepeatedGroupAllTypes) {
+              MergeRepeatedGroupAllTypes(other.RepeatedGroupAllTypes);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_repeatedGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _repeatedGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 170: {
+                  global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+                  if (result.hasRepeatedGroupAllTypes) {
+                    subBuilder.MergeFrom(RepeatedGroupAllTypes);
+                  }
+                  input.ReadMessage(subBuilder, extensionRegistry);
+                  RepeatedGroupAllTypes = subBuilder.BuildPartial();
+                  break;
+                }
+              }
+            }
+
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+
+
+          public bool HasRepeatedGroupAllTypes {
+           get { return result.hasRepeatedGroupAllTypes; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestAllTypes RepeatedGroupAllTypes {
+            get { return result.RepeatedGroupAllTypes; }
+            set { SetRepeatedGroupAllTypes(value); }
+          }
+          public Builder SetRepeatedGroupAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasRepeatedGroupAllTypes = true;
+            result.repeatedGroupAllTypes_ = value;
+            return this;
+          }
+          public Builder SetRepeatedGroupAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.hasRepeatedGroupAllTypes = true;
+            result.repeatedGroupAllTypes_ = builderForValue.Build();
+            return this;
+          }
+          public Builder MergeRepeatedGroupAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            if (result.hasRepeatedGroupAllTypes &&
+                result.repeatedGroupAllTypes_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+                result.repeatedGroupAllTypes_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.repeatedGroupAllTypes_).MergeFrom(value).BuildPartial();
+            } else {
+              result.repeatedGroupAllTypes_ = value;
+            }
+            result.hasRepeatedGroupAllTypes = true;
+            return this;
+          }
+          public Builder ClearRepeatedGroupAllTypes() {
+            PrepareBuilder();
+            result.hasRepeatedGroupAllTypes = false;
+            result.repeatedGroupAllTypes_ = null;
+            return this;
+          }
+        }
+        static RepeatedGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+        }
+      }
+
+    }
+    #endregion
+
+    public const int RequiredAllTypesFieldNumber = 1;
+    private bool hasRequiredAllTypes;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes requiredAllTypes_;
+    public bool HasRequiredAllTypes {
+      get { return hasRequiredAllTypes; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes RequiredAllTypes {
+      get { return requiredAllTypes_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+    }
+
+    public const int OptionalAllTypesFieldNumber = 2;
+    private bool hasOptionalAllTypes;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes optionalAllTypes_;
+    public bool HasOptionalAllTypes {
+      get { return hasOptionalAllTypes; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes OptionalAllTypes {
+      get { return optionalAllTypes_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+    }
+
+    public const int RepeatedAllTypesFieldNumber = 3;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> repeatedAllTypes_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> RepeatedAllTypesList {
+      get { return repeatedAllTypes_; }
+    }
+    public int RepeatedAllTypesCount {
+      get { return repeatedAllTypes_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetRepeatedAllTypes(int index) {
+      return repeatedAllTypes_[index];
+    }
+
+    public const int OptionalGroupFieldNumber = 10;
+    private bool hasOptionalGroup;
+    private global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup optionalGroup_;
+    public bool HasOptionalGroup {
+      get { return hasOptionalGroup; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup OptionalGroup {
+      get { return optionalGroup_ ?? global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.DefaultInstance; }
+    }
+
+    public const int RepeatedGroupFieldNumber = 20;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup> repeatedGroup_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup> RepeatedGroupList {
+      get { return repeatedGroup_; }
+    }
+    public int RepeatedGroupCount {
+      get { return repeatedGroup_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup GetRepeatedGroup(int index) {
+      return repeatedGroup_[index];
+    }
+
+    public override bool IsInitialized {
+      get {
+        if (!hasRequiredAllTypes) return false;
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testParsingMergeFieldNames;
+      pb::ExtendableMessage<TestParsingMerge, TestParsingMerge.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (hasRequiredAllTypes) {
+        output.WriteMessage(1, field_names[4], RequiredAllTypes);
+      }
+      if (hasOptionalAllTypes) {
+        output.WriteMessage(2, field_names[0], OptionalAllTypes);
+      }
+      if (repeatedAllTypes_.Count > 0) {
+        output.WriteMessageArray(3, field_names[2], repeatedAllTypes_);
+      }
+      if (hasOptionalGroup) {
+        output.WriteGroup(10, field_names[1], OptionalGroup);
+      }
+      if (repeatedGroup_.Count > 0) {
+        output.WriteGroupArray(20, field_names[3], repeatedGroup_);
+      }
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasRequiredAllTypes) {
+        size += pb::CodedOutputStream.ComputeMessageSize(1, RequiredAllTypes);
+      }
+      if (hasOptionalAllTypes) {
+        size += pb::CodedOutputStream.ComputeMessageSize(2, OptionalAllTypes);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes element in RepeatedAllTypesList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(3, element);
+      }
+      if (hasOptionalGroup) {
+        size += pb::CodedOutputStream.ComputeGroupSize(10, OptionalGroup);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup element in RepeatedGroupList) {
+        size += pb::CodedOutputStream.ComputeGroupSize(20, element);
+      }
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestParsingMerge ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestParsingMerge ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestParsingMerge ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestParsingMerge ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestParsingMerge ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestParsingMerge ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestParsingMerge ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestParsingMerge ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestParsingMerge ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestParsingMerge ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestParsingMerge MakeReadOnly() {
+      repeatedAllTypes_.MakeReadOnly();
+      repeatedGroup_.MakeReadOnly();
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestParsingMerge prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestParsingMerge, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestParsingMerge cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestParsingMerge result;
+
+      private TestParsingMerge PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestParsingMerge original = result;
+          result = new TestParsingMerge();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestParsingMerge MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Descriptor; }
+      }
+
+      public override TestParsingMerge DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.DefaultInstance; }
+      }
+
+      public override TestParsingMerge BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestParsingMerge) {
+          return MergeFrom((TestParsingMerge) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestParsingMerge other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasRequiredAllTypes) {
+          MergeRequiredAllTypes(other.RequiredAllTypes);
+        }
+        if (other.HasOptionalAllTypes) {
+          MergeOptionalAllTypes(other.OptionalAllTypes);
+        }
+        if (other.repeatedAllTypes_.Count != 0) {
+          result.repeatedAllTypes_.Add(other.repeatedAllTypes_);
+        }
+        if (other.HasOptionalGroup) {
+          MergeOptionalGroup(other.OptionalGroup);
+        }
+        if (other.repeatedGroup_.Count != 0) {
+          result.repeatedGroup_.Add(other.repeatedGroup_);
+        }
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testParsingMergeFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testParsingMergeFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+              if (result.hasRequiredAllTypes) {
+                subBuilder.MergeFrom(RequiredAllTypes);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              RequiredAllTypes = subBuilder.BuildPartial();
+              break;
+            }
+            case 18: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder();
+              if (result.hasOptionalAllTypes) {
+                subBuilder.MergeFrom(OptionalAllTypes);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalAllTypes = subBuilder.BuildPartial();
+              break;
+            }
+            case 26: {
+              input.ReadMessageArray(tag, field_name, result.repeatedAllTypes_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 83: {
+              global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.CreateBuilder();
+              if (result.hasOptionalGroup) {
+                subBuilder.MergeFrom(OptionalGroup);
+              }
+              input.ReadGroup(10, subBuilder, extensionRegistry);
+              OptionalGroup = subBuilder.BuildPartial();
+              break;
+            }
+            case 163: {
+              input.ReadGroupArray(tag, field_name, result.repeatedGroup_, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup.DefaultInstance, extensionRegistry);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasRequiredAllTypes {
+       get { return result.hasRequiredAllTypes; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes RequiredAllTypes {
+        get { return result.RequiredAllTypes; }
+        set { SetRequiredAllTypes(value); }
+      }
+      public Builder SetRequiredAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasRequiredAllTypes = true;
+        result.requiredAllTypes_ = value;
+        return this;
+      }
+      public Builder SetRequiredAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasRequiredAllTypes = true;
+        result.requiredAllTypes_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeRequiredAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasRequiredAllTypes &&
+            result.requiredAllTypes_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+            result.requiredAllTypes_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.requiredAllTypes_).MergeFrom(value).BuildPartial();
+        } else {
+          result.requiredAllTypes_ = value;
+        }
+        result.hasRequiredAllTypes = true;
+        return this;
+      }
+      public Builder ClearRequiredAllTypes() {
+        PrepareBuilder();
+        result.hasRequiredAllTypes = false;
+        result.requiredAllTypes_ = null;
+        return this;
+      }
+
+      public bool HasOptionalAllTypes {
+       get { return result.hasOptionalAllTypes; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes OptionalAllTypes {
+        get { return result.OptionalAllTypes; }
+        set { SetOptionalAllTypes(value); }
+      }
+      public Builder SetOptionalAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalAllTypes = true;
+        result.optionalAllTypes_ = value;
+        return this;
+      }
+      public Builder SetOptionalAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalAllTypes = true;
+        result.optionalAllTypes_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalAllTypes &&
+            result.optionalAllTypes_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) {
+            result.optionalAllTypes_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder(result.optionalAllTypes_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalAllTypes_ = value;
+        }
+        result.hasOptionalAllTypes = true;
+        return this;
+      }
+      public Builder ClearOptionalAllTypes() {
+        PrepareBuilder();
+        result.hasOptionalAllTypes = false;
+        result.optionalAllTypes_ = null;
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> RepeatedAllTypesList {
+        get { return PrepareBuilder().repeatedAllTypes_; }
+      }
+      public int RepeatedAllTypesCount {
+        get { return result.RepeatedAllTypesCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes GetRepeatedAllTypes(int index) {
+        return result.GetRepeatedAllTypes(index);
+      }
+      public Builder SetRepeatedAllTypes(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedAllTypes_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedAllTypes(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedAllTypes_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedAllTypes_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedAllTypes(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedAllTypes_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedAllTypes(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes> values) {
+        PrepareBuilder();
+        result.repeatedAllTypes_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedAllTypes() {
+        PrepareBuilder();
+        result.repeatedAllTypes_.Clear();
+        return this;
+      }
+
+      public bool HasOptionalGroup {
+       get { return result.hasOptionalGroup; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup OptionalGroup {
+        get { return result.OptionalGroup; }
+        set { SetOptionalGroup(value); }
+      }
+      public Builder SetOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = value;
+        return this;
+      }
+      public Builder SetOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalGroup &&
+            result.optionalGroup_ != global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.DefaultInstance) {
+            result.optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.OptionalGroup.CreateBuilder(result.optionalGroup_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalGroup_ = value;
+        }
+        result.hasOptionalGroup = true;
+        return this;
+      }
+      public Builder ClearOptionalGroup() {
+        PrepareBuilder();
+        result.hasOptionalGroup = false;
+        result.optionalGroup_ = null;
+        return this;
+      }
+
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup> RepeatedGroupList {
+        get { return PrepareBuilder().repeatedGroup_; }
+      }
+      public int RepeatedGroupCount {
+        get { return result.RepeatedGroupCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup GetRepeatedGroup(int index) {
+        return result.GetRepeatedGroup(index);
+      }
+      public Builder SetRepeatedGroup(int index, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedGroup_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedGroup(int index, global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedGroup_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedGroup(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedGroup_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedGroup(global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedGroup_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedGroup(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestParsingMerge.Types.RepeatedGroup> values) {
+        PrepareBuilder();
+        result.repeatedGroup_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedGroup() {
+        PrepareBuilder();
+        result.repeatedGroup_.Clear();
+        return this;
+      }
+    }
+    static TestParsingMerge() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestCommentInjectionMessage : pb::GeneratedMessage<TestCommentInjectionMessage, TestCommentInjectionMessage.Builder> {
+    private TestCommentInjectionMessage() { }
+    private static readonly TestCommentInjectionMessage defaultInstance = new TestCommentInjectionMessage().MakeReadOnly();
+    private static readonly string[] _testCommentInjectionMessageFieldNames = new string[] { "a" };
+    private static readonly uint[] _testCommentInjectionMessageFieldTags = new uint[] { 10 };
+    public static TestCommentInjectionMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override TestCommentInjectionMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override TestCommentInjectionMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestCommentInjectionMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<TestCommentInjectionMessage, TestCommentInjectionMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_TestCommentInjectionMessage__FieldAccessorTable; }
+    }
+
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private string a_ = "*/ <- Neither should this.";
+    public bool HasA {
+      get { return hasA; }
+    }
+    public string A {
+      get { return a_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testCommentInjectionMessageFieldNames;
+      if (hasA) {
+        output.WriteString(1, field_names[0], A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasA) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, A);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestCommentInjectionMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestCommentInjectionMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestCommentInjectionMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestCommentInjectionMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestCommentInjectionMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestCommentInjectionMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private TestCommentInjectionMessage result;
+
+      private TestCommentInjectionMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestCommentInjectionMessage original = result;
+          result = new TestCommentInjectionMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override TestCommentInjectionMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestCommentInjectionMessage.Descriptor; }
+      }
+
+      public override TestCommentInjectionMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestCommentInjectionMessage.DefaultInstance; }
+      }
+
+      public override TestCommentInjectionMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestCommentInjectionMessage) {
+          return MergeFrom((TestCommentInjectionMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(TestCommentInjectionMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestCommentInjectionMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testCommentInjectionMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testCommentInjectionMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasA = input.ReadString(ref result.a_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public string A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = "*/ <- Neither should this.";
+        return this;
+      }
+    }
+    static TestCommentInjectionMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class FooRequest : pb::GeneratedMessage<FooRequest, FooRequest.Builder> {
+    private FooRequest() { }
+    private static readonly FooRequest defaultInstance = new FooRequest().MakeReadOnly();
+    private static readonly string[] _fooRequestFieldNames = new string[] {  };
+    private static readonly uint[] _fooRequestFieldTags = new uint[] {  };
+    public static FooRequest DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override FooRequest DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override FooRequest ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_FooRequest__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<FooRequest, FooRequest.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_FooRequest__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _fooRequestFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static FooRequest ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static FooRequest ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static FooRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static FooRequest ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private FooRequest MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(FooRequest prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<FooRequest, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(FooRequest cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private FooRequest result;
+
+      private FooRequest PrepareBuilder() {
+        if (resultIsReadOnly) {
+          FooRequest original = result;
+          result = new FooRequest();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override FooRequest MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooRequest.Descriptor; }
+      }
+
+      public override FooRequest DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance; }
+      }
+
+      public override FooRequest BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is FooRequest) {
+          return MergeFrom((FooRequest) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(FooRequest other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_fooRequestFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _fooRequestFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static FooRequest() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class FooResponse : pb::GeneratedMessage<FooResponse, FooResponse.Builder> {
+    private FooResponse() { }
+    private static readonly FooResponse defaultInstance = new FooResponse().MakeReadOnly();
+    private static readonly string[] _fooResponseFieldNames = new string[] {  };
+    private static readonly uint[] _fooResponseFieldTags = new uint[] {  };
+    public static FooResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override FooResponse DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override FooResponse ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_FooResponse__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<FooResponse, FooResponse.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_FooResponse__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _fooResponseFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static FooResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static FooResponse ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static FooResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static FooResponse ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private FooResponse MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(FooResponse prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<FooResponse, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(FooResponse cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private FooResponse result;
+
+      private FooResponse PrepareBuilder() {
+        if (resultIsReadOnly) {
+          FooResponse original = result;
+          result = new FooResponse();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override FooResponse MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooResponse.Descriptor; }
+      }
+
+      public override FooResponse DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance; }
+      }
+
+      public override FooResponse BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is FooResponse) {
+          return MergeFrom((FooResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(FooResponse other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_fooResponseFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _fooResponseFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static FooResponse() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class FooClientMessage : pb::GeneratedMessage<FooClientMessage, FooClientMessage.Builder> {
+    private FooClientMessage() { }
+    private static readonly FooClientMessage defaultInstance = new FooClientMessage().MakeReadOnly();
+    private static readonly string[] _fooClientMessageFieldNames = new string[] {  };
+    private static readonly uint[] _fooClientMessageFieldTags = new uint[] {  };
+    public static FooClientMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override FooClientMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override FooClientMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_FooClientMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<FooClientMessage, FooClientMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_FooClientMessage__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _fooClientMessageFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static FooClientMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooClientMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooClientMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooClientMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooClientMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooClientMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static FooClientMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static FooClientMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static FooClientMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooClientMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private FooClientMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(FooClientMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<FooClientMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(FooClientMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private FooClientMessage result;
+
+      private FooClientMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          FooClientMessage original = result;
+          result = new FooClientMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override FooClientMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooClientMessage.Descriptor; }
+      }
+
+      public override FooClientMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooClientMessage.DefaultInstance; }
+      }
+
+      public override FooClientMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is FooClientMessage) {
+          return MergeFrom((FooClientMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(FooClientMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.FooClientMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_fooClientMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _fooClientMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static FooClientMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class FooServerMessage : pb::GeneratedMessage<FooServerMessage, FooServerMessage.Builder> {
+    private FooServerMessage() { }
+    private static readonly FooServerMessage defaultInstance = new FooServerMessage().MakeReadOnly();
+    private static readonly string[] _fooServerMessageFieldNames = new string[] {  };
+    private static readonly uint[] _fooServerMessageFieldTags = new uint[] {  };
+    public static FooServerMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override FooServerMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override FooServerMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_FooServerMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<FooServerMessage, FooServerMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_FooServerMessage__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _fooServerMessageFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static FooServerMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooServerMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooServerMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooServerMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooServerMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooServerMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static FooServerMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static FooServerMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static FooServerMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooServerMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private FooServerMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(FooServerMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<FooServerMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(FooServerMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private FooServerMessage result;
+
+      private FooServerMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          FooServerMessage original = result;
+          result = new FooServerMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override FooServerMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooServerMessage.Descriptor; }
+      }
+
+      public override FooServerMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooServerMessage.DefaultInstance; }
+      }
+
+      public override FooServerMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is FooServerMessage) {
+          return MergeFrom((FooServerMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(FooServerMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.FooServerMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_fooServerMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _fooServerMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static FooServerMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class BarRequest : pb::GeneratedMessage<BarRequest, BarRequest.Builder> {
+    private BarRequest() { }
+    private static readonly BarRequest defaultInstance = new BarRequest().MakeReadOnly();
+    private static readonly string[] _barRequestFieldNames = new string[] {  };
+    private static readonly uint[] _barRequestFieldTags = new uint[] {  };
+    public static BarRequest DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override BarRequest DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override BarRequest ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_BarRequest__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<BarRequest, BarRequest.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_BarRequest__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _barRequestFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static BarRequest ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static BarRequest ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static BarRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static BarRequest ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private BarRequest MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(BarRequest prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<BarRequest, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(BarRequest cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private BarRequest result;
+
+      private BarRequest PrepareBuilder() {
+        if (resultIsReadOnly) {
+          BarRequest original = result;
+          result = new BarRequest();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override BarRequest MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BarRequest.Descriptor; }
+      }
+
+      public override BarRequest DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance; }
+      }
+
+      public override BarRequest BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is BarRequest) {
+          return MergeFrom((BarRequest) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(BarRequest other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_barRequestFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _barRequestFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static BarRequest() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class BarResponse : pb::GeneratedMessage<BarResponse, BarResponse.Builder> {
+    private BarResponse() { }
+    private static readonly BarResponse defaultInstance = new BarResponse().MakeReadOnly();
+    private static readonly string[] _barResponseFieldNames = new string[] {  };
+    private static readonly uint[] _barResponseFieldTags = new uint[] {  };
+    public static BarResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override BarResponse DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override BarResponse ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_BarResponse__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<BarResponse, BarResponse.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.Unittest.internal__static_protobuf_unittest_BarResponse__FieldAccessorTable; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _barResponseFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static BarResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static BarResponse ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static BarResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static BarResponse ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private BarResponse MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(BarResponse prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<BarResponse, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(BarResponse cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private BarResponse result;
+
+      private BarResponse PrepareBuilder() {
+        if (resultIsReadOnly) {
+          BarResponse original = result;
+          result = new BarResponse();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override BarResponse MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BarResponse.Descriptor; }
+      }
+
+      public override BarResponse DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance; }
+      }
+
+      public override BarResponse BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is BarResponse) {
+          return MergeFrom((BarResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(BarResponse other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_barResponseFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _barResponseFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+    }
+    static BarResponse() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.Unittest.Descriptor, null);
+    }
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code

+ 347 - 0
csharp/src/ProtoBench/UnittestImport.cs

@@ -0,0 +1,347 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/unittest_import.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class UnittestImport {
+
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_import_ImportMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ImportMessage, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder> internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+
+    static UnittestImport() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvEhhwcm90", 
+            "b2J1Zl91bml0dGVzdF9pbXBvcnQaLGdvb2dsZS9wcm90b2J1Zi91bml0dGVz", 
+            "dF9pbXBvcnRfcHVibGljLnByb3RvIhoKDUltcG9ydE1lc3NhZ2USCQoBZBgB", 
+            "IAEoBSo8CgpJbXBvcnRFbnVtEg4KCklNUE9SVF9GT08QBxIOCgpJTVBPUlRf", 
+            "QkFSEAgSDgoKSU1QT1JUX0JBWhAJQkMKGGNvbS5nb29nbGUucHJvdG9idWYu", 
+            "dGVzdEgB+AEBqgIhR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9z", 
+          "UAA="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_protobuf_unittest_import_ImportMessage__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ImportMessage, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder>(internal__static_protobuf_unittest_import_ImportMessage__Descriptor,
+                new string[] { "D", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.TestProtos.UnittestImportPublic.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.TestProtos.UnittestImportPublic.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum ImportEnum {
+    IMPORT_FOO = 7,
+    IMPORT_BAR = 8,
+    IMPORT_BAZ = 9,
+  }
+
+  #endregion
+
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class ImportMessage : pb::GeneratedMessage<ImportMessage, ImportMessage.Builder> {
+    private ImportMessage() { }
+    private static readonly ImportMessage defaultInstance = new ImportMessage().MakeReadOnly();
+    private static readonly string[] _importMessageFieldNames = new string[] { "d" };
+    private static readonly uint[] _importMessageFieldTags = new uint[] { 8 };
+    public static ImportMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override ImportMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override ImportMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnittestImport.internal__static_protobuf_unittest_import_ImportMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<ImportMessage, ImportMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnittestImport.internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable; }
+    }
+
+    public const int DFieldNumber = 1;
+    private bool hasD;
+    private int d_;
+    public bool HasD {
+      get { return hasD; }
+    }
+    public int D {
+      get { return d_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _importMessageFieldNames;
+      if (hasD) {
+        output.WriteInt32(1, field_names[0], D);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      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 ImportMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static ImportMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static ImportMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private ImportMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(ImportMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<ImportMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(ImportMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private ImportMessage result;
+
+      private ImportMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          ImportMessage original = result;
+          result = new ImportMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override ImportMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.ImportMessage.Descriptor; }
+      }
+
+      public override ImportMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance; }
+      }
+
+      public override ImportMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is ImportMessage) {
+          return MergeFrom((ImportMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(ImportMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasD) {
+          D = other.D;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_importMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _importMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasD = input.ReadInt32(ref result.d_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasD {
+        get { return result.hasD; }
+      }
+      public int D {
+        get { return result.D; }
+        set { SetD(value); }
+      }
+      public Builder SetD(int value) {
+        PrepareBuilder();
+        result.hasD = true;
+        result.d_ = value;
+        return this;
+      }
+      public Builder ClearD() {
+        PrepareBuilder();
+        result.hasD = false;
+        result.d_ = 0;
+        return this;
+      }
+    }
+    static ImportMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnittestImport.Descriptor, null);
+    }
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code

+ 333 - 0
csharp/src/ProtoBench/UnittestImportPublic.cs

@@ -0,0 +1,333 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/unittest_import_public.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class UnittestImportPublic {
+
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_import_PublicImportMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.PublicImportMessage, global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.Builder> internal__static_protobuf_unittest_import_PublicImportMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+
+    static UnittestImportPublic() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cixnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wcm90", 
+            "bxIYcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0IiAKE1B1YmxpY0ltcG9ydE1l", 
+            "c3NhZ2USCQoBZRgBIAEoBUI+Chhjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3Sq", 
+          "AiFHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3M="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_protobuf_unittest_import_PublicImportMessage__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_protobuf_unittest_import_PublicImportMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.PublicImportMessage, global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.Builder>(internal__static_protobuf_unittest_import_PublicImportMessage__Descriptor,
+                new string[] { "E", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          }, assigner);
+    }
+    #endregion
+
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class PublicImportMessage : pb::GeneratedMessage<PublicImportMessage, PublicImportMessage.Builder> {
+    private PublicImportMessage() { }
+    private static readonly PublicImportMessage defaultInstance = new PublicImportMessage().MakeReadOnly();
+    private static readonly string[] _publicImportMessageFieldNames = new string[] { "e" };
+    private static readonly uint[] _publicImportMessageFieldTags = new uint[] { 8 };
+    public static PublicImportMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+
+    public override PublicImportMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+
+    protected override PublicImportMessage ThisMessage {
+      get { return this; }
+    }
+
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnittestImportPublic.internal__static_protobuf_unittest_import_PublicImportMessage__Descriptor; }
+    }
+
+    protected override pb::FieldAccess.FieldAccessorTable<PublicImportMessage, PublicImportMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnittestImportPublic.internal__static_protobuf_unittest_import_PublicImportMessage__FieldAccessorTable; }
+    }
+
+    public const int EFieldNumber = 1;
+    private bool hasE;
+    private int e_;
+    public bool HasE {
+      get { return hasE; }
+    }
+    public int E {
+      get { return e_; }
+    }
+
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _publicImportMessageFieldNames;
+      if (hasE) {
+        output.WriteInt32(1, field_names[0], E);
+      }
+      UnknownFields.WriteTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (hasE) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, E);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static PublicImportMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static PublicImportMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static PublicImportMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static PublicImportMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static PublicImportMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static PublicImportMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static PublicImportMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static PublicImportMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static PublicImportMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static PublicImportMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private PublicImportMessage MakeReadOnly() {
+      return this;
+    }
+
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(PublicImportMessage prototype) {
+      return new Builder(prototype);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<PublicImportMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(PublicImportMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+
+      private bool resultIsReadOnly;
+      private PublicImportMessage result;
+
+      private PublicImportMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          PublicImportMessage original = result;
+          result = new PublicImportMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+
+      protected override PublicImportMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.Descriptor; }
+      }
+
+      public override PublicImportMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.DefaultInstance; }
+      }
+
+      public override PublicImportMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is PublicImportMessage) {
+          return MergeFrom((PublicImportMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+
+      public override Builder MergeFrom(PublicImportMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.PublicImportMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasE) {
+          E = other.E;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_publicImportMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _publicImportMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasE = input.ReadInt32(ref result.e_);
+              break;
+            }
+          }
+        }
+
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+
+
+      public bool HasE {
+        get { return result.hasE; }
+      }
+      public int E {
+        get { return result.E; }
+        set { SetE(value); }
+      }
+      public Builder SetE(int value) {
+        PrepareBuilder();
+        result.hasE = true;
+        result.e_ = value;
+        return this;
+      }
+      public Builder ClearE() {
+        PrepareBuilder();
+        result.hasE = false;
+        result.e_ = 0;
+        return this;
+      }
+    }
+    static PublicImportMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnittestImportPublic.Descriptor, null);
+    }
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code

+ 3 - 0
csharp/src/ProtoBench/app.config

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration>

BIN
csharp/src/ProtoBench/google_message1.dat


BIN
csharp/src/ProtoBench/google_message2.dat


+ 88 - 0
csharp/src/ProtoDump/Program.cs

@@ -0,0 +1,88 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.IO;
+
+namespace Google.ProtocolBuffers.ProtoDump
+{
+    /// <summary>
+    /// Small utility to load a binary message and dump it in text form
+    /// </summary>
+    internal class Program
+    {
+        private static int Main(string[] args)
+        {
+            if (args.Length != 2)
+            {
+                Console.Error.WriteLine("Usage: ProtoDump <descriptor type name> <input data>");
+                Console.Error.WriteLine("The descriptor type name is the fully-qualified message name,");
+                Console.Error.WriteLine("including assembly e.g. ProjectNamespace.Message,Company.Project");
+                return 1;
+            }
+            IMessage defaultMessage;
+            try
+            {
+                defaultMessage = MessageUtil.GetDefaultMessage(args[0]);
+            }
+            catch (ArgumentException e)
+            {
+                Console.Error.WriteLine(e.Message);
+                return 1;
+            }
+            try
+            {
+                IBuilder builder = defaultMessage.WeakCreateBuilderForType();
+                if (builder == null)
+                {
+                    Console.Error.WriteLine("Unable to create builder");
+                    return 1;
+                }
+                byte[] inputData = File.ReadAllBytes(args[1]);
+                builder.WeakMergeFrom(ByteString.CopyFrom(inputData));
+                Console.WriteLine(TextFormat.PrintToString(builder.WeakBuild()));
+                return 0;
+            }
+            catch (Exception e)
+            {
+                Console.Error.WriteLine("Error: {0}", e.Message);
+                Console.Error.WriteLine();
+                Console.Error.WriteLine("Detailed exception information: {0}", e);
+                return 1;
+            }
+        }
+    }
+}

+ 30 - 0
csharp/src/ProtoDump/Properties/AssemblyInfo.cs

@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("ProtoDump")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtoDump")]
+[assembly: AssemblyCopyright("Copyright ©  2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+[assembly: AssemblyFileVersion("2.4.1.555")]

+ 67 - 0
csharp/src/ProtoDump/ProtoDump.csproj

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET35</EnvironmentTemplate>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D7282E99-2DC3-405B-946F-177DB2FD2AE2}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.ProtoDump</RootNamespace>
+    <AssemblyName>ProtoDump</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 3 - 0
csharp/src/ProtoDump/app.config

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration>

+ 305 - 0
csharp/src/ProtoMunge/Program.cs

@@ -0,0 +1,305 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoMunge
+{
+    /// <summary>
+    /// Utility console application which takes a message descriptor and a corresponding message,
+    /// and produces a new message with similar but random data. The data is the same length
+    /// as the original, but with random values within appropriate bands. (For instance, a compressed
+    /// integer in the range 0-127 will end up as another integer in the same range, to keep the length
+    /// the same.)
+    /// TODO(jonskeet): Potentially refactor to use an instance instead, making it simpler to
+    /// be thread-safe for external use.
+    /// </summary>
+    public sealed class Program
+    {
+        private static readonly Random rng = new Random();
+
+        private static int Main(string[] args)
+        {
+            if (args.Length != 3)
+            {
+                Console.Error.WriteLine("Usage: ProtoMunge <descriptor type name> <input data> <output file>");
+                Console.Error.WriteLine(
+                    "The descriptor type name is the fully-qualified message name, including assembly.");
+                Console.Error.WriteLine(
+                    "(At a future date it may be possible to do this without building the .NET assembly at all.)");
+                return 1;
+            }
+            IMessage defaultMessage;
+            try
+            {
+                defaultMessage = MessageUtil.GetDefaultMessage(args[0]);
+            }
+            catch (ArgumentException e)
+            {
+                Console.Error.WriteLine(e.Message);
+                return 1;
+            }
+            try
+            {
+                IBuilder builder = defaultMessage.WeakCreateBuilderForType();
+                byte[] inputData = File.ReadAllBytes(args[1]);
+                builder.WeakMergeFrom(ByteString.CopyFrom(inputData));
+                IMessage original = builder.WeakBuild();
+                IMessage munged = Munge(original);
+                if (original.SerializedSize != munged.SerializedSize)
+                {
+                    throw new Exception("Serialized sizes don't match");
+                }
+                File.WriteAllBytes(args[2], munged.ToByteArray());
+                return 0;
+            }
+            catch (Exception e)
+            {
+                Console.Error.WriteLine("Error: {0}", e.Message);
+                Console.Error.WriteLine();
+                Console.Error.WriteLine("Detailed exception information: {0}", e);
+                return 1;
+            }
+        }
+
+        /// <summary>
+        /// Munges a message recursively.
+        /// </summary>
+        /// <returns>A new message of the same type as the original message,
+        /// but munged so that all the data is desensitised.</returns>
+        private static IMessage Munge(IMessage message)
+        {
+            IBuilder builder = message.WeakCreateBuilderForType();
+            foreach (var pair in message.AllFields)
+            {
+                if (pair.Key.IsRepeated)
+                {
+                    foreach (object singleValue in (IEnumerable) pair.Value)
+                    {
+                        builder.WeakAddRepeatedField(pair.Key, CheckedMungeValue(pair.Key, singleValue));
+                    }
+                }
+                else
+                {
+                    builder[pair.Key] = CheckedMungeValue(pair.Key, pair.Value);
+                }
+            }
+            IMessage munged = builder.WeakBuild();
+            if (message.SerializedSize != munged.SerializedSize)
+            {
+                Console.WriteLine("Sub message sizes: {0}/{1}", message.SerializedSize, munged.SerializedSize);
+            }
+            return munged;
+        }
+
+        /// <summary>
+        /// Munges a single value and checks that the length ends up the same as it was before.
+        /// </summary>
+        private static object CheckedMungeValue(FieldDescriptor fieldDescriptor, object value)
+        {
+            int currentSize = CodedOutputStream.ComputeFieldSize(fieldDescriptor.FieldType, fieldDescriptor.FieldNumber,
+                                                                 value);
+            object mungedValue = MungeValue(fieldDescriptor, value);
+            int mungedSize = CodedOutputStream.ComputeFieldSize(fieldDescriptor.FieldType, fieldDescriptor.FieldNumber,
+                                                                mungedValue);
+            // Exceptions log more easily than assertions
+            if (currentSize != mungedSize)
+            {
+                throw new Exception("Munged value had wrong size. Field type: " + fieldDescriptor.FieldType
+                                    + "; old value: " + value + "; new value: " + mungedValue);
+            }
+            return mungedValue;
+        }
+
+        /// <summary>
+        /// Munges a single value of the specified field descriptor. (i.e. if the field is
+        /// actually a repeated int, this method receives a single int value to munge, and
+        /// is called multiple times).
+        /// </summary>
+        private static object MungeValue(FieldDescriptor fieldDescriptor, object value)
+        {
+            switch (fieldDescriptor.FieldType)
+            {
+                case FieldType.SInt64:
+                case FieldType.Int64:
+                    return (long) MungeVarint64((ulong) (long) value);
+                case FieldType.UInt64:
+                    return MungeVarint64((ulong) value);
+                case FieldType.SInt32:
+                    return (int) MungeVarint32((uint) (int) value);
+                case FieldType.Int32:
+                    return MungeInt32((int) value);
+                case FieldType.UInt32:
+                    return MungeVarint32((uint) value);
+                case FieldType.Double:
+                    return rng.NextDouble();
+                case FieldType.Float:
+                    return (float) rng.NextDouble();
+                case FieldType.Fixed64:
+                    {
+                        byte[] data = new byte[8];
+                        rng.NextBytes(data);
+                        return BitConverter.ToUInt64(data, 0);
+                    }
+                case FieldType.Fixed32:
+                    {
+                        byte[] data = new byte[4];
+                        rng.NextBytes(data);
+                        return BitConverter.ToUInt32(data, 0);
+                    }
+                case FieldType.Bool:
+                    return rng.Next(2) == 1;
+                case FieldType.String:
+                    return MungeString((string) value);
+                case FieldType.Group:
+                case FieldType.Message:
+                    return Munge((IMessage) value);
+                case FieldType.Bytes:
+                    return MungeByteString((ByteString) value);
+                case FieldType.SFixed64:
+                    {
+                        byte[] data = new byte[8];
+                        rng.NextBytes(data);
+                        return BitConverter.ToInt64(data, 0);
+                    }
+                case FieldType.SFixed32:
+                    {
+                        byte[] data = new byte[4];
+                        rng.NextBytes(data);
+                        return BitConverter.ToInt32(data, 0);
+                    }
+                case FieldType.Enum:
+                    return MungeEnum(fieldDescriptor, (EnumValueDescriptor) value);
+                default:
+                    // TODO(jonskeet): Different exception?
+                    throw new ArgumentException("Invalid field descriptor");
+            }
+        }
+
+        private static object MungeString(string original)
+        {
+            foreach (char c in original)
+            {
+                if (c > 127)
+                {
+                    throw new ArgumentException("Can't handle non-ascii yet");
+                }
+            }
+            char[] chars = new char[original.Length];
+            // Convert to pure ASCII - no control characters.
+            for (int i = 0; i < chars.Length; i++)
+            {
+                chars[i] = (char) rng.Next(32, 127);
+            }
+            return new string(chars);
+        }
+
+        /// <summary>
+        /// Int32 fields are slightly strange - we need to keep the sign the same way it is:
+        /// negative numbers can munge to any other negative number (it'll always take
+        /// 10 bytes) but positive numbers have to stay positive, so we can't use the
+        /// full range of 32 bits.
+        /// </summary>
+        private static int MungeInt32(int value)
+        {
+            if (value < 0)
+            {
+                return rng.Next(int.MinValue, 0);
+            }
+            int length = CodedOutputStream.ComputeRawVarint32Size((uint) value);
+            uint min = length == 1 ? 0 : 1U << ((length - 1)*7);
+            uint max = length == 5 ? int.MaxValue : (1U << (length*7)) - 1;
+            return (int) NextRandomUInt64(min, max);
+        }
+
+        private static uint MungeVarint32(uint original)
+        {
+            int length = CodedOutputStream.ComputeRawVarint32Size(original);
+            uint min = length == 1 ? 0 : 1U << ((length - 1)*7);
+            uint max = length == 5 ? uint.MaxValue : (1U << (length*7)) - 1;
+            return (uint) NextRandomUInt64(min, max);
+        }
+
+        private static ulong MungeVarint64(ulong original)
+        {
+            int length = CodedOutputStream.ComputeRawVarint64Size(original);
+            ulong min = length == 1 ? 0 : 1UL << ((length - 1)*7);
+            ulong max = length == 10 ? ulong.MaxValue : (1UL << (length*7)) - 1;
+            return NextRandomUInt64(min, max);
+        }
+
+        /// <summary>
+        /// Returns a random number in the range [min, max] (both inclusive).
+        /// </summary>    
+        private static ulong NextRandomUInt64(ulong min, ulong max)
+        {
+            if (min > max)
+            {
+                throw new ArgumentException("min must be <= max; min=" + min + "; max = " + max);
+            }
+            ulong range = max - min;
+            // This isn't actually terribly good at very large ranges - but it doesn't really matter for the sake
+            // of this program.
+            return min + (ulong) (range*rng.NextDouble());
+        }
+
+        private static object MungeEnum(FieldDescriptor fieldDescriptor, EnumValueDescriptor original)
+        {
+            // Find all the values which get encoded to the same size as the current value, and pick one at random
+            int originalSize = CodedOutputStream.ComputeRawVarint32Size((uint) original.Number);
+            List<EnumValueDescriptor> sameSizeValues = new List<EnumValueDescriptor>();
+            foreach (EnumValueDescriptor candidate in fieldDescriptor.EnumType.Values)
+            {
+                if (CodedOutputStream.ComputeRawVarint32Size((uint) candidate.Number) == originalSize)
+                {
+                    sameSizeValues.Add(candidate);
+                }
+            }
+            return sameSizeValues[rng.Next(sameSizeValues.Count)];
+        }
+
+        private static object MungeByteString(ByteString byteString)
+        {
+            byte[] data = new byte[byteString.Length];
+            rng.NextBytes(data);
+            return ByteString.CopyFrom(data);
+        }
+    }
+}

+ 30 - 0
csharp/src/ProtoMunge/Properties/AssemblyInfo.cs

@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("ProtoMunge")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtoMunge")]
+[assembly: AssemblyCopyright("Copyright ©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+[assembly: AssemblyFileVersion("2.4.1.555")]

+ 67 - 0
csharp/src/ProtoMunge/ProtoMunge.csproj

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET35</EnvironmentTemplate>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8F09AF72-3327-4FA7-BC09-070B80221AB9}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.ProtoMunge</RootNamespace>
+    <AssemblyName>ProtoMunge</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 3 - 0
csharp/src/ProtoMunge/app.config

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration>

+ 686 - 0
csharp/src/ProtocolBuffers.Serialization/AbstractReader.cs

@@ -0,0 +1,686 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using Google.ProtocolBuffers.Descriptors;
+
+//Disable CS3011: only CLS-compliant members can be abstract
+#pragma warning disable 3011
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Provides a base-class that provides some basic functionality for handling type dispatching
+    /// </summary>
+    public abstract class AbstractReader : ICodedInputStream
+    {
+        private const int DefaultMaxDepth = 64;
+        private int _depth;
+        
+        /// <summary> Constructs a new reader </summary>
+        protected AbstractReader() { MaxDepth = DefaultMaxDepth; }
+
+        /// <summary> Gets or sets the maximum recursion depth allowed </summary>
+        public int MaxDepth { get; set; }
+
+        /// <summary>
+        /// Merges the contents of stream into the provided message builder
+        /// </summary>
+        public TBuilder Merge<TBuilder>(TBuilder builder) where TBuilder : IBuilderLite
+        {
+            return Merge(builder, ExtensionRegistry.Empty);
+        }
+
+        /// <summary>
+        /// Merges the contents of stream into the provided message builder
+        /// </summary>
+        public abstract TBuilder Merge<TBuilder>(TBuilder builder, ExtensionRegistry registry)
+            where TBuilder : IBuilderLite;
+
+        /// <summary>
+        /// Peeks at the next field in the input stream and returns what information is available.
+        /// </summary>
+        /// <remarks>
+        /// This may be called multiple times without actually reading the field.  Only after the field
+        /// is either read, or skipped, should PeekNext return a different value.
+        /// </remarks>
+        protected abstract bool PeekNext(out string field);
+
+        /// <summary>
+        /// Causes the reader to skip past this field
+        /// </summary>
+        protected abstract void Skip();
+
+        /// <summary>
+        /// Returns true if it was able to read a Boolean from the input
+        /// </summary>
+        protected abstract bool Read(ref bool value);
+
+        /// <summary>
+        /// Returns true if it was able to read a Int32 from the input
+        /// </summary>
+        protected abstract bool Read(ref int value);
+
+        /// <summary>
+        /// Returns true if it was able to read a UInt32 from the input
+        /// </summary>
+        protected abstract bool Read(ref uint value);
+
+        /// <summary>
+        /// Returns true if it was able to read a Int64 from the input
+        /// </summary>
+        protected abstract bool Read(ref long value);
+
+        /// <summary>
+        /// Returns true if it was able to read a UInt64 from the input
+        /// </summary>
+        protected abstract bool Read(ref ulong value);
+
+        /// <summary>
+        /// Returns true if it was able to read a Single from the input
+        /// </summary>
+        protected abstract bool Read(ref float value);
+
+        /// <summary>
+        /// Returns true if it was able to read a Double from the input
+        /// </summary>
+        protected abstract bool Read(ref double value);
+
+        /// <summary>
+        /// Returns true if it was able to read a String from the input
+        /// </summary>
+        protected abstract bool Read(ref string value);
+
+        /// <summary>
+        /// Returns true if it was able to read a ByteString from the input
+        /// </summary>
+        protected abstract bool Read(ref ByteString value);
+
+        /// <summary>
+        /// returns true if it was able to read a single value into the value reference.  The value
+        /// stored may be of type System.String, System.Int32, or an IEnumLite from the IEnumLiteMap.
+        /// </summary>
+        protected abstract bool ReadEnum(ref object value);
+
+        /// <summary>
+        /// Merges the input stream into the provided IBuilderLite 
+        /// </summary>
+        protected abstract bool ReadMessage(IBuilderLite builder, ExtensionRegistry registry);
+        
+        /// <summary>
+        /// Reads the root-message preamble specific to this formatter
+        /// </summary>
+        public abstract void ReadMessageStart();
+
+        /// <summary>
+        /// Reads the root-message close specific to this formatter
+        /// </summary>
+        public abstract void ReadMessageEnd();
+
+        /// <summary>
+        /// Merges the input stream into the provided IBuilderLite 
+        /// </summary>
+        public virtual bool ReadGroup(IBuilderLite value, ExtensionRegistry registry)
+        {
+            return ReadMessage(value, registry);
+        }
+
+        /// <summary>
+        /// Cursors through the array elements and stops at the end of the array
+        /// </summary>
+        protected virtual IEnumerable<string> ForeachArrayItem(string field)
+        {
+            string next = field;
+            while (true)
+            {
+                yield return next;
+
+                if (!PeekNext(out next) || next != field)
+                {
+                    break;
+                }
+            }
+        }
+
+        /// <summary>
+        /// Reads an array of T messages
+        /// </summary>
+        public virtual bool ReadMessageArray<T>(string field, ICollection<T> items, IMessageLite messageType,
+                                                ExtensionRegistry registry)
+        {
+            bool success = false;
+            foreach (string next in ForeachArrayItem(field))
+            {
+                IBuilderLite builder = messageType.WeakCreateBuilderForType();
+                if (ReadMessage(builder, registry))
+                {
+                    items.Add((T) builder.WeakBuild());
+                    success |= true;
+                }
+            }
+            return success;
+        }
+
+        /// <summary>
+        /// Reads an array of T messages as a proto-buffer group
+        /// </summary>
+        public virtual bool ReadGroupArray<T>(string field, ICollection<T> items, IMessageLite messageType,
+                                              ExtensionRegistry registry)
+        {
+            bool success = false;
+            foreach (string next in ForeachArrayItem(field))
+            {
+                IBuilderLite builder = messageType.WeakCreateBuilderForType();
+                if (ReadGroup(builder, registry))
+                {
+                    items.Add((T) builder.WeakBuild());
+                    success |= true;
+                }
+            }
+            return success;
+        }
+
+        /// <summary>
+        /// Reads an array of System.Enum type T and adds them to the collection
+        /// </summary>
+        public virtual bool ReadEnumArray(string field, ICollection<object> items)
+        {
+            bool success = false;
+            foreach (string next in ForeachArrayItem(field))
+            {
+                object temp = null;
+                if (ReadEnum(ref temp))
+                {
+                    items.Add(temp);
+                    success |= true;
+                }
+            }
+            return success;
+        }
+
+        /// <summary>
+        /// Reads an array of T, where T is a primitive type defined by FieldType
+        /// </summary>
+        public virtual bool ReadArray<T>(FieldType type, string field, ICollection<T> items)
+        {
+            bool success = false;
+            foreach (string next in ForeachArrayItem(field))
+            {
+                object temp = null;
+                if (ReadField(type, ref temp))
+                {
+                    items.Add((T) temp);
+                    success |= true;
+                }
+            }
+            return success;
+        }
+
+        /// <summary>
+        /// returns true if it was able to read a single primitive value of FieldType into the value reference
+        /// </summary>
+        public virtual bool ReadField(FieldType type, ref object value)
+        {
+            switch (type)
+            {
+                case FieldType.Bool:
+                    {
+                        bool temp = false;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                case FieldType.Int64:
+                case FieldType.SInt64:
+                case FieldType.SFixed64:
+                    {
+                        long temp = 0;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                case FieldType.UInt64:
+                case FieldType.Fixed64:
+                    {
+                        ulong temp = 0;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                case FieldType.Int32:
+                case FieldType.SInt32:
+                case FieldType.SFixed32:
+                    {
+                        int temp = 0;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                case FieldType.UInt32:
+                case FieldType.Fixed32:
+                    {
+                        uint temp = 0;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                case FieldType.Float:
+                    {
+                        float temp = float.NaN;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                case FieldType.Double:
+                    {
+                        double temp = float.NaN;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                case FieldType.String:
+                    {
+                        string temp = null;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                case FieldType.Bytes:
+                    {
+                        ByteString temp = null;
+                        if (Read(ref temp))
+                        {
+                            value = temp;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                        break;
+                    }
+                default:
+                    throw InvalidProtocolBufferException.InvalidTag();
+            }
+            return true;
+        }
+
+        #region ICodedInputStream Members
+
+        bool ICodedInputStream.ReadTag(out uint fieldTag, out string fieldName)
+        {
+            fieldTag = 0;
+            if (PeekNext(out fieldName))
+            {
+                return true;
+            }
+            return false;
+        }
+
+        bool ICodedInputStream.ReadDouble(ref double value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadFloat(ref float value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadUInt64(ref ulong value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadInt64(ref long value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadInt32(ref int value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadFixed64(ref ulong value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadFixed32(ref uint value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadBool(ref bool value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadString(ref string value)
+        {
+            return Read(ref value);
+        }
+
+        void ICodedInputStream.ReadGroup(int fieldNumber, IBuilderLite builder, ExtensionRegistry extensionRegistry)
+        {
+            if (_depth++ > MaxDepth)
+            {
+                throw new RecursionLimitExceededException();
+            }
+            ReadGroup(builder, extensionRegistry);
+            _depth--;
+        }
+
+        void ICodedInputStream.ReadUnknownGroup(int fieldNumber, IBuilderLite builder)
+        {
+            throw new NotSupportedException();
+        }
+
+        void ICodedInputStream.ReadMessage(IBuilderLite builder, ExtensionRegistry extensionRegistry)
+        {
+            if (_depth++ > MaxDepth)
+            {
+                throw new RecursionLimitExceededException();
+            }
+            ReadMessage(builder, extensionRegistry);
+            _depth--;
+        }
+
+        bool ICodedInputStream.ReadBytes(ref ByteString value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadUInt32(ref uint value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadEnum(ref IEnumLite value, out object unknown, IEnumLiteMap mapping)
+        {
+            value = null;
+            unknown = null;
+            if (ReadEnum(ref unknown))
+            {
+                if (unknown is int)
+                {
+                    value = mapping.FindValueByNumber((int) unknown);
+                }
+                else if (unknown is string)
+                {
+                    value = mapping.FindValueByName((string) unknown);
+                }
+                return value != null;
+            }
+            return false;
+        }
+
+        bool ICodedInputStream.ReadEnum<T>(ref T value, out object rawValue)
+        {
+            rawValue = null;
+            if (ReadEnum(ref rawValue))
+            {
+                if (!EnumParser<T>.TryConvert(rawValue, ref value))
+                {
+                    value = default(T);
+                    return false;
+                }
+                return true;
+            }
+            return false;
+        }
+
+        bool ICodedInputStream.ReadSFixed32(ref int value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadSFixed64(ref long value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadSInt32(ref int value)
+        {
+            return Read(ref value);
+        }
+
+        bool ICodedInputStream.ReadSInt64(ref long value)
+        {
+            return Read(ref value);
+        }
+
+        void ICodedInputStream.ReadPrimitiveArray(FieldType fieldType, uint fieldTag, string fieldName,
+                                                  ICollection<object> list)
+        {
+            ReadArray(fieldType, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadEnumArray(uint fieldTag, string fieldName, ICollection<IEnumLite> list,
+                                             out ICollection<object> unknown, IEnumLiteMap mapping)
+        {
+            unknown = null;
+            List<object> array = new List<object>();
+            if (ReadEnumArray(fieldName, array))
+            {
+                foreach (object rawValue in array)
+                {
+                    IEnumLite item = null;
+                    if (rawValue is int)
+                    {
+                        item = mapping.FindValueByNumber((int) rawValue);
+                    }
+                    else if (rawValue is string)
+                    {
+                        item = mapping.FindValueByName((string) rawValue);
+                    }
+
+                    if (item != null)
+                    {
+                        list.Add(item);
+                    }
+                    else
+                    {
+                        if (unknown == null)
+                        {
+                            unknown = new List<object>();
+                        }
+                        unknown.Add(rawValue);
+                    }
+                }
+            }
+        }
+
+        void ICodedInputStream.ReadEnumArray<T>(uint fieldTag, string fieldName, ICollection<T> list,
+                                                out ICollection<object> unknown)
+        {
+            unknown = null;
+            List<object> array = new List<object>();
+            if (ReadEnumArray(fieldName, array))
+            {
+                foreach (object rawValue in array)
+                {
+                    T val = default(T);
+                    if (EnumParser<T>.TryConvert(rawValue, ref val))
+                    {
+                        list.Add(val);
+                    }
+                    else
+                    {
+                        if (unknown == null)
+                        {
+                            unknown = new List<object>();
+                        }
+                        unknown.Add(rawValue);
+                    }
+                }
+            }
+        }
+
+        void ICodedInputStream.ReadMessageArray<T>(uint fieldTag, string fieldName, ICollection<T> list, T messageType,
+                                                   ExtensionRegistry registry)
+        {
+            if (_depth++ > MaxDepth)
+            {
+                throw new RecursionLimitExceededException();
+            }
+            ReadMessageArray(fieldName, list, messageType, registry);
+            _depth--;
+        }
+
+        void ICodedInputStream.ReadGroupArray<T>(uint fieldTag, string fieldName, ICollection<T> list, T messageType,
+                                                 ExtensionRegistry registry)
+        {
+            if (_depth++ > MaxDepth)
+            {
+                throw new RecursionLimitExceededException();
+            }
+            ReadGroupArray(fieldName, list, messageType, registry);
+            _depth--;
+        }
+
+        bool ICodedInputStream.ReadPrimitiveField(FieldType fieldType, ref object value)
+        {
+            return ReadField(fieldType, ref value);
+        }
+
+        bool ICodedInputStream.IsAtEnd
+        {
+            get
+            {
+                string next;
+                return PeekNext(out next) == false;
+            }
+        }
+
+        bool ICodedInputStream.SkipField()
+        {
+            Skip();
+            return true;
+        }
+
+        void ICodedInputStream.ReadStringArray(uint fieldTag, string fieldName, ICollection<string> list)
+        {
+            ReadArray(FieldType.String, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadBytesArray(uint fieldTag, string fieldName, ICollection<ByteString> list)
+        {
+            ReadArray(FieldType.Bytes, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadBoolArray(uint fieldTag, string fieldName, ICollection<bool> list)
+        {
+            ReadArray(FieldType.Bool, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadInt32Array(uint fieldTag, string fieldName, ICollection<int> list)
+        {
+            ReadArray(FieldType.Int32, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadSInt32Array(uint fieldTag, string fieldName, ICollection<int> list)
+        {
+            ReadArray(FieldType.SInt32, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadUInt32Array(uint fieldTag, string fieldName, ICollection<uint> list)
+        {
+            ReadArray(FieldType.UInt32, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadFixed32Array(uint fieldTag, string fieldName, ICollection<uint> list)
+        {
+            ReadArray(FieldType.Fixed32, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadSFixed32Array(uint fieldTag, string fieldName, ICollection<int> list)
+        {
+            ReadArray(FieldType.SFixed32, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadInt64Array(uint fieldTag, string fieldName, ICollection<long> list)
+        {
+            ReadArray(FieldType.Int64, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadSInt64Array(uint fieldTag, string fieldName, ICollection<long> list)
+        {
+            ReadArray(FieldType.SInt64, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadUInt64Array(uint fieldTag, string fieldName, ICollection<ulong> list)
+        {
+            ReadArray(FieldType.UInt64, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadFixed64Array(uint fieldTag, string fieldName, ICollection<ulong> list)
+        {
+            ReadArray(FieldType.Fixed64, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadSFixed64Array(uint fieldTag, string fieldName, ICollection<long> list)
+        {
+            ReadArray(FieldType.SFixed64, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadDoubleArray(uint fieldTag, string fieldName, ICollection<double> list)
+        {
+            ReadArray(FieldType.Double, fieldName, list);
+        }
+
+        void ICodedInputStream.ReadFloatArray(uint fieldTag, string fieldName, ICollection<float> list)
+        {
+            ReadArray(FieldType.Float, fieldName, list);
+        }
+
+        #endregion
+    }
+}

+ 175 - 0
csharp/src/ProtocolBuffers.Serialization/AbstractTextReader.cs

@@ -0,0 +1,175 @@
+using System;
+using System.Globalization;
+using System.Xml;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Provides a base class for text-parsing readers
+    /// </summary>
+    public abstract class AbstractTextReader : AbstractReader
+    {
+        /// <summary> Constructs a new reader </summary>
+        protected AbstractTextReader() { }
+
+        /// <summary>
+        /// Reads a typed field as a string
+        /// </summary>
+        protected abstract bool ReadAsText(ref string textValue, Type type);
+
+        /// <summary>
+        /// Returns true if it was able to read a String from the input
+        /// </summary>
+        protected override bool Read(ref string value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(string)))
+            {
+                value = text;
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Boolean from the input
+        /// </summary>
+        protected override bool Read(ref bool value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(bool)))
+            {
+                value = XmlConvert.ToBoolean(text);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Int32 from the input
+        /// </summary>
+        protected override bool Read(ref int value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(int)))
+            {
+                value = XmlConvert.ToInt32(text);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a UInt32 from the input
+        /// </summary>
+        protected override bool Read(ref uint value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(uint)))
+            {
+                value = XmlConvert.ToUInt32(text);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Int64 from the input
+        /// </summary>
+        protected override bool Read(ref long value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(long)))
+            {
+                value = XmlConvert.ToInt64(text);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a UInt64 from the input
+        /// </summary>
+        protected override bool Read(ref ulong value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(ulong)))
+            {
+                value = XmlConvert.ToUInt64(text);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Single from the input
+        /// </summary>
+        protected override bool Read(ref float value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(float)))
+            {
+                value = XmlConvert.ToSingle(text);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Double from the input
+        /// </summary>
+        protected override bool Read(ref double value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(double)))
+            {
+                value = XmlConvert.ToDouble(text);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Provides decoding of bytes read from the input stream
+        /// </summary>
+        protected virtual ByteString DecodeBytes(string bytes)
+        {
+            return ByteString.FromBase64(bytes);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a ByteString from the input
+        /// </summary>
+        protected override bool Read(ref ByteString value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(ByteString)))
+            {
+                value = DecodeBytes(text);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// returns true if it was able to read a single value into the value reference.  The value
+        /// stored may be of type System.String, System.Int32, or an IEnumLite from the IEnumLiteMap.
+        /// </summary>
+        protected override bool ReadEnum(ref object value)
+        {
+            string text = null;
+            if (ReadAsText(ref text, typeof(Enum)))
+            {
+                int number;
+                if (FrameworkPortability.TryParseInt32(text, NumberStyles.Integer, FrameworkPortability.InvariantCulture, out number))
+                {
+                    value = number;
+                    return true;
+                }
+                value = text;
+                return true;
+            }
+            return false;
+        }
+    }
+}

+ 104 - 0
csharp/src/ProtocolBuffers.Serialization/AbstractTextWriter.cs

@@ -0,0 +1,104 @@
+using System;
+using System.Xml;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Provides a base class for text writers
+    /// </summary>
+    public abstract class AbstractTextWriter : AbstractWriter
+    {
+        /// <summary>
+        /// Encodes raw bytes to be written to the stream
+        /// </summary>
+        protected virtual string EncodeBytes(ByteString bytes)
+        {
+            return bytes.ToBase64();
+        }
+
+        /// <summary>
+        /// Writes a typed field as a text value
+        /// </summary>
+        protected abstract void WriteAsText(string field, string textValue, object typedValue);
+
+        /// <summary>
+        /// Writes a String value
+        /// </summary>
+        protected override void Write(string field, string value)
+        {
+            WriteAsText(field, value, value);
+        }
+
+        /// <summary>
+        /// Writes a Boolean value
+        /// </summary>
+        protected override void Write(string field, bool value)
+        {
+            WriteAsText(field, XmlConvert.ToString(value), value);
+        }
+
+        /// <summary>
+        /// Writes a Int32 value
+        /// </summary>
+        protected override void Write(string field, int value)
+        {
+            WriteAsText(field, XmlConvert.ToString(value), value);
+        }
+
+        /// <summary>
+        /// Writes a UInt32 value
+        /// </summary>
+        protected override void Write(string field, uint value)
+        {
+            WriteAsText(field, XmlConvert.ToString(value), value);
+        }
+
+        /// <summary>
+        /// Writes a Int64 value
+        /// </summary>
+        protected override void Write(string field, long value)
+        {
+            WriteAsText(field, XmlConvert.ToString(value), value);
+        }
+
+        /// <summary>
+        /// Writes a UInt64 value
+        /// </summary>
+        protected override void Write(string field, ulong value)
+        {
+            WriteAsText(field, XmlConvert.ToString(value), value);
+        }
+
+        /// <summary>
+        /// Writes a Single value
+        /// </summary>
+        protected override void Write(string field, float value)
+        {
+            WriteAsText(field, XmlConvert.ToString(value), value);
+        }
+
+        /// <summary>
+        /// Writes a Double value
+        /// </summary>
+        protected override void Write(string field, double value)
+        {
+            WriteAsText(field, XmlConvert.ToString(value), value);
+        }
+
+        /// <summary>
+        /// Writes a set of bytes
+        /// </summary>
+        protected override void Write(string field, ByteString value)
+        {
+            WriteAsText(field, EncodeBytes(value), value);
+        }
+
+        /// <summary>
+        /// Writes a System.Enum by the numeric and textual value
+        /// </summary>
+        protected override void WriteEnum(string field, int number, string name)
+        {
+            WriteAsText(field, name, number);
+        }
+    }
+}

+ 503 - 0
csharp/src/ProtocolBuffers.Serialization/AbstractWriter.cs

@@ -0,0 +1,503 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Globalization;
+using Google.ProtocolBuffers.Descriptors;
+
+//Disable CS3011: only CLS-compliant members can be abstract
+#pragma warning disable 3011
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Provides a base class for writers that performs some basic type dispatching
+    /// </summary>
+    public abstract class AbstractWriter : ICodedOutputStream
+    {
+        /// <summary>
+        /// Completes any pending write operations
+        /// </summary>
+        public virtual void Flush()
+        {
+        }
+
+        /// <summary>
+        /// Writes the message to the the formatted stream.
+        /// </summary>
+        public abstract void WriteMessage(IMessageLite message);
+
+        /// <summary>
+        /// Used to write any nessary root-message preamble. After this call you can call 
+        /// IMessageLite.MergeTo(...) and complete the message with a call to WriteMessageEnd().
+        /// These three calls are identical to just calling WriteMessage(message);
+        /// </summary>
+        /// <example>
+        /// AbstractWriter writer;
+        /// writer.WriteMessageStart();
+        /// message.WriteTo(writer);
+        /// writer.WriteMessageEnd();
+        /// // ... or, but not both ...
+        /// writer.WriteMessage(message);
+        /// </example>
+        public abstract void WriteMessageStart();
+
+        /// <summary>
+        /// Used to complete a root-message previously started with a call to WriteMessageStart()
+        /// </summary>
+        public abstract void WriteMessageEnd();
+
+        /// <summary>
+        /// Writes a Boolean value
+        /// </summary>
+        protected abstract void Write(string field, Boolean value);
+
+        /// <summary>
+        /// Writes a Int32 value
+        /// </summary>
+        protected abstract void Write(string field, Int32 value);
+
+        /// <summary>
+        /// Writes a UInt32 value
+        /// </summary>
+        protected abstract void Write(string field, UInt32 value);
+
+        /// <summary>
+        /// Writes a Int64 value
+        /// </summary>
+        protected abstract void Write(string field, Int64 value);
+
+        /// <summary>
+        /// Writes a UInt64 value
+        /// </summary>
+        protected abstract void Write(string field, UInt64 value);
+
+        /// <summary>
+        /// Writes a Single value
+        /// </summary>
+        protected abstract void Write(string field, Single value);
+
+        /// <summary>
+        /// Writes a Double value
+        /// </summary>
+        protected abstract void Write(string field, Double value);
+
+        /// <summary>
+        /// Writes a String value
+        /// </summary>
+        protected abstract void Write(string field, String value);
+
+        /// <summary>
+        /// Writes a set of bytes
+        /// </summary>
+        protected abstract void Write(string field, ByteString value);
+
+        /// <summary>
+        /// Writes a message or group as a field
+        /// </summary>
+        protected abstract void WriteMessageOrGroup(string field, IMessageLite message);
+
+        /// <summary>
+        /// Writes a System.Enum by the numeric and textual value
+        /// </summary>
+        protected abstract void WriteEnum(string field, int number, string name);
+
+        /// <summary>
+        /// Writes a field of the type determined by field.FieldType
+        /// </summary>
+        protected virtual void WriteField(FieldType fieldType, string field, object value)
+        {
+            switch (fieldType)
+            {
+                case FieldType.Bool:
+                    Write(field, (bool) value);
+                    break;
+                case FieldType.Int64:
+                case FieldType.SInt64:
+                case FieldType.SFixed64:
+                    Write(field, (long) value);
+                    break;
+                case FieldType.UInt64:
+                case FieldType.Fixed64:
+                    Write(field, (ulong) value);
+                    break;
+                case FieldType.Int32:
+                case FieldType.SInt32:
+                case FieldType.SFixed32:
+                    Write(field, (int) value);
+                    break;
+                case FieldType.UInt32:
+                case FieldType.Fixed32:
+                    Write(field, (uint) value);
+                    break;
+                case FieldType.Float:
+                    Write(field, (float) value);
+                    break;
+                case FieldType.Double:
+                    Write(field, (double) value);
+                    break;
+                case FieldType.String:
+                    Write(field, (string) value);
+                    break;
+                case FieldType.Bytes:
+                    Write(field, (ByteString) value);
+                    break;
+                case FieldType.Group:
+                    WriteMessageOrGroup(field, (IMessageLite) value);
+                    break;
+                case FieldType.Message:
+                    WriteMessageOrGroup(field, (IMessageLite) value);
+                    break;
+                case FieldType.Enum:
+                    {
+                        if (value is IEnumLite)
+                        {
+                            WriteEnum(field, ((IEnumLite) value).Number, ((IEnumLite) value).Name);
+                        }
+                        else if (value is IConvertible)
+                        {
+                            WriteEnum(field, ((IConvertible)value).ToInt32(FrameworkPortability.InvariantCulture),
+                                      ((IConvertible)value).ToString(FrameworkPortability.InvariantCulture));
+                        }
+                        else
+                        {
+                            throw new ArgumentException("Expected an Enum type for field " + field);
+                        }
+                        break;
+                    }
+                default:
+                    throw InvalidProtocolBufferException.InvalidTag();
+            }
+        }
+
+        /// <summary>
+        /// Writes an array of field values
+        /// </summary>
+        protected virtual void WriteArray(FieldType fieldType, string field, IEnumerable items)
+        {
+            foreach (object obj in items)
+            {
+                WriteField(fieldType, field, obj);
+            }
+        }
+
+        /// <summary>
+        /// Writes a numeric unknown field of wire type: Fixed32, Fixed64, or Variant
+        /// </summary>
+        protected virtual void WriteUnknown(WireFormat.WireType wireType, int fieldNumber, ulong value)
+        {
+        }
+
+        /// <summary>
+        /// Writes an unknown field, Expect WireType of GroupStart or LengthPrefix
+        /// </summary>
+        protected virtual void WriteUnknown(WireFormat.WireType wireType, int fieldNumber, ByteString value)
+        {
+        }
+
+        #region ICodedOutputStream Members
+
+        void ICodedOutputStream.WriteUnknownGroup(int fieldNumber, IMessageLite value)
+        {
+        }
+
+        void ICodedOutputStream.WriteUnknownBytes(int fieldNumber, ByteString value)
+        {
+        }
+
+        void ICodedOutputStream.WriteUnknownField(int fieldNumber, WireFormat.WireType type, ulong value)
+        {
+        }
+
+        void ICodedOutputStream.WriteMessageSetExtension(int fieldNumber, string fieldName, IMessageLite value)
+        {
+        }
+
+        void ICodedOutputStream.WriteMessageSetExtension(int fieldNumber, string fieldName, ByteString value)
+        {
+        }
+
+        void ICodedOutputStream.WriteField(FieldType fieldType, int fieldNumber, string fieldName, object value)
+        {
+            WriteField(fieldType, fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteDouble(int fieldNumber, string fieldName, double value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteFloat(int fieldNumber, string fieldName, float value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteUInt64(int fieldNumber, string fieldName, ulong value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteInt64(int fieldNumber, string fieldName, long value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteInt32(int fieldNumber, string fieldName, int value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteFixed64(int fieldNumber, string fieldName, ulong value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteFixed32(int fieldNumber, string fieldName, uint value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteBool(int fieldNumber, string fieldName, bool value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteString(int fieldNumber, string fieldName, string value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteGroup(int fieldNumber, string fieldName, IMessageLite value)
+        {
+            WriteMessageOrGroup(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteMessage(int fieldNumber, string fieldName, IMessageLite value)
+        {
+            WriteMessageOrGroup(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteBytes(int fieldNumber, string fieldName, ByteString value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteUInt32(int fieldNumber, string fieldName, uint value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteEnum(int fieldNumber, string fieldName, int value, object rawValue)
+        {
+            WriteEnum(fieldName, value, rawValue.ToString());
+        }
+
+        void ICodedOutputStream.WriteSFixed32(int fieldNumber, string fieldName, int value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteSFixed64(int fieldNumber, string fieldName, long value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteSInt32(int fieldNumber, string fieldName, int value)
+        {
+            Write(fieldName, value);
+        }
+
+        void ICodedOutputStream.WriteSInt64(int fieldNumber, string fieldName, long value)
+        {
+            Write(fieldName, value);
+        }
+
+
+        void ICodedOutputStream.WriteArray(FieldType fieldType, int fieldNumber, string fieldName, IEnumerable list)
+        {
+            WriteArray(fieldType, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteGroupArray<T>(int fieldNumber, string fieldName, IEnumerable<T> list)
+        {
+            WriteArray(FieldType.Group, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteMessageArray<T>(int fieldNumber, string fieldName, IEnumerable<T> list)
+        {
+            WriteArray(FieldType.Message, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteStringArray(int fieldNumber, string fieldName, IEnumerable<string> list)
+        {
+            WriteArray(FieldType.String, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteBytesArray(int fieldNumber, string fieldName, IEnumerable<ByteString> list)
+        {
+            WriteArray(FieldType.Bytes, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteBoolArray(int fieldNumber, string fieldName, IEnumerable<bool> list)
+        {
+            WriteArray(FieldType.Bool, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteInt32Array(int fieldNumber, string fieldName, IEnumerable<int> list)
+        {
+            WriteArray(FieldType.Int32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteSInt32Array(int fieldNumber, string fieldName, IEnumerable<int> list)
+        {
+            WriteArray(FieldType.SInt32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteUInt32Array(int fieldNumber, string fieldName, IEnumerable<uint> list)
+        {
+            WriteArray(FieldType.UInt32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteFixed32Array(int fieldNumber, string fieldName, IEnumerable<uint> list)
+        {
+            WriteArray(FieldType.Fixed32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteSFixed32Array(int fieldNumber, string fieldName, IEnumerable<int> list)
+        {
+            WriteArray(FieldType.SFixed32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteInt64Array(int fieldNumber, string fieldName, IEnumerable<long> list)
+        {
+            WriteArray(FieldType.Int64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteSInt64Array(int fieldNumber, string fieldName, IEnumerable<long> list)
+        {
+            WriteArray(FieldType.SInt64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteUInt64Array(int fieldNumber, string fieldName, IEnumerable<ulong> list)
+        {
+            WriteArray(FieldType.UInt64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteFixed64Array(int fieldNumber, string fieldName, IEnumerable<ulong> list)
+        {
+            WriteArray(FieldType.Fixed64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteSFixed64Array(int fieldNumber, string fieldName, IEnumerable<long> list)
+        {
+            WriteArray(FieldType.SFixed64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteDoubleArray(int fieldNumber, string fieldName, IEnumerable<double> list)
+        {
+            WriteArray(FieldType.Double, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteFloatArray(int fieldNumber, string fieldName, IEnumerable<float> list)
+        {
+            WriteArray(FieldType.Float, fieldName, list);
+        }
+
+        void ICodedOutputStream.WriteEnumArray<T>(int fieldNumber, string fieldName, IEnumerable<T> list)
+        {
+            WriteArray(FieldType.Enum, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedArray(FieldType fieldType, int fieldNumber, string fieldName,
+                                                 IEnumerable list)
+        {
+            WriteArray(fieldType, fieldName, list);
+        }
+
+
+        void ICodedOutputStream.WritePackedBoolArray(int fieldNumber, string fieldName, int computedSize,
+                                                     IEnumerable<bool> list)
+        {
+            WriteArray(FieldType.Bool, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedInt32Array(int fieldNumber, string fieldName, int computedSize,
+                                                      IEnumerable<int> list)
+        {
+            WriteArray(FieldType.Int32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedSInt32Array(int fieldNumber, string fieldName, int computedSize,
+                                                       IEnumerable<int> list)
+        {
+            WriteArray(FieldType.SInt32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedUInt32Array(int fieldNumber, string fieldName, int computedSize,
+                                                       IEnumerable<uint> list)
+        {
+            WriteArray(FieldType.UInt32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedFixed32Array(int fieldNumber, string fieldName, int computedSize,
+                                                        IEnumerable<uint> list)
+        {
+            WriteArray(FieldType.Fixed32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedSFixed32Array(int fieldNumber, string fieldName, int computedSize,
+                                                         IEnumerable<int> list)
+        {
+            WriteArray(FieldType.SFixed32, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedInt64Array(int fieldNumber, string fieldName, int computedSize,
+                                                      IEnumerable<long> list)
+        {
+            WriteArray(FieldType.Int64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedSInt64Array(int fieldNumber, string fieldName, int computedSize,
+                                                       IEnumerable<long> list)
+        {
+            WriteArray(FieldType.SInt64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedUInt64Array(int fieldNumber, string fieldName, int computedSize,
+                                                       IEnumerable<ulong> list)
+        {
+            WriteArray(FieldType.UInt64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedFixed64Array(int fieldNumber, string fieldName, int computedSize,
+                                                        IEnumerable<ulong> list)
+        {
+            WriteArray(FieldType.Fixed64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedSFixed64Array(int fieldNumber, string fieldName, int computedSize,
+                                                         IEnumerable<long> list)
+        {
+            WriteArray(FieldType.SFixed64, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedDoubleArray(int fieldNumber, string fieldName, int computedSize,
+                                                       IEnumerable<double> list)
+        {
+            WriteArray(FieldType.Double, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedFloatArray(int fieldNumber, string fieldName, int computedSize,
+                                                      IEnumerable<float> list)
+        {
+            WriteArray(FieldType.Float, fieldName, list);
+        }
+
+        void ICodedOutputStream.WritePackedEnumArray<T>(int fieldNumber, string fieldName, int computedSize,
+                                                        IEnumerable<T> list)
+        {
+            WriteArray(FieldType.Enum, fieldName, list);
+        }
+
+        #endregion
+    }
+}

+ 265 - 0
csharp/src/ProtocolBuffers.Serialization/DictionaryReader.cs

@@ -0,0 +1,265 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Allows reading messages from a name/value dictionary
+    /// </summary>
+    public class DictionaryReader : AbstractReader
+    {
+        private readonly IEnumerator<KeyValuePair<string, object>> _input;
+        private bool _ready;
+
+        /// <summary>
+        /// Creates a dictionary reader from an enumeration of KeyValuePair data, like an IDictionary
+        /// </summary>
+        public DictionaryReader(IEnumerable<KeyValuePair<string, object>> input)
+        {
+            _input = input.GetEnumerator();
+            _ready = _input.MoveNext();
+        }
+
+        /// <summary>
+        /// No-op
+        /// </summary>
+        public override void ReadMessageStart()
+        { }
+
+        /// <summary>
+        /// No-op
+        /// </summary>
+        public override void ReadMessageEnd()
+        { }
+
+        /// <summary>
+        /// Merges the contents of stream into the provided message builder
+        /// </summary>
+        public override TBuilder Merge<TBuilder>(TBuilder builder, ExtensionRegistry registry)
+        {
+            builder.WeakMergeFrom(this, registry);
+            return builder;
+        }
+
+        /// <summary>
+        /// Peeks at the next field in the input stream and returns what information is available.
+        /// </summary>
+        /// <remarks>
+        /// This may be called multiple times without actually reading the field.  Only after the field
+        /// is either read, or skipped, should PeekNext return a different value.
+        /// </remarks>
+        protected override bool PeekNext(out string field)
+        {
+            field = _ready ? _input.Current.Key : null;
+            return _ready;
+        }
+
+        /// <summary>
+        /// Causes the reader to skip past this field
+        /// </summary>
+        protected override void Skip()
+        {
+            _ready = _input.MoveNext();
+        }
+
+        private bool GetValue<T>(ref T value)
+        {
+            if (!_ready)
+            {
+                return false;
+            }
+
+            object obj = _input.Current.Value;
+            if (obj is T)
+            {
+                value = (T) obj;
+            }
+            else
+            {
+                try
+                {
+                    if (obj is IConvertible)
+                    {
+                        value = (T)Convert.ChangeType(obj, typeof(T), FrameworkPortability.InvariantCulture);
+                    }
+                    else
+                    {
+                        value = (T) obj;
+                    }
+                }
+                catch
+                {
+                    _ready = _input.MoveNext();
+                    return false;
+                }
+            }
+            _ready = _input.MoveNext();
+            return true;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Boolean from the input
+        /// </summary>
+        protected override bool Read(ref bool value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Int32 from the input
+        /// </summary>
+        protected override bool Read(ref int value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a UInt32 from the input
+        /// </summary>
+        protected override bool Read(ref uint value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Int64 from the input
+        /// </summary>
+        protected override bool Read(ref long value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a UInt64 from the input
+        /// </summary>
+        protected override bool Read(ref ulong value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Single from the input
+        /// </summary>
+        protected override bool Read(ref float value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a Double from the input
+        /// </summary>
+        protected override bool Read(ref double value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a String from the input
+        /// </summary>
+        protected override bool Read(ref string value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a ByteString from the input
+        /// </summary>
+        protected override bool Read(ref ByteString value)
+        {
+            byte[] rawbytes = null;
+            if (GetValue(ref rawbytes))
+            {
+                value = ByteString.CopyFrom(rawbytes);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// returns true if it was able to read a single value into the value reference.  The value
+        /// stored may be of type System.String, System.Int32, or an IEnumLite from the IEnumLiteMap.
+        /// </summary>
+        protected override bool ReadEnum(ref object value)
+        {
+            return GetValue(ref value);
+        }
+
+        /// <summary>
+        /// Merges the input stream into the provided IBuilderLite 
+        /// </summary>
+        protected override bool ReadMessage(IBuilderLite builder, ExtensionRegistry registry)
+        {
+            IDictionary<string, object> values = null;
+            if (GetValue(ref values))
+            {
+                new DictionaryReader(values).Merge(builder, registry);
+                return true;
+            }
+            return false;
+        }
+
+        public override bool ReadArray<T>(FieldType type, string field, ICollection<T> items)
+        {
+            object[] array = null;
+            if (GetValue(ref array))
+            {
+                if (typeof(T) == typeof(ByteString))
+                {
+                    ICollection<ByteString> output = (ICollection<ByteString>) items;
+                    foreach (byte[] item in array)
+                    {
+                        output.Add(ByteString.CopyFrom(item));
+                    }
+                }
+                else
+                {
+                    foreach (T item in array)
+                    {
+                        items.Add(item);
+                    }
+                }
+                return true;
+            }
+            return false;
+        }
+
+        public override bool ReadEnumArray(string field, ICollection<object> items)
+        {
+            object[] array = null;
+            if (GetValue(ref array))
+            {
+                foreach (object item in array)
+                {
+                    items.Add(item);
+                }
+                return true;
+            }
+            return false;
+        }
+
+        public override bool ReadMessageArray<T>(string field, ICollection<T> items, IMessageLite messageType,
+                                                 ExtensionRegistry registry)
+        {
+            object[] array = null;
+            if (GetValue(ref array))
+            {
+                foreach (IDictionary<string, object> item in array)
+                {
+                    IBuilderLite builder = messageType.WeakCreateBuilderForType();
+                    new DictionaryReader(item).Merge(builder);
+                    items.Add((T) builder.WeakBuild());
+                }
+                return true;
+            }
+            return false;
+        }
+
+        public override bool ReadGroupArray<T>(string field, ICollection<T> items, IMessageLite messageType,
+                                               ExtensionRegistry registry)
+        {
+            return ReadMessageArray(field, items, messageType, registry);
+        }
+    }
+}

+ 200 - 0
csharp/src/ProtocolBuffers.Serialization/DictionaryWriter.cs

@@ -0,0 +1,200 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Allows writing messages to a name/value dictionary
+    /// </summary>
+    public class DictionaryWriter : AbstractWriter
+    {
+        private readonly IDictionary<string, object> _output;
+
+        /// <summary>
+        /// Constructs a writer using a new dictionary
+        /// </summary>
+        public DictionaryWriter()
+            : this(new Dictionary<string, object>(StringComparer.Ordinal))
+        {
+        }
+
+        /// <summary>
+        /// Constructs a writer using an existing dictionary
+        /// </summary>
+        public DictionaryWriter(IDictionary<string, object> output)
+        {
+            ThrowHelper.ThrowIfNull(output, "output");
+            _output = output;
+        }
+
+        /// <summary>
+        /// Creates the dictionary instance for a child message.
+        /// </summary>
+        protected virtual DictionaryWriter Create()
+        {
+            return new DictionaryWriter();
+        }
+
+        /// <summary>
+        /// Accesses the dictionary that is backing this writer
+        /// </summary>
+        public IDictionary<string, object> ToDictionary()
+        {
+            return _output;
+        }
+
+        /// <summary>
+        /// Writes the message to the the formatted stream.
+        /// </summary>
+        public override void WriteMessage(IMessageLite message)
+        {
+            message.WriteTo(this);
+        }
+
+
+        /// <summary>
+        /// No-op
+        /// </summary>
+        public override void WriteMessageStart()
+        { }
+
+        /// <summary>
+        /// No-op
+        /// </summary>
+        public override void WriteMessageEnd()
+        { }
+
+        /// <summary>
+        /// Writes a Boolean value
+        /// </summary>
+        protected override void Write(string field, bool value)
+        {
+            _output[field] = value;
+        }
+
+        /// <summary>
+        /// Writes a Int32 value
+        /// </summary>
+        protected override void Write(string field, int value)
+        {
+            _output[field] = value;
+        }
+
+        /// <summary>
+        /// Writes a UInt32 value
+        /// </summary>
+        protected override void Write(string field, uint value)
+        {
+            _output[field] = value;
+        }
+
+        /// <summary>
+        /// Writes a Int64 value
+        /// </summary>
+        protected override void Write(string field, long value)
+        {
+            _output[field] = value;
+        }
+
+        /// <summary>
+        /// Writes a UInt64 value
+        /// </summary>
+        protected override void Write(string field, ulong value)
+        {
+            _output[field] = value;
+        }
+
+        /// <summary>
+        /// Writes a Single value
+        /// </summary>
+        protected override void Write(string field, float value)
+        {
+            _output[field] = value;
+        }
+
+        /// <summary>
+        /// Writes a Double value
+        /// </summary>
+        protected override void Write(string field, double value)
+        {
+            _output[field] = value;
+        }
+
+        /// <summary>
+        /// Writes a String value
+        /// </summary>
+        protected override void Write(string field, string value)
+        {
+            _output[field] = value;
+        }
+
+        /// <summary>
+        /// Writes a set of bytes
+        /// </summary>
+        protected override void Write(string field, ByteString value)
+        {
+            _output[field] = value.ToByteArray();
+        }
+
+        /// <summary>
+        /// Writes a message or group as a field
+        /// </summary>
+        protected override void WriteMessageOrGroup(string field, IMessageLite message)
+        {
+            DictionaryWriter writer = Create();
+            writer.WriteMessage(message);
+
+            _output[field] = writer.ToDictionary();
+        }
+
+        /// <summary>
+        /// Writes a System.Enum by the numeric and textual value
+        /// </summary>
+        protected override void WriteEnum(string field, int number, string name)
+        {
+            _output[field] = number;
+        }
+
+        /// <summary>
+        /// Writes an array of field values
+        /// </summary>
+        protected override void WriteArray(FieldType fieldType, string field, IEnumerable items)
+        {
+            List<object> objects = new List<object>();
+            foreach (object o in items)
+            {
+                switch (fieldType)
+                {
+                    case FieldType.Group:
+                    case FieldType.Message:
+                        {
+                            DictionaryWriter writer = Create();
+                            writer.WriteMessage((IMessageLite) o);
+                            objects.Add(writer.ToDictionary());
+                        }
+                        break;
+                    case FieldType.Bytes:
+                        objects.Add(((ByteString) o).ToByteArray());
+                        break;
+                    case FieldType.Enum:
+                        if (o is IEnumLite)
+                        {
+                            objects.Add(((IEnumLite) o).Number);
+                        }
+                        else
+                        {
+                            objects.Add((int) o);
+                        }
+                        break;
+                    default:
+                        objects.Add(o);
+                        break;
+                }
+            }
+
+            _output[field] = objects.ToArray();
+        }
+    }
+}

+ 185 - 0
csharp/src/ProtocolBuffers.Serialization/Extensions.cs

@@ -0,0 +1,185 @@
+using System;
+using System.Text;
+using System.IO;
+using System.Xml;
+using Google.ProtocolBuffers.Serialization;
+using Google.ProtocolBuffers.Serialization.Http;
+
+namespace Google.ProtocolBuffers
+{
+    /// <summary>
+    /// Extension methods for using serializers on instances of IMessageLite/IBuilderLite
+    /// </summary>
+    public static class Extensions
+    {
+        #region IMessageLite Extension
+        /// <summary>
+        /// Serializes the message to JSON text.  This is a trivial wrapper
+        /// around Serialization.JsonFormatWriter.WriteMessage.
+        /// </summary>
+        public static string ToJson(
+#if !NOEXTENSIONS
+            this
+#endif
+            IMessageLite message)
+        {
+            JsonFormatWriter w = JsonFormatWriter.CreateInstance();
+            w.WriteMessage(message);
+            return w.ToString();
+        }
+        /// <summary>
+        /// Serializes the message to XML text.  This is a trivial wrapper
+        /// around Serialization.XmlFormatWriter.WriteMessage.
+        /// </summary>
+        public static string ToXml(
+#if !NOEXTENSIONS
+            this
+#endif
+            IMessageLite message)
+        {
+            StringWriter w = new StringWriter(new StringBuilder(4096));
+            XmlFormatWriter.CreateInstance(w).WriteMessage(message);
+            return w.ToString();
+        }
+        /// <summary>
+        /// Serializes the message to XML text using the element name provided.
+        /// This is a trivial wrapper around Serialization.XmlFormatWriter.WriteMessage.
+        /// </summary>
+        public static string ToXml(
+#if !NOEXTENSIONS
+            this
+#endif
+            IMessageLite message, string rootElementName)
+        {
+            StringWriter w = new StringWriter(new StringBuilder(4096));
+            XmlFormatWriter.CreateInstance(w).WriteMessage(rootElementName, message);
+            return w.ToString();
+        }
+
+        /// <summary>
+        /// Writes the message instance to the stream using the content type provided
+        /// </summary>
+        /// <param name="message">An instance of a message</param>
+        /// <param name="options">Options specific to writing this message and/or content type</param>
+        /// <param name="contentType">The mime type of the content to be written</param>
+        /// <param name="output">The stream to write the message to</param>
+        public static void WriteTo(
+#if !NOEXTENSIONS
+            this
+#endif
+            IMessageLite message, MessageFormatOptions options, string contentType, Stream output)
+        {
+            ICodedOutputStream codedOutput = MessageFormatFactory.CreateOutputStream(options, contentType, output);
+
+            // Output the appropriate message preamble
+            codedOutput.WriteMessageStart();
+
+            // Write the message content to the output
+            message.WriteTo(codedOutput);
+
+            // Write the closing message fragment
+            codedOutput.WriteMessageEnd();
+            codedOutput.Flush();
+        }
+
+        #endregion
+        #region IBuilderLite Extensions
+        /// <summary>
+        /// Merges a JSON object into this builder and returns
+        /// </summary>
+        public static TBuilder MergeFromJson<TBuilder>(
+#if !NOEXTENSIONS
+            this
+#endif
+            TBuilder builder, string jsonText) where TBuilder : IBuilderLite
+        {
+            return JsonFormatReader.CreateInstance(jsonText)
+                .Merge(builder);
+        }
+        /// <summary>
+        /// Merges a JSON object into this builder and returns
+        /// </summary>
+        public static TBuilder MergeFromJson<TBuilder>(
+#if !NOEXTENSIONS
+            this
+#endif
+            TBuilder builder, TextReader reader) where TBuilder : IBuilderLite
+        {
+            return MergeFromJson(builder, reader, ExtensionRegistry.Empty);
+        }
+        /// <summary>
+        /// Merges a JSON object into this builder using the extensions provided and returns
+        /// </summary>
+        public static TBuilder MergeFromJson<TBuilder>(
+#if !NOEXTENSIONS
+            this
+#endif
+            TBuilder builder, TextReader reader, ExtensionRegistry extensionRegistry) where TBuilder : IBuilderLite
+        {
+            return JsonFormatReader.CreateInstance(reader)
+                .Merge(builder, extensionRegistry);
+        }
+
+        /// <summary>
+        /// Merges an XML object into this builder and returns
+        /// </summary>
+        public static TBuilder MergeFromXml<TBuilder>(
+#if !NOEXTENSIONS
+            this
+#endif
+            TBuilder builder, XmlReader reader) where TBuilder : IBuilderLite
+        {
+            return MergeFromXml(builder, XmlFormatReader.DefaultRootElementName, reader, ExtensionRegistry.Empty);
+        }
+
+        /// <summary>
+        /// Merges an XML object into this builder and returns
+        /// </summary>
+        public static TBuilder MergeFromXml<TBuilder>(
+#if !NOEXTENSIONS
+            this
+#endif
+            TBuilder builder, string rootElementName, XmlReader reader) where TBuilder : IBuilderLite
+        {
+            return MergeFromXml(builder, rootElementName, reader, ExtensionRegistry.Empty);
+        }
+
+        /// <summary>
+        /// Merges an XML object into this builder using the extensions provided and returns
+        /// </summary>
+        public static TBuilder MergeFromXml<TBuilder>(
+#if !NOEXTENSIONS
+            this
+#endif
+            TBuilder builder, string rootElementName, XmlReader reader,
+            ExtensionRegistry extensionRegistry) where TBuilder : IBuilderLite
+        {
+            return XmlFormatReader.CreateInstance(reader)
+                .Merge(rootElementName, builder, extensionRegistry);
+        }
+
+        /// <summary>
+        /// Merges the message from the input stream based on the contentType provided
+        /// </summary>
+        /// <typeparam name="TBuilder">A type derived from IBuilderLite</typeparam>
+        /// <param name="builder">An instance of a message builder</param>
+        /// <param name="options">Options specific to reading this message and/or content type</param>
+        /// <param name="contentType">The mime type of the input stream content</param>
+        /// <param name="input">The stream to read the message from</param>
+        /// <returns>The same builder instance that was supplied in the builder parameter</returns>
+        public static TBuilder MergeFrom<TBuilder>(
+#if !NOEXTENSIONS
+            this
+#endif
+            TBuilder builder, MessageFormatOptions options, string contentType, Stream input) where TBuilder : IBuilderLite
+        {
+            ICodedInputStream codedInput = MessageFormatFactory.CreateInputStream(options, contentType, input);
+            codedInput.ReadMessageStart();
+            builder.WeakMergeFrom(codedInput, options.ExtensionRegistry);
+            codedInput.ReadMessageEnd();
+            return builder;
+        }
+
+        #endregion
+    }
+}

+ 162 - 0
csharp/src/ProtocolBuffers.Serialization/Http/FormUrlEncodedReader.cs

@@ -0,0 +1,162 @@
+using System;
+using System.IO;
+using System.Text;
+
+namespace Google.ProtocolBuffers.Serialization.Http
+{
+    /// <summary>
+    /// Allows reading messages from a name/value dictionary
+    /// </summary>
+    public class FormUrlEncodedReader : AbstractTextReader
+    {
+        private readonly TextReader _input;
+        private string _fieldName, _fieldValue;
+        private bool _ready;
+
+        /// <summary>
+        /// Creates a dictionary reader from an enumeration of KeyValuePair data, like an IDictionary
+        /// </summary>
+        FormUrlEncodedReader(TextReader input)
+        {
+            _input = input;
+            int ch = input.Peek();
+            if (ch == '?')
+            {
+                input.Read();
+            }
+            _ready = ReadNext();
+        }
+
+        #region CreateInstance overloads
+        /// <summary>
+        /// Constructs a FormUrlEncodedReader to parse form data, or url query text into a message.
+        /// </summary>
+        public static FormUrlEncodedReader CreateInstance(Stream stream)
+        {
+            return new FormUrlEncodedReader(new StreamReader(stream, Encoding.UTF8, false));
+        }
+
+        /// <summary>
+        /// Constructs a FormUrlEncodedReader to parse form data, or url query text into a message.
+        /// </summary>
+        public static FormUrlEncodedReader CreateInstance(byte[] bytes)
+        {
+            return new FormUrlEncodedReader(new StreamReader(new MemoryStream(bytes, false), Encoding.UTF8, false));
+        }
+
+        /// <summary>
+        /// Constructs a FormUrlEncodedReader to parse form data, or url query text into a message.
+        /// </summary>
+        public static FormUrlEncodedReader CreateInstance(string text)
+        {
+            return new FormUrlEncodedReader(new StringReader(text));
+        }
+
+        /// <summary>
+        /// Constructs a FormUrlEncodedReader to parse form data, or url query text into a message.
+        /// </summary>
+        public static FormUrlEncodedReader CreateInstance(TextReader input)
+        {
+            return new FormUrlEncodedReader(input);
+        }
+        #endregion
+
+        private bool ReadNext()
+        {
+            StringBuilder field = new StringBuilder(32);
+            StringBuilder value = new StringBuilder(64);
+            int ch;
+            while (-1 != (ch = _input.Read()) && ch != '=' && ch != '&')
+            {
+                field.Append((char)ch);
+            }
+
+            if (ch != -1 && ch != '&')
+            {
+                while (-1 != (ch = _input.Read()) && ch != '&')
+                {
+                    value.Append((char)ch);
+                }
+            }
+
+            _fieldName = field.ToString();
+            _fieldValue = Uri.UnescapeDataString(value.Replace('+', ' ').ToString());
+            
+            return !String.IsNullOrEmpty(_fieldName);
+        }
+
+        /// <summary>
+        /// No-op
+        /// </summary>
+        public override void ReadMessageStart()
+        { }
+
+        /// <summary>
+        /// No-op
+        /// </summary>
+        public override void ReadMessageEnd()
+        { }
+
+        /// <summary>
+        /// Merges the contents of stream into the provided message builder
+        /// </summary>
+        public override TBuilder Merge<TBuilder>(TBuilder builder, ExtensionRegistry registry)
+        {
+            builder.WeakMergeFrom(this, registry);
+            return builder;
+        }
+
+        /// <summary>
+        /// Causes the reader to skip past this field
+        /// </summary>
+        protected override void Skip()
+        {
+            _ready = ReadNext();
+        }
+
+        /// <summary>
+        /// Peeks at the next field in the input stream and returns what information is available.
+        /// </summary>
+        /// <remarks>
+        /// This may be called multiple times without actually reading the field.  Only after the field
+        /// is either read, or skipped, should PeekNext return a different value.
+        /// </remarks>
+        protected override bool PeekNext(out string field)
+        {
+            field = _ready ? _fieldName : null;
+            return field != null;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a String from the input
+        /// </summary>
+        protected override bool ReadAsText(ref string value, Type typeInfo)
+        {
+            if (_ready)
+            {
+                value = _fieldValue;
+                _ready = ReadNext();
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// It's unlikely this will work for anything but text data as bytes UTF8 are transformed to text and back to bytes
+        /// </summary>
+        protected override ByteString DecodeBytes(string bytes)
+        { return ByteString.CopyFromUtf8(bytes); }
+
+        /// <summary>
+        /// Not Supported
+        /// </summary>
+        public override bool ReadGroup(IBuilderLite value, ExtensionRegistry registry)
+        { throw new NotSupportedException(); }
+
+        /// <summary>
+        /// Not Supported
+        /// </summary>
+        protected override bool ReadMessage(IBuilderLite builder, ExtensionRegistry registry)
+        { throw new NotSupportedException(); }
+    }
+}

+ 112 - 0
csharp/src/ProtocolBuffers.Serialization/Http/MessageFormatFactory.cs

@@ -0,0 +1,112 @@
+using System;
+using System.IO;
+using System.Xml;
+using System.Text;
+
+namespace Google.ProtocolBuffers.Serialization.Http
+{
+    /// <summary>
+    /// Extensions and helpers to abstract the reading/writing of messages by a client-specified content type.
+    /// </summary>
+    public static class MessageFormatFactory
+    {
+        /// <summary>
+        /// Constructs an ICodedInputStream from the input stream based on the contentType provided
+        /// </summary>
+        /// <param name="options">Options specific to reading this message and/or content type</param>
+        /// <param name="contentType">The mime type of the input stream content</param>
+        /// <param name="input">The stream to read the message from</param>
+        /// <returns>The ICodedInputStream that can be given to the IBuilder.MergeFrom(...) method</returns>
+        public static ICodedInputStream CreateInputStream(MessageFormatOptions options, string contentType, Stream input)
+        {
+            ICodedInputStream codedInput = ContentTypeToInputStream(contentType, options, input);
+
+            if (codedInput is XmlFormatReader)
+            {
+                XmlFormatReader reader = (XmlFormatReader)codedInput;
+                reader.RootElementName = options.XmlReaderRootElementName;
+                reader.Options = options.XmlReaderOptions;
+            }
+
+            return codedInput;
+        }
+        
+        /// <summary>
+        /// Writes the message instance to the stream using the content type provided
+        /// </summary>
+        /// <param name="options">Options specific to writing this message and/or content type</param>
+        /// <param name="contentType">The mime type of the content to be written</param>
+        /// <param name="output">The stream to write the message to</param>
+        /// <remarks> If you do not dispose of ICodedOutputStream some formats may yield incomplete output </remarks>
+        public static ICodedOutputStream CreateOutputStream(MessageFormatOptions options, string contentType, Stream output)
+        {
+            ICodedOutputStream codedOutput = ContentTypeToOutputStream(contentType, options, output);
+
+            if (codedOutput is JsonFormatWriter)
+            {
+                JsonFormatWriter writer = (JsonFormatWriter)codedOutput;
+                if (options.FormattedOutput)
+                {
+                    writer.Formatted();
+                }
+            }
+            else if (codedOutput is XmlFormatWriter)
+            {
+                XmlFormatWriter writer = (XmlFormatWriter)codedOutput;
+                if (options.FormattedOutput)
+                {
+                    XmlWriterSettings settings = new XmlWriterSettings()
+                                                     {
+                                                         CheckCharacters = false,
+                                                         NewLineHandling = NewLineHandling.Entitize,
+                                                         OmitXmlDeclaration = true,
+                                                         Encoding = new UTF8Encoding(false),
+                                                         Indent = true,
+                                                         IndentChars = "    ",
+                                                     };
+                    // Don't know how else to change xml writer options?
+                    codedOutput = writer = XmlFormatWriter.CreateInstance(XmlWriter.Create(output, settings));
+                }
+                writer.RootElementName = options.XmlWriterRootElementName;
+                writer.Options = options.XmlWriterOptions;
+            }
+
+            return codedOutput;
+        }
+
+        private static ICodedInputStream ContentTypeToInputStream(string contentType, MessageFormatOptions options, Stream input)
+        {
+            contentType = (contentType ?? String.Empty).Split(';')[0].Trim();
+
+            CodedInputBuilder factory;
+            if(!options.MimeInputTypesReadOnly.TryGetValue(contentType, out factory) || factory == null)
+            {
+                if(String.IsNullOrEmpty(options.DefaultContentType) ||
+                    !options.MimeInputTypesReadOnly.TryGetValue(options.DefaultContentType, out factory) || factory == null)
+                {
+                    throw new ArgumentOutOfRangeException("contentType");
+                }
+            }
+
+            return factory(input);
+        }
+
+        private static ICodedOutputStream ContentTypeToOutputStream(string contentType, MessageFormatOptions options, Stream output)
+        {
+            contentType = (contentType ?? String.Empty).Split(';')[0].Trim();
+
+            CodedOutputBuilder factory;
+            if (!options.MimeOutputTypesReadOnly.TryGetValue(contentType, out factory) || factory == null)
+            {
+                if (String.IsNullOrEmpty(options.DefaultContentType) ||
+                    !options.MimeOutputTypesReadOnly.TryGetValue(options.DefaultContentType, out factory) || factory == null)
+                {
+                    throw new ArgumentOutOfRangeException("contentType");
+                }
+            }
+
+            return factory(output);
+        }
+
+    }
+}

+ 176 - 0
csharp/src/ProtocolBuffers.Serialization/Http/MessageFormatOptions.cs

@@ -0,0 +1,176 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using Google.ProtocolBuffers.Collections;
+
+namespace Google.ProtocolBuffers.Serialization.Http
+{
+    /// <summary>
+    /// A delegate used to specify a method that constructs an ICodedInputStream from a .NET Stream.
+    /// </summary>
+    public delegate ICodedInputStream CodedInputBuilder(Stream stream);
+    /// <summary>
+    /// A delegate used to specify a method that constructs an ICodedOutputStream from a .NET Stream.
+    /// </summary>
+    public delegate ICodedOutputStream CodedOutputBuilder(Stream stream);
+
+    /// <summary>
+    /// Defines control information for the various formatting used with HTTP services
+    /// </summary>
+    public class MessageFormatOptions
+    {
+        /// <summary>The mime type for xml content</summary>
+        /// <remarks>Other valid xml mime types include: application/binary, application/x-protobuf</remarks>
+        public const string ContentTypeProtoBuffer = "application/vnd.google.protobuf";
+
+        /// <summary>The mime type for xml content</summary>
+        /// <remarks>Other valid xml mime types include: text/xml</remarks>
+        public const string ContentTypeXml = "application/xml";
+        
+        /// <summary>The mime type for json content</summary>
+        /// <remarks>
+        /// Other valid json mime types include: application/json, application/x-json, 
+        /// application/x-javascript, text/javascript, text/x-javascript, text/x-json, text/json
+        /// </remarks>
+        public const string ContentTypeJson = "application/json";
+
+        /// <summary>The mime type for query strings and x-www-form-urlencoded content</summary>
+        /// <remarks>This mime type is input-only</remarks>
+        public const string ContentFormUrlEncoded = "application/x-www-form-urlencoded";
+
+        /// <summary>
+        /// Default mime-type handling for input
+        /// </summary>
+        private static readonly IDictionary<string, CodedInputBuilder> MimeInputDefaults =
+            new ReadOnlyDictionary<string, CodedInputBuilder>(
+            new Dictionary<string, CodedInputBuilder>(StringComparer.OrdinalIgnoreCase)
+                {
+                    {"application/json", JsonFormatReader.CreateInstance},
+                    {"application/x-json", JsonFormatReader.CreateInstance},
+                    {"application/x-javascript", JsonFormatReader.CreateInstance},
+                    {"text/javascript", JsonFormatReader.CreateInstance},
+                    {"text/x-javascript", JsonFormatReader.CreateInstance},
+                    {"text/x-json", JsonFormatReader.CreateInstance},
+                    {"text/json", JsonFormatReader.CreateInstance},
+                    {"text/xml", XmlFormatReader.CreateInstance},
+                    {"application/xml", XmlFormatReader.CreateInstance},
+                    {"application/binary", CodedInputStream.CreateInstance},
+                    {"application/x-protobuf", CodedInputStream.CreateInstance},
+                    {"application/vnd.google.protobuf", CodedInputStream.CreateInstance},
+                    {"application/x-www-form-urlencoded", FormUrlEncodedReader.CreateInstance},
+                }
+            );
+
+        /// <summary>
+        /// Default mime-type handling for output
+        /// </summary>
+        private static readonly IDictionary<string, CodedOutputBuilder> MimeOutputDefaults =
+            new ReadOnlyDictionary<string, CodedOutputBuilder>(
+            new Dictionary<string, CodedOutputBuilder>(StringComparer.OrdinalIgnoreCase)
+                {
+                    {"application/json", JsonFormatWriter.CreateInstance},
+                    {"application/x-json", JsonFormatWriter.CreateInstance},
+                    {"application/x-javascript", JsonFormatWriter.CreateInstance},
+                    {"text/javascript", JsonFormatWriter.CreateInstance},
+                    {"text/x-javascript", JsonFormatWriter.CreateInstance},
+                    {"text/x-json", JsonFormatWriter.CreateInstance},
+                    {"text/json", JsonFormatWriter.CreateInstance},
+                    {"text/xml", XmlFormatWriter.CreateInstance},
+                    {"application/xml", XmlFormatWriter.CreateInstance},
+                    {"application/binary", CodedOutputStream.CreateInstance},
+                    {"application/x-protobuf", CodedOutputStream.CreateInstance},
+                    {"application/vnd.google.protobuf", CodedOutputStream.CreateInstance},
+                }
+            );
+
+
+
+
+        private string _defaultContentType;
+        private string _xmlReaderRootElementName;
+        private string _xmlWriterRootElementName;
+        private ExtensionRegistry _extensionRegistry;
+        private Dictionary<string, CodedInputBuilder> _mimeInputTypes;
+        private Dictionary<string, CodedOutputBuilder> _mimeOutputTypes;
+
+        /// <summary> Provides access to modify the mime-type input stream construction </summary>
+        public IDictionary<string, CodedInputBuilder> MimeInputTypes
+        {
+            get
+            {
+                return _mimeInputTypes ??
+                    (_mimeInputTypes = new Dictionary<string, CodedInputBuilder>(
+                                           MimeInputDefaults, StringComparer.OrdinalIgnoreCase));
+            }
+        }
+
+        /// <summary> Provides access to modify the mime-type input stream construction </summary>
+        public IDictionary<string, CodedOutputBuilder> MimeOutputTypes
+        {
+            get
+            {
+                return _mimeOutputTypes ??
+                    (_mimeOutputTypes = new Dictionary<string, CodedOutputBuilder>(
+                                           MimeOutputDefaults, StringComparer.OrdinalIgnoreCase));
+            }
+        }
+
+        internal IDictionary<string, CodedInputBuilder> MimeInputTypesReadOnly
+        { get { return _mimeInputTypes ?? MimeInputDefaults; } }
+
+        internal IDictionary<string, CodedOutputBuilder> MimeOutputTypesReadOnly
+        { get { return _mimeOutputTypes ?? MimeOutputDefaults; } }
+
+        /// <summary>
+        /// The default content type to use if the input type is null or empty.  If this
+        /// value is not supplied an ArgumentOutOfRangeException exception will be raised.
+        /// </summary>
+        public string DefaultContentType
+        {
+            get { return _defaultContentType ?? String.Empty; }
+            set { _defaultContentType = value; }
+        }
+
+        /// <summary>
+        /// The extension registry to use when reading messages
+        /// </summary>
+        public ExtensionRegistry ExtensionRegistry
+        {
+            get { return _extensionRegistry ?? ExtensionRegistry.Empty; }
+            set { _extensionRegistry = value; }
+        }
+
+        /// <summary>
+        /// The name of the xml root element when reading messages
+        /// </summary>
+        public string XmlReaderRootElementName
+        {
+            get { return _xmlReaderRootElementName ?? XmlFormatReader.DefaultRootElementName; }
+            set { _xmlReaderRootElementName = value; }
+        }
+
+        /// <summary>
+        /// Xml reader options
+        /// </summary>
+        public XmlReaderOptions XmlReaderOptions { get; set; }
+
+        /// <summary>
+        /// True to use formatted output including new-lines and default indentation
+        /// </summary>
+        public bool FormattedOutput { get; set; }
+
+        /// <summary>
+        /// The name of the xml root element when writing messages
+        /// </summary>
+        public string XmlWriterRootElementName
+        {
+            get { return _xmlWriterRootElementName ?? XmlFormatWriter.DefaultRootElementName; }
+            set { _xmlWriterRootElementName = value; }
+        }
+
+        /// <summary>
+        /// Xml writer options
+        /// </summary>
+        public XmlWriterOptions XmlWriterOptions { get; set; }
+    }
+}

+ 262 - 0
csharp/src/ProtocolBuffers.Serialization/JsonFormatReader.cs

@@ -0,0 +1,262 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// JsonFormatReader is used to parse Json into a message or an array of messages
+    /// </summary>
+    public class JsonFormatReader : AbstractTextReader
+    {
+        private readonly JsonCursor _input;
+        // The expected token that ends the current item, either ']' or '}'
+        private readonly Stack<int> _stopChar;
+
+        private enum ReaderState
+        {
+            Start,
+            BeginValue,
+            EndValue,
+            BeginObject,
+            BeginArray
+        }
+
+        private string _current;
+        private ReaderState _state;
+
+        /// <summary>
+        /// Constructs a JsonFormatReader to parse Json into a message, this method does not use text encoding, all bytes MUST
+        /// represent ASCII character values.
+        /// </summary>
+        public static JsonFormatReader CreateInstance(Stream stream)
+        {
+            return new JsonFormatReader(JsonCursor.CreateInstance(stream));
+        }
+
+        /// <summary>
+        /// Constructs a JsonFormatReader to parse Json into a message, this method does not use text encoding, all bytes MUST
+        /// represent ASCII character values.
+        /// </summary>
+        public static JsonFormatReader CreateInstance(byte[] bytes)
+        {
+            return new JsonFormatReader(JsonCursor.CreateInstance(bytes));
+        }
+
+        /// <summary>
+        /// Constructs a JsonFormatReader to parse Json into a message
+        /// </summary>
+        public static JsonFormatReader CreateInstance(string jsonText)
+        {
+            return new JsonFormatReader(JsonCursor.CreateInstance(jsonText));
+        }
+
+        /// <summary>
+        /// Constructs a JsonFormatReader to parse Json into a message
+        /// </summary>
+        public static JsonFormatReader CreateInstance(TextReader input)
+        {
+            return new JsonFormatReader(JsonCursor.CreateInstance(input));
+        }
+
+        /// <summary>
+        /// Constructs a JsonFormatReader to parse Json into a message
+        /// </summary>
+        internal JsonFormatReader(JsonCursor input)
+        {
+            _input = input;
+            _stopChar = new Stack<int>();
+            _stopChar.Push(-1);
+            _state = ReaderState.Start;
+        }
+
+        /// <summary>
+        /// Constructs a JsonFormatReader to parse Json into a message
+        /// </summary>
+        protected JsonFormatReader(TextReader input)
+            : this(JsonCursor.CreateInstance(input))
+        {
+        }
+
+        /// <summary>
+        /// Returns true if the reader is currently on an array element
+        /// </summary>
+        public bool IsArrayMessage
+        {
+            get { return _input.NextChar == '['; }
+        }
+
+        /// <summary>
+        /// Returns an enumerator that is used to cursor over an array of messages
+        /// </summary>
+        /// <remarks>
+        /// This is generally used when receiving an array of messages rather than a single root message
+        /// </remarks>
+        public IEnumerable<JsonFormatReader> EnumerateArray()
+        {
+            foreach (string ignored in ForeachArrayItem(_current))
+            {
+                yield return this;
+            }
+        }
+
+        /// <summary>
+        /// Reads the root-message preamble specific to this formatter
+        /// </summary>
+        public override void ReadMessageStart()
+        {
+            _input.Consume('{');
+            _stopChar.Push('}');
+
+            _state = ReaderState.BeginObject;
+        }
+
+        /// <summary>
+        /// Reads the root-message close specific to this formatter
+        /// </summary>
+        public override void ReadMessageEnd()
+        {
+            _input.Consume((char)_stopChar.Pop());
+            _state = ReaderState.EndValue;
+        }
+
+        /// <summary>
+        /// Merges the contents of stream into the provided message builder
+        /// </summary>
+        public override TBuilder Merge<TBuilder>(TBuilder builder, ExtensionRegistry registry)
+        {
+            ReadMessageStart();
+            builder.WeakMergeFrom(this, registry);
+            ReadMessageEnd();
+            return builder;
+        }
+
+        /// <summary>
+        /// Causes the reader to skip past this field
+        /// </summary>
+        protected override void Skip()
+        {
+            object temp;
+            _input.ReadVariant(out temp);
+            _state = ReaderState.EndValue;
+        }
+
+        /// <summary>
+        /// Peeks at the next field in the input stream and returns what information is available.
+        /// </summary>
+        /// <remarks>
+        /// This may be called multiple times without actually reading the field.  Only after the field
+        /// is either read, or skipped, should PeekNext return a different value.
+        /// </remarks>
+        protected override bool PeekNext(out string field)
+        {
+            field = _current;
+            if (_state == ReaderState.BeginValue)
+            {
+                return true;
+            }
+
+            int next = _input.NextChar;
+            if (next == _stopChar.Peek())
+            {
+                return false;
+            }
+
+            _input.Assert(next != -1, "Unexpected end of file.");
+
+            //not sure about this yet, it will allow {, "a":true }
+            if (_state == ReaderState.EndValue && !_input.TryConsume(','))
+            {
+                return false;
+            }
+
+            field = _current = _input.ReadString();
+            _input.Consume(':');
+            _state = ReaderState.BeginValue;
+            return true;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a String from the input
+        /// </summary>
+        protected override bool ReadAsText(ref string value, Type typeInfo)
+        {
+            object temp;
+            JsonCursor.JsType type = _input.ReadVariant(out temp);
+            _state = ReaderState.EndValue;
+
+            _input.Assert(type != JsonCursor.JsType.Array && type != JsonCursor.JsType.Object,
+                          "Encountered {0} while expecting {1}", type, typeInfo);
+            if (type == JsonCursor.JsType.Null)
+            {
+                return false;
+            }
+            if (type == JsonCursor.JsType.True)
+            {
+                value = "1";
+            }
+            else if (type == JsonCursor.JsType.False)
+            {
+                value = "0";
+            }
+            else
+            {
+                value = temp as string;
+            }
+
+            //exponent representation of integer number:
+            if (value != null && type == JsonCursor.JsType.Number &&
+                (typeInfo != typeof(double) && typeInfo != typeof(float)) &&
+                value.IndexOf("e", StringComparison.OrdinalIgnoreCase) > 0)
+            {
+                value = XmlConvert.ToString((long) Math.Round(XmlConvert.ToDouble(value), 0));
+            }
+            return value != null;
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a ByteString from the input
+        /// </summary>
+        protected override bool Read(ref ByteString value)
+        {
+            string bytes = null;
+            if (Read(ref bytes))
+            {
+                value = ByteString.FromBase64(bytes);
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Cursors through the array elements and stops at the end of the array
+        /// </summary>
+        protected override IEnumerable<string> ForeachArrayItem(string field)
+        {
+            _input.Consume('[');
+            _stopChar.Push(']');
+            _state = ReaderState.BeginArray;
+            while (_input.NextChar != ']')
+            {
+                _current = field;
+                yield return field;
+                if (!_input.TryConsume(','))
+                {
+                    break;
+                }
+            }
+            _input.Consume((char) _stopChar.Pop());
+            _state = ReaderState.EndValue;
+        }
+
+        /// <summary>
+        /// Merges the input stream into the provided IBuilderLite 
+        /// </summary>
+        protected override bool ReadMessage(IBuilderLite builder, ExtensionRegistry registry)
+        {
+            Merge(builder, registry);
+            return true;
+        }
+    }
+}

+ 541 - 0
csharp/src/ProtocolBuffers.Serialization/JsonFormatWriter.cs

@@ -0,0 +1,541 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// JsonFormatWriter is a .NET 2.0 friendly json formatter for proto buffer messages.  For .NET 3.5
+    /// you may also use the XmlFormatWriter with an XmlWriter created by the
+    /// <see cref="System.Runtime.Serialization.Json.JsonReaderWriterFactory">JsonReaderWriterFactory</see>.
+    /// </summary>
+    public abstract class JsonFormatWriter : AbstractTextWriter
+    {
+        #region buffering implementations
+
+        private class JsonTextWriter : JsonFormatWriter
+        {
+            private readonly char[] _buffer;
+            private TextWriter _output;
+            private int _bufferPos;
+
+            public JsonTextWriter(TextWriter output)
+            {
+                _buffer = new char[4096];
+                _bufferPos = 0;
+                _output = output;
+                _counter.Add(0);
+            }
+
+            /// <summary>
+            /// Returns the output of TextWriter.ToString() where TextWriter is the ctor argument.
+            /// </summary>
+            public override string ToString()
+            {
+                Flush();
+
+                if (_output != null)
+                {
+                    return _output.ToString();
+                }
+
+                return new String(_buffer, 0, _bufferPos);
+            }
+
+            protected override void WriteToOutput(char[] chars, int offset, int len)
+            {
+                if (_bufferPos + len >= _buffer.Length)
+                {
+                    if (_output == null)
+                    {
+                        _output = new StringWriter(new StringBuilder(_buffer.Length*2 + len));
+                    }
+                    Flush();
+                }
+
+                if (len < _buffer.Length)
+                {
+                    if (len <= 12)
+                    {
+                        int stop = offset + len;
+                        for (int i = offset; i < stop; i++)
+                        {
+                            _buffer[_bufferPos++] = chars[i];
+                        }
+                    }
+                    else
+                    {
+                        Buffer.BlockCopy(chars, offset << 1, _buffer, _bufferPos << 1, len << 1);
+                        _bufferPos += len;
+                    }
+                }
+                else
+                {
+                    _output.Write(chars, offset, len);
+                }
+            }
+
+            protected override void WriteToOutput(char ch)
+            {
+                if (_bufferPos >= _buffer.Length)
+                {
+                    if (_output == null)
+                    {
+                        _output = new StringWriter(new StringBuilder(_buffer.Length * 2));
+                    }
+                    Flush();
+                }
+                _buffer[_bufferPos++] = ch;
+            }
+
+            public override void Flush()
+            {
+                if (_bufferPos > 0 && _output != null)
+                {
+                    _output.Write(_buffer, 0, _bufferPos);
+                    _bufferPos = 0;
+                }
+                base.Flush();
+            }
+        }
+
+        private class JsonStreamWriter : JsonFormatWriter
+        {
+            static readonly Encoding Encoding = new UTF8Encoding(false);
+            private readonly byte[] _buffer;
+            private Stream _output;
+            private int _bufferPos;
+
+            public JsonStreamWriter(Stream output)
+            {
+                _buffer = new byte[8192];
+                _bufferPos = 0;
+                _output = output;
+                _counter.Add(0);
+            }
+
+            protected override void WriteToOutput(char[] chars, int offset, int len)
+            {
+                if (_bufferPos + len >= _buffer.Length)
+                {
+                    Flush();
+                }
+
+                if (len < _buffer.Length)
+                {
+                    if (len <= 12)
+                    {
+                        int stop = offset + len;
+                        for (int i = offset; i < stop; i++)
+                        {
+                            _buffer[_bufferPos++] = (byte) chars[i];
+                        }
+                    }
+                    else
+                    {
+                        _bufferPos += Encoding.GetBytes(chars, offset, len, _buffer, _bufferPos);
+                    }
+                }
+                else
+                {
+                    byte[] temp = Encoding.GetBytes(chars, offset, len);
+                    _output.Write(temp, 0, temp.Length);
+                }
+            }
+
+            protected override void WriteToOutput(char ch)
+            {
+                if (_bufferPos >= _buffer.Length)
+                {
+                    Flush();
+                }
+                _buffer[_bufferPos++] = (byte) ch;
+            }
+
+            public override void Flush()
+            {
+                if (_bufferPos > 0 && _output != null)
+                {
+                    _output.Write(_buffer, 0, _bufferPos);
+                    _bufferPos = 0;
+                }
+                base.Flush();
+            }
+        }
+
+        #endregion
+
+        //Tracks the writer depth and the array element count at that depth.
+        private readonly List<int> _counter;
+        //True if the top-level of the writer is an array as opposed to a single message.
+        private bool _isArray;
+
+        /// <summary>
+        /// Constructs a JsonFormatWriter, use the ToString() member to extract the final Json on completion.
+        /// </summary>
+        protected JsonFormatWriter()
+        {
+            _counter = new List<int>();
+        }
+
+        /// <summary>
+        /// Constructs a JsonFormatWriter, use ToString() to extract the final output
+        /// </summary>
+        public static JsonFormatWriter CreateInstance()
+        {
+            return new JsonTextWriter(null);
+        }
+
+        /// <summary>
+        /// Constructs a JsonFormatWriter to output to the given text writer
+        /// </summary>
+        public static JsonFormatWriter CreateInstance(TextWriter output)
+        {
+            return new JsonTextWriter(output);
+        }
+
+        /// <summary>
+        /// Constructs a JsonFormatWriter to output to the given stream
+        /// </summary>
+        public static JsonFormatWriter CreateInstance(Stream output)
+        {
+            return new JsonStreamWriter(output);
+        }
+
+        /// <summary> Write to the output stream </summary>
+        protected void WriteToOutput(string format, params object[] args)
+        {
+            WriteToOutput(String.Format(format, args));
+        }
+
+        /// <summary> Write to the output stream </summary>
+        protected void WriteToOutput(string text)
+        {
+            WriteToOutput(text.ToCharArray(), 0, text.Length);
+        }
+
+        /// <summary> Write to the output stream </summary>
+        protected abstract void WriteToOutput(char ch);
+
+        /// <summary> Write to the output stream </summary>
+        protected abstract void WriteToOutput(char[] chars, int offset, int len);
+
+        /// <summary> Sets the output formatting to use Environment.NewLine with 4-character indentions </summary>
+        public JsonFormatWriter Formatted()
+        {
+            NewLine = FrameworkPortability.NewLine;
+            Indent = "    ";
+            Whitespace = " ";
+            return this;
+        }
+
+        /// <summary> Gets or sets the characters to use for the new-line, default = empty </summary>
+        public string NewLine { get; set; }
+
+        /// <summary> Gets or sets the text to use for indenting, default = empty </summary>
+        public string Indent { get; set; }
+
+        /// <summary> Gets or sets the whitespace to use to separate the text, default = empty </summary>
+        public string Whitespace { get; set; }
+
+        private void Seperator()
+        {
+            if (_counter.Count == 0)
+            {
+                throw new InvalidOperationException("Mismatched open/close in Json writer.");
+            }
+
+            int index = _counter.Count - 1;
+            if (_counter[index] > 0)
+            {
+                WriteToOutput(',');
+            }
+
+            WriteLine(String.Empty);
+            _counter[index] = _counter[index] + 1;
+        }
+
+        private void WriteLine(string content)
+        {
+            if (!String.IsNullOrEmpty(NewLine))
+            {
+                WriteToOutput(NewLine);
+                for (int i = 1; i < _counter.Count; i++)
+                {
+                    WriteToOutput(Indent);
+                }
+            }
+            else if (!String.IsNullOrEmpty(Whitespace))
+            {
+                WriteToOutput(Whitespace);
+            }
+
+            WriteToOutput(content);
+        }
+
+        private void WriteName(string field)
+        {
+            Seperator();
+            if (!String.IsNullOrEmpty(field))
+            {
+                WriteToOutput('"');
+                WriteToOutput(field);
+                WriteToOutput('"');
+                WriteToOutput(':');
+                if (!String.IsNullOrEmpty(Whitespace))
+                {
+                    WriteToOutput(Whitespace);
+                }
+            }
+        }
+
+        private void EncodeText(string value)
+        {
+            char[] text = value.ToCharArray();
+            int len = text.Length;
+            int pos = 0;
+
+            while (pos < len)
+            {
+                int next = pos;
+                while (next < len && text[next] >= 32 && text[next] < 127 && text[next] != '\\' && text[next] != '/' &&
+                       text[next] != '"')
+                {
+                    next++;
+                }
+                WriteToOutput(text, pos, next - pos);
+                if (next < len)
+                {
+                    switch (text[next])
+                    {
+                        case '"':
+                            WriteToOutput(@"\""");
+                            break;
+                        case '\\':
+                            WriteToOutput(@"\\");
+                            break;
+                            //odd at best to escape '/', most Json implementations don't, but it is defined in the rfc-4627
+                        case '/':
+                            WriteToOutput(@"\/");
+                            break;
+                        case '\b':
+                            WriteToOutput(@"\b");
+                            break;
+                        case '\f':
+                            WriteToOutput(@"\f");
+                            break;
+                        case '\n':
+                            WriteToOutput(@"\n");
+                            break;
+                        case '\r':
+                            WriteToOutput(@"\r");
+                            break;
+                        case '\t':
+                            WriteToOutput(@"\t");
+                            break;
+                        default:
+                            WriteToOutput(@"\u{0:x4}", (int) text[next]);
+                            break;
+                    }
+                    next++;
+                }
+                pos = next;
+            }
+        }
+
+        /// <summary>
+        /// Writes a String value
+        /// </summary>
+        protected override void WriteAsText(string field, string textValue, object typedValue)
+        {
+            WriteName(field);
+            if (typedValue is bool || typedValue is int || typedValue is uint || typedValue is long ||
+                typedValue is ulong || typedValue is double || typedValue is float)
+            {
+                WriteToOutput(textValue);
+            }
+            else
+            {
+                WriteToOutput('"');
+                if (typedValue is string)
+                {
+                    EncodeText(textValue);
+                }
+                else
+                {
+                    WriteToOutput(textValue);
+                }
+                WriteToOutput('"');
+            }
+        }
+
+        /// <summary>
+        /// Writes a Double value
+        /// </summary>
+        protected override void Write(string field, double value)
+        {
+            if (double.IsNaN(value) || double.IsNegativeInfinity(value) || double.IsPositiveInfinity(value))
+            {
+                throw new InvalidOperationException("This format does not support NaN, Infinity, or -Infinity");
+            }
+            base.Write(field, value);
+        }
+
+        /// <summary>
+        /// Writes a Single value
+        /// </summary>
+        protected override void Write(string field, float value)
+        {
+            if (float.IsNaN(value) || float.IsNegativeInfinity(value) || float.IsPositiveInfinity(value))
+            {
+                throw new InvalidOperationException("This format does not support NaN, Infinity, or -Infinity");
+            }
+            base.Write(field, value);
+        }
+
+        // Treat enum as string
+        protected override void WriteEnum(string field, int number, string name)
+        {
+            Write(field, name);
+        }
+
+        /// <summary>
+        /// Writes an array of field values
+        /// </summary>
+        protected override void WriteArray(FieldType type, string field, IEnumerable items)
+        {
+            IEnumerator enumerator = items.GetEnumerator();
+            try
+            {
+                if (!enumerator.MoveNext())
+                {
+                    return;
+                }
+            }
+            finally
+            {
+                if (enumerator is IDisposable)
+                {
+                    ((IDisposable) enumerator).Dispose();
+                }
+            }
+
+            WriteName(field);
+            WriteToOutput("[");
+            _counter.Add(0);
+
+            base.WriteArray(type, String.Empty, items);
+
+            _counter.RemoveAt(_counter.Count - 1);
+            WriteLine("]");
+        }
+
+        /// <summary>
+        /// Writes a message
+        /// </summary>
+        protected override void WriteMessageOrGroup(string field, IMessageLite message)
+        {
+            WriteName(field);
+            WriteMessage(message);
+        }
+
+        /// <summary>
+        /// Writes the message to the the formatted stream.
+        /// </summary>
+        public override void WriteMessage(IMessageLite message)
+        {
+            WriteMessageStart();
+            message.WriteTo(this);
+            WriteMessageEnd();
+        }
+
+        /// <summary>
+        /// Used to write the root-message preamble, in json this is the left-curly brace '{'.
+        /// After this call you can call IMessageLite.MergeTo(...) and complete the message with
+        /// a call to WriteMessageEnd().
+        /// </summary>
+        public override void WriteMessageStart()
+        {
+            if (_isArray)
+            {
+                Seperator();
+            }
+            WriteToOutput("{");
+            _counter.Add(0);
+        }
+
+        /// <summary>
+        /// Used to complete a root-message previously started with a call to WriteMessageStart()
+        /// </summary>
+        public override void WriteMessageEnd()
+        {
+            _counter.RemoveAt(_counter.Count - 1);
+            WriteLine("}");
+            Flush();
+        }
+
+        /// <summary>
+        /// Used in streaming arrays of objects to the writer
+        /// </summary>
+        /// <example>
+        /// <code>
+        /// using(writer.StartArray())
+        ///     foreach(IMessageLite m in messages)
+        ///         writer.WriteMessage(m);
+        /// </code>
+        /// </example>
+        public sealed class JsonArray : IDisposable
+        {
+            private JsonFormatWriter _writer;
+
+            internal JsonArray(JsonFormatWriter writer)
+            {
+                _writer = writer;
+                _writer.WriteToOutput("[");
+                _writer._counter.Add(0);
+            }
+
+            /// <summary>
+            /// Causes the end of the array character to be written.
+            /// </summary>
+            private void EndArray()
+            {
+                if (_writer != null)
+                {
+                    _writer._counter.RemoveAt(_writer._counter.Count - 1);
+                    _writer.WriteLine("]");
+                    _writer.Flush();
+                }
+                _writer = null;
+            }
+
+            void IDisposable.Dispose()
+            {
+                EndArray();
+            }
+        }
+
+        /// <summary>
+        /// Used to write an array of messages as the output rather than a single message.
+        /// </summary>
+        /// <example>
+        /// <code>
+        /// using(writer.StartArray())
+        ///     foreach(IMessageLite m in messages)
+        ///         writer.WriteMessage(m);
+        /// </code>
+        /// </example>
+        public JsonArray StartArray()
+        {
+            if (_isArray)
+            {
+                Seperator();
+            }
+            _isArray = true;
+            return new JsonArray(this);
+        }
+    }
+}

+ 442 - 0
csharp/src/ProtocolBuffers.Serialization/JsonTextCursor.cs

@@ -0,0 +1,442 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Globalization;
+using System.IO;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// JSon Tokenizer used by JsonFormatReader
+    /// </summary>
+    internal abstract class JsonCursor
+    {
+        public enum JsType
+        {
+            String,
+            Number,
+            Object,
+            Array,
+            True,
+            False,
+            Null
+        }
+
+        #region Buffering implementations
+
+        private class JsonStreamCursor : JsonCursor
+        {
+            private readonly byte[] _buffer;
+            private int _bufferPos;
+            private readonly Stream _input;
+
+            public JsonStreamCursor(Stream input)
+            {
+                _input = input;
+                _next = _input.ReadByte();
+            }
+
+            public JsonStreamCursor(byte[] input)
+            {
+                _input = null;
+                _buffer = input;
+                _next = _buffer[_bufferPos];
+            }
+
+            protected override int Peek()
+            {
+                if (_input != null)
+                {
+                    return _next;
+                }
+                else if (_bufferPos < _buffer.Length)
+                {
+                    return _buffer[_bufferPos];
+                }
+                else
+                {
+                    return -1;
+                }
+            }
+
+            protected override int Read()
+            {
+                if (_input != null)
+                {
+                    int result = _next;
+                    _next = _input.ReadByte();
+                    return result;
+                }
+                else if (_bufferPos < _buffer.Length)
+                {
+                    return _buffer[_bufferPos++];
+                }
+                else
+                {
+                    return -1;
+                }
+            }
+        }
+
+        private class JsonTextCursor : JsonCursor
+        {
+            private readonly char[] _buffer;
+            private int _bufferPos;
+            private readonly TextReader _input;
+
+            public JsonTextCursor(char[] input)
+            {
+                _input = null;
+                _buffer = input;
+                _bufferPos = 0;
+                _next = Peek();
+            }
+
+            public JsonTextCursor(TextReader input)
+            {
+                _input = input;
+                _next = Peek();
+            }
+
+            protected override int Peek()
+            {
+                if (_input != null)
+                {
+                    return _input.Peek();
+                }
+                else if (_bufferPos < _buffer.Length)
+                {
+                    return _buffer[_bufferPos];
+                }
+                else
+                {
+                    return -1;
+                }
+            }
+
+            protected override int Read()
+            {
+                if (_input != null)
+                {
+                    return _input.Read();
+                }
+                else if (_bufferPos < _buffer.Length)
+                {
+                    return _buffer[_bufferPos++];
+                }
+                else
+                {
+                    return -1;
+                }
+            }
+        }
+
+        #endregion
+
+        protected int _next;
+        private int _lineNo, _linePos;
+
+        public static JsonCursor CreateInstance(byte[] input)
+        {
+            return new JsonStreamCursor(input);
+        }
+
+        public static JsonCursor CreateInstance(Stream input)
+        {
+            return new JsonStreamCursor(input);
+        }
+
+        public static JsonCursor CreateInstance(string input)
+        {
+            return new JsonTextCursor(input.ToCharArray());
+        }
+
+        public static JsonCursor CreateInstance(TextReader input)
+        {
+            return new JsonTextCursor(input);
+        }
+
+        protected JsonCursor()
+        {
+            _lineNo = 1;
+            _linePos = 0;
+        }
+
+        /// <summary>Returns the next character without actually 'reading' it</summary>
+        protected abstract int Peek();
+
+        /// <summary>Reads the next character in the input</summary>
+        protected abstract int Read();
+
+        public Char NextChar
+        {
+            get
+            {
+                SkipWhitespace();
+                return (char) _next;
+            }
+        }
+
+        #region Assert(...)
+
+        [DebuggerNonUserCode]
+        private string CharDisplay(int ch)
+        {
+            return ch == -1
+                       ? "EOF"
+                       : (ch > 32 && ch < 127)
+                             ? String.Format("'{0}'", (char) ch)
+                             : String.Format("'\\u{0:x4}'", ch);
+        }
+
+        [DebuggerNonUserCode]
+        private void Assert(bool cond, char expected)
+        {
+            if (!cond)
+            {
+                throw new FormatException(
+                    String.Format(FrameworkPortability.InvariantCulture,
+                                  "({0}:{1}) error: Unexpected token {2}, expected: {3}.",
+                                  _lineNo, _linePos,
+                                  CharDisplay(_next),
+                                  CharDisplay(expected)
+                        ));
+            }
+        }
+
+        [DebuggerNonUserCode]
+        public void Assert(bool cond, string message)
+        {
+            if (!cond)
+            {
+                throw new FormatException(
+                    String.Format(FrameworkPortability.InvariantCulture,
+                                  "({0},{1}) error: {2}", _lineNo, _linePos, message));
+            }
+        }
+
+        [DebuggerNonUserCode]
+        public void Assert(bool cond, string format, params object[] args)
+        {
+            if (!cond)
+            {
+                if (args != null && args.Length > 0)
+                {
+                    format = String.Format(format, args);
+                }
+                throw new FormatException(
+                    String.Format(FrameworkPortability.InvariantCulture,
+                                  "({0},{1}) error: {2}", _lineNo, _linePos, format));
+            }
+        }
+
+        #endregion
+
+        private char ReadChar()
+        {
+            int ch = Read();
+            Assert(ch != -1, "Unexpected end of file.");
+            if (ch == '\n')
+            {
+                _lineNo++;
+                _linePos = 0;
+            }
+            else if (ch != '\r')
+            {
+                _linePos++;
+            }
+            _next = Peek();
+            return (char) ch;
+        }
+
+        public void Consume(char ch)
+        {
+            Assert(TryConsume(ch), ch);
+        }
+
+        public bool TryConsume(char ch)
+        {
+            SkipWhitespace();
+            if (_next == ch)
+            {
+                ReadChar();
+                return true;
+            }
+            return false;
+        }
+
+        public void Consume(string sequence)
+        {
+            SkipWhitespace();
+
+            foreach (char ch in sequence)
+            {
+                Assert(ch == ReadChar(), "Expected token '{0}'.", sequence);
+            }
+        }
+
+        public void SkipWhitespace()
+        {
+            int chnext = _next;
+            while (chnext != -1)
+            {
+                if (!Char.IsWhiteSpace((char) chnext))
+                {
+                    break;
+                }
+                ReadChar();
+                chnext = _next;
+            }
+        }
+
+        public string ReadString()
+        {
+            SkipWhitespace();
+            Consume('"');
+            List<Char> sb = new List<char>(100);
+            while (_next != '"')
+            {
+                if (_next == '\\')
+                {
+                    Consume('\\'); //skip the escape
+                    char ch = ReadChar();
+                    switch (ch)
+                    {
+                        case 'b':
+                            sb.Add('\b');
+                            break;
+                        case 'f':
+                            sb.Add('\f');
+                            break;
+                        case 'n':
+                            sb.Add('\n');
+                            break;
+                        case 'r':
+                            sb.Add('\r');
+                            break;
+                        case 't':
+                            sb.Add('\t');
+                            break;
+                        case 'u':
+                            {
+                                string hex = new string(new char[] {ReadChar(), ReadChar(), ReadChar(), ReadChar()});
+                                int result;
+                                Assert(
+                                    FrameworkPortability.TryParseInt32(hex, NumberStyles.AllowHexSpecifier, FrameworkPortability.InvariantCulture,
+                                                 out result),
+                                    "Expected a 4-character hex specifier.");
+                                sb.Add((char) result);
+                                break;
+                            }
+                        default:
+                            sb.Add(ch);
+                            break;
+                    }
+                }
+                else
+                {
+                    Assert(_next != '\n' && _next != '\r' && _next != '\f' && _next != -1, '"');
+                    sb.Add(ReadChar());
+                }
+            }
+            Consume('"');
+            return new String(sb.ToArray());
+        }
+
+        public string ReadNumber()
+        {
+            SkipWhitespace();
+            List<Char> sb = new List<char>(24);
+            if (_next == '-')
+            {
+                sb.Add(ReadChar());
+            }
+            Assert(_next >= '0' && _next <= '9', "Expected a numeric type.");
+            while ((_next >= '0' && _next <= '9') || _next == '.')
+            {
+                sb.Add(ReadChar());
+            }
+            if (_next == 'e' || _next == 'E')
+            {
+                sb.Add(ReadChar());
+                if (_next == '-' || _next == '+')
+                {
+                    sb.Add(ReadChar());
+                }
+                Assert(_next >= '0' && _next <= '9', "Expected a numeric type.");
+                while (_next >= '0' && _next <= '9')
+                {
+                    sb.Add(ReadChar());
+                }
+            }
+            return new String(sb.ToArray());
+        }
+
+        public JsType ReadVariant(out object value)
+        {
+            SkipWhitespace();
+            switch (_next)
+            {
+                case 'n':
+                    Consume("null");
+                    value = null;
+                    return JsType.Null;
+                case 't':
+                    Consume("true");
+                    value = true;
+                    return JsType.True;
+                case 'f':
+                    Consume("false");
+                    value = false;
+                    return JsType.False;
+                case '"':
+                    value = ReadString();
+                    return JsType.String;
+                case '{':
+                    {
+                        Consume('{');
+                        while (NextChar != '}')
+                        {
+                            ReadString();
+                            Consume(':');
+                            object tmp;
+                            ReadVariant(out tmp);
+                            if (!TryConsume(','))
+                            {
+                                break;
+                            }
+                        }
+                        Consume('}');
+                        value = null;
+                        return JsType.Object;
+                    }
+                case '[':
+                    {
+                        Consume('[');
+                        List<object> values = new List<object>();
+                        while (NextChar != ']')
+                        {
+                            object tmp;
+                            ReadVariant(out tmp);
+                            values.Add(tmp);
+                            if (!TryConsume(','))
+                            {
+                                break;
+                            }
+                        }
+                        Consume(']');
+                        value = values.ToArray();
+                        return JsType.Array;
+                    }
+                default:
+                    if ((_next >= '0' && _next <= '9') || _next == '-')
+                    {
+                        value = ReadNumber();
+                        return JsType.Number;
+                    }
+                    Assert(false, "Expected a value.");
+                    throw new FormatException();
+            }
+        }
+    }
+}

+ 65 - 0
csharp/src/ProtocolBuffers.Serialization/Properties/AssemblyInfo.cs

@@ -0,0 +1,65 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("ProtocolBuffers")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtocolBuffers")]
+[assembly: AssemblyCopyright("Copyright ©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+
+#if !NOFILEVERSION
+[assembly: AssemblyFileVersion("2.4.1.555")]
+#endif

+ 93 - 0
csharp/src/ProtocolBuffers.Serialization/ProtocolBuffers.Serialization.csproj

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{231391AF-449C-4A39-986C-AD7F270F4750}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.Serialization</RootNamespace>
+    <AssemblyName>Google.ProtocolBuffers.Serialization</AssemblyName>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TargetFrameworkProfile>Profile92</TargetFrameworkProfile>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>..\..\keys\Google.ProtocolBuffers.snk</AssemblyOriginatorKeyFile>
+    <OldToolsVersion>3.5</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
+    <DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
+    <NoWarn>1591, 1570, 1571, 1572, 1573, 1574</NoWarn>
+    <DefineConstants>DEBUG;TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
+    <DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
+    <NoWarn>1591, 1570, 1571, 1572, 1573, 1574</NoWarn>
+    <DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" Condition="'$(TargetFrameworkVersion)' != 'v2.0'" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\ProtocolBuffers\FrameworkPortability.cs">
+      <Link>FrameworkPortability.cs</Link>
+    </Compile>
+    <Compile Include="Extensions.cs" />
+    <Compile Include="Http\FormUrlEncodedReader.cs" />
+    <Compile Include="Http\MessageFormatFactory.cs" />
+    <Compile Include="Http\MessageFormatOptions.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="AbstractReader.cs" />
+    <Compile Include="AbstractTextReader.cs" />
+    <Compile Include="AbstractTextWriter.cs" />
+    <Compile Include="AbstractWriter.cs" />
+    <Compile Include="DictionaryReader.cs" />
+    <Compile Include="DictionaryWriter.cs" />
+    <Compile Include="JsonFormatReader.cs" />
+    <Compile Include="JsonFormatWriter.cs" />
+    <Compile Include="JsonTextCursor.cs" />
+    <Compile Include="RecursionLimitExceeded.cs" />
+    <Compile Include="XmlFormatReader.cs" />
+    <Compile Include="XmlFormatWriter.cs" />
+    <Compile Include="XmlReaderOptions.cs" />
+    <Compile Include="XmlWriterOptions.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 93 - 0
csharp/src/ProtocolBuffers.Serialization/ProtocolBuffersLite.Serialization.csproj

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E067A59D-9D0A-4A1F-92B1-38E4457241D1}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.Serialization</RootNamespace>
+    <AssemblyName>Google.ProtocolBuffersLite.Serialization</AssemblyName>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TargetFrameworkProfile>Profile92</TargetFrameworkProfile>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>..\..\keys\Google.ProtocolBuffers.snk</AssemblyOriginatorKeyFile>
+    <OldToolsVersion>3.5</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
+    <DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
+    <NoWarn>1591, 1570, 1571, 1572, 1573, 1574</NoWarn>
+    <DefineConstants>DEBUG;TRACE;LITE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
+    <DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
+    <NoWarn>1591, 1570, 1571, 1572, 1573, 1574</NoWarn>
+    <DefineConstants>TRACE;LITE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" Condition="'$(TargetFrameworkVersion)' != 'v2.0'" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\ProtocolBuffers\FrameworkPortability.cs">
+      <Link>FrameworkPortability.cs</Link>
+    </Compile>
+    <Compile Include="Extensions.cs" />
+    <Compile Include="Http\FormUrlEncodedReader.cs" />
+    <Compile Include="Http\MessageFormatFactory.cs" />
+    <Compile Include="Http\MessageFormatOptions.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="AbstractReader.cs" />
+    <Compile Include="AbstractTextReader.cs" />
+    <Compile Include="AbstractTextWriter.cs" />
+    <Compile Include="AbstractWriter.cs" />
+    <Compile Include="DictionaryReader.cs" />
+    <Compile Include="DictionaryWriter.cs" />
+    <Compile Include="JsonFormatReader.cs" />
+    <Compile Include="JsonFormatWriter.cs" />
+    <Compile Include="JsonTextCursor.cs" />
+    <Compile Include="RecursionLimitExceeded.cs" />
+    <Compile Include="XmlFormatReader.cs" />
+    <Compile Include="XmlFormatWriter.cs" />
+    <Compile Include="XmlReaderOptions.cs" />
+    <Compile Include="XmlWriterOptions.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffersLite.csproj">
+      <Project>{6969BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffersLite</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 18 - 0
csharp/src/ProtocolBuffers.Serialization/RecursionLimitExceeded.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// The exception raised when a recursion limit is reached while parsing input.
+    /// </summary>
+    public sealed class RecursionLimitExceededException : FormatException
+    {
+        const string message = "Possible malicious message had too many levels of nesting.";
+        
+        internal RecursionLimitExceededException() : base(message)
+        {
+        }
+    }
+}

+ 338 - 0
csharp/src/ProtocolBuffers.Serialization/XmlFormatReader.cs

@@ -0,0 +1,338 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml;
+using System.Diagnostics;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Parses a proto buffer from an XML document or fragment.  .NET 3.5 users may also
+    /// use this class to process Json by setting the options to support Json and providing
+    /// an XmlReader obtained from <see cref="System.Runtime.Serialization.Json.JsonReaderWriterFactory"/>.
+    /// </summary>
+    public class XmlFormatReader : AbstractTextReader
+    {
+        public const string DefaultRootElementName = XmlFormatWriter.DefaultRootElementName;
+        private readonly XmlReader _input;
+        // Tracks the message element for each nested message read
+        private readonly Stack<ElementStackEntry> _elements;
+        // The default element name for ReadMessageStart
+        private string _rootElementName;
+
+        private struct ElementStackEntry
+        {
+            public readonly string LocalName;
+            public readonly int Depth;
+            public readonly bool IsEmpty;
+
+            public ElementStackEntry(string localName, int depth, bool isEmpty) : this()
+            {
+                LocalName = localName;
+                IsEmpty = isEmpty;
+                Depth = depth;
+            }
+        }
+
+        private static XmlReaderSettings DefaultSettings
+        {
+            get
+            {
+                return new XmlReaderSettings()
+                           {CheckCharacters = false, IgnoreComments = true, IgnoreProcessingInstructions = true};
+            }
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatReader using the stream provided as the xml
+        /// </summary>
+        public static XmlFormatReader CreateInstance(byte[] input)
+        {
+            return new XmlFormatReader(XmlReader.Create(new MemoryStream(input, false), DefaultSettings));
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatReader using the stream provided as the xml
+        /// </summary>
+        public static XmlFormatReader CreateInstance(Stream input)
+        {
+            return new XmlFormatReader(XmlReader.Create(input, DefaultSettings));
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatReader using the string provided as the xml to be read
+        /// </summary>
+        public static XmlFormatReader CreateInstance(String input)
+        {
+            return new XmlFormatReader(XmlReader.Create(new StringReader(input), DefaultSettings));
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatReader using the xml in the TextReader
+        /// </summary>
+        public static XmlFormatReader CreateInstance(TextReader input)
+        {
+            return new XmlFormatReader(XmlReader.Create(input, DefaultSettings));
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatReader with the XmlReader
+        /// </summary>
+        public static XmlFormatReader CreateInstance(XmlReader input)
+        {
+            return new XmlFormatReader(input);
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatReader with the XmlReader and options
+        /// </summary>
+        protected XmlFormatReader(XmlReader input)
+        {
+            _input = input;
+            _rootElementName = DefaultRootElementName;
+            _elements = new Stack<ElementStackEntry>();
+            Options = XmlReaderOptions.None;
+        }
+
+        /// <summary>
+        /// Gets or sets the options to use when reading the xml
+        /// </summary>
+        public XmlReaderOptions Options { get; set; }
+
+        /// <summary>
+        /// Sets the options to use while generating the XML
+        /// </summary>
+        public XmlFormatReader SetOptions(XmlReaderOptions options)
+        {
+            Options = options;
+            return this;
+        }
+
+        /// <summary>
+        /// Gets or sets the default element name to use when using the Merge&lt;TBuilder>()
+        /// </summary>
+        public string RootElementName
+        {
+            get { return _rootElementName; }
+            set
+            {
+                ThrowHelper.ThrowIfNull(value, "RootElementName");
+                _rootElementName = value;
+            }
+        }
+
+        [DebuggerNonUserCode]
+        private static void Assert(bool cond)
+        {
+            if (!cond)
+            {
+                throw new FormatException();
+            }
+        }
+
+        /// <summary>
+        /// Reads the root-message preamble specific to this formatter
+        /// </summary>
+        public override void ReadMessageStart()
+        {
+            ReadMessageStart(_rootElementName);
+        }
+
+        /// <summary>
+        /// Reads the root-message preamble specific to this formatter
+        /// </summary>
+        public void ReadMessageStart(string element)
+        {
+            while (!_input.IsStartElement() && _input.Read())
+            {
+                continue;
+            }
+            Assert(_input.IsStartElement() && _input.LocalName == element);
+            _elements.Push(new ElementStackEntry(element, _input.Depth, _input.IsEmptyElement));
+            _input.Read();
+        }
+
+        /// <summary>
+        /// Reads the root-message close specific to this formatter, MUST be called
+        /// on the reader obtained from ReadMessageStart(string element).
+        /// </summary>
+        public override void ReadMessageEnd()
+        {
+            Assert(_elements.Count > 0);
+
+            ElementStackEntry stop = _elements.Peek();
+            while (_input.NodeType != XmlNodeType.EndElement && _input.NodeType != XmlNodeType.Element
+                   && _input.Depth > stop.Depth && _input.Read())
+            {
+                continue;
+            }
+
+            if (!stop.IsEmpty)
+            {
+                Assert(_input.NodeType == XmlNodeType.EndElement
+                       && _input.LocalName == stop.LocalName
+                       && _input.Depth == stop.Depth);
+
+                _input.Read();
+            }
+            _elements.Pop();
+        }
+
+        /// <summary>
+        /// Merge the provided builder as an element named <see cref="RootElementName"/> in the current context
+        /// </summary>
+        public override TBuilder Merge<TBuilder>(TBuilder builder, ExtensionRegistry registry)
+        {
+            return Merge(_rootElementName, builder, registry);
+        }
+
+        /// <summary>
+        /// Merge the provided builder as an element of the current context
+        /// </summary>
+        public TBuilder Merge<TBuilder>(string element, TBuilder builder) where TBuilder : IBuilderLite
+        {
+            return Merge(element, builder, ExtensionRegistry.Empty);
+        }
+
+        /// <summary>
+        /// Merge the provided builder as an element of the current context
+        /// </summary>
+        public TBuilder Merge<TBuilder>(string element, TBuilder builder, ExtensionRegistry registry)
+            where TBuilder : IBuilderLite
+        {
+            ReadMessageStart(element);
+            builder.WeakMergeFrom(this, registry);
+            ReadMessageEnd();
+            return builder;
+        }
+
+        /// <summary>
+        /// Peeks at the next field in the input stream and returns what information is available.
+        /// </summary>
+        /// <remarks>
+        /// This may be called multiple times without actually reading the field.  Only after the field
+        /// is either read, or skipped, should PeekNext return a different value.
+        /// </remarks>
+        protected override bool PeekNext(out string field)
+        {
+            ElementStackEntry stopNode;
+            if (_elements.Count == 0)
+            {
+                stopNode = new ElementStackEntry(null, _input.Depth - 1, false);
+            }
+            else
+            {
+                stopNode = _elements.Peek();
+            }
+
+            if (!stopNode.IsEmpty)
+            {
+                while (!_input.IsStartElement() && _input.Depth > stopNode.Depth && _input.Read())
+                {
+                    continue;
+                }
+
+                if (_input.IsStartElement() && _input.Depth > stopNode.Depth)
+                {
+                    field = _input.LocalName;
+                    return true;
+                }
+            }
+            field = null;
+            return false;
+        }
+
+        /// <summary>
+        /// Causes the reader to skip past this field
+        /// </summary>
+        protected override void Skip()
+        {
+            if (_input.IsStartElement())
+            {
+                if (!_input.IsEmptyElement)
+                {
+                    int depth = _input.Depth;
+                    while (_input.Depth >= depth && _input.NodeType != XmlNodeType.EndElement)
+                    {
+                        Assert(_input.Read());
+                    }
+                }
+                _input.Read();
+            }
+        }
+
+        /// <summary>
+        /// returns true if it was able to read a single value into the value reference.  The value
+        /// stored may be of type System.String, System.Int32, or an IEnumLite from the IEnumLiteMap.
+        /// </summary>
+        protected override bool ReadEnum(ref object value)
+        {
+            int number;
+            string temp;
+            if (null != (temp = _input.GetAttribute("value")) && FrameworkPortability.TryParseInt32(temp, out number))
+            {
+                Skip();
+                value = number;
+                return true;
+            }
+            return base.ReadEnum(ref value);
+        }
+
+        /// <summary>
+        /// Returns true if it was able to read a String from the input
+        /// </summary>
+        protected override bool ReadAsText(ref string value, Type type)
+        {
+            Assert(_input.NodeType == XmlNodeType.Element);
+            value = _input.ReadElementContentAsString();
+
+            return true;
+        }
+
+        /// <summary>
+        /// Merges the input stream into the provided IBuilderLite 
+        /// </summary>
+        protected override bool ReadMessage(IBuilderLite builder, ExtensionRegistry registry)
+        {
+            Assert(_input.IsStartElement());
+            ReadMessageStart(_input.LocalName);
+            builder.WeakMergeFrom(this, registry);
+            ReadMessageEnd();
+            return true;
+        }
+
+        private IEnumerable<string> NonNestedArrayItems(string field)
+        {
+            return base.ForeachArrayItem(field);
+        }
+
+        /// <summary>
+        /// Cursors through the array elements and stops at the end of the array
+        /// </summary>
+        protected override IEnumerable<string> ForeachArrayItem(string field)
+        {
+            bool isNested = (Options & XmlReaderOptions.ReadNestedArrays) != 0;
+
+            if (!isNested)
+            {
+                foreach (string item in NonNestedArrayItems(field))
+                {
+                    yield return item;
+                }
+            }
+            else
+            {
+                string found;
+                ReadMessageStart(field);
+                if (PeekNext(out found) && found == "item")
+                {
+                    foreach (string item in NonNestedArrayItems("item"))
+                    {
+                        yield return item;
+                    }
+                }
+                ReadMessageEnd();
+            }
+        }
+    }
+}

+ 280 - 0
csharp/src/ProtocolBuffers.Serialization/XmlFormatWriter.cs

@@ -0,0 +1,280 @@
+using System;
+using System.Collections;
+using System.IO;
+using System.Text;
+using System.Xml;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Writes a proto buffer to an XML document or fragment.  .NET 3.5 users may also
+    /// use this class to produce Json by setting the options to support Json and providing
+    /// an XmlWriter obtained from <see cref="System.Runtime.Serialization.Json.JsonReaderWriterFactory"/>.
+    /// </summary>
+    public class XmlFormatWriter : AbstractTextWriter
+    {
+        private static readonly Encoding DefaultEncoding = new UTF8Encoding(false);
+        public const string DefaultRootElementName = "root";
+
+        private readonly XmlWriter _output;
+        // The default element name used for WriteMessageStart
+        private string _rootElementName;
+        // Used to assert matching WriteMessageStart/WriteMessageEnd calls
+        private int _messageOpenCount;
+
+        private static XmlWriterSettings DefaultSettings(Encoding encoding)
+        {
+            return new XmlWriterSettings()
+                       {
+                           CheckCharacters = false,
+                           NewLineHandling = NewLineHandling.Entitize,
+                           OmitXmlDeclaration = true,
+                           Encoding = encoding,
+                       };
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatWriter to write to the given TextWriter
+        /// </summary>
+        public static XmlFormatWriter CreateInstance(TextWriter output)
+        {
+            return new XmlFormatWriter(XmlWriter.Create(output, DefaultSettings(output.Encoding)));
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatWriter to write to the given stream
+        /// </summary>
+        public static XmlFormatWriter CreateInstance(Stream output)
+        {
+            return new XmlFormatWriter(XmlWriter.Create(output, DefaultSettings(DefaultEncoding)));
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatWriter to write to the given stream
+        /// </summary>
+        public static XmlFormatWriter CreateInstance(Stream output, Encoding encoding)
+        {
+            return new XmlFormatWriter(XmlWriter.Create(output, DefaultSettings(encoding)));
+        }
+
+        /// <summary>
+        /// Constructs the XmlFormatWriter to write to the given XmlWriter
+        /// </summary>
+        public static XmlFormatWriter CreateInstance(XmlWriter output)
+        {
+            return new XmlFormatWriter(output);
+        }
+
+        protected XmlFormatWriter(XmlWriter output)
+        {
+            _output = output;
+            _messageOpenCount = 0;
+            _rootElementName = DefaultRootElementName;
+        }
+
+        /// <summary>
+        /// Gets or sets the default element name to use when using the Merge&lt;TBuilder>()
+        /// </summary>
+        public string RootElementName
+        {
+            get { return _rootElementName; }
+            set
+            {
+                ThrowHelper.ThrowIfNull(value, "RootElementName");
+                _rootElementName = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the options to use while generating the XML
+        /// </summary>
+        public XmlWriterOptions Options { get; set; }
+
+        /// <summary>
+        /// Sets the options to use while generating the XML
+        /// </summary>
+        public XmlFormatWriter SetOptions(XmlWriterOptions options)
+        {
+            Options = options;
+            return this;
+        }
+
+        private bool TestOption(XmlWriterOptions option)
+        {
+            return (Options & option) != 0;
+        }
+
+        /// <summary>
+        /// Completes any pending write operations
+        /// </summary>
+        public override void Flush()
+        {
+            _output.Flush();
+            base.Flush();
+        }
+
+        /// <summary>
+        /// Used to write the root-message preamble, in xml this is open element for RootElementName,
+        /// by default "&lt;root&gt;". After this call you can call IMessageLite.MergeTo(...) and 
+        /// complete the message with a call to WriteMessageEnd().
+        /// </summary>
+        public override void WriteMessageStart()
+        {
+            WriteMessageStart(_rootElementName);
+        }
+
+        /// <summary>
+        /// Used to write the root-message preamble, in xml this is open element for elementName. 
+        /// After this call you can call IMessageLite.MergeTo(...) and  complete the message with 
+        /// a call to WriteMessageEnd().
+        /// </summary>
+        public void WriteMessageStart(string elementName)
+        {
+            if (TestOption(XmlWriterOptions.OutputJsonTypes))
+            {
+                _output.WriteStartElement("root"); // json requires this is the root-element
+                _output.WriteAttributeString("type", "object");
+            }
+            else
+            {
+                _output.WriteStartElement(elementName);
+            }
+            _messageOpenCount++;
+        }
+
+        /// <summary>
+        /// Used to complete a root-message previously started with a call to WriteMessageStart()
+        /// </summary>
+        public override void WriteMessageEnd()
+        {
+            if (_messageOpenCount <= 0)
+            {
+                throw new InvalidOperationException();
+            }
+
+            _output.WriteEndElement();
+            _output.Flush();
+            _messageOpenCount--;
+        }
+
+        /// <summary>
+        /// Writes a message as an element using the name defined in <see cref="RootElementName"/>
+        /// </summary>
+        public override void WriteMessage(IMessageLite message)
+        {
+            WriteMessage(_rootElementName, message);
+        }
+
+        /// <summary>
+        /// Writes a message as an element with the given name
+        /// </summary>
+        public void WriteMessage(string elementName, IMessageLite message)
+        {
+            WriteMessageStart(elementName);
+            message.WriteTo(this);
+            WriteMessageEnd();
+        }
+
+        /// <summary>
+        /// Writes a message
+        /// </summary>
+        protected override void WriteMessageOrGroup(string field, IMessageLite message)
+        {
+            _output.WriteStartElement(field);
+
+            if (TestOption(XmlWriterOptions.OutputJsonTypes))
+            {
+                _output.WriteAttributeString("type", "object");
+            }
+
+            message.WriteTo(this);
+            _output.WriteEndElement();
+        }
+
+        /// <summary>
+        /// Writes a String value
+        /// </summary>
+        protected override void WriteAsText(string field, string textValue, object typedValue)
+        {
+            _output.WriteStartElement(field);
+
+            if (TestOption(XmlWriterOptions.OutputJsonTypes))
+            {
+                if (typedValue is int || typedValue is uint || typedValue is long || typedValue is ulong ||
+                    typedValue is double || typedValue is float)
+                {
+                    _output.WriteAttributeString("type", "number");
+                }
+                else if (typedValue is bool)
+                {
+                    _output.WriteAttributeString("type", "boolean");
+                }
+            }
+            _output.WriteString(textValue);
+
+            //Empty strings should not be written as empty elements '<item/>', rather as '<item></item>'
+            if (_output.WriteState == WriteState.Element)
+            {
+                _output.WriteRaw("");
+            }
+
+            _output.WriteEndElement();
+        }
+
+        /// <summary>
+        /// Writes an array of field values
+        /// </summary>
+        protected override void WriteArray(FieldType fieldType, string field, IEnumerable items)
+        {
+            //see if it's empty
+            IEnumerator eitems = items.GetEnumerator();
+            try
+            {
+                if (!eitems.MoveNext())
+                {
+                    return;
+                }
+            }
+            finally
+            {
+                if (eitems is IDisposable)
+                {
+                    ((IDisposable) eitems).Dispose();
+                }
+            }
+
+            if (TestOption(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputJsonTypes))
+            {
+                _output.WriteStartElement(field);
+                if (TestOption(XmlWriterOptions.OutputJsonTypes))
+                {
+                    _output.WriteAttributeString("type", "array");
+                }
+
+                base.WriteArray(fieldType, "item", items);
+                _output.WriteEndElement();
+            }
+            else
+            {
+                base.WriteArray(fieldType, field, items);
+            }
+        }
+
+        /// <summary>
+        /// Writes a System.Enum by the numeric and textual value
+        /// </summary>
+        protected override void WriteEnum(string field, int number, string name)
+        {
+            _output.WriteStartElement(field);
+
+            if (!TestOption(XmlWriterOptions.OutputJsonTypes) && TestOption(XmlWriterOptions.OutputEnumValues))
+            {
+                _output.WriteAttributeString("value", XmlConvert.ToString(number));
+            }
+
+            _output.WriteString(name);
+            _output.WriteEndElement();
+        }
+    }
+}

+ 17 - 0
csharp/src/ProtocolBuffers.Serialization/XmlReaderOptions.cs

@@ -0,0 +1,17 @@
+using System;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Options available for the xml reader output
+    /// </summary>
+    [Flags]
+    public enum XmlReaderOptions
+    {
+        /// <summary> Simple xml formatting with no attributes </summary>
+        None,
+
+        /// <summary> Requires that arrays items are nested in an &lt;item> element </summary>
+        ReadNestedArrays = 1,
+    }
+}

+ 24 - 0
csharp/src/ProtocolBuffers.Serialization/XmlWriterOptions.cs

@@ -0,0 +1,24 @@
+using System;
+
+namespace Google.ProtocolBuffers.Serialization
+{
+    /// <summary>
+    /// Options available for the xml writer output
+    /// </summary>
+    [Flags]
+    public enum XmlWriterOptions
+    {
+        /// <summary> Simple xml formatting with no attributes </summary>
+        None,
+
+        /// <summary> Writes the 'value' attribute on all enumerations with the numeric identifier </summary>
+        OutputEnumValues = 0x1,
+
+        /// <summary> Embeds array items into child &lt;item> elements </summary>
+        OutputNestedArrays = 0x4,
+
+        /// <summary> Outputs the 'type' attribute for compatibility with the <see cref="System.Runtime.Serialization.Json.JsonReaderWriterFactory">JsonReaderWriterFactory</see> </summary>
+        /// <remarks> This option must, by nessessity, also enable NestedArrayItems </remarks>
+        OutputJsonTypes = 0x8,
+    }
+}

+ 522 - 0
csharp/src/ProtocolBuffers.Test/AbstractMessageTest.cs

@@ -0,0 +1,522 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using Google.ProtocolBuffers.Descriptors;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class AbstractMessageTest
+    {
+        [Test]
+        public void Clear()
+        {
+            AbstractMessageWrapper message =
+                new AbstractMessageWrapper.Builder(TestAllTypes.CreateBuilder(TestUtil.GetAllSet())).Clear().Build();
+            TestUtil.AssertClear((TestAllTypes) message.WrappedMessage);
+        }
+
+        [Test]
+        public void Copy()
+        {
+            AbstractMessageWrapper message =
+                new AbstractMessageWrapper.Builder(TestAllTypes.CreateBuilder()).MergeFrom(TestUtil.GetAllSet()).Build();
+            TestUtil.AssertAllFieldsSet((TestAllTypes) message.WrappedMessage);
+        }
+
+        [Test]
+        public void CreateAndBuild()
+        {
+            TestAllTypes.CreateBuilder()
+                .Build();
+        }
+
+        [Test]
+        public void SerializedSize()
+        {
+            TestAllTypes message = TestUtil.GetAllSet();
+            IMessage abstractMessage = new AbstractMessageWrapper(TestUtil.GetAllSet());
+
+            Assert.AreEqual(message.SerializedSize, abstractMessage.SerializedSize);
+        }
+
+        [Test]
+        public void Serialization()
+        {
+            IMessage abstractMessage = new AbstractMessageWrapper(TestUtil.GetAllSet());
+            TestUtil.AssertAllFieldsSet(TestAllTypes.ParseFrom(abstractMessage.ToByteString()));
+            Assert.AreEqual(TestUtil.GetAllSet().ToByteString(), abstractMessage.ToByteString());
+        }
+
+        [Test]
+        public void Parsing()
+        {
+            IBuilder builder = new AbstractMessageWrapper.Builder(TestAllTypes.CreateBuilder());
+            AbstractMessageWrapper message =
+                (AbstractMessageWrapper) builder.WeakMergeFrom(TestUtil.GetAllSet().ToByteString()).WeakBuild();
+            TestUtil.AssertAllFieldsSet((TestAllTypes) message.WrappedMessage);
+        }
+
+        [Test]
+        public void PackedSerialization()
+        {
+            IMessage abstractMessage = new AbstractMessageWrapper(TestUtil.GetPackedSet());
+            TestUtil.AssertPackedFieldsSet(TestPackedTypes.ParseFrom(abstractMessage.ToByteString()));
+            Assert.AreEqual(TestUtil.GetPackedSet().ToByteString(), abstractMessage.ToByteString());
+        }
+
+        [Test]
+        public void PackedParsing()
+        {
+            AbstractMessageWrapper.Builder builder = new AbstractMessageWrapper.Builder(TestPackedTypes.CreateBuilder());
+            AbstractMessageWrapper message = builder.MergeFrom(TestUtil.GetPackedSet().ToByteString()).Build();
+            TestUtil.AssertPackedFieldsSet((TestPackedTypes)message.WrappedMessage);
+        }
+
+        [Test]
+        public void UnpackedParsingOfPackedInput()
+        {
+            byte[] bytes = TestUtil.GetPackedSet().ToByteArray();
+            TestUnpackedTypes message = TestUnpackedTypes.ParseFrom(bytes);
+            TestUtil.AssertUnpackedFieldsSet(message);
+        }
+
+        [Test]
+        public void PackedParsingOfUnpackedInput()
+        {
+            byte[] bytes = TestUnpackedTypes.ParseFrom(TestUtil.GetPackedSet().ToByteArray()).ToByteArray();
+            TestPackedTypes message = TestPackedTypes.ParseFrom(bytes);
+            TestUtil.AssertPackedFieldsSet(message);
+        }
+
+        [Test]
+        public void UnpackedParsingOfPackedInputExtensions()
+        {
+            byte[] bytes = TestUtil.GetPackedSet().ToByteArray();
+            ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+            Unittest.RegisterAllExtensions(registry);
+            UnittestImport.RegisterAllExtensions(registry);
+            TestUnpackedExtensions message = TestUnpackedExtensions.ParseFrom(bytes, registry);
+            TestUtil.AssertUnpackedExtensionsSet(message);
+        }
+
+        [Test]
+        public void PackedParsingOfUnpackedInputExtensions()
+        {
+            byte[] bytes = TestUnpackedTypes.ParseFrom(TestUtil.GetPackedSet().ToByteArray()).ToByteArray();
+            ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+            Unittest.RegisterAllExtensions(registry);
+            TestPackedExtensions message = TestPackedExtensions.ParseFrom(bytes, registry);
+            TestUtil.AssertPackedExtensionsSet(message);
+        }
+
+        [Test]
+        public void OptimizedForSize()
+        {
+            // We're mostly only Checking that this class was compiled successfully.
+            TestOptimizedForSize message = TestOptimizedForSize.CreateBuilder().SetI(1).Build();
+            message = TestOptimizedForSize.ParseFrom(message.ToByteString());
+            Assert.AreEqual(2, message.SerializedSize);
+        }
+
+        // -----------------------------------------------------------------
+        // Tests for isInitialized().
+
+        private static readonly TestRequired TestRequiredUninitialized = TestRequired.DefaultInstance;
+
+        private static readonly TestRequired TestRequiredInitialized =
+            TestRequired.CreateBuilder().SetA(1).SetB(2).SetC(3).Build();
+
+        [Test]
+        public void IsInitialized()
+        {
+            TestRequired.Builder builder = TestRequired.CreateBuilder();
+            AbstractMessageWrapper.Builder abstractBuilder = new AbstractMessageWrapper.Builder(builder);
+
+            Assert.IsFalse(abstractBuilder.IsInitialized);
+            builder.A = 1;
+            Assert.IsFalse(abstractBuilder.IsInitialized);
+            builder.B = 1;
+            Assert.IsFalse(abstractBuilder.IsInitialized);
+            builder.C = 1;
+            Assert.IsTrue(abstractBuilder.IsInitialized);
+        }
+
+        [Test]
+        public void ForeignIsInitialized()
+        {
+            TestRequiredForeign.Builder builder = TestRequiredForeign.CreateBuilder();
+            AbstractMessageWrapper.Builder abstractBuilder = new AbstractMessageWrapper.Builder(builder);
+
+            Assert.IsTrue(abstractBuilder.IsInitialized);
+
+            builder.SetOptionalMessage(TestRequiredUninitialized);
+            Assert.IsFalse(abstractBuilder.IsInitialized);
+
+            builder.SetOptionalMessage(TestRequiredInitialized);
+            Assert.IsTrue(abstractBuilder.IsInitialized);
+
+            builder.AddRepeatedMessage(TestRequiredUninitialized);
+            Assert.IsFalse(abstractBuilder.IsInitialized);
+
+            builder.SetRepeatedMessage(0, TestRequiredInitialized);
+            Assert.IsTrue(abstractBuilder.IsInitialized);
+        }
+
+        // -----------------------------------------------------------------
+        // Tests for mergeFrom
+
+        private static readonly TestAllTypes MergeSource = TestAllTypes.CreateBuilder()
+            .SetOptionalInt32(1)
+            .SetOptionalString("foo")
+            .SetOptionalForeignMessage(ForeignMessage.DefaultInstance)
+            .AddRepeatedString("bar")
+            .Build();
+
+        private static readonly TestAllTypes MergeDest = TestAllTypes.CreateBuilder()
+            .SetOptionalInt64(2)
+            .SetOptionalString("baz")
+            .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(3).Build())
+            .AddRepeatedString("qux")
+            .Build();
+
+        private const string MergeResultText = "optional_int32: 1\n" +
+                                               "optional_int64: 2\n" +
+                                               "optional_string: \"foo\"\n" +
+                                               "optional_foreign_message {\n" +
+                                               "  c: 3\n" +
+                                               "}\n" +
+                                               "repeated_string: \"qux\"\n" +
+                                               "repeated_string: \"bar\"\n";
+
+        [Test]
+        public void MergeFrom()
+        {
+            AbstractMessageWrapper result = (AbstractMessageWrapper)
+                                            new AbstractMessageWrapper.Builder(TestAllTypes.CreateBuilder(MergeDest))
+                                                .MergeFrom(MergeSource)
+                                                .Build();
+
+            Assert.AreEqual(MergeResultText, result.ToString());
+        }
+
+        // -----------------------------------------------------------------
+        // Tests for equals and hashCode
+
+        [Test]
+        public void EqualsAndHashCode()
+        {
+            TestAllTypes a = TestUtil.GetAllSet();
+            TestAllTypes b = TestAllTypes.CreateBuilder().Build();
+            TestAllTypes c = TestAllTypes.CreateBuilder(b).AddRepeatedString("x").Build();
+            TestAllTypes d = TestAllTypes.CreateBuilder(c).AddRepeatedString("y").Build();
+            TestAllExtensions e = TestUtil.GetAllExtensionsSet();
+            TestAllExtensions f = TestAllExtensions.CreateBuilder(e)
+                .AddExtension(Unittest.RepeatedInt32Extension, 999).Build();
+
+            CheckEqualsIsConsistent(a);
+            CheckEqualsIsConsistent(b);
+            CheckEqualsIsConsistent(c);
+            CheckEqualsIsConsistent(d);
+            CheckEqualsIsConsistent(e);
+            CheckEqualsIsConsistent(f);
+
+            CheckNotEqual(a, b);
+            CheckNotEqual(a, c);
+            CheckNotEqual(a, d);
+            CheckNotEqual(a, e);
+            CheckNotEqual(a, f);
+
+            CheckNotEqual(b, c);
+            CheckNotEqual(b, d);
+            CheckNotEqual(b, e);
+            CheckNotEqual(b, f);
+
+            CheckNotEqual(c, d);
+            CheckNotEqual(c, e);
+            CheckNotEqual(c, f);
+
+            CheckNotEqual(d, e);
+            CheckNotEqual(d, f);
+
+            CheckNotEqual(e, f);
+
+            // Deserializing into the TestEmptyMessage such that every field is an UnknownFieldSet.Field
+            TestEmptyMessage eUnknownFields = TestEmptyMessage.ParseFrom(e.ToByteArray());
+            TestEmptyMessage fUnknownFields = TestEmptyMessage.ParseFrom(f.ToByteArray());
+            CheckNotEqual(eUnknownFields, fUnknownFields);
+            CheckEqualsIsConsistent(eUnknownFields);
+            CheckEqualsIsConsistent(fUnknownFields);
+
+            // Subseqent reconstitutions should be identical
+            TestEmptyMessage eUnknownFields2 = TestEmptyMessage.ParseFrom(e.ToByteArray());
+            CheckEqualsIsConsistent(eUnknownFields, eUnknownFields2);
+        }
+
+        /// <summary>
+        /// Asserts that the given protos are equal and have the same hash code.
+        /// </summary>
+        private static void CheckEqualsIsConsistent(IMessage message)
+        {
+            // Object should be equal to itself.
+            Assert.AreEqual(message, message);
+
+            // Object should be equal to a dynamic copy of itself.
+            DynamicMessage dynamic = DynamicMessage.CreateBuilder(message).Build();
+            CheckEqualsIsConsistent(message, dynamic);
+        }
+
+        /// <summary>
+        /// Asserts that the given protos are equal and have the same hash code.
+        /// </summary>
+        private static void CheckEqualsIsConsistent(IMessage message1, IMessage message2)
+        {
+            // Not using Assert.AreEqual as that checks for type equality, which isn't
+            // what we want bearing in mind the dynamic message checks.
+            Assert.IsTrue(message1.Equals(message2));
+            Assert.IsTrue(message2.Equals(message1));
+            Assert.AreEqual(message2.GetHashCode(), message1.GetHashCode());
+        }
+
+        /// <summary>
+        /// Asserts that the given protos are not equal and have different hash codes.
+        /// </summary>
+        /// <remarks>
+        /// It's valid for non-equal objects to have the same hash code, so
+        /// this test is stricter than it needs to be. However, this should happen
+        /// relatively rarely. (If this test fails, it's probably still due to a bug.)
+        /// </remarks>
+        private static void CheckNotEqual(IMessage m1, IMessage m2)
+        {
+            String equalsError = string.Format("{0} should not be equal to {1}", m1, m2);
+            Assert.IsFalse(m1.Equals(m2), equalsError);
+            Assert.IsFalse(m2.Equals(m1), equalsError);
+
+            Assert.IsFalse(m1.GetHashCode() == m2.GetHashCode(),
+                           string.Format("{0} should have a different hash code from {1}", m1, m2));
+        }
+
+        /// <summary>
+        /// Extends AbstractMessage and wraps some other message object.  The methods
+        /// of the Message interface which aren't explicitly implemented by
+        /// AbstractMessage are forwarded to the wrapped object.  This allows us to
+        /// test that AbstractMessage's implementations work even if the wrapped
+        /// object does not use them.
+        /// </summary>
+        private class AbstractMessageWrapper : AbstractMessage<AbstractMessageWrapper, AbstractMessageWrapper.Builder>
+        {
+            private readonly IMessage wrappedMessage;
+
+            public IMessage WrappedMessage
+            {
+                get { return wrappedMessage; }
+            }
+
+            public AbstractMessageWrapper(IMessage wrappedMessage)
+            {
+                this.wrappedMessage = wrappedMessage;
+            }
+
+            public override MessageDescriptor DescriptorForType
+            {
+                get { return wrappedMessage.DescriptorForType; }
+            }
+
+            public override AbstractMessageWrapper DefaultInstanceForType
+            {
+                get { return new AbstractMessageWrapper(wrappedMessage.WeakDefaultInstanceForType); }
+            }
+
+            public override IDictionary<FieldDescriptor, object> AllFields
+            {
+                get { return wrappedMessage.AllFields; }
+            }
+
+            public override bool HasField(FieldDescriptor field)
+            {
+                return wrappedMessage.HasField(field);
+            }
+
+            public override object this[FieldDescriptor field]
+            {
+                get { return wrappedMessage[field]; }
+            }
+
+            public override object this[FieldDescriptor field, int index]
+            {
+                get { return wrappedMessage[field, index]; }
+            }
+
+            public override int GetRepeatedFieldCount(FieldDescriptor field)
+            {
+                return wrappedMessage.GetRepeatedFieldCount(field);
+            }
+
+            public override UnknownFieldSet UnknownFields
+            {
+                get { return wrappedMessage.UnknownFields; }
+            }
+
+            public override Builder CreateBuilderForType()
+            {
+                return new Builder(wrappedMessage.WeakCreateBuilderForType());
+            }
+
+            public override Builder ToBuilder()
+            {
+                return new Builder(wrappedMessage.WeakToBuilder());
+            }
+
+            internal class Builder : AbstractBuilder<AbstractMessageWrapper, Builder>
+            {
+                private readonly IBuilder wrappedBuilder;
+
+                protected override Builder ThisBuilder
+                {
+                    get { return this; }
+                }
+
+                internal Builder(IBuilder wrappedBuilder)
+                {
+                    this.wrappedBuilder = wrappedBuilder;
+                }
+
+                public override Builder MergeFrom(AbstractMessageWrapper other)
+                {
+                    wrappedBuilder.WeakMergeFrom(other.wrappedMessage);
+                    return this;
+                }
+
+                public override bool IsInitialized
+                {
+                    get { return wrappedBuilder.IsInitialized; }
+                }
+
+                public override IDictionary<FieldDescriptor, object> AllFields
+                {
+                    get { return wrappedBuilder.AllFields; }
+                }
+
+                public override object this[FieldDescriptor field]
+                {
+                    get { return wrappedBuilder[field]; }
+                    set { wrappedBuilder[field] = value; }
+                }
+
+                public override MessageDescriptor DescriptorForType
+                {
+                    get { return wrappedBuilder.DescriptorForType; }
+                }
+
+                public override int GetRepeatedFieldCount(FieldDescriptor field)
+                {
+                    return wrappedBuilder.GetRepeatedFieldCount(field);
+                }
+
+                public override object this[FieldDescriptor field, int index]
+                {
+                    get { return wrappedBuilder[field, index]; }
+                    set { wrappedBuilder[field, index] = value; }
+                }
+
+                public override bool HasField(FieldDescriptor field)
+                {
+                    return wrappedBuilder.HasField(field);
+                }
+
+                public override UnknownFieldSet UnknownFields
+                {
+                    get { return wrappedBuilder.UnknownFields; }
+                    set { wrappedBuilder.UnknownFields = value; }
+                }
+
+                public override AbstractMessageWrapper Build()
+                {
+                    return new AbstractMessageWrapper(wrappedBuilder.WeakBuild());
+                }
+
+                public override AbstractMessageWrapper BuildPartial()
+                {
+                    return new AbstractMessageWrapper(wrappedBuilder.WeakBuildPartial());
+                }
+
+                public override Builder Clone()
+                {
+                    return new Builder(wrappedBuilder.WeakClone());
+                }
+
+                public override AbstractMessageWrapper DefaultInstanceForType
+                {
+                    get { return new AbstractMessageWrapper(wrappedBuilder.WeakDefaultInstanceForType); }
+                }
+
+                public override Builder ClearField(FieldDescriptor field)
+                {
+                    wrappedBuilder.WeakClearField(field);
+                    return this;
+                }
+
+                public override Builder AddRepeatedField(FieldDescriptor field, object value)
+                {
+                    wrappedBuilder.WeakAddRepeatedField(field, value);
+                    return this;
+                }
+
+                public override IBuilder CreateBuilderForField(FieldDescriptor field)
+                {
+                    wrappedBuilder.CreateBuilderForField(field);
+                    return this;
+                }
+
+                public override Builder MergeFrom(IMessage other)
+                {
+                    wrappedBuilder.WeakMergeFrom(other);
+                    return this;
+                }
+
+                public override Builder MergeFrom(ICodedInputStream input, ExtensionRegistry extensionRegistry)
+                {
+                    wrappedBuilder.WeakMergeFrom(input, extensionRegistry);
+                    return this;
+                }
+            }
+        }
+    }
+}

+ 8 - 0
csharp/src/ProtocolBuffers.Test/App.xaml

@@ -0,0 +1,8 @@
+<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
+             x:Class="ProtocolBuffers.SilverlightTest.App"
+             >
+    <Application.Resources>
+        
+    </Application.Resources>
+</Application>

+ 60 - 0
csharp/src/ProtocolBuffers.Test/App.xaml.cs

@@ -0,0 +1,60 @@
+using System;
+using System.Windows;
+using Microsoft.Silverlight.Testing;
+
+namespace Google.ProtocolBuffers
+{
+    public partial class App : Application
+    {
+
+        public App()
+        {
+            this.Startup += this.Application_Startup;
+            this.Exit += this.Application_Exit;
+            this.UnhandledException += this.Application_UnhandledException;
+
+            //InitializeComponent();
+        }
+
+        private void Application_Startup(object sender, StartupEventArgs e)
+        {
+            this.RootVisual = UnitTestSystem.CreateTestPage();
+        }
+
+        private void Application_Exit(object sender, EventArgs e)
+        {
+
+        }
+        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
+        {
+            // If the app is running outside of the debugger then report the exception using
+            // the browser's exception mechanism. On IE this will display it a yellow alert 
+            // icon in the status bar and Firefox will display a script error.
+            if (!System.Diagnostics.Debugger.IsAttached)
+            {
+
+                // NOTE: This will allow the application to continue running after an exception has been thrown
+                // but not handled. 
+                // For production applications this error handling should be replaced with something that will 
+                // report the error to the website and stop the application.
+                e.Handled = true;
+                Deployment.Current.Dispatcher.BeginInvoke(
+                    new EventHandler<ApplicationUnhandledExceptionEventArgs>(ReportErrorToDOM), 
+                    new object[] { sender, e } );
+            }
+        }
+        private void ReportErrorToDOM(object sender, ApplicationUnhandledExceptionEventArgs e)
+        {
+            try
+            {
+                string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
+                errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
+
+                System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight 2 Application " + errorMsg + "\");");
+            }
+            catch (Exception)
+            {
+            }
+        }
+    }
+}

+ 147 - 0
csharp/src/ProtocolBuffers.Test/ByteStringTest.cs

@@ -0,0 +1,147 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Text;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class ByteStringTest
+    {
+        [Test]
+        public void EmptyByteStringHasZeroSize()
+        {
+            Assert.AreEqual(0, ByteString.Empty.Length);
+        }
+
+        [Test]
+        public void CopyFromStringWithExplicitEncoding()
+        {
+            ByteString bs = ByteString.CopyFrom("AB", Encoding.Unicode);
+            Assert.AreEqual(4, bs.Length);
+            Assert.AreEqual(65, bs[0]);
+            Assert.AreEqual(0, bs[1]);
+            Assert.AreEqual(66, bs[2]);
+            Assert.AreEqual(0, bs[3]);
+        }
+
+        [Test]
+        public void IsEmptyWhenEmpty()
+        {
+            Assert.IsTrue(ByteString.CopyFromUtf8("").IsEmpty);
+        }
+
+        [Test]
+        public void IsEmptyWhenNotEmpty()
+        {
+            Assert.IsFalse(ByteString.CopyFromUtf8("X").IsEmpty);
+        }
+
+        [Test]
+        public void CopyFromByteArrayCopiesContents()
+        {
+            byte[] data = new byte[1];
+            data[0] = 10;
+            ByteString bs = ByteString.CopyFrom(data);
+            Assert.AreEqual(10, bs[0]);
+            data[0] = 5;
+            Assert.AreEqual(10, bs[0]);
+        }
+
+        [Test]
+        public void ToByteArrayCopiesContents()
+        {
+            ByteString bs = ByteString.CopyFromUtf8("Hello");
+            byte[] data = bs.ToByteArray();
+            Assert.AreEqual((byte)'H', data[0]);
+            Assert.AreEqual((byte)'H', bs[0]);
+            data[0] = 0;
+            Assert.AreEqual(0, data[0]);
+            Assert.AreEqual((byte)'H', bs[0]);
+        }
+
+        [Test]
+        public void CopyFromUtf8UsesUtf8()
+        {
+            ByteString bs = ByteString.CopyFromUtf8("\u20ac");
+            Assert.AreEqual(3, bs.Length);
+            Assert.AreEqual(0xe2, bs[0]);
+            Assert.AreEqual(0x82, bs[1]);
+            Assert.AreEqual(0xac, bs[2]);
+        }
+
+        [Test]
+        public void CopyFromPortion()
+        {
+            byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6};
+            ByteString bs = ByteString.CopyFrom(data, 2, 3);
+            Assert.AreEqual(3, bs.Length);
+            Assert.AreEqual(2, bs[0]);
+            Assert.AreEqual(3, bs[1]);
+        }
+
+        [Test]
+        public void ToStringUtf8()
+        {
+            ByteString bs = ByteString.CopyFromUtf8("\u20ac");
+            Assert.AreEqual("\u20ac", bs.ToStringUtf8());
+        }
+
+        [Test]
+        public void ToStringWithExplicitEncoding()
+        {
+            ByteString bs = ByteString.CopyFrom("\u20ac", Encoding.Unicode);
+            Assert.AreEqual("\u20ac", bs.ToString(Encoding.Unicode));
+        }
+
+        [Test]
+        public void FromBase64_WithText()
+        {
+            byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6};
+            string base64 = Convert.ToBase64String(data);
+            ByteString bs = ByteString.FromBase64(base64);
+            Assert.AreEqual(data, bs.ToByteArray());
+        }
+
+        [Test]
+        public void FromBase64_Empty()
+        {
+            // Optimization which also fixes issue 61.
+            Assert.AreSame(ByteString.Empty, ByteString.FromBase64(""));
+        }
+    }
+}

+ 569 - 0
csharp/src/ProtocolBuffers.Test/CodedInputStreamTest.cs

@@ -0,0 +1,569 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using Google.ProtocolBuffers.Descriptors;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class CodedInputStreamTest
+    {
+        /// <summary>
+        /// Helper to construct a byte array from a bunch of bytes.  The inputs are
+        /// actually ints so that I can use hex notation and not get stupid errors
+        /// about precision.
+        /// </summary>
+        private static byte[] Bytes(params int[] bytesAsInts)
+        {
+            byte[] bytes = new byte[bytesAsInts.Length];
+            for (int i = 0; i < bytesAsInts.Length; i++)
+            {
+                bytes[i] = (byte) bytesAsInts[i];
+            }
+            return bytes;
+        }
+
+        /// <summary>
+        /// Parses the given bytes using ReadRawVarint32() and ReadRawVarint64() and
+        /// </summary>
+        private static void AssertReadVarint(byte[] data, ulong value)
+        {
+            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            Assert.AreEqual((uint) value, input.ReadRawVarint32());
+
+            input = CodedInputStream.CreateInstance(data);
+            Assert.AreEqual(value, input.ReadRawVarint64());
+            Assert.IsTrue(input.IsAtEnd);
+
+            // Try different block sizes.
+            for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
+            {
+                input = CodedInputStream.CreateInstance(new SmallBlockInputStream(data, bufferSize));
+                Assert.AreEqual((uint) value, input.ReadRawVarint32());
+
+                input = CodedInputStream.CreateInstance(new SmallBlockInputStream(data, bufferSize));
+                Assert.AreEqual(value, input.ReadRawVarint64());
+                Assert.IsTrue(input.IsAtEnd);
+            }
+
+            // Try reading directly from a MemoryStream. We want to verify that it
+            // doesn't read past the end of the input, so write an extra byte - this
+            // lets us test the position at the end.
+            MemoryStream memoryStream = new MemoryStream();
+            memoryStream.Write(data, 0, data.Length);
+            memoryStream.WriteByte(0);
+            memoryStream.Position = 0;
+            Assert.AreEqual((uint) value, CodedInputStream.ReadRawVarint32(memoryStream));
+            Assert.AreEqual(data.Length, memoryStream.Position);
+        }
+
+        /// <summary>
+        /// Parses the given bytes using ReadRawVarint32() and ReadRawVarint64() and
+        /// expects them to fail with an InvalidProtocolBufferException whose
+        /// description matches the given one.
+        /// </summary>
+        private static void AssertReadVarintFailure(InvalidProtocolBufferException expected, byte[] data)
+        {
+            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            var exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint32());
+            Assert.AreEqual(expected.Message, exception.Message);
+
+            input = CodedInputStream.CreateInstance(data);
+            exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint64());
+            Assert.AreEqual(expected.Message, exception.Message);
+
+            // Make sure we get the same error when reading directly from a Stream.
+            exception = Assert.Throws<InvalidProtocolBufferException>(() => CodedInputStream.ReadRawVarint32(new MemoryStream(data)));
+            Assert.AreEqual(expected.Message, exception.Message);
+        }
+
+        [Test]
+        public void ReadVarint()
+        {
+            AssertReadVarint(Bytes(0x00), 0);
+            AssertReadVarint(Bytes(0x01), 1);
+            AssertReadVarint(Bytes(0x7f), 127);
+            // 14882
+            AssertReadVarint(Bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7));
+            // 2961488830
+            AssertReadVarint(Bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),
+                             (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
+                             (0x0bL << 28));
+
+            // 64-bit
+            // 7256456126
+            AssertReadVarint(Bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),
+                             (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
+                             (0x1bL << 28));
+            // 41256202580718336
+            AssertReadVarint(Bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),
+                             (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
+                             (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49));
+            // 11964378330978735131
+            AssertReadVarint(Bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),
+                             (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
+                             (0x3bUL << 28) | (0x56UL << 35) | (0x00UL << 42) |
+                             (0x05UL << 49) | (0x26UL << 56) | (0x01UL << 63));
+
+            // Failures
+            AssertReadVarintFailure(
+                InvalidProtocolBufferException.MalformedVarint(),
+                Bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+                      0x00));
+            AssertReadVarintFailure(
+                InvalidProtocolBufferException.TruncatedMessage(),
+                Bytes(0x80));
+        }
+
+        /// <summary>
+        /// Parses the given bytes using ReadRawLittleEndian32() and checks
+        /// that the result matches the given value.
+        /// </summary>
+        private static void AssertReadLittleEndian32(byte[] data, uint value)
+        {
+            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            Assert.AreEqual(value, input.ReadRawLittleEndian32());
+            Assert.IsTrue(input.IsAtEnd);
+
+            // Try different block sizes.
+            for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
+            {
+                input = CodedInputStream.CreateInstance(
+                    new SmallBlockInputStream(data, blockSize));
+                Assert.AreEqual(value, input.ReadRawLittleEndian32());
+                Assert.IsTrue(input.IsAtEnd);
+            }
+        }
+
+        /// <summary>
+        /// Parses the given bytes using ReadRawLittleEndian64() and checks
+        /// that the result matches the given value.
+        /// </summary>
+        private static void AssertReadLittleEndian64(byte[] data, ulong value)
+        {
+            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            Assert.AreEqual(value, input.ReadRawLittleEndian64());
+            Assert.IsTrue(input.IsAtEnd);
+
+            // Try different block sizes.
+            for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
+            {
+                input = CodedInputStream.CreateInstance(
+                    new SmallBlockInputStream(data, blockSize));
+                Assert.AreEqual(value, input.ReadRawLittleEndian64());
+                Assert.IsTrue(input.IsAtEnd);
+            }
+        }
+
+        [Test]
+        public void ReadLittleEndian()
+        {
+            AssertReadLittleEndian32(Bytes(0x78, 0x56, 0x34, 0x12), 0x12345678);
+            AssertReadLittleEndian32(Bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0);
+
+            AssertReadLittleEndian64(Bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12),
+                                     0x123456789abcdef0L);
+            AssertReadLittleEndian64(
+                Bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef012345678UL);
+        }
+
+        [Test]
+        public void DecodeZigZag32()
+        {
+            Assert.AreEqual(0, CodedInputStream.DecodeZigZag32(0));
+            Assert.AreEqual(-1, CodedInputStream.DecodeZigZag32(1));
+            Assert.AreEqual(1, CodedInputStream.DecodeZigZag32(2));
+            Assert.AreEqual(-2, CodedInputStream.DecodeZigZag32(3));
+            Assert.AreEqual(0x3FFFFFFF, CodedInputStream.DecodeZigZag32(0x7FFFFFFE));
+            Assert.AreEqual(unchecked((int) 0xC0000000), CodedInputStream.DecodeZigZag32(0x7FFFFFFF));
+            Assert.AreEqual(0x7FFFFFFF, CodedInputStream.DecodeZigZag32(0xFFFFFFFE));
+            Assert.AreEqual(unchecked((int) 0x80000000), CodedInputStream.DecodeZigZag32(0xFFFFFFFF));
+        }
+
+        [Test]
+        public void DecodeZigZag64()
+        {
+            Assert.AreEqual(0, CodedInputStream.DecodeZigZag64(0));
+            Assert.AreEqual(-1, CodedInputStream.DecodeZigZag64(1));
+            Assert.AreEqual(1, CodedInputStream.DecodeZigZag64(2));
+            Assert.AreEqual(-2, CodedInputStream.DecodeZigZag64(3));
+            Assert.AreEqual(0x000000003FFFFFFFL, CodedInputStream.DecodeZigZag64(0x000000007FFFFFFEL));
+            Assert.AreEqual(unchecked((long) 0xFFFFFFFFC0000000L), CodedInputStream.DecodeZigZag64(0x000000007FFFFFFFL));
+            Assert.AreEqual(0x000000007FFFFFFFL, CodedInputStream.DecodeZigZag64(0x00000000FFFFFFFEL));
+            Assert.AreEqual(unchecked((long) 0xFFFFFFFF80000000L), CodedInputStream.DecodeZigZag64(0x00000000FFFFFFFFL));
+            Assert.AreEqual(0x7FFFFFFFFFFFFFFFL, CodedInputStream.DecodeZigZag64(0xFFFFFFFFFFFFFFFEL));
+            Assert.AreEqual(unchecked((long) 0x8000000000000000L), CodedInputStream.DecodeZigZag64(0xFFFFFFFFFFFFFFFFL));
+        }
+
+        [Test]
+        public void ReadWholeMessage()
+        {
+            TestAllTypes message = TestUtil.GetAllSet();
+
+            byte[] rawBytes = message.ToByteArray();
+            Assert.AreEqual(rawBytes.Length, message.SerializedSize);
+            TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
+            TestUtil.AssertAllFieldsSet(message2);
+
+            // Try different block sizes.
+            for (int blockSize = 1; blockSize < 256; blockSize *= 2)
+            {
+                message2 = TestAllTypes.ParseFrom(new SmallBlockInputStream(rawBytes, blockSize));
+                TestUtil.AssertAllFieldsSet(message2);
+            }
+        }
+
+        [Test]
+        public void SkipWholeMessage()
+        {
+            TestAllTypes message = TestUtil.GetAllSet();
+            byte[] rawBytes = message.ToByteArray();
+
+            // Create two parallel inputs.  Parse one as unknown fields while using
+            // skipField() to skip each field on the other.  Expect the same tags.
+            CodedInputStream input1 = CodedInputStream.CreateInstance(rawBytes);
+            CodedInputStream input2 = CodedInputStream.CreateInstance(rawBytes);
+            UnknownFieldSet.Builder unknownFields = UnknownFieldSet.CreateBuilder();
+
+            uint tag;
+            string name;
+            while (input1.ReadTag(out tag, out name))
+            {
+                uint tag2;
+                Assert.IsTrue(input2.ReadTag(out tag2, out name));
+                Assert.AreEqual(tag, tag2);
+
+                unknownFields.MergeFieldFrom(tag, input1);
+                input2.SkipField();
+            }
+        }
+
+        /// <summary>
+        /// Test that a bug in SkipRawBytes has been fixed: if the skip
+        /// skips exactly up to a limit, this should bnot break things
+        /// </summary>
+        [Test]
+        public void SkipRawBytesBug()
+        {
+            byte[] rawBytes = new byte[] {1, 2};
+            CodedInputStream input = CodedInputStream.CreateInstance(rawBytes);
+
+            int limit = input.PushLimit(1);
+            input.SkipRawBytes(1);
+            input.PopLimit(limit);
+            Assert.AreEqual(2, input.ReadRawByte());
+        }
+
+        public void ReadHugeBlob()
+        {
+            // Allocate and initialize a 1MB blob.
+            byte[] blob = new byte[1 << 20];
+            for (int i = 0; i < blob.Length; i++)
+            {
+                blob[i] = (byte) i;
+            }
+
+            // Make a message containing it.
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            TestUtil.SetAllFields(builder);
+            builder.SetOptionalBytes(ByteString.CopyFrom(blob));
+            TestAllTypes message = builder.Build();
+
+            // Serialize and parse it.  Make sure to parse from an InputStream, not
+            // directly from a ByteString, so that CodedInputStream uses buffered
+            // reading.
+            TestAllTypes message2 = TestAllTypes.ParseFrom(message.ToByteString().CreateCodedInput());
+
+            Assert.AreEqual(message.OptionalBytes, message2.OptionalBytes);
+
+            // Make sure all the other fields were parsed correctly.
+            TestAllTypes message3 = TestAllTypes.CreateBuilder(message2)
+                .SetOptionalBytes(TestUtil.GetAllSet().OptionalBytes)
+                .Build();
+            TestUtil.AssertAllFieldsSet(message3);
+        }
+
+        [Test]
+        public void ReadMaliciouslyLargeBlob()
+        {
+            MemoryStream ms = new MemoryStream();
+            CodedOutputStream output = CodedOutputStream.CreateInstance(ms);
+
+            uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
+            output.WriteRawVarint32(tag);
+            output.WriteRawVarint32(0x7FFFFFFF);
+            output.WriteRawBytes(new byte[32]); // Pad with a few random bytes.
+            output.Flush();
+            ms.Position = 0;
+
+            CodedInputStream input = CodedInputStream.CreateInstance(ms);
+            uint testtag;
+            string ignore;
+            Assert.IsTrue(input.ReadTag(out testtag, out ignore));
+            Assert.AreEqual(tag, testtag);
+
+            ByteString bytes = null;
+            // TODO(jonskeet): Should this be ArgumentNullException instead?
+            Assert.Throws<InvalidProtocolBufferException>(() => input.ReadBytes(ref bytes));
+        }
+
+        private static TestRecursiveMessage MakeRecursiveMessage(int depth)
+        {
+            if (depth == 0)
+            {
+                return TestRecursiveMessage.CreateBuilder().SetI(5).Build();
+            }
+            else
+            {
+                return TestRecursiveMessage.CreateBuilder()
+                    .SetA(MakeRecursiveMessage(depth - 1)).Build();
+            }
+        }
+
+        private static void AssertMessageDepth(TestRecursiveMessage message, int depth)
+        {
+            if (depth == 0)
+            {
+                Assert.IsFalse(message.HasA);
+                Assert.AreEqual(5, message.I);
+            }
+            else
+            {
+                Assert.IsTrue(message.HasA);
+                AssertMessageDepth(message.A, depth - 1);
+            }
+        }
+
+        [Test]
+        public void MaliciousRecursion()
+        {
+            ByteString data64 = MakeRecursiveMessage(64).ToByteString();
+            ByteString data65 = MakeRecursiveMessage(65).ToByteString();
+
+            AssertMessageDepth(TestRecursiveMessage.ParseFrom(data64), 64);
+
+            Assert.Throws<InvalidProtocolBufferException>(() => TestRecursiveMessage.ParseFrom(data65));
+
+            CodedInputStream input = data64.CreateCodedInput();
+            input.SetRecursionLimit(8);
+            Assert.Throws<InvalidProtocolBufferException>(() => TestRecursiveMessage.ParseFrom(input));
+        }
+
+        [Test]
+        public void SizeLimit()
+        {
+            // Have to use a Stream rather than ByteString.CreateCodedInput as SizeLimit doesn't
+            // apply to the latter case.
+            MemoryStream ms = new MemoryStream(TestUtil.GetAllSet().ToByteString().ToByteArray());
+            CodedInputStream input = CodedInputStream.CreateInstance(ms);
+            input.SetSizeLimit(16);
+
+            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.ParseFrom(input));
+        }
+
+        [Test]
+        public void ResetSizeCounter()
+        {
+            CodedInputStream input = CodedInputStream.CreateInstance(
+                new SmallBlockInputStream(new byte[256], 8));
+            input.SetSizeLimit(16);
+            input.ReadRawBytes(16);
+
+            Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawByte());
+
+            input.ResetSizeCounter();
+            input.ReadRawByte(); // No exception thrown.
+
+            Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawBytes(16));
+        }
+
+        /// <summary>
+        /// Tests that if we read an string that contains invalid UTF-8, no exception
+        /// is thrown.  Instead, the invalid bytes are replaced with the Unicode
+        /// "replacement character" U+FFFD.
+        /// </summary>
+        [Test]
+        public void ReadInvalidUtf8()
+        {
+            MemoryStream ms = new MemoryStream();
+            CodedOutputStream output = CodedOutputStream.CreateInstance(ms);
+
+            uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
+            output.WriteRawVarint32(tag);
+            output.WriteRawVarint32(1);
+            output.WriteRawBytes(new byte[] {0x80});
+            output.Flush();
+            ms.Position = 0;
+
+            CodedInputStream input = CodedInputStream.CreateInstance(ms);
+
+            uint testtag;
+            string ignored;
+
+            Assert.IsTrue(input.ReadTag(out testtag, out ignored));
+            Assert.AreEqual(tag, testtag);
+            string text = null;
+            input.ReadString(ref text);
+            Assert.AreEqual('\ufffd', text[0]);
+        }
+
+        /// <summary>
+        /// A stream which limits the number of bytes it reads at a time.
+        /// We use this to make sure that CodedInputStream doesn't screw up when
+        /// reading in small blocks.
+        /// </summary>
+        private sealed class SmallBlockInputStream : MemoryStream
+        {
+            private readonly int blockSize;
+
+            public SmallBlockInputStream(byte[] data, int blockSize)
+                : base(data)
+            {
+                this.blockSize = blockSize;
+            }
+
+            public override int Read(byte[] buffer, int offset, int count)
+            {
+                return base.Read(buffer, offset, Math.Min(count, blockSize));
+            }
+        }
+
+        enum TestNegEnum { None = 0, Value = -2 }
+
+        [Test]
+        public void TestNegativeEnum()
+        {
+            byte[] bytes = new byte[10] { 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01 };
+            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            object unk;
+            TestNegEnum val = TestNegEnum.None;
+
+            Assert.IsTrue(input.ReadEnum(ref val, out unk));
+            Assert.IsTrue(input.IsAtEnd);
+            Assert.AreEqual(TestNegEnum.Value, val);
+        }
+
+        [Test]
+        public void TestNegativeEnumPackedArray()
+        {
+            int arraySize = 1 + (10 * 5);
+            int msgSize = 1 + 1 + arraySize;
+            byte[] bytes = new byte[msgSize];
+            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            output.WritePackedInt32Array(8, "", arraySize, new int[] { 0, -1, -2, -3, -4, -5 });
+
+            Assert.AreEqual(0, output.SpaceLeft);
+
+            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            uint tag;
+            string name;
+            Assert.IsTrue(input.ReadTag(out tag, out name));
+
+            List<TestNegEnum> values = new List<TestNegEnum>();
+            ICollection<object> unk;
+            input.ReadEnumArray(tag, name, values, out unk);
+
+            Assert.AreEqual(2, values.Count);
+            Assert.AreEqual(TestNegEnum.None, values[0]);
+            Assert.AreEqual(TestNegEnum.Value, values[1]);
+
+            Assert.NotNull(unk);
+            Assert.AreEqual(4, unk.Count);
+        }
+
+        [Test]
+        public void TestNegativeEnumArray()
+        {
+            int arraySize = 1 + 1 + (11 * 5);
+            int msgSize = arraySize;
+            byte[] bytes = new byte[msgSize];
+            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            output.WriteInt32Array(8, "", new int[] { 0, -1, -2, -3, -4, -5 });
+
+            Assert.AreEqual(0, output.SpaceLeft);
+
+            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            uint tag;
+            string name;
+            Assert.IsTrue(input.ReadTag(out tag, out name));
+
+            List<TestNegEnum> values = new List<TestNegEnum>();
+            ICollection<object> unk;
+            input.ReadEnumArray(tag, name, values, out unk);
+
+            Assert.AreEqual(2, values.Count);
+            Assert.AreEqual(TestNegEnum.None, values[0]);
+            Assert.AreEqual(TestNegEnum.Value, values[1]);
+
+            Assert.NotNull(unk);
+            Assert.AreEqual(4, unk.Count);
+        }
+
+        //Issue 71:	CodedInputStream.ReadBytes go to slow path unnecessarily
+        [Test]
+        public void TestSlowPathAvoidance()
+        {
+            using (var ms = new MemoryStream())
+            {
+                CodedOutputStream output = CodedOutputStream.CreateInstance(ms);
+                output.WriteField(FieldType.Bytes, 1, "bytes", ByteString.CopyFrom(new byte[100]));
+                output.WriteField(FieldType.Bytes, 2, "bytes", ByteString.CopyFrom(new byte[100]));
+                output.Flush();
+
+                ms.Position = 0;
+                CodedInputStream input = CodedInputStream.CreateInstance(ms, new byte[ms.Length / 2]);
+
+                uint tag;
+                string ignore;
+                ByteString value;
+
+                Assert.IsTrue(input.ReadTag(out tag, out ignore));
+                Assert.AreEqual(1, WireFormat.GetTagFieldNumber(tag));
+                value = ByteString.Empty;
+                Assert.IsTrue(input.ReadBytes(ref value) && value.Length == 100);
+
+                Assert.IsTrue(input.ReadTag(out tag, out ignore));
+                Assert.AreEqual(2, WireFormat.GetTagFieldNumber(tag));
+                value = ByteString.Empty;
+                Assert.IsTrue(input.ReadBytes(ref value) && value.Length == 100);
+            }
+        }
+    }
+}

+ 471 - 0
csharp/src/ProtocolBuffers.Test/CodedOutputStreamTest.cs

@@ -0,0 +1,471 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class CodedOutputStreamTest
+    {
+        /// <summary>
+        /// Writes the given value using WriteRawVarint32() and WriteRawVarint64() and
+        /// checks that the result matches the given bytes
+        /// </summary>
+        private static void AssertWriteVarint(byte[] data, ulong value)
+        {
+            // Only do 32-bit write if the value fits in 32 bits.
+            if ((value >> 32) == 0)
+            {
+                MemoryStream rawOutput = new MemoryStream();
+                CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);
+                output.WriteRawVarint32((uint) value);
+                output.Flush();
+                Assert.AreEqual(data, rawOutput.ToArray());
+                // Also try computing size.
+                Assert.AreEqual(data.Length, CodedOutputStream.ComputeRawVarint32Size((uint) value));
+            }
+
+            {
+                MemoryStream rawOutput = new MemoryStream();
+                CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);
+                output.WriteRawVarint64(value);
+                output.Flush();
+                Assert.AreEqual(data, rawOutput.ToArray());
+
+                // Also try computing size.
+                Assert.AreEqual(data.Length, CodedOutputStream.ComputeRawVarint64Size(value));
+            }
+
+            // Try different buffer sizes.
+            for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
+            {
+                // Only do 32-bit write if the value fits in 32 bits.
+                if ((value >> 32) == 0)
+                {
+                    MemoryStream rawOutput = new MemoryStream();
+                    CodedOutputStream output =
+                        CodedOutputStream.CreateInstance(rawOutput, bufferSize);
+                    output.WriteRawVarint32((uint) value);
+                    output.Flush();
+                    Assert.AreEqual(data, rawOutput.ToArray());
+                }
+
+                {
+                    MemoryStream rawOutput = new MemoryStream();
+                    CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput, bufferSize);
+                    output.WriteRawVarint64(value);
+                    output.Flush();
+                    Assert.AreEqual(data, rawOutput.ToArray());
+                }
+            }
+        }
+
+        /// <summary>
+        /// Tests WriteRawVarint32() and WriteRawVarint64()
+        /// </summary>
+        [Test]
+        public void WriteVarint()
+        {
+            AssertWriteVarint(new byte[] {0x00}, 0);
+            AssertWriteVarint(new byte[] {0x01}, 1);
+            AssertWriteVarint(new byte[] {0x7f}, 127);
+            // 14882
+            AssertWriteVarint(new byte[] {0xa2, 0x74}, (0x22 << 0) | (0x74 << 7));
+            // 2961488830
+            AssertWriteVarint(new byte[] {0xbe, 0xf7, 0x92, 0x84, 0x0b},
+                              (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
+                              (0x0bL << 28));
+
+            // 64-bit
+            // 7256456126
+            AssertWriteVarint(new byte[] {0xbe, 0xf7, 0x92, 0x84, 0x1b},
+                              (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
+                              (0x1bL << 28));
+            // 41256202580718336
+            AssertWriteVarint(
+                new byte[] {0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49},
+                (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
+                (0x43UL << 28) | (0x49L << 35) | (0x24UL << 42) | (0x49UL << 49));
+            // 11964378330978735131
+            AssertWriteVarint(
+                new byte[] {0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01},
+                unchecked((ulong)
+                          ((0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
+                           (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |
+                           (0x05L << 49) | (0x26L << 56) | (0x01L << 63))));
+        }
+
+        /// <summary>
+        /// Parses the given bytes using WriteRawLittleEndian32() and checks
+        /// that the result matches the given value.
+        /// </summary>
+        private static void AssertWriteLittleEndian32(byte[] data, uint value)
+        {
+            MemoryStream rawOutput = new MemoryStream();
+            CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);
+            output.WriteRawLittleEndian32(value);
+            output.Flush();
+            Assert.AreEqual(data, rawOutput.ToArray());
+
+            // Try different buffer sizes.
+            for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
+            {
+                rawOutput = new MemoryStream();
+                output = CodedOutputStream.CreateInstance(rawOutput, bufferSize);
+                output.WriteRawLittleEndian32(value);
+                output.Flush();
+                Assert.AreEqual(data, rawOutput.ToArray());
+            }
+        }
+
+        /// <summary>
+        /// Parses the given bytes using WriteRawLittleEndian64() and checks
+        /// that the result matches the given value.
+        /// </summary>
+        private static void AssertWriteLittleEndian64(byte[] data, ulong value)
+        {
+            MemoryStream rawOutput = new MemoryStream();
+            CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);
+            output.WriteRawLittleEndian64(value);
+            output.Flush();
+            Assert.AreEqual(data, rawOutput.ToArray());
+
+            // Try different block sizes.
+            for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
+            {
+                rawOutput = new MemoryStream();
+                output = CodedOutputStream.CreateInstance(rawOutput, blockSize);
+                output.WriteRawLittleEndian64(value);
+                output.Flush();
+                Assert.AreEqual(data, rawOutput.ToArray());
+            }
+        }
+
+        /// <summary>
+        /// Tests writeRawLittleEndian32() and writeRawLittleEndian64().
+        /// </summary>
+        [Test]
+        public void WriteLittleEndian()
+        {
+            AssertWriteLittleEndian32(new byte[] {0x78, 0x56, 0x34, 0x12}, 0x12345678);
+            AssertWriteLittleEndian32(new byte[] {0xf0, 0xde, 0xbc, 0x9a}, 0x9abcdef0);
+
+            AssertWriteLittleEndian64(
+                new byte[] {0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12},
+                0x123456789abcdef0L);
+            AssertWriteLittleEndian64(
+                new byte[] {0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a},
+                0x9abcdef012345678UL);
+        }
+
+        [Test]
+        public void WriteWholeMessage()
+        {
+            TestAllTypes message = TestUtil.GetAllSet();
+
+            byte[] rawBytes = message.ToByteArray();
+            TestUtil.AssertEqualBytes(TestUtil.GoldenMessage.ToByteArray(), rawBytes);
+
+            // Try different block sizes.
+            for (int blockSize = 1; blockSize < 256; blockSize *= 2)
+            {
+                MemoryStream rawOutput = new MemoryStream();
+                CodedOutputStream output =
+                    CodedOutputStream.CreateInstance(rawOutput, blockSize);
+                message.WriteTo(output);
+                output.Flush();
+                TestUtil.AssertEqualBytes(rawBytes, rawOutput.ToArray());
+            }
+        }
+
+        /// <summary>
+        /// Tests writing a whole message with every packed field type. Ensures the
+        /// wire format of packed fields is compatible with C++.
+        /// </summary>
+        [Test]
+        public void WriteWholePackedFieldsMessage()
+        {
+            TestPackedTypes message = TestUtil.GetPackedSet();
+
+            byte[] rawBytes = message.ToByteArray();
+            TestUtil.AssertEqualBytes(TestUtil.GetGoldenPackedFieldsMessage().ToByteArray(),
+                                      rawBytes);
+        }
+
+        [Test]
+        public void EncodeZigZag32()
+        {
+            Assert.AreEqual(0u, CodedOutputStream.EncodeZigZag32(0));
+            Assert.AreEqual(1u, CodedOutputStream.EncodeZigZag32(-1));
+            Assert.AreEqual(2u, CodedOutputStream.EncodeZigZag32(1));
+            Assert.AreEqual(3u, CodedOutputStream.EncodeZigZag32(-2));
+            Assert.AreEqual(0x7FFFFFFEu, CodedOutputStream.EncodeZigZag32(0x3FFFFFFF));
+            Assert.AreEqual(0x7FFFFFFFu, CodedOutputStream.EncodeZigZag32(unchecked((int) 0xC0000000)));
+            Assert.AreEqual(0xFFFFFFFEu, CodedOutputStream.EncodeZigZag32(0x7FFFFFFF));
+            Assert.AreEqual(0xFFFFFFFFu, CodedOutputStream.EncodeZigZag32(unchecked((int) 0x80000000)));
+        }
+
+        [Test]
+        public void EncodeZigZag64()
+        {
+            Assert.AreEqual(0u, CodedOutputStream.EncodeZigZag64(0));
+            Assert.AreEqual(1u, CodedOutputStream.EncodeZigZag64(-1));
+            Assert.AreEqual(2u, CodedOutputStream.EncodeZigZag64(1));
+            Assert.AreEqual(3u, CodedOutputStream.EncodeZigZag64(-2));
+            Assert.AreEqual(0x000000007FFFFFFEuL,
+                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0x000000003FFFFFFFUL)));
+            Assert.AreEqual(0x000000007FFFFFFFuL,
+                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0xFFFFFFFFC0000000UL)));
+            Assert.AreEqual(0x00000000FFFFFFFEuL,
+                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0x000000007FFFFFFFUL)));
+            Assert.AreEqual(0x00000000FFFFFFFFuL,
+                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0xFFFFFFFF80000000UL)));
+            Assert.AreEqual(0xFFFFFFFFFFFFFFFEL,
+                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0x7FFFFFFFFFFFFFFFUL)));
+            Assert.AreEqual(0xFFFFFFFFFFFFFFFFL,
+                            CodedOutputStream.EncodeZigZag64(unchecked((long) 0x8000000000000000UL)));
+        }
+
+        [Test]
+        public void RoundTripZigZag32()
+        {
+            // Some easier-to-verify round-trip tests.  The inputs (other than 0, 1, -1)
+            // were chosen semi-randomly via keyboard bashing.
+            Assert.AreEqual(0, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(0)));
+            Assert.AreEqual(1, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(1)));
+            Assert.AreEqual(-1, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(-1)));
+            Assert.AreEqual(14927, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(14927)));
+            Assert.AreEqual(-3612, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(-3612)));
+        }
+
+        [Test]
+        public void RoundTripZigZag64()
+        {
+            Assert.AreEqual(0, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(0)));
+            Assert.AreEqual(1, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(1)));
+            Assert.AreEqual(-1, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-1)));
+            Assert.AreEqual(14927, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(14927)));
+            Assert.AreEqual(-3612, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-3612)));
+
+            Assert.AreEqual(856912304801416L,
+                            CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(856912304801416L)));
+            Assert.AreEqual(-75123905439571256L,
+                            CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-75123905439571256L)));
+        }
+
+        [Test]
+        public void TestNegativeEnumNoTag()
+        {
+            Assert.AreEqual(10, CodedOutputStream.ComputeInt32SizeNoTag(-2));
+            Assert.AreEqual(10, CodedOutputStream.ComputeEnumSizeNoTag(-2));
+
+            byte[] bytes = new byte[10];
+            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            output.WriteEnumNoTag(-2);
+
+            Assert.AreEqual(0, output.SpaceLeft);
+            Assert.AreEqual("FE-FF-FF-FF-FF-FF-FF-FF-FF-01", BitConverter.ToString(bytes));
+        }
+
+        [Test]
+        public void TestNegativeEnumWithTag()
+        {
+            Assert.AreEqual(11, CodedOutputStream.ComputeInt32Size(8, -2));
+            Assert.AreEqual(11, CodedOutputStream.ComputeEnumSize(8, -2));
+
+            byte[] bytes = new byte[11];
+            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            output.WriteEnum(8, "", -2, -2);
+
+            Assert.AreEqual(0, output.SpaceLeft);
+            //fyi, 0x40 == 0x08 << 3 + 0, field num + wire format shift
+            Assert.AreEqual("40-FE-FF-FF-FF-FF-FF-FF-FF-FF-01", BitConverter.ToString(bytes));
+        }
+
+        [Test]
+        public void TestNegativeEnumArrayPacked()
+        {
+            int arraySize = 1 + (10 * 5);
+            int msgSize = 1 + 1 + arraySize;
+            byte[] bytes = new byte[msgSize];
+            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            output.WritePackedEnumArray(8, "", arraySize, new int[] { 0, -1, -2, -3, -4, -5 });
+
+            Assert.AreEqual(0, output.SpaceLeft);
+
+            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            uint tag;
+            string name;
+            Assert.IsTrue(input.ReadTag(out tag, out name));
+
+            List<int> values = new List<int>();
+            input.ReadInt32Array(tag, name, values);
+
+            Assert.AreEqual(6, values.Count);
+            for (int i = 0; i > -6; i--)
+                Assert.AreEqual(i, values[Math.Abs(i)]);
+        }
+
+        [Test]
+        public void TestNegativeEnumArray()
+        {
+            int arraySize = 1 + 1 + (11 * 5);
+            int msgSize = arraySize;
+            byte[] bytes = new byte[msgSize];
+            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            output.WriteEnumArray(8, "", new int[] { 0, -1, -2, -3, -4, -5 });
+
+            Assert.AreEqual(0, output.SpaceLeft);
+
+            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            uint tag;
+            string name;
+            Assert.IsTrue(input.ReadTag(out tag, out name));
+
+            List<int> values = new List<int>();
+            input.ReadInt32Array(tag, name, values);
+
+            Assert.AreEqual(6, values.Count);
+            for (int i = 0; i > -6; i--)
+                Assert.AreEqual(i, values[Math.Abs(i)]);
+        }
+
+        [Test]
+        public void TestCodedInputOutputPosition()
+        {
+            byte[] content = new byte[110];
+            for (int i = 0; i < content.Length; i++)
+                content[i] = (byte)i;
+
+            byte[] child = new byte[120];
+            {
+                MemoryStream ms = new MemoryStream(child);
+                CodedOutputStream cout = CodedOutputStream.CreateInstance(ms, 20);
+                // Field 11: numeric value: 500
+                cout.WriteTag(11, WireFormat.WireType.Varint);
+                Assert.AreEqual(1, cout.Position);
+                cout.WriteInt32NoTag(500);
+                Assert.AreEqual(3, cout.Position);
+                //Field 12: length delimited 120 bytes
+                cout.WriteTag(12, WireFormat.WireType.LengthDelimited);
+                Assert.AreEqual(4, cout.Position);
+                cout.WriteBytesNoTag(ByteString.CopyFrom(content));
+                Assert.AreEqual(115, cout.Position);
+                // Field 13: fixed numeric value: 501
+                cout.WriteTag(13, WireFormat.WireType.Fixed32);
+                Assert.AreEqual(116, cout.Position);
+                cout.WriteSFixed32NoTag(501);
+                Assert.AreEqual(120, cout.Position);
+                cout.Flush();
+            }
+
+            byte[] bytes = new byte[130];
+            {
+                CodedOutputStream cout = CodedOutputStream.CreateInstance(bytes);
+                // Field 1: numeric value: 500
+                cout.WriteTag(1, WireFormat.WireType.Varint);
+                Assert.AreEqual(1, cout.Position);
+                cout.WriteInt32NoTag(500);
+                Assert.AreEqual(3, cout.Position);
+                //Field 2: length delimited 120 bytes
+                cout.WriteTag(2, WireFormat.WireType.LengthDelimited);
+                Assert.AreEqual(4, cout.Position);
+                cout.WriteBytesNoTag(ByteString.CopyFrom(child));
+                Assert.AreEqual(125, cout.Position);
+                // Field 3: fixed numeric value: 500
+                cout.WriteTag(3, WireFormat.WireType.Fixed32);
+                Assert.AreEqual(126, cout.Position);
+                cout.WriteSFixed32NoTag(501);
+                Assert.AreEqual(130, cout.Position);
+                cout.Flush();
+            }
+            //Now test Input stream:
+            {
+                CodedInputStream cin = CodedInputStream.CreateInstance(new MemoryStream(bytes), new byte[50]);
+                uint tag;
+                int intValue = 0;
+                string ignore;
+                Assert.AreEqual(0, cin.Position);
+                // Field 1:
+                Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 1);
+                Assert.AreEqual(1, cin.Position);
+                Assert.IsTrue(cin.ReadInt32(ref intValue) && intValue == 500);
+                Assert.AreEqual(3, cin.Position);
+                //Field 2:
+                Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 2);
+                Assert.AreEqual(4, cin.Position);
+                uint childlen = cin.ReadRawVarint32();
+                Assert.AreEqual(120u, childlen);
+                Assert.AreEqual(5, cin.Position);
+                int oldlimit = cin.PushLimit((int)childlen);
+                Assert.AreEqual(5, cin.Position);
+                // Now we are reading child message
+                {
+                    // Field 11: numeric value: 500
+                    Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 11);
+                    Assert.AreEqual(6, cin.Position);
+                    Assert.IsTrue(cin.ReadInt32(ref intValue) && intValue == 500);
+                    Assert.AreEqual(8, cin.Position);
+                    //Field 12: length delimited 120 bytes
+                    Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 12);
+                    Assert.AreEqual(9, cin.Position);
+                    ByteString bstr = null;
+                    Assert.IsTrue(cin.ReadBytes(ref bstr) && bstr.Length == 110 && bstr.ToByteArray()[109] == 109);
+                    Assert.AreEqual(120, cin.Position);
+                    // Field 13: fixed numeric value: 501
+                    Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 13);
+                    // ROK - Previously broken here, this returned 126 failing to account for bufferSizeAfterLimit
+                    Assert.AreEqual(121, cin.Position);
+                    Assert.IsTrue(cin.ReadSFixed32(ref intValue) && intValue == 501);
+                    Assert.AreEqual(125, cin.Position);
+                    Assert.IsTrue(cin.IsAtEnd);
+                }
+                cin.PopLimit(oldlimit);
+                Assert.AreEqual(125, cin.Position);
+                // Field 3: fixed numeric value: 501
+                Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 3);
+                Assert.AreEqual(126, cin.Position);
+                Assert.IsTrue(cin.ReadSFixed32(ref intValue) && intValue == 501);
+                Assert.AreEqual(130, cin.Position);
+                Assert.IsTrue(cin.IsAtEnd);
+            }
+        }
+    }
+}

+ 125 - 0
csharp/src/ProtocolBuffers.Test/Collections/PopsicleListTest.cs

@@ -0,0 +1,125 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.Collections
+{
+    public class PopsicleListTest
+    {
+        [Test]
+        public void MutatingOperationsOnFrozenList()
+        {
+            PopsicleList<string> list = new PopsicleList<string>();
+            list.MakeReadOnly();
+            Assert.Throws<NotSupportedException>(() => list.Add(""));
+            Assert.Throws<NotSupportedException>(() => list.Clear());
+            Assert.Throws<NotSupportedException>(() => list.Insert(0, ""));
+            Assert.Throws<NotSupportedException>(() => list.Remove(""));
+            Assert.Throws<NotSupportedException>(() => list.RemoveAt(0));
+            Assert.Throws<NotSupportedException>(() => list.Add(new[] { "", "" }));
+        }
+
+        [Test]
+        public void NonMutatingOperationsOnFrozenList()
+        {
+            PopsicleList<string> list = new PopsicleList<string>();
+            list.MakeReadOnly();
+            Assert.IsFalse(list.Contains(""));
+            Assert.AreEqual(0, list.Count);
+            list.CopyTo(new string[5], 0);
+            list.GetEnumerator();
+            Assert.AreEqual(-1, list.IndexOf(""));
+            Assert.IsTrue(list.IsReadOnly);
+        }
+
+        [Test]
+        public void MutatingOperationsOnFluidList()
+        {
+            PopsicleList<string> list = new PopsicleList<string>();
+            list.Add("");
+            list.Clear();
+            list.Insert(0, "");
+            list.Remove("");
+            list.Add("x"); // Just to make the next call valid
+            list.RemoveAt(0);
+        }
+
+        [Test]
+        public void NonMutatingOperationsOnFluidList()
+        {
+            PopsicleList<string> list = new PopsicleList<string>();
+            Assert.IsFalse(list.Contains(""));
+            Assert.AreEqual(0, list.Count);
+            list.CopyTo(new string[5], 0);
+            list.GetEnumerator();
+            Assert.AreEqual(-1, list.IndexOf(""));
+            Assert.IsFalse(list.IsReadOnly);
+        }
+
+        [Test]
+        public void DoesNotAddNullEnumerable()
+        {
+            PopsicleList<string> list = new PopsicleList<string>();
+            Assert.Throws<ArgumentNullException>(() => list.Add((IEnumerable<string>) null));
+        }
+
+        [Test]
+        public void DoesNotAddRangeWithNull()
+        {
+            PopsicleList<string> list = new PopsicleList<string>();
+            // TODO(jonskeet): Change to ArgumentException? The argument isn't null...
+            Assert.Throws<ArgumentNullException>(() => list.Add(new[] {"a", "b", null}));
+        }
+
+        [Test]
+        public void DoesNotAddNull()
+        {
+            PopsicleList<string> list = new PopsicleList<string>();
+            Assert.Throws<ArgumentNullException>(() => list.Add((string) null));
+        }
+
+        [Test]
+        public void DoesNotSetNull()
+        {
+            PopsicleList<string> list = new PopsicleList<string>();
+            list.Add("a");
+            Assert.Throws<ArgumentNullException>(() => list[0] = null);
+        }
+    }
+}

+ 18 - 0
csharp/src/ProtocolBuffers.Test/Compatibility/BinaryCompatibilityTests.cs

@@ -0,0 +1,18 @@
+using System;
+
+namespace Google.ProtocolBuffers.Compatibility
+{
+    public class BinaryCompatibilityTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            byte[] bresult = message.ToByteArray();
+            return Convert.ToBase64String(bresult);
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            return builder.MergeFrom((byte[])Convert.FromBase64String((string)message), registry);
+        }
+    }
+}

+ 227 - 0
csharp/src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs

@@ -0,0 +1,227 @@
+using System;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+
+namespace Google.ProtocolBuffers.Compatibility
+{
+    /// <summary>
+    /// This abstract base implements several tests to ensure that well-known messages can be written
+    /// and read to/from various formats without losing data.  Implementations override the two serialization
+    /// methods to provide the tests with the means to read and write for a given format.
+    /// </summary>
+    public abstract class CompatibilityTests
+    {
+        protected abstract object SerializeMessage<TMessage, TBuilder>(TMessage message)
+            where TMessage : IMessageLite<TMessage, TBuilder>
+            where TBuilder : IBuilderLite<TMessage, TBuilder>;
+
+        protected abstract TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+            where TMessage : IMessageLite<TMessage, TBuilder>
+            where TBuilder : IBuilderLite<TMessage, TBuilder>;
+
+        protected virtual void AssertOutputEquals(object lhs, object rhs)
+        {
+            Assert.AreEqual(lhs, rhs);
+        }
+
+        [Test]
+        public virtual void RoundTripWithEmptyChildMessageSize()
+        {
+            SizeMessage1 msg = SizeMessage1.CreateBuilder()
+                .SetField100(100)
+                .SetField15(SizeMessage1SubMessage.DefaultInstance)
+                .BuildPartial();
+            byte[] contents = msg.ToByteArray();
+            object content = SerializeMessage<SizeMessage1, SizeMessage1.Builder>(msg);
+
+            SizeMessage1 copy = DeserializeMessage<SizeMessage1, SizeMessage1.Builder>(content, SizeMessage1.CreateBuilder(), ExtensionRegistry.Empty).BuildPartial();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<SizeMessage1, SizeMessage1.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(contents), Convert.ToBase64String(copy.ToByteArray()));
+        }
+
+        [Test]
+        public virtual void RoundTripWithEmptyChildMessageSpeed()
+        {
+            SpeedMessage1 msg = SpeedMessage1.CreateBuilder()
+                .SetField100(100)
+                .SetField15(SpeedMessage1SubMessage.DefaultInstance)
+                .BuildPartial();
+            byte[] contents = msg.ToByteArray();
+            object content = SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(msg);
+
+            SpeedMessage1 copy = DeserializeMessage<SpeedMessage1, SpeedMessage1.Builder>(content, SpeedMessage1.CreateBuilder(), ExtensionRegistry.Empty).BuildPartial();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(contents), Convert.ToBase64String(copy.ToByteArray()));
+        }
+
+        [Test]
+        public virtual void RoundTripMessage1OptimizeSize()
+        {
+            SizeMessage1 msg = SizeMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();
+            object content = SerializeMessage<SizeMessage1, SizeMessage1.Builder>(msg);
+
+            SizeMessage1 copy = DeserializeMessage<SizeMessage1, SizeMessage1.Builder>(content, SizeMessage1.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<SizeMessage1, SizeMessage1.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(TestResources.google_message1), Convert.ToBase64String(copy.ToByteArray()));
+        }
+
+        [Test]
+        public virtual void RoundTripMessage2OptimizeSize()
+        {
+            SizeMessage2 msg = SizeMessage2.CreateBuilder().MergeFrom(TestResources.google_message2).Build();
+            object content = SerializeMessage<SizeMessage2, SizeMessage2.Builder>(msg);
+
+            SizeMessage2 copy = DeserializeMessage<SizeMessage2, SizeMessage2.Builder>(content, SizeMessage2.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<SizeMessage2, SizeMessage2.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(TestResources.google_message2), Convert.ToBase64String(copy.ToByteArray()));
+        }
+
+        [Test]
+        public virtual void RoundTripMessage1OptimizeSpeed()
+        {
+            SpeedMessage1 msg = SpeedMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();
+            object content = SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(msg);
+
+            SpeedMessage1 copy = DeserializeMessage<SpeedMessage1, SpeedMessage1.Builder>(content, SpeedMessage1.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(TestResources.google_message1), Convert.ToBase64String(copy.ToByteArray()));
+        }
+
+        [Test]
+        public virtual void RoundTripMessage2OptimizeSpeed()
+        {
+            SpeedMessage2 msg = SpeedMessage2.CreateBuilder().MergeFrom(TestResources.google_message2).Build();
+            object content = SerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(msg);
+
+            SpeedMessage2 copy = DeserializeMessage<SpeedMessage2, SpeedMessage2.Builder>(content, SpeedMessage2.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(TestResources.google_message2), Convert.ToBase64String(copy.ToByteArray()));
+        }
+
+        #region Test message builders
+
+        protected static TestAllTypes.Builder AddAllTypes(TestAllTypes.Builder builder)
+        {
+            return builder.SetOptionalInt32(1001)
+                .SetOptionalInt64(1001)
+                .SetOptionalUint32(1001)
+                .SetOptionalUint64(1001)
+                .SetOptionalSint32(-1001)
+                .SetOptionalSint64(-1001)
+                .SetOptionalFixed32(1001)
+                .SetOptionalFixed64(1001)
+                .SetOptionalSfixed32(-1001)
+                .SetOptionalSfixed64(-1001)
+                .SetOptionalFloat(1001.1001f)
+                .SetOptionalDouble(1001.1001)
+                .SetOptionalBool(true)
+                .SetOptionalString("this is a string value")
+                .SetOptionalBytes(ByteString.CopyFromUtf8("this is an array of bytes"))
+                .SetOptionalGroup(new TestAllTypes.Types.OptionalGroup.Builder().SetA(1001))
+                .SetOptionalNestedMessage(new TestAllTypes.Types.NestedMessage.Builder().SetBb(1001))
+                .SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.FOO)
+            ;
+        }
+
+        protected static TestAllTypes.Builder AddRepeatedTypes(TestAllTypes.Builder builder, int size)
+        {
+            //repeated values
+            for (int i = 0; i < size; i++)
+                builder.AddRepeatedInt32(1001 + i)
+                .AddRepeatedInt64(1001)
+                .AddRepeatedUint32(1001)
+                .AddRepeatedUint64(1001)
+                .AddRepeatedSint32(-1001)
+                .AddRepeatedSint64(-1001)
+                .AddRepeatedFixed32(1001)
+                .AddRepeatedFixed64(1001)
+                .AddRepeatedSfixed32(-1001)
+                .AddRepeatedSfixed64(-1001)
+                .AddRepeatedFloat(1001.1001f)
+                .AddRepeatedDouble(1001.1001)
+                .AddRepeatedBool(true)
+                .AddRepeatedString("this is a string value")
+                .AddRepeatedBytes(ByteString.CopyFromUtf8("this is an array of bytes"))
+                .AddRepeatedGroup(new TestAllTypes.Types.RepeatedGroup.Builder().SetA(1001))
+                .AddRepeatedNestedMessage(new TestAllTypes.Types.NestedMessage.Builder().SetBb(1001))
+                .AddRepeatedNestedEnum(TestAllTypes.Types.NestedEnum.FOO)
+            ;
+            return builder;
+        }
+
+        protected static TestPackedTypes.Builder AddPackedTypes(TestPackedTypes.Builder builder, int size)
+        {
+            for(int i=0; i < size; i++ )
+                builder.AddPackedInt32(1001)
+                .AddPackedInt64(1001)
+                .AddPackedUint32(1001)
+                .AddPackedUint64(1001)
+                .AddPackedSint32(-1001)
+                .AddPackedSint64(-1001)
+                .AddPackedFixed32(1001)
+                .AddPackedFixed64(1001)
+                .AddPackedSfixed32(-1001)
+                .AddPackedSfixed64(-1001)
+                .AddPackedFloat(1001.1001f)
+                .AddPackedDouble(1001.1001)
+                .AddPackedBool(true)
+                .AddPackedEnum(ForeignEnum.FOREIGN_FOO)
+            ;
+            return builder;
+        }
+
+        #endregion
+
+        [Test]
+        public void TestRoundTripAllTypes()
+        {
+            TestAllTypes msg = AddAllTypes(new TestAllTypes.Builder()).Build();
+            object content = SerializeMessage<TestAllTypes, TestAllTypes.Builder>(msg);
+
+            TestAllTypes copy = DeserializeMessage<TestAllTypes, TestAllTypes.Builder>(content, TestAllTypes.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<TestAllTypes, TestAllTypes.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(msg.ToByteArray()), Convert.ToBase64String(copy.ToByteArray()));
+        }
+
+        [Test]
+        public void TestRoundTripRepeatedTypes()
+        {
+            TestAllTypes msg = AddRepeatedTypes(new TestAllTypes.Builder(), 5).Build();
+            object content = SerializeMessage<TestAllTypes, TestAllTypes.Builder>(msg);
+
+            TestAllTypes copy = DeserializeMessage<TestAllTypes, TestAllTypes.Builder>(content, TestAllTypes.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<TestAllTypes, TestAllTypes.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(msg.ToByteArray()), Convert.ToBase64String(copy.ToByteArray()));
+        }
+
+        [Test]
+        public void TestRoundTripPackedTypes()
+        {
+            TestPackedTypes msg = AddPackedTypes(new TestPackedTypes.Builder(), 5).Build();
+            object content = SerializeMessage<TestPackedTypes, TestPackedTypes.Builder>(msg);
+
+            TestPackedTypes copy = DeserializeMessage<TestPackedTypes, TestPackedTypes.Builder>(content, TestPackedTypes.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            AssertOutputEquals(content, SerializeMessage<TestPackedTypes, TestPackedTypes.Builder>(copy));
+            Assert.AreEqual(Convert.ToBase64String(msg.ToByteArray()), Convert.ToBase64String(copy.ToByteArray()));
+        }
+    }
+}

+ 35 - 0
csharp/src/ProtocolBuffers.Test/Compatibility/DictionaryCompatibilityTests.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using Google.ProtocolBuffers.Serialization;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.Compatibility
+{
+    [TestFixture]
+    public class DictionaryCompatibilityTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            DictionaryWriter writer = new DictionaryWriter();
+            writer.WriteMessage(message);
+            return writer.ToDictionary();
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            new DictionaryReader((IDictionary<string, object>)message).Merge(builder);
+            return builder;
+        }
+
+        protected override void AssertOutputEquals(object lhs, object rhs)
+        {
+            IDictionary<string, object> left = (IDictionary<string, object>)lhs;
+            IDictionary<string, object> right = (IDictionary<string, object>)rhs;
+
+            Assert.AreEqual(
+                String.Join(",", new List<string>(left.Keys).ToArray()),
+                String.Join(",", new List<string>(right.Keys).ToArray())
+            );
+        }
+    }
+}

+ 43 - 0
csharp/src/ProtocolBuffers.Test/Compatibility/JsonCompatibilityTests.cs

@@ -0,0 +1,43 @@
+using System.IO;
+using Google.ProtocolBuffers.Serialization;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.Compatibility
+{
+    [TestFixture]
+    public class JsonCompatibilityTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            StringWriter sw = new StringWriter();
+            JsonFormatWriter.CreateInstance(sw)
+                .WriteMessage(message);
+            return sw.ToString();
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            JsonFormatReader.CreateInstance((string)message).Merge(builder);
+            return builder;
+        }
+    }
+
+    [TestFixture]
+    public class JsonCompatibilityFormattedTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            StringWriter sw = new StringWriter();
+            JsonFormatWriter.CreateInstance(sw)
+                .Formatted()
+                .WriteMessage(message);
+            return sw.ToString();
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            JsonFormatReader.CreateInstance((string)message).Merge(builder);
+            return builder;
+        }
+    }
+}

+ 38 - 0
csharp/src/ProtocolBuffers.Test/Compatibility/TestResources.cs

@@ -0,0 +1,38 @@
+using System.IO;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.Compatibility
+{
+    static class TestResources
+    {
+        public static byte[] google_message1
+        { 
+            get 
+            {
+                Stream resource = typeof(TestResources).Assembly.GetManifestResourceStream(
+                    typeof(TestResources).Namespace + ".google_message1.dat");
+
+                Assert.NotNull(resource);
+
+                byte[] bytes = new byte[resource.Length];
+                int amtRead = resource.Read(bytes, 0, bytes.Length);
+                Assert.AreEqual(bytes.Length, amtRead);
+                return bytes;
+            }
+        }
+        public static byte[] google_message2
+        {
+            get
+            {
+                Stream resource = typeof(TestResources).Assembly.GetManifestResourceStream(
+                    typeof(TestResources).Namespace + ".google_message2.dat");
+
+                Assert.NotNull(resource);
+                byte[] bytes = new byte[resource.Length];
+                int amtRead = resource.Read(bytes, 0, bytes.Length);
+                Assert.AreEqual(bytes.Length, amtRead);
+                return bytes;
+            }
+        }
+    }
+}

+ 35 - 0
csharp/src/ProtocolBuffers.Test/Compatibility/TextCompatibilityTests.cs

@@ -0,0 +1,35 @@
+using System.IO;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.Compatibility
+{
+    [TestFixture]
+    public class TextCompatibilityTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            StringWriter text = new StringWriter();
+            message.PrintTo(text);
+            return text.ToString();
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            TextFormat.Merge(new StringReader((string)message), registry, (IBuilder)builder);
+            return builder;
+        }
+        //This test can take a very long time to run.
+        [Test]
+        public override void RoundTripMessage2OptimizeSize()
+        {
+            //base.RoundTripMessage2OptimizeSize();
+        }
+
+        //This test can take a very long time to run.
+        [Test]
+        public override void RoundTripMessage2OptimizeSpeed()
+        {
+            //base.RoundTripMessage2OptimizeSpeed();
+        }
+    }
+}

+ 45 - 0
csharp/src/ProtocolBuffers.Test/Compatibility/XmlCompatibilityTests.cs

@@ -0,0 +1,45 @@
+using System.IO;
+using System.Xml;
+using Google.ProtocolBuffers.Serialization;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.Compatibility
+{
+    [TestFixture]
+    public class XmlCompatibilityTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            StringWriter text = new StringWriter();
+            XmlFormatWriter writer = XmlFormatWriter.CreateInstance(text);
+            writer.WriteMessage("root", message);
+            return text.ToString();
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            XmlFormatReader reader = XmlFormatReader.CreateInstance((string)message);
+            return reader.Merge("root", builder, registry);
+        }
+    }
+
+    [TestFixture]
+    public class XmlCompatibilityFormattedTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            StringWriter text = new StringWriter();
+            XmlWriter xwtr = XmlWriter.Create(text, new XmlWriterSettings { Indent = true, IndentChars = "  " });
+
+            XmlFormatWriter writer = XmlFormatWriter.CreateInstance(xwtr).SetOptions(XmlWriterOptions.OutputNestedArrays);
+            writer.WriteMessage("root", message);
+            return text.ToString();
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            XmlFormatReader reader = XmlFormatReader.CreateInstance((string)message).SetOptions(XmlReaderOptions.ReadNestedArrays);
+            return reader.Merge("root", builder, registry);
+        }
+    }
+}

BIN
csharp/src/ProtocolBuffers.Test/Compatibility/google_message1.dat


BIN
csharp/src/ProtocolBuffers.Test/Compatibility/google_message2.dat


+ 99 - 0
csharp/src/ProtocolBuffers.Test/DeprecatedMemberTest.cs

@@ -0,0 +1,99 @@
+using System;
+using System.Reflection;
+using UnitTest.Issues.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class DeprecatedMemberTest
+    {
+        private static void AssertIsDeprecated(MemberInfo member)
+        {
+            Assert.NotNull(member);
+            Assert.IsTrue(member.IsDefined(typeof(ObsoleteAttribute), false), "Member not obsolete: " + member);
+        }
+
+        [Test]
+        public void TestDepreatedPrimitiveValue()
+        {
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("HasPrimitiveValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("PrimitiveValue"));
+
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("HasPrimitiveValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("PrimitiveValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("ClearPrimitiveValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("SetPrimitiveValue"));
+        }
+        [Test]
+        public void TestDepreatedPrimitiveArray()
+        {
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("PrimitiveArrayList"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("PrimitiveArrayCount"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetMethod("GetPrimitiveArray"));
+
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("PrimitiveArrayList"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("PrimitiveArrayCount"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("GetPrimitiveArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("SetPrimitiveArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("AddPrimitiveArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("AddRangePrimitiveArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("ClearPrimitiveArray"));
+        }
+        [Test]
+        public void TestDepreatedMessageValue()
+        {
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("HasMessageValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("MessageValue"));
+
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("HasMessageValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("MessageValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("MergeMessageValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("ClearMessageValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("SetMessageValue", new[] { typeof(DeprecatedChild) }));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("SetMessageValue", new[] { typeof(DeprecatedChild.Builder) }));
+        }
+        [Test]
+        public void TestDepreatedMessageArray()
+        {
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("MessageArrayList"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("MessageArrayCount"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetMethod("GetMessageArray"));
+
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("MessageArrayList"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("MessageArrayCount"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("GetMessageArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("SetMessageArray", new[] { typeof(int), typeof(DeprecatedChild) }));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("SetMessageArray", new[] { typeof(int), typeof(DeprecatedChild.Builder) }));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("AddMessageArray", new[] { typeof(DeprecatedChild) }));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("AddMessageArray", new[] { typeof(DeprecatedChild.Builder) }));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("AddRangeMessageArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("ClearMessageArray"));
+        }
+        [Test]
+        public void TestDepreatedEnumValue()
+        {
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("HasEnumValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("EnumValue"));
+
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("HasEnumValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("EnumValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("ClearEnumValue"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("SetEnumValue"));
+        }
+        [Test]
+        public void TestDepreatedEnumArray()
+        {
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("EnumArrayList"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetProperty("EnumArrayCount"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage).GetMethod("GetEnumArray"));
+
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("EnumArrayList"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetProperty("EnumArrayCount"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("GetEnumArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("SetEnumArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("AddEnumArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("AddRangeEnumArray"));
+            AssertIsDeprecated(typeof(DeprecatedFieldsMessage.Builder).GetMethod("ClearEnumArray"));
+        }
+    }
+}

+ 286 - 0
csharp/src/ProtocolBuffers.Test/DescriptorsTest.cs

@@ -0,0 +1,286 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using Google.ProtocolBuffers.Descriptors;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    /// <summary>
+    /// Tests for descriptors. (Not in its own namespace or broken up into individual classes as the
+    /// size doesn't warrant it. On the other hand, this makes me feel a bit dirty...)
+    /// </summary>
+    public class DescriptorsTest
+    {
+        [Test]
+        public void FileDescriptor()
+        {
+            FileDescriptor file = Unittest.Descriptor;
+
+            Assert.AreEqual("google/protobuf/unittest.proto", file.Name);
+            Assert.AreEqual("protobuf_unittest", file.Package);
+
+            Assert.AreEqual("UnittestProto", file.Options.JavaOuterClassname);
+            Assert.AreEqual("google/protobuf/unittest.proto", file.Proto.Name);
+
+            // unittest.proto doesn't have any public imports, but unittest_import.proto does.
+            Assert.AreEqual(0, file.PublicDependencies.Count);
+            Assert.AreEqual(1, UnittestImport.Descriptor.PublicDependencies.Count);
+            Assert.AreEqual(UnittestImportPublic.Descriptor, UnittestImport.Descriptor.PublicDependencies[0]);
+
+            Assert.AreEqual(1, file.Dependencies.Count);
+            Assert.AreEqual(UnittestImport.Descriptor, file.Dependencies[0]);
+
+            MessageDescriptor messageType = TestAllTypes.Descriptor;
+            Assert.AreEqual(messageType, file.MessageTypes[0]);
+            Assert.AreEqual(messageType, file.FindTypeByName<MessageDescriptor>("TestAllTypes"));
+            Assert.Null(file.FindTypeByName<MessageDescriptor>("NoSuchType"));
+            Assert.Null(file.FindTypeByName<MessageDescriptor>("protobuf_unittest.TestAllTypes"));
+            for (int i = 0; i < file.MessageTypes.Count; i++)
+            {
+                Assert.AreEqual(i, file.MessageTypes[i].Index);
+            }
+
+            Assert.AreEqual(file.EnumTypes[0], file.FindTypeByName<EnumDescriptor>("ForeignEnum"));
+            Assert.Null(file.FindTypeByName<EnumDescriptor>("NoSuchType"));
+            Assert.Null(file.FindTypeByName<EnumDescriptor>("protobuf_unittest.ForeignEnum"));
+            Assert.AreEqual(1, UnittestImport.Descriptor.EnumTypes.Count);
+            Assert.AreEqual("ImportEnum", UnittestImport.Descriptor.EnumTypes[0].Name);
+            for (int i = 0; i < file.EnumTypes.Count; i++)
+            {
+                Assert.AreEqual(i, file.EnumTypes[i].Index);
+            }
+
+            FieldDescriptor extension = Unittest.OptionalInt32Extension.Descriptor;
+            Assert.AreEqual(extension, file.Extensions[0]);
+            Assert.AreEqual(extension, file.FindTypeByName<FieldDescriptor>("optional_int32_extension"));
+            Assert.Null(file.FindTypeByName<FieldDescriptor>("no_such_ext"));
+            Assert.Null(file.FindTypeByName<FieldDescriptor>("protobuf_unittest.optional_int32_extension"));
+            Assert.AreEqual(0, UnittestImport.Descriptor.Extensions.Count);
+            for (int i = 0; i < file.Extensions.Count; i++)
+            {
+                Assert.AreEqual(i, file.Extensions[i].Index);
+            }
+        }
+
+        [Test]
+        public void MessageDescriptor()
+        {
+            MessageDescriptor messageType = TestAllTypes.Descriptor;
+            MessageDescriptor nestedType = TestAllTypes.Types.NestedMessage.Descriptor;
+
+            Assert.AreEqual("TestAllTypes", messageType.Name);
+            Assert.AreEqual("protobuf_unittest.TestAllTypes", messageType.FullName);
+            Assert.AreEqual(Unittest.Descriptor, messageType.File);
+            Assert.Null(messageType.ContainingType);
+            Assert.AreEqual(DescriptorProtos.MessageOptions.DefaultInstance, messageType.Options);
+            Assert.AreEqual("TestAllTypes", messageType.Proto.Name);
+
+            Assert.AreEqual("NestedMessage", nestedType.Name);
+            Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedMessage", nestedType.FullName);
+            Assert.AreEqual(Unittest.Descriptor, nestedType.File);
+            Assert.AreEqual(messageType, nestedType.ContainingType);
+
+            FieldDescriptor field = messageType.Fields[0];
+            Assert.AreEqual("optional_int32", field.Name);
+            Assert.AreEqual(field, messageType.FindDescriptor<FieldDescriptor>("optional_int32"));
+            Assert.Null(messageType.FindDescriptor<FieldDescriptor>("no_such_field"));
+            Assert.AreEqual(field, messageType.FindFieldByNumber(1));
+            Assert.Null(messageType.FindFieldByNumber(571283));
+            for (int i = 0; i < messageType.Fields.Count; i++)
+            {
+                Assert.AreEqual(i, messageType.Fields[i].Index);
+            }
+
+            Assert.AreEqual(nestedType, messageType.NestedTypes[0]);
+            Assert.AreEqual(nestedType, messageType.FindDescriptor<MessageDescriptor>("NestedMessage"));
+            Assert.Null(messageType.FindDescriptor<MessageDescriptor>("NoSuchType"));
+            for (int i = 0; i < messageType.NestedTypes.Count; i++)
+            {
+                Assert.AreEqual(i, messageType.NestedTypes[i].Index);
+            }
+
+            Assert.AreEqual(messageType.EnumTypes[0], messageType.FindDescriptor<EnumDescriptor>("NestedEnum"));
+            Assert.Null(messageType.FindDescriptor<EnumDescriptor>("NoSuchType"));
+            for (int i = 0; i < messageType.EnumTypes.Count; i++)
+            {
+                Assert.AreEqual(i, messageType.EnumTypes[i].Index);
+            }
+        }
+
+        [Test]
+        public void FieldDescriptor()
+        {
+            MessageDescriptor messageType = TestAllTypes.Descriptor;
+            FieldDescriptor primitiveField = messageType.FindDescriptor<FieldDescriptor>("optional_int32");
+            FieldDescriptor enumField = messageType.FindDescriptor<FieldDescriptor>("optional_nested_enum");
+            FieldDescriptor messageField = messageType.FindDescriptor<FieldDescriptor>("optional_foreign_message");
+            FieldDescriptor cordField = messageType.FindDescriptor<FieldDescriptor>("optional_cord");
+            FieldDescriptor extension = Unittest.OptionalInt32Extension.Descriptor;
+            FieldDescriptor nestedExtension = TestRequired.Single.Descriptor;
+
+            Assert.AreEqual("optional_int32", primitiveField.Name);
+            Assert.AreEqual("protobuf_unittest.TestAllTypes.optional_int32",
+                            primitiveField.FullName);
+            Assert.AreEqual(1, primitiveField.FieldNumber);
+            Assert.AreEqual(messageType, primitiveField.ContainingType);
+            Assert.AreEqual(Unittest.Descriptor, primitiveField.File);
+            Assert.AreEqual(FieldType.Int32, primitiveField.FieldType);
+            Assert.AreEqual(MappedType.Int32, primitiveField.MappedType);
+            Assert.AreEqual(DescriptorProtos.FieldOptions.DefaultInstance, primitiveField.Options);
+            Assert.IsFalse(primitiveField.IsExtension);
+            Assert.AreEqual("optional_int32", primitiveField.Proto.Name);
+
+            Assert.AreEqual("optional_nested_enum", enumField.Name);
+            Assert.AreEqual(FieldType.Enum, enumField.FieldType);
+            Assert.AreEqual(MappedType.Enum, enumField.MappedType);
+            // Assert.AreEqual(TestAllTypes.Types.NestedEnum.DescriptorProtoFile, enumField.EnumType);
+
+            Assert.AreEqual("optional_foreign_message", messageField.Name);
+            Assert.AreEqual(FieldType.Message, messageField.FieldType);
+            Assert.AreEqual(MappedType.Message, messageField.MappedType);
+            Assert.AreEqual(ForeignMessage.Descriptor, messageField.MessageType);
+
+            Assert.AreEqual("optional_cord", cordField.Name);
+            Assert.AreEqual(FieldType.String, cordField.FieldType);
+            Assert.AreEqual(MappedType.String, cordField.MappedType);
+            Assert.AreEqual(DescriptorProtos.FieldOptions.Types.CType.CORD, cordField.Options.Ctype);
+
+            Assert.AreEqual("optional_int32_extension", extension.Name);
+            Assert.AreEqual("protobuf_unittest.optional_int32_extension", extension.FullName);
+            Assert.AreEqual(1, extension.FieldNumber);
+            Assert.AreEqual(TestAllExtensions.Descriptor, extension.ContainingType);
+            Assert.AreEqual(Unittest.Descriptor, extension.File);
+            Assert.AreEqual(FieldType.Int32, extension.FieldType);
+            Assert.AreEqual(MappedType.Int32, extension.MappedType);
+            Assert.AreEqual(DescriptorProtos.FieldOptions.DefaultInstance,
+                            extension.Options);
+            Assert.IsTrue(extension.IsExtension);
+            Assert.AreEqual(null, extension.ExtensionScope);
+            Assert.AreEqual("optional_int32_extension", extension.Proto.Name);
+
+            Assert.AreEqual("single", nestedExtension.Name);
+            Assert.AreEqual("protobuf_unittest.TestRequired.single",
+                            nestedExtension.FullName);
+            Assert.AreEqual(TestRequired.Descriptor,
+                            nestedExtension.ExtensionScope);
+        }
+
+        [Test]
+        public void FieldDescriptorLabel()
+        {
+            FieldDescriptor requiredField =
+                TestRequired.Descriptor.FindDescriptor<FieldDescriptor>("a");
+            FieldDescriptor optionalField =
+                TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("optional_int32");
+            FieldDescriptor repeatedField =
+                TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("repeated_int32");
+
+            Assert.IsTrue(requiredField.IsRequired);
+            Assert.IsFalse(requiredField.IsRepeated);
+            Assert.IsFalse(optionalField.IsRequired);
+            Assert.IsFalse(optionalField.IsRepeated);
+            Assert.IsFalse(repeatedField.IsRequired);
+            Assert.IsTrue(repeatedField.IsRepeated);
+        }
+        [Test]
+        public void FieldDescriptorDefault()
+        {
+            MessageDescriptor d = TestAllTypes.Descriptor;
+            Assert.IsFalse(d.FindDescriptor<FieldDescriptor>("optional_int32").HasDefaultValue);
+            Assert.AreEqual(0, d.FindDescriptor<FieldDescriptor>("optional_int32").DefaultValue);
+            Assert.IsTrue(d.FindDescriptor<FieldDescriptor>("default_int32").HasDefaultValue);
+            Assert.AreEqual(41, d.FindDescriptor<FieldDescriptor>("default_int32").DefaultValue);
+
+            d = TestExtremeDefaultValues.Descriptor;
+            Assert.AreEqual(TestExtremeDefaultValues.DefaultInstance.EscapedBytes,
+                d.FindDescriptor<FieldDescriptor>("escaped_bytes").DefaultValue);
+
+            Assert.AreEqual(uint.MaxValue, d.FindDescriptor<FieldDescriptor>("large_uint32").DefaultValue);
+            Assert.AreEqual(ulong.MaxValue, d.FindDescriptor<FieldDescriptor>("large_uint64").DefaultValue);
+        }
+        [Test]
+        public void EnumDescriptor()
+        {
+            // Note: this test is a bit different to the Java version because there's no static way of getting to the descriptor
+            EnumDescriptor enumType = Unittest.Descriptor.FindTypeByName<EnumDescriptor>("ForeignEnum");
+            EnumDescriptor nestedType = TestAllTypes.Descriptor.FindDescriptor<EnumDescriptor>("NestedEnum");
+
+            Assert.AreEqual("ForeignEnum", enumType.Name);
+            Assert.AreEqual("protobuf_unittest.ForeignEnum", enumType.FullName);
+            Assert.AreEqual(Unittest.Descriptor, enumType.File);
+            Assert.Null(enumType.ContainingType);
+            Assert.AreEqual(DescriptorProtos.EnumOptions.DefaultInstance,
+                            enumType.Options);
+
+            Assert.AreEqual("NestedEnum", nestedType.Name);
+            Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedEnum",
+                            nestedType.FullName);
+            Assert.AreEqual(Unittest.Descriptor, nestedType.File);
+            Assert.AreEqual(TestAllTypes.Descriptor, nestedType.ContainingType);
+
+            EnumValueDescriptor value = enumType.FindValueByName("FOREIGN_FOO");
+            Assert.AreEqual(value, enumType.Values[0]);
+            Assert.AreEqual("FOREIGN_FOO", value.Name);
+            Assert.AreEqual(4, value.Number);
+            Assert.AreEqual((int) ForeignEnum.FOREIGN_FOO, value.Number);
+            Assert.AreEqual(value, enumType.FindValueByNumber(4));
+            Assert.Null(enumType.FindValueByName("NO_SUCH_VALUE"));
+            for (int i = 0; i < enumType.Values.Count; i++)
+            {
+                Assert.AreEqual(i, enumType.Values[i].Index);
+            }
+        }
+        
+
+        [Test]
+        public void CustomOptions()
+        {
+            MessageDescriptor descriptor = TestMessageWithCustomOptions.Descriptor;
+            Assert.IsTrue(descriptor.Options.HasExtension(UnittestCustomOptions.MessageOpt1));
+            Assert.AreEqual(-56, descriptor.Options.GetExtension(UnittestCustomOptions.MessageOpt1));
+
+
+            FieldDescriptor field = descriptor.FindFieldByName("field1");
+            Assert.NotNull(field);
+
+            Assert.IsTrue(field.Options.HasExtension(UnittestCustomOptions.FieldOpt1));
+            Assert.AreEqual(8765432109uL, field.Options.GetExtension(UnittestCustomOptions.FieldOpt1));
+            
+        }
+    }
+}

+ 227 - 0
csharp/src/ProtocolBuffers.Test/DynamicMessageTest.cs

@@ -0,0 +1,227 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class DynamicMessageTest
+    {
+        private ReflectionTester reflectionTester;
+        private ReflectionTester extensionsReflectionTester;
+        private ReflectionTester packedReflectionTester;
+
+        public DynamicMessageTest()
+        {
+            reflectionTester = ReflectionTester.CreateTestAllTypesInstance();
+            extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();
+            packedReflectionTester = ReflectionTester.CreateTestPackedTypesInstance();
+        }
+
+        [Test]
+        public void DynamicMessageAccessors()
+        {
+            IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
+            reflectionTester.SetAllFieldsViaReflection(builder);
+            IMessage message = builder.WeakBuild();
+            reflectionTester.AssertAllFieldsSetViaReflection(message);
+        }
+
+        [Test]
+        public void DoubleBuildError()
+        {
+            DynamicMessage.Builder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
+            builder.Build();
+            Assert.Throws<InvalidOperationException>(() => builder.Build());
+        }
+
+        [Test]
+        public void DynamicMessageSettersRejectNull()
+        {
+            IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
+            reflectionTester.AssertReflectionSettersRejectNull(builder);
+        }
+
+        [Test]
+        public void DynamicMessageExtensionAccessors()
+        {
+            // We don't need to extensively test DynamicMessage's handling of
+            // extensions because, frankly, it doesn't do anything special with them.
+            // It treats them just like any other fields.
+            IBuilder builder = DynamicMessage.CreateBuilder(TestAllExtensions.Descriptor);
+            extensionsReflectionTester.SetAllFieldsViaReflection(builder);
+            IMessage message = builder.WeakBuild();
+            extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);
+        }
+
+        [Test]
+        public void DynamicMessageExtensionSettersRejectNull()
+        {
+            IBuilder builder = DynamicMessage.CreateBuilder(TestAllExtensions.Descriptor);
+            extensionsReflectionTester.AssertReflectionSettersRejectNull(builder);
+        }
+
+        [Test]
+        public void DynamicMessageRepeatedSetters()
+        {
+            IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
+            reflectionTester.SetAllFieldsViaReflection(builder);
+            reflectionTester.ModifyRepeatedFieldsViaReflection(builder);
+            IMessage message = builder.WeakBuild();
+            reflectionTester.AssertRepeatedFieldsModifiedViaReflection(message);
+        }
+
+        [Test]
+        public void DynamicMessageRepeatedSettersRejectNull()
+        {
+            IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
+            reflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);
+        }
+
+        [Test]
+        public void DynamicMessageDefaults()
+        {
+            reflectionTester.AssertClearViaReflection(DynamicMessage.GetDefaultInstance(TestAllTypes.Descriptor));
+            reflectionTester.AssertClearViaReflection(DynamicMessage.CreateBuilder(TestAllTypes.Descriptor).Build());
+        }
+
+        [Test]
+        public void DynamicMessageSerializedSize()
+        {
+            TestAllTypes message = TestUtil.GetAllSet();
+
+            IBuilder dynamicBuilder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
+            reflectionTester.SetAllFieldsViaReflection(dynamicBuilder);
+            IMessage dynamicMessage = dynamicBuilder.WeakBuild();
+
+            Assert.AreEqual(message.SerializedSize, dynamicMessage.SerializedSize);
+        }
+
+        [Test]
+        public void DynamicMessageSerialization()
+        {
+            IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
+            reflectionTester.SetAllFieldsViaReflection(builder);
+            IMessage message = builder.WeakBuild();
+
+            ByteString rawBytes = message.ToByteString();
+            TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
+
+            TestUtil.AssertAllFieldsSet(message2);
+
+            // In fact, the serialized forms should be exactly the same, byte-for-byte.
+            Assert.AreEqual(TestUtil.GetAllSet().ToByteString(), rawBytes);
+        }
+
+        [Test]
+        public void DynamicMessageParsing()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            TestUtil.SetAllFields(builder);
+            TestAllTypes message = builder.Build();
+
+            ByteString rawBytes = message.ToByteString();
+
+            IMessage message2 = DynamicMessage.ParseFrom(TestAllTypes.Descriptor, rawBytes);
+            reflectionTester.AssertAllFieldsSetViaReflection(message2);
+        }
+
+        [Test]
+        public void DynamicMessagePackedSerialization()
+        {
+            IBuilder builder = DynamicMessage.CreateBuilder(TestPackedTypes.Descriptor);
+            packedReflectionTester.SetPackedFieldsViaReflection(builder);
+            IMessage message = builder.WeakBuild();
+
+            ByteString rawBytes = message.ToByteString();
+            TestPackedTypes message2 = TestPackedTypes.ParseFrom(rawBytes);
+
+            TestUtil.AssertPackedFieldsSet(message2);
+
+            // In fact, the serialized forms should be exactly the same, byte-for-byte.
+            Assert.AreEqual(TestUtil.GetPackedSet().ToByteString(), rawBytes);
+        }
+
+        [Test]
+        public void DynamicMessagePackedParsing()
+        {
+            TestPackedTypes.Builder builder = TestPackedTypes.CreateBuilder();
+            TestUtil.SetPackedFields(builder);
+            TestPackedTypes message = builder.Build();
+
+            ByteString rawBytes = message.ToByteString();
+
+            IMessage message2 = DynamicMessage.ParseFrom(TestPackedTypes.Descriptor, rawBytes);
+            packedReflectionTester.AssertPackedFieldsSetViaReflection(message2);
+        }
+
+        [Test]
+        public void DynamicMessageCopy()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            TestUtil.SetAllFields(builder);
+            TestAllTypes message = builder.Build();
+
+            DynamicMessage copy = DynamicMessage.CreateBuilder(message).Build();
+            reflectionTester.AssertAllFieldsSetViaReflection(copy);
+        }
+
+        [Test]
+        public void ToBuilder()
+        {
+            DynamicMessage.Builder builder =
+                DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
+            reflectionTester.SetAllFieldsViaReflection(builder);
+            int unknownFieldNum = 9;
+            ulong unknownFieldVal = 90;
+            builder.SetUnknownFields(UnknownFieldSet.CreateBuilder()
+                                         .AddField(unknownFieldNum,
+                                                   UnknownField.CreateBuilder().AddVarint(unknownFieldVal).Build())
+                                         .Build());
+            DynamicMessage message = builder.Build();
+
+            DynamicMessage derived = message.ToBuilder().Build();
+            reflectionTester.AssertAllFieldsSetViaReflection(derived);
+
+            IList<ulong> values = derived.UnknownFields.FieldDictionary[unknownFieldNum].VarintList;
+            Assert.AreEqual(1, values.Count);
+            Assert.AreEqual(unknownFieldVal, values[0]);
+        }
+    }
+}

+ 200 - 0
csharp/src/ProtocolBuffers.Test/ExtendableMessageTest.cs

@@ -0,0 +1,200 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class ExtendableMessageTest
+    {
+        [Test]
+        public void ExtensionWriterInvalidExtension()
+        {
+            Assert.Throws<ArgumentException>(() =>
+                TestPackedExtensions.CreateBuilder()[Unittest.OptionalForeignMessageExtension.Descriptor] =
+                    ForeignMessage.DefaultInstance);
+        }
+
+        [Test]
+        public void ExtensionWriterTest()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder()
+                .SetExtension(Unittest.DefaultBoolExtension, true)
+                .SetExtension(Unittest.DefaultBytesExtension, ByteString.CopyFromUtf8("123"))
+                .SetExtension(Unittest.DefaultCordExtension, "123")
+                .SetExtension(Unittest.DefaultDoubleExtension, 123)
+                .SetExtension(Unittest.DefaultFixed32Extension, 123u)
+                .SetExtension(Unittest.DefaultFixed64Extension, 123u)
+                .SetExtension(Unittest.DefaultFloatExtension, 123)
+                .SetExtension(Unittest.DefaultForeignEnumExtension, ForeignEnum.FOREIGN_BAZ)
+                .SetExtension(Unittest.DefaultImportEnumExtension, ImportEnum.IMPORT_BAZ)
+                .SetExtension(Unittest.DefaultInt32Extension, 123)
+                .SetExtension(Unittest.DefaultInt64Extension, 123)
+                .SetExtension(Unittest.DefaultNestedEnumExtension, TestAllTypes.Types.NestedEnum.FOO)
+                .SetExtension(Unittest.DefaultSfixed32Extension, 123)
+                .SetExtension(Unittest.DefaultSfixed64Extension, 123)
+                .SetExtension(Unittest.DefaultSint32Extension, 123)
+                .SetExtension(Unittest.DefaultSint64Extension, 123)
+                .SetExtension(Unittest.DefaultStringExtension, "123")
+                .SetExtension(Unittest.DefaultStringPieceExtension, "123")
+                .SetExtension(Unittest.DefaultUint32Extension, 123u)
+                .SetExtension(Unittest.DefaultUint64Extension, 123u)
+                //Optional
+                .SetExtension(Unittest.OptionalBoolExtension, true)
+                .SetExtension(Unittest.OptionalBytesExtension, ByteString.CopyFromUtf8("123"))
+                .SetExtension(Unittest.OptionalCordExtension, "123")
+                .SetExtension(Unittest.OptionalDoubleExtension, 123)
+                .SetExtension(Unittest.OptionalFixed32Extension, 123u)
+                .SetExtension(Unittest.OptionalFixed64Extension, 123u)
+                .SetExtension(Unittest.OptionalFloatExtension, 123)
+                .SetExtension(Unittest.OptionalForeignEnumExtension, ForeignEnum.FOREIGN_BAZ)
+                .SetExtension(Unittest.OptionalImportEnumExtension, ImportEnum.IMPORT_BAZ)
+                .SetExtension(Unittest.OptionalInt32Extension, 123)
+                .SetExtension(Unittest.OptionalInt64Extension, 123)
+                .SetExtension(Unittest.OptionalNestedEnumExtension, TestAllTypes.Types.NestedEnum.FOO)
+                .SetExtension(Unittest.OptionalSfixed32Extension, 123)
+                .SetExtension(Unittest.OptionalSfixed64Extension, 123)
+                .SetExtension(Unittest.OptionalSint32Extension, 123)
+                .SetExtension(Unittest.OptionalSint64Extension, 123)
+                .SetExtension(Unittest.OptionalStringExtension, "123")
+                .SetExtension(Unittest.OptionalStringPieceExtension, "123")
+                .SetExtension(Unittest.OptionalUint32Extension, 123u)
+                .SetExtension(Unittest.OptionalUint64Extension, 123u)
+                //Repeated
+                .AddExtension(Unittest.RepeatedBoolExtension, true)
+                .AddExtension(Unittest.RepeatedBytesExtension, ByteString.CopyFromUtf8("123"))
+                .AddExtension(Unittest.RepeatedCordExtension, "123")
+                .AddExtension(Unittest.RepeatedDoubleExtension, 123)
+                .AddExtension(Unittest.RepeatedFixed32Extension, 123u)
+                .AddExtension(Unittest.RepeatedFixed64Extension, 123u)
+                .AddExtension(Unittest.RepeatedFloatExtension, 123)
+                .AddExtension(Unittest.RepeatedForeignEnumExtension, ForeignEnum.FOREIGN_BAZ)
+                .AddExtension(Unittest.RepeatedImportEnumExtension, ImportEnum.IMPORT_BAZ)
+                .AddExtension(Unittest.RepeatedInt32Extension, 123)
+                .AddExtension(Unittest.RepeatedInt64Extension, 123)
+                .AddExtension(Unittest.RepeatedNestedEnumExtension, TestAllTypes.Types.NestedEnum.FOO)
+                .AddExtension(Unittest.RepeatedSfixed32Extension, 123)
+                .AddExtension(Unittest.RepeatedSfixed64Extension, 123)
+                .AddExtension(Unittest.RepeatedSint32Extension, 123)
+                .AddExtension(Unittest.RepeatedSint64Extension, 123)
+                .AddExtension(Unittest.RepeatedStringExtension, "123")
+                .AddExtension(Unittest.RepeatedStringPieceExtension, "123")
+                .AddExtension(Unittest.RepeatedUint32Extension, 123u)
+                .AddExtension(Unittest.RepeatedUint64Extension, 123u)
+                ;
+            TestAllExtensions msg = builder.Build();
+
+            ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+            Unittest.RegisterAllExtensions(registry);
+
+            TestAllExtensions.Builder copyBuilder = TestAllExtensions.CreateBuilder().MergeFrom(msg.ToByteArray(),
+                                                                                                registry);
+            TestAllExtensions copy = copyBuilder.Build();
+
+            Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+
+            Assert.AreEqual(true, copy.GetExtension(Unittest.DefaultBoolExtension));
+            Assert.AreEqual(ByteString.CopyFromUtf8("123"), copy.GetExtension(Unittest.DefaultBytesExtension));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.DefaultCordExtension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.DefaultDoubleExtension));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.DefaultFixed32Extension));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.DefaultFixed64Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.DefaultFloatExtension));
+            Assert.AreEqual(ForeignEnum.FOREIGN_BAZ, copy.GetExtension(Unittest.DefaultForeignEnumExtension));
+            Assert.AreEqual(ImportEnum.IMPORT_BAZ, copy.GetExtension(Unittest.DefaultImportEnumExtension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.DefaultInt32Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.DefaultInt64Extension));
+            Assert.AreEqual(TestAllTypes.Types.NestedEnum.FOO,
+                            copy.GetExtension(Unittest.DefaultNestedEnumExtension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.DefaultSfixed32Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.DefaultSfixed64Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.DefaultSint32Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.DefaultSint64Extension));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.DefaultStringExtension));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.DefaultStringPieceExtension));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.DefaultUint32Extension));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.DefaultUint64Extension));
+
+            Assert.AreEqual(true, copy.GetExtension(Unittest.OptionalBoolExtension));
+            Assert.AreEqual(ByteString.CopyFromUtf8("123"), copy.GetExtension(Unittest.OptionalBytesExtension));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.OptionalCordExtension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.OptionalDoubleExtension));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.OptionalFixed32Extension));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.OptionalFixed64Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.OptionalFloatExtension));
+            Assert.AreEqual(ForeignEnum.FOREIGN_BAZ, copy.GetExtension(Unittest.OptionalForeignEnumExtension));
+            Assert.AreEqual(ImportEnum.IMPORT_BAZ, copy.GetExtension(Unittest.OptionalImportEnumExtension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.OptionalInt32Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.OptionalInt64Extension));
+            Assert.AreEqual(TestAllTypes.Types.NestedEnum.FOO,
+                            copy.GetExtension(Unittest.OptionalNestedEnumExtension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.OptionalSfixed32Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.OptionalSfixed64Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.OptionalSint32Extension));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.OptionalSint64Extension));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.OptionalStringExtension));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.OptionalStringPieceExtension));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.OptionalUint32Extension));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.OptionalUint64Extension));
+
+            Assert.AreEqual(true, copy.GetExtension(Unittest.RepeatedBoolExtension, 0));
+            Assert.AreEqual(ByteString.CopyFromUtf8("123"),
+                            copy.GetExtension(Unittest.RepeatedBytesExtension, 0));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.RepeatedCordExtension, 0));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.RepeatedDoubleExtension, 0));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.RepeatedFixed32Extension, 0));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.RepeatedFixed64Extension, 0));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.RepeatedFloatExtension, 0));
+            Assert.AreEqual(ForeignEnum.FOREIGN_BAZ,
+                            copy.GetExtension(Unittest.RepeatedForeignEnumExtension, 0));
+            Assert.AreEqual(ImportEnum.IMPORT_BAZ, copy.GetExtension(Unittest.RepeatedImportEnumExtension, 0));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.RepeatedInt32Extension, 0));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.RepeatedInt64Extension, 0));
+            Assert.AreEqual(TestAllTypes.Types.NestedEnum.FOO,
+                            copy.GetExtension(Unittest.RepeatedNestedEnumExtension, 0));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.RepeatedSfixed32Extension, 0));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.RepeatedSfixed64Extension, 0));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.RepeatedSint32Extension, 0));
+            Assert.AreEqual(123, copy.GetExtension(Unittest.RepeatedSint64Extension, 0));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.RepeatedStringExtension, 0));
+            Assert.AreEqual("123", copy.GetExtension(Unittest.RepeatedStringPieceExtension, 0));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.RepeatedUint32Extension, 0));
+            Assert.AreEqual(123u, copy.GetExtension(Unittest.RepeatedUint64Extension, 0));
+        }
+    }
+}

+ 183 - 0
csharp/src/ProtocolBuffers.Test/FieldPresenceTest.cs

@@ -0,0 +1,183 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2015 Google Inc.  All rights reserved.
+// Author: jieluo@google.com (Jie Luo)
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using Google.ProtocolBuffers.Descriptors;
+using Google.ProtocolBuffers.TestProtos.Proto3;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class FieldPresenceTest
+    {
+        private void CheckHasMethodRemoved(Type proto2Type, Type proto3Type, string name)
+        {
+            Assert.NotNull(proto2Type.GetProperty(name));
+            Assert.NotNull(proto2Type.GetProperty("Has" + name));
+            Assert.NotNull(proto3Type.GetProperty(name));
+            Assert.Null(proto3Type.GetProperty("Has" + name));
+        }
+
+        [Test]
+        public void TestHasMethod()
+        {
+            // Optional non-message fields don't have HasFoo method generated
+            Type proto2Type = typeof(Google.ProtocolBuffers.TestProtos.TestAllTypes);
+            Type proto3Type = typeof(TestAllTypes);
+            CheckHasMethodRemoved(proto2Type, proto3Type, "OptionalInt32");
+            CheckHasMethodRemoved(proto2Type, proto3Type, "OptionalString");
+            CheckHasMethodRemoved(proto2Type, proto3Type, "OptionalBytes");
+            CheckHasMethodRemoved(proto2Type, proto3Type, "OptionalNestedEnum");
+            
+            proto2Type = typeof(Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder);
+            proto3Type = typeof(TestAllTypes.Builder);
+            CheckHasMethodRemoved(proto2Type, proto3Type, "OptionalInt32");
+            CheckHasMethodRemoved(proto2Type, proto3Type, "OptionalString");
+            CheckHasMethodRemoved(proto2Type, proto3Type, "OptionalBytes");
+            CheckHasMethodRemoved(proto2Type, proto3Type, "OptionalNestedEnum");
+
+            // message fields still have the HasFoo method generated
+            Assert.IsFalse(TestAllTypes.CreateBuilder().Build().HasOptionalNestedMessage);
+            Assert.IsFalse(TestAllTypes.CreateBuilder().HasOptionalNestedMessage);
+        }
+
+        [Test]
+        public void TestFieldPresence()
+        {
+            // Optional non-message fields set to their default value are treated the same
+            // way as not set.
+
+            // Serialization will ignore such fields.
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            builder.SetOptionalInt32(0);
+            builder.SetOptionalString("");
+            builder.SetOptionalBytes(ByteString.Empty);
+            builder.SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.FOO);
+            TestAllTypes message = builder.Build();
+            Assert.AreEqual(0, message.SerializedSize);
+
+            // Test merge
+            TestAllTypes.Builder a = TestAllTypes.CreateBuilder();
+            a.SetOptionalInt32(1);
+            a.SetOptionalString("x");
+            a.SetOptionalBytes(ByteString.CopyFromUtf8("y"));
+            a.SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.BAR);
+            a.MergeFrom(message);
+            TestAllTypes messageA = a.Build();
+            Assert.AreEqual(1, messageA.OptionalInt32);
+            Assert.AreEqual("x", messageA.OptionalString);
+            Assert.AreEqual(ByteString.CopyFromUtf8("y"), messageA.OptionalBytes);
+            Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAR, messageA.OptionalNestedEnum);
+
+            // equals/hashCode should produce the same results
+            TestAllTypes empty = TestAllTypes.CreateBuilder().Build();
+            Assert.IsTrue(empty.Equals(message));
+            Assert.IsTrue(message.Equals(empty));
+            Assert.AreEqual(empty.GetHashCode(), message.GetHashCode());
+        }
+
+        [Test]
+        public void TestFieldPresenceReflection()
+        {
+            MessageDescriptor descriptor = TestAllTypes.Descriptor;
+            FieldDescriptor optionalInt32Field = descriptor.FindFieldByName("optional_int32");
+            FieldDescriptor optionalStringField = descriptor.FindFieldByName("optional_string");
+            FieldDescriptor optionalBytesField = descriptor.FindFieldByName("optional_bytes");
+            FieldDescriptor optionalNestedEnumField = descriptor.FindFieldByName("optional_nested_enum");
+
+            TestAllTypes message = TestAllTypes.CreateBuilder().Build();
+            Assert.IsFalse(message.HasField(optionalInt32Field));
+            Assert.IsFalse(message.HasField(optionalStringField));
+            Assert.IsFalse(message.HasField(optionalBytesField));
+            Assert.IsFalse(message.HasField(optionalNestedEnumField));
+
+            // Set to default value is seen as not present
+            message = TestAllTypes.CreateBuilder()
+                .SetOptionalInt32(0)
+                .SetOptionalString("")
+                .SetOptionalBytes(ByteString.Empty)
+                .SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.FOO)
+                .Build();
+            Assert.IsFalse(message.HasField(optionalInt32Field));
+            Assert.IsFalse(message.HasField(optionalStringField));
+            Assert.IsFalse(message.HasField(optionalBytesField));
+            Assert.IsFalse(message.HasField(optionalNestedEnumField));
+            Assert.AreEqual(0, message.AllFields.Count);
+            
+            // Set t0 non-defalut value is seen as present
+            message = TestAllTypes.CreateBuilder()
+                .SetOptionalInt32(1)
+                .SetOptionalString("x")
+                .SetOptionalBytes(ByteString.CopyFromUtf8("y"))
+                .SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.BAR)
+                .Build();
+            Assert.IsTrue(message.HasField(optionalInt32Field));
+            Assert.IsTrue(message.HasField(optionalStringField));
+            Assert.IsTrue(message.HasField(optionalBytesField));
+            Assert.IsTrue(message.HasField(optionalNestedEnumField));
+            Assert.AreEqual(4, message.AllFields.Count);
+        }
+
+        [Test]
+        public void TestMessageField()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            Assert.IsFalse(builder.HasOptionalNestedMessage);
+            Assert.IsFalse(builder.Build().HasOptionalNestedMessage);
+
+            // Unlike non-message fields, if we set default value to message field, the field
+            // shoule be seem as present.
+            builder.SetOptionalNestedMessage(TestAllTypes.Types.NestedMessage.DefaultInstance);
+            Assert.IsTrue(builder.HasOptionalNestedMessage);
+            Assert.IsTrue(builder.Build().HasOptionalNestedMessage);
+        }
+
+        [Test]
+        public void TestSerializeAndParse()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            builder.SetOptionalInt32(1234);
+            builder.SetOptionalString("hello");
+            builder.SetOptionalNestedMessage(TestAllTypes.Types.NestedMessage.DefaultInstance);
+            ByteString data = builder.Build().ToByteString();
+
+            TestAllTypes message = TestAllTypes.ParseFrom(data);
+            Assert.AreEqual(1234, message.OptionalInt32);
+            Assert.AreEqual("hello", message.OptionalString);
+            Assert.AreEqual(ByteString.Empty, message.OptionalBytes);
+            Assert.AreEqual(TestAllTypes.Types.NestedEnum.FOO, message.OptionalNestedEnum);
+            Assert.IsTrue(message.HasOptionalNestedMessage);
+            Assert.AreEqual(0, message.OptionalNestedMessage.Bb);
+        }
+    }
+}

+ 102 - 0
csharp/src/ProtocolBuffers.Test/GeneratedBuilderTest.cs

@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class GeneratedBuilderTest
+    {
+        class OneTimeEnumerator<T> : IEnumerable<T>
+        {
+            readonly T _item;
+            bool _enumerated;
+            public OneTimeEnumerator(T item)
+            {
+                _item = item;
+            }
+            public IEnumerator<T> GetEnumerator()
+            {
+                Assert.IsFalse(_enumerated);
+                _enumerated = true;
+                yield return _item;
+            }
+            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+            {
+                return GetEnumerator();
+            }
+        }
+
+        [Test]
+        public void DoesNotEnumerateTwiceForMessageList()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            b.AddRangeRepeatedForeignMessage(new OneTimeEnumerator<ForeignMessage>(ForeignMessage.DefaultInstance));
+        }
+
+        [Test]
+        public void DoesNotEnumerateTwiceForPrimitiveList()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            b.AddRangeRepeatedInt32(new OneTimeEnumerator<int>(1));
+        }
+
+        [Test]
+        public void DoesNotEnumerateTwiceForStringList()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            b.AddRangeRepeatedString(new OneTimeEnumerator<string>("test"));
+        }
+
+        [Test]
+        public void DoesNotEnumerateTwiceForEnumList()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            b.AddRangeRepeatedForeignEnum(new OneTimeEnumerator<ForeignEnum>(ForeignEnum.FOREIGN_BAR));
+        }
+        
+        [Test]
+        public void DoesNotAddNullToMessageListByAddRange()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            Assert.Throws<ArgumentNullException>(() => b.AddRangeRepeatedForeignMessage(new ForeignMessage[] { null }));
+        }
+
+        [Test]
+        public void DoesNotAddNullToMessageListByAdd()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            Assert.Throws<ArgumentNullException>(() => b.AddRepeatedForeignMessage((ForeignMessage)null));
+        }
+
+        [Test]
+        public void DoesNotAddNullToMessageListBySet()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            b.AddRepeatedForeignMessage(ForeignMessage.DefaultInstance);
+            Assert.Throws<ArgumentNullException>(() => b.SetRepeatedForeignMessage(0, (ForeignMessage)null));
+        }
+
+        [Test]
+        public void DoesNotAddNullToStringListByAddRange()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            Assert.Throws<ArgumentNullException>(() => b.AddRangeRepeatedString(new String[] { null }));
+        }
+
+        [Test]
+        public void DoesNotAddNullToStringListByAdd()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            Assert.Throws<ArgumentNullException>(() => b.AddRepeatedString(null));
+        }
+
+        [Test]
+        public void DoesNotAddNullToStringListBySet()
+        {
+            TestAllTypes.Builder b = new TestAllTypes.Builder();
+            b.AddRepeatedString("one");
+            Assert.Throws<ArgumentNullException>(() => b.SetRepeatedString(0, null));
+        }
+    }
+}

+ 514 - 0
csharp/src/ProtocolBuffers.Test/GeneratedMessageTest.cs

@@ -0,0 +1,514 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using Google.ProtocolBuffers.Collections;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    public class GeneratedMessageTest
+    {
+        private readonly ReflectionTester reflectionTester;
+        private readonly ReflectionTester extensionsReflectionTester;
+
+        public GeneratedMessageTest()
+        {
+            reflectionTester = ReflectionTester.CreateTestAllTypesInstance();
+            extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();
+        }
+
+        [Test]
+        public void RepeatedAddPrimitiveBeforeBuild()
+        {
+            TestAllTypes message = new TestAllTypes.Builder {RepeatedInt32List = {1, 2, 3}}.Build();
+            TestUtil.AssertEqual(new int[] {1, 2, 3}, message.RepeatedInt32List);
+        }
+
+        [Test]
+        public void AddPrimitiveFailsAfterBuild()
+        {
+            TestAllTypes.Builder builder = new TestAllTypes.Builder();
+            IList<int> list = builder.RepeatedInt32List;
+            list.Add(1); // Fine
+            builder.Build();
+
+            Assert.Throws<NotSupportedException>(() => list.Add(2));
+        }
+
+        [Test]
+        public void RepeatedAddMessageBeforeBuild()
+        {
+            TestAllTypes message = new TestAllTypes.Builder
+                                       {
+                                           RepeatedNestedMessageList =
+                                               {new TestAllTypes.Types.NestedMessage.Builder {Bb = 10}.Build()}
+                                       }.Build();
+            Assert.AreEqual(1, message.RepeatedNestedMessageCount);
+            Assert.AreEqual(10, message.RepeatedNestedMessageList[0].Bb);
+        }
+
+        [Test]
+        public void AddMessageFailsAfterBuild()
+        {
+            TestAllTypes.Builder builder = new TestAllTypes.Builder();
+            IList<TestAllTypes.Types.NestedMessage> list = builder.RepeatedNestedMessageList;
+            builder.Build();
+
+            Assert.Throws<NotSupportedException>(() => list.Add(new TestAllTypes.Types.NestedMessage.Builder { Bb = 10 }.Build()));
+        }
+
+        [Test]
+        public void DefaultInstance()
+        {
+            Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.DefaultInstance.DefaultInstanceForType);
+            Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().DefaultInstanceForType);
+        }
+
+        [Test]
+        public void Accessors()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            TestUtil.SetAllFields(builder);
+            TestAllTypes message = builder.Build();
+            TestUtil.AssertAllFieldsSet(message);
+        }
+
+        [Test]
+        public void SettersRejectNull()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            Assert.Throws<ArgumentNullException>(() => builder.SetOptionalString(null));
+            Assert.Throws<ArgumentNullException>(() => builder.SetOptionalBytes(null));
+            Assert.Throws<ArgumentNullException>(
+                () => builder.SetOptionalNestedMessage((TestAllTypes.Types.NestedMessage) null));
+            Assert.Throws<ArgumentNullException>(
+                () => builder.SetOptionalNestedMessage((TestAllTypes.Types.NestedMessage.Builder) null));
+            Assert.Throws<ArgumentNullException>(() => builder.AddRepeatedString(null));
+            Assert.Throws<ArgumentNullException>(() => builder.AddRepeatedBytes(null));
+            Assert.Throws<ArgumentNullException>(
+                () => builder.AddRepeatedNestedMessage((TestAllTypes.Types.NestedMessage) null));
+            Assert.Throws<ArgumentNullException>(
+                () => builder.AddRepeatedNestedMessage((TestAllTypes.Types.NestedMessage.Builder) null));
+        }
+
+        [Test]
+        public void RepeatedSetters()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            TestUtil.SetAllFields(builder);
+            TestUtil.ModifyRepeatedFields(builder);
+            TestAllTypes message = builder.Build();
+            TestUtil.AssertRepeatedFieldsModified(message);
+        }
+
+        [Test]
+        public void RepeatedAppend()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+
+            builder.AddRangeRepeatedInt32(new int[] {1, 2, 3, 4});
+            builder.AddRangeRepeatedForeignEnum((new ForeignEnum[] {ForeignEnum.FOREIGN_BAZ}));
+
+            ForeignMessage foreignMessage = ForeignMessage.CreateBuilder().SetC(12).Build();
+            builder.AddRangeRepeatedForeignMessage(new ForeignMessage[] {foreignMessage});
+
+            TestAllTypes message = builder.Build();
+            TestUtil.AssertEqual(message.RepeatedInt32List, new int[] {1, 2, 3, 4});
+            TestUtil.AssertEqual(message.RepeatedForeignEnumList, new ForeignEnum[] {ForeignEnum.FOREIGN_BAZ});
+            Assert.AreEqual(1, message.RepeatedForeignMessageCount);
+            Assert.AreEqual(12, message.GetRepeatedForeignMessage(0).C);
+        }
+
+        [Test]
+        public void RepeatedAppendRejectsNull()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+
+            ForeignMessage foreignMessage = ForeignMessage.CreateBuilder().SetC(12).Build();
+            Assert.Throws<ArgumentNullException>(
+                () => builder.AddRangeRepeatedForeignMessage(new[] {foreignMessage, null}));
+            Assert.Throws<ArgumentNullException>(() => builder.AddRangeRepeatedForeignMessage(null));
+            Assert.Throws<ArgumentNullException>(() => builder.AddRangeRepeatedForeignEnum(null));
+            Assert.Throws<ArgumentNullException>(() => builder.AddRangeRepeatedString(new[] {"one", null}));
+            Assert.Throws<ArgumentNullException>(
+                () => builder.AddRangeRepeatedBytes(new[] {TestUtil.ToBytes("one"), null}));
+        }
+
+        [Test]
+        public void SettingForeignMessageUsingBuilder()
+        {
+            TestAllTypes message = TestAllTypes.CreateBuilder()
+                // Pass builder for foreign message instance.
+                .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123))
+                .Build();
+            TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()
+                // Create expected version passing foreign message instance explicitly.
+                .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123).Build())
+                .Build();
+            Assert.AreEqual(expectedMessage, message);
+        }
+
+        [Test]
+        public void SettingRepeatedForeignMessageUsingBuilder()
+        {
+            TestAllTypes message = TestAllTypes.CreateBuilder()
+                // Pass builder for foreign message instance.
+                .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456))
+                .Build();
+            TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()
+                // Create expected version passing foreign message instance explicitly.
+                .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456).Build())
+                .Build();
+            Assert.AreEqual(expectedMessage, message);
+        }
+
+        [Test]
+        public void SettingRepeatedValuesUsingRangeInCollectionInitializer()
+        {
+            int[] values = {1, 2, 3};
+            TestAllTypes message = new TestAllTypes.Builder
+                                       {
+                                           RepeatedSint32List = {values}
+                                       }.Build();
+            Assert.IsTrue(Lists.Equals(values, message.RepeatedSint32List));
+        }
+
+        [Test]
+        public void SettingRepeatedValuesUsingIndividualValuesInCollectionInitializer()
+        {
+            TestAllTypes message = new TestAllTypes.Builder
+                                       {
+                                           RepeatedSint32List = {6, 7}
+                                       }.Build();
+            Assert.IsTrue(Lists.Equals(new int[] {6, 7}, message.RepeatedSint32List));
+        }
+
+        [Test]
+        public void Defaults()
+        {
+            TestUtil.AssertClear(TestAllTypes.DefaultInstance);
+            TestUtil.AssertClear(TestAllTypes.CreateBuilder().Build());
+
+            Assert.AreEqual("\u1234", TestExtremeDefaultValues.DefaultInstance.Utf8String);
+        }
+
+        [Test]
+        public void ReflectionGetters()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            TestUtil.SetAllFields(builder);
+            TestAllTypes message = builder.Build();
+            reflectionTester.AssertAllFieldsSetViaReflection(message);
+        }
+
+        [Test]
+        public void ReflectionSetters()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            reflectionTester.SetAllFieldsViaReflection(builder);
+            TestAllTypes message = builder.Build();
+            TestUtil.AssertAllFieldsSet(message);
+        }
+
+        [Test]
+        public void ReflectionClear()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            reflectionTester.SetAllFieldsViaReflection(builder);
+            reflectionTester.ClearAllFieldsViaReflection(builder);
+            TestAllTypes message = builder.Build();
+            TestUtil.AssertClear(message);
+        }
+
+        [Test]
+        public void ReflectionSettersRejectNull()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            reflectionTester.AssertReflectionSettersRejectNull(builder);
+        }
+
+        [Test]
+        public void ReflectionRepeatedSetters()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            reflectionTester.SetAllFieldsViaReflection(builder);
+            reflectionTester.ModifyRepeatedFieldsViaReflection(builder);
+            TestAllTypes message = builder.Build();
+            TestUtil.AssertRepeatedFieldsModified(message);
+        }
+
+        [Test]
+        public void TestReflectionRepeatedSettersRejectNull()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            reflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);
+        }
+
+        [Test]
+        public void ReflectionDefaults()
+        {
+            TestUtil.TestInMultipleCultures(() =>
+                                                {
+                                                    reflectionTester.AssertClearViaReflection(
+                                                        TestAllTypes.DefaultInstance);
+                                                    reflectionTester.AssertClearViaReflection(
+                                                        TestAllTypes.CreateBuilder().Build());
+                                                });
+        }
+
+        // =================================================================
+        // Extensions.
+
+        [Test]
+        public void ExtensionAccessors()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
+            TestUtil.SetAllExtensions(builder);
+            TestAllExtensions message = builder.Build();
+            TestUtil.AssertAllExtensionsSet(message);
+        }
+
+        [Test]
+        public void ExtensionRepeatedSetters()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
+            TestUtil.SetAllExtensions(builder);
+            TestUtil.ModifyRepeatedExtensions(builder);
+            TestAllExtensions message = builder.Build();
+            TestUtil.AssertRepeatedExtensionsModified(message);
+        }
+
+        [Test]
+        public void ExtensionDefaults()
+        {
+            TestUtil.AssertExtensionsClear(TestAllExtensions.DefaultInstance);
+            TestUtil.AssertExtensionsClear(TestAllExtensions.CreateBuilder().Build());
+        }
+
+        [Test]
+        public void ExtensionReflectionGetters()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
+            TestUtil.SetAllExtensions(builder);
+            TestAllExtensions message = builder.Build();
+            extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);
+        }
+
+        [Test]
+        public void ExtensionReflectionSetters()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
+            extensionsReflectionTester.SetAllFieldsViaReflection(builder);
+            TestAllExtensions message = builder.Build();
+            TestUtil.AssertAllExtensionsSet(message);
+        }
+
+        [Test]
+        public void ExtensionReflectionSettersRejectNull()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
+            extensionsReflectionTester.AssertReflectionSettersRejectNull(builder);
+        }
+
+        [Test]
+        public void ExtensionReflectionRepeatedSetters()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
+            extensionsReflectionTester.SetAllFieldsViaReflection(builder);
+            extensionsReflectionTester.ModifyRepeatedFieldsViaReflection(builder);
+            TestAllExtensions message = builder.Build();
+            TestUtil.AssertRepeatedExtensionsModified(message);
+        }
+
+        [Test]
+        public void ExtensionReflectionRepeatedSettersRejectNull()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
+            extensionsReflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);
+        }
+
+        [Test]
+        public void ExtensionReflectionDefaults()
+        {
+            TestUtil.TestInMultipleCultures(() =>
+                                                {
+                                                    extensionsReflectionTester.AssertClearViaReflection(
+                                                        TestAllExtensions.DefaultInstance);
+                                                    extensionsReflectionTester.AssertClearViaReflection(
+                                                        TestAllExtensions.CreateBuilder().Build());
+                                                });
+        }
+
+        [Test]
+        public void ClearExtension()
+        {
+            // ClearExtension() is not actually used in TestUtil, so try it manually.
+            Assert.IsFalse(TestAllExtensions.CreateBuilder()
+                               .SetExtension(Unittest.OptionalInt32Extension, 1)
+                               .ClearExtension(Unittest.OptionalInt32Extension)
+                               .HasExtension(Unittest.OptionalInt32Extension));
+            Assert.AreEqual(0, TestAllExtensions.CreateBuilder()
+                                   .AddExtension(Unittest.RepeatedInt32Extension, 1)
+                                   .ClearExtension(Unittest.RepeatedInt32Extension)
+                                   .GetExtensionCount(Unittest.RepeatedInt32Extension));
+        }
+
+        [Test]
+        public void ExtensionMergeFrom()
+        {
+            TestAllExtensions original = TestAllExtensions.CreateBuilder()
+                .SetExtension(Unittest.OptionalInt32Extension, 1).Build();
+            TestAllExtensions merged =
+                TestAllExtensions.CreateBuilder().MergeFrom(original).Build();
+            Assert.IsTrue((merged.HasExtension(Unittest.OptionalInt32Extension)));
+            Assert.AreEqual(1, (int) merged.GetExtension(Unittest.OptionalInt32Extension));
+        }
+
+        /* Removed multiple files option for the moment
+    [Test]
+    public void MultipleFilesOption() {
+      // We mostly just want to check that things compile.
+      MessageWithNoOuter message = MessageWithNoOuter.CreateBuilder()
+          .SetNested(MessageWithNoOuter.Types.NestedMessage.CreateBuilder().SetI(1))
+          .AddForeign(TestAllTypes.CreateBuilder().SetOptionalInt32(1))
+          .SetNestedEnum(MessageWithNoOuter.Types.NestedEnum.BAZ)
+          .SetForeignEnum(EnumWithNoOuter.BAR)
+          .Build();
+      Assert.AreEqual(message, MessageWithNoOuter.ParseFrom(message.ToByteString()));
+
+      Assert.AreEqual(MultiFileProto.DescriptorProtoFile, MessageWithNoOuter.DescriptorProtoFile.File);
+
+      FieldDescriptor field = MessageWithNoOuter.DescriptorProtoFile.FindDescriptor<FieldDescriptor>("foreign_enum");
+      Assert.AreEqual(MultiFileProto.DescriptorProtoFile.FindTypeByName<EnumDescriptor>("EnumWithNoOuter")
+        .FindValueByNumber((int)EnumWithNoOuter.BAR), message[field]);
+
+      Assert.AreEqual(MultiFileProto.DescriptorProtoFile, ServiceWithNoOuter.DescriptorProtoFile.File);
+
+      Assert.IsFalse(TestAllExtensions.DefaultInstance.HasExtension(MultiFileProto.ExtensionWithOuter));
+    }*/
+
+        [Test]
+        public void OptionalFieldWithRequiredSubfieldsOptimizedForSize()
+        {
+            TestOptionalOptimizedForSize message = TestOptionalOptimizedForSize.DefaultInstance;
+            Assert.IsTrue(message.IsInitialized);
+
+            message = TestOptionalOptimizedForSize.CreateBuilder().SetO(
+                TestRequiredOptimizedForSize.CreateBuilder().BuildPartial()
+                ).BuildPartial();
+            Assert.IsFalse(message.IsInitialized);
+
+            message = TestOptionalOptimizedForSize.CreateBuilder().SetO(
+                TestRequiredOptimizedForSize.CreateBuilder().SetX(5).BuildPartial()
+                ).BuildPartial();
+            Assert.IsTrue(message.IsInitialized);
+        }
+
+        [Test]
+        public void OptimizedForSizeMergeUsesAllFieldsFromTarget()
+        {
+            TestOptimizedForSize withFieldSet = new TestOptimizedForSize.Builder {I = 10}.Build();
+            TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();
+            builder.MergeFrom(withFieldSet);
+            TestOptimizedForSize built = builder.Build();
+            Assert.AreEqual(10, built.I);
+        }
+
+        [Test]
+        public void UninitializedExtensionInOptimizedForSizeMakesMessageUninitialized()
+        {
+            TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();
+            builder.SetExtension(TestOptimizedForSize.TestExtension2,
+                                 new TestRequiredOptimizedForSize.Builder().BuildPartial());
+            Assert.IsFalse(builder.IsInitialized);
+            Assert.IsFalse(builder.BuildPartial().IsInitialized);
+
+            builder = new TestOptimizedForSize.Builder();
+            builder.SetExtension(TestOptimizedForSize.TestExtension2,
+                                 new TestRequiredOptimizedForSize.Builder {X = 10}.BuildPartial());
+            Assert.IsTrue(builder.IsInitialized);
+            Assert.IsTrue(builder.BuildPartial().IsInitialized);
+        }
+
+        [Test]
+        public void ToBuilder()
+        {
+            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
+            TestUtil.SetAllFields(builder);
+            TestAllTypes message = builder.Build();
+            TestUtil.AssertAllFieldsSet(message.ToBuilder().Build());
+        }
+
+        [Test]
+        public void FieldConstantValues()
+        {
+            Assert.AreEqual(TestAllTypes.Types.NestedMessage.BbFieldNumber, 1);
+            Assert.AreEqual(TestAllTypes.OptionalInt32FieldNumber, 1);
+            Assert.AreEqual(TestAllTypes.OptionalGroupFieldNumber, 16);
+            Assert.AreEqual(TestAllTypes.OptionalNestedMessageFieldNumber, 18);
+            Assert.AreEqual(TestAllTypes.OptionalNestedEnumFieldNumber, 21);
+            Assert.AreEqual(TestAllTypes.RepeatedInt32FieldNumber, 31);
+            Assert.AreEqual(TestAllTypes.RepeatedGroupFieldNumber, 46);
+            Assert.AreEqual(TestAllTypes.RepeatedNestedMessageFieldNumber, 48);
+            Assert.AreEqual(TestAllTypes.RepeatedNestedEnumFieldNumber, 51);
+        }
+
+        [Test]
+        public void ExtensionConstantValues()
+        {
+            Assert.AreEqual(TestRequired.SingleFieldNumber, 1000);
+            Assert.AreEqual(TestRequired.MultiFieldNumber, 1001);
+            Assert.AreEqual(Unittest.OptionalInt32ExtensionFieldNumber, 1);
+            Assert.AreEqual(Unittest.OptionalGroupExtensionFieldNumber, 16);
+            Assert.AreEqual(Unittest.OptionalNestedMessageExtensionFieldNumber, 18);
+            Assert.AreEqual(Unittest.OptionalNestedEnumExtensionFieldNumber, 21);
+            Assert.AreEqual(Unittest.RepeatedInt32ExtensionFieldNumber, 31);
+            Assert.AreEqual(Unittest.RepeatedGroupExtensionFieldNumber, 46);
+            Assert.AreEqual(Unittest.RepeatedNestedMessageExtensionFieldNumber, 48);
+            Assert.AreEqual(Unittest.RepeatedNestedEnumExtensionFieldNumber, 51);
+        }
+
+        [Test]
+        public void EmptyPackedValue()
+        {
+            TestPackedTypes empty = new TestPackedTypes.Builder().Build();
+            Assert.AreEqual(0, empty.SerializedSize);
+        }
+    }
+}

+ 60 - 0
csharp/src/ProtocolBuffers.Test/IssuesTest.cs

@@ -0,0 +1,60 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+
+using Google.ProtocolBuffers.Descriptors;
+using UnitTest.Issues.TestProtos;
+using NUnit.Framework;
+
+
+namespace Google.ProtocolBuffers
+{
+    /// <summary>
+    /// Tests for issues which aren't easily compartmentalized into other unit tests.
+    /// </summary>
+    public class IssuesTest
+    {
+        // Issue 45
+        [Test]
+        public void FieldCalledItem()
+        {
+            ItemField message = new ItemField.Builder { Item = 3 }.Build();
+            FieldDescriptor field = ItemField.Descriptor.FindFieldByName("item");
+            Assert.NotNull(field);
+            Assert.AreEqual(3, (int)message[field]);
+        }
+    }
+}

+ 90 - 0
csharp/src/ProtocolBuffers.Test/MessageStreamIteratorTest.cs

@@ -0,0 +1,90 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System.Collections.Generic;
+using System.IO;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+using NestedMessage = Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage;
+
+namespace Google.ProtocolBuffers
+{
+    public class MessageStreamIteratorTest
+    {
+        [Test]
+        public void ThreeMessagesInMemory()
+        {
+            MemoryStream stream = new MemoryStream(MessageStreamWriterTest.ThreeMessageData);
+            IEnumerable<NestedMessage> iterator = MessageStreamIterator<NestedMessage>.FromStreamProvider(() => stream);
+            List<NestedMessage> messages = new List<NestedMessage>(iterator);
+
+            Assert.AreEqual(3, messages.Count);
+            Assert.AreEqual(5, messages[0].Bb);
+            Assert.AreEqual(1500, messages[1].Bb);
+            Assert.IsFalse(messages[2].HasBb);
+        }
+
+        [Test]
+        public void ManyMessagesShouldNotTriggerSizeAlert()
+        {
+            int messageSize = TestUtil.GetAllSet().SerializedSize;
+            // Enough messages to trigger the alert unless we've reset the size
+            // Note that currently we need to make this big enough to copy two whole buffers,
+            // as otherwise when we refill the buffer the second type, the alert triggers instantly.
+            int correctCount = (CodedInputStream.BufferSize*2)/messageSize + 1;
+            using (MemoryStream stream = new MemoryStream())
+            {
+                MessageStreamWriter<TestAllTypes> writer = new MessageStreamWriter<TestAllTypes>(stream);
+                for (int i = 0; i < correctCount; i++)
+                {
+                    writer.Write(TestUtil.GetAllSet());
+                }
+                writer.Flush();
+
+                stream.Position = 0;
+
+                int count = 0;
+                foreach (var message in MessageStreamIterator<TestAllTypes>.FromStreamProvider(() => stream)
+                    .WithSizeLimit(CodedInputStream.BufferSize*2))
+                {
+                    count++;
+                    TestUtil.AssertAllFieldsSet(message);
+                }
+                Assert.AreEqual(correctCount, count);
+            }
+        }
+    }
+}

+ 78 - 0
csharp/src/ProtocolBuffers.Test/MessageStreamWriterTest.cs

@@ -0,0 +1,78 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System.IO;
+using NUnit.Framework;
+using NestedMessage = Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage;
+
+namespace Google.ProtocolBuffers
+{
+    public class MessageStreamWriterTest
+    {
+        internal static readonly byte[] ThreeMessageData = new byte[]
+                                                               {
+                                                                   (1 << 3) | 2, 2,
+                                                                   // Field 1, 2 bytes long (first message)
+                                                                   (1 << 3) | 0, 5, // Field 1, value 5
+                                                                   (1 << 3) | 2, 3,
+                                                                   // Field 1, 3 bytes long (second message)
+                                                                   (1 << 3) | 0, (1500 & 0x7f) | 0x80, 1500 >> 7,
+                                                                   // Field 1, value 1500
+                                                                   (1 << 3) | 2, 0, // Field 1, no data (third message)
+                                                               };
+
+        [Test]
+        public void ThreeMessages()
+        {
+            NestedMessage message1 = new NestedMessage.Builder {Bb = 5}.Build();
+            NestedMessage message2 = new NestedMessage.Builder {Bb = 1500}.Build();
+            NestedMessage message3 = new NestedMessage.Builder().Build();
+
+            byte[] data;
+            using (MemoryStream stream = new MemoryStream())
+            {
+                MessageStreamWriter<NestedMessage> writer = new MessageStreamWriter<NestedMessage>(stream);
+                writer.Write(message1);
+                writer.Write(message2);
+                writer.Write(message3);
+                writer.Flush();
+                data = stream.ToArray();
+            }
+
+            TestUtil.AssertEqualBytes(ThreeMessageData, data);
+        }
+    }
+}

+ 344 - 0
csharp/src/ProtocolBuffers.Test/MessageTest.cs

@@ -0,0 +1,344 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System.IO;
+using Google.ProtocolBuffers.Descriptors;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers
+{
+    /// <summary>
+    /// Miscellaneous tests for message operations that apply to both
+    /// generated and dynamic messages.
+    /// </summary>
+    public class MessageTest
+    {
+        // =================================================================
+        // Message-merging tests.
+
+        private static readonly TestAllTypes MergeSource = new TestAllTypes.Builder
+                                                               {
+                                                                   OptionalInt32 = 1,
+                                                                   OptionalString = "foo",
+                                                                   OptionalForeignMessage =
+                                                                       ForeignMessage.DefaultInstance,
+                                                               }.AddRepeatedString("bar").Build();
+
+        private static readonly TestAllTypes MergeDest = new TestAllTypes.Builder
+                                                             {
+                                                                 OptionalInt64 = 2,
+                                                                 OptionalString = "baz",
+                                                                 OptionalForeignMessage =
+                                                                     new ForeignMessage.Builder {C = 3}.Build(),
+                                                             }.AddRepeatedString("qux").Build();
+
+        private const string MergeResultText =
+            "optional_int32: 1\n" +
+            "optional_int64: 2\n" +
+            "optional_string: \"foo\"\n" +
+            "optional_foreign_message {\n" +
+            "  c: 3\n" +
+            "}\n" +
+            "repeated_string: \"qux\"\n" +
+            "repeated_string: \"bar\"\n";
+
+        [Test]
+        public void MergeFrom()
+        {
+            TestAllTypes result = TestAllTypes.CreateBuilder(MergeDest).MergeFrom(MergeSource).Build();
+
+            Assert.AreEqual(MergeResultText, result.ToString());
+        }
+
+        /// <summary>
+        /// Test merging a DynamicMessage into a GeneratedMessage. 
+        /// As long as they have the same descriptor, this should work, but it is an
+        /// entirely different code path.
+        /// </summary>
+        [Test]
+        public void MergeFromDynamic()
+        {
+            TestAllTypes result = (TestAllTypes) TestAllTypes.CreateBuilder(MergeDest)
+                                                     .MergeFrom(DynamicMessage.CreateBuilder(MergeSource).Build())
+                                                     .Build();
+
+            Assert.AreEqual(MergeResultText, result.ToString());
+        }
+
+        /// <summary>
+        /// Test merging two DynamicMessages.
+        /// </summary>
+        [Test]
+        public void DynamicMergeFrom()
+        {
+            DynamicMessage result = (DynamicMessage) DynamicMessage.CreateBuilder(MergeDest)
+                                                         .MergeFrom(
+                                                             (DynamicMessage)
+                                                             DynamicMessage.CreateBuilder(MergeSource).Build())
+                                                         .Build();
+
+            Assert.AreEqual(MergeResultText, result.ToString());
+        }
+
+        // =================================================================
+        // Required-field-related tests.
+
+        private static readonly TestRequired TestRequiredUninitialized = TestRequired.DefaultInstance;
+
+        private static readonly TestRequired TestRequiredInitialized = new TestRequired.Builder
+                                                                           {
+                                                                               A = 1,
+                                                                               B = 2,
+                                                                               C = 3
+                                                                           }.Build();
+
+        [Test]
+        public void Initialization()
+        {
+            TestRequired.Builder builder = TestRequired.CreateBuilder();
+
+            Assert.IsFalse(builder.IsInitialized);
+            builder.A = 1;
+            Assert.IsFalse(builder.IsInitialized);
+            builder.B = 1;
+            Assert.IsFalse(builder.IsInitialized);
+            builder.C = 1;
+            Assert.IsTrue(builder.IsInitialized);
+        }
+
+        [Test]
+        public void UninitializedBuilderToString()
+        {
+            TestRequired.Builder builder = TestRequired.CreateBuilder().SetA(1);
+            Assert.AreEqual("a: 1\n", builder.ToString());
+        }
+
+        [Test]
+        public void RequiredForeign()
+        {
+            TestRequiredForeign.Builder builder = TestRequiredForeign.CreateBuilder();
+
+            Assert.IsTrue(builder.IsInitialized);
+
+            builder.SetOptionalMessage(TestRequiredUninitialized);
+            Assert.IsFalse(builder.IsInitialized);
+
+            builder.SetOptionalMessage(TestRequiredInitialized);
+            Assert.IsTrue(builder.IsInitialized);
+
+            builder.AddRepeatedMessage(TestRequiredUninitialized);
+            Assert.IsFalse(builder.IsInitialized);
+
+            builder.SetRepeatedMessage(0, TestRequiredInitialized);
+            Assert.IsTrue(builder.IsInitialized);
+        }
+
+        [Test]
+        public void RequiredExtension()
+        {
+            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
+
+            Assert.IsTrue(builder.IsInitialized);
+
+            builder.SetExtension(TestRequired.Single, TestRequiredUninitialized);
+            Assert.IsFalse(builder.IsInitialized);
+
+            builder.SetExtension(TestRequired.Single, TestRequiredInitialized);
+            Assert.IsTrue(builder.IsInitialized);
+
+            builder.AddExtension(TestRequired.Multi, TestRequiredUninitialized);
+            Assert.IsFalse(builder.IsInitialized);
+
+            builder.SetExtension(TestRequired.Multi, 0, TestRequiredInitialized);
+            Assert.IsTrue(builder.IsInitialized);
+        }
+
+        [Test]
+        public void RequiredDynamic()
+        {
+            MessageDescriptor descriptor = TestRequired.Descriptor;
+            DynamicMessage.Builder builder = DynamicMessage.CreateBuilder(descriptor);
+
+            Assert.IsFalse(builder.IsInitialized);
+            builder[descriptor.FindDescriptor<FieldDescriptor>("a")] = 1;
+            Assert.IsFalse(builder.IsInitialized);
+            builder[descriptor.FindDescriptor<FieldDescriptor>("b")] = 1;
+            Assert.IsFalse(builder.IsInitialized);
+            builder[descriptor.FindDescriptor<FieldDescriptor>("c")] = 1;
+            Assert.IsTrue(builder.IsInitialized);
+        }
+
+        [Test]
+        public void RequiredDynamicForeign()
+        {
+            MessageDescriptor descriptor = TestRequiredForeign.Descriptor;
+            DynamicMessage.Builder builder = DynamicMessage.CreateBuilder(descriptor);
+
+            Assert.IsTrue(builder.IsInitialized);
+
+            builder[descriptor.FindDescriptor<FieldDescriptor>("optional_message")] = TestRequiredUninitialized;
+            Assert.IsFalse(builder.IsInitialized);
+
+            builder[descriptor.FindDescriptor<FieldDescriptor>("optional_message")] = TestRequiredInitialized;
+            Assert.IsTrue(builder.IsInitialized);
+
+            builder.AddRepeatedField(descriptor.FindDescriptor<FieldDescriptor>("repeated_message"),
+                                     TestRequiredUninitialized);
+            Assert.IsFalse(builder.IsInitialized);
+
+            builder.SetRepeatedField(descriptor.FindDescriptor<FieldDescriptor>("repeated_message"), 0,
+                                     TestRequiredInitialized);
+            Assert.IsTrue(builder.IsInitialized);
+        }
+
+        [Test]
+        public void UninitializedException()
+        {
+            var e = Assert.Throws<UninitializedMessageException>(() => TestRequired.CreateBuilder().Build());
+            Assert.AreEqual("Message missing required fields: a, b, c", e.Message);
+        }
+
+        [Test]
+        public void BuildPartial()
+        {
+            // We're mostly testing that no exception is thrown.
+            TestRequired message = TestRequired.CreateBuilder().BuildPartial();
+            Assert.IsFalse(message.IsInitialized);
+        }
+
+        [Test]
+        public void NestedUninitializedException()
+        {
+            var e = Assert.Throws<UninitializedMessageException>(() => TestRequiredForeign.CreateBuilder()
+                    .SetOptionalMessage(TestRequiredUninitialized)
+                    .AddRepeatedMessage(TestRequiredUninitialized)
+                    .AddRepeatedMessage(TestRequiredUninitialized)
+                    .Build());
+            Assert.AreEqual(
+                "Message missing required fields: " +
+                "optional_message.a, " +
+                "optional_message.b, " +
+                "optional_message.c, " +
+                "repeated_message[0].a, " +
+                "repeated_message[0].b, " +
+                "repeated_message[0].c, " +
+                "repeated_message[1].a, " +
+                "repeated_message[1].b, " +
+                "repeated_message[1].c",
+                e.Message);
+        }
+
+        [Test]
+        public void BuildNestedPartial()
+        {
+            // We're mostly testing that no exception is thrown.
+            TestRequiredForeign message =
+                TestRequiredForeign.CreateBuilder()
+                    .SetOptionalMessage(TestRequiredUninitialized)
+                    .AddRepeatedMessage(TestRequiredUninitialized)
+                    .AddRepeatedMessage(TestRequiredUninitialized)
+                    .BuildPartial();
+            Assert.IsFalse(message.IsInitialized);
+        }
+
+        [Test]
+        public void ParseUninitialized()
+        {
+            var e = Assert.Throws<InvalidProtocolBufferException>(() => TestRequired.ParseFrom(ByteString.Empty));
+            Assert.AreEqual("Message missing required fields: a, b, c", e.Message);
+        }
+
+        [Test]
+        public void ParseNestedUnititialized()
+        {
+            ByteString data =
+                TestRequiredForeign.CreateBuilder()
+                    .SetOptionalMessage(TestRequiredUninitialized)
+                    .AddRepeatedMessage(TestRequiredUninitialized)
+                    .AddRepeatedMessage(TestRequiredUninitialized)
+                    .BuildPartial().ToByteString();
+
+            var e = Assert.Throws<InvalidProtocolBufferException>(() => TestRequiredForeign.ParseFrom(data));
+            Assert.AreEqual(
+                "Message missing required fields: " +
+                "optional_message.a, " +
+                "optional_message.b, " +
+                "optional_message.c, " +
+                "repeated_message[0].a, " +
+                "repeated_message[0].b, " +
+                "repeated_message[0].c, " +
+                "repeated_message[1].a, " +
+                "repeated_message[1].b, " +
+                "repeated_message[1].c",
+                e.Message);
+        }
+
+        [Test]
+        public void DynamicUninitializedException()
+        {
+            var e = Assert.Throws<UninitializedMessageException>(() => DynamicMessage.CreateBuilder(TestRequired.Descriptor).Build());
+            Assert.AreEqual("Message missing required fields: a, b, c", e.Message);
+        }
+
+        [Test]
+        public void DynamicBuildPartial()
+        {
+            // We're mostly testing that no exception is thrown.
+            DynamicMessage message = DynamicMessage.CreateBuilder(TestRequired.Descriptor).BuildPartial();
+            Assert.IsFalse(message.Initialized);
+        }
+
+        [Test]
+        public void DynamicParseUnititialized()
+        {
+            MessageDescriptor descriptor = TestRequired.Descriptor;
+            var e = Assert.Throws<InvalidProtocolBufferException>(() => DynamicMessage.ParseFrom(descriptor, ByteString.Empty));
+            Assert.AreEqual("Message missing required fields: a, b, c", e.Message);
+        }
+
+        [Test]
+        public void PackedTypesWrittenDirectlyToStream()
+        {
+            TestPackedTypes message = new TestPackedTypes.Builder {PackedInt32List = {0, 1, 2}}.Build();
+            MemoryStream stream = new MemoryStream();
+            message.WriteTo(stream);
+            stream.Position = 0;
+            TestPackedTypes readMessage = TestPackedTypes.ParseFrom(stream);
+            Assert.AreEqual(message, readMessage);
+        }
+    }
+}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно