Finished adding find tag by name
diff --git a/src/AddressBook/AddressBookProtos.cs b/src/AddressBook/AddressBookProtos.cs
index bd28477..58cba4a 100644
--- a/src/AddressBook/AddressBookProtos.cs
+++ b/src/AddressBook/AddressBookProtos.cs
@@ -67,6 +67,8 @@
   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class Person : pb::GeneratedMessage<Person, Person.Builder> {

     private static readonly Person defaultInstance = new Builder().BuildPartial();

+    private static readonly string[] _personFieldNames = new string[] { "email", "id", "name", "phone" };

+    private static readonly uint[] _personFieldTags = new uint[] { 26, 16, 10, 34 };

     public static Person DefaultInstance {

       get { return defaultInstance; }

     }

@@ -105,6 +107,8 @@
       [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

       public sealed partial class PhoneNumber : pb::GeneratedMessage<PhoneNumber, PhoneNumber.Builder> {

         private static readonly PhoneNumber defaultInstance = new Builder().BuildPartial();

+        private static readonly string[] _phoneNumberFieldNames = new string[] { "number", "type" };

+        private static readonly uint[] _phoneNumberFieldTags = new uint[] { 10, 16 };

         public static PhoneNumber DefaultInstance {

           get { return defaultInstance; }

         }

@@ -154,11 +158,12 @@
         

         public override void WriteTo(pb::ICodedOutputStream output) {

           int size = SerializedSize;

+          string[] field_names = _phoneNumberFieldNames;

           if (hasNumber) {

-            output.WriteString(1, "number", Number);

+            output.WriteString(1, field_names[0], Number);

           }

           if (hasType) {

-            output.WriteEnum(2, "type", (int) Type, Type.ToString());

+            output.WriteEnum(2, field_names[1], (int) Type, Type.ToString());

           }

           UnknownFields.WriteTo(output);

         }

@@ -290,6 +295,18 @@
             uint tag;

             string field_name;

             while (input.ReadTag(out tag, out field_name)) {

+              if(tag == 0 && field_name != null) {

+                int field_ordinal = global::System.Array.BinarySearch(_phoneNumberFieldNames, field_name, global::System.StringComparer.Ordinal);

+                if(field_ordinal >= 0)

+                  tag = _phoneNumberFieldTags[field_ordinal];

+                else {

+                  if (unknownFields == null) {

+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);

+                  }

+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);

+                  continue;

+                }

+              }

               switch (tag) {

                 case 0: {

                   throw pb::InvalidProtocolBufferException.InvalidTag();

@@ -308,7 +325,7 @@
                   break;

                 }

                 case 10: {

-                  result.hasNumber |= input.ReadString(ref result.number_);

+                  result.hasNumber = input.ReadString(ref result.number_);

                   break;

                 }

                 case 16: {

@@ -433,17 +450,18 @@
     

     public override void WriteTo(pb::ICodedOutputStream output) {

       int size = SerializedSize;

+      string[] field_names = _personFieldNames;

       if (hasName) {

-        output.WriteString(1, "name", Name);

+        output.WriteString(1, field_names[2], Name);

       }

       if (hasId) {

-        output.WriteInt32(2, "id", Id);

+        output.WriteInt32(2, field_names[1], Id);

       }

       if (hasEmail) {

-        output.WriteString(3, "email", Email);

+        output.WriteString(3, field_names[0], Email);

       }

       if (phone_.Count > 0) {

-        output.WriteArray(pbd::FieldType.Message, 4, "phone", phone_);

+        output.WriteArray(pbd::FieldType.Message, 4, field_names[3], phone_);

       }

       UnknownFields.WriteTo(output);

     }

@@ -588,6 +606,18 @@
         uint tag;

         string field_name;

         while (input.ReadTag(out tag, out field_name)) {

+          if(tag == 0 && field_name != null) {

+            int field_ordinal = global::System.Array.BinarySearch(_personFieldNames, field_name, global::System.StringComparer.Ordinal);

+            if(field_ordinal >= 0)

+              tag = _personFieldTags[field_ordinal];

+            else {

+              if (unknownFields == null) {

+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);

+              }

+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);

+              continue;

+            }

+          }

           switch (tag) {

             case 0: {

               throw pb::InvalidProtocolBufferException.InvalidTag();

@@ -606,15 +636,15 @@
               break;

             }

             case 10: {

-              result.hasName |= input.ReadString(ref result.name_);

+              result.hasName = input.ReadString(ref result.name_);

               break;

             }

             case 16: {

-              result.hasId |= input.ReadInt32(ref result.id_);

+              result.hasId = input.ReadInt32(ref result.id_);

               break;

             }

             case 26: {

-              result.hasEmail |= input.ReadString(ref result.email_);

+              result.hasEmail = input.ReadString(ref result.email_);

               break;

             }

             case 34: {

@@ -735,6 +765,8 @@
   [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]

   public sealed partial class AddressBook : pb::GeneratedMessage<AddressBook, AddressBook.Builder> {

     private static readonly AddressBook defaultInstance = new Builder().BuildPartial();

+    private static readonly string[] _addressBookFieldNames = new string[] { "person" };

+    private static readonly uint[] _addressBookFieldTags = new uint[] { 10 };

     public static AddressBook DefaultInstance {

       get { return defaultInstance; }

     }

@@ -778,8 +810,9 @@
     

     public override void WriteTo(pb::ICodedOutputStream output) {

       int size = SerializedSize;

+      string[] field_names = _addressBookFieldNames;

       if (person_.Count > 0) {

-        output.WriteArray(pbd::FieldType.Message, 1, "person", person_);

+        output.WriteArray(pbd::FieldType.Message, 1, field_names[0], person_);

       }

       UnknownFields.WriteTo(output);

     }

@@ -906,6 +939,18 @@
         uint tag;

         string field_name;

         while (input.ReadTag(out tag, out field_name)) {

+          if(tag == 0 && field_name != null) {

+            int field_ordinal = global::System.Array.BinarySearch(_addressBookFieldNames, field_name, global::System.StringComparer.Ordinal);

+            if(field_ordinal >= 0)

+              tag = _addressBookFieldTags[field_ordinal];

+            else {

+              if (unknownFields == null) {

+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);

+              }

+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);

+              continue;

+            }

+          }

           switch (tag) {

             case 0: {

               throw pb::InvalidProtocolBufferException.InvalidTag();