// Generated by the protocol buffer compiler.  DO NOT EDIT!
// NO CHECKED-IN PROTOBUF GENCODE
// source: src/proto/book.proto
// Protobuf Java Version: 4.33.0

package book;

@com.google.protobuf.Generated
public final class BookOuterClass extends com.google.protobuf.GeneratedFile {
  private BookOuterClass() {}
  static {
    com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
      com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
      /* major= */ 4,
      /* minor= */ 33,
      /* patch= */ 0,
      /* suffix= */ "",
      "BookOuterClass");
  }
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistryLite registry) {
  }

  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
    registerAllExtensions(
        (com.google.protobuf.ExtensionRegistryLite) registry);
  }
  /**
   * Protobuf enum {@code book.Genre}
   */
  public enum Genre
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>UNKNOWN = 0;</code>
     */
    UNKNOWN(0),
    /**
     * <code>SCIENCE_FICTION = 1;</code>
     */
    SCIENCE_FICTION(1),
    /**
     * <code>MYSTERY = 2;</code>
     */
    MYSTERY(2),
    /**
     * <code>BIOGRAPHY = 3;</code>
     */
    BIOGRAPHY(3),
    /**
     * <code>HISTORY = 4;</code>
     */
    HISTORY(4),
    UNRECOGNIZED(-1),
    ;

    static {
      com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
        com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
        /* major= */ 4,
        /* minor= */ 33,
        /* patch= */ 0,
        /* suffix= */ "",
        "Genre");
    }
    /**
     * <code>UNKNOWN = 0;</code>
     */
    public static final int UNKNOWN_VALUE = 0;
    /**
     * <code>SCIENCE_FICTION = 1;</code>
     */
    public static final int SCIENCE_FICTION_VALUE = 1;
    /**
     * <code>MYSTERY = 2;</code>
     */
    public static final int MYSTERY_VALUE = 2;
    /**
     * <code>BIOGRAPHY = 3;</code>
     */
    public static final int BIOGRAPHY_VALUE = 3;
    /**
     * <code>HISTORY = 4;</code>
     */
    public static final int HISTORY_VALUE = 4;


    public final int getNumber() {
      if (this == UNRECOGNIZED) {
        throw new java.lang.IllegalArgumentException(
            "Can't get the number of an unknown enum value.");
      }
      return value;
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     * @deprecated Use {@link #forNumber(int)} instead.
     */
    @java.lang.Deprecated
    public static Genre valueOf(int value) {
      return forNumber(value);
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     */
    public static Genre forNumber(int value) {
      switch (value) {
        case 0: return UNKNOWN;
        case 1: return SCIENCE_FICTION;
        case 2: return MYSTERY;
        case 3: return BIOGRAPHY;
        case 4: return HISTORY;
        default: return null;
      }
    }

    public static com.google.protobuf.Internal.EnumLiteMap<Genre>
        internalGetValueMap() {
      return internalValueMap;
    }
    private static final com.google.protobuf.Internal.EnumLiteMap<
        Genre> internalValueMap =
          new com.google.protobuf.Internal.EnumLiteMap<Genre>() {
            public Genre findValueByNumber(int number) {
              return Genre.forNumber(number);
            }
          };

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      if (this == UNRECOGNIZED) {
        throw new java.lang.IllegalStateException(
            "Can't get the descriptor of an unrecognized enum value.");
      }
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return book.BookOuterClass.getDescriptor().getEnumTypes().get(0);
    }

    private static final Genre[] VALUES = values();

    public static Genre valueOf(
        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
      if (desc.getType() != getDescriptor()) {
        throw new java.lang.IllegalArgumentException(
          "EnumValueDescriptor is not for this type.");
      }
      if (desc.getIndex() == -1) {
        return UNRECOGNIZED;
      }
      return VALUES[desc.getIndex()];
    }

    private final int value;

    private Genre(int value) {
      this.value = value;
    }

    // @@protoc_insertion_point(enum_scope:book.Genre)
  }

  public interface AuthorOrBuilder extends
      // @@protoc_insertion_point(interface_extends:book.Author)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>string first_name = 1;</code>
     * @return The firstName.
     */
    java.lang.String getFirstName();
    /**
     * <code>string first_name = 1;</code>
     * @return The bytes for firstName.
     */
    com.google.protobuf.ByteString
        getFirstNameBytes();

    /**
     * <code>string last_name = 2;</code>
     * @return The lastName.
     */
    java.lang.String getLastName();
    /**
     * <code>string last_name = 2;</code>
     * @return The bytes for lastName.
     */
    com.google.protobuf.ByteString
        getLastNameBytes();
  }
  /**
   * Protobuf type {@code book.Author}
   */
  public static final class Author extends
      com.google.protobuf.GeneratedMessage implements
      // @@protoc_insertion_point(message_implements:book.Author)
      AuthorOrBuilder {
  private static final long serialVersionUID = 0L;
    static {
      com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
        com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
        /* major= */ 4,
        /* minor= */ 33,
        /* patch= */ 0,
        /* suffix= */ "",
        "Author");
    }
    // Use Author.newBuilder() to construct.
    private Author(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
    }
    private Author() {
      firstName_ = "";
      lastName_ = "";
    }

    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return book.BookOuterClass.internal_static_book_Author_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return book.BookOuterClass.internal_static_book_Author_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              book.BookOuterClass.Author.class, book.BookOuterClass.Author.Builder.class);
    }

    public static final int FIRST_NAME_FIELD_NUMBER = 1;
    @SuppressWarnings("serial")
    private volatile java.lang.Object firstName_ = "";
    /**
     * <code>string first_name = 1;</code>
     * @return The firstName.
     */
    @java.lang.Override
    public java.lang.String getFirstName() {
      java.lang.Object ref = firstName_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        firstName_ = s;
        return s;
      }
    }
    /**
     * <code>string first_name = 1;</code>
     * @return The bytes for firstName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getFirstNameBytes() {
      java.lang.Object ref = firstName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        firstName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int LAST_NAME_FIELD_NUMBER = 2;
    @SuppressWarnings("serial")
    private volatile java.lang.Object lastName_ = "";
    /**
     * <code>string last_name = 2;</code>
     * @return The lastName.
     */
    @java.lang.Override
    public java.lang.String getLastName() {
      java.lang.Object ref = lastName_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        lastName_ = s;
        return s;
      }
    }
    /**
     * <code>string last_name = 2;</code>
     * @return The bytes for lastName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getLastNameBytes() {
      java.lang.Object ref = lastName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        lastName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(firstName_)) {
        com.google.protobuf.GeneratedMessage.writeString(output, 1, firstName_);
      }
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(lastName_)) {
        com.google.protobuf.GeneratedMessage.writeString(output, 2, lastName_);
      }
      getUnknownFields().writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(firstName_)) {
        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, firstName_);
      }
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(lastName_)) {
        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, lastName_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof book.BookOuterClass.Author)) {
        return super.equals(obj);
      }
      book.BookOuterClass.Author other = (book.BookOuterClass.Author) obj;

      if (!getFirstName()
          .equals(other.getFirstName())) return false;
      if (!getLastName()
          .equals(other.getLastName())) return false;
      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      hash = (37 * hash) + FIRST_NAME_FIELD_NUMBER;
      hash = (53 * hash) + getFirstName().hashCode();
      hash = (37 * hash) + LAST_NAME_FIELD_NUMBER;
      hash = (53 * hash) + getLastName().hashCode();
      hash = (29 * hash) + getUnknownFields().hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static book.BookOuterClass.Author parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.Author parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.Author parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.Author parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.Author parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.Author parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.Author parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input);
    }
    public static book.BookOuterClass.Author parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    public static book.BookOuterClass.Author parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseDelimitedWithIOException(PARSER, input);
    }

    public static book.BookOuterClass.Author parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static book.BookOuterClass.Author parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input);
    }
    public static book.BookOuterClass.Author parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(book.BookOuterClass.Author prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code book.Author}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:book.Author)
        book.BookOuterClass.AuthorOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return book.BookOuterClass.internal_static_book_Author_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return book.BookOuterClass.internal_static_book_Author_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                book.BookOuterClass.Author.class, book.BookOuterClass.Author.Builder.class);
      }

      // Construct using book.BookOuterClass.Author.newBuilder()
      private Builder() {

      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);

      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        bitField0_ = 0;
        firstName_ = "";
        lastName_ = "";
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return book.BookOuterClass.internal_static_book_Author_descriptor;
      }

      @java.lang.Override
      public book.BookOuterClass.Author getDefaultInstanceForType() {
        return book.BookOuterClass.Author.getDefaultInstance();
      }

      @java.lang.Override
      public book.BookOuterClass.Author build() {
        book.BookOuterClass.Author result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public book.BookOuterClass.Author buildPartial() {
        book.BookOuterClass.Author result = new book.BookOuterClass.Author(this);
        if (bitField0_ != 0) { buildPartial0(result); }
        onBuilt();
        return result;
      }

      private void buildPartial0(book.BookOuterClass.Author result) {
        int from_bitField0_ = bitField0_;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.firstName_ = firstName_;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.lastName_ = lastName_;
        }
      }

      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof book.BookOuterClass.Author) {
          return mergeFrom((book.BookOuterClass.Author)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(book.BookOuterClass.Author other) {
        if (other == book.BookOuterClass.Author.getDefaultInstance()) return this;
        if (!other.getFirstName().isEmpty()) {
          firstName_ = other.firstName_;
          bitField0_ |= 0x00000001;
          onChanged();
        }
        if (!other.getLastName().isEmpty()) {
          lastName_ = other.lastName_;
          bitField0_ |= 0x00000002;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                firstName_ = input.readStringRequireUtf8();
                bitField0_ |= 0x00000001;
                break;
              } // case 10
              case 18: {
                lastName_ = input.readStringRequireUtf8();
                bitField0_ |= 0x00000002;
                break;
              } // case 18
              default: {
                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
                  done = true; // was an endgroup tag
                }
                break;
              } // default:
            } // switch (tag)
          } // while (!done)
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.unwrapIOException();
        } finally {
          onChanged();
        } // finally
        return this;
      }
      private int bitField0_;

      private java.lang.Object firstName_ = "";
      /**
       * <code>string first_name = 1;</code>
       * @return The firstName.
       */
      public java.lang.String getFirstName() {
        java.lang.Object ref = firstName_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          firstName_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>string first_name = 1;</code>
       * @return The bytes for firstName.
       */
      public com.google.protobuf.ByteString
          getFirstNameBytes() {
        java.lang.Object ref = firstName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          firstName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>string first_name = 1;</code>
       * @param value The firstName to set.
       * @return This builder for chaining.
       */
      public Builder setFirstName(
          java.lang.String value) {
        if (value == null) { throw new NullPointerException(); }
        firstName_ = value;
        bitField0_ |= 0x00000001;
        onChanged();
        return this;
      }
      /**
       * <code>string first_name = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearFirstName() {
        firstName_ = getDefaultInstance().getFirstName();
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }
      /**
       * <code>string first_name = 1;</code>
       * @param value The bytes for firstName to set.
       * @return This builder for chaining.
       */
      public Builder setFirstNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) { throw new NullPointerException(); }
        checkByteStringIsUtf8(value);
        firstName_ = value;
        bitField0_ |= 0x00000001;
        onChanged();
        return this;
      }

      private java.lang.Object lastName_ = "";
      /**
       * <code>string last_name = 2;</code>
       * @return The lastName.
       */
      public java.lang.String getLastName() {
        java.lang.Object ref = lastName_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          lastName_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>string last_name = 2;</code>
       * @return The bytes for lastName.
       */
      public com.google.protobuf.ByteString
          getLastNameBytes() {
        java.lang.Object ref = lastName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          lastName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>string last_name = 2;</code>
       * @param value The lastName to set.
       * @return This builder for chaining.
       */
      public Builder setLastName(
          java.lang.String value) {
        if (value == null) { throw new NullPointerException(); }
        lastName_ = value;
        bitField0_ |= 0x00000002;
        onChanged();
        return this;
      }
      /**
       * <code>string last_name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearLastName() {
        lastName_ = getDefaultInstance().getLastName();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }
      /**
       * <code>string last_name = 2;</code>
       * @param value The bytes for lastName to set.
       * @return This builder for chaining.
       */
      public Builder setLastNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) { throw new NullPointerException(); }
        checkByteStringIsUtf8(value);
        lastName_ = value;
        bitField0_ |= 0x00000002;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:book.Author)
    }

    // @@protoc_insertion_point(class_scope:book.Author)
    private static final book.BookOuterClass.Author DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new book.BookOuterClass.Author();
    }

    public static book.BookOuterClass.Author getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    private static final com.google.protobuf.Parser<Author>
        PARSER = new com.google.protobuf.AbstractParser<Author>() {
      @java.lang.Override
      public Author parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        Builder builder = newBuilder();
        try {
          builder.mergeFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(builder.buildPartial());
        } catch (com.google.protobuf.UninitializedMessageException e) {
          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(e)
              .setUnfinishedMessage(builder.buildPartial());
        }
        return builder.buildPartial();
      }
    };

    public static com.google.protobuf.Parser<Author> parser() {
      return PARSER;
    }

    @java.lang.Override
    public com.google.protobuf.Parser<Author> getParserForType() {
      return PARSER;
    }

    @java.lang.Override
    public book.BookOuterClass.Author getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BookOrBuilder extends
      // @@protoc_insertion_point(interface_extends:book.Book)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>string title = 1;</code>
     * @return The title.
     */
    java.lang.String getTitle();
    /**
     * <code>string title = 1;</code>
     * @return The bytes for title.
     */
    com.google.protobuf.ByteString
        getTitleBytes();

    /**
     * <code>.book.Author author = 2;</code>
     * @return Whether the author field is set.
     */
    boolean hasAuthor();
    /**
     * <code>.book.Author author = 2;</code>
     * @return The author.
     */
    book.BookOuterClass.Author getAuthor();
    /**
     * <code>.book.Author author = 2;</code>
     */
    book.BookOuterClass.AuthorOrBuilder getAuthorOrBuilder();

    /**
     * <code>string isbn = 3;</code>
     * @return The isbn.
     */
    java.lang.String getIsbn();
    /**
     * <code>string isbn = 3;</code>
     * @return The bytes for isbn.
     */
    com.google.protobuf.ByteString
        getIsbnBytes();

    /**
     * <code>uint32 publication_year = 4;</code>
     * @return The publicationYear.
     */
    int getPublicationYear();

    /**
     * <code>.book.Genre genre = 5;</code>
     * @return The enum numeric value on the wire for genre.
     */
    int getGenreValue();
    /**
     * <code>.book.Genre genre = 5;</code>
     * @return The genre.
     */
    book.BookOuterClass.Genre getGenre();

    /**
     * <code>repeated string tags = 6;</code>
     * @return A list containing the tags.
     */
    java.util.List<java.lang.String>
        getTagsList();
    /**
     * <code>repeated string tags = 6;</code>
     * @return The count of tags.
     */
    int getTagsCount();
    /**
     * <code>repeated string tags = 6;</code>
     * @param index The index of the element to return.
     * @return The tags at the given index.
     */
    java.lang.String getTags(int index);
    /**
     * <code>repeated string tags = 6;</code>
     * @param index The index of the value to return.
     * @return The bytes of the tags at the given index.
     */
    com.google.protobuf.ByteString
        getTagsBytes(int index);
  }
  /**
   * Protobuf type {@code book.Book}
   */
  public static final class Book extends
      com.google.protobuf.GeneratedMessage implements
      // @@protoc_insertion_point(message_implements:book.Book)
      BookOrBuilder {
  private static final long serialVersionUID = 0L;
    static {
      com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
        com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
        /* major= */ 4,
        /* minor= */ 33,
        /* patch= */ 0,
        /* suffix= */ "",
        "Book");
    }
    // Use Book.newBuilder() to construct.
    private Book(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
    }
    private Book() {
      title_ = "";
      isbn_ = "";
      genre_ = 0;
      tags_ =
          com.google.protobuf.LazyStringArrayList.emptyList();
    }

    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return book.BookOuterClass.internal_static_book_Book_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return book.BookOuterClass.internal_static_book_Book_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              book.BookOuterClass.Book.class, book.BookOuterClass.Book.Builder.class);
    }

    private int bitField0_;
    public static final int TITLE_FIELD_NUMBER = 1;
    @SuppressWarnings("serial")
    private volatile java.lang.Object title_ = "";
    /**
     * <code>string title = 1;</code>
     * @return The title.
     */
    @java.lang.Override
    public java.lang.String getTitle() {
      java.lang.Object ref = title_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        title_ = s;
        return s;
      }
    }
    /**
     * <code>string title = 1;</code>
     * @return The bytes for title.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getTitleBytes() {
      java.lang.Object ref = title_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        title_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int AUTHOR_FIELD_NUMBER = 2;
    private book.BookOuterClass.Author author_;
    /**
     * <code>.book.Author author = 2;</code>
     * @return Whether the author field is set.
     */
    @java.lang.Override
    public boolean hasAuthor() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>.book.Author author = 2;</code>
     * @return The author.
     */
    @java.lang.Override
    public book.BookOuterClass.Author getAuthor() {
      return author_ == null ? book.BookOuterClass.Author.getDefaultInstance() : author_;
    }
    /**
     * <code>.book.Author author = 2;</code>
     */
    @java.lang.Override
    public book.BookOuterClass.AuthorOrBuilder getAuthorOrBuilder() {
      return author_ == null ? book.BookOuterClass.Author.getDefaultInstance() : author_;
    }

    public static final int ISBN_FIELD_NUMBER = 3;
    @SuppressWarnings("serial")
    private volatile java.lang.Object isbn_ = "";
    /**
     * <code>string isbn = 3;</code>
     * @return The isbn.
     */
    @java.lang.Override
    public java.lang.String getIsbn() {
      java.lang.Object ref = isbn_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        isbn_ = s;
        return s;
      }
    }
    /**
     * <code>string isbn = 3;</code>
     * @return The bytes for isbn.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getIsbnBytes() {
      java.lang.Object ref = isbn_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        isbn_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int PUBLICATION_YEAR_FIELD_NUMBER = 4;
    private int publicationYear_ = 0;
    /**
     * <code>uint32 publication_year = 4;</code>
     * @return The publicationYear.
     */
    @java.lang.Override
    public int getPublicationYear() {
      return publicationYear_;
    }

    public static final int GENRE_FIELD_NUMBER = 5;
    private int genre_ = 0;
    /**
     * <code>.book.Genre genre = 5;</code>
     * @return The enum numeric value on the wire for genre.
     */
    @java.lang.Override public int getGenreValue() {
      return genre_;
    }
    /**
     * <code>.book.Genre genre = 5;</code>
     * @return The genre.
     */
    @java.lang.Override public book.BookOuterClass.Genre getGenre() {
      book.BookOuterClass.Genre result = book.BookOuterClass.Genre.forNumber(genre_);
      return result == null ? book.BookOuterClass.Genre.UNRECOGNIZED : result;
    }

    public static final int TAGS_FIELD_NUMBER = 6;
    @SuppressWarnings("serial")
    private com.google.protobuf.LazyStringArrayList tags_ =
        com.google.protobuf.LazyStringArrayList.emptyList();
    /**
     * <code>repeated string tags = 6;</code>
     * @return A list containing the tags.
     */
    public com.google.protobuf.ProtocolStringList
        getTagsList() {
      return tags_;
    }
    /**
     * <code>repeated string tags = 6;</code>
     * @return The count of tags.
     */
    public int getTagsCount() {
      return tags_.size();
    }
    /**
     * <code>repeated string tags = 6;</code>
     * @param index The index of the element to return.
     * @return The tags at the given index.
     */
    public java.lang.String getTags(int index) {
      return tags_.get(index);
    }
    /**
     * <code>repeated string tags = 6;</code>
     * @param index The index of the value to return.
     * @return The bytes of the tags at the given index.
     */
    public com.google.protobuf.ByteString
        getTagsBytes(int index) {
      return tags_.getByteString(index);
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(title_)) {
        com.google.protobuf.GeneratedMessage.writeString(output, 1, title_);
      }
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(2, getAuthor());
      }
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(isbn_)) {
        com.google.protobuf.GeneratedMessage.writeString(output, 3, isbn_);
      }
      if (publicationYear_ != 0) {
        output.writeUInt32(4, publicationYear_);
      }
      if (genre_ != book.BookOuterClass.Genre.UNKNOWN.getNumber()) {
        output.writeEnum(5, genre_);
      }
      for (int i = 0; i < tags_.size(); i++) {
        com.google.protobuf.GeneratedMessage.writeString(output, 6, tags_.getRaw(i));
      }
      getUnknownFields().writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(title_)) {
        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, title_);
      }
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, getAuthor());
      }
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(isbn_)) {
        size += com.google.protobuf.GeneratedMessage.computeStringSize(3, isbn_);
      }
      if (publicationYear_ != 0) {
        size += com.google.protobuf.CodedOutputStream
          .computeUInt32Size(4, publicationYear_);
      }
      if (genre_ != book.BookOuterClass.Genre.UNKNOWN.getNumber()) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(5, genre_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < tags_.size(); i++) {
          dataSize += computeStringSizeNoTag(tags_.getRaw(i));
        }
        size += dataSize;
        size += 1 * getTagsList().size();
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof book.BookOuterClass.Book)) {
        return super.equals(obj);
      }
      book.BookOuterClass.Book other = (book.BookOuterClass.Book) obj;

      if (!getTitle()
          .equals(other.getTitle())) return false;
      if (hasAuthor() != other.hasAuthor()) return false;
      if (hasAuthor()) {
        if (!getAuthor()
            .equals(other.getAuthor())) return false;
      }
      if (!getIsbn()
          .equals(other.getIsbn())) return false;
      if (getPublicationYear()
          != other.getPublicationYear()) return false;
      if (genre_ != other.genre_) return false;
      if (!getTagsList()
          .equals(other.getTagsList())) return false;
      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      hash = (37 * hash) + TITLE_FIELD_NUMBER;
      hash = (53 * hash) + getTitle().hashCode();
      if (hasAuthor()) {
        hash = (37 * hash) + AUTHOR_FIELD_NUMBER;
        hash = (53 * hash) + getAuthor().hashCode();
      }
      hash = (37 * hash) + ISBN_FIELD_NUMBER;
      hash = (53 * hash) + getIsbn().hashCode();
      hash = (37 * hash) + PUBLICATION_YEAR_FIELD_NUMBER;
      hash = (53 * hash) + getPublicationYear();
      hash = (37 * hash) + GENRE_FIELD_NUMBER;
      hash = (53 * hash) + genre_;
      if (getTagsCount() > 0) {
        hash = (37 * hash) + TAGS_FIELD_NUMBER;
        hash = (53 * hash) + getTagsList().hashCode();
      }
      hash = (29 * hash) + getUnknownFields().hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static book.BookOuterClass.Book parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.Book parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.Book parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.Book parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.Book parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.Book parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.Book parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input);
    }
    public static book.BookOuterClass.Book parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    public static book.BookOuterClass.Book parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseDelimitedWithIOException(PARSER, input);
    }

    public static book.BookOuterClass.Book parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static book.BookOuterClass.Book parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input);
    }
    public static book.BookOuterClass.Book parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(book.BookOuterClass.Book prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code book.Book}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:book.Book)
        book.BookOuterClass.BookOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return book.BookOuterClass.internal_static_book_Book_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return book.BookOuterClass.internal_static_book_Book_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                book.BookOuterClass.Book.class, book.BookOuterClass.Book.Builder.class);
      }

      // Construct using book.BookOuterClass.Book.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage
                .alwaysUseFieldBuilders) {
          internalGetAuthorFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        bitField0_ = 0;
        title_ = "";
        author_ = null;
        if (authorBuilder_ != null) {
          authorBuilder_.dispose();
          authorBuilder_ = null;
        }
        isbn_ = "";
        publicationYear_ = 0;
        genre_ = 0;
        tags_ =
            com.google.protobuf.LazyStringArrayList.emptyList();
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return book.BookOuterClass.internal_static_book_Book_descriptor;
      }

      @java.lang.Override
      public book.BookOuterClass.Book getDefaultInstanceForType() {
        return book.BookOuterClass.Book.getDefaultInstance();
      }

      @java.lang.Override
      public book.BookOuterClass.Book build() {
        book.BookOuterClass.Book result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public book.BookOuterClass.Book buildPartial() {
        book.BookOuterClass.Book result = new book.BookOuterClass.Book(this);
        if (bitField0_ != 0) { buildPartial0(result); }
        onBuilt();
        return result;
      }

      private void buildPartial0(book.BookOuterClass.Book result) {
        int from_bitField0_ = bitField0_;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.title_ = title_;
        }
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.author_ = authorBuilder_ == null
              ? author_
              : authorBuilder_.build();
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.isbn_ = isbn_;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.publicationYear_ = publicationYear_;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          result.genre_ = genre_;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          tags_.makeImmutable();
          result.tags_ = tags_;
        }
        result.bitField0_ |= to_bitField0_;
      }

      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof book.BookOuterClass.Book) {
          return mergeFrom((book.BookOuterClass.Book)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(book.BookOuterClass.Book other) {
        if (other == book.BookOuterClass.Book.getDefaultInstance()) return this;
        if (!other.getTitle().isEmpty()) {
          title_ = other.title_;
          bitField0_ |= 0x00000001;
          onChanged();
        }
        if (other.hasAuthor()) {
          mergeAuthor(other.getAuthor());
        }
        if (!other.getIsbn().isEmpty()) {
          isbn_ = other.isbn_;
          bitField0_ |= 0x00000004;
          onChanged();
        }
        if (other.getPublicationYear() != 0) {
          setPublicationYear(other.getPublicationYear());
        }
        if (other.genre_ != 0) {
          setGenreValue(other.getGenreValue());
        }
        if (!other.tags_.isEmpty()) {
          if (tags_.isEmpty()) {
            tags_ = other.tags_;
            bitField0_ |= 0x00000020;
          } else {
            ensureTagsIsMutable();
            tags_.addAll(other.tags_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                title_ = input.readStringRequireUtf8();
                bitField0_ |= 0x00000001;
                break;
              } // case 10
              case 18: {
                input.readMessage(
                    internalGetAuthorFieldBuilder().getBuilder(),
                    extensionRegistry);
                bitField0_ |= 0x00000002;
                break;
              } // case 18
              case 26: {
                isbn_ = input.readStringRequireUtf8();
                bitField0_ |= 0x00000004;
                break;
              } // case 26
              case 32: {
                publicationYear_ = input.readUInt32();
                bitField0_ |= 0x00000008;
                break;
              } // case 32
              case 40: {
                genre_ = input.readEnum();
                bitField0_ |= 0x00000010;
                break;
              } // case 40
              case 50: {
                java.lang.String s = input.readStringRequireUtf8();
                ensureTagsIsMutable();
                tags_.add(s);
                break;
              } // case 50
              default: {
                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
                  done = true; // was an endgroup tag
                }
                break;
              } // default:
            } // switch (tag)
          } // while (!done)
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.unwrapIOException();
        } finally {
          onChanged();
        } // finally
        return this;
      }
      private int bitField0_;

      private java.lang.Object title_ = "";
      /**
       * <code>string title = 1;</code>
       * @return The title.
       */
      public java.lang.String getTitle() {
        java.lang.Object ref = title_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          title_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>string title = 1;</code>
       * @return The bytes for title.
       */
      public com.google.protobuf.ByteString
          getTitleBytes() {
        java.lang.Object ref = title_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          title_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>string title = 1;</code>
       * @param value The title to set.
       * @return This builder for chaining.
       */
      public Builder setTitle(
          java.lang.String value) {
        if (value == null) { throw new NullPointerException(); }
        title_ = value;
        bitField0_ |= 0x00000001;
        onChanged();
        return this;
      }
      /**
       * <code>string title = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearTitle() {
        title_ = getDefaultInstance().getTitle();
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }
      /**
       * <code>string title = 1;</code>
       * @param value The bytes for title to set.
       * @return This builder for chaining.
       */
      public Builder setTitleBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) { throw new NullPointerException(); }
        checkByteStringIsUtf8(value);
        title_ = value;
        bitField0_ |= 0x00000001;
        onChanged();
        return this;
      }

      private book.BookOuterClass.Author author_;
      private com.google.protobuf.SingleFieldBuilder<
          book.BookOuterClass.Author, book.BookOuterClass.Author.Builder, book.BookOuterClass.AuthorOrBuilder> authorBuilder_;
      /**
       * <code>.book.Author author = 2;</code>
       * @return Whether the author field is set.
       */
      public boolean hasAuthor() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>.book.Author author = 2;</code>
       * @return The author.
       */
      public book.BookOuterClass.Author getAuthor() {
        if (authorBuilder_ == null) {
          return author_ == null ? book.BookOuterClass.Author.getDefaultInstance() : author_;
        } else {
          return authorBuilder_.getMessage();
        }
      }
      /**
       * <code>.book.Author author = 2;</code>
       */
      public Builder setAuthor(book.BookOuterClass.Author value) {
        if (authorBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          author_ = value;
        } else {
          authorBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        onChanged();
        return this;
      }
      /**
       * <code>.book.Author author = 2;</code>
       */
      public Builder setAuthor(
          book.BookOuterClass.Author.Builder builderForValue) {
        if (authorBuilder_ == null) {
          author_ = builderForValue.build();
        } else {
          authorBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        onChanged();
        return this;
      }
      /**
       * <code>.book.Author author = 2;</code>
       */
      public Builder mergeAuthor(book.BookOuterClass.Author value) {
        if (authorBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
            author_ != null &&
            author_ != book.BookOuterClass.Author.getDefaultInstance()) {
            getAuthorBuilder().mergeFrom(value);
          } else {
            author_ = value;
          }
        } else {
          authorBuilder_.mergeFrom(value);
        }
        if (author_ != null) {
          bitField0_ |= 0x00000002;
          onChanged();
        }
        return this;
      }
      /**
       * <code>.book.Author author = 2;</code>
       */
      public Builder clearAuthor() {
        bitField0_ = (bitField0_ & ~0x00000002);
        author_ = null;
        if (authorBuilder_ != null) {
          authorBuilder_.dispose();
          authorBuilder_ = null;
        }
        onChanged();
        return this;
      }
      /**
       * <code>.book.Author author = 2;</code>
       */
      public book.BookOuterClass.Author.Builder getAuthorBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return internalGetAuthorFieldBuilder().getBuilder();
      }
      /**
       * <code>.book.Author author = 2;</code>
       */
      public book.BookOuterClass.AuthorOrBuilder getAuthorOrBuilder() {
        if (authorBuilder_ != null) {
          return authorBuilder_.getMessageOrBuilder();
        } else {
          return author_ == null ?
              book.BookOuterClass.Author.getDefaultInstance() : author_;
        }
      }
      /**
       * <code>.book.Author author = 2;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          book.BookOuterClass.Author, book.BookOuterClass.Author.Builder, book.BookOuterClass.AuthorOrBuilder> 
          internalGetAuthorFieldBuilder() {
        if (authorBuilder_ == null) {
          authorBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              book.BookOuterClass.Author, book.BookOuterClass.Author.Builder, book.BookOuterClass.AuthorOrBuilder>(
                  getAuthor(),
                  getParentForChildren(),
                  isClean());
          author_ = null;
        }
        return authorBuilder_;
      }

      private java.lang.Object isbn_ = "";
      /**
       * <code>string isbn = 3;</code>
       * @return The isbn.
       */
      public java.lang.String getIsbn() {
        java.lang.Object ref = isbn_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          isbn_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>string isbn = 3;</code>
       * @return The bytes for isbn.
       */
      public com.google.protobuf.ByteString
          getIsbnBytes() {
        java.lang.Object ref = isbn_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          isbn_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>string isbn = 3;</code>
       * @param value The isbn to set.
       * @return This builder for chaining.
       */
      public Builder setIsbn(
          java.lang.String value) {
        if (value == null) { throw new NullPointerException(); }
        isbn_ = value;
        bitField0_ |= 0x00000004;
        onChanged();
        return this;
      }
      /**
       * <code>string isbn = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearIsbn() {
        isbn_ = getDefaultInstance().getIsbn();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }
      /**
       * <code>string isbn = 3;</code>
       * @param value The bytes for isbn to set.
       * @return This builder for chaining.
       */
      public Builder setIsbnBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) { throw new NullPointerException(); }
        checkByteStringIsUtf8(value);
        isbn_ = value;
        bitField0_ |= 0x00000004;
        onChanged();
        return this;
      }

      private int publicationYear_ ;
      /**
       * <code>uint32 publication_year = 4;</code>
       * @return The publicationYear.
       */
      @java.lang.Override
      public int getPublicationYear() {
        return publicationYear_;
      }
      /**
       * <code>uint32 publication_year = 4;</code>
       * @param value The publicationYear to set.
       * @return This builder for chaining.
       */
      public Builder setPublicationYear(int value) {

        publicationYear_ = value;
        bitField0_ |= 0x00000008;
        onChanged();
        return this;
      }
      /**
       * <code>uint32 publication_year = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearPublicationYear() {
        bitField0_ = (bitField0_ & ~0x00000008);
        publicationYear_ = 0;
        onChanged();
        return this;
      }

      private int genre_ = 0;
      /**
       * <code>.book.Genre genre = 5;</code>
       * @return The enum numeric value on the wire for genre.
       */
      @java.lang.Override public int getGenreValue() {
        return genre_;
      }
      /**
       * <code>.book.Genre genre = 5;</code>
       * @param value The enum numeric value on the wire for genre to set.
       * @return This builder for chaining.
       */
      public Builder setGenreValue(int value) {
        genre_ = value;
        bitField0_ |= 0x00000010;
        onChanged();
        return this;
      }
      /**
       * <code>.book.Genre genre = 5;</code>
       * @return The genre.
       */
      @java.lang.Override
      public book.BookOuterClass.Genre getGenre() {
        book.BookOuterClass.Genre result = book.BookOuterClass.Genre.forNumber(genre_);
        return result == null ? book.BookOuterClass.Genre.UNRECOGNIZED : result;
      }
      /**
       * <code>.book.Genre genre = 5;</code>
       * @param value The genre to set.
       * @return This builder for chaining.
       */
      public Builder setGenre(book.BookOuterClass.Genre value) {
        if (value == null) { throw new NullPointerException(); }
        bitField0_ |= 0x00000010;
        genre_ = value.getNumber();
        onChanged();
        return this;
      }
      /**
       * <code>.book.Genre genre = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearGenre() {
        bitField0_ = (bitField0_ & ~0x00000010);
        genre_ = 0;
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringArrayList tags_ =
          com.google.protobuf.LazyStringArrayList.emptyList();
      private void ensureTagsIsMutable() {
        if (!tags_.isModifiable()) {
          tags_ = new com.google.protobuf.LazyStringArrayList(tags_);
        }
        bitField0_ |= 0x00000020;
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @return A list containing the tags.
       */
      public com.google.protobuf.ProtocolStringList
          getTagsList() {
        tags_.makeImmutable();
        return tags_;
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @return The count of tags.
       */
      public int getTagsCount() {
        return tags_.size();
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @param index The index of the element to return.
       * @return The tags at the given index.
       */
      public java.lang.String getTags(int index) {
        return tags_.get(index);
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @param index The index of the value to return.
       * @return The bytes of the tags at the given index.
       */
      public com.google.protobuf.ByteString
          getTagsBytes(int index) {
        return tags_.getByteString(index);
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @param index The index to set the value at.
       * @param value The tags to set.
       * @return This builder for chaining.
       */
      public Builder setTags(
          int index, java.lang.String value) {
        if (value == null) { throw new NullPointerException(); }
        ensureTagsIsMutable();
        tags_.set(index, value);
        bitField0_ |= 0x00000020;
        onChanged();
        return this;
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @param value The tags to add.
       * @return This builder for chaining.
       */
      public Builder addTags(
          java.lang.String value) {
        if (value == null) { throw new NullPointerException(); }
        ensureTagsIsMutable();
        tags_.add(value);
        bitField0_ |= 0x00000020;
        onChanged();
        return this;
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @param values The tags to add.
       * @return This builder for chaining.
       */
      public Builder addAllTags(
          java.lang.Iterable<java.lang.String> values) {
        ensureTagsIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, tags_);
        bitField0_ |= 0x00000020;
        onChanged();
        return this;
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearTags() {
        tags_ =
          com.google.protobuf.LazyStringArrayList.emptyList();
        bitField0_ = (bitField0_ & ~0x00000020);;
        onChanged();
        return this;
      }
      /**
       * <code>repeated string tags = 6;</code>
       * @param value The bytes of the tags to add.
       * @return This builder for chaining.
       */
      public Builder addTagsBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) { throw new NullPointerException(); }
        checkByteStringIsUtf8(value);
        ensureTagsIsMutable();
        tags_.add(value);
        bitField0_ |= 0x00000020;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:book.Book)
    }

    // @@protoc_insertion_point(class_scope:book.Book)
    private static final book.BookOuterClass.Book DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new book.BookOuterClass.Book();
    }

    public static book.BookOuterClass.Book getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    private static final com.google.protobuf.Parser<Book>
        PARSER = new com.google.protobuf.AbstractParser<Book>() {
      @java.lang.Override
      public Book parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        Builder builder = newBuilder();
        try {
          builder.mergeFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(builder.buildPartial());
        } catch (com.google.protobuf.UninitializedMessageException e) {
          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(e)
              .setUnfinishedMessage(builder.buildPartial());
        }
        return builder.buildPartial();
      }
    };

    public static com.google.protobuf.Parser<Book> parser() {
      return PARSER;
    }

    @java.lang.Override
    public com.google.protobuf.Parser<Book> getParserForType() {
      return PARSER;
    }

    @java.lang.Override
    public book.BookOuterClass.Book getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BookRequestOrBuilder extends
      // @@protoc_insertion_point(interface_extends:book.BookRequest)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>string isbn = 1;</code>
     * @return The isbn.
     */
    java.lang.String getIsbn();
    /**
     * <code>string isbn = 1;</code>
     * @return The bytes for isbn.
     */
    com.google.protobuf.ByteString
        getIsbnBytes();
  }
  /**
   * Protobuf type {@code book.BookRequest}
   */
  public static final class BookRequest extends
      com.google.protobuf.GeneratedMessage implements
      // @@protoc_insertion_point(message_implements:book.BookRequest)
      BookRequestOrBuilder {
  private static final long serialVersionUID = 0L;
    static {
      com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
        com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
        /* major= */ 4,
        /* minor= */ 33,
        /* patch= */ 0,
        /* suffix= */ "",
        "BookRequest");
    }
    // Use BookRequest.newBuilder() to construct.
    private BookRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
    }
    private BookRequest() {
      isbn_ = "";
    }

    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return book.BookOuterClass.internal_static_book_BookRequest_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return book.BookOuterClass.internal_static_book_BookRequest_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              book.BookOuterClass.BookRequest.class, book.BookOuterClass.BookRequest.Builder.class);
    }

    public static final int ISBN_FIELD_NUMBER = 1;
    @SuppressWarnings("serial")
    private volatile java.lang.Object isbn_ = "";
    /**
     * <code>string isbn = 1;</code>
     * @return The isbn.
     */
    @java.lang.Override
    public java.lang.String getIsbn() {
      java.lang.Object ref = isbn_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        isbn_ = s;
        return s;
      }
    }
    /**
     * <code>string isbn = 1;</code>
     * @return The bytes for isbn.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getIsbnBytes() {
      java.lang.Object ref = isbn_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        isbn_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(isbn_)) {
        com.google.protobuf.GeneratedMessage.writeString(output, 1, isbn_);
      }
      getUnknownFields().writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(isbn_)) {
        size += com.google.protobuf.GeneratedMessage.computeStringSize(1, isbn_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof book.BookOuterClass.BookRequest)) {
        return super.equals(obj);
      }
      book.BookOuterClass.BookRequest other = (book.BookOuterClass.BookRequest) obj;

      if (!getIsbn()
          .equals(other.getIsbn())) return false;
      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      hash = (37 * hash) + ISBN_FIELD_NUMBER;
      hash = (53 * hash) + getIsbn().hashCode();
      hash = (29 * hash) + getUnknownFields().hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static book.BookOuterClass.BookRequest parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.BookRequest parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.BookRequest parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.BookRequest parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.BookRequest parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.BookRequest parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.BookRequest parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input);
    }
    public static book.BookOuterClass.BookRequest parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    public static book.BookOuterClass.BookRequest parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseDelimitedWithIOException(PARSER, input);
    }

    public static book.BookOuterClass.BookRequest parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static book.BookOuterClass.BookRequest parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input);
    }
    public static book.BookOuterClass.BookRequest parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(book.BookOuterClass.BookRequest prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code book.BookRequest}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:book.BookRequest)
        book.BookOuterClass.BookRequestOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return book.BookOuterClass.internal_static_book_BookRequest_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return book.BookOuterClass.internal_static_book_BookRequest_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                book.BookOuterClass.BookRequest.class, book.BookOuterClass.BookRequest.Builder.class);
      }

      // Construct using book.BookOuterClass.BookRequest.newBuilder()
      private Builder() {

      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);

      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        bitField0_ = 0;
        isbn_ = "";
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return book.BookOuterClass.internal_static_book_BookRequest_descriptor;
      }

      @java.lang.Override
      public book.BookOuterClass.BookRequest getDefaultInstanceForType() {
        return book.BookOuterClass.BookRequest.getDefaultInstance();
      }

      @java.lang.Override
      public book.BookOuterClass.BookRequest build() {
        book.BookOuterClass.BookRequest result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public book.BookOuterClass.BookRequest buildPartial() {
        book.BookOuterClass.BookRequest result = new book.BookOuterClass.BookRequest(this);
        if (bitField0_ != 0) { buildPartial0(result); }
        onBuilt();
        return result;
      }

      private void buildPartial0(book.BookOuterClass.BookRequest result) {
        int from_bitField0_ = bitField0_;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.isbn_ = isbn_;
        }
      }

      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof book.BookOuterClass.BookRequest) {
          return mergeFrom((book.BookOuterClass.BookRequest)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(book.BookOuterClass.BookRequest other) {
        if (other == book.BookOuterClass.BookRequest.getDefaultInstance()) return this;
        if (!other.getIsbn().isEmpty()) {
          isbn_ = other.isbn_;
          bitField0_ |= 0x00000001;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                isbn_ = input.readStringRequireUtf8();
                bitField0_ |= 0x00000001;
                break;
              } // case 10
              default: {
                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
                  done = true; // was an endgroup tag
                }
                break;
              } // default:
            } // switch (tag)
          } // while (!done)
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.unwrapIOException();
        } finally {
          onChanged();
        } // finally
        return this;
      }
      private int bitField0_;

      private java.lang.Object isbn_ = "";
      /**
       * <code>string isbn = 1;</code>
       * @return The isbn.
       */
      public java.lang.String getIsbn() {
        java.lang.Object ref = isbn_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          isbn_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>string isbn = 1;</code>
       * @return The bytes for isbn.
       */
      public com.google.protobuf.ByteString
          getIsbnBytes() {
        java.lang.Object ref = isbn_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          isbn_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>string isbn = 1;</code>
       * @param value The isbn to set.
       * @return This builder for chaining.
       */
      public Builder setIsbn(
          java.lang.String value) {
        if (value == null) { throw new NullPointerException(); }
        isbn_ = value;
        bitField0_ |= 0x00000001;
        onChanged();
        return this;
      }
      /**
       * <code>string isbn = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearIsbn() {
        isbn_ = getDefaultInstance().getIsbn();
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }
      /**
       * <code>string isbn = 1;</code>
       * @param value The bytes for isbn to set.
       * @return This builder for chaining.
       */
      public Builder setIsbnBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) { throw new NullPointerException(); }
        checkByteStringIsUtf8(value);
        isbn_ = value;
        bitField0_ |= 0x00000001;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:book.BookRequest)
    }

    // @@protoc_insertion_point(class_scope:book.BookRequest)
    private static final book.BookOuterClass.BookRequest DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new book.BookOuterClass.BookRequest();
    }

    public static book.BookOuterClass.BookRequest getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    private static final com.google.protobuf.Parser<BookRequest>
        PARSER = new com.google.protobuf.AbstractParser<BookRequest>() {
      @java.lang.Override
      public BookRequest parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        Builder builder = newBuilder();
        try {
          builder.mergeFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(builder.buildPartial());
        } catch (com.google.protobuf.UninitializedMessageException e) {
          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(e)
              .setUnfinishedMessage(builder.buildPartial());
        }
        return builder.buildPartial();
      }
    };

    public static com.google.protobuf.Parser<BookRequest> parser() {
      return PARSER;
    }

    @java.lang.Override
    public com.google.protobuf.Parser<BookRequest> getParserForType() {
      return PARSER;
    }

    @java.lang.Override
    public book.BookOuterClass.BookRequest getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BookResponseOrBuilder extends
      // @@protoc_insertion_point(interface_extends:book.BookResponse)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>bool success = 1;</code>
     * @return The success.
     */
    boolean getSuccess();

    /**
     * <code>string message = 2;</code>
     * @return The message.
     */
    java.lang.String getMessage();
    /**
     * <code>string message = 2;</code>
     * @return The bytes for message.
     */
    com.google.protobuf.ByteString
        getMessageBytes();
  }
  /**
   * Protobuf type {@code book.BookResponse}
   */
  public static final class BookResponse extends
      com.google.protobuf.GeneratedMessage implements
      // @@protoc_insertion_point(message_implements:book.BookResponse)
      BookResponseOrBuilder {
  private static final long serialVersionUID = 0L;
    static {
      com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
        com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
        /* major= */ 4,
        /* minor= */ 33,
        /* patch= */ 0,
        /* suffix= */ "",
        "BookResponse");
    }
    // Use BookResponse.newBuilder() to construct.
    private BookResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
    }
    private BookResponse() {
      message_ = "";
    }

    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return book.BookOuterClass.internal_static_book_BookResponse_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return book.BookOuterClass.internal_static_book_BookResponse_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              book.BookOuterClass.BookResponse.class, book.BookOuterClass.BookResponse.Builder.class);
    }

    public static final int SUCCESS_FIELD_NUMBER = 1;
    private boolean success_ = false;
    /**
     * <code>bool success = 1;</code>
     * @return The success.
     */
    @java.lang.Override
    public boolean getSuccess() {
      return success_;
    }

    public static final int MESSAGE_FIELD_NUMBER = 2;
    @SuppressWarnings("serial")
    private volatile java.lang.Object message_ = "";
    /**
     * <code>string message = 2;</code>
     * @return The message.
     */
    @java.lang.Override
    public java.lang.String getMessage() {
      java.lang.Object ref = message_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        message_ = s;
        return s;
      }
    }
    /**
     * <code>string message = 2;</code>
     * @return The bytes for message.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getMessageBytes() {
      java.lang.Object ref = message_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        message_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (success_ != false) {
        output.writeBool(1, success_);
      }
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(message_)) {
        com.google.protobuf.GeneratedMessage.writeString(output, 2, message_);
      }
      getUnknownFields().writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (success_ != false) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(1, success_);
      }
      if (!com.google.protobuf.GeneratedMessage.isStringEmpty(message_)) {
        size += com.google.protobuf.GeneratedMessage.computeStringSize(2, message_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof book.BookOuterClass.BookResponse)) {
        return super.equals(obj);
      }
      book.BookOuterClass.BookResponse other = (book.BookOuterClass.BookResponse) obj;

      if (getSuccess()
          != other.getSuccess()) return false;
      if (!getMessage()
          .equals(other.getMessage())) return false;
      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      hash = (37 * hash) + SUCCESS_FIELD_NUMBER;
      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
          getSuccess());
      hash = (37 * hash) + MESSAGE_FIELD_NUMBER;
      hash = (53 * hash) + getMessage().hashCode();
      hash = (29 * hash) + getUnknownFields().hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static book.BookOuterClass.BookResponse parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.BookResponse parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.BookResponse parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.BookResponse parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.BookResponse parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static book.BookOuterClass.BookResponse parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static book.BookOuterClass.BookResponse parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input);
    }
    public static book.BookOuterClass.BookResponse parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    public static book.BookOuterClass.BookResponse parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseDelimitedWithIOException(PARSER, input);
    }

    public static book.BookOuterClass.BookResponse parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static book.BookOuterClass.BookResponse parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input);
    }
    public static book.BookOuterClass.BookResponse parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessage
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(book.BookOuterClass.BookResponse prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code book.BookResponse}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:book.BookResponse)
        book.BookOuterClass.BookResponseOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return book.BookOuterClass.internal_static_book_BookResponse_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return book.BookOuterClass.internal_static_book_BookResponse_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                book.BookOuterClass.BookResponse.class, book.BookOuterClass.BookResponse.Builder.class);
      }

      // Construct using book.BookOuterClass.BookResponse.newBuilder()
      private Builder() {

      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);

      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        bitField0_ = 0;
        success_ = false;
        message_ = "";
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return book.BookOuterClass.internal_static_book_BookResponse_descriptor;
      }

      @java.lang.Override
      public book.BookOuterClass.BookResponse getDefaultInstanceForType() {
        return book.BookOuterClass.BookResponse.getDefaultInstance();
      }

      @java.lang.Override
      public book.BookOuterClass.BookResponse build() {
        book.BookOuterClass.BookResponse result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public book.BookOuterClass.BookResponse buildPartial() {
        book.BookOuterClass.BookResponse result = new book.BookOuterClass.BookResponse(this);
        if (bitField0_ != 0) { buildPartial0(result); }
        onBuilt();
        return result;
      }

      private void buildPartial0(book.BookOuterClass.BookResponse result) {
        int from_bitField0_ = bitField0_;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.success_ = success_;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.message_ = message_;
        }
      }

      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof book.BookOuterClass.BookResponse) {
          return mergeFrom((book.BookOuterClass.BookResponse)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(book.BookOuterClass.BookResponse other) {
        if (other == book.BookOuterClass.BookResponse.getDefaultInstance()) return this;
        if (other.getSuccess() != false) {
          setSuccess(other.getSuccess());
        }
        if (!other.getMessage().isEmpty()) {
          message_ = other.message_;
          bitField0_ |= 0x00000002;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 8: {
                success_ = input.readBool();
                bitField0_ |= 0x00000001;
                break;
              } // case 8
              case 18: {
                message_ = input.readStringRequireUtf8();
                bitField0_ |= 0x00000002;
                break;
              } // case 18
              default: {
                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
                  done = true; // was an endgroup tag
                }
                break;
              } // default:
            } // switch (tag)
          } // while (!done)
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.unwrapIOException();
        } finally {
          onChanged();
        } // finally
        return this;
      }
      private int bitField0_;

      private boolean success_ ;
      /**
       * <code>bool success = 1;</code>
       * @return The success.
       */
      @java.lang.Override
      public boolean getSuccess() {
        return success_;
      }
      /**
       * <code>bool success = 1;</code>
       * @param value The success to set.
       * @return This builder for chaining.
       */
      public Builder setSuccess(boolean value) {

        success_ = value;
        bitField0_ |= 0x00000001;
        onChanged();
        return this;
      }
      /**
       * <code>bool success = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearSuccess() {
        bitField0_ = (bitField0_ & ~0x00000001);
        success_ = false;
        onChanged();
        return this;
      }

      private java.lang.Object message_ = "";
      /**
       * <code>string message = 2;</code>
       * @return The message.
       */
      public java.lang.String getMessage() {
        java.lang.Object ref = message_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          message_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>string message = 2;</code>
       * @return The bytes for message.
       */
      public com.google.protobuf.ByteString
          getMessageBytes() {
        java.lang.Object ref = message_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          message_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>string message = 2;</code>
       * @param value The message to set.
       * @return This builder for chaining.
       */
      public Builder setMessage(
          java.lang.String value) {
        if (value == null) { throw new NullPointerException(); }
        message_ = value;
        bitField0_ |= 0x00000002;
        onChanged();
        return this;
      }
      /**
       * <code>string message = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearMessage() {
        message_ = getDefaultInstance().getMessage();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }
      /**
       * <code>string message = 2;</code>
       * @param value The bytes for message to set.
       * @return This builder for chaining.
       */
      public Builder setMessageBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) { throw new NullPointerException(); }
        checkByteStringIsUtf8(value);
        message_ = value;
        bitField0_ |= 0x00000002;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:book.BookResponse)
    }

    // @@protoc_insertion_point(class_scope:book.BookResponse)
    private static final book.BookOuterClass.BookResponse DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new book.BookOuterClass.BookResponse();
    }

    public static book.BookOuterClass.BookResponse getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    private static final com.google.protobuf.Parser<BookResponse>
        PARSER = new com.google.protobuf.AbstractParser<BookResponse>() {
      @java.lang.Override
      public BookResponse parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        Builder builder = newBuilder();
        try {
          builder.mergeFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(builder.buildPartial());
        } catch (com.google.protobuf.UninitializedMessageException e) {
          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(e)
              .setUnfinishedMessage(builder.buildPartial());
        }
        return builder.buildPartial();
      }
    };

    public static com.google.protobuf.Parser<BookResponse> parser() {
      return PARSER;
    }

    @java.lang.Override
    public com.google.protobuf.Parser<BookResponse> getParserForType() {
      return PARSER;
    }

    @java.lang.Override
    public book.BookOuterClass.BookResponse getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_book_Author_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_book_Author_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_book_Book_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_book_Book_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_book_BookRequest_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_book_BookRequest_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_book_BookResponse_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_book_BookResponse_fieldAccessorTable;

  public static com.google.protobuf.Descriptors.FileDescriptor
      getDescriptor() {
    return descriptor;
  }
  private static  com.google.protobuf.Descriptors.FileDescriptor
      descriptor;
  static {
    java.lang.String[] descriptorData = {
      "\n\024src/proto/book.proto\022\004book\"/\n\006Author\022\022" +
      "\n\nfirst_name\030\001 \001(\t\022\021\n\tlast_name\030\002 \001(\t\"\205\001" +
      "\n\004Book\022\r\n\005title\030\001 \001(\t\022\034\n\006author\030\002 \001(\0132\014." +
      "book.Author\022\014\n\004isbn\030\003 \001(\t\022\030\n\020publication" +
      "_year\030\004 \001(\r\022\032\n\005genre\030\005 \001(\0162\013.book.Genre\022" +
      "\014\n\004tags\030\006 \003(\t\"\033\n\013BookRequest\022\014\n\004isbn\030\001 \001" +
      "(\t\"0\n\014BookResponse\022\017\n\007success\030\001 \001(\010\022\017\n\007m" +
      "essage\030\002 \001(\t*R\n\005Genre\022\013\n\007UNKNOWN\020\000\022\023\n\017SC" +
      "IENCE_FICTION\020\001\022\013\n\007MYSTERY\020\002\022\r\n\tBIOGRAPH" +
      "Y\020\003\022\013\n\007HISTORY\020\0042b\n\013BookService\022(\n\007GetBo" +
      "ok\022\021.book.BookRequest\032\n.book.Book\022)\n\007Add" +
      "Book\022\n.book.Book\032\022.book.BookResponseb\006pr" +
      "oto3"
    };
    descriptor = com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
        });
    internal_static_book_Author_descriptor =
      getDescriptor().getMessageType(0);
    internal_static_book_Author_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
        internal_static_book_Author_descriptor,
        new java.lang.String[] { "FirstName", "LastName", });
    internal_static_book_Book_descriptor =
      getDescriptor().getMessageType(1);
    internal_static_book_Book_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
        internal_static_book_Book_descriptor,
        new java.lang.String[] { "Title", "Author", "Isbn", "PublicationYear", "Genre", "Tags", });
    internal_static_book_BookRequest_descriptor =
      getDescriptor().getMessageType(2);
    internal_static_book_BookRequest_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
        internal_static_book_BookRequest_descriptor,
        new java.lang.String[] { "Isbn", });
    internal_static_book_BookResponse_descriptor =
      getDescriptor().getMessageType(3);
    internal_static_book_BookResponse_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessage.FieldAccessorTable(
        internal_static_book_BookResponse_descriptor,
        new java.lang.String[] { "Success", "Message", });
    descriptor.resolveAllFeaturesImmutable();
  }

  // @@protoc_insertion_point(outer_class_scope)
}
