// <auto-generated>
//     Generated by the protocol buffer compiler.  DO NOT EDIT!
//     source: google/protobuf/unittest_well_known_types.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#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 {

  /// <summary>Holder for reflection information generated from google/protobuf/unittest_well_known_types.proto</summary>
  public static partial class UnittestWellKnownTypesReflection {

    #region Descriptor
    /// <summary>File descriptor for google/protobuf/unittest_well_known_types.proto</summary>
    public static pbr::FileDescriptor Descriptor {
      get { return descriptor; }
    }
    private static pbr::FileDescriptor descriptor;

    static UnittestWellKnownTypesReflection() {
      byte[] descriptorData = global::System.Convert.FromBase64String(
          string.Concat(
            "Ci9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5w",
            "cm90bxIRcHJvdG9idWZfdW5pdHRlc3QaGWdvb2dsZS9wcm90b2J1Zi9hbnku",
            "cHJvdG8aGWdvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8aHmdvb2dsZS9wcm90",
            "b2J1Zi9kdXJhdGlvbi5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBy",
            "b3RvGiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxokZ29vZ2xl",
            "L3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvGhxnb29nbGUvcHJvdG9i",
            "dWYvc3RydWN0LnByb3RvGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBy",
            "b3RvGhpnb29nbGUvcHJvdG9idWYvdHlwZS5wcm90bxoeZ29vZ2xlL3Byb3Rv",
            "YnVmL3dyYXBwZXJzLnByb3RvIr4HChJUZXN0V2VsbEtub3duVHlwZXMSJwoJ",
            "YW55X2ZpZWxkGAEgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueRInCglhcGlf",
            "ZmllbGQYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQXBpEjEKDmR1cmF0aW9u",
            "X2ZpZWxkGAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEisKC2Vt",
            "cHR5X2ZpZWxkGAQgASgLMhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EjQKEGZp",
            "ZWxkX21hc2tfZmllbGQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRN",
            "YXNrEjwKFHNvdXJjZV9jb250ZXh0X2ZpZWxkGAYgASgLMh4uZ29vZ2xlLnBy",
            "b3RvYnVmLlNvdXJjZUNvbnRleHQSLQoMc3RydWN0X2ZpZWxkGAcgASgLMhcu",
            "Z29vZ2xlLnByb3RvYnVmLlN0cnVjdBIzCg90aW1lc3RhbXBfZmllbGQYCCAB",
            "KAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEikKCnR5cGVfZmllbGQY",
            "CSABKAsyFS5nb29nbGUucHJvdG9idWYuVHlwZRIyCgxkb3VibGVfZmllbGQY",
            "CiABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSMAoLZmxvYXRf",
            "ZmllbGQYCyABKAsyGy5nb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZRIwCgtp",
            "bnQ2NF9maWVsZBgMIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVl",
            "EjIKDHVpbnQ2NF9maWVsZBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50",
            "NjRWYWx1ZRIwCgtpbnQzMl9maWVsZBgOIAEoCzIbLmdvb2dsZS5wcm90b2J1",
            "Zi5JbnQzMlZhbHVlEjIKDHVpbnQzMl9maWVsZBgPIAEoCzIcLmdvb2dsZS5w",
            "cm90b2J1Zi5VSW50MzJWYWx1ZRIuCgpib29sX2ZpZWxkGBAgASgLMhouZ29v",
            "Z2xlLnByb3RvYnVmLkJvb2xWYWx1ZRIyCgxzdHJpbmdfZmllbGQYESABKAsy",
            "HC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSMAoLYnl0ZXNfZmllbGQY",
            "EiABKAsyGy5nb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZRIrCgt2YWx1ZV9m",
            "aWVsZBgTIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZSKVBwoWUmVwZWF0",
            "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.FromGeneratedCode(descriptorData,
          new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.AnyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.ApiReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.FieldMaskReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.SourceContextReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TypeReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, },
          new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.TestWellKnownTypes), global::Google.Protobuf.TestProtos.TestWellKnownTypes.Parser, new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField", "ValueField" }, null, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.RepeatedWellKnownTypes), global::Google.Protobuf.TestProtos.RepeatedWellKnownTypes.Parser, new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, null, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.OneofWellKnownTypes), global::Google.Protobuf.TestProtos.OneofWellKnownTypes.Parser, new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, new[]{ "OneofField" }, null, null, null),
            new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.MapWellKnownTypes), global::Google.Protobuf.TestProtos.MapWellKnownTypes.Parser, new[]{ "AnyField", "ApiField", "DurationField", "EmptyField", "FieldMaskField", "SourceContextField", "StructField", "TimestampField", "TypeField", "DoubleField", "FloatField", "Int64Field", "Uint64Field", "Int32Field", "Uint32Field", "BoolField", "StringField", "BytesField" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, })
          }));
    }
    #endregion

  }
  #region Messages
  /// <summary>
  /// Test that we can include all well-known types.
  /// Each wrapper type is included separately, as languages
  /// map handle different wrappers in different ways.
  /// </summary>
  [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
  public sealed partial class TestWellKnownTypes : pb::IMessage<TestWellKnownTypes>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<TestWellKnownTypes> _parser = new pb::MessageParser<TestWellKnownTypes>(() => new TestWellKnownTypes());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<TestWellKnownTypes> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[0]; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public TestWellKnownTypes() {
      OnConstruction();
    }

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      valueField_ = other.valueField_ != null ? other.valueField_.Clone() : null;
      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public TestWellKnownTypes Clone() {
      return new TestWellKnownTypes(this);
    }

    /// <summary>Field number for the "any_field" field.</summary>
    public const int AnyFieldFieldNumber = 1;
    private global::Google.Protobuf.WellKnownTypes.Any anyField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Any AnyField {
      get { return anyField_; }
      set {
        anyField_ = value;
      }
    }

    /// <summary>Field number for the "api_field" field.</summary>
    public const int ApiFieldFieldNumber = 2;
    private global::Google.Protobuf.WellKnownTypes.Api apiField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Api ApiField {
      get { return apiField_; }
      set {
        apiField_ = value;
      }
    }

    /// <summary>Field number for the "duration_field" field.</summary>
    public const int DurationFieldFieldNumber = 3;
    private global::Google.Protobuf.WellKnownTypes.Duration durationField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Duration DurationField {
      get { return durationField_; }
      set {
        durationField_ = value;
      }
    }

    /// <summary>Field number for the "empty_field" field.</summary>
    public const int EmptyFieldFieldNumber = 4;
    private global::Google.Protobuf.WellKnownTypes.Empty emptyField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Empty EmptyField {
      get { return emptyField_; }
      set {
        emptyField_ = value;
      }
    }

    /// <summary>Field number for the "field_mask_field" field.</summary>
    public const int FieldMaskFieldFieldNumber = 5;
    private global::Google.Protobuf.WellKnownTypes.FieldMask fieldMaskField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.FieldMask FieldMaskField {
      get { return fieldMaskField_; }
      set {
        fieldMaskField_ = value;
      }
    }

    /// <summary>Field number for the "source_context_field" field.</summary>
    public const int SourceContextFieldFieldNumber = 6;
    private global::Google.Protobuf.WellKnownTypes.SourceContext sourceContextField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.SourceContext SourceContextField {
      get { return sourceContextField_; }
      set {
        sourceContextField_ = value;
      }
    }

    /// <summary>Field number for the "struct_field" field.</summary>
    public const int StructFieldFieldNumber = 7;
    private global::Google.Protobuf.WellKnownTypes.Struct structField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Struct StructField {
      get { return structField_; }
      set {
        structField_ = value;
      }
    }

    /// <summary>Field number for the "timestamp_field" field.</summary>
    public const int TimestampFieldFieldNumber = 8;
    private global::Google.Protobuf.WellKnownTypes.Timestamp timestampField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Timestamp TimestampField {
      get { return timestampField_; }
      set {
        timestampField_ = value;
      }
    }

    /// <summary>Field number for the "type_field" field.</summary>
    public const int TypeFieldFieldNumber = 9;
    private global::Google.Protobuf.WellKnownTypes.Type typeField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Type TypeField {
      get { return typeField_; }
      set {
        typeField_ = value;
      }
    }

    /// <summary>Field number for the "double_field" field.</summary>
    public const int DoubleFieldFieldNumber = 10;
    private static readonly pb::FieldCodec<double?> _single_doubleField_codec = pb::FieldCodec.ForStructWrapper<double>(82);
    private double? doubleField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public double? DoubleField {
      get { return doubleField_; }
      set {
        doubleField_ = value;
      }
    }


    /// <summary>Field number for the "float_field" field.</summary>
    public const int FloatFieldFieldNumber = 11;
    private static readonly pb::FieldCodec<float?> _single_floatField_codec = pb::FieldCodec.ForStructWrapper<float>(90);
    private float? floatField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public float? FloatField {
      get { return floatField_; }
      set {
        floatField_ = value;
      }
    }


    /// <summary>Field number for the "int64_field" field.</summary>
    public const int Int64FieldFieldNumber = 12;
    private static readonly pb::FieldCodec<long?> _single_int64Field_codec = pb::FieldCodec.ForStructWrapper<long>(98);
    private long? int64Field_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public long? Int64Field {
      get { return int64Field_; }
      set {
        int64Field_ = value;
      }
    }


    /// <summary>Field number for the "uint64_field" field.</summary>
    public const int Uint64FieldFieldNumber = 13;
    private static readonly pb::FieldCodec<ulong?> _single_uint64Field_codec = pb::FieldCodec.ForStructWrapper<ulong>(106);
    private ulong? uint64Field_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public ulong? Uint64Field {
      get { return uint64Field_; }
      set {
        uint64Field_ = value;
      }
    }


    /// <summary>Field number for the "int32_field" field.</summary>
    public const int Int32FieldFieldNumber = 14;
    private static readonly pb::FieldCodec<int?> _single_int32Field_codec = pb::FieldCodec.ForStructWrapper<int>(114);
    private int? int32Field_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int? Int32Field {
      get { return int32Field_; }
      set {
        int32Field_ = value;
      }
    }


    /// <summary>Field number for the "uint32_field" field.</summary>
    public const int Uint32FieldFieldNumber = 15;
    private static readonly pb::FieldCodec<uint?> _single_uint32Field_codec = pb::FieldCodec.ForStructWrapper<uint>(122);
    private uint? uint32Field_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public uint? Uint32Field {
      get { return uint32Field_; }
      set {
        uint32Field_ = value;
      }
    }


    /// <summary>Field number for the "bool_field" field.</summary>
    public const int BoolFieldFieldNumber = 16;
    private static readonly pb::FieldCodec<bool?> _single_boolField_codec = pb::FieldCodec.ForStructWrapper<bool>(130);
    private bool? boolField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool? BoolField {
      get { return boolField_; }
      set {
        boolField_ = value;
      }
    }


    /// <summary>Field number for the "string_field" field.</summary>
    public const int StringFieldFieldNumber = 17;
    private static readonly pb::FieldCodec<string> _single_stringField_codec = pb::FieldCodec.ForClassWrapper<string>(138);
    private string stringField_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string StringField {
      get { return stringField_; }
      set {
        stringField_ = value;
      }
    }


    /// <summary>Field number for the "bytes_field" field.</summary>
    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_;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pb::ByteString BytesField {
      get { return bytesField_; }
      set {
        bytesField_ = value;
      }
    }


    /// <summary>Field number for the "value_field" field.</summary>
    public const int ValueFieldFieldNumber = 19;
    private global::Google.Protobuf.WellKnownTypes.Value valueField_;
    /// <summary>
    /// Part of struct, but useful to be able to test separately
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public global::Google.Protobuf.WellKnownTypes.Value ValueField {
      get { return valueField_; }
      set {
        valueField_ = value;
      }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override bool Equals(object other) {
      return Equals(other as TestWellKnownTypes);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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 (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField, other.DoubleField)) return false;
      if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals(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;
      if (!object.Equals(ValueField, other.ValueField)) return false;
      return Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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 ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField);
      if (floatField_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode(FloatField);
      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();
      if (valueField_ != null) hash ^= ValueField.GetHashCode();
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override string ToString() {
      return pb::JsonFormatter.ToDiagnosticString(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      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);
      }
      if (valueField_ != null) {
        output.WriteRawTag(154, 1);
        output.WriteMessage(ValueField);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext 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(ref output, DoubleField);
      }
      if (floatField_ != null) {
        _single_floatField_codec.WriteTagAndValue(ref output, FloatField);
      }
      if (int64Field_ != null) {
        _single_int64Field_codec.WriteTagAndValue(ref output, Int64Field);
      }
      if (uint64Field_ != null) {
        _single_uint64Field_codec.WriteTagAndValue(ref output, Uint64Field);
      }
      if (int32Field_ != null) {
        _single_int32Field_codec.WriteTagAndValue(ref output, Int32Field);
      }
      if (uint32Field_ != null) {
        _single_uint32Field_codec.WriteTagAndValue(ref output, Uint32Field);
      }
      if (boolField_ != null) {
        _single_boolField_codec.WriteTagAndValue(ref output, BoolField);
      }
      if (stringField_ != null) {
        _single_stringField_codec.WriteTagAndValue(ref output, StringField);
      }
      if (bytesField_ != null) {
        _single_bytesField_codec.WriteTagAndValue(ref output, BytesField);
      }
      if (valueField_ != null) {
        output.WriteRawTag(154, 1);
        output.WriteMessage(ValueField);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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);
      }
      if (valueField_ != null) {
        size += 2 + pb::CodedOutputStream.ComputeMessageSize(ValueField);
      }
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
        }
      }
      if (other.valueField_ != null) {
        if (valueField_ == null) {
          ValueField = new global::Google.Protobuf.WellKnownTypes.Value();
        }
        ValueField.MergeFrom(other.ValueField);
      }
      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
      if ((tag & 7) == 4) {
        // Abort on any end group tag.
        return;
      }
      switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            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;
          }
          case 154: {
            if (valueField_ == null) {
              ValueField = new global::Google.Protobuf.WellKnownTypes.Value();
            }
            input.ReadMessage(ValueField);
            break;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
      if ((tag & 7) == 4) {
        // Abort on any end group tag.
        return;
      }
      switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            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(ref input);
            if (doubleField_ == null || value != 0D) {
              DoubleField = value;
            }
            break;
          }
          case 90: {
            float? value = _single_floatField_codec.Read(ref input);
            if (floatField_ == null || value != 0F) {
              FloatField = value;
            }
            break;
          }
          case 98: {
            long? value = _single_int64Field_codec.Read(ref input);
            if (int64Field_ == null || value != 0L) {
              Int64Field = value;
            }
            break;
          }
          case 106: {
            ulong? value = _single_uint64Field_codec.Read(ref input);
            if (uint64Field_ == null || value != 0UL) {
              Uint64Field = value;
            }
            break;
          }
          case 114: {
            int? value = _single_int32Field_codec.Read(ref input);
            if (int32Field_ == null || value != 0) {
              Int32Field = value;
            }
            break;
          }
          case 122: {
            uint? value = _single_uint32Field_codec.Read(ref input);
            if (uint32Field_ == null || value != 0) {
              Uint32Field = value;
            }
            break;
          }
          case 130: {
            bool? value = _single_boolField_codec.Read(ref input);
            if (boolField_ == null || value != false) {
              BoolField = value;
            }
            break;
          }
          case 138: {
            string value = _single_stringField_codec.Read(ref input);
            if (stringField_ == null || value != "") {
              StringField = value;
            }
            break;
          }
          case 146: {
            pb::ByteString value = _single_bytesField_codec.Read(ref input);
            if (bytesField_ == null || value != pb::ByteString.Empty) {
              BytesField = value;
            }
            break;
          }
          case 154: {
            if (valueField_ == null) {
              ValueField = new global::Google.Protobuf.WellKnownTypes.Value();
            }
            input.ReadMessage(ValueField);
            break;
          }
        }
      }
    }
    #endif

  }

  /// <summary>
  /// A repeated field for each well-known type.
  /// </summary>
  [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
  public sealed partial class RepeatedWellKnownTypes : pb::IMessage<RepeatedWellKnownTypes>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<RepeatedWellKnownTypes> _parser = new pb::MessageParser<RepeatedWellKnownTypes>(() => new RepeatedWellKnownTypes());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<RepeatedWellKnownTypes> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[1]; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public RepeatedWellKnownTypes() {
      OnConstruction();
    }

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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();
      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public RepeatedWellKnownTypes Clone() {
      return new RepeatedWellKnownTypes(this);
    }

    /// <summary>Field number for the "any_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Any> AnyField {
      get { return anyField_; }
    }

    /// <summary>Field number for the "api_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Api> ApiField {
      get { return apiField_; }
    }

    /// <summary>Field number for the "duration_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Duration> DurationField {
      get { return durationField_; }
    }

    /// <summary>Field number for the "empty_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Empty> EmptyField {
      get { return emptyField_; }
    }

    /// <summary>Field number for the "field_mask_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.FieldMask> FieldMaskField {
      get { return fieldMaskField_; }
    }

    /// <summary>Field number for the "source_context_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.SourceContext> SourceContextField {
      get { return sourceContextField_; }
    }

    /// <summary>Field number for the "struct_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Struct> StructField {
      get { return structField_; }
    }

    /// <summary>Field number for the "timestamp_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Timestamp> TimestampField {
      get { return timestampField_; }
    }

    /// <summary>Field number for the "type_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<global::Google.Protobuf.WellKnownTypes.Type> TypeField {
      get { return typeField_; }
    }

    /// <summary>Field number for the "double_field" field.</summary>
    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?>();
    /// <summary>
    /// These don't actually make a lot of sense, but they're not prohibited...
    /// </summary>
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<double?> DoubleField {
      get { return doubleField_; }
    }

    /// <summary>Field number for the "float_field" field.</summary>
    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?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<float?> FloatField {
      get { return floatField_; }
    }

    /// <summary>Field number for the "int64_field" field.</summary>
    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?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<long?> Int64Field {
      get { return int64Field_; }
    }

    /// <summary>Field number for the "uint64_field" field.</summary>
    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?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<ulong?> Uint64Field {
      get { return uint64Field_; }
    }

    /// <summary>Field number for the "int32_field" field.</summary>
    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?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<int?> Int32Field {
      get { return int32Field_; }
    }

    /// <summary>Field number for the "uint32_field" field.</summary>
    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?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<uint?> Uint32Field {
      get { return uint32Field_; }
    }

    /// <summary>Field number for the "bool_field" field.</summary>
    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?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<bool?> BoolField {
      get { return boolField_; }
    }

    /// <summary>Field number for the "string_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<string> StringField {
      get { return stringField_; }
    }

    /// <summary>Field number for the "bytes_field" field.</summary>
    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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::RepeatedField<pb::ByteString> BytesField {
      get { return bytesField_; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override bool Equals(object other) {
      return Equals(other as RepeatedWellKnownTypes);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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 Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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();
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override string ToString() {
      return pb::JsonFormatter.ToDiagnosticString(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      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);
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
      anyField_.WriteTo(ref output, _repeated_anyField_codec);
      apiField_.WriteTo(ref output, _repeated_apiField_codec);
      durationField_.WriteTo(ref output, _repeated_durationField_codec);
      emptyField_.WriteTo(ref output, _repeated_emptyField_codec);
      fieldMaskField_.WriteTo(ref output, _repeated_fieldMaskField_codec);
      sourceContextField_.WriteTo(ref output, _repeated_sourceContextField_codec);
      structField_.WriteTo(ref output, _repeated_structField_codec);
      timestampField_.WriteTo(ref output, _repeated_timestampField_codec);
      typeField_.WriteTo(ref output, _repeated_typeField_codec);
      doubleField_.WriteTo(ref output, _repeated_doubleField_codec);
      floatField_.WriteTo(ref output, _repeated_floatField_codec);
      int64Field_.WriteTo(ref output, _repeated_int64Field_codec);
      uint64Field_.WriteTo(ref output, _repeated_uint64Field_codec);
      int32Field_.WriteTo(ref output, _repeated_int32Field_codec);
      uint32Field_.WriteTo(ref output, _repeated_uint32Field_codec);
      boolField_.WriteTo(ref output, _repeated_boolField_codec);
      stringField_.WriteTo(ref output, _repeated_stringField_codec);
      bytesField_.WriteTo(ref output, _repeated_bytesField_codec);
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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);
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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_);
      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
      if ((tag & 7) == 4) {
        // Abort on any end group tag.
        return;
      }
      switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            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;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
      if ((tag & 7) == 4) {
        // Abort on any end group tag.
        return;
      }
      switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            break;
          case 10: {
            anyField_.AddEntriesFrom(ref input, _repeated_anyField_codec);
            break;
          }
          case 18: {
            apiField_.AddEntriesFrom(ref input, _repeated_apiField_codec);
            break;
          }
          case 26: {
            durationField_.AddEntriesFrom(ref input, _repeated_durationField_codec);
            break;
          }
          case 34: {
            emptyField_.AddEntriesFrom(ref input, _repeated_emptyField_codec);
            break;
          }
          case 42: {
            fieldMaskField_.AddEntriesFrom(ref input, _repeated_fieldMaskField_codec);
            break;
          }
          case 50: {
            sourceContextField_.AddEntriesFrom(ref input, _repeated_sourceContextField_codec);
            break;
          }
          case 58: {
            structField_.AddEntriesFrom(ref input, _repeated_structField_codec);
            break;
          }
          case 66: {
            timestampField_.AddEntriesFrom(ref input, _repeated_timestampField_codec);
            break;
          }
          case 74: {
            typeField_.AddEntriesFrom(ref input, _repeated_typeField_codec);
            break;
          }
          case 82: {
            doubleField_.AddEntriesFrom(ref input, _repeated_doubleField_codec);
            break;
          }
          case 90: {
            floatField_.AddEntriesFrom(ref input, _repeated_floatField_codec);
            break;
          }
          case 98: {
            int64Field_.AddEntriesFrom(ref input, _repeated_int64Field_codec);
            break;
          }
          case 106: {
            uint64Field_.AddEntriesFrom(ref input, _repeated_uint64Field_codec);
            break;
          }
          case 114: {
            int32Field_.AddEntriesFrom(ref input, _repeated_int32Field_codec);
            break;
          }
          case 122: {
            uint32Field_.AddEntriesFrom(ref input, _repeated_uint32Field_codec);
            break;
          }
          case 130: {
            boolField_.AddEntriesFrom(ref input, _repeated_boolField_codec);
            break;
          }
          case 138: {
            stringField_.AddEntriesFrom(ref input, _repeated_stringField_codec);
            break;
          }
          case 146: {
            bytesField_.AddEntriesFrom(ref input, _repeated_bytesField_codec);
            break;
          }
        }
      }
    }
    #endif

  }

  [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
  public sealed partial class OneofWellKnownTypes : pb::IMessage<OneofWellKnownTypes>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<OneofWellKnownTypes> _parser = new pb::MessageParser<OneofWellKnownTypes>(() => new OneofWellKnownTypes());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<OneofWellKnownTypes> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[2]; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public OneofWellKnownTypes() {
      OnConstruction();
    }

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }

      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public OneofWellKnownTypes Clone() {
      return new OneofWellKnownTypes(this);
    }

    /// <summary>Field number for the "any_field" field.</summary>
    public const int AnyFieldFieldNumber = 1;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "api_field" field.</summary>
    public const int ApiFieldFieldNumber = 2;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "duration_field" field.</summary>
    public const int DurationFieldFieldNumber = 3;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "empty_field" field.</summary>
    public const int EmptyFieldFieldNumber = 4;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "field_mask_field" field.</summary>
    public const int FieldMaskFieldFieldNumber = 5;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "source_context_field" field.</summary>
    public const int SourceContextFieldFieldNumber = 6;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "struct_field" field.</summary>
    public const int StructFieldFieldNumber = 7;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "timestamp_field" field.</summary>
    public const int TimestampFieldFieldNumber = 8;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "type_field" field.</summary>
    public const int TypeFieldFieldNumber = 9;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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;
      }
    }

    /// <summary>Field number for the "double_field" field.</summary>
    public const int DoubleFieldFieldNumber = 10;
    private static readonly pb::FieldCodec<double?> _oneof_doubleField_codec = pb::FieldCodec.ForStructWrapper<double>(82);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public double? DoubleField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.DoubleField ? (double?) oneofField_ : (double?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.DoubleField;
      }
    }

    /// <summary>Field number for the "float_field" field.</summary>
    public const int FloatFieldFieldNumber = 11;
    private static readonly pb::FieldCodec<float?> _oneof_floatField_codec = pb::FieldCodec.ForStructWrapper<float>(90);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public float? FloatField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.FloatField ? (float?) oneofField_ : (float?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.FloatField;
      }
    }

    /// <summary>Field number for the "int64_field" field.</summary>
    public const int Int64FieldFieldNumber = 12;
    private static readonly pb::FieldCodec<long?> _oneof_int64Field_codec = pb::FieldCodec.ForStructWrapper<long>(98);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public long? Int64Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Int64Field ? (long?) oneofField_ : (long?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Int64Field;
      }
    }

    /// <summary>Field number for the "uint64_field" field.</summary>
    public const int Uint64FieldFieldNumber = 13;
    private static readonly pb::FieldCodec<ulong?> _oneof_uint64Field_codec = pb::FieldCodec.ForStructWrapper<ulong>(106);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public ulong? Uint64Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Uint64Field ? (ulong?) oneofField_ : (ulong?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Uint64Field;
      }
    }

    /// <summary>Field number for the "int32_field" field.</summary>
    public const int Int32FieldFieldNumber = 14;
    private static readonly pb::FieldCodec<int?> _oneof_int32Field_codec = pb::FieldCodec.ForStructWrapper<int>(114);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public int? Int32Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Int32Field ? (int?) oneofField_ : (int?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Int32Field;
      }
    }

    /// <summary>Field number for the "uint32_field" field.</summary>
    public const int Uint32FieldFieldNumber = 15;
    private static readonly pb::FieldCodec<uint?> _oneof_uint32Field_codec = pb::FieldCodec.ForStructWrapper<uint>(122);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public uint? Uint32Field {
      get { return oneofFieldCase_ == OneofFieldOneofCase.Uint32Field ? (uint?) oneofField_ : (uint?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.Uint32Field;
      }
    }

    /// <summary>Field number for the "bool_field" field.</summary>
    public const int BoolFieldFieldNumber = 16;
    private static readonly pb::FieldCodec<bool?> _oneof_boolField_codec = pb::FieldCodec.ForStructWrapper<bool>(130);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public bool? BoolField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.BoolField ? (bool?) oneofField_ : (bool?) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.BoolField;
      }
    }

    /// <summary>Field number for the "string_field" field.</summary>
    public const int StringFieldFieldNumber = 17;
    private static readonly pb::FieldCodec<string> _oneof_stringField_codec = pb::FieldCodec.ForClassWrapper<string>(138);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public string StringField {
      get { return oneofFieldCase_ == OneofFieldOneofCase.StringField ? (string) oneofField_ : (string) null; }
      set {
        oneofField_ = value;
        oneofFieldCase_ = value == null ? OneofFieldOneofCase.None : OneofFieldOneofCase.StringField;
      }
    }

    /// <summary>Field number for the "bytes_field" field.</summary>
    public const int BytesFieldFieldNumber = 18;
    private static readonly pb::FieldCodec<pb::ByteString> _oneof_bytesField_codec = pb::FieldCodec.ForClassWrapper<pb::ByteString>(146);
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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_;
    /// <summary>Enum of possible cases for the "oneof_field" oneof.</summary>
    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;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public OneofFieldOneofCase OneofFieldCase {
      get { return oneofFieldCase_; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void ClearOneofField() {
      oneofFieldCase_ = OneofFieldOneofCase.None;
      oneofField_ = null;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override bool Equals(object other) {
      return Equals(other as OneofWellKnownTypes);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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 (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField, other.DoubleField)) return false;
      if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals(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;
      if (OneofFieldCase != other.OneofFieldCase) return false;
      return Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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 ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField);
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode(FloatField);
      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();
      hash ^= (int) oneofFieldCase_;
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override string ToString() {
      return pb::JsonFormatter.ToDiagnosticString(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      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_);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext 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(ref output, (double?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.FloatField) {
        _oneof_floatField_codec.WriteTagAndValue(ref output, (float?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int64Field) {
        _oneof_int64Field_codec.WriteTagAndValue(ref output, (long?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint64Field) {
        _oneof_uint64Field_codec.WriteTagAndValue(ref output, (ulong?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Int32Field) {
        _oneof_int32Field_codec.WriteTagAndValue(ref output, (int?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.Uint32Field) {
        _oneof_uint32Field_codec.WriteTagAndValue(ref output, (uint?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BoolField) {
        _oneof_boolField_codec.WriteTagAndValue(ref output, (bool?) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.StringField) {
        _oneof_stringField_codec.WriteTagAndValue(ref output, (string) oneofField_);
      }
      if (oneofFieldCase_ == OneofFieldOneofCase.BytesField) {
        _oneof_bytesField_codec.WriteTagAndValue(ref output, (pb::ByteString) oneofField_);
      }
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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);
      }
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(OneofWellKnownTypes other) {
      if (other == null) {
        return;
      }
      switch (other.OneofFieldCase) {
        case OneofFieldOneofCase.AnyField:
          if (AnyField == null) {
            AnyField = new global::Google.Protobuf.WellKnownTypes.Any();
          }
          AnyField.MergeFrom(other.AnyField);
          break;
        case OneofFieldOneofCase.ApiField:
          if (ApiField == null) {
            ApiField = new global::Google.Protobuf.WellKnownTypes.Api();
          }
          ApiField.MergeFrom(other.ApiField);
          break;
        case OneofFieldOneofCase.DurationField:
          if (DurationField == null) {
            DurationField = new global::Google.Protobuf.WellKnownTypes.Duration();
          }
          DurationField.MergeFrom(other.DurationField);
          break;
        case OneofFieldOneofCase.EmptyField:
          if (EmptyField == null) {
            EmptyField = new global::Google.Protobuf.WellKnownTypes.Empty();
          }
          EmptyField.MergeFrom(other.EmptyField);
          break;
        case OneofFieldOneofCase.FieldMaskField:
          if (FieldMaskField == null) {
            FieldMaskField = new global::Google.Protobuf.WellKnownTypes.FieldMask();
          }
          FieldMaskField.MergeFrom(other.FieldMaskField);
          break;
        case OneofFieldOneofCase.SourceContextField:
          if (SourceContextField == null) {
            SourceContextField = new global::Google.Protobuf.WellKnownTypes.SourceContext();
          }
          SourceContextField.MergeFrom(other.SourceContextField);
          break;
        case OneofFieldOneofCase.StructField:
          if (StructField == null) {
            StructField = new global::Google.Protobuf.WellKnownTypes.Struct();
          }
          StructField.MergeFrom(other.StructField);
          break;
        case OneofFieldOneofCase.TimestampField:
          if (TimestampField == null) {
            TimestampField = new global::Google.Protobuf.WellKnownTypes.Timestamp();
          }
          TimestampField.MergeFrom(other.TimestampField);
          break;
        case OneofFieldOneofCase.TypeField:
          if (TypeField == null) {
            TypeField = new global::Google.Protobuf.WellKnownTypes.Type();
          }
          TypeField.MergeFrom(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;
      }

      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
      if ((tag & 7) == 4) {
        // Abort on any end group tag.
        return;
      }
      switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            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;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
      if ((tag & 7) == 4) {
        // Abort on any end group tag.
        return;
      }
      switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            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(ref input);
            break;
          }
          case 90: {
            FloatField = _oneof_floatField_codec.Read(ref input);
            break;
          }
          case 98: {
            Int64Field = _oneof_int64Field_codec.Read(ref input);
            break;
          }
          case 106: {
            Uint64Field = _oneof_uint64Field_codec.Read(ref input);
            break;
          }
          case 114: {
            Int32Field = _oneof_int32Field_codec.Read(ref input);
            break;
          }
          case 122: {
            Uint32Field = _oneof_uint32Field_codec.Read(ref input);
            break;
          }
          case 130: {
            BoolField = _oneof_boolField_codec.Read(ref input);
            break;
          }
          case 138: {
            StringField = _oneof_stringField_codec.Read(ref input);
            break;
          }
          case 146: {
            BytesField = _oneof_bytesField_codec.Read(ref input);
            break;
          }
        }
      }
    }
    #endif

  }

  /// <summary>
  /// A map field for each well-known type. We only
  /// need to worry about the value part of the map being the
  /// well-known types, as messages can't be map keys.
  /// </summary>
  [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
  public sealed partial class MapWellKnownTypes : pb::IMessage<MapWellKnownTypes>
  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      , pb::IBufferMessage
  #endif
  {
    private static readonly pb::MessageParser<MapWellKnownTypes> _parser = new pb::MessageParser<MapWellKnownTypes>(() => new MapWellKnownTypes());
    private pb::UnknownFieldSet _unknownFields;
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pb::MessageParser<MapWellKnownTypes> Parser { get { return _parser; } }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public static pbr::MessageDescriptor Descriptor {
      get { return global::Google.Protobuf.TestProtos.UnittestWellKnownTypesReflection.Descriptor.MessageTypes[3]; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    pbr::MessageDescriptor pb::IMessage.Descriptor {
      get { return Descriptor; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public MapWellKnownTypes() {
      OnConstruction();
    }

    partial void OnConstruction();

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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();
      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public MapWellKnownTypes Clone() {
      return new MapWellKnownTypes(this);
    }

    /// <summary>Field number for the "any_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Any> AnyField {
      get { return anyField_; }
    }

    /// <summary>Field number for the "api_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Api> ApiField {
      get { return apiField_; }
    }

    /// <summary>Field number for the "duration_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Duration> DurationField {
      get { return durationField_; }
    }

    /// <summary>Field number for the "empty_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Empty> EmptyField {
      get { return emptyField_; }
    }

    /// <summary>Field number for the "field_mask_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.FieldMask> FieldMaskField {
      get { return fieldMaskField_; }
    }

    /// <summary>Field number for the "source_context_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.SourceContext> SourceContextField {
      get { return sourceContextField_; }
    }

    /// <summary>Field number for the "struct_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Struct> StructField {
      get { return structField_; }
    }

    /// <summary>Field number for the "timestamp_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Timestamp> TimestampField {
      get { return timestampField_; }
    }

    /// <summary>Field number for the "type_field" field.</summary>
    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, 0), 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>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, global::Google.Protobuf.WellKnownTypes.Type> TypeField {
      get { return typeField_; }
    }

    /// <summary>Field number for the "double_field" field.</summary>
    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, 0), pb::FieldCodec.ForStructWrapper<double>(18), 82);
    private readonly pbc::MapField<int, double?> doubleField_ = new pbc::MapField<int, double?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, double?> DoubleField {
      get { return doubleField_; }
    }

    /// <summary>Field number for the "float_field" field.</summary>
    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, 0), pb::FieldCodec.ForStructWrapper<float>(18), 90);
    private readonly pbc::MapField<int, float?> floatField_ = new pbc::MapField<int, float?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, float?> FloatField {
      get { return floatField_; }
    }

    /// <summary>Field number for the "int64_field" field.</summary>
    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, 0), pb::FieldCodec.ForStructWrapper<long>(18), 98);
    private readonly pbc::MapField<int, long?> int64Field_ = new pbc::MapField<int, long?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, long?> Int64Field {
      get { return int64Field_; }
    }

    /// <summary>Field number for the "uint64_field" field.</summary>
    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, 0), pb::FieldCodec.ForStructWrapper<ulong>(18), 106);
    private readonly pbc::MapField<int, ulong?> uint64Field_ = new pbc::MapField<int, ulong?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, ulong?> Uint64Field {
      get { return uint64Field_; }
    }

    /// <summary>Field number for the "int32_field" field.</summary>
    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, 0), pb::FieldCodec.ForStructWrapper<int>(18), 114);
    private readonly pbc::MapField<int, int?> int32Field_ = new pbc::MapField<int, int?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, int?> Int32Field {
      get { return int32Field_; }
    }

    /// <summary>Field number for the "uint32_field" field.</summary>
    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, 0), pb::FieldCodec.ForStructWrapper<uint>(18), 122);
    private readonly pbc::MapField<int, uint?> uint32Field_ = new pbc::MapField<int, uint?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, uint?> Uint32Field {
      get { return uint32Field_; }
    }

    /// <summary>Field number for the "bool_field" field.</summary>
    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, 0), pb::FieldCodec.ForStructWrapper<bool>(18), 130);
    private readonly pbc::MapField<int, bool?> boolField_ = new pbc::MapField<int, bool?>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, bool?> BoolField {
      get { return boolField_; }
    }

    /// <summary>Field number for the "string_field" field.</summary>
    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, 0), pb::FieldCodec.ForClassWrapper<string>(18), 138);
    private readonly pbc::MapField<int, string> stringField_ = new pbc::MapField<int, string>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, string> StringField {
      get { return stringField_; }
    }

    /// <summary>Field number for the "bytes_field" field.</summary>
    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, 0), pb::FieldCodec.ForClassWrapper<pb::ByteString>(18), 146);
    private readonly pbc::MapField<int, pb::ByteString> bytesField_ = new pbc::MapField<int, pb::ByteString>();
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public pbc::MapField<int, pb::ByteString> BytesField {
      get { return bytesField_; }
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override bool Equals(object other) {
      return Equals(other as MapWellKnownTypes);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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 Equals(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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();
      if (_unknownFields != null) {
        hash ^= _unknownFields.GetHashCode();
      }
      return hash;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public override string ToString() {
      return pb::JsonFormatter.ToDiagnosticString(this);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void WriteTo(pb::CodedOutputStream output) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      output.WriteRawMessage(this);
    #else
      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);
      if (_unknownFields != null) {
        _unknownFields.WriteTo(output);
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
      anyField_.WriteTo(ref output, _map_anyField_codec);
      apiField_.WriteTo(ref output, _map_apiField_codec);
      durationField_.WriteTo(ref output, _map_durationField_codec);
      emptyField_.WriteTo(ref output, _map_emptyField_codec);
      fieldMaskField_.WriteTo(ref output, _map_fieldMaskField_codec);
      sourceContextField_.WriteTo(ref output, _map_sourceContextField_codec);
      structField_.WriteTo(ref output, _map_structField_codec);
      timestampField_.WriteTo(ref output, _map_timestampField_codec);
      typeField_.WriteTo(ref output, _map_typeField_codec);
      doubleField_.WriteTo(ref output, _map_doubleField_codec);
      floatField_.WriteTo(ref output, _map_floatField_codec);
      int64Field_.WriteTo(ref output, _map_int64Field_codec);
      uint64Field_.WriteTo(ref output, _map_uint64Field_codec);
      int32Field_.WriteTo(ref output, _map_int32Field_codec);
      uint32Field_.WriteTo(ref output, _map_uint32Field_codec);
      boolField_.WriteTo(ref output, _map_boolField_codec);
      stringField_.WriteTo(ref output, _map_stringField_codec);
      bytesField_.WriteTo(ref output, _map_bytesField_codec);
      if (_unknownFields != null) {
        _unknownFields.WriteTo(ref output);
      }
    }
    #endif

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    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);
      if (_unknownFields != null) {
        size += _unknownFields.CalculateSize();
      }
      return size;
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(MapWellKnownTypes other) {
      if (other == null) {
        return;
      }
      anyField_.MergeFrom(other.anyField_);
      apiField_.MergeFrom(other.apiField_);
      durationField_.MergeFrom(other.durationField_);
      emptyField_.MergeFrom(other.emptyField_);
      fieldMaskField_.MergeFrom(other.fieldMaskField_);
      sourceContextField_.MergeFrom(other.sourceContextField_);
      structField_.MergeFrom(other.structField_);
      timestampField_.MergeFrom(other.timestampField_);
      typeField_.MergeFrom(other.typeField_);
      doubleField_.MergeFrom(other.doubleField_);
      floatField_.MergeFrom(other.floatField_);
      int64Field_.MergeFrom(other.int64Field_);
      uint64Field_.MergeFrom(other.uint64Field_);
      int32Field_.MergeFrom(other.int32Field_);
      uint32Field_.MergeFrom(other.uint32Field_);
      boolField_.MergeFrom(other.boolField_);
      stringField_.MergeFrom(other.stringField_);
      bytesField_.MergeFrom(other.bytesField_);
      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
    }

    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    public void MergeFrom(pb::CodedInputStream input) {
    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
      input.ReadRawMessage(this);
    #else
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
      if ((tag & 7) == 4) {
        // Abort on any end group tag.
        return;
      }
      switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
            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;
          }
        }
      }
    #endif
    }

    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
      uint tag;
      while ((tag = input.ReadTag()) != 0) {
      if ((tag & 7) == 4) {
        // Abort on any end group tag.
        return;
      }
      switch(tag) {
          default:
            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
            break;
          case 10: {
            anyField_.AddEntriesFrom(ref input, _map_anyField_codec);
            break;
          }
          case 18: {
            apiField_.AddEntriesFrom(ref input, _map_apiField_codec);
            break;
          }
          case 26: {
            durationField_.AddEntriesFrom(ref input, _map_durationField_codec);
            break;
          }
          case 34: {
            emptyField_.AddEntriesFrom(ref input, _map_emptyField_codec);
            break;
          }
          case 42: {
            fieldMaskField_.AddEntriesFrom(ref input, _map_fieldMaskField_codec);
            break;
          }
          case 50: {
            sourceContextField_.AddEntriesFrom(ref input, _map_sourceContextField_codec);
            break;
          }
          case 58: {
            structField_.AddEntriesFrom(ref input, _map_structField_codec);
            break;
          }
          case 66: {
            timestampField_.AddEntriesFrom(ref input, _map_timestampField_codec);
            break;
          }
          case 74: {
            typeField_.AddEntriesFrom(ref input, _map_typeField_codec);
            break;
          }
          case 82: {
            doubleField_.AddEntriesFrom(ref input, _map_doubleField_codec);
            break;
          }
          case 90: {
            floatField_.AddEntriesFrom(ref input, _map_floatField_codec);
            break;
          }
          case 98: {
            int64Field_.AddEntriesFrom(ref input, _map_int64Field_codec);
            break;
          }
          case 106: {
            uint64Field_.AddEntriesFrom(ref input, _map_uint64Field_codec);
            break;
          }
          case 114: {
            int32Field_.AddEntriesFrom(ref input, _map_int32Field_codec);
            break;
          }
          case 122: {
            uint32Field_.AddEntriesFrom(ref input, _map_uint32Field_codec);
            break;
          }
          case 130: {
            boolField_.AddEntriesFrom(ref input, _map_boolField_codec);
            break;
          }
          case 138: {
            stringField_.AddEntriesFrom(ref input, _map_stringField_codec);
            break;
          }
          case 146: {
            bytesField_.AddEntriesFrom(ref input, _map_bytesField_codec);
            break;
          }
        }
      }
    }
    #endif

  }

  #endregion

}

#endregion Designer generated code
