| Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapEntryLite.java
 | 
| diff --git a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapEntryLite.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapEntryLite.java
 | 
| index 22aef8f93decec9af18c79e149fd03fad1142c3d..12c64abbb4af3473c18c518795f1b5a39c187332 100644
 | 
| --- a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapEntryLite.java
 | 
| +++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/MapEntryLite.java
 | 
| @@ -31,74 +31,80 @@
 | 
|  package com.google.protobuf;
 | 
|  
 | 
|  import java.io.IOException;
 | 
| -import java.util.AbstractMap;
 | 
| -import java.util.Map;
 | 
|  
 | 
|  /**
 | 
|   * Implements the lite version of map entry messages.
 | 
| - *
 | 
| + * 
 | 
|   * This class serves as an utility class to help do serialization/parsing of
 | 
|   * map entries. It's used in generated code and also in the full version
 | 
|   * MapEntry message.
 | 
| - *
 | 
| + * 
 | 
|   * Protobuf internal. Users shouldn't use.
 | 
|   */
 | 
| -public class MapEntryLite<K, V> {
 | 
| -
 | 
| -  static class Metadata<K, V> {
 | 
| +public class MapEntryLite<K, V>
 | 
| +    extends AbstractMessageLite<MapEntryLite<K, V>, MapEntryLite.Builder<K, V>> {
 | 
| +  private static class Metadata<K, V> {
 | 
| +    public final MapEntryLite<K, V> defaultInstance;
 | 
|      public final WireFormat.FieldType keyType;
 | 
| -    public final K defaultKey;
 | 
|      public final WireFormat.FieldType valueType;
 | 
| -    public final V defaultValue;
 | 
| -
 | 
| +    public final Parser<MapEntryLite<K, V>> parser;
 | 
|      public Metadata(
 | 
| -        WireFormat.FieldType keyType, K defaultKey,
 | 
| -        WireFormat.FieldType valueType, V defaultValue) {
 | 
| +        MapEntryLite<K, V> defaultInstance,
 | 
| +        WireFormat.FieldType keyType,
 | 
| +        WireFormat.FieldType valueType) {
 | 
| +      this.defaultInstance = defaultInstance; 
 | 
|        this.keyType = keyType;
 | 
| -      this.defaultKey = defaultKey;
 | 
|        this.valueType = valueType;
 | 
| -      this.defaultValue = defaultValue;
 | 
| +      final Metadata<K, V> finalThis = this;
 | 
| +      this.parser = new AbstractParser<MapEntryLite<K, V>>() {
 | 
| +        @Override
 | 
| +        public MapEntryLite<K, V> parsePartialFrom(
 | 
| +            CodedInputStream input, ExtensionRegistryLite extensionRegistry)
 | 
| +            throws InvalidProtocolBufferException {
 | 
| +          return new MapEntryLite<K, V>(finalThis, input, extensionRegistry);
 | 
| +        }
 | 
| +      };
 | 
|      }
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    private static final int KEY_FIELD_NUMBER = 1;
 | 
|    private static final int VALUE_FIELD_NUMBER = 2;
 | 
| -
 | 
| +  
 | 
|    private final Metadata<K, V> metadata;
 | 
|    private final K key;
 | 
|    private final V value;
 | 
| -
 | 
| +  
 | 
|    /** Creates a default MapEntryLite message instance. */
 | 
|    private MapEntryLite(
 | 
|        WireFormat.FieldType keyType, K defaultKey,
 | 
|        WireFormat.FieldType valueType, V defaultValue) {
 | 
| -    this.metadata = new Metadata<K, V>(keyType, defaultKey, valueType, defaultValue);
 | 
| +    this.metadata = new Metadata<K, V>(this, keyType, valueType);
 | 
|      this.key = defaultKey;
 | 
|      this.value = defaultValue;
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    /** Creates a new MapEntryLite message. */
 | 
|    private MapEntryLite(Metadata<K, V> metadata, K key, V value) {
 | 
|      this.metadata = metadata;
 | 
|      this.key = key;
 | 
|      this.value = value;
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    public K getKey() {
 | 
|      return key;
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    public V getValue() {
 | 
|      return value;
 | 
|    }
 | 
|  
 | 
|    /**
 | 
|     * Creates a default MapEntryLite message instance.
 | 
| -   *
 | 
| +   * 
 | 
|     * This method is used by generated code to create the default instance for
 | 
|     * a map entry message. The created default instance should be used to create
 | 
|     * new map entry messages of the same type. For each map entry message, only
 | 
| -   * one default instance should be created.
 | 
| +   * one default instance should be created. 
 | 
|     */
 | 
|    public static <K, V> MapEntryLite<K, V> newDefaultInstance(
 | 
|        WireFormat.FieldType keyType, K defaultKey,
 | 
| @@ -106,20 +112,80 @@ public class MapEntryLite<K, V> {
 | 
|      return new MapEntryLite<K, V>(
 | 
|          keyType, defaultKey, valueType, defaultValue);
 | 
|    }
 | 
| +  
 | 
| +  @Override
 | 
| +  public void writeTo(CodedOutputStream output) throws IOException {
 | 
| +    writeField(KEY_FIELD_NUMBER, metadata.keyType, key, output);
 | 
| +    writeField(VALUE_FIELD_NUMBER, metadata.valueType, value, output);
 | 
| +  }
 | 
|  
 | 
| -  static <K, V> void writeTo(CodedOutputStream output, Metadata<K, V> metadata, K key, V value)
 | 
| -      throws IOException {
 | 
| -    FieldSet.writeElement(output, metadata.keyType, KEY_FIELD_NUMBER, key);
 | 
| -    FieldSet.writeElement(output, metadata.valueType, VALUE_FIELD_NUMBER, value);
 | 
| +  private void writeField(
 | 
| +      int number, WireFormat.FieldType type, Object value,
 | 
| +      CodedOutputStream output) throws IOException {
 | 
| +    output.writeTag(number, type.getWireType());
 | 
| +    FieldSet.writeElementNoTag(output, type, value);
 | 
|    }
 | 
|  
 | 
| -  static <K, V> int computeSerializedSize(Metadata<K, V> metadata, K key, V value) {
 | 
| -    return FieldSet.computeElementSize(metadata.keyType, KEY_FIELD_NUMBER, key)
 | 
| -        + FieldSet.computeElementSize(metadata.valueType, VALUE_FIELD_NUMBER, value);
 | 
| +  private volatile int cachedSerializedSize = -1;
 | 
| +  @Override
 | 
| +  public int getSerializedSize() {
 | 
| +    if (cachedSerializedSize != -1) {
 | 
| +      return cachedSerializedSize;
 | 
| +    }
 | 
| +    int size = 0;
 | 
| +    size += getFieldSize(KEY_FIELD_NUMBER, metadata.keyType, key);
 | 
| +    size += getFieldSize(VALUE_FIELD_NUMBER, metadata.valueType, value);
 | 
| +    cachedSerializedSize = size;
 | 
| +    return size;
 | 
|    }
 | 
|  
 | 
| +  private int getFieldSize(
 | 
| +      int number, WireFormat.FieldType type, Object value) {
 | 
| +    return CodedOutputStream.computeTagSize(number)
 | 
| +        + FieldSet.computeElementSizeNoTag(type, value);
 | 
| +  }
 | 
| +  
 | 
| +  /** Parsing constructor. */
 | 
| +  private MapEntryLite(
 | 
| +      Metadata<K, V> metadata,
 | 
| +      CodedInputStream input,
 | 
| +      ExtensionRegistryLite extensionRegistry)
 | 
| +      throws InvalidProtocolBufferException {
 | 
| +    try {
 | 
| +      K key = metadata.defaultInstance.key;
 | 
| +      V value = metadata.defaultInstance.value;
 | 
| +      while (true) {
 | 
| +        int tag = input.readTag();
 | 
| +        if (tag == 0) {
 | 
| +          break;
 | 
| +        }
 | 
| +        if (tag == WireFormat.makeTag(
 | 
| +                KEY_FIELD_NUMBER, metadata.keyType.getWireType())) {
 | 
| +          key = mergeField(
 | 
| +              input, extensionRegistry, metadata.keyType, key);
 | 
| +        } else if (tag == WireFormat.makeTag(
 | 
| +                       VALUE_FIELD_NUMBER, metadata.valueType.getWireType())) {
 | 
| +          value = mergeField(
 | 
| +              input, extensionRegistry, metadata.valueType, value);
 | 
| +        } else {
 | 
| +          if (!input.skipField(tag)) {
 | 
| +            break;
 | 
| +          }
 | 
| +        }
 | 
| +      }
 | 
| +      this.metadata = metadata;
 | 
| +      this.key = key;
 | 
| +      this.value = value;
 | 
| +    } catch (InvalidProtocolBufferException e) {
 | 
| +      throw e.setUnfinishedMessage(this);
 | 
| +    } catch (IOException e) {
 | 
| +      throw new InvalidProtocolBufferException(e.getMessage())
 | 
| +          .setUnfinishedMessage(this);
 | 
| +    }
 | 
| +  }
 | 
| +  
 | 
|    @SuppressWarnings("unchecked")
 | 
| -  static <T> T parseField(
 | 
| +  private <T> T mergeField(
 | 
|        CodedInputStream input, ExtensionRegistryLite extensionRegistry,
 | 
|        WireFormat.FieldType type, T value) throws IOException {
 | 
|      switch (type) {
 | 
| @@ -136,91 +202,136 @@ public class MapEntryLite<K, V> {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  /**
 | 
| -   * Serializes the provided key and value as though they were wrapped by a {@link MapEntryLite}
 | 
| -   * to the output stream. This helper method avoids allocation of a {@link MapEntryLite}
 | 
| -   * built with a key and value and is called from generated code directly.
 | 
| -   */
 | 
| -  public void serializeTo(CodedOutputStream output, int fieldNumber, K key, V value)
 | 
| -      throws IOException {
 | 
| -    output.writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
 | 
| -    output.writeUInt32NoTag(computeSerializedSize(metadata, key, value));
 | 
| -    writeTo(output, metadata, key, value);
 | 
| +  @Override
 | 
| +  public Parser<MapEntryLite<K, V>> getParserForType() {
 | 
| +    return metadata.parser;
 | 
|    }
 | 
|  
 | 
| -  /**
 | 
| -   * Computes the message size for the provided key and value as though they were wrapped
 | 
| -   * by a {@link MapEntryLite}. This helper method avoids allocation of a {@link MapEntryLite}
 | 
| -   * built with a key and value and is called from generated code directly.
 | 
| -   */
 | 
| -  public int computeMessageSize(int fieldNumber, K key, V value) {
 | 
| -    return CodedOutputStream.computeTagSize(fieldNumber)
 | 
| -        + CodedOutputStream.computeLengthDelimitedFieldSize(
 | 
| -            computeSerializedSize(metadata, key, value));
 | 
| +  @Override
 | 
| +  public Builder<K, V> newBuilderForType() {
 | 
| +    return new Builder<K, V>(metadata);
 | 
|    }
 | 
|  
 | 
| -  /**
 | 
| -   * Parses an entry off of the input as a {@link Map.Entry}. This helper requires an allocation
 | 
| -   * so using {@link #parseInto} is preferred if possible.
 | 
| -   */
 | 
| -  public Map.Entry<K, V> parseEntry(ByteString bytes, ExtensionRegistryLite extensionRegistry)
 | 
| -      throws IOException {
 | 
| -    return parseEntry(bytes.newCodedInput(), metadata, extensionRegistry);
 | 
| -  }
 | 
| -
 | 
| -  static <K, V> Map.Entry<K, V> parseEntry(
 | 
| -      CodedInputStream input, Metadata<K, V> metadata, ExtensionRegistryLite extensionRegistry)
 | 
| -          throws IOException{
 | 
| -    K key = metadata.defaultKey;
 | 
| -    V value = metadata.defaultValue;
 | 
| -    while (true) {
 | 
| -      int tag = input.readTag();
 | 
| -      if (tag == 0) {
 | 
| -        break;
 | 
| -      }
 | 
| -      if (tag == WireFormat.makeTag(KEY_FIELD_NUMBER, metadata.keyType.getWireType())) {
 | 
| -        key = parseField(input, extensionRegistry, metadata.keyType, key);
 | 
| -      } else if (tag == WireFormat.makeTag(VALUE_FIELD_NUMBER, metadata.valueType.getWireType())) {
 | 
| -        value = parseField(input, extensionRegistry, metadata.valueType, value);
 | 
| -      } else {
 | 
| -        if (!input.skipField(tag)) {
 | 
| -          break;
 | 
| -        }
 | 
| -      }
 | 
| +  @Override
 | 
| +  public Builder<K, V> toBuilder() {
 | 
| +    return new Builder<K, V>(metadata, key, value);
 | 
| +  }
 | 
| +
 | 
| +  @Override
 | 
| +  public MapEntryLite<K, V> getDefaultInstanceForType() {
 | 
| +    return metadata.defaultInstance;
 | 
| +  }
 | 
| +
 | 
| +  @Override
 | 
| +  public boolean isInitialized() {
 | 
| +    if (metadata.valueType.getJavaType() == WireFormat.JavaType.MESSAGE) {
 | 
| +      return ((MessageLite) value).isInitialized();
 | 
|      }
 | 
| -    return new AbstractMap.SimpleImmutableEntry<K, V>(key, value);
 | 
| +    return true;
 | 
|    }
 | 
|  
 | 
|    /**
 | 
| -   * Parses an entry off of the input into the map. This helper avoids allocaton of a
 | 
| -   * {@link MapEntryLite} by parsing directly into the provided {@link MapFieldLite}.
 | 
| +   * Builder used to create {@link MapEntryLite} messages.
 | 
|     */
 | 
| -  public void parseInto(
 | 
| -      MapFieldLite<K, V> map, CodedInputStream input, ExtensionRegistryLite extensionRegistry)
 | 
| -          throws IOException {
 | 
| -    int length = input.readRawVarint32();
 | 
| -    final int oldLimit = input.pushLimit(length);
 | 
| -    K key = metadata.defaultKey;
 | 
| -    V value = metadata.defaultValue;
 | 
| -
 | 
| -    while (true) {
 | 
| -      int tag = input.readTag();
 | 
| -      if (tag == 0) {
 | 
| -        break;
 | 
| +  public static class Builder<K, V>
 | 
| +      extends AbstractMessageLite.Builder<MapEntryLite<K, V>, Builder<K, V>> {
 | 
| +    private final Metadata<K, V> metadata;
 | 
| +    private K key;
 | 
| +    private V value;
 | 
| +    
 | 
| +    private Builder(Metadata<K, V> metadata) {
 | 
| +      this.metadata = metadata;
 | 
| +      this.key = metadata.defaultInstance.key;
 | 
| +      this.value = metadata.defaultInstance.value;
 | 
| +    }
 | 
| +    
 | 
| +    public K getKey() {
 | 
| +      return key;
 | 
| +    }
 | 
| +    
 | 
| +    public V getValue() {
 | 
| +      return value;
 | 
| +    }
 | 
| +    
 | 
| +    public Builder<K, V> setKey(K key) {
 | 
| +      this.key = key;
 | 
| +      return this;
 | 
| +    }
 | 
| +    
 | 
| +    public Builder<K, V> setValue(V value) {
 | 
| +      this.value = value;
 | 
| +      return this;
 | 
| +    }
 | 
| +    
 | 
| +    public Builder<K, V> clearKey() {
 | 
| +      this.key = metadata.defaultInstance.key;
 | 
| +      return this;
 | 
| +    }
 | 
| +    
 | 
| +    public Builder<K, V> clearValue() {
 | 
| +      this.value = metadata.defaultInstance.value;
 | 
| +      return this;
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    public Builder<K, V> clear() {
 | 
| +      this.key = metadata.defaultInstance.key;
 | 
| +      this.value = metadata.defaultInstance.value;
 | 
| +      return this;
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    public MapEntryLite<K, V> build() {
 | 
| +      MapEntryLite<K, V> result = buildPartial();
 | 
| +      if (!result.isInitialized()) {
 | 
| +        throw newUninitializedMessageException(result);
 | 
|        }
 | 
| -      if (tag == WireFormat.makeTag(KEY_FIELD_NUMBER, metadata.keyType.getWireType())) {
 | 
| -        key = parseField(input, extensionRegistry, metadata.keyType, key);
 | 
| -      } else if (tag == WireFormat.makeTag(VALUE_FIELD_NUMBER, metadata.valueType.getWireType())) {
 | 
| -        value = parseField(input, extensionRegistry, metadata.valueType, value);
 | 
| -      } else {
 | 
| -        if (!input.skipField(tag)) {
 | 
| -          break;
 | 
| -        }
 | 
| +      return result;
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    public MapEntryLite<K, V> buildPartial() {
 | 
| +      return new MapEntryLite<K, V>(metadata, key, value);
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    public MessageLite getDefaultInstanceForType() {
 | 
| +      return metadata.defaultInstance;
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    public boolean isInitialized() {
 | 
| +      if (metadata.valueType.getJavaType() == WireFormat.JavaType.MESSAGE) {
 | 
| +        return ((MessageLite) value).isInitialized();
 | 
|        }
 | 
| +      return true;
 | 
| +    }
 | 
| +
 | 
| +    private Builder(Metadata<K, V> metadata, K key, V value) {
 | 
| +      this.metadata = metadata;
 | 
| +      this.key = key;
 | 
| +      this.value = value;
 | 
| +    }
 | 
| +    
 | 
| +    @Override
 | 
| +    public Builder<K, V> clone() {
 | 
| +      return new Builder<K, V>(metadata, key, value);
 | 
|      }
 | 
|  
 | 
| -    input.checkLastTagWas(0);
 | 
| -    input.popLimit(oldLimit);
 | 
| -    map.put(key, value);
 | 
| +    @Override
 | 
| +    public Builder<K, V> mergeFrom(
 | 
| +        CodedInputStream input, ExtensionRegistryLite extensionRegistry)
 | 
| +        throws IOException {
 | 
| +      MapEntryLite<K, V> entry =
 | 
| +          new MapEntryLite<K, V>(metadata, input, extensionRegistry);
 | 
| +      this.key = entry.key;
 | 
| +      this.value = entry.value;
 | 
| +      return this;
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    protected Builder<K, V> internalMergeFrom(MapEntryLite<K, V> message) {
 | 
| +      throw new UnsupportedOperationException();
 | 
| +    }
 | 
|    }
 | 
|  }
 | 
| 
 |