// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: google/protobuf/unittest_well_known_types.proto
#pragma warning disable 1591, 0612, 3021
#region Designer generated code

using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Google.Protobuf.TestProtos {

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public static partial class UnittestWellKnownTypes {

    #region Descriptor
    public static pbr::FileDescriptor Descriptor {
      get { return descriptor; }
    }
    private static pbr::FileDescriptor descriptor;

    static UnittestWellKnownTypes() {
      byte[] descriptorData = global::System.Convert.FromBase64String(
          string.Concat(
            "Ci9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5w", 
            "cm90bxIRcHJvdG9idWZfdW5pdHRlc3QaGWdvb2dsZS9wcm90b2J1Zi9hbnku", 
            "cHJvdG8aGWdvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8aHmdvb2dsZS9wcm90", 
            "b2J1Zi9kdXJhdGlvbi5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBy", 
            "b3RvGiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxokZ29vZ2xl", 
            "L3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvGhxnb29nbGUvcHJvdG9i", 
            "dWYvc3RydWN0LnByb3RvGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBy", 
            "b3RvGhpnb29nbGUvcHJvdG9idWYvdHlwZS5wcm90bxoeZ29vZ2xlL3Byb3Rv", 
            "YnVmL3dyYXBwZXJzLnByb3RvIpEHChJUZXN0V2VsbEtub3duVHlwZXMSJwoJ", 
            "YW55X2ZpZWxkGAEgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueRInCglhcGlf", 
            "ZmllbGQYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQXBpEjEKDmR1cmF0aW9u", 
            "X2ZpZWxkGAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEisKC2Vt", 
            "cHR5X2ZpZWxkGAQgASgLMhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EjQKEGZp", 
            "ZWxkX21hc2tfZmllbGQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRN", 
            "YXNrEjwKFHNvdXJjZV9jb250ZXh0X2ZpZWxkGAYgASgLMh4uZ29vZ2xlLnBy", 
            "b3RvYnVmLlNvdXJjZUNvbnRleHQSLQoMc3RydWN0X2ZpZWxkGAcgASgLMhcu", 
            "Z29vZ2xlLnByb3RvYnVmLlN0cnVjdBIzCg90aW1lc3RhbXBfZmllbGQYCCAB", 
            "KAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEikKCnR5cGVfZmllbGQY", 
            "CSABKAsyFS5nb29nbGUucHJvdG9idWYuVHlwZRIyCgxkb3VibGVfZmllbGQY", 
            "CiABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSMAoLZmxvYXRf", 
            "ZmllbGQYCyABKAsyGy5nb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZRIwCgtp", 
            "bnQ2NF9maWVsZBgMIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVl", 
            "EjIKDHVpbnQ2NF9maWVsZBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50", 
            "NjRWYWx1ZRIwCgtpbnQzMl9maWVsZBgOIAEoCzIbLmdvb2dsZS5wcm90b2J1", 
            "Zi5JbnQzMlZhbHVlEjIKDHVpbnQzMl9maWVsZBgPIAEoCzIcLmdvb2dsZS5w", 
            "cm90b2J1Zi5VSW50MzJWYWx1ZRIuCgpib29sX2ZpZWxkGBAgASgLMhouZ29v", 
            "Z2xlLnByb3RvYnVmLkJvb2xWYWx1ZRIyCgxzdHJpbmdfZmllbGQYESABKAsy", 
            "HC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSMAoLYnl0ZXNfZmllbGQY", 
            "EiABKAsyGy5nb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZSKVBwoWUmVwZWF0", 
            "ZWRXZWxsS25vd25UeXBlcxInCglhbnlfZmllbGQYASADKAsyFC5nb29nbGUu", 
            "cHJvdG9idWYuQW55EicKCWFwaV9maWVsZBgCIAMoCzIULmdvb2dsZS5wcm90", 
            "b2J1Zi5BcGkSMQoOZHVyYXRpb25fZmllbGQYAyADKAsyGS5nb29nbGUucHJv", 
            "dG9idWYuRHVyYXRpb24SKwoLZW1wdHlfZmllbGQYBCADKAsyFi5nb29nbGUu", 
            "cHJvdG9idWYuRW1wdHkSNAoQZmllbGRfbWFza19maWVsZBgFIAMoCzIaLmdv", 
            "b2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sSPAoUc291cmNlX2NvbnRleHRfZmll", 
            "bGQYBiADKAsyHi5nb29nbGUucHJvdG9idWYuU291cmNlQ29udGV4dBItCgxz", 
            "dHJ1Y3RfZmllbGQYByADKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0EjMK", 
            "D3RpbWVzdGFtcF9maWVsZBgIIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1l", 
            "c3RhbXASKQoKdHlwZV9maWVsZBgJIAMoCzIVLmdvb2dsZS5wcm90b2J1Zi5U", 
            "eXBlEjIKDGRvdWJsZV9maWVsZBgKIAMoCzIcLmdvb2dsZS5wcm90b2J1Zi5E", 
            "b3VibGVWYWx1ZRIwCgtmbG9hdF9maWVsZBgLIAMoCzIbLmdvb2dsZS5wcm90", 
            "b2J1Zi5GbG9hdFZhbHVlEjAKC2ludDY0X2ZpZWxkGAwgAygLMhsuZ29vZ2xl", 
            "LnByb3RvYnVmLkludDY0VmFsdWUSMgoMdWludDY0X2ZpZWxkGA0gAygLMhwu", 
            "Z29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEjAKC2ludDMyX2ZpZWxkGA4g", 
            "AygLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSMgoMdWludDMyX2Zp", 
            "ZWxkGA8gAygLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlEi4KCmJv", 
            "b2xfZmllbGQYECADKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjIK", 
            "DHN0cmluZ19maWVsZBgRIAMoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdW", 
            "YWx1ZRIwCgtieXRlc19maWVsZBgSIAMoCzIbLmdvb2dsZS5wcm90b2J1Zi5C", 
            "eXRlc1ZhbHVlIsUHChNPbmVvZldlbGxLbm93blR5cGVzEikKCWFueV9maWVs", 
            "ZBgBIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlIABIpCglhcGlfZmllbGQY", 
            "AiABKAsyFC5nb29nbGUucHJvdG9idWYuQXBpSAASMwoOZHVyYXRpb25fZmll", 
            "bGQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25IABItCgtlbXB0", 
            "eV9maWVsZBgEIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eUgAEjYKEGZp", 
            "ZWxkX21hc2tfZmllbGQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRN", 
            "YXNrSAASPgoUc291cmNlX2NvbnRleHRfZmllbGQYBiABKAsyHi5nb29nbGUu", 
            "cHJvdG9idWYuU291cmNlQ29udGV4dEgAEi8KDHN0cnVjdF9maWVsZBgHIAEo", 
            "CzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIABI1Cg90aW1lc3RhbXBfZmll", 
            "bGQYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAASKwoKdHlw", 
            "ZV9maWVsZBgJIAEoCzIVLmdvb2dsZS5wcm90b2J1Zi5UeXBlSAASNAoMZG91", 
            "YmxlX2ZpZWxkGAogASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVl", 
            "SAASMgoLZmxvYXRfZmllbGQYCyABKAsyGy5nb29nbGUucHJvdG9idWYuRmxv", 
            "YXRWYWx1ZUgAEjIKC2ludDY0X2ZpZWxkGAwgASgLMhsuZ29vZ2xlLnByb3Rv", 
            "YnVmLkludDY0VmFsdWVIABI0Cgx1aW50NjRfZmllbGQYDSABKAsyHC5nb29n", 
            "bGUucHJvdG9idWYuVUludDY0VmFsdWVIABIyCgtpbnQzMl9maWVsZBgOIAEo", 
            "CzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlSAASNAoMdWludDMyX2Zp", 
            "ZWxkGA8gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlSAASMAoK", 
            "Ym9vbF9maWVsZBgQIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWVI", 
            "ABI0CgxzdHJpbmdfZmllbGQYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3Ry", 
            "aW5nVmFsdWVIABIyCgtieXRlc19maWVsZBgSIAEoCzIbLmdvb2dsZS5wcm90", 
            "b2J1Zi5CeXRlc1ZhbHVlSABCDQoLb25lb2ZfZmllbGQilhYKEU1hcFdlbGxL", 
            "bm93blR5cGVzEkUKCWFueV9maWVsZBgBIAMoCzIyLnByb3RvYnVmX3VuaXR0", 
            "ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkFueUZpZWxkRW50cnkSRQoJYXBpX2Zp", 
            "ZWxkGAIgAygLMjIucHJvdG9idWZfdW5pdHRlc3QuTWFwV2VsbEtub3duVHlw", 
            "ZXMuQXBpRmllbGRFbnRyeRJPCg5kdXJhdGlvbl9maWVsZBgDIAMoCzI3LnBy", 
            "b3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkR1cmF0aW9uRmll", 
            "bGRFbnRyeRJJCgtlbXB0eV9maWVsZBgEIAMoCzI0LnByb3RvYnVmX3VuaXR0", 
            "ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkVtcHR5RmllbGRFbnRyeRJSChBmaWVs", 
            "ZF9tYXNrX2ZpZWxkGAUgAygLMjgucHJvdG9idWZfdW5pdHRlc3QuTWFwV2Vs", 
            "bEtub3duVHlwZXMuRmllbGRNYXNrRmllbGRFbnRyeRJaChRzb3VyY2VfY29u", 
            "dGV4dF9maWVsZBgGIAMoCzI8LnByb3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxL", 
            "bm93blR5cGVzLlNvdXJjZUNvbnRleHRGaWVsZEVudHJ5EksKDHN0cnVjdF9m", 
            "aWVsZBgHIAMoCzI1LnByb3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5", 
            "cGVzLlN0cnVjdEZpZWxkRW50cnkSUQoPdGltZXN0YW1wX2ZpZWxkGAggAygL", 
            "MjgucHJvdG9idWZfdW5pdHRlc3QuTWFwV2VsbEtub3duVHlwZXMuVGltZXN0", 
            "YW1wRmllbGRFbnRyeRJHCgp0eXBlX2ZpZWxkGAkgAygLMjMucHJvdG9idWZf", 
            "dW5pdHRlc3QuTWFwV2VsbEtub3duVHlwZXMuVHlwZUZpZWxkRW50cnkSSwoM", 
            "ZG91YmxlX2ZpZWxkGAogAygLMjUucHJvdG9idWZfdW5pdHRlc3QuTWFwV2Vs", 
            "bEtub3duVHlwZXMuRG91YmxlRmllbGRFbnRyeRJJCgtmbG9hdF9maWVsZBgL", 
            "IAMoCzI0LnByb3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkZs", 
            "b2F0RmllbGRFbnRyeRJJCgtpbnQ2NF9maWVsZBgMIAMoCzI0LnByb3RvYnVm", 
            "X3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVzLkludDY0RmllbGRFbnRyeRJL", 
            "Cgx1aW50NjRfZmllbGQYDSADKAsyNS5wcm90b2J1Zl91bml0dGVzdC5NYXBX", 
            "ZWxsS25vd25UeXBlcy5VaW50NjRGaWVsZEVudHJ5EkkKC2ludDMyX2ZpZWxk", 
            "GA4gAygLMjQucHJvdG9idWZfdW5pdHRlc3QuTWFwV2VsbEtub3duVHlwZXMu", 
            "SW50MzJGaWVsZEVudHJ5EksKDHVpbnQzMl9maWVsZBgPIAMoCzI1LnByb3Rv", 
            "YnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVzLlVpbnQzMkZpZWxkRW50", 
            "cnkSRwoKYm9vbF9maWVsZBgQIAMoCzIzLnByb3RvYnVmX3VuaXR0ZXN0Lk1h", 
            "cFdlbGxLbm93blR5cGVzLkJvb2xGaWVsZEVudHJ5EksKDHN0cmluZ19maWVs", 
            "ZBgRIAMoCzI1LnByb3RvYnVmX3VuaXR0ZXN0Lk1hcFdlbGxLbm93blR5cGVz", 
            "LlN0cmluZ0ZpZWxkRW50cnkSSQoLYnl0ZXNfZmllbGQYEiADKAsyNC5wcm90", 
            "b2J1Zl91bml0dGVzdC5NYXBXZWxsS25vd25UeXBlcy5CeXRlc0ZpZWxkRW50", 
            "cnkaRQoNQW55RmllbGRFbnRyeRILCgNrZXkYASABKAUSIwoFdmFsdWUYAiAB", 
            "KAsyFC5nb29nbGUucHJvdG9idWYuQW55OgI4ARpFCg1BcGlGaWVsZEVudHJ5", 
            "EgsKA2tleRgBIAEoBRIjCgV2YWx1ZRgCIAEoCzIULmdvb2dsZS5wcm90b2J1", 
            "Zi5BcGk6AjgBGk8KEkR1cmF0aW9uRmllbGRFbnRyeRILCgNrZXkYASABKAUS", 
            "KAoFdmFsdWUYAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb246AjgB", 
            "GkkKD0VtcHR5RmllbGRFbnRyeRILCgNrZXkYASABKAUSJQoFdmFsdWUYAiAB", 
            "KAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHk6AjgBGlEKE0ZpZWxkTWFza0Zp", 
            "ZWxkRW50cnkSCwoDa2V5GAEgASgFEikKBXZhbHVlGAIgASgLMhouZ29vZ2xl", 
            "LnByb3RvYnVmLkZpZWxkTWFzazoCOAEaWQoXU291cmNlQ29udGV4dEZpZWxk", 
            "RW50cnkSCwoDa2V5GAEgASgFEi0KBXZhbHVlGAIgASgLMh4uZ29vZ2xlLnBy", 
            "b3RvYnVmLlNvdXJjZUNvbnRleHQ6AjgBGksKEFN0cnVjdEZpZWxkRW50cnkS", 
            "CwoDa2V5GAEgASgFEiYKBXZhbHVlGAIgASgLMhcuZ29vZ2xlLnByb3RvYnVm", 
            "LlN0cnVjdDoCOAEaUQoTVGltZXN0YW1wRmllbGRFbnRyeRILCgNrZXkYASAB", 
            "KAUSKQoFdmFsdWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1w", 
            "OgI4ARpHCg5UeXBlRmllbGRFbnRyeRILCgNrZXkYASABKAUSJAoFdmFsdWUY", 
            "AiABKAsyFS5nb29nbGUucHJvdG9idWYuVHlwZToCOAEaUAoQRG91YmxlRmll", 
            "bGRFbnRyeRILCgNrZXkYASABKAUSKwoFdmFsdWUYAiABKAsyHC5nb29nbGUu", 
            "cHJvdG9idWYuRG91YmxlVmFsdWU6AjgBGk4KD0Zsb2F0RmllbGRFbnRyeRIL", 
            "CgNrZXkYASABKAUSKgoFdmFsdWUYAiABKAsyGy5nb29nbGUucHJvdG9idWYu", 
            "RmxvYXRWYWx1ZToCOAEaTgoPSW50NjRGaWVsZEVudHJ5EgsKA2tleRgBIAEo", 
            "BRIqCgV2YWx1ZRgCIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVl", 
            "OgI4ARpQChBVaW50NjRGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRIrCgV2YWx1", 
            "ZRgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZToCOAEaTgoP", 
            "SW50MzJGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRIqCgV2YWx1ZRgCIAEoCzIb", 
            "Lmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlOgI4ARpQChBVaW50MzJGaWVs", 
            "ZEVudHJ5EgsKA2tleRgBIAEoBRIrCgV2YWx1ZRgCIAEoCzIcLmdvb2dsZS5w", 
            "cm90b2J1Zi5VSW50MzJWYWx1ZToCOAEaTAoOQm9vbEZpZWxkRW50cnkSCwoD", 
            "a2V5GAEgASgFEikKBXZhbHVlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJv", 
            "b2xWYWx1ZToCOAEaUAoQU3RyaW5nRmllbGRFbnRyeRILCgNrZXkYASABKAUS", 
            "KwoFdmFsdWUYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWU6", 
            "AjgBGk4KD0J5dGVzRmllbGRFbnRyeRILCgNrZXkYASABKAUSKgoFdmFsdWUY", 
            "AiABKAsyGy5nb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZToCOAFCOQoYY29t", 
            "Lmdvb2dsZS5wcm90b2J1Zi50ZXN0UAGqAhpHb29nbGUuUHJvdG9idWYuVGVz", 
            "dFByb3Rvc2IGcHJvdG8z"));
      descriptor = pbr::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
          new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.Proto.Any.Descriptor, global::Google.Protobuf.WellKnownTypes.Proto.Api.Descriptor, global::Google.Protobuf.WellKnownTypes.Proto.Duration.Descriptor, global::Google.Protobuf.WellKnownTypes.Proto.Empty.Descriptor, global::Google.Protobuf.WellKnownTypes.Proto.FieldMask.Descriptor, global::Google.Protobuf.WellKnownTypes.Proto.SourceContext.Descriptor, global::Google.Protobuf.WellKnownTypes.Proto.Struct.Descriptor, global::Google.Protobuf.WellKnownTypes.Proto.Timestamp.Descriptor, global::Google.Protobuf.WellKnownTypes.Proto.Type.Descriptor, global::Google.Protobuf.WellKnownTypes.Wrappers.Descriptor, },
          new pbr::GeneratedCodeInfo(null, new pbr::GeneratedCodeInfo[] {
            new pbr::GeneratedCodeInfo(typeof(global::Google.Protobuf.TestProtos.TestWellKnownTypes), new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, null, null, null),
            new pbr::GeneratedCodeInfo(typeof(global::Google.Protobuf.TestProtos.RepeatedWellKnownTypes), new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, null, null, null),
            new pbr::GeneratedCodeInfo(typeof(global::Google.Protobuf.TestProtos.OneofWellKnownTypes), new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, new[]{ "OneofField" }, null, null),
            new pbr::GeneratedCodeInfo(typeof(global::Google.Protobuf.TestProtos.MapWellKnownTypes), new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, null, null, new pbr::GeneratedCodeInfo[] { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, })
          }));
    }
    #endregion

  }
  #region Messages
  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class TestWellKnownTypes : pb::IMessage<TestWellKnownTypes> {
    private static readonly pb::MessageParser<TestWellKnownTypes> _parser = new pb::MessageParser<TestWellKnownTypes>(() => new TestWellKnownTypes());
    public static pb::MessageParser<TestWellKnownTypes> Parser { get { return _parser; } }

    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypes.Descriptor.MessageTypes[0]; }
    }

    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    public TestWellKnownTypes() {
      OnConstruction();
    }

    partial void OnConstruction();

    public TestWellKnownTypes(TestWellKnownTypes other) : this() {
      AnyField = other.anyField_ != null ? other.AnyField.Clone() : null;
      ApiField = other.apiField_ != null ? other.ApiField.Clone() : null;
      DurationField = other.durationField_ != null ? other.DurationField.Clone() : null;
      EmptyField = other.emptyField_ != null ? other.EmptyField.Clone() : null;
      FieldMaskField = other.fieldMaskField_ != null ? other.FieldMaskField.Clone() : null;
      SourceContextField = other.sourceContextField_ != null ? other.SourceContextField.Clone() : null;
      StructField = other.structField_ != null ? other.StructField.Clone() : null;
      TimestampField = other.timestampField_ != null ? other.TimestampField.Clone() : null;
      TypeField = other.typeField_ != null ? other.TypeField.Clone() : null;
      DoubleField = other.DoubleField;
      FloatField = other.FloatField;
      Int64Field = other.Int64Field;
      Uint64Field = other.Uint64Field;
      Int32Field = other.Int32Field;
      Uint32Field = other.Uint32Field;
      BoolField = other.BoolField;
      StringField = other.StringField;
      BytesField = other.BytesField;
    }

    public TestWellKnownTypes Clone() {
      return new TestWellKnownTypes(this);
    }

    public const int AnyFieldFieldNumber = 1;
    private global::Google.Protobuf.WellKnownTypes.Any anyField_;
    public global::Google.Protobuf.WellKnownTypes.Any AnyField {
      get { return anyField_; }
      set {
        anyField_ = value;
      }
    }

    public const int ApiFieldFieldNumber = 2;
    private global::Google.Protobuf.WellKnownTypes.Api apiField_;
    public global::Google.Protobuf.WellKnownTypes.Api ApiField {
      get { return apiField_; }
      set {
        apiField_ = value;
      }
    }

    public const int DurationFieldFieldNumber = 3;
    private global::Google.Protobuf.WellKnownTypes.Duration durationField_;
    public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
      get { return durationField_; }
      set {
        durationField_ = value;
      }
    }

    public const int EmptyFieldFieldNumber = 4;
    private global::Google.Protobuf.WellKnownTypes.Empty emptyField_;
    public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
      get { return emptyField_; }
      set {
        emptyField_ = value;
      }
    }

    public const int FieldMaskFieldFieldNumber = 5;
    private global::Google.Protobuf.WellKnownTypes.FieldMask fieldMaskField_;
    public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
      get { return fieldMaskField_; }
      set {
        fieldMaskField_ = value;
      }
    }

    public const int SourceContextFieldFieldNumber = 6;
    private global::Google.Protobuf.WellKnownTypes.SourceContext sourceContextField_;
    public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
      get { return sourceContextField_; }
      set {
        sourceContextField_ = value;
      }
    }

    public const int StructFieldFieldNumber = 7;
    private global::Google.Protobuf.WellKnownTypes.Struct structField_;
    public global::Google.Protobuf.WellKnownTypes.Struct StructField {
      get { return structField_; }
      set {
        structField_ = value;
      }
    }

    public const int TimestampFieldFieldNumber = 8;
    private global::Google.Protobuf.WellKnownTypes.Timestamp timestampField_;
    public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
      get { return timestampField_; }
      set {
        timestampField_ = value;
      }
    }

    public const int TypeFieldFieldNumber = 9;
    private global::Google.Protobuf.WellKnownTypes.Type typeField_;
    public global::Google.Protobuf.WellKnownTypes.Type TypeField {
      get { return typeField_; }
      set {
        typeField_ = value;
      }
    }

    public const int DoubleFieldFieldNumber = 10;
    private static readonly pb::FieldCodec<double?> _single_doubleField_codec = pb::FieldCodec.ForStructWrapper<double>(82);
    private double? doubleField_;
    public double? DoubleField {
      get { return doubleField_; }
      set {
        doubleField_ = value;
      }
    }

    public const int FloatFieldFieldNumber = 11;
    private static readonly pb::FieldCodec<float?> _single_floatField_codec = pb::FieldCodec.ForStructWrapper<float>(90);
    private float? floatField_;
    public float? FloatField {
      get { return floatField_; }
      set {
        floatField_ = value;
      }
    }

    public const int Int64FieldFieldNumber = 12;
    private static readonly pb::FieldCodec<long?> _single_int64Field_codec = pb::FieldCodec.ForStructWrapper<long>(98);
    private long? int64Field_;
    public long? Int64Field {
      get { return int64Field_; }
      set {
        int64Field_ = value;
      }
    }

    public const int Uint64FieldFieldNumber = 13;
    private static readonly pb::FieldCodec<ulong?> _single_uint64Field_codec = pb::FieldCodec.ForStructWrapper<ulong>(106);
    private ulong? uint64Field_;
    public ulong? Uint64Field {
      get { return uint64Field_; }
      set {
        uint64Field_ = value;
      }
    }

    public const int Int32FieldFieldNumber = 14;
    private static readonly pb::FieldCodec<int?> _single_int32Field_codec = pb::FieldCodec.ForStructWrapper<int>(114);
    private int? int32Field_;
    public int? Int32Field {
      get { return int32Field_; }
      set {
        int32Field_ = value;
      }
    }

    public const int Uint32FieldFieldNumber = 15;
    private static readonly pb::FieldCodec<uint?> _single_uint32Field_codec = pb::FieldCodec.ForStructWrapper<uint>(122);
    private uint? uint32Field_;
    public uint? Uint32Field {
      get { return uint32Field_; }
      set {
        uint32Field_ = value;
      }
    }

    public const int BoolFieldFieldNumber = 16;
    private static readonly pb::FieldCodec<bool?> _single_boolField_codec = pb::FieldCodec.ForStructWrapper<bool>(130);
    private bool? boolField_;
    public bool? BoolField {
      get { return boolField_; }
      set {
        boolField_ = value;
      }
    }

    public const int StringFieldFieldNumber = 17;
    private static readonly pb::FieldCodec<string> _single_stringField_codec = pb::FieldCodec.ForClassWrapper<string>(138);
    private string stringField_;
    public string StringField {
      get { return stringField_; }
      set {
        stringField_ = value;
      }
    }

    public const int BytesFieldFieldNumber = 18;
    private static readonly pb::FieldCodec<pb::ByteString> _single_bytesField_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
    private pb::ByteString bytesField_;
    public pb::ByteString BytesField {
      get { return bytesField_; }
      set {
        bytesField_ = value;
      }
    }

    public override bool Equals(object other) {
      return Equals(other as TestWellKnownTypes);
    }

    public bool Equals(TestWellKnownTypes other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!object.Equals(AnyField, other.AnyField)) return false;
      if (!object.Equals(ApiField, other.ApiField)) return false;
      if (!object.Equals(DurationField, other.DurationField)) return false;
      if (!object.Equals(EmptyField, other.EmptyField)) return false;
      if (!object.Equals(FieldMaskField, other.FieldMaskField)) return false;
      if (!object.Equals(SourceContextField, other.SourceContextField)) return false;
      if (!object.Equals(StructField, other.StructField)) return false;
      if (!object.Equals(TimestampField, other.TimestampField)) return false;
      if (!object.Equals(TypeField, other.TypeField)) return false;
      if (DoubleField != other.DoubleField) return false;
      if (FloatField != other.FloatField) return false;
      if (Int64Field != other.Int64Field) return false;
      if (Uint64Field != other.Uint64Field) return false;
      if (Int32Field != other.Int32Field) return false;
      if (Uint32Field != other.Uint32Field) return false;
      if (BoolField != other.BoolField) return false;
      if (StringField != other.StringField) return false;
      if (BytesField != other.BytesField) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      if (anyField_ != null) hash ^= AnyField.GetHashCode();
      if (apiField_ != null) hash ^= ApiField.GetHashCode();
      if (durationField_ != null) hash ^= DurationField.GetHashCode();
      if (emptyField_ != null) hash ^= EmptyField.GetHashCode();
      if (fieldMaskField_ != null) hash ^= FieldMaskField.GetHashCode();
      if (sourceContextField_ != null) hash ^= SourceContextField.GetHashCode();
      if (structField_ != null) hash ^= StructField.GetHashCode();
      if (timestampField_ != null) hash ^= TimestampField.GetHashCode();
      if (typeField_ != null) hash ^= TypeField.GetHashCode();
      if (doubleField_ != null) hash ^= DoubleField.GetHashCode();
      if (floatField_ != null) hash ^= FloatField.GetHashCode();
      if (int64Field_ != null) hash ^= Int64Field.GetHashCode();
      if (uint64Field_ != null) hash ^= Uint64Field.GetHashCode();
      if (int32Field_ != null) hash ^= Int32Field.GetHashCode();
      if (uint32Field_ != null) hash ^= Uint32Field.GetHashCode();
      if (boolField_ != null) hash ^= BoolField.GetHashCode();
      if (stringField_ != null) hash ^= StringField.GetHashCode();
      if (bytesField_ != null) hash ^= BytesField.GetHashCode();
      return hash;
    }

    public override string ToString() {
      return pb::JsonFormatter.Default.Format(this);
    }

    public void WriteTo(pb::CodedOutputStream output) {
      if (anyField_ != null) {
        output.WriteRawTag(10);
        output.WriteMessage(AnyField);
      }
      if (apiField_ != null) {
        output.WriteRawTag(18);
        output.WriteMessage(ApiField);
      }
      if (durationField_ != null) {
        output.WriteRawTag(26);
        output.WriteMessage(DurationField);
      }
      if (emptyField_ != null) {
        output.WriteRawTag(34);
        output.WriteMessage(EmptyField);
      }
      if (fieldMaskField_ != null) {
        output.WriteRawTag(42);
        output.WriteMessage(FieldMaskField);
      }
      if (sourceContextField_ != null) {
        output.WriteRawTag(50);
        output.WriteMessage(SourceContextField);
      }
      if (structField_ != null) {
        output.WriteRawTag(58);
        output.WriteMessage(StructField);
      }
      if (timestampField_ != null) {
        output.WriteRawTag(66);
        output.WriteMessage(TimestampField);
      }
      if (typeField_ != null) {
        output.WriteRawTag(74);
        output.WriteMessage(TypeField);
      }
      if (doubleField_ != null) {
        _single_doubleField_codec.WriteTagAndValue(output, DoubleField);
      }
      if (floatField_ != null) {
        _single_floatField_codec.WriteTagAndValue(output, FloatField);
      }
      if (int64Field_ != null) {
        _single_int64Field_codec.WriteTagAndValue(output, Int64Field);
      }
      if (uint64Field_ != null) {
        _single_uint64Field_codec.WriteTagAndValue(output, Uint64Field);
      }
      if (int32Field_ != null) {
        _single_int32Field_codec.WriteTagAndValue(output, Int32Field);
      }
      if (uint32Field_ != null) {
        _single_uint32Field_codec.WriteTagAndValue(output, Uint32Field);
      }
      if (boolField_ != null) {
        _single_boolField_codec.WriteTagAndValue(output, BoolField);
      }
      if (stringField_ != null) {
        _single_stringField_codec.WriteTagAndValue(output, StringField);
      }
      if (bytesField_ != null) {
        _single_bytesField_codec.WriteTagAndValue(output, BytesField);
      }
    }

    public int CalculateSize() {
      int size = 0;
      if (anyField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AnyField);
      }
      if (apiField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ApiField);
      }
      if (durationField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(DurationField);
      }
      if (emptyField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EmptyField);
      }
      if (fieldMaskField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FieldMaskField);
      }
      if (sourceContextField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(SourceContextField);
      }
      if (structField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(StructField);
      }
      if (timestampField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TimestampField);
      }
      if (typeField_ != null) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TypeField);
      }
      if (doubleField_ != null) {
        size += _single_doubleField_codec.CalculateSizeWithTag(DoubleField);
      }
      if (floatField_ != null) {
        size += _single_floatField_codec.CalculateSizeWithTag(FloatField);
      }
      if (int64Field_ != null) {
        size += _single_int64Field_codec.CalculateSizeWithTag(Int64Field);
      }
      if (uint64Field_ != null) {
        size += _single_uint64Field_codec.CalculateSizeWithTag(Uint64Field);
      }
      if (int32Field_ != null) {
        size += _single_int32Field_codec.CalculateSizeWithTag(Int32Field);
      }
      if (uint32Field_ != null) {
        size += _single_uint32Field_codec.CalculateSizeWithTag(Uint32Field);
      }
      if (boolField_ != null) {
        size += _single_boolField_codec.CalculateSizeWithTag(BoolField);
      }
      if (stringField_ != null) {
        size += _single_stringField_codec.CalculateSizeWithTag(StringField);
      }
      if (bytesField_ != null) {
        size += _single_bytesField_codec.CalculateSizeWithTag(BytesField);
      }
      return size;
    }

    public void MergeFrom(TestWellKnownTypes other) {
      if (other == null) {
        return;
      }
      if (other.anyField_ != null) {
        if (anyField_ == null) {
          anyField_ = new global::Google.Protobuf.WellKnownTypes.Any();
        }
        AnyField.MergeFrom(other.AnyField);
      }
      if (other.apiField_ != null) {
        if (apiField_ == null) {
          apiField_ = new global::Google.Protobuf.WellKnownTypes.Api();
        }
        ApiField.MergeFrom(other.ApiField);
      }
      if (other.durationField_ != null) {
        if (durationField_ == null) {
          durationField_ = new global::Google.Protobuf.WellKnownTypes.Duration();
        }
        DurationField.MergeFrom(other.DurationField);
      }
      if (other.emptyField_ != null) {
        if (emptyField_ == null) {
          emptyField_ = new global::Google.Protobuf.WellKnownTypes.Empty();
        }
        EmptyField.MergeFrom(other.EmptyField);
      }
      if (other.fieldMaskField_ != null) {
        if (fieldMaskField_ == null) {
          fieldMaskField_ = new global::Google.Protobuf.WellKnownTypes.FieldMask();
        }
        FieldMaskField.MergeFrom(other.FieldMaskField);
      }
      if (other.sourceContextField_ != null) {
        if (sourceContextField_ == null) {
          sourceContextField_ = new global::Google.Protobuf.WellKnownTypes.SourceContext();
        }
        SourceContextField.MergeFrom(other.SourceContextField);
      }
      if (other.structField_ != null) {
        if (structField_ == null) {
          structField_ = new global::Google.Protobuf.WellKnownTypes.Struct();
        }
        StructField.MergeFrom(other.StructField);
      }
      if (other.timestampField_ != null) {
        if (timestampField_ == null) {
          timestampField_ = new global::Google.Protobuf.WellKnownTypes.Timestamp();
        }
        TimestampField.MergeFrom(other.TimestampField);
      }
      if (other.typeField_ != null) {
        if (typeField_ == null) {
          typeField_ = new global::Google.Protobuf.WellKnownTypes.Type();
        }
        TypeField.MergeFrom(other.TypeField);
      }
      if (other.doubleField_ != null) {
        if (doubleField_ == null || other.DoubleField != 0D) {
          DoubleField = other.DoubleField;
        }
      }
      if (other.floatField_ != null) {
        if (floatField_ == null || other.FloatField != 0F) {
          FloatField = other.FloatField;
        }
      }
      if (other.int64Field_ != null) {
        if (int64Field_ == null || other.Int64Field != 0L) {
          Int64Field = other.Int64Field;
        }
      }
      if (other.uint64Field_ != null) {
        if (uint64Field_ == null || other.Uint64Field != 0UL) {
          Uint64Field = other.Uint64Field;
        }
      }
      if (other.int32Field_ != null) {
        if (int32Field_ == null || other.Int32Field != 0) {
          Int32Field = other.Int32Field;
        }
      }
      if (other.uint32Field_ != null) {
        if (uint32Field_ == null || other.Uint32Field != 0) {
          Uint32Field = other.Uint32Field;
        }
      }
      if (other.boolField_ != null) {
        if (boolField_ == null || other.BoolField != false) {
          BoolField = other.BoolField;
        }
      }
      if (other.stringField_ != null) {
        if (stringField_ == null || other.StringField != "") {
          StringField = other.StringField;
        }
      }
      if (other.bytesField_ != null) {
        if (bytesField_ == null || other.BytesField != pb::ByteString.Empty) {
          BytesField = other.BytesField;
        }
      }
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            input.SkipLastField();
            break;
          case 10: {
            if (anyField_ == null) {
              anyField_ = new global::Google.Protobuf.WellKnownTypes.Any();
            }
            input.ReadMessage(anyField_);
            break;
          }
          case 18: {
            if (apiField_ == null) {
              apiField_ = new global::Google.Protobuf.WellKnownTypes.Api();
            }
            input.ReadMessage(apiField_);
            break;
          }
          case 26: {
            if (durationField_ == null) {
              durationField_ = new global::Google.Protobuf.WellKnownTypes.Duration();
            }
            input.ReadMessage(durationField_);
            break;
          }
          case 34: {
            if (emptyField_ == null) {
              emptyField_ = new global::Google.Protobuf.WellKnownTypes.Empty();
            }
            input.ReadMessage(emptyField_);
            break;
          }
          case 42: {
            if (fieldMaskField_ == null) {
              fieldMaskField_ = new global::Google.Protobuf.WellKnownTypes.FieldMask();
            }
            input.ReadMessage(fieldMaskField_);
            break;
          }
          case 50: {
            if (sourceContextField_ == null) {
              sourceContextField_ = new global::Google.Protobuf.WellKnownTypes.SourceContext();
            }
            input.ReadMessage(sourceContextField_);
            break;
          }
          case 58: {
            if (structField_ == null) {
              structField_ = new global::Google.Protobuf.WellKnownTypes.Struct();
            }
            input.ReadMessage(structField_);
            break;
          }
          case 66: {
            if (timestampField_ == null) {
              timestampField_ = new global::Google.Protobuf.WellKnownTypes.Timestamp();
            }
            input.ReadMessage(timestampField_);
            break;
          }
          case 74: {
            if (typeField_ == null) {
              typeField_ = new global::Google.Protobuf.WellKnownTypes.Type();
            }
            input.ReadMessage(typeField_);
            break;
          }
          case 82: {
            double? value = _single_doubleField_codec.Read(input);
            if (doubleField_ == null || value != 0D) {
              DoubleField = value;
            }
            break;
          }
          case 90: {
            float? value = _single_floatField_codec.Read(input);
            if (floatField_ == null || value != 0F) {
              FloatField = value;
            }
            break;
          }
          case 98: {
            long? value = _single_int64Field_codec.Read(input);
            if (int64Field_ == null || value != 0L) {
              Int64Field = value;
            }
            break;
          }
          case 106: {
            ulong? value = _single_uint64Field_codec.Read(input);
            if (uint64Field_ == null || value != 0UL) {
              Uint64Field = value;
            }
            break;
          }
          case 114: {
            int? value = _single_int32Field_codec.Read(input);
            if (int32Field_ == null || value != 0) {
              Int32Field = value;
            }
            break;
          }
          case 122: {
            uint? value = _single_uint32Field_codec.Read(input);
            if (uint32Field_ == null || value != 0) {
              Uint32Field = value;
            }
            break;
          }
          case 130: {
            bool? value = _single_boolField_codec.Read(input);
            if (boolField_ == null || value != false) {
              BoolField = value;
            }
            break;
          }
          case 138: {
            string value = _single_stringField_codec.Read(input);
            if (stringField_ == null || value != "") {
              StringField = value;
            }
            break;
          }
          case 146: {
            pb::ByteString value = _single_bytesField_codec.Read(input);
            if (bytesField_ == null || value != pb::ByteString.Empty) {
              BytesField = value;
            }
            break;
          }
        }
      }
    }

  }

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class RepeatedWellKnownTypes : pb::IMessage<RepeatedWellKnownTypes> {
    private static readonly pb::MessageParser<RepeatedWellKnownTypes> _parser = new pb::MessageParser<RepeatedWellKnownTypes>(() => new RepeatedWellKnownTypes());
    public static pb::MessageParser<RepeatedWellKnownTypes> Parser { get { return _parser; } }

    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypes.Descriptor.MessageTypes[1]; }
    }

    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    public RepeatedWellKnownTypes() {
      OnConstruction();
    }

    partial void OnConstruction();

    public RepeatedWellKnownTypes(RepeatedWellKnownTypes other) : this() {
      anyField_ = other.anyField_.Clone();
      apiField_ = other.apiField_.Clone();
      durationField_ = other.durationField_.Clone();
      emptyField_ = other.emptyField_.Clone();
      fieldMaskField_ = other.fieldMaskField_.Clone();
      sourceContextField_ = other.sourceContextField_.Clone();
      structField_ = other.structField_.Clone();
      timestampField_ = other.timestampField_.Clone();
      typeField_ = other.typeField_.Clone();
      doubleField_ = other.doubleField_.Clone();
      floatField_ = other.floatField_.Clone();
      int64Field_ = other.int64Field_.Clone();
      uint64Field_ = other.uint64Field_.Clone();
      int32Field_ = other.int32Field_.Clone();
      uint32Field_ = other.uint32Field_.Clone();
      boolField_ = other.boolField_.Clone();
      stringField_ = other.stringField_.Clone();
      bytesField_ = other.bytesField_.Clone();
    }

    public RepeatedWellKnownTypes Clone() {
      return new RepeatedWellKnownTypes(this);
    }

    public const int AnyFieldFieldNumber = 1;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Any> _repeated_anyField_codec
        = pb::FieldCodec.ForMessage(10, global::Google.Protobuf.WellKnownTypes.Any.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> anyField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> AnyField {
      get { return anyField_; }
    }

    public const int ApiFieldFieldNumber = 2;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Api> _repeated_apiField_codec
        = pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Api.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api> apiField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api> ApiField {
      get { return apiField_; }
    }

    public const int DurationFieldFieldNumber = 3;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Duration> _repeated_durationField_codec
        = pb::FieldCodec.ForMessage(26, global::Google.Protobuf.WellKnownTypes.Duration.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> durationField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> DurationField {
      get { return durationField_; }
    }

    public const int EmptyFieldFieldNumber = 4;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Empty> _repeated_emptyField_codec
        = pb::FieldCodec.ForMessage(34, global::Google.Protobuf.WellKnownTypes.Empty.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty> emptyField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty> EmptyField {
      get { return emptyField_; }
    }

    public const int FieldMaskFieldFieldNumber = 5;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.FieldMask> _repeated_fieldMaskField_codec
        = pb::FieldCodec.ForMessage(42, global::Google.Protobuf.WellKnownTypes.FieldMask.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> fieldMaskField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> FieldMaskField {
      get { return fieldMaskField_; }
    }

    public const int SourceContextFieldFieldNumber = 6;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.SourceContext> _repeated_sourceContextField_codec
        = pb::FieldCodec.ForMessage(50, global::Google.Protobuf.WellKnownTypes.SourceContext.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext> sourceContextField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext> SourceContextField {
      get { return sourceContextField_; }
    }

    public const int StructFieldFieldNumber = 7;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Struct> _repeated_structField_codec
        = pb::FieldCodec.ForMessage(58, global::Google.Protobuf.WellKnownTypes.Struct.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> structField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> StructField {
      get { return structField_; }
    }

    public const int TimestampFieldFieldNumber = 8;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Timestamp> _repeated_timestampField_codec
        = pb::FieldCodec.ForMessage(66, global::Google.Protobuf.WellKnownTypes.Timestamp.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> timestampField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> TimestampField {
      get { return timestampField_; }
    }

    public const int TypeFieldFieldNumber = 9;
    private static readonly pb::FieldCodec<global::Google.Protobuf.WellKnownTypes.Type> _repeated_typeField_codec
        = pb::FieldCodec.ForMessage(74, global::Google.Protobuf.WellKnownTypes.Type.Parser);
    private readonly pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type> typeField_ = new pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type>();
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type> TypeField {
      get { return typeField_; }
    }

    public const int DoubleFieldFieldNumber = 10;
    private static readonly pb::FieldCodec<double?> _repeated_doubleField_codec
        = pb::FieldCodec.ForStructWrapper<double>(82);
    private readonly pbc::RepeatedField<double?> doubleField_ = new pbc::RepeatedField<double?>();
    public pbc::RepeatedField<double?> DoubleField {
      get { return doubleField_; }
    }

    public const int FloatFieldFieldNumber = 11;
    private static readonly pb::FieldCodec<float?> _repeated_floatField_codec
        = pb::FieldCodec.ForStructWrapper<float>(90);
    private readonly pbc::RepeatedField<float?> floatField_ = new pbc::RepeatedField<float?>();
    public pbc::RepeatedField<float?> FloatField {
      get { return floatField_; }
    }

    public const int Int64FieldFieldNumber = 12;
    private static readonly pb::FieldCodec<long?> _repeated_int64Field_codec
        = pb::FieldCodec.ForStructWrapper<long>(98);
    private readonly pbc::RepeatedField<long?> int64Field_ = new pbc::RepeatedField<long?>();
    public pbc::RepeatedField<long?> Int64Field {
      get { return int64Field_; }
    }

    public const int Uint64FieldFieldNumber = 13;
    private static readonly pb::FieldCodec<ulong?> _repeated_uint64Field_codec
        = pb::FieldCodec.ForStructWrapper<ulong>(106);
    private readonly pbc::RepeatedField<ulong?> uint64Field_ = new pbc::RepeatedField<ulong?>();
    public pbc::RepeatedField<ulong?> Uint64Field {
      get { return uint64Field_; }
    }

    public const int Int32FieldFieldNumber = 14;
    private static readonly pb::FieldCodec<int?> _repeated_int32Field_codec
        = pb::FieldCodec.ForStructWrapper<int>(114);
    private readonly pbc::RepeatedField<int?> int32Field_ = new pbc::RepeatedField<int?>();
    public pbc::RepeatedField<int?> Int32Field {
      get { return int32Field_; }
    }

    public const int Uint32FieldFieldNumber = 15;
    private static readonly pb::FieldCodec<uint?> _repeated_uint32Field_codec
        = pb::FieldCodec.ForStructWrapper<uint>(122);
    private readonly pbc::RepeatedField<uint?> uint32Field_ = new pbc::RepeatedField<uint?>();
    public pbc::RepeatedField<uint?> Uint32Field {
      get { return uint32Field_; }
    }

    public const int BoolFieldFieldNumber = 16;
    private static readonly pb::FieldCodec<bool?> _repeated_boolField_codec
        = pb::FieldCodec.ForStructWrapper<bool>(130);
    private readonly pbc::RepeatedField<bool?> boolField_ = new pbc::RepeatedField<bool?>();
    public pbc::RepeatedField<bool?> BoolField {
      get { return boolField_; }
    }

    public const int StringFieldFieldNumber = 17;
    private static readonly pb::FieldCodec<string> _repeated_stringField_codec
        = pb::FieldCodec.ForClassWrapper<string>(138);
    private readonly pbc::RepeatedField<string> stringField_ = new pbc::RepeatedField<string>();
    public pbc::RepeatedField<string> StringField {
      get { return stringField_; }
    }

    public const int BytesFieldFieldNumber = 18;
    private static readonly pb::FieldCodec<pb::ByteString> _repeated_bytesField_codec
        = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
    private readonly pbc::RepeatedField<pb::ByteString> bytesField_ = new pbc::RepeatedField<pb::ByteString>();
    public pbc::RepeatedField<pb::ByteString> BytesField {
      get { return bytesField_; }
    }

    public override bool Equals(object other) {
      return Equals(other as RepeatedWellKnownTypes);
    }

    public bool Equals(RepeatedWellKnownTypes other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if(!anyField_.Equals(other.anyField_)) return false;
      if(!apiField_.Equals(other.apiField_)) return false;
      if(!durationField_.Equals(other.durationField_)) return false;
      if(!emptyField_.Equals(other.emptyField_)) return false;
      if(!fieldMaskField_.Equals(other.fieldMaskField_)) return false;
      if(!sourceContextField_.Equals(other.sourceContextField_)) return false;
      if(!structField_.Equals(other.structField_)) return false;
      if(!timestampField_.Equals(other.timestampField_)) return false;
      if(!typeField_.Equals(other.typeField_)) return false;
      if(!doubleField_.Equals(other.doubleField_)) return false;
      if(!floatField_.Equals(other.floatField_)) return false;
      if(!int64Field_.Equals(other.int64Field_)) return false;
      if(!uint64Field_.Equals(other.uint64Field_)) return false;
      if(!int32Field_.Equals(other.int32Field_)) return false;
      if(!uint32Field_.Equals(other.uint32Field_)) return false;
      if(!boolField_.Equals(other.boolField_)) return false;
      if(!stringField_.Equals(other.stringField_)) return false;
      if(!bytesField_.Equals(other.bytesField_)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      hash ^= anyField_.GetHashCode();
      hash ^= apiField_.GetHashCode();
      hash ^= durationField_.GetHashCode();
      hash ^= emptyField_.GetHashCode();
      hash ^= fieldMaskField_.GetHashCode();
      hash ^= sourceContextField_.GetHashCode();
      hash ^= structField_.GetHashCode();
      hash ^= timestampField_.GetHashCode();
      hash ^= typeField_.GetHashCode();
      hash ^= doubleField_.GetHashCode();
      hash ^= floatField_.GetHashCode();
      hash ^= int64Field_.GetHashCode();
      hash ^= uint64Field_.GetHashCode();
      hash ^= int32Field_.GetHashCode();
      hash ^= uint32Field_.GetHashCode();
      hash ^= boolField_.GetHashCode();
      hash ^= stringField_.GetHashCode();
      hash ^= bytesField_.GetHashCode();
      return hash;
    }

    public override string ToString() {
      return pb::JsonFormatter.Default.Format(this);
    }

    public void WriteTo(pb::CodedOutputStream output) {
      anyField_.WriteTo(output, _repeated_anyField_codec);
      apiField_.WriteTo(output, _repeated_apiField_codec);
      durationField_.WriteTo(output, _repeated_durationField_codec);
      emptyField_.WriteTo(output, _repeated_emptyField_codec);
      fieldMaskField_.WriteTo(output, _repeated_fieldMaskField_codec);
      sourceContextField_.WriteTo(output, _repeated_sourceContextField_codec);
      structField_.WriteTo(output, _repeated_structField_codec);
      timestampField_.WriteTo(output, _repeated_timestampField_codec);
      typeField_.WriteTo(output, _repeated_typeField_codec);
      doubleField_.WriteTo(output, _repeated_doubleField_codec);
      floatField_.WriteTo(output, _repeated_floatField_codec);
      int64Field_.WriteTo(output, _repeated_int64Field_codec);
      uint64Field_.WriteTo(output, _repeated_uint64Field_codec);
      int32Field_.WriteTo(output, _repeated_int32Field_codec);
      uint32Field_.WriteTo(output, _repeated_uint32Field_codec);
      boolField_.WriteTo(output, _repeated_boolField_codec);
      stringField_.WriteTo(output, _repeated_stringField_codec);
      bytesField_.WriteTo(output, _repeated_bytesField_codec);
    }

    public int CalculateSize() {
      int size = 0;
      size += anyField_.CalculateSize(_repeated_anyField_codec);
      size += apiField_.CalculateSize(_repeated_apiField_codec);
      size += durationField_.CalculateSize(_repeated_durationField_codec);
      size += emptyField_.CalculateSize(_repeated_emptyField_codec);
      size += fieldMaskField_.CalculateSize(_repeated_fieldMaskField_codec);
      size += sourceContextField_.CalculateSize(_repeated_sourceContextField_codec);
      size += structField_.CalculateSize(_repeated_structField_codec);
      size += timestampField_.CalculateSize(_repeated_timestampField_codec);
      size += typeField_.CalculateSize(_repeated_typeField_codec);
      size += doubleField_.CalculateSize(_repeated_doubleField_codec);
      size += floatField_.CalculateSize(_repeated_floatField_codec);
      size += int64Field_.CalculateSize(_repeated_int64Field_codec);
      size += uint64Field_.CalculateSize(_repeated_uint64Field_codec);
      size += int32Field_.CalculateSize(_repeated_int32Field_codec);
      size += uint32Field_.CalculateSize(_repeated_uint32Field_codec);
      size += boolField_.CalculateSize(_repeated_boolField_codec);
      size += stringField_.CalculateSize(_repeated_stringField_codec);
      size += bytesField_.CalculateSize(_repeated_bytesField_codec);
      return size;
    }

    public void MergeFrom(RepeatedWellKnownTypes other) {
      if (other == null) {
        return;
      }
      anyField_.Add(other.anyField_);
      apiField_.Add(other.apiField_);
      durationField_.Add(other.durationField_);
      emptyField_.Add(other.emptyField_);
      fieldMaskField_.Add(other.fieldMaskField_);
      sourceContextField_.Add(other.sourceContextField_);
      structField_.Add(other.structField_);
      timestampField_.Add(other.timestampField_);
      typeField_.Add(other.typeField_);
      doubleField_.Add(other.doubleField_);
      floatField_.Add(other.floatField_);
      int64Field_.Add(other.int64Field_);
      uint64Field_.Add(other.uint64Field_);
      int32Field_.Add(other.int32Field_);
      uint32Field_.Add(other.uint32Field_);
      boolField_.Add(other.boolField_);
      stringField_.Add(other.stringField_);
      bytesField_.Add(other.bytesField_);
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            input.SkipLastField();
            break;
          case 10: {
            anyField_.AddEntriesFrom(input, _repeated_anyField_codec);
            break;
          }
          case 18: {
            apiField_.AddEntriesFrom(input, _repeated_apiField_codec);
            break;
          }
          case 26: {
            durationField_.AddEntriesFrom(input, _repeated_durationField_codec);
            break;
          }
          case 34: {
            emptyField_.AddEntriesFrom(input, _repeated_emptyField_codec);
            break;
          }
          case 42: {
            fieldMaskField_.AddEntriesFrom(input, _repeated_fieldMaskField_codec);
            break;
          }
          case 50: {
            sourceContextField_.AddEntriesFrom(input, _repeated_sourceContextField_codec);
            break;
          }
          case 58: {
            structField_.AddEntriesFrom(input, _repeated_structField_codec);
            break;
          }
          case 66: {
            timestampField_.AddEntriesFrom(input, _repeated_timestampField_codec);
            break;
          }
          case 74: {
            typeField_.AddEntriesFrom(input, _repeated_typeField_codec);
            break;
          }
          case 82: {
            doubleField_.AddEntriesFrom(input, _repeated_doubleField_codec);
            break;
          }
          case 90: {
            floatField_.AddEntriesFrom(input, _repeated_floatField_codec);
            break;
          }
          case 98: {
            int64Field_.AddEntriesFrom(input, _repeated_int64Field_codec);
            break;
          }
          case 106: {
            uint64Field_.AddEntriesFrom(input, _repeated_uint64Field_codec);
            break;
          }
          case 114: {
            int32Field_.AddEntriesFrom(input, _repeated_int32Field_codec);
            break;
          }
          case 122: {
            uint32Field_.AddEntriesFrom(input, _repeated_uint32Field_codec);
            break;
          }
          case 130: {
            boolField_.AddEntriesFrom(input, _repeated_boolField_codec);
            break;
          }
          case 138: {
            stringField_.AddEntriesFrom(input, _repeated_stringField_codec);
            break;
          }
          case 146: {
            bytesField_.AddEntriesFrom(input, _repeated_bytesField_codec);
            break;
          }
        }
      }
    }

  }

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class OneofWellKnownTypes : pb::IMessage<OneofWellKnownTypes> {
    private static readonly pb::MessageParser<OneofWellKnownTypes> _parser = new pb::MessageParser<OneofWellKnownTypes>(() => new OneofWellKnownTypes());
    public static pb::MessageParser<OneofWellKnownTypes> Parser { get { return _parser; } }

    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypes.Descriptor.MessageTypes[2]; }
    }

    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    public OneofWellKnownTypes() {
      OnConstruction();
    }

    partial void OnConstruction();

    public OneofWellKnownTypes(OneofWellKnownTypes other) : this() {
      switch (other.OneofFieldCase) {
        case OneofFieldOneofCase.AnyField:
          AnyField = other.AnyField.Clone();
          break;
        case OneofFieldOneofCase.ApiField:
          ApiField = other.ApiField.Clone();
          break;
        case OneofFieldOneofCase.DurationField:
          DurationField = other.DurationField.Clone();
          break;
        case OneofFieldOneofCase.EmptyField:
          EmptyField = other.EmptyField.Clone();
          break;
        case OneofFieldOneofCase.FieldMaskField:
          FieldMaskField = other.FieldMaskField.Clone();
          break;
        case OneofFieldOneofCase.SourceContextField:
          SourceContextField = other.SourceContextField.Clone();
          break;
        case OneofFieldOneofCase.StructField:
          StructField = other.StructField.Clone();
          break;
        case OneofFieldOneofCase.TimestampField:
          TimestampField = other.TimestampField.Clone();
          break;
        case OneofFieldOneofCase.TypeField:
          TypeField = other.TypeField.Clone();
          break;
        case OneofFieldOneofCase.DoubleField:
          DoubleField = other.DoubleField;
          break;
        case OneofFieldOneofCase.FloatField:
          FloatField = other.FloatField;
          break;
        case OneofFieldOneofCase.Int64Field:
          Int64Field = other.Int64Field;
          break;
        case OneofFieldOneofCase.Uint64Field:
          Uint64Field = other.Uint64Field;
          break;
        case OneofFieldOneofCase.Int32Field:
          Int32Field = other.Int32Field;
          break;
        case OneofFieldOneofCase.Uint32Field:
          Uint32Field = other.Uint32Field;
          break;
        case OneofFieldOneofCase.BoolField:
          BoolField = other.BoolField;
          break;
        case OneofFieldOneofCase.StringField:
          StringField = other.StringField;
          break;
        case OneofFieldOneofCase.BytesField:
          BytesField = other.BytesField;
          break;
      }

    }

    public OneofWellKnownTypes Clone() {
      return new OneofWellKnownTypes(this);
    }

    public const int AnyFieldFieldNumber = 1;
    public global::Google.Protobuf.WellKnownTypes.Any AnyField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.AnyField ? (global::Google.Protobuf.WellKnownTypes.Any) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.AnyField;
      }
    }

    public const int ApiFieldFieldNumber = 2;
    public global::Google.Protobuf.WellKnownTypes.Api ApiField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.ApiField ? (global::Google.Protobuf.WellKnownTypes.Api) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.ApiField;
      }
    }

    public const int DurationFieldFieldNumber = 3;
    public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.DurationField ? (global::Google.Protobuf.WellKnownTypes.Duration) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.DurationField;
      }
    }

    public const int EmptyFieldFieldNumber = 4;
    public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.EmptyField ? (global::Google.Protobuf.WellKnownTypes.Empty) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.EmptyField;
      }
    }

    public const int FieldMaskFieldFieldNumber = 5;
    public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField ? (global::Google.Protobuf.WellKnownTypes.FieldMask) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.FieldMaskField;
      }
    }

    public const int SourceContextFieldFieldNumber = 6;
    public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.SourceContextField ? (global::Google.Protobuf.WellKnownTypes.SourceContext) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.SourceContextField;
      }
    }

    public const int StructFieldFieldNumber = 7;
    public global::Google.Protobuf.WellKnownTypes.Struct StructField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.StructField ? (global::Google.Protobuf.WellKnownTypes.Struct) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.StructField;
      }
    }

    public const int TimestampFieldFieldNumber = 8;
    public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.TimestampField ? (global::Google.Protobuf.WellKnownTypes.Timestamp) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.TimestampField;
      }
    }

    public const int TypeFieldFieldNumber = 9;
    public global::Google.Protobuf.WellKnownTypes.Type TypeField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.TypeField ? (global::Google.Protobuf.WellKnownTypes.Type) oneofField_ : null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.TypeField;
      }
    }

    public const int DoubleFieldFieldNumber = 10;
    private static readonly pb::FieldCodec<double?> _oneof_doubleField_codec = pb::FieldCodec.ForStructWrapper<double>(82);
    public double? DoubleField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.DoubleField ? (double?) oneofField_ : (double?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.DoubleField;
      }
    }

    public const int FloatFieldFieldNumber = 11;
    private static readonly pb::FieldCodec<float?> _oneof_floatField_codec = pb::FieldCodec.ForStructWrapper<float>(90);
    public float? FloatField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.FloatField ? (float?) oneofField_ : (float?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.FloatField;
      }
    }

    public const int Int64FieldFieldNumber = 12;
    private static readonly pb::FieldCodec<long?> _oneof_int64Field_codec = pb::FieldCodec.ForStructWrapper<long>(98);
    public long? Int64Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Int64Field ? (long?) oneofField_ : (long?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Int64Field;
      }
    }

    public const int Uint64FieldFieldNumber = 13;
    private static readonly pb::FieldCodec<ulong?> _oneof_uint64Field_codec = pb::FieldCodec.ForStructWrapper<ulong>(106);
    public ulong? Uint64Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Uint64Field ? (ulong?) oneofField_ : (ulong?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Uint64Field;
      }
    }

    public const int Int32FieldFieldNumber = 14;
    private static readonly pb::FieldCodec<int?> _oneof_int32Field_codec = pb::FieldCodec.ForStructWrapper<int>(114);
    public int? Int32Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Int32Field ? (int?) oneofField_ : (int?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Int32Field;
      }
    }

    public const int Uint32FieldFieldNumber = 15;
    private static readonly pb::FieldCodec<uint?> _oneof_uint32Field_codec = pb::FieldCodec.ForStructWrapper<uint>(122);
    public uint? Uint32Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Uint32Field ? (uint?) oneofField_ : (uint?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Uint32Field;
      }
    }

    public const int BoolFieldFieldNumber = 16;
    private static readonly pb::FieldCodec<bool?> _oneof_boolField_codec = pb::FieldCodec.ForStructWrapper<bool>(130);
    public bool? BoolField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.BoolField ? (bool?) oneofField_ : (bool?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.BoolField;
      }
    }

    public const int StringFieldFieldNumber = 17;
    private static readonly pb::FieldCodec<string> _oneof_stringField_codec = pb::FieldCodec.ForClassWrapper<string>(138);
    public string StringField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.StringField ? (string) oneofField_ : (string) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.StringField;
      }
    }

    public const int BytesFieldFieldNumber = 18;
    private static readonly pb::FieldCodec<pb::ByteString> _oneof_bytesField_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
    public pb::ByteString BytesField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.BytesField ? (pb::ByteString) oneofField_ : (pb::ByteString) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.BytesField;
      }
    }

    private object oneofField_;
    public enum OneofFieldOneofCase {
      None = 0,
      AnyField = 1,
      ApiField = 2,
      DurationField = 3,
      EmptyField = 4,
      FieldMaskField = 5,
      SourceContextField = 6,
      StructField = 7,
      TimestampField = 8,
      TypeField = 9,
      DoubleField = 10,
      FloatField = 11,
      Int64Field = 12,
      Uint64Field = 13,
      Int32Field = 14,
      Uint32Field = 15,
      BoolField = 16,
      StringField = 17,
      BytesField = 18,
    }
    private OneofFieldOneofCase oneofFieldCase_ = OneofFieldOneofCase.None;
    public OneofFieldOneofCase OneofFieldCase {
      get { return oneofFieldCase_; }
    }

    public void ClearOneofField() {
      oneofFieldCase_ = OneofFieldOneofCase.None;
      oneofField_ = null;
    }

    public override bool Equals(object other) {
      return Equals(other as OneofWellKnownTypes);
    }

    public bool Equals(OneofWellKnownTypes other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!object.Equals(AnyField, other.AnyField)) return false;
      if (!object.Equals(ApiField, other.ApiField)) return false;
      if (!object.Equals(DurationField, other.DurationField)) return false;
      if (!object.Equals(EmptyField, other.EmptyField)) return false;
      if (!object.Equals(FieldMaskField, other.FieldMaskField)) return false;
      if (!object.Equals(SourceContextField, other.SourceContextField)) return false;
      if (!object.Equals(StructField, other.StructField)) return false;
      if (!object.Equals(TimestampField, other.TimestampField)) return false;
      if (!object.Equals(TypeField, other.TypeField)) return false;
      if (DoubleField != other.DoubleField) return false;
      if (FloatField != other.FloatField) return false;
      if (Int64Field != other.Int64Field) return false;
      if (Uint64Field != other.Uint64Field) return false;
      if (Int32Field != other.Int32Field) return false;
      if (Uint32Field != other.Uint32Field) return false;
      if (BoolField != other.BoolField) return false;
      if (StringField != other.StringField) return false;
      if (BytesField != other.BytesField) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) hash ^= AnyField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) hash ^= ApiField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) hash ^= DurationField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) hash ^= EmptyField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) hash ^= FieldMaskField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) hash ^= SourceContextField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.StructField) hash ^= StructField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) hash ^= TimestampField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) hash ^= TypeField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) hash ^= DoubleField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) hash ^= FloatField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) hash ^= Int64Field.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) hash ^= Uint64Field.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) hash ^= Int32Field.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint32Field) hash ^= Uint32Field.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.BoolField) hash ^= BoolField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.StringField) hash ^= StringField.GetHashCode();
      if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) hash ^= BytesField.GetHashCode();
      return hash;
    }

    public override string ToString() {
      return pb::JsonFormatter.Default.Format(this);
    }

    public void WriteTo(pb::CodedOutputStream output) {
      if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
        output.WriteRawTag(10);
        output.WriteMessage(AnyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) {
        output.WriteRawTag(18);
        output.WriteMessage(ApiField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) {
        output.WriteRawTag(26);
        output.WriteMessage(DurationField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) {
        output.WriteRawTag(34);
        output.WriteMessage(EmptyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) {
        output.WriteRawTag(42);
        output.WriteMessage(FieldMaskField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) {
        output.WriteRawTag(50);
        output.WriteMessage(SourceContextField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StructField) {
        output.WriteRawTag(58);
        output.WriteMessage(StructField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) {
        output.WriteRawTag(66);
        output.WriteMessage(TimestampField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) {
        output.WriteRawTag(74);
        output.WriteMessage(TypeField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) {
        _oneof_doubleField_codec.WriteTagAndValue(output, (double?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) {
        _oneof_floatField_codec.WriteTagAndValue(output, (float?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) {
        _oneof_int64Field_codec.WriteTagAndValue(output, (long?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) {
        _oneof_uint64Field_codec.WriteTagAndValue(output, (ulong?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) {
        _oneof_int32Field_codec.WriteTagAndValue(output, (int?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint32Field) {
        _oneof_uint32Field_codec.WriteTagAndValue(output, (uint?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BoolField) {
        _oneof_boolField_codec.WriteTagAndValue(output, (bool?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StringField) {
        _oneof_stringField_codec.WriteTagAndValue(output, (string) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) {
        _oneof_bytesField_codec.WriteTagAndValue(output, (pb::ByteString) oneofField_);
      }
    }

    public int CalculateSize() {
      int size = 0;
      if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AnyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(ApiField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(DurationField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(EmptyField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(FieldMaskField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(SourceContextField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StructField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(StructField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TimestampField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) {
        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TypeField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.DoubleField) {
        size += _oneof_doubleField_codec.CalculateSizeWithTag(DoubleField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) {
        size += _oneof_floatField_codec.CalculateSizeWithTag(FloatField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) {
        size += _oneof_int64Field_codec.CalculateSizeWithTag(Int64Field);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) {
        size += _oneof_uint64Field_codec.CalculateSizeWithTag(Uint64Field);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) {
        size += _oneof_int32Field_codec.CalculateSizeWithTag(Int32Field);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint32Field) {
        size += _oneof_uint32Field_codec.CalculateSizeWithTag(Uint32Field);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BoolField) {
        size += _oneof_boolField_codec.CalculateSizeWithTag(BoolField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StringField) {
        size += _oneof_stringField_codec.CalculateSizeWithTag(StringField);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) {
        size += _oneof_bytesField_codec.CalculateSizeWithTag(BytesField);
      }
      return size;
    }

    public void MergeFrom(OneofWellKnownTypes other) {
      if (other == null) {
        return;
      }
      switch (other.OneofFieldCase) {
        case OneofFieldOneofCase.AnyField:
          AnyField = other.AnyField;
          break;
        case OneofFieldOneofCase.ApiField:
          ApiField = other.ApiField;
          break;
        case OneofFieldOneofCase.DurationField:
          DurationField = other.DurationField;
          break;
        case OneofFieldOneofCase.EmptyField:
          EmptyField = other.EmptyField;
          break;
        case OneofFieldOneofCase.FieldMaskField:
          FieldMaskField = other.FieldMaskField;
          break;
        case OneofFieldOneofCase.SourceContextField:
          SourceContextField = other.SourceContextField;
          break;
        case OneofFieldOneofCase.StructField:
          StructField = other.StructField;
          break;
        case OneofFieldOneofCase.TimestampField:
          TimestampField = other.TimestampField;
          break;
        case OneofFieldOneofCase.TypeField:
          TypeField = other.TypeField;
          break;
        case OneofFieldOneofCase.DoubleField:
          DoubleField = other.DoubleField;
          break;
        case OneofFieldOneofCase.FloatField:
          FloatField = other.FloatField;
          break;
        case OneofFieldOneofCase.Int64Field:
          Int64Field = other.Int64Field;
          break;
        case OneofFieldOneofCase.Uint64Field:
          Uint64Field = other.Uint64Field;
          break;
        case OneofFieldOneofCase.Int32Field:
          Int32Field = other.Int32Field;
          break;
        case OneofFieldOneofCase.Uint32Field:
          Uint32Field = other.Uint32Field;
          break;
        case OneofFieldOneofCase.BoolField:
          BoolField = other.BoolField;
          break;
        case OneofFieldOneofCase.StringField:
          StringField = other.StringField;
          break;
        case OneofFieldOneofCase.BytesField:
          BytesField = other.BytesField;
          break;
      }

    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            input.SkipLastField();
            break;
          case 10: {
            global::Google.Protobuf.WellKnownTypes.Any subBuilder = new global::Google.Protobuf.WellKnownTypes.Any();
            if (oneofFieldCase_ == OneofFieldOneofCase.AnyField) {
              subBuilder.MergeFrom(AnyField);
            }
            input.ReadMessage(subBuilder);
            AnyField = subBuilder;
            break;
          }
          case 18: {
            global::Google.Protobuf.WellKnownTypes.Api subBuilder = new global::Google.Protobuf.WellKnownTypes.Api();
            if (oneofFieldCase_ == OneofFieldOneofCase.ApiField) {
              subBuilder.MergeFrom(ApiField);
            }
            input.ReadMessage(subBuilder);
            ApiField = subBuilder;
            break;
          }
          case 26: {
            global::Google.Protobuf.WellKnownTypes.Duration subBuilder = new global::Google.Protobuf.WellKnownTypes.Duration();
            if (oneofFieldCase_ == OneofFieldOneofCase.DurationField) {
              subBuilder.MergeFrom(DurationField);
            }
            input.ReadMessage(subBuilder);
            DurationField = subBuilder;
            break;
          }
          case 34: {
            global::Google.Protobuf.WellKnownTypes.Empty subBuilder = new global::Google.Protobuf.WellKnownTypes.Empty();
            if (oneofFieldCase_ == OneofFieldOneofCase.EmptyField) {
              subBuilder.MergeFrom(EmptyField);
            }
            input.ReadMessage(subBuilder);
            EmptyField = subBuilder;
            break;
          }
          case 42: {
            global::Google.Protobuf.WellKnownTypes.FieldMask subBuilder = new global::Google.Protobuf.WellKnownTypes.FieldMask();
            if (oneofFieldCase_ == OneofFieldOneofCase.FieldMaskField) {
              subBuilder.MergeFrom(FieldMaskField);
            }
            input.ReadMessage(subBuilder);
            FieldMaskField = subBuilder;
            break;
          }
          case 50: {
            global::Google.Protobuf.WellKnownTypes.SourceContext subBuilder = new global::Google.Protobuf.WellKnownTypes.SourceContext();
            if (oneofFieldCase_ == OneofFieldOneofCase.SourceContextField) {
              subBuilder.MergeFrom(SourceContextField);
            }
            input.ReadMessage(subBuilder);
            SourceContextField = subBuilder;
            break;
          }
          case 58: {
            global::Google.Protobuf.WellKnownTypes.Struct subBuilder = new global::Google.Protobuf.WellKnownTypes.Struct();
            if (oneofFieldCase_ == OneofFieldOneofCase.StructField) {
              subBuilder.MergeFrom(StructField);
            }
            input.ReadMessage(subBuilder);
            StructField = subBuilder;
            break;
          }
          case 66: {
            global::Google.Protobuf.WellKnownTypes.Timestamp subBuilder = new global::Google.Protobuf.WellKnownTypes.Timestamp();
            if (oneofFieldCase_ == OneofFieldOneofCase.TimestampField) {
              subBuilder.MergeFrom(TimestampField);
            }
            input.ReadMessage(subBuilder);
            TimestampField = subBuilder;
            break;
          }
          case 74: {
            global::Google.Protobuf.WellKnownTypes.Type subBuilder = new global::Google.Protobuf.WellKnownTypes.Type();
            if (oneofFieldCase_ == OneofFieldOneofCase.TypeField) {
              subBuilder.MergeFrom(TypeField);
            }
            input.ReadMessage(subBuilder);
            TypeField = subBuilder;
            break;
          }
          case 82: {
            DoubleField = _oneof_doubleField_codec.Read(input);
            break;
          }
          case 90: {
            FloatField = _oneof_floatField_codec.Read(input);
            break;
          }
          case 98: {
            Int64Field = _oneof_int64Field_codec.Read(input);
            break;
          }
          case 106: {
            Uint64Field = _oneof_uint64Field_codec.Read(input);
            break;
          }
          case 114: {
            Int32Field = _oneof_int32Field_codec.Read(input);
            break;
          }
          case 122: {
            Uint32Field = _oneof_uint32Field_codec.Read(input);
            break;
          }
          case 130: {
            BoolField = _oneof_boolField_codec.Read(input);
            break;
          }
          case 138: {
            StringField = _oneof_stringField_codec.Read(input);
            break;
          }
          case 146: {
            BytesField = _oneof_bytesField_codec.Read(input);
            break;
          }
        }
      }
    }

  }

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  public sealed partial class MapWellKnownTypes : pb::IMessage<MapWellKnownTypes> {
    private static readonly pb::MessageParser<MapWellKnownTypes> _parser = new pb::MessageParser<MapWellKnownTypes>(() => new MapWellKnownTypes());
    public static pb::MessageParser<MapWellKnownTypes> Parser { get { return _parser; } }

    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypes.Descriptor.MessageTypes[3]; }
    }

    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    public MapWellKnownTypes() {
      OnConstruction();
    }

    partial void OnConstruction();

    public MapWellKnownTypes(MapWellKnownTypes other) : this() {
      anyField_ = other.anyField_.Clone();
      apiField_ = other.apiField_.Clone();
      durationField_ = other.durationField_.Clone();
      emptyField_ = other.emptyField_.Clone();
      fieldMaskField_ = other.fieldMaskField_.Clone();
      sourceContextField_ = other.sourceContextField_.Clone();
      structField_ = other.structField_.Clone();
      timestampField_ = other.timestampField_.Clone();
      typeField_ = other.typeField_.Clone();
      doubleField_ = other.doubleField_.Clone();
      floatField_ = other.floatField_.Clone();
      int64Field_ = other.int64Field_.Clone();
      uint64Field_ = other.uint64Field_.Clone();
      int32Field_ = other.int32Field_.Clone();
      uint32Field_ = other.uint32Field_.Clone();
      boolField_ = other.boolField_.Clone();
      stringField_ = other.stringField_.Clone();
      bytesField_ = other.bytesField_.Clone();
    }

    public MapWellKnownTypes Clone() {
      return new MapWellKnownTypes(this);
    }

    public const int AnyFieldFieldNumber = 1;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>.Codec _map_anyField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Any.Parser), 10);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any> anyField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any> AnyField {
      get { return anyField_; }
    }

    public const int ApiFieldFieldNumber = 2;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>.Codec _map_apiField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Api.Parser), 18);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api> apiField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api> ApiField {
      get { return apiField_; }
    }

    public const int DurationFieldFieldNumber = 3;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>.Codec _map_durationField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Duration.Parser), 26);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration> durationField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration> DurationField {
      get { return durationField_; }
    }

    public const int EmptyFieldFieldNumber = 4;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>.Codec _map_emptyField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Empty.Parser), 34);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty> emptyField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty> EmptyField {
      get { return emptyField_; }
    }

    public const int FieldMaskFieldFieldNumber = 5;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>.Codec _map_fieldMaskField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.FieldMask.Parser), 42);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask> fieldMaskField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask> FieldMaskField {
      get { return fieldMaskField_; }
    }

    public const int SourceContextFieldFieldNumber = 6;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>.Codec _map_sourceContextField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.SourceContext.Parser), 50);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext> sourceContextField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext> SourceContextField {
      get { return sourceContextField_; }
    }

    public const int StructFieldFieldNumber = 7;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>.Codec _map_structField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Struct.Parser), 58);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct> structField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct> StructField {
      get { return structField_; }
    }

    public const int TimestampFieldFieldNumber = 8;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>.Codec _map_timestampField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Timestamp.Parser), 66);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp> timestampField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp> TimestampField {
      get { return timestampField_; }
    }

    public const int TypeFieldFieldNumber = 9;
    private static readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>.Codec _map_typeField_codec
        = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.WellKnownTypes.Type.Parser), 74);
    private readonly pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type> typeField_ = new pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type>();
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type> TypeField {
      get { return typeField_; }
    }

    public const int DoubleFieldFieldNumber = 10;
    private static readonly pbc::MapField<int, double?>.Codec _map_doubleField_codec
        = new pbc::MapField<int, double?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<double>(18), 82);
    private readonly pbc::MapField<int, double?> doubleField_ = new pbc::MapField<int, double?>(true);
    public pbc::MapField<int, double?> DoubleField {
      get { return doubleField_; }
    }

    public const int FloatFieldFieldNumber = 11;
    private static readonly pbc::MapField<int, float?>.Codec _map_floatField_codec
        = new pbc::MapField<int, float?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<float>(18), 90);
    private readonly pbc::MapField<int, float?> floatField_ = new pbc::MapField<int, float?>(true);
    public pbc::MapField<int, float?> FloatField {
      get { return floatField_; }
    }

    public const int Int64FieldFieldNumber = 12;
    private static readonly pbc::MapField<int, long?>.Codec _map_int64Field_codec
        = new pbc::MapField<int, long?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<long>(18), 98);
    private readonly pbc::MapField<int, long?> int64Field_ = new pbc::MapField<int, long?>(true);
    public pbc::MapField<int, long?> Int64Field {
      get { return int64Field_; }
    }

    public const int Uint64FieldFieldNumber = 13;
    private static readonly pbc::MapField<int, ulong?>.Codec _map_uint64Field_codec
        = new pbc::MapField<int, ulong?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<ulong>(18), 106);
    private readonly pbc::MapField<int, ulong?> uint64Field_ = new pbc::MapField<int, ulong?>(true);
    public pbc::MapField<int, ulong?> Uint64Field {
      get { return uint64Field_; }
    }

    public const int Int32FieldFieldNumber = 14;
    private static readonly pbc::MapField<int, int?>.Codec _map_int32Field_codec
        = new pbc::MapField<int, int?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<int>(18), 114);
    private readonly pbc::MapField<int, int?> int32Field_ = new pbc::MapField<int, int?>(true);
    public pbc::MapField<int, int?> Int32Field {
      get { return int32Field_; }
    }

    public const int Uint32FieldFieldNumber = 15;
    private static readonly pbc::MapField<int, uint?>.Codec _map_uint32Field_codec
        = new pbc::MapField<int, uint?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<uint>(18), 122);
    private readonly pbc::MapField<int, uint?> uint32Field_ = new pbc::MapField<int, uint?>(true);
    public pbc::MapField<int, uint?> Uint32Field {
      get { return uint32Field_; }
    }

    public const int BoolFieldFieldNumber = 16;
    private static readonly pbc::MapField<int, bool?>.Codec _map_boolField_codec
        = new pbc::MapField<int, bool?>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForStructWrapper<bool>(18), 130);
    private readonly pbc::MapField<int, bool?> boolField_ = new pbc::MapField<int, bool?>(true);
    public pbc::MapField<int, bool?> BoolField {
      get { return boolField_; }
    }

    public const int StringFieldFieldNumber = 17;
    private static readonly pbc::MapField<int, string>.Codec _map_stringField_codec
        = new pbc::MapField<int, string>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForClassWrapper<string>(18), 138);
    private readonly pbc::MapField<int, string> stringField_ = new pbc::MapField<int, string>(true);
    public pbc::MapField<int, string> StringField {
      get { return stringField_; }
    }

    public const int BytesFieldFieldNumber = 18;
    private static readonly pbc::MapField<int, pb::ByteString>.Codec _map_bytesField_codec
        = new pbc::MapField<int, pb::ByteString>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForClassWrapper<pb::ByteString>(18), 146);
    private readonly pbc::MapField<int, pb::ByteString> bytesField_ = new pbc::MapField<int, pb::ByteString>(true);
    public pbc::MapField<int, pb::ByteString> BytesField {
      get { return bytesField_; }
    }

    public override bool Equals(object other) {
      return Equals(other as MapWellKnownTypes);
    }

    public bool Equals(MapWellKnownTypes other) {
      if (ReferenceEquals(other, null)) {
        return false;
      }
      if (ReferenceEquals(other, this)) {
        return true;
      }
      if (!AnyField.Equals(other.AnyField)) return false;
      if (!ApiField.Equals(other.ApiField)) return false;
      if (!DurationField.Equals(other.DurationField)) return false;
      if (!EmptyField.Equals(other.EmptyField)) return false;
      if (!FieldMaskField.Equals(other.FieldMaskField)) return false;
      if (!SourceContextField.Equals(other.SourceContextField)) return false;
      if (!StructField.Equals(other.StructField)) return false;
      if (!TimestampField.Equals(other.TimestampField)) return false;
      if (!TypeField.Equals(other.TypeField)) return false;
      if (!DoubleField.Equals(other.DoubleField)) return false;
      if (!FloatField.Equals(other.FloatField)) return false;
      if (!Int64Field.Equals(other.Int64Field)) return false;
      if (!Uint64Field.Equals(other.Uint64Field)) return false;
      if (!Int32Field.Equals(other.Int32Field)) return false;
      if (!Uint32Field.Equals(other.Uint32Field)) return false;
      if (!BoolField.Equals(other.BoolField)) return false;
      if (!StringField.Equals(other.StringField)) return false;
      if (!BytesField.Equals(other.BytesField)) return false;
      return true;
    }

    public override int GetHashCode() {
      int hash = 1;
      hash ^= AnyField.GetHashCode();
      hash ^= ApiField.GetHashCode();
      hash ^= DurationField.GetHashCode();
      hash ^= EmptyField.GetHashCode();
      hash ^= FieldMaskField.GetHashCode();
      hash ^= SourceContextField.GetHashCode();
      hash ^= StructField.GetHashCode();
      hash ^= TimestampField.GetHashCode();
      hash ^= TypeField.GetHashCode();
      hash ^= DoubleField.GetHashCode();
      hash ^= FloatField.GetHashCode();
      hash ^= Int64Field.GetHashCode();
      hash ^= Uint64Field.GetHashCode();
      hash ^= Int32Field.GetHashCode();
      hash ^= Uint32Field.GetHashCode();
      hash ^= BoolField.GetHashCode();
      hash ^= StringField.GetHashCode();
      hash ^= BytesField.GetHashCode();
      return hash;
    }

    public override string ToString() {
      return pb::JsonFormatter.Default.Format(this);
    }

    public void WriteTo(pb::CodedOutputStream output) {
      anyField_.WriteTo(output, _map_anyField_codec);
      apiField_.WriteTo(output, _map_apiField_codec);
      durationField_.WriteTo(output, _map_durationField_codec);
      emptyField_.WriteTo(output, _map_emptyField_codec);
      fieldMaskField_.WriteTo(output, _map_fieldMaskField_codec);
      sourceContextField_.WriteTo(output, _map_sourceContextField_codec);
      structField_.WriteTo(output, _map_structField_codec);
      timestampField_.WriteTo(output, _map_timestampField_codec);
      typeField_.WriteTo(output, _map_typeField_codec);
      doubleField_.WriteTo(output, _map_doubleField_codec);
      floatField_.WriteTo(output, _map_floatField_codec);
      int64Field_.WriteTo(output, _map_int64Field_codec);
      uint64Field_.WriteTo(output, _map_uint64Field_codec);
      int32Field_.WriteTo(output, _map_int32Field_codec);
      uint32Field_.WriteTo(output, _map_uint32Field_codec);
      boolField_.WriteTo(output, _map_boolField_codec);
      stringField_.WriteTo(output, _map_stringField_codec);
      bytesField_.WriteTo(output, _map_bytesField_codec);
    }

    public int CalculateSize() {
      int size = 0;
      size += anyField_.CalculateSize(_map_anyField_codec);
      size += apiField_.CalculateSize(_map_apiField_codec);
      size += durationField_.CalculateSize(_map_durationField_codec);
      size += emptyField_.CalculateSize(_map_emptyField_codec);
      size += fieldMaskField_.CalculateSize(_map_fieldMaskField_codec);
      size += sourceContextField_.CalculateSize(_map_sourceContextField_codec);
      size += structField_.CalculateSize(_map_structField_codec);
      size += timestampField_.CalculateSize(_map_timestampField_codec);
      size += typeField_.CalculateSize(_map_typeField_codec);
      size += doubleField_.CalculateSize(_map_doubleField_codec);
      size += floatField_.CalculateSize(_map_floatField_codec);
      size += int64Field_.CalculateSize(_map_int64Field_codec);
      size += uint64Field_.CalculateSize(_map_uint64Field_codec);
      size += int32Field_.CalculateSize(_map_int32Field_codec);
      size += uint32Field_.CalculateSize(_map_uint32Field_codec);
      size += boolField_.CalculateSize(_map_boolField_codec);
      size += stringField_.CalculateSize(_map_stringField_codec);
      size += bytesField_.CalculateSize(_map_bytesField_codec);
      return size;
    }

    public void MergeFrom(MapWellKnownTypes other) {
      if (other == null) {
        return;
      }
      anyField_.Add(other.anyField_);
      apiField_.Add(other.apiField_);
      durationField_.Add(other.durationField_);
      emptyField_.Add(other.emptyField_);
      fieldMaskField_.Add(other.fieldMaskField_);
      sourceContextField_.Add(other.sourceContextField_);
      structField_.Add(other.structField_);
      timestampField_.Add(other.timestampField_);
      typeField_.Add(other.typeField_);
      doubleField_.Add(other.doubleField_);
      floatField_.Add(other.floatField_);
      int64Field_.Add(other.int64Field_);
      uint64Field_.Add(other.uint64Field_);
      int32Field_.Add(other.int32Field_);
      uint32Field_.Add(other.uint32Field_);
      boolField_.Add(other.boolField_);
      stringField_.Add(other.stringField_);
      bytesField_.Add(other.bytesField_);
    }

    public void MergeFrom(pb::CodedInputStream input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
        switch(tag) {
          default:
            input.SkipLastField();
            break;
          case 10: {
            anyField_.AddEntriesFrom(input, _map_anyField_codec);
            break;
          }
          case 18: {
            apiField_.AddEntriesFrom(input, _map_apiField_codec);
            break;
          }
          case 26: {
            durationField_.AddEntriesFrom(input, _map_durationField_codec);
            break;
          }
          case 34: {
            emptyField_.AddEntriesFrom(input, _map_emptyField_codec);
            break;
          }
          case 42: {
            fieldMaskField_.AddEntriesFrom(input, _map_fieldMaskField_codec);
            break;
          }
          case 50: {
            sourceContextField_.AddEntriesFrom(input, _map_sourceContextField_codec);
            break;
          }
          case 58: {
            structField_.AddEntriesFrom(input, _map_structField_codec);
            break;
          }
          case 66: {
            timestampField_.AddEntriesFrom(input, _map_timestampField_codec);
            break;
          }
          case 74: {
            typeField_.AddEntriesFrom(input, _map_typeField_codec);
            break;
          }
          case 82: {
            doubleField_.AddEntriesFrom(input, _map_doubleField_codec);
            break;
          }
          case 90: {
            floatField_.AddEntriesFrom(input, _map_floatField_codec);
            break;
          }
          case 98: {
            int64Field_.AddEntriesFrom(input, _map_int64Field_codec);
            break;
          }
          case 106: {
            uint64Field_.AddEntriesFrom(input, _map_uint64Field_codec);
            break;
          }
          case 114: {
            int32Field_.AddEntriesFrom(input, _map_int32Field_codec);
            break;
          }
          case 122: {
            uint32Field_.AddEntriesFrom(input, _map_uint32Field_codec);
            break;
          }
          case 130: {
            boolField_.AddEntriesFrom(input, _map_boolField_codec);
            break;
          }
          case 138: {
            stringField_.AddEntriesFrom(input, _map_stringField_codec);
            break;
          }
          case 146: {
            bytesField_.AddEntriesFrom(input, _map_bytesField_codec);
            break;
          }
        }
      }
    }

  }

  #endregion

}

#endregion Designer generated code
