// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: keyexchange.proto

package com.spotify;

public final class Keyexchange {
  private Keyexchange() {}
  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 spotify.Product}
   */
  public enum Product
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>PRODUCT_CLIENT = 0;</code>
     */
    PRODUCT_CLIENT(0),
    /**
     * <code>PRODUCT_LIBSPOTIFY = 1;</code>
     */
    PRODUCT_LIBSPOTIFY(1),
    /**
     * <code>PRODUCT_MOBILE = 2;</code>
     */
    PRODUCT_MOBILE(2),
    /**
     * <code>PRODUCT_PARTNER = 3;</code>
     */
    PRODUCT_PARTNER(3),
    /**
     * <code>PRODUCT_LIBSPOTIFY_EMBEDDED = 5;</code>
     */
    PRODUCT_LIBSPOTIFY_EMBEDDED(5),
    ;

    /**
     * <code>PRODUCT_CLIENT = 0;</code>
     */
    public static final int PRODUCT_CLIENT_VALUE = 0;
    /**
     * <code>PRODUCT_LIBSPOTIFY = 1;</code>
     */
    public static final int PRODUCT_LIBSPOTIFY_VALUE = 1;
    /**
     * <code>PRODUCT_MOBILE = 2;</code>
     */
    public static final int PRODUCT_MOBILE_VALUE = 2;
    /**
     * <code>PRODUCT_PARTNER = 3;</code>
     */
    public static final int PRODUCT_PARTNER_VALUE = 3;
    /**
     * <code>PRODUCT_LIBSPOTIFY_EMBEDDED = 5;</code>
     */
    public static final int PRODUCT_LIBSPOTIFY_EMBEDDED_VALUE = 5;


    public final int getNumber() {
      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 Product 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 Product forNumber(int value) {
      switch (value) {
        case 0: return PRODUCT_CLIENT;
        case 1: return PRODUCT_LIBSPOTIFY;
        case 2: return PRODUCT_MOBILE;
        case 3: return PRODUCT_PARTNER;
        case 5: return PRODUCT_LIBSPOTIFY_EMBEDDED;
        default: return null;
      }
    }

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

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.spotify.Keyexchange.getDescriptor().getEnumTypes().get(0);
    }

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

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

    private final int value;

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

    // @@protoc_insertion_point(enum_scope:spotify.Product)
  }

  /**
   * Protobuf enum {@code spotify.ProductFlags}
   */
  public enum ProductFlags
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>PRODUCT_FLAG_NONE = 0;</code>
     */
    PRODUCT_FLAG_NONE(0),
    /**
     * <code>PRODUCT_FLAG_DEV_BUILD = 1;</code>
     */
    PRODUCT_FLAG_DEV_BUILD(1),
    ;

    /**
     * <code>PRODUCT_FLAG_NONE = 0;</code>
     */
    public static final int PRODUCT_FLAG_NONE_VALUE = 0;
    /**
     * <code>PRODUCT_FLAG_DEV_BUILD = 1;</code>
     */
    public static final int PRODUCT_FLAG_DEV_BUILD_VALUE = 1;


    public final int getNumber() {
      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 ProductFlags 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 ProductFlags forNumber(int value) {
      switch (value) {
        case 0: return PRODUCT_FLAG_NONE;
        case 1: return PRODUCT_FLAG_DEV_BUILD;
        default: return null;
      }
    }

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

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.spotify.Keyexchange.getDescriptor().getEnumTypes().get(1);
    }

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

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

    private final int value;

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

    // @@protoc_insertion_point(enum_scope:spotify.ProductFlags)
  }

  /**
   * Protobuf enum {@code spotify.Platform}
   */
  public enum Platform
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>PLATFORM_WIN32_X86 = 0;</code>
     */
    PLATFORM_WIN32_X86(0),
    /**
     * <code>PLATFORM_OSX_X86 = 1;</code>
     */
    PLATFORM_OSX_X86(1),
    /**
     * <code>PLATFORM_LINUX_X86 = 2;</code>
     */
    PLATFORM_LINUX_X86(2),
    /**
     * <code>PLATFORM_IPHONE_ARM = 3;</code>
     */
    PLATFORM_IPHONE_ARM(3),
    /**
     * <code>PLATFORM_S60_ARM = 4;</code>
     */
    PLATFORM_S60_ARM(4),
    /**
     * <code>PLATFORM_OSX_PPC = 5;</code>
     */
    PLATFORM_OSX_PPC(5),
    /**
     * <code>PLATFORM_ANDROID_ARM = 6;</code>
     */
    PLATFORM_ANDROID_ARM(6),
    /**
     * <code>PLATFORM_WINDOWS_CE_ARM = 7;</code>
     */
    PLATFORM_WINDOWS_CE_ARM(7),
    /**
     * <code>PLATFORM_LINUX_X86_64 = 8;</code>
     */
    PLATFORM_LINUX_X86_64(8),
    /**
     * <code>PLATFORM_OSX_X86_64 = 9;</code>
     */
    PLATFORM_OSX_X86_64(9),
    /**
     * <code>PLATFORM_PALM_ARM = 10;</code>
     */
    PLATFORM_PALM_ARM(10),
    /**
     * <code>PLATFORM_LINUX_SH = 11;</code>
     */
    PLATFORM_LINUX_SH(11),
    /**
     * <code>PLATFORM_FREEBSD_X86 = 12;</code>
     */
    PLATFORM_FREEBSD_X86(12),
    /**
     * <code>PLATFORM_FREEBSD_X86_64 = 13;</code>
     */
    PLATFORM_FREEBSD_X86_64(13),
    /**
     * <code>PLATFORM_BLACKBERRY_ARM = 14;</code>
     */
    PLATFORM_BLACKBERRY_ARM(14),
    /**
     * <code>PLATFORM_SONOS = 15;</code>
     */
    PLATFORM_SONOS(15),
    /**
     * <code>PLATFORM_LINUX_MIPS = 16;</code>
     */
    PLATFORM_LINUX_MIPS(16),
    /**
     * <code>PLATFORM_LINUX_ARM = 17;</code>
     */
    PLATFORM_LINUX_ARM(17),
    /**
     * <code>PLATFORM_LOGITECH_ARM = 18;</code>
     */
    PLATFORM_LOGITECH_ARM(18),
    /**
     * <code>PLATFORM_LINUX_BLACKFIN = 19;</code>
     */
    PLATFORM_LINUX_BLACKFIN(19),
    /**
     * <code>PLATFORM_WP7_ARM = 20;</code>
     */
    PLATFORM_WP7_ARM(20),
    /**
     * <code>PLATFORM_ONKYO_ARM = 21;</code>
     */
    PLATFORM_ONKYO_ARM(21),
    /**
     * <code>PLATFORM_QNXNTO_ARM = 22;</code>
     */
    PLATFORM_QNXNTO_ARM(22),
    /**
     * <code>PLATFORM_BCO_ARM = 23;</code>
     */
    PLATFORM_BCO_ARM(23),
    ;

    /**
     * <code>PLATFORM_WIN32_X86 = 0;</code>
     */
    public static final int PLATFORM_WIN32_X86_VALUE = 0;
    /**
     * <code>PLATFORM_OSX_X86 = 1;</code>
     */
    public static final int PLATFORM_OSX_X86_VALUE = 1;
    /**
     * <code>PLATFORM_LINUX_X86 = 2;</code>
     */
    public static final int PLATFORM_LINUX_X86_VALUE = 2;
    /**
     * <code>PLATFORM_IPHONE_ARM = 3;</code>
     */
    public static final int PLATFORM_IPHONE_ARM_VALUE = 3;
    /**
     * <code>PLATFORM_S60_ARM = 4;</code>
     */
    public static final int PLATFORM_S60_ARM_VALUE = 4;
    /**
     * <code>PLATFORM_OSX_PPC = 5;</code>
     */
    public static final int PLATFORM_OSX_PPC_VALUE = 5;
    /**
     * <code>PLATFORM_ANDROID_ARM = 6;</code>
     */
    public static final int PLATFORM_ANDROID_ARM_VALUE = 6;
    /**
     * <code>PLATFORM_WINDOWS_CE_ARM = 7;</code>
     */
    public static final int PLATFORM_WINDOWS_CE_ARM_VALUE = 7;
    /**
     * <code>PLATFORM_LINUX_X86_64 = 8;</code>
     */
    public static final int PLATFORM_LINUX_X86_64_VALUE = 8;
    /**
     * <code>PLATFORM_OSX_X86_64 = 9;</code>
     */
    public static final int PLATFORM_OSX_X86_64_VALUE = 9;
    /**
     * <code>PLATFORM_PALM_ARM = 10;</code>
     */
    public static final int PLATFORM_PALM_ARM_VALUE = 10;
    /**
     * <code>PLATFORM_LINUX_SH = 11;</code>
     */
    public static final int PLATFORM_LINUX_SH_VALUE = 11;
    /**
     * <code>PLATFORM_FREEBSD_X86 = 12;</code>
     */
    public static final int PLATFORM_FREEBSD_X86_VALUE = 12;
    /**
     * <code>PLATFORM_FREEBSD_X86_64 = 13;</code>
     */
    public static final int PLATFORM_FREEBSD_X86_64_VALUE = 13;
    /**
     * <code>PLATFORM_BLACKBERRY_ARM = 14;</code>
     */
    public static final int PLATFORM_BLACKBERRY_ARM_VALUE = 14;
    /**
     * <code>PLATFORM_SONOS = 15;</code>
     */
    public static final int PLATFORM_SONOS_VALUE = 15;
    /**
     * <code>PLATFORM_LINUX_MIPS = 16;</code>
     */
    public static final int PLATFORM_LINUX_MIPS_VALUE = 16;
    /**
     * <code>PLATFORM_LINUX_ARM = 17;</code>
     */
    public static final int PLATFORM_LINUX_ARM_VALUE = 17;
    /**
     * <code>PLATFORM_LOGITECH_ARM = 18;</code>
     */
    public static final int PLATFORM_LOGITECH_ARM_VALUE = 18;
    /**
     * <code>PLATFORM_LINUX_BLACKFIN = 19;</code>
     */
    public static final int PLATFORM_LINUX_BLACKFIN_VALUE = 19;
    /**
     * <code>PLATFORM_WP7_ARM = 20;</code>
     */
    public static final int PLATFORM_WP7_ARM_VALUE = 20;
    /**
     * <code>PLATFORM_ONKYO_ARM = 21;</code>
     */
    public static final int PLATFORM_ONKYO_ARM_VALUE = 21;
    /**
     * <code>PLATFORM_QNXNTO_ARM = 22;</code>
     */
    public static final int PLATFORM_QNXNTO_ARM_VALUE = 22;
    /**
     * <code>PLATFORM_BCO_ARM = 23;</code>
     */
    public static final int PLATFORM_BCO_ARM_VALUE = 23;


    public final int getNumber() {
      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 Platform 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 Platform forNumber(int value) {
      switch (value) {
        case 0: return PLATFORM_WIN32_X86;
        case 1: return PLATFORM_OSX_X86;
        case 2: return PLATFORM_LINUX_X86;
        case 3: return PLATFORM_IPHONE_ARM;
        case 4: return PLATFORM_S60_ARM;
        case 5: return PLATFORM_OSX_PPC;
        case 6: return PLATFORM_ANDROID_ARM;
        case 7: return PLATFORM_WINDOWS_CE_ARM;
        case 8: return PLATFORM_LINUX_X86_64;
        case 9: return PLATFORM_OSX_X86_64;
        case 10: return PLATFORM_PALM_ARM;
        case 11: return PLATFORM_LINUX_SH;
        case 12: return PLATFORM_FREEBSD_X86;
        case 13: return PLATFORM_FREEBSD_X86_64;
        case 14: return PLATFORM_BLACKBERRY_ARM;
        case 15: return PLATFORM_SONOS;
        case 16: return PLATFORM_LINUX_MIPS;
        case 17: return PLATFORM_LINUX_ARM;
        case 18: return PLATFORM_LOGITECH_ARM;
        case 19: return PLATFORM_LINUX_BLACKFIN;
        case 20: return PLATFORM_WP7_ARM;
        case 21: return PLATFORM_ONKYO_ARM;
        case 22: return PLATFORM_QNXNTO_ARM;
        case 23: return PLATFORM_BCO_ARM;
        default: return null;
      }
    }

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

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.spotify.Keyexchange.getDescriptor().getEnumTypes().get(2);
    }

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

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

    private final int value;

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

    // @@protoc_insertion_point(enum_scope:spotify.Platform)
  }

  /**
   * Protobuf enum {@code spotify.Fingerprint}
   */
  public enum Fingerprint
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>FINGERPRINT_GRAIN = 0;</code>
     */
    FINGERPRINT_GRAIN(0),
    /**
     * <code>FINGERPRINT_HMAC_RIPEMD = 1;</code>
     */
    FINGERPRINT_HMAC_RIPEMD(1),
    ;

    /**
     * <code>FINGERPRINT_GRAIN = 0;</code>
     */
    public static final int FINGERPRINT_GRAIN_VALUE = 0;
    /**
     * <code>FINGERPRINT_HMAC_RIPEMD = 1;</code>
     */
    public static final int FINGERPRINT_HMAC_RIPEMD_VALUE = 1;


    public final int getNumber() {
      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 Fingerprint 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 Fingerprint forNumber(int value) {
      switch (value) {
        case 0: return FINGERPRINT_GRAIN;
        case 1: return FINGERPRINT_HMAC_RIPEMD;
        default: return null;
      }
    }

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

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.spotify.Keyexchange.getDescriptor().getEnumTypes().get(3);
    }

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

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

    private final int value;

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

    // @@protoc_insertion_point(enum_scope:spotify.Fingerprint)
  }

  /**
   * Protobuf enum {@code spotify.Cryptosuite}
   */
  public enum Cryptosuite
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>CRYPTO_SUITE_SHANNON = 0;</code>
     */
    CRYPTO_SUITE_SHANNON(0),
    /**
     * <code>CRYPTO_SUITE_RC4_SHA1_HMAC = 1;</code>
     */
    CRYPTO_SUITE_RC4_SHA1_HMAC(1),
    ;

    /**
     * <code>CRYPTO_SUITE_SHANNON = 0;</code>
     */
    public static final int CRYPTO_SUITE_SHANNON_VALUE = 0;
    /**
     * <code>CRYPTO_SUITE_RC4_SHA1_HMAC = 1;</code>
     */
    public static final int CRYPTO_SUITE_RC4_SHA1_HMAC_VALUE = 1;


    public final int getNumber() {
      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 Cryptosuite 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 Cryptosuite forNumber(int value) {
      switch (value) {
        case 0: return CRYPTO_SUITE_SHANNON;
        case 1: return CRYPTO_SUITE_RC4_SHA1_HMAC;
        default: return null;
      }
    }

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

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.spotify.Keyexchange.getDescriptor().getEnumTypes().get(4);
    }

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

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

    private final int value;

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

    // @@protoc_insertion_point(enum_scope:spotify.Cryptosuite)
  }

  /**
   * Protobuf enum {@code spotify.Powscheme}
   */
  public enum Powscheme
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>POW_HASH_CASH = 0;</code>
     */
    POW_HASH_CASH(0),
    ;

    /**
     * <code>POW_HASH_CASH = 0;</code>
     */
    public static final int POW_HASH_CASH_VALUE = 0;


    public final int getNumber() {
      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 Powscheme 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 Powscheme forNumber(int value) {
      switch (value) {
        case 0: return POW_HASH_CASH;
        default: return null;
      }
    }

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

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.spotify.Keyexchange.getDescriptor().getEnumTypes().get(5);
    }

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

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

    private final int value;

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

    // @@protoc_insertion_point(enum_scope:spotify.Powscheme)
  }

  /**
   * Protobuf enum {@code spotify.ErrorCode}
   */
  public enum ErrorCode
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>ProtocolError = 0;</code>
     */
    ProtocolError(0),
    /**
     * <code>TryAnotherAP = 2;</code>
     */
    TryAnotherAP(2),
    /**
     * <code>BadConnectionId = 5;</code>
     */
    BadConnectionId(5),
    /**
     * <code>TravelRestriction = 9;</code>
     */
    TravelRestriction(9),
    /**
     * <code>PremiumAccountRequired = 11;</code>
     */
    PremiumAccountRequired(11),
    /**
     * <code>BadCredentials = 12;</code>
     */
    BadCredentials(12),
    /**
     * <code>CouldNotValidateCredentials = 13;</code>
     */
    CouldNotValidateCredentials(13),
    /**
     * <code>AccountExists = 14;</code>
     */
    AccountExists(14),
    /**
     * <code>ExtraVerificationRequired = 15;</code>
     */
    ExtraVerificationRequired(15),
    /**
     * <code>InvalidAppKey = 16;</code>
     */
    InvalidAppKey(16),
    /**
     * <code>ApplicationBanned = 17;</code>
     */
    ApplicationBanned(17),
    ;

    /**
     * <code>ProtocolError = 0;</code>
     */
    public static final int ProtocolError_VALUE = 0;
    /**
     * <code>TryAnotherAP = 2;</code>
     */
    public static final int TryAnotherAP_VALUE = 2;
    /**
     * <code>BadConnectionId = 5;</code>
     */
    public static final int BadConnectionId_VALUE = 5;
    /**
     * <code>TravelRestriction = 9;</code>
     */
    public static final int TravelRestriction_VALUE = 9;
    /**
     * <code>PremiumAccountRequired = 11;</code>
     */
    public static final int PremiumAccountRequired_VALUE = 11;
    /**
     * <code>BadCredentials = 12;</code>
     */
    public static final int BadCredentials_VALUE = 12;
    /**
     * <code>CouldNotValidateCredentials = 13;</code>
     */
    public static final int CouldNotValidateCredentials_VALUE = 13;
    /**
     * <code>AccountExists = 14;</code>
     */
    public static final int AccountExists_VALUE = 14;
    /**
     * <code>ExtraVerificationRequired = 15;</code>
     */
    public static final int ExtraVerificationRequired_VALUE = 15;
    /**
     * <code>InvalidAppKey = 16;</code>
     */
    public static final int InvalidAppKey_VALUE = 16;
    /**
     * <code>ApplicationBanned = 17;</code>
     */
    public static final int ApplicationBanned_VALUE = 17;


    public final int getNumber() {
      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 ErrorCode 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 ErrorCode forNumber(int value) {
      switch (value) {
        case 0: return ProtocolError;
        case 2: return TryAnotherAP;
        case 5: return BadConnectionId;
        case 9: return TravelRestriction;
        case 11: return PremiumAccountRequired;
        case 12: return BadCredentials;
        case 13: return CouldNotValidateCredentials;
        case 14: return AccountExists;
        case 15: return ExtraVerificationRequired;
        case 16: return InvalidAppKey;
        case 17: return ApplicationBanned;
        default: return null;
      }
    }

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

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.spotify.Keyexchange.getDescriptor().getEnumTypes().get(6);
    }

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

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

    private final int value;

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

    // @@protoc_insertion_point(enum_scope:spotify.ErrorCode)
  }

  public interface ClientHelloOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.ClientHello)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required .spotify.BuildInfo build_info = 10;</code>
     * @return Whether the buildInfo field is set.
     */
    boolean hasBuildInfo();
    /**
     * <code>required .spotify.BuildInfo build_info = 10;</code>
     * @return The buildInfo.
     */
    com.spotify.Keyexchange.BuildInfo getBuildInfo();
    /**
     * <code>required .spotify.BuildInfo build_info = 10;</code>
     */
    com.spotify.Keyexchange.BuildInfoOrBuilder getBuildInfoOrBuilder();

    /**
     * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
     * @return A list containing the fingerprintsSupported.
     */
    java.util.List<com.spotify.Keyexchange.Fingerprint> getFingerprintsSupportedList();
    /**
     * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
     * @return The count of fingerprintsSupported.
     */
    int getFingerprintsSupportedCount();
    /**
     * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
     * @param index The index of the element to return.
     * @return The fingerprintsSupported at the given index.
     */
    com.spotify.Keyexchange.Fingerprint getFingerprintsSupported(int index);

    /**
     * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
     * @return A list containing the cryptosuitesSupported.
     */
    java.util.List<com.spotify.Keyexchange.Cryptosuite> getCryptosuitesSupportedList();
    /**
     * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
     * @return The count of cryptosuitesSupported.
     */
    int getCryptosuitesSupportedCount();
    /**
     * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
     * @param index The index of the element to return.
     * @return The cryptosuitesSupported at the given index.
     */
    com.spotify.Keyexchange.Cryptosuite getCryptosuitesSupported(int index);

    /**
     * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
     * @return A list containing the powschemesSupported.
     */
    java.util.List<com.spotify.Keyexchange.Powscheme> getPowschemesSupportedList();
    /**
     * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
     * @return The count of powschemesSupported.
     */
    int getPowschemesSupportedCount();
    /**
     * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
     * @param index The index of the element to return.
     * @return The powschemesSupported at the given index.
     */
    com.spotify.Keyexchange.Powscheme getPowschemesSupported(int index);

    /**
     * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
     * @return Whether the loginCryptoHello field is set.
     */
    boolean hasLoginCryptoHello();
    /**
     * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
     * @return The loginCryptoHello.
     */
    com.spotify.Keyexchange.LoginCryptoHelloUnion getLoginCryptoHello();
    /**
     * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
     */
    com.spotify.Keyexchange.LoginCryptoHelloUnionOrBuilder getLoginCryptoHelloOrBuilder();

    /**
     * <code>required bytes client_nonce = 60;</code>
     * @return Whether the clientNonce field is set.
     */
    boolean hasClientNonce();
    /**
     * <code>required bytes client_nonce = 60;</code>
     * @return The clientNonce.
     */
    com.google.protobuf.ByteString getClientNonce();

    /**
     * <code>optional bytes padding = 70;</code>
     * @return Whether the padding field is set.
     */
    boolean hasPadding();
    /**
     * <code>optional bytes padding = 70;</code>
     * @return The padding.
     */
    com.google.protobuf.ByteString getPadding();

    /**
     * <code>optional .spotify.FeatureSet feature_set = 80;</code>
     * @return Whether the featureSet field is set.
     */
    boolean hasFeatureSet();
    /**
     * <code>optional .spotify.FeatureSet feature_set = 80;</code>
     * @return The featureSet.
     */
    com.spotify.Keyexchange.FeatureSet getFeatureSet();
    /**
     * <code>optional .spotify.FeatureSet feature_set = 80;</code>
     */
    com.spotify.Keyexchange.FeatureSetOrBuilder getFeatureSetOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.ClientHello}
   */
  public  static final class ClientHello extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.ClientHello)
      ClientHelloOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use ClientHello.newBuilder() to construct.
    private ClientHello(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private ClientHello() {
      fingerprintsSupported_ = java.util.Collections.emptyList();
      cryptosuitesSupported_ = java.util.Collections.emptyList();
      powschemesSupported_ = java.util.Collections.emptyList();
      clientNonce_ = com.google.protobuf.ByteString.EMPTY;
      padding_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new ClientHello();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private ClientHello(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.BuildInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = buildInfo_.toBuilder();
              }
              buildInfo_ = input.readMessage(com.spotify.Keyexchange.BuildInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(buildInfo_);
                buildInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 160: {
              int rawValue = input.readEnum();
              @SuppressWarnings("deprecation")
              com.spotify.Keyexchange.Fingerprint value = com.spotify.Keyexchange.Fingerprint.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(20, rawValue);
              } else {
                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                  fingerprintsSupported_ = new java.util.ArrayList<java.lang.Integer>();
                  mutable_bitField0_ |= 0x00000002;
                }
                fingerprintsSupported_.add(rawValue);
              }
              break;
            }
            case 162: {
              int length = input.readRawVarint32();
              int oldLimit = input.pushLimit(length);
              while(input.getBytesUntilLimit() > 0) {
                int rawValue = input.readEnum();
                @SuppressWarnings("deprecation")
                com.spotify.Keyexchange.Fingerprint value = com.spotify.Keyexchange.Fingerprint.valueOf(rawValue);
                if (value == null) {
                  unknownFields.mergeVarintField(20, rawValue);
                } else {
                  if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                    fingerprintsSupported_ = new java.util.ArrayList<java.lang.Integer>();
                    mutable_bitField0_ |= 0x00000002;
                  }
                  fingerprintsSupported_.add(rawValue);
                }
              }
              input.popLimit(oldLimit);
              break;
            }
            case 240: {
              int rawValue = input.readEnum();
              @SuppressWarnings("deprecation")
              com.spotify.Keyexchange.Cryptosuite value = com.spotify.Keyexchange.Cryptosuite.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(30, rawValue);
              } else {
                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                  cryptosuitesSupported_ = new java.util.ArrayList<java.lang.Integer>();
                  mutable_bitField0_ |= 0x00000004;
                }
                cryptosuitesSupported_.add(rawValue);
              }
              break;
            }
            case 242: {
              int length = input.readRawVarint32();
              int oldLimit = input.pushLimit(length);
              while(input.getBytesUntilLimit() > 0) {
                int rawValue = input.readEnum();
                @SuppressWarnings("deprecation")
                com.spotify.Keyexchange.Cryptosuite value = com.spotify.Keyexchange.Cryptosuite.valueOf(rawValue);
                if (value == null) {
                  unknownFields.mergeVarintField(30, rawValue);
                } else {
                  if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                    cryptosuitesSupported_ = new java.util.ArrayList<java.lang.Integer>();
                    mutable_bitField0_ |= 0x00000004;
                  }
                  cryptosuitesSupported_.add(rawValue);
                }
              }
              input.popLimit(oldLimit);
              break;
            }
            case 320: {
              int rawValue = input.readEnum();
              @SuppressWarnings("deprecation")
              com.spotify.Keyexchange.Powscheme value = com.spotify.Keyexchange.Powscheme.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(40, rawValue);
              } else {
                if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                  powschemesSupported_ = new java.util.ArrayList<java.lang.Integer>();
                  mutable_bitField0_ |= 0x00000008;
                }
                powschemesSupported_.add(rawValue);
              }
              break;
            }
            case 322: {
              int length = input.readRawVarint32();
              int oldLimit = input.pushLimit(length);
              while(input.getBytesUntilLimit() > 0) {
                int rawValue = input.readEnum();
                @SuppressWarnings("deprecation")
                com.spotify.Keyexchange.Powscheme value = com.spotify.Keyexchange.Powscheme.valueOf(rawValue);
                if (value == null) {
                  unknownFields.mergeVarintField(40, rawValue);
                } else {
                  if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                    powschemesSupported_ = new java.util.ArrayList<java.lang.Integer>();
                    mutable_bitField0_ |= 0x00000008;
                  }
                  powschemesSupported_.add(rawValue);
                }
              }
              input.popLimit(oldLimit);
              break;
            }
            case 402: {
              com.spotify.Keyexchange.LoginCryptoHelloUnion.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = loginCryptoHello_.toBuilder();
              }
              loginCryptoHello_ = input.readMessage(com.spotify.Keyexchange.LoginCryptoHelloUnion.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(loginCryptoHello_);
                loginCryptoHello_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 482: {
              bitField0_ |= 0x00000004;
              clientNonce_ = input.readBytes();
              break;
            }
            case 562: {
              bitField0_ |= 0x00000008;
              padding_ = input.readBytes();
              break;
            }
            case 642: {
              com.spotify.Keyexchange.FeatureSet.Builder subBuilder = null;
              if (((bitField0_ & 0x00000010) != 0)) {
                subBuilder = featureSet_.toBuilder();
              }
              featureSet_ = input.readMessage(com.spotify.Keyexchange.FeatureSet.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(featureSet_);
                featureSet_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000010;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          fingerprintsSupported_ = java.util.Collections.unmodifiableList(fingerprintsSupported_);
        }
        if (((mutable_bitField0_ & 0x00000004) != 0)) {
          cryptosuitesSupported_ = java.util.Collections.unmodifiableList(cryptosuitesSupported_);
        }
        if (((mutable_bitField0_ & 0x00000008) != 0)) {
          powschemesSupported_ = java.util.Collections.unmodifiableList(powschemesSupported_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_ClientHello_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_ClientHello_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.ClientHello.class, com.spotify.Keyexchange.ClientHello.Builder.class);
    }

    private int bitField0_;
    public static final int BUILD_INFO_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.BuildInfo buildInfo_;
    /**
     * <code>required .spotify.BuildInfo build_info = 10;</code>
     * @return Whether the buildInfo field is set.
     */
    public boolean hasBuildInfo() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required .spotify.BuildInfo build_info = 10;</code>
     * @return The buildInfo.
     */
    public com.spotify.Keyexchange.BuildInfo getBuildInfo() {
      return buildInfo_ == null ? com.spotify.Keyexchange.BuildInfo.getDefaultInstance() : buildInfo_;
    }
    /**
     * <code>required .spotify.BuildInfo build_info = 10;</code>
     */
    public com.spotify.Keyexchange.BuildInfoOrBuilder getBuildInfoOrBuilder() {
      return buildInfo_ == null ? com.spotify.Keyexchange.BuildInfo.getDefaultInstance() : buildInfo_;
    }

    public static final int FINGERPRINTS_SUPPORTED_FIELD_NUMBER = 20;
    private java.util.List<java.lang.Integer> fingerprintsSupported_;
    private static final com.google.protobuf.Internal.ListAdapter.Converter<
        java.lang.Integer, com.spotify.Keyexchange.Fingerprint> fingerprintsSupported_converter_ =
            new com.google.protobuf.Internal.ListAdapter.Converter<
                java.lang.Integer, com.spotify.Keyexchange.Fingerprint>() {
              public com.spotify.Keyexchange.Fingerprint convert(java.lang.Integer from) {
                @SuppressWarnings("deprecation")
                com.spotify.Keyexchange.Fingerprint result = com.spotify.Keyexchange.Fingerprint.valueOf(from);
                return result == null ? com.spotify.Keyexchange.Fingerprint.FINGERPRINT_GRAIN : result;
              }
            };
    /**
     * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
     * @return A list containing the fingerprintsSupported.
     */
    public java.util.List<com.spotify.Keyexchange.Fingerprint> getFingerprintsSupportedList() {
      return new com.google.protobuf.Internal.ListAdapter<
          java.lang.Integer, com.spotify.Keyexchange.Fingerprint>(fingerprintsSupported_, fingerprintsSupported_converter_);
    }
    /**
     * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
     * @return The count of fingerprintsSupported.
     */
    public int getFingerprintsSupportedCount() {
      return fingerprintsSupported_.size();
    }
    /**
     * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
     * @param index The index of the element to return.
     * @return The fingerprintsSupported at the given index.
     */
    public com.spotify.Keyexchange.Fingerprint getFingerprintsSupported(int index) {
      return fingerprintsSupported_converter_.convert(fingerprintsSupported_.get(index));
    }

    public static final int CRYPTOSUITES_SUPPORTED_FIELD_NUMBER = 30;
    private java.util.List<java.lang.Integer> cryptosuitesSupported_;
    private static final com.google.protobuf.Internal.ListAdapter.Converter<
        java.lang.Integer, com.spotify.Keyexchange.Cryptosuite> cryptosuitesSupported_converter_ =
            new com.google.protobuf.Internal.ListAdapter.Converter<
                java.lang.Integer, com.spotify.Keyexchange.Cryptosuite>() {
              public com.spotify.Keyexchange.Cryptosuite convert(java.lang.Integer from) {
                @SuppressWarnings("deprecation")
                com.spotify.Keyexchange.Cryptosuite result = com.spotify.Keyexchange.Cryptosuite.valueOf(from);
                return result == null ? com.spotify.Keyexchange.Cryptosuite.CRYPTO_SUITE_SHANNON : result;
              }
            };
    /**
     * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
     * @return A list containing the cryptosuitesSupported.
     */
    public java.util.List<com.spotify.Keyexchange.Cryptosuite> getCryptosuitesSupportedList() {
      return new com.google.protobuf.Internal.ListAdapter<
          java.lang.Integer, com.spotify.Keyexchange.Cryptosuite>(cryptosuitesSupported_, cryptosuitesSupported_converter_);
    }
    /**
     * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
     * @return The count of cryptosuitesSupported.
     */
    public int getCryptosuitesSupportedCount() {
      return cryptosuitesSupported_.size();
    }
    /**
     * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
     * @param index The index of the element to return.
     * @return The cryptosuitesSupported at the given index.
     */
    public com.spotify.Keyexchange.Cryptosuite getCryptosuitesSupported(int index) {
      return cryptosuitesSupported_converter_.convert(cryptosuitesSupported_.get(index));
    }

    public static final int POWSCHEMES_SUPPORTED_FIELD_NUMBER = 40;
    private java.util.List<java.lang.Integer> powschemesSupported_;
    private static final com.google.protobuf.Internal.ListAdapter.Converter<
        java.lang.Integer, com.spotify.Keyexchange.Powscheme> powschemesSupported_converter_ =
            new com.google.protobuf.Internal.ListAdapter.Converter<
                java.lang.Integer, com.spotify.Keyexchange.Powscheme>() {
              public com.spotify.Keyexchange.Powscheme convert(java.lang.Integer from) {
                @SuppressWarnings("deprecation")
                com.spotify.Keyexchange.Powscheme result = com.spotify.Keyexchange.Powscheme.valueOf(from);
                return result == null ? com.spotify.Keyexchange.Powscheme.POW_HASH_CASH : result;
              }
            };
    /**
     * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
     * @return A list containing the powschemesSupported.
     */
    public java.util.List<com.spotify.Keyexchange.Powscheme> getPowschemesSupportedList() {
      return new com.google.protobuf.Internal.ListAdapter<
          java.lang.Integer, com.spotify.Keyexchange.Powscheme>(powschemesSupported_, powschemesSupported_converter_);
    }
    /**
     * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
     * @return The count of powschemesSupported.
     */
    public int getPowschemesSupportedCount() {
      return powschemesSupported_.size();
    }
    /**
     * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
     * @param index The index of the element to return.
     * @return The powschemesSupported at the given index.
     */
    public com.spotify.Keyexchange.Powscheme getPowschemesSupported(int index) {
      return powschemesSupported_converter_.convert(powschemesSupported_.get(index));
    }

    public static final int LOGIN_CRYPTO_HELLO_FIELD_NUMBER = 50;
    private com.spotify.Keyexchange.LoginCryptoHelloUnion loginCryptoHello_;
    /**
     * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
     * @return Whether the loginCryptoHello field is set.
     */
    public boolean hasLoginCryptoHello() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
     * @return The loginCryptoHello.
     */
    public com.spotify.Keyexchange.LoginCryptoHelloUnion getLoginCryptoHello() {
      return loginCryptoHello_ == null ? com.spotify.Keyexchange.LoginCryptoHelloUnion.getDefaultInstance() : loginCryptoHello_;
    }
    /**
     * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
     */
    public com.spotify.Keyexchange.LoginCryptoHelloUnionOrBuilder getLoginCryptoHelloOrBuilder() {
      return loginCryptoHello_ == null ? com.spotify.Keyexchange.LoginCryptoHelloUnion.getDefaultInstance() : loginCryptoHello_;
    }

    public static final int CLIENT_NONCE_FIELD_NUMBER = 60;
    private com.google.protobuf.ByteString clientNonce_;
    /**
     * <code>required bytes client_nonce = 60;</code>
     * @return Whether the clientNonce field is set.
     */
    public boolean hasClientNonce() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required bytes client_nonce = 60;</code>
     * @return The clientNonce.
     */
    public com.google.protobuf.ByteString getClientNonce() {
      return clientNonce_;
    }

    public static final int PADDING_FIELD_NUMBER = 70;
    private com.google.protobuf.ByteString padding_;
    /**
     * <code>optional bytes padding = 70;</code>
     * @return Whether the padding field is set.
     */
    public boolean hasPadding() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>optional bytes padding = 70;</code>
     * @return The padding.
     */
    public com.google.protobuf.ByteString getPadding() {
      return padding_;
    }

    public static final int FEATURE_SET_FIELD_NUMBER = 80;
    private com.spotify.Keyexchange.FeatureSet featureSet_;
    /**
     * <code>optional .spotify.FeatureSet feature_set = 80;</code>
     * @return Whether the featureSet field is set.
     */
    public boolean hasFeatureSet() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <code>optional .spotify.FeatureSet feature_set = 80;</code>
     * @return The featureSet.
     */
    public com.spotify.Keyexchange.FeatureSet getFeatureSet() {
      return featureSet_ == null ? com.spotify.Keyexchange.FeatureSet.getDefaultInstance() : featureSet_;
    }
    /**
     * <code>optional .spotify.FeatureSet feature_set = 80;</code>
     */
    public com.spotify.Keyexchange.FeatureSetOrBuilder getFeatureSetOrBuilder() {
      return featureSet_ == null ? com.spotify.Keyexchange.FeatureSet.getDefaultInstance() : featureSet_;
    }

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

      if (!hasBuildInfo()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasLoginCryptoHello()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasClientNonce()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!getBuildInfo().isInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!getLoginCryptoHello().isInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getBuildInfo());
      }
      for (int i = 0; i < fingerprintsSupported_.size(); i++) {
        output.writeEnum(20, fingerprintsSupported_.get(i));
      }
      for (int i = 0; i < cryptosuitesSupported_.size(); i++) {
        output.writeEnum(30, cryptosuitesSupported_.get(i));
      }
      for (int i = 0; i < powschemesSupported_.size(); i++) {
        output.writeEnum(40, powschemesSupported_.get(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(50, getLoginCryptoHello());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeBytes(60, clientNonce_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeBytes(70, padding_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        output.writeMessage(80, getFeatureSet());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getBuildInfo());
      }
      {
        int dataSize = 0;
        for (int i = 0; i < fingerprintsSupported_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeEnumSizeNoTag(fingerprintsSupported_.get(i));
        }
        size += dataSize;
        size += 2 * fingerprintsSupported_.size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < cryptosuitesSupported_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeEnumSizeNoTag(cryptosuitesSupported_.get(i));
        }
        size += dataSize;
        size += 2 * cryptosuitesSupported_.size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < powschemesSupported_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeEnumSizeNoTag(powschemesSupported_.get(i));
        }
        size += dataSize;
        size += 2 * powschemesSupported_.size();
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(50, getLoginCryptoHello());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(60, clientNonce_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(70, padding_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(80, getFeatureSet());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.ClientHello)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.ClientHello other = (com.spotify.Keyexchange.ClientHello) obj;

      if (hasBuildInfo() != other.hasBuildInfo()) return false;
      if (hasBuildInfo()) {
        if (!getBuildInfo()
            .equals(other.getBuildInfo())) return false;
      }
      if (!fingerprintsSupported_.equals(other.fingerprintsSupported_)) return false;
      if (!cryptosuitesSupported_.equals(other.cryptosuitesSupported_)) return false;
      if (!powschemesSupported_.equals(other.powschemesSupported_)) return false;
      if (hasLoginCryptoHello() != other.hasLoginCryptoHello()) return false;
      if (hasLoginCryptoHello()) {
        if (!getLoginCryptoHello()
            .equals(other.getLoginCryptoHello())) return false;
      }
      if (hasClientNonce() != other.hasClientNonce()) return false;
      if (hasClientNonce()) {
        if (!getClientNonce()
            .equals(other.getClientNonce())) return false;
      }
      if (hasPadding() != other.hasPadding()) return false;
      if (hasPadding()) {
        if (!getPadding()
            .equals(other.getPadding())) return false;
      }
      if (hasFeatureSet() != other.hasFeatureSet()) return false;
      if (hasFeatureSet()) {
        if (!getFeatureSet()
            .equals(other.getFeatureSet())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasBuildInfo()) {
        hash = (37 * hash) + BUILD_INFO_FIELD_NUMBER;
        hash = (53 * hash) + getBuildInfo().hashCode();
      }
      if (getFingerprintsSupportedCount() > 0) {
        hash = (37 * hash) + FINGERPRINTS_SUPPORTED_FIELD_NUMBER;
        hash = (53 * hash) + fingerprintsSupported_.hashCode();
      }
      if (getCryptosuitesSupportedCount() > 0) {
        hash = (37 * hash) + CRYPTOSUITES_SUPPORTED_FIELD_NUMBER;
        hash = (53 * hash) + cryptosuitesSupported_.hashCode();
      }
      if (getPowschemesSupportedCount() > 0) {
        hash = (37 * hash) + POWSCHEMES_SUPPORTED_FIELD_NUMBER;
        hash = (53 * hash) + powschemesSupported_.hashCode();
      }
      if (hasLoginCryptoHello()) {
        hash = (37 * hash) + LOGIN_CRYPTO_HELLO_FIELD_NUMBER;
        hash = (53 * hash) + getLoginCryptoHello().hashCode();
      }
      if (hasClientNonce()) {
        hash = (37 * hash) + CLIENT_NONCE_FIELD_NUMBER;
        hash = (53 * hash) + getClientNonce().hashCode();
      }
      if (hasPadding()) {
        hash = (37 * hash) + PADDING_FIELD_NUMBER;
        hash = (53 * hash) + getPadding().hashCode();
      }
      if (hasFeatureSet()) {
        hash = (37 * hash) + FEATURE_SET_FIELD_NUMBER;
        hash = (53 * hash) + getFeatureSet().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.ClientHello parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientHello parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.ClientHello parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.ClientHello parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.ClientHello 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.ClientHello}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.ClientHello)
        com.spotify.Keyexchange.ClientHelloOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_ClientHello_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_ClientHello_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.ClientHello.class, com.spotify.Keyexchange.ClientHello.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.ClientHello.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getBuildInfoFieldBuilder();
          getLoginCryptoHelloFieldBuilder();
          getFeatureSetFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (buildInfoBuilder_ == null) {
          buildInfo_ = null;
        } else {
          buildInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        fingerprintsSupported_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000002);
        cryptosuitesSupported_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        powschemesSupported_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000008);
        if (loginCryptoHelloBuilder_ == null) {
          loginCryptoHello_ = null;
        } else {
          loginCryptoHelloBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        clientNonce_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000020);
        padding_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000040);
        if (featureSetBuilder_ == null) {
          featureSet_ = null;
        } else {
          featureSetBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_ClientHello_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.ClientHello getDefaultInstanceForType() {
        return com.spotify.Keyexchange.ClientHello.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.ClientHello build() {
        com.spotify.Keyexchange.ClientHello result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.ClientHello buildPartial() {
        com.spotify.Keyexchange.ClientHello result = new com.spotify.Keyexchange.ClientHello(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (buildInfoBuilder_ == null) {
            result.buildInfo_ = buildInfo_;
          } else {
            result.buildInfo_ = buildInfoBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          fingerprintsSupported_ = java.util.Collections.unmodifiableList(fingerprintsSupported_);
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.fingerprintsSupported_ = fingerprintsSupported_;
        if (((bitField0_ & 0x00000004) != 0)) {
          cryptosuitesSupported_ = java.util.Collections.unmodifiableList(cryptosuitesSupported_);
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.cryptosuitesSupported_ = cryptosuitesSupported_;
        if (((bitField0_ & 0x00000008) != 0)) {
          powschemesSupported_ = java.util.Collections.unmodifiableList(powschemesSupported_);
          bitField0_ = (bitField0_ & ~0x00000008);
        }
        result.powschemesSupported_ = powschemesSupported_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          if (loginCryptoHelloBuilder_ == null) {
            result.loginCryptoHello_ = loginCryptoHello_;
          } else {
            result.loginCryptoHello_ = loginCryptoHelloBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.clientNonce_ = clientNonce_;
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.padding_ = padding_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          if (featureSetBuilder_ == null) {
            result.featureSet_ = featureSet_;
          } else {
            result.featureSet_ = featureSetBuilder_.build();
          }
          to_bitField0_ |= 0x00000010;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.ClientHello) {
          return mergeFrom((com.spotify.Keyexchange.ClientHello)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.ClientHello other) {
        if (other == com.spotify.Keyexchange.ClientHello.getDefaultInstance()) return this;
        if (other.hasBuildInfo()) {
          mergeBuildInfo(other.getBuildInfo());
        }
        if (!other.fingerprintsSupported_.isEmpty()) {
          if (fingerprintsSupported_.isEmpty()) {
            fingerprintsSupported_ = other.fingerprintsSupported_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureFingerprintsSupportedIsMutable();
            fingerprintsSupported_.addAll(other.fingerprintsSupported_);
          }
          onChanged();
        }
        if (!other.cryptosuitesSupported_.isEmpty()) {
          if (cryptosuitesSupported_.isEmpty()) {
            cryptosuitesSupported_ = other.cryptosuitesSupported_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureCryptosuitesSupportedIsMutable();
            cryptosuitesSupported_.addAll(other.cryptosuitesSupported_);
          }
          onChanged();
        }
        if (!other.powschemesSupported_.isEmpty()) {
          if (powschemesSupported_.isEmpty()) {
            powschemesSupported_ = other.powschemesSupported_;
            bitField0_ = (bitField0_ & ~0x00000008);
          } else {
            ensurePowschemesSupportedIsMutable();
            powschemesSupported_.addAll(other.powschemesSupported_);
          }
          onChanged();
        }
        if (other.hasLoginCryptoHello()) {
          mergeLoginCryptoHello(other.getLoginCryptoHello());
        }
        if (other.hasClientNonce()) {
          setClientNonce(other.getClientNonce());
        }
        if (other.hasPadding()) {
          setPadding(other.getPadding());
        }
        if (other.hasFeatureSet()) {
          mergeFeatureSet(other.getFeatureSet());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasBuildInfo()) {
          return false;
        }
        if (!hasLoginCryptoHello()) {
          return false;
        }
        if (!hasClientNonce()) {
          return false;
        }
        if (!getBuildInfo().isInitialized()) {
          return false;
        }
        if (!getLoginCryptoHello().isInitialized()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.ClientHello parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.ClientHello) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.BuildInfo buildInfo_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.BuildInfo, com.spotify.Keyexchange.BuildInfo.Builder, com.spotify.Keyexchange.BuildInfoOrBuilder> buildInfoBuilder_;
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       * @return Whether the buildInfo field is set.
       */
      public boolean hasBuildInfo() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       * @return The buildInfo.
       */
      public com.spotify.Keyexchange.BuildInfo getBuildInfo() {
        if (buildInfoBuilder_ == null) {
          return buildInfo_ == null ? com.spotify.Keyexchange.BuildInfo.getDefaultInstance() : buildInfo_;
        } else {
          return buildInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       */
      public Builder setBuildInfo(com.spotify.Keyexchange.BuildInfo value) {
        if (buildInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          buildInfo_ = value;
          onChanged();
        } else {
          buildInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       */
      public Builder setBuildInfo(
          com.spotify.Keyexchange.BuildInfo.Builder builderForValue) {
        if (buildInfoBuilder_ == null) {
          buildInfo_ = builderForValue.build();
          onChanged();
        } else {
          buildInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       */
      public Builder mergeBuildInfo(com.spotify.Keyexchange.BuildInfo value) {
        if (buildInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              buildInfo_ != null &&
              buildInfo_ != com.spotify.Keyexchange.BuildInfo.getDefaultInstance()) {
            buildInfo_ =
              com.spotify.Keyexchange.BuildInfo.newBuilder(buildInfo_).mergeFrom(value).buildPartial();
          } else {
            buildInfo_ = value;
          }
          onChanged();
        } else {
          buildInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       */
      public Builder clearBuildInfo() {
        if (buildInfoBuilder_ == null) {
          buildInfo_ = null;
          onChanged();
        } else {
          buildInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       */
      public com.spotify.Keyexchange.BuildInfo.Builder getBuildInfoBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getBuildInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       */
      public com.spotify.Keyexchange.BuildInfoOrBuilder getBuildInfoOrBuilder() {
        if (buildInfoBuilder_ != null) {
          return buildInfoBuilder_.getMessageOrBuilder();
        } else {
          return buildInfo_ == null ?
              com.spotify.Keyexchange.BuildInfo.getDefaultInstance() : buildInfo_;
        }
      }
      /**
       * <code>required .spotify.BuildInfo build_info = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.BuildInfo, com.spotify.Keyexchange.BuildInfo.Builder, com.spotify.Keyexchange.BuildInfoOrBuilder> 
          getBuildInfoFieldBuilder() {
        if (buildInfoBuilder_ == null) {
          buildInfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.BuildInfo, com.spotify.Keyexchange.BuildInfo.Builder, com.spotify.Keyexchange.BuildInfoOrBuilder>(
                  getBuildInfo(),
                  getParentForChildren(),
                  isClean());
          buildInfo_ = null;
        }
        return buildInfoBuilder_;
      }

      private java.util.List<java.lang.Integer> fingerprintsSupported_ =
        java.util.Collections.emptyList();
      private void ensureFingerprintsSupportedIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          fingerprintsSupported_ = new java.util.ArrayList<java.lang.Integer>(fingerprintsSupported_);
          bitField0_ |= 0x00000002;
        }
      }
      /**
       * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
       * @return A list containing the fingerprintsSupported.
       */
      public java.util.List<com.spotify.Keyexchange.Fingerprint> getFingerprintsSupportedList() {
        return new com.google.protobuf.Internal.ListAdapter<
            java.lang.Integer, com.spotify.Keyexchange.Fingerprint>(fingerprintsSupported_, fingerprintsSupported_converter_);
      }
      /**
       * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
       * @return The count of fingerprintsSupported.
       */
      public int getFingerprintsSupportedCount() {
        return fingerprintsSupported_.size();
      }
      /**
       * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
       * @param index The index of the element to return.
       * @return The fingerprintsSupported at the given index.
       */
      public com.spotify.Keyexchange.Fingerprint getFingerprintsSupported(int index) {
        return fingerprintsSupported_converter_.convert(fingerprintsSupported_.get(index));
      }
      /**
       * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
       * @param index The index to set the value at.
       * @param value The fingerprintsSupported to set.
       * @return This builder for chaining.
       */
      public Builder setFingerprintsSupported(
          int index, com.spotify.Keyexchange.Fingerprint value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureFingerprintsSupportedIsMutable();
        fingerprintsSupported_.set(index, value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
       * @param value The fingerprintsSupported to add.
       * @return This builder for chaining.
       */
      public Builder addFingerprintsSupported(com.spotify.Keyexchange.Fingerprint value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureFingerprintsSupportedIsMutable();
        fingerprintsSupported_.add(value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
       * @param values The fingerprintsSupported to add.
       * @return This builder for chaining.
       */
      public Builder addAllFingerprintsSupported(
          java.lang.Iterable<? extends com.spotify.Keyexchange.Fingerprint> values) {
        ensureFingerprintsSupportedIsMutable();
        for (com.spotify.Keyexchange.Fingerprint value : values) {
          fingerprintsSupported_.add(value.getNumber());
        }
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Fingerprint fingerprints_supported = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearFingerprintsSupported() {
        fingerprintsSupported_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }

      private java.util.List<java.lang.Integer> cryptosuitesSupported_ =
        java.util.Collections.emptyList();
      private void ensureCryptosuitesSupportedIsMutable() {
        if (!((bitField0_ & 0x00000004) != 0)) {
          cryptosuitesSupported_ = new java.util.ArrayList<java.lang.Integer>(cryptosuitesSupported_);
          bitField0_ |= 0x00000004;
        }
      }
      /**
       * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
       * @return A list containing the cryptosuitesSupported.
       */
      public java.util.List<com.spotify.Keyexchange.Cryptosuite> getCryptosuitesSupportedList() {
        return new com.google.protobuf.Internal.ListAdapter<
            java.lang.Integer, com.spotify.Keyexchange.Cryptosuite>(cryptosuitesSupported_, cryptosuitesSupported_converter_);
      }
      /**
       * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
       * @return The count of cryptosuitesSupported.
       */
      public int getCryptosuitesSupportedCount() {
        return cryptosuitesSupported_.size();
      }
      /**
       * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
       * @param index The index of the element to return.
       * @return The cryptosuitesSupported at the given index.
       */
      public com.spotify.Keyexchange.Cryptosuite getCryptosuitesSupported(int index) {
        return cryptosuitesSupported_converter_.convert(cryptosuitesSupported_.get(index));
      }
      /**
       * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
       * @param index The index to set the value at.
       * @param value The cryptosuitesSupported to set.
       * @return This builder for chaining.
       */
      public Builder setCryptosuitesSupported(
          int index, com.spotify.Keyexchange.Cryptosuite value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureCryptosuitesSupportedIsMutable();
        cryptosuitesSupported_.set(index, value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
       * @param value The cryptosuitesSupported to add.
       * @return This builder for chaining.
       */
      public Builder addCryptosuitesSupported(com.spotify.Keyexchange.Cryptosuite value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureCryptosuitesSupportedIsMutable();
        cryptosuitesSupported_.add(value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
       * @param values The cryptosuitesSupported to add.
       * @return This builder for chaining.
       */
      public Builder addAllCryptosuitesSupported(
          java.lang.Iterable<? extends com.spotify.Keyexchange.Cryptosuite> values) {
        ensureCryptosuitesSupportedIsMutable();
        for (com.spotify.Keyexchange.Cryptosuite value : values) {
          cryptosuitesSupported_.add(value.getNumber());
        }
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Cryptosuite cryptosuites_supported = 30;</code>
       * @return This builder for chaining.
       */
      public Builder clearCryptosuitesSupported() {
        cryptosuitesSupported_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      private java.util.List<java.lang.Integer> powschemesSupported_ =
        java.util.Collections.emptyList();
      private void ensurePowschemesSupportedIsMutable() {
        if (!((bitField0_ & 0x00000008) != 0)) {
          powschemesSupported_ = new java.util.ArrayList<java.lang.Integer>(powschemesSupported_);
          bitField0_ |= 0x00000008;
        }
      }
      /**
       * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
       * @return A list containing the powschemesSupported.
       */
      public java.util.List<com.spotify.Keyexchange.Powscheme> getPowschemesSupportedList() {
        return new com.google.protobuf.Internal.ListAdapter<
            java.lang.Integer, com.spotify.Keyexchange.Powscheme>(powschemesSupported_, powschemesSupported_converter_);
      }
      /**
       * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
       * @return The count of powschemesSupported.
       */
      public int getPowschemesSupportedCount() {
        return powschemesSupported_.size();
      }
      /**
       * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
       * @param index The index of the element to return.
       * @return The powschemesSupported at the given index.
       */
      public com.spotify.Keyexchange.Powscheme getPowschemesSupported(int index) {
        return powschemesSupported_converter_.convert(powschemesSupported_.get(index));
      }
      /**
       * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
       * @param index The index to set the value at.
       * @param value The powschemesSupported to set.
       * @return This builder for chaining.
       */
      public Builder setPowschemesSupported(
          int index, com.spotify.Keyexchange.Powscheme value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensurePowschemesSupportedIsMutable();
        powschemesSupported_.set(index, value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
       * @param value The powschemesSupported to add.
       * @return This builder for chaining.
       */
      public Builder addPowschemesSupported(com.spotify.Keyexchange.Powscheme value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensurePowschemesSupportedIsMutable();
        powschemesSupported_.add(value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
       * @param values The powschemesSupported to add.
       * @return This builder for chaining.
       */
      public Builder addAllPowschemesSupported(
          java.lang.Iterable<? extends com.spotify.Keyexchange.Powscheme> values) {
        ensurePowschemesSupportedIsMutable();
        for (com.spotify.Keyexchange.Powscheme value : values) {
          powschemesSupported_.add(value.getNumber());
        }
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.Powscheme powschemes_supported = 40;</code>
       * @return This builder for chaining.
       */
      public Builder clearPowschemesSupported() {
        powschemesSupported_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000008);
        onChanged();
        return this;
      }

      private com.spotify.Keyexchange.LoginCryptoHelloUnion loginCryptoHello_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoHelloUnion, com.spotify.Keyexchange.LoginCryptoHelloUnion.Builder, com.spotify.Keyexchange.LoginCryptoHelloUnionOrBuilder> loginCryptoHelloBuilder_;
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       * @return Whether the loginCryptoHello field is set.
       */
      public boolean hasLoginCryptoHello() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       * @return The loginCryptoHello.
       */
      public com.spotify.Keyexchange.LoginCryptoHelloUnion getLoginCryptoHello() {
        if (loginCryptoHelloBuilder_ == null) {
          return loginCryptoHello_ == null ? com.spotify.Keyexchange.LoginCryptoHelloUnion.getDefaultInstance() : loginCryptoHello_;
        } else {
          return loginCryptoHelloBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       */
      public Builder setLoginCryptoHello(com.spotify.Keyexchange.LoginCryptoHelloUnion value) {
        if (loginCryptoHelloBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          loginCryptoHello_ = value;
          onChanged();
        } else {
          loginCryptoHelloBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       */
      public Builder setLoginCryptoHello(
          com.spotify.Keyexchange.LoginCryptoHelloUnion.Builder builderForValue) {
        if (loginCryptoHelloBuilder_ == null) {
          loginCryptoHello_ = builderForValue.build();
          onChanged();
        } else {
          loginCryptoHelloBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       */
      public Builder mergeLoginCryptoHello(com.spotify.Keyexchange.LoginCryptoHelloUnion value) {
        if (loginCryptoHelloBuilder_ == null) {
          if (((bitField0_ & 0x00000010) != 0) &&
              loginCryptoHello_ != null &&
              loginCryptoHello_ != com.spotify.Keyexchange.LoginCryptoHelloUnion.getDefaultInstance()) {
            loginCryptoHello_ =
              com.spotify.Keyexchange.LoginCryptoHelloUnion.newBuilder(loginCryptoHello_).mergeFrom(value).buildPartial();
          } else {
            loginCryptoHello_ = value;
          }
          onChanged();
        } else {
          loginCryptoHelloBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       */
      public Builder clearLoginCryptoHello() {
        if (loginCryptoHelloBuilder_ == null) {
          loginCryptoHello_ = null;
          onChanged();
        } else {
          loginCryptoHelloBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoHelloUnion.Builder getLoginCryptoHelloBuilder() {
        bitField0_ |= 0x00000010;
        onChanged();
        return getLoginCryptoHelloFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoHelloUnionOrBuilder getLoginCryptoHelloOrBuilder() {
        if (loginCryptoHelloBuilder_ != null) {
          return loginCryptoHelloBuilder_.getMessageOrBuilder();
        } else {
          return loginCryptoHello_ == null ?
              com.spotify.Keyexchange.LoginCryptoHelloUnion.getDefaultInstance() : loginCryptoHello_;
        }
      }
      /**
       * <code>required .spotify.LoginCryptoHelloUnion login_crypto_hello = 50;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoHelloUnion, com.spotify.Keyexchange.LoginCryptoHelloUnion.Builder, com.spotify.Keyexchange.LoginCryptoHelloUnionOrBuilder> 
          getLoginCryptoHelloFieldBuilder() {
        if (loginCryptoHelloBuilder_ == null) {
          loginCryptoHelloBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.LoginCryptoHelloUnion, com.spotify.Keyexchange.LoginCryptoHelloUnion.Builder, com.spotify.Keyexchange.LoginCryptoHelloUnionOrBuilder>(
                  getLoginCryptoHello(),
                  getParentForChildren(),
                  isClean());
          loginCryptoHello_ = null;
        }
        return loginCryptoHelloBuilder_;
      }

      private com.google.protobuf.ByteString clientNonce_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes client_nonce = 60;</code>
       * @return Whether the clientNonce field is set.
       */
      public boolean hasClientNonce() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <code>required bytes client_nonce = 60;</code>
       * @return The clientNonce.
       */
      public com.google.protobuf.ByteString getClientNonce() {
        return clientNonce_;
      }
      /**
       * <code>required bytes client_nonce = 60;</code>
       * @param value The clientNonce to set.
       * @return This builder for chaining.
       */
      public Builder setClientNonce(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        clientNonce_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes client_nonce = 60;</code>
       * @return This builder for chaining.
       */
      public Builder clearClientNonce() {
        bitField0_ = (bitField0_ & ~0x00000020);
        clientNonce_ = getDefaultInstance().getClientNonce();
        onChanged();
        return this;
      }

      private com.google.protobuf.ByteString padding_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>optional bytes padding = 70;</code>
       * @return Whether the padding field is set.
       */
      public boolean hasPadding() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <code>optional bytes padding = 70;</code>
       * @return The padding.
       */
      public com.google.protobuf.ByteString getPadding() {
        return padding_;
      }
      /**
       * <code>optional bytes padding = 70;</code>
       * @param value The padding to set.
       * @return This builder for chaining.
       */
      public Builder setPadding(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        padding_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bytes padding = 70;</code>
       * @return This builder for chaining.
       */
      public Builder clearPadding() {
        bitField0_ = (bitField0_ & ~0x00000040);
        padding_ = getDefaultInstance().getPadding();
        onChanged();
        return this;
      }

      private com.spotify.Keyexchange.FeatureSet featureSet_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.FeatureSet, com.spotify.Keyexchange.FeatureSet.Builder, com.spotify.Keyexchange.FeatureSetOrBuilder> featureSetBuilder_;
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       * @return Whether the featureSet field is set.
       */
      public boolean hasFeatureSet() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       * @return The featureSet.
       */
      public com.spotify.Keyexchange.FeatureSet getFeatureSet() {
        if (featureSetBuilder_ == null) {
          return featureSet_ == null ? com.spotify.Keyexchange.FeatureSet.getDefaultInstance() : featureSet_;
        } else {
          return featureSetBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       */
      public Builder setFeatureSet(com.spotify.Keyexchange.FeatureSet value) {
        if (featureSetBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          featureSet_ = value;
          onChanged();
        } else {
          featureSetBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       */
      public Builder setFeatureSet(
          com.spotify.Keyexchange.FeatureSet.Builder builderForValue) {
        if (featureSetBuilder_ == null) {
          featureSet_ = builderForValue.build();
          onChanged();
        } else {
          featureSetBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       */
      public Builder mergeFeatureSet(com.spotify.Keyexchange.FeatureSet value) {
        if (featureSetBuilder_ == null) {
          if (((bitField0_ & 0x00000080) != 0) &&
              featureSet_ != null &&
              featureSet_ != com.spotify.Keyexchange.FeatureSet.getDefaultInstance()) {
            featureSet_ =
              com.spotify.Keyexchange.FeatureSet.newBuilder(featureSet_).mergeFrom(value).buildPartial();
          } else {
            featureSet_ = value;
          }
          onChanged();
        } else {
          featureSetBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       */
      public Builder clearFeatureSet() {
        if (featureSetBuilder_ == null) {
          featureSet_ = null;
          onChanged();
        } else {
          featureSetBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       */
      public com.spotify.Keyexchange.FeatureSet.Builder getFeatureSetBuilder() {
        bitField0_ |= 0x00000080;
        onChanged();
        return getFeatureSetFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       */
      public com.spotify.Keyexchange.FeatureSetOrBuilder getFeatureSetOrBuilder() {
        if (featureSetBuilder_ != null) {
          return featureSetBuilder_.getMessageOrBuilder();
        } else {
          return featureSet_ == null ?
              com.spotify.Keyexchange.FeatureSet.getDefaultInstance() : featureSet_;
        }
      }
      /**
       * <code>optional .spotify.FeatureSet feature_set = 80;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.FeatureSet, com.spotify.Keyexchange.FeatureSet.Builder, com.spotify.Keyexchange.FeatureSetOrBuilder> 
          getFeatureSetFieldBuilder() {
        if (featureSetBuilder_ == null) {
          featureSetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.FeatureSet, com.spotify.Keyexchange.FeatureSet.Builder, com.spotify.Keyexchange.FeatureSetOrBuilder>(
                  getFeatureSet(),
                  getParentForChildren(),
                  isClean());
          featureSet_ = null;
        }
        return featureSetBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.ClientHello)
    }

    // @@protoc_insertion_point(class_scope:spotify.ClientHello)
    private static final com.spotify.Keyexchange.ClientHello DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.ClientHello();
    }

    public static com.spotify.Keyexchange.ClientHello getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<ClientHello>
        PARSER = new com.google.protobuf.AbstractParser<ClientHello>() {
      @java.lang.Override
      public ClientHello parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ClientHello(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.ClientHello getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BuildInfoOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.BuildInfo)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required .spotify.Product product = 10;</code>
     * @return Whether the product field is set.
     */
    boolean hasProduct();
    /**
     * <code>required .spotify.Product product = 10;</code>
     * @return The product.
     */
    com.spotify.Keyexchange.Product getProduct();

    /**
     * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
     * @return A list containing the productFlags.
     */
    java.util.List<com.spotify.Keyexchange.ProductFlags> getProductFlagsList();
    /**
     * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
     * @return The count of productFlags.
     */
    int getProductFlagsCount();
    /**
     * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
     * @param index The index of the element to return.
     * @return The productFlags at the given index.
     */
    com.spotify.Keyexchange.ProductFlags getProductFlags(int index);

    /**
     * <code>required .spotify.Platform platform = 30;</code>
     * @return Whether the platform field is set.
     */
    boolean hasPlatform();
    /**
     * <code>required .spotify.Platform platform = 30;</code>
     * @return The platform.
     */
    com.spotify.Keyexchange.Platform getPlatform();

    /**
     * <code>required uint64 version = 40;</code>
     * @return Whether the version field is set.
     */
    boolean hasVersion();
    /**
     * <code>required uint64 version = 40;</code>
     * @return The version.
     */
    long getVersion();
  }
  /**
   * Protobuf type {@code spotify.BuildInfo}
   */
  public  static final class BuildInfo extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.BuildInfo)
      BuildInfoOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use BuildInfo.newBuilder() to construct.
    private BuildInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private BuildInfo() {
      product_ = 0;
      productFlags_ = java.util.Collections.emptyList();
      platform_ = 0;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new BuildInfo();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private BuildInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 80: {
              int rawValue = input.readEnum();
                @SuppressWarnings("deprecation")
              com.spotify.Keyexchange.Product value = com.spotify.Keyexchange.Product.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(10, rawValue);
              } else {
                bitField0_ |= 0x00000001;
                product_ = rawValue;
              }
              break;
            }
            case 160: {
              int rawValue = input.readEnum();
              @SuppressWarnings("deprecation")
              com.spotify.Keyexchange.ProductFlags value = com.spotify.Keyexchange.ProductFlags.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(20, rawValue);
              } else {
                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                  productFlags_ = new java.util.ArrayList<java.lang.Integer>();
                  mutable_bitField0_ |= 0x00000002;
                }
                productFlags_.add(rawValue);
              }
              break;
            }
            case 162: {
              int length = input.readRawVarint32();
              int oldLimit = input.pushLimit(length);
              while(input.getBytesUntilLimit() > 0) {
                int rawValue = input.readEnum();
                @SuppressWarnings("deprecation")
                com.spotify.Keyexchange.ProductFlags value = com.spotify.Keyexchange.ProductFlags.valueOf(rawValue);
                if (value == null) {
                  unknownFields.mergeVarintField(20, rawValue);
                } else {
                  if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                    productFlags_ = new java.util.ArrayList<java.lang.Integer>();
                    mutable_bitField0_ |= 0x00000002;
                  }
                  productFlags_.add(rawValue);
                }
              }
              input.popLimit(oldLimit);
              break;
            }
            case 240: {
              int rawValue = input.readEnum();
                @SuppressWarnings("deprecation")
              com.spotify.Keyexchange.Platform value = com.spotify.Keyexchange.Platform.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(30, rawValue);
              } else {
                bitField0_ |= 0x00000002;
                platform_ = rawValue;
              }
              break;
            }
            case 320: {
              bitField0_ |= 0x00000004;
              version_ = input.readUInt64();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          productFlags_ = java.util.Collections.unmodifiableList(productFlags_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_BuildInfo_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_BuildInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.BuildInfo.class, com.spotify.Keyexchange.BuildInfo.Builder.class);
    }

    private int bitField0_;
    public static final int PRODUCT_FIELD_NUMBER = 10;
    private int product_;
    /**
     * <code>required .spotify.Product product = 10;</code>
     * @return Whether the product field is set.
     */
    public boolean hasProduct() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required .spotify.Product product = 10;</code>
     * @return The product.
     */
    public com.spotify.Keyexchange.Product getProduct() {
      @SuppressWarnings("deprecation")
      com.spotify.Keyexchange.Product result = com.spotify.Keyexchange.Product.valueOf(product_);
      return result == null ? com.spotify.Keyexchange.Product.PRODUCT_CLIENT : result;
    }

    public static final int PRODUCT_FLAGS_FIELD_NUMBER = 20;
    private java.util.List<java.lang.Integer> productFlags_;
    private static final com.google.protobuf.Internal.ListAdapter.Converter<
        java.lang.Integer, com.spotify.Keyexchange.ProductFlags> productFlags_converter_ =
            new com.google.protobuf.Internal.ListAdapter.Converter<
                java.lang.Integer, com.spotify.Keyexchange.ProductFlags>() {
              public com.spotify.Keyexchange.ProductFlags convert(java.lang.Integer from) {
                @SuppressWarnings("deprecation")
                com.spotify.Keyexchange.ProductFlags result = com.spotify.Keyexchange.ProductFlags.valueOf(from);
                return result == null ? com.spotify.Keyexchange.ProductFlags.PRODUCT_FLAG_NONE : result;
              }
            };
    /**
     * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
     * @return A list containing the productFlags.
     */
    public java.util.List<com.spotify.Keyexchange.ProductFlags> getProductFlagsList() {
      return new com.google.protobuf.Internal.ListAdapter<
          java.lang.Integer, com.spotify.Keyexchange.ProductFlags>(productFlags_, productFlags_converter_);
    }
    /**
     * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
     * @return The count of productFlags.
     */
    public int getProductFlagsCount() {
      return productFlags_.size();
    }
    /**
     * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
     * @param index The index of the element to return.
     * @return The productFlags at the given index.
     */
    public com.spotify.Keyexchange.ProductFlags getProductFlags(int index) {
      return productFlags_converter_.convert(productFlags_.get(index));
    }

    public static final int PLATFORM_FIELD_NUMBER = 30;
    private int platform_;
    /**
     * <code>required .spotify.Platform platform = 30;</code>
     * @return Whether the platform field is set.
     */
    public boolean hasPlatform() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required .spotify.Platform platform = 30;</code>
     * @return The platform.
     */
    public com.spotify.Keyexchange.Platform getPlatform() {
      @SuppressWarnings("deprecation")
      com.spotify.Keyexchange.Platform result = com.spotify.Keyexchange.Platform.valueOf(platform_);
      return result == null ? com.spotify.Keyexchange.Platform.PLATFORM_WIN32_X86 : result;
    }

    public static final int VERSION_FIELD_NUMBER = 40;
    private long version_;
    /**
     * <code>required uint64 version = 40;</code>
     * @return Whether the version field is set.
     */
    public boolean hasVersion() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required uint64 version = 40;</code>
     * @return The version.
     */
    public long getVersion() {
      return version_;
    }

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

      if (!hasProduct()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasPlatform()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasVersion()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeEnum(10, product_);
      }
      for (int i = 0; i < productFlags_.size(); i++) {
        output.writeEnum(20, productFlags_.get(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeEnum(30, platform_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeUInt64(40, version_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(10, product_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < productFlags_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeEnumSizeNoTag(productFlags_.get(i));
        }
        size += dataSize;
        size += 2 * productFlags_.size();
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(30, platform_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeUInt64Size(40, version_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.BuildInfo)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.BuildInfo other = (com.spotify.Keyexchange.BuildInfo) obj;

      if (hasProduct() != other.hasProduct()) return false;
      if (hasProduct()) {
        if (product_ != other.product_) return false;
      }
      if (!productFlags_.equals(other.productFlags_)) return false;
      if (hasPlatform() != other.hasPlatform()) return false;
      if (hasPlatform()) {
        if (platform_ != other.platform_) return false;
      }
      if (hasVersion() != other.hasVersion()) return false;
      if (hasVersion()) {
        if (getVersion()
            != other.getVersion()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasProduct()) {
        hash = (37 * hash) + PRODUCT_FIELD_NUMBER;
        hash = (53 * hash) + product_;
      }
      if (getProductFlagsCount() > 0) {
        hash = (37 * hash) + PRODUCT_FLAGS_FIELD_NUMBER;
        hash = (53 * hash) + productFlags_.hashCode();
      }
      if (hasPlatform()) {
        hash = (37 * hash) + PLATFORM_FIELD_NUMBER;
        hash = (53 * hash) + platform_;
      }
      if (hasVersion()) {
        hash = (37 * hash) + VERSION_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getVersion());
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.BuildInfo parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.BuildInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.BuildInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.BuildInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.BuildInfo 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.BuildInfo}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.BuildInfo)
        com.spotify.Keyexchange.BuildInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_BuildInfo_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_BuildInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.BuildInfo.class, com.spotify.Keyexchange.BuildInfo.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.BuildInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        product_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        productFlags_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000002);
        platform_ = 0;
        bitField0_ = (bitField0_ & ~0x00000004);
        version_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_BuildInfo_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.BuildInfo getDefaultInstanceForType() {
        return com.spotify.Keyexchange.BuildInfo.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.BuildInfo build() {
        com.spotify.Keyexchange.BuildInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.BuildInfo buildPartial() {
        com.spotify.Keyexchange.BuildInfo result = new com.spotify.Keyexchange.BuildInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.product_ = product_;
        if (((bitField0_ & 0x00000002) != 0)) {
          productFlags_ = java.util.Collections.unmodifiableList(productFlags_);
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.productFlags_ = productFlags_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.platform_ = platform_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.version_ = version_;
          to_bitField0_ |= 0x00000004;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.BuildInfo) {
          return mergeFrom((com.spotify.Keyexchange.BuildInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.BuildInfo other) {
        if (other == com.spotify.Keyexchange.BuildInfo.getDefaultInstance()) return this;
        if (other.hasProduct()) {
          setProduct(other.getProduct());
        }
        if (!other.productFlags_.isEmpty()) {
          if (productFlags_.isEmpty()) {
            productFlags_ = other.productFlags_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureProductFlagsIsMutable();
            productFlags_.addAll(other.productFlags_);
          }
          onChanged();
        }
        if (other.hasPlatform()) {
          setPlatform(other.getPlatform());
        }
        if (other.hasVersion()) {
          setVersion(other.getVersion());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasProduct()) {
          return false;
        }
        if (!hasPlatform()) {
          return false;
        }
        if (!hasVersion()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.BuildInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.BuildInfo) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private int product_ = 0;
      /**
       * <code>required .spotify.Product product = 10;</code>
       * @return Whether the product field is set.
       */
      public boolean hasProduct() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required .spotify.Product product = 10;</code>
       * @return The product.
       */
      public com.spotify.Keyexchange.Product getProduct() {
        @SuppressWarnings("deprecation")
        com.spotify.Keyexchange.Product result = com.spotify.Keyexchange.Product.valueOf(product_);
        return result == null ? com.spotify.Keyexchange.Product.PRODUCT_CLIENT : result;
      }
      /**
       * <code>required .spotify.Product product = 10;</code>
       * @param value The product to set.
       * @return This builder for chaining.
       */
      public Builder setProduct(com.spotify.Keyexchange.Product value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000001;
        product_ = value.getNumber();
        onChanged();
        return this;
      }
      /**
       * <code>required .spotify.Product product = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearProduct() {
        bitField0_ = (bitField0_ & ~0x00000001);
        product_ = 0;
        onChanged();
        return this;
      }

      private java.util.List<java.lang.Integer> productFlags_ =
        java.util.Collections.emptyList();
      private void ensureProductFlagsIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          productFlags_ = new java.util.ArrayList<java.lang.Integer>(productFlags_);
          bitField0_ |= 0x00000002;
        }
      }
      /**
       * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
       * @return A list containing the productFlags.
       */
      public java.util.List<com.spotify.Keyexchange.ProductFlags> getProductFlagsList() {
        return new com.google.protobuf.Internal.ListAdapter<
            java.lang.Integer, com.spotify.Keyexchange.ProductFlags>(productFlags_, productFlags_converter_);
      }
      /**
       * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
       * @return The count of productFlags.
       */
      public int getProductFlagsCount() {
        return productFlags_.size();
      }
      /**
       * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
       * @param index The index of the element to return.
       * @return The productFlags at the given index.
       */
      public com.spotify.Keyexchange.ProductFlags getProductFlags(int index) {
        return productFlags_converter_.convert(productFlags_.get(index));
      }
      /**
       * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
       * @param index The index to set the value at.
       * @param value The productFlags to set.
       * @return This builder for chaining.
       */
      public Builder setProductFlags(
          int index, com.spotify.Keyexchange.ProductFlags value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureProductFlagsIsMutable();
        productFlags_.set(index, value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
       * @param value The productFlags to add.
       * @return This builder for chaining.
       */
      public Builder addProductFlags(com.spotify.Keyexchange.ProductFlags value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureProductFlagsIsMutable();
        productFlags_.add(value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
       * @param values The productFlags to add.
       * @return This builder for chaining.
       */
      public Builder addAllProductFlags(
          java.lang.Iterable<? extends com.spotify.Keyexchange.ProductFlags> values) {
        ensureProductFlagsIsMutable();
        for (com.spotify.Keyexchange.ProductFlags value : values) {
          productFlags_.add(value.getNumber());
        }
        onChanged();
        return this;
      }
      /**
       * <code>repeated .spotify.ProductFlags product_flags = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearProductFlags() {
        productFlags_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }

      private int platform_ = 0;
      /**
       * <code>required .spotify.Platform platform = 30;</code>
       * @return Whether the platform field is set.
       */
      public boolean hasPlatform() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>required .spotify.Platform platform = 30;</code>
       * @return The platform.
       */
      public com.spotify.Keyexchange.Platform getPlatform() {
        @SuppressWarnings("deprecation")
        com.spotify.Keyexchange.Platform result = com.spotify.Keyexchange.Platform.valueOf(platform_);
        return result == null ? com.spotify.Keyexchange.Platform.PLATFORM_WIN32_X86 : result;
      }
      /**
       * <code>required .spotify.Platform platform = 30;</code>
       * @param value The platform to set.
       * @return This builder for chaining.
       */
      public Builder setPlatform(com.spotify.Keyexchange.Platform value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000004;
        platform_ = value.getNumber();
        onChanged();
        return this;
      }
      /**
       * <code>required .spotify.Platform platform = 30;</code>
       * @return This builder for chaining.
       */
      public Builder clearPlatform() {
        bitField0_ = (bitField0_ & ~0x00000004);
        platform_ = 0;
        onChanged();
        return this;
      }

      private long version_ ;
      /**
       * <code>required uint64 version = 40;</code>
       * @return Whether the version field is set.
       */
      public boolean hasVersion() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>required uint64 version = 40;</code>
       * @return The version.
       */
      public long getVersion() {
        return version_;
      }
      /**
       * <code>required uint64 version = 40;</code>
       * @param value The version to set.
       * @return This builder for chaining.
       */
      public Builder setVersion(long value) {
        bitField0_ |= 0x00000008;
        version_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required uint64 version = 40;</code>
       * @return This builder for chaining.
       */
      public Builder clearVersion() {
        bitField0_ = (bitField0_ & ~0x00000008);
        version_ = 0L;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.BuildInfo)
    }

    // @@protoc_insertion_point(class_scope:spotify.BuildInfo)
    private static final com.spotify.Keyexchange.BuildInfo DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.BuildInfo();
    }

    public static com.spotify.Keyexchange.BuildInfo getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<BuildInfo>
        PARSER = new com.google.protobuf.AbstractParser<BuildInfo>() {
      @java.lang.Override
      public BuildInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new BuildInfo(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.BuildInfo getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface LoginCryptoHelloUnionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.LoginCryptoHelloUnion)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
     * @return Whether the diffieHellman field is set.
     */
    boolean hasDiffieHellman();
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
     * @return The diffieHellman.
     */
    com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello getDiffieHellman();
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
     */
    com.spotify.Keyexchange.LoginCryptoDiffieHellmanHelloOrBuilder getDiffieHellmanOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.LoginCryptoHelloUnion}
   */
  public  static final class LoginCryptoHelloUnion extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.LoginCryptoHelloUnion)
      LoginCryptoHelloUnionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use LoginCryptoHelloUnion.newBuilder() to construct.
    private LoginCryptoHelloUnion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private LoginCryptoHelloUnion() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new LoginCryptoHelloUnion();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private LoginCryptoHelloUnion(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = diffieHellman_.toBuilder();
              }
              diffieHellman_ = input.readMessage(com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(diffieHellman_);
                diffieHellman_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoHelloUnion_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoHelloUnion_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.LoginCryptoHelloUnion.class, com.spotify.Keyexchange.LoginCryptoHelloUnion.Builder.class);
    }

    private int bitField0_;
    public static final int DIFFIE_HELLMAN_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello diffieHellman_;
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
     * @return Whether the diffieHellman field is set.
     */
    public boolean hasDiffieHellman() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
     * @return The diffieHellman.
     */
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello getDiffieHellman() {
      return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.getDefaultInstance() : diffieHellman_;
    }
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
     */
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHelloOrBuilder getDiffieHellmanOrBuilder() {
      return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.getDefaultInstance() : diffieHellman_;
    }

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

      if (hasDiffieHellman()) {
        if (!getDiffieHellman().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getDiffieHellman());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getDiffieHellman());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.LoginCryptoHelloUnion)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.LoginCryptoHelloUnion other = (com.spotify.Keyexchange.LoginCryptoHelloUnion) obj;

      if (hasDiffieHellman() != other.hasDiffieHellman()) return false;
      if (hasDiffieHellman()) {
        if (!getDiffieHellman()
            .equals(other.getDiffieHellman())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoHelloUnion parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.LoginCryptoHelloUnion 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.LoginCryptoHelloUnion}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.LoginCryptoHelloUnion)
        com.spotify.Keyexchange.LoginCryptoHelloUnionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoHelloUnion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoHelloUnion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.LoginCryptoHelloUnion.class, com.spotify.Keyexchange.LoginCryptoHelloUnion.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.LoginCryptoHelloUnion.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getDiffieHellmanFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = null;
        } else {
          diffieHellmanBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoHelloUnion_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoHelloUnion getDefaultInstanceForType() {
        return com.spotify.Keyexchange.LoginCryptoHelloUnion.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoHelloUnion build() {
        com.spotify.Keyexchange.LoginCryptoHelloUnion result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoHelloUnion buildPartial() {
        com.spotify.Keyexchange.LoginCryptoHelloUnion result = new com.spotify.Keyexchange.LoginCryptoHelloUnion(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (diffieHellmanBuilder_ == null) {
            result.diffieHellman_ = diffieHellman_;
          } else {
            result.diffieHellman_ = diffieHellmanBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.LoginCryptoHelloUnion) {
          return mergeFrom((com.spotify.Keyexchange.LoginCryptoHelloUnion)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.LoginCryptoHelloUnion other) {
        if (other == com.spotify.Keyexchange.LoginCryptoHelloUnion.getDefaultInstance()) return this;
        if (other.hasDiffieHellman()) {
          mergeDiffieHellman(other.getDiffieHellman());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (hasDiffieHellman()) {
          if (!getDiffieHellman().isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.LoginCryptoHelloUnion parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.LoginCryptoHelloUnion) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello diffieHellman_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello, com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanHelloOrBuilder> diffieHellmanBuilder_;
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       * @return Whether the diffieHellman field is set.
       */
      public boolean hasDiffieHellman() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       * @return The diffieHellman.
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello getDiffieHellman() {
        if (diffieHellmanBuilder_ == null) {
          return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.getDefaultInstance() : diffieHellman_;
        } else {
          return diffieHellmanBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       */
      public Builder setDiffieHellman(com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello value) {
        if (diffieHellmanBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          diffieHellman_ = value;
          onChanged();
        } else {
          diffieHellmanBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       */
      public Builder setDiffieHellman(
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.Builder builderForValue) {
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = builderForValue.build();
          onChanged();
        } else {
          diffieHellmanBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       */
      public Builder mergeDiffieHellman(com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello value) {
        if (diffieHellmanBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              diffieHellman_ != null &&
              diffieHellman_ != com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.getDefaultInstance()) {
            diffieHellman_ =
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.newBuilder(diffieHellman_).mergeFrom(value).buildPartial();
          } else {
            diffieHellman_ = value;
          }
          onChanged();
        } else {
          diffieHellmanBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       */
      public Builder clearDiffieHellman() {
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = null;
          onChanged();
        } else {
          diffieHellmanBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.Builder getDiffieHellmanBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getDiffieHellmanFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHelloOrBuilder getDiffieHellmanOrBuilder() {
        if (diffieHellmanBuilder_ != null) {
          return diffieHellmanBuilder_.getMessageOrBuilder();
        } else {
          return diffieHellman_ == null ?
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.getDefaultInstance() : diffieHellman_;
        }
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanHello diffie_hellman = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello, com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanHelloOrBuilder> 
          getDiffieHellmanFieldBuilder() {
        if (diffieHellmanBuilder_ == null) {
          diffieHellmanBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello, com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanHelloOrBuilder>(
                  getDiffieHellman(),
                  getParentForChildren(),
                  isClean());
          diffieHellman_ = null;
        }
        return diffieHellmanBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.LoginCryptoHelloUnion)
    }

    // @@protoc_insertion_point(class_scope:spotify.LoginCryptoHelloUnion)
    private static final com.spotify.Keyexchange.LoginCryptoHelloUnion DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.LoginCryptoHelloUnion();
    }

    public static com.spotify.Keyexchange.LoginCryptoHelloUnion getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<LoginCryptoHelloUnion>
        PARSER = new com.google.protobuf.AbstractParser<LoginCryptoHelloUnion>() {
      @java.lang.Override
      public LoginCryptoHelloUnion parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LoginCryptoHelloUnion(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.LoginCryptoHelloUnion getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface LoginCryptoDiffieHellmanHelloOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.LoginCryptoDiffieHellmanHello)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required bytes gc = 10;</code>
     * @return Whether the gc field is set.
     */
    boolean hasGc();
    /**
     * <code>required bytes gc = 10;</code>
     * @return The gc.
     */
    com.google.protobuf.ByteString getGc();

    /**
     * <code>required uint32 server_keys_known = 20;</code>
     * @return Whether the serverKeysKnown field is set.
     */
    boolean hasServerKeysKnown();
    /**
     * <code>required uint32 server_keys_known = 20;</code>
     * @return The serverKeysKnown.
     */
    int getServerKeysKnown();
  }
  /**
   * Protobuf type {@code spotify.LoginCryptoDiffieHellmanHello}
   */
  public  static final class LoginCryptoDiffieHellmanHello extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.LoginCryptoDiffieHellmanHello)
      LoginCryptoDiffieHellmanHelloOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use LoginCryptoDiffieHellmanHello.newBuilder() to construct.
    private LoginCryptoDiffieHellmanHello(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private LoginCryptoDiffieHellmanHello() {
      gc_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new LoginCryptoDiffieHellmanHello();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private LoginCryptoDiffieHellmanHello(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              bitField0_ |= 0x00000001;
              gc_ = input.readBytes();
              break;
            }
            case 160: {
              bitField0_ |= 0x00000002;
              serverKeysKnown_ = input.readUInt32();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanHello_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanHello_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.class, com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.Builder.class);
    }

    private int bitField0_;
    public static final int GC_FIELD_NUMBER = 10;
    private com.google.protobuf.ByteString gc_;
    /**
     * <code>required bytes gc = 10;</code>
     * @return Whether the gc field is set.
     */
    public boolean hasGc() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required bytes gc = 10;</code>
     * @return The gc.
     */
    public com.google.protobuf.ByteString getGc() {
      return gc_;
    }

    public static final int SERVER_KEYS_KNOWN_FIELD_NUMBER = 20;
    private int serverKeysKnown_;
    /**
     * <code>required uint32 server_keys_known = 20;</code>
     * @return Whether the serverKeysKnown field is set.
     */
    public boolean hasServerKeysKnown() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required uint32 server_keys_known = 20;</code>
     * @return The serverKeysKnown.
     */
    public int getServerKeysKnown() {
      return serverKeysKnown_;
    }

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

      if (!hasGc()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasServerKeysKnown()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeBytes(10, gc_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeUInt32(20, serverKeysKnown_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, gc_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeUInt32Size(20, serverKeysKnown_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello other = (com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello) obj;

      if (hasGc() != other.hasGc()) return false;
      if (hasGc()) {
        if (!getGc()
            .equals(other.getGc())) return false;
      }
      if (hasServerKeysKnown() != other.hasServerKeysKnown()) return false;
      if (hasServerKeysKnown()) {
        if (getServerKeysKnown()
            != other.getServerKeysKnown()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasGc()) {
        hash = (37 * hash) + GC_FIELD_NUMBER;
        hash = (53 * hash) + getGc().hashCode();
      }
      if (hasServerKeysKnown()) {
        hash = (37 * hash) + SERVER_KEYS_KNOWN_FIELD_NUMBER;
        hash = (53 * hash) + getServerKeysKnown();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.LoginCryptoDiffieHellmanHello}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.LoginCryptoDiffieHellmanHello)
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanHelloOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanHello_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanHello_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.class, com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        gc_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        serverKeysKnown_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanHello_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello getDefaultInstanceForType() {
        return com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello build() {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello buildPartial() {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello result = new com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.gc_ = gc_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.serverKeysKnown_ = serverKeysKnown_;
          to_bitField0_ |= 0x00000002;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello) {
          return mergeFrom((com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello other) {
        if (other == com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello.getDefaultInstance()) return this;
        if (other.hasGc()) {
          setGc(other.getGc());
        }
        if (other.hasServerKeysKnown()) {
          setServerKeysKnown(other.getServerKeysKnown());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasGc()) {
          return false;
        }
        if (!hasServerKeysKnown()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.ByteString gc_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes gc = 10;</code>
       * @return Whether the gc field is set.
       */
      public boolean hasGc() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required bytes gc = 10;</code>
       * @return The gc.
       */
      public com.google.protobuf.ByteString getGc() {
        return gc_;
      }
      /**
       * <code>required bytes gc = 10;</code>
       * @param value The gc to set.
       * @return This builder for chaining.
       */
      public Builder setGc(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        gc_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes gc = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearGc() {
        bitField0_ = (bitField0_ & ~0x00000001);
        gc_ = getDefaultInstance().getGc();
        onChanged();
        return this;
      }

      private int serverKeysKnown_ ;
      /**
       * <code>required uint32 server_keys_known = 20;</code>
       * @return Whether the serverKeysKnown field is set.
       */
      public boolean hasServerKeysKnown() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required uint32 server_keys_known = 20;</code>
       * @return The serverKeysKnown.
       */
      public int getServerKeysKnown() {
        return serverKeysKnown_;
      }
      /**
       * <code>required uint32 server_keys_known = 20;</code>
       * @param value The serverKeysKnown to set.
       * @return This builder for chaining.
       */
      public Builder setServerKeysKnown(int value) {
        bitField0_ |= 0x00000002;
        serverKeysKnown_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required uint32 server_keys_known = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearServerKeysKnown() {
        bitField0_ = (bitField0_ & ~0x00000002);
        serverKeysKnown_ = 0;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.LoginCryptoDiffieHellmanHello)
    }

    // @@protoc_insertion_point(class_scope:spotify.LoginCryptoDiffieHellmanHello)
    private static final com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello();
    }

    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<LoginCryptoDiffieHellmanHello>
        PARSER = new com.google.protobuf.AbstractParser<LoginCryptoDiffieHellmanHello>() {
      @java.lang.Override
      public LoginCryptoDiffieHellmanHello parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LoginCryptoDiffieHellmanHello(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanHello getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface FeatureSetOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.FeatureSet)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional bool autoupdate2 = 1;</code>
     * @return Whether the autoupdate2 field is set.
     */
    boolean hasAutoupdate2();
    /**
     * <code>optional bool autoupdate2 = 1;</code>
     * @return The autoupdate2.
     */
    boolean getAutoupdate2();

    /**
     * <code>optional bool current_location = 2;</code>
     * @return Whether the currentLocation field is set.
     */
    boolean hasCurrentLocation();
    /**
     * <code>optional bool current_location = 2;</code>
     * @return The currentLocation.
     */
    boolean getCurrentLocation();
  }
  /**
   * Protobuf type {@code spotify.FeatureSet}
   */
  public  static final class FeatureSet extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.FeatureSet)
      FeatureSetOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use FeatureSet.newBuilder() to construct.
    private FeatureSet(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private FeatureSet() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new FeatureSet();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private FeatureSet(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 8: {
              bitField0_ |= 0x00000001;
              autoupdate2_ = input.readBool();
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              currentLocation_ = input.readBool();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_FeatureSet_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_FeatureSet_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.FeatureSet.class, com.spotify.Keyexchange.FeatureSet.Builder.class);
    }

    private int bitField0_;
    public static final int AUTOUPDATE2_FIELD_NUMBER = 1;
    private boolean autoupdate2_;
    /**
     * <code>optional bool autoupdate2 = 1;</code>
     * @return Whether the autoupdate2 field is set.
     */
    public boolean hasAutoupdate2() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional bool autoupdate2 = 1;</code>
     * @return The autoupdate2.
     */
    public boolean getAutoupdate2() {
      return autoupdate2_;
    }

    public static final int CURRENT_LOCATION_FIELD_NUMBER = 2;
    private boolean currentLocation_;
    /**
     * <code>optional bool current_location = 2;</code>
     * @return Whether the currentLocation field is set.
     */
    public boolean hasCurrentLocation() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional bool current_location = 2;</code>
     * @return The currentLocation.
     */
    public boolean getCurrentLocation() {
      return currentLocation_;
    }

    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 (((bitField0_ & 0x00000001) != 0)) {
        output.writeBool(1, autoupdate2_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeBool(2, currentLocation_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(1, autoupdate2_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(2, currentLocation_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.FeatureSet)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.FeatureSet other = (com.spotify.Keyexchange.FeatureSet) obj;

      if (hasAutoupdate2() != other.hasAutoupdate2()) return false;
      if (hasAutoupdate2()) {
        if (getAutoupdate2()
            != other.getAutoupdate2()) return false;
      }
      if (hasCurrentLocation() != other.hasCurrentLocation()) return false;
      if (hasCurrentLocation()) {
        if (getCurrentLocation()
            != other.getCurrentLocation()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasAutoupdate2()) {
        hash = (37 * hash) + AUTOUPDATE2_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
            getAutoupdate2());
      }
      if (hasCurrentLocation()) {
        hash = (37 * hash) + CURRENT_LOCATION_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
            getCurrentLocation());
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.FeatureSet parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FeatureSet parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FeatureSet parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FeatureSet parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.FeatureSet 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.FeatureSet}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.FeatureSet)
        com.spotify.Keyexchange.FeatureSetOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_FeatureSet_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_FeatureSet_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.FeatureSet.class, com.spotify.Keyexchange.FeatureSet.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.FeatureSet.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        autoupdate2_ = false;
        bitField0_ = (bitField0_ & ~0x00000001);
        currentLocation_ = false;
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_FeatureSet_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FeatureSet getDefaultInstanceForType() {
        return com.spotify.Keyexchange.FeatureSet.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FeatureSet build() {
        com.spotify.Keyexchange.FeatureSet result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FeatureSet buildPartial() {
        com.spotify.Keyexchange.FeatureSet result = new com.spotify.Keyexchange.FeatureSet(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.autoupdate2_ = autoupdate2_;
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.currentLocation_ = currentLocation_;
          to_bitField0_ |= 0x00000002;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.FeatureSet) {
          return mergeFrom((com.spotify.Keyexchange.FeatureSet)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.FeatureSet other) {
        if (other == com.spotify.Keyexchange.FeatureSet.getDefaultInstance()) return this;
        if (other.hasAutoupdate2()) {
          setAutoupdate2(other.getAutoupdate2());
        }
        if (other.hasCurrentLocation()) {
          setCurrentLocation(other.getCurrentLocation());
        }
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.FeatureSet parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.FeatureSet) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private boolean autoupdate2_ ;
      /**
       * <code>optional bool autoupdate2 = 1;</code>
       * @return Whether the autoupdate2 field is set.
       */
      public boolean hasAutoupdate2() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional bool autoupdate2 = 1;</code>
       * @return The autoupdate2.
       */
      public boolean getAutoupdate2() {
        return autoupdate2_;
      }
      /**
       * <code>optional bool autoupdate2 = 1;</code>
       * @param value The autoupdate2 to set.
       * @return This builder for chaining.
       */
      public Builder setAutoupdate2(boolean value) {
        bitField0_ |= 0x00000001;
        autoupdate2_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool autoupdate2 = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearAutoupdate2() {
        bitField0_ = (bitField0_ & ~0x00000001);
        autoupdate2_ = false;
        onChanged();
        return this;
      }

      private boolean currentLocation_ ;
      /**
       * <code>optional bool current_location = 2;</code>
       * @return Whether the currentLocation field is set.
       */
      public boolean hasCurrentLocation() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional bool current_location = 2;</code>
       * @return The currentLocation.
       */
      public boolean getCurrentLocation() {
        return currentLocation_;
      }
      /**
       * <code>optional bool current_location = 2;</code>
       * @param value The currentLocation to set.
       * @return This builder for chaining.
       */
      public Builder setCurrentLocation(boolean value) {
        bitField0_ |= 0x00000002;
        currentLocation_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool current_location = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearCurrentLocation() {
        bitField0_ = (bitField0_ & ~0x00000002);
        currentLocation_ = false;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.FeatureSet)
    }

    // @@protoc_insertion_point(class_scope:spotify.FeatureSet)
    private static final com.spotify.Keyexchange.FeatureSet DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.FeatureSet();
    }

    public static com.spotify.Keyexchange.FeatureSet getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<FeatureSet>
        PARSER = new com.google.protobuf.AbstractParser<FeatureSet>() {
      @java.lang.Override
      public FeatureSet parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new FeatureSet(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.FeatureSet getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface APResponseMessageOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.APResponseMessage)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.APChallenge challenge = 10;</code>
     * @return Whether the challenge field is set.
     */
    boolean hasChallenge();
    /**
     * <code>optional .spotify.APChallenge challenge = 10;</code>
     * @return The challenge.
     */
    com.spotify.Keyexchange.APChallenge getChallenge();
    /**
     * <code>optional .spotify.APChallenge challenge = 10;</code>
     */
    com.spotify.Keyexchange.APChallengeOrBuilder getChallengeOrBuilder();

    /**
     * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
     * @return Whether the upgrade field is set.
     */
    boolean hasUpgrade();
    /**
     * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
     * @return The upgrade.
     */
    com.spotify.Keyexchange.UpgradeRequiredMessage getUpgrade();
    /**
     * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
     */
    com.spotify.Keyexchange.UpgradeRequiredMessageOrBuilder getUpgradeOrBuilder();

    /**
     * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
     * @return Whether the loginFailed field is set.
     */
    boolean hasLoginFailed();
    /**
     * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
     * @return The loginFailed.
     */
    com.spotify.Keyexchange.APLoginFailed getLoginFailed();
    /**
     * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
     */
    com.spotify.Keyexchange.APLoginFailedOrBuilder getLoginFailedOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.APResponseMessage}
   */
  public  static final class APResponseMessage extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.APResponseMessage)
      APResponseMessageOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use APResponseMessage.newBuilder() to construct.
    private APResponseMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private APResponseMessage() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new APResponseMessage();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private APResponseMessage(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.APChallenge.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = challenge_.toBuilder();
              }
              challenge_ = input.readMessage(com.spotify.Keyexchange.APChallenge.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(challenge_);
                challenge_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 162: {
              com.spotify.Keyexchange.UpgradeRequiredMessage.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = upgrade_.toBuilder();
              }
              upgrade_ = input.readMessage(com.spotify.Keyexchange.UpgradeRequiredMessage.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(upgrade_);
                upgrade_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 242: {
              com.spotify.Keyexchange.APLoginFailed.Builder subBuilder = null;
              if (((bitField0_ & 0x00000004) != 0)) {
                subBuilder = loginFailed_.toBuilder();
              }
              loginFailed_ = input.readMessage(com.spotify.Keyexchange.APLoginFailed.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(loginFailed_);
                loginFailed_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000004;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_APResponseMessage_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_APResponseMessage_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.APResponseMessage.class, com.spotify.Keyexchange.APResponseMessage.Builder.class);
    }

    private int bitField0_;
    public static final int CHALLENGE_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.APChallenge challenge_;
    /**
     * <code>optional .spotify.APChallenge challenge = 10;</code>
     * @return Whether the challenge field is set.
     */
    public boolean hasChallenge() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.APChallenge challenge = 10;</code>
     * @return The challenge.
     */
    public com.spotify.Keyexchange.APChallenge getChallenge() {
      return challenge_ == null ? com.spotify.Keyexchange.APChallenge.getDefaultInstance() : challenge_;
    }
    /**
     * <code>optional .spotify.APChallenge challenge = 10;</code>
     */
    public com.spotify.Keyexchange.APChallengeOrBuilder getChallengeOrBuilder() {
      return challenge_ == null ? com.spotify.Keyexchange.APChallenge.getDefaultInstance() : challenge_;
    }

    public static final int UPGRADE_FIELD_NUMBER = 20;
    private com.spotify.Keyexchange.UpgradeRequiredMessage upgrade_;
    /**
     * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
     * @return Whether the upgrade field is set.
     */
    public boolean hasUpgrade() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
     * @return The upgrade.
     */
    public com.spotify.Keyexchange.UpgradeRequiredMessage getUpgrade() {
      return upgrade_ == null ? com.spotify.Keyexchange.UpgradeRequiredMessage.getDefaultInstance() : upgrade_;
    }
    /**
     * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
     */
    public com.spotify.Keyexchange.UpgradeRequiredMessageOrBuilder getUpgradeOrBuilder() {
      return upgrade_ == null ? com.spotify.Keyexchange.UpgradeRequiredMessage.getDefaultInstance() : upgrade_;
    }

    public static final int LOGIN_FAILED_FIELD_NUMBER = 30;
    private com.spotify.Keyexchange.APLoginFailed loginFailed_;
    /**
     * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
     * @return Whether the loginFailed field is set.
     */
    public boolean hasLoginFailed() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
     * @return The loginFailed.
     */
    public com.spotify.Keyexchange.APLoginFailed getLoginFailed() {
      return loginFailed_ == null ? com.spotify.Keyexchange.APLoginFailed.getDefaultInstance() : loginFailed_;
    }
    /**
     * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
     */
    public com.spotify.Keyexchange.APLoginFailedOrBuilder getLoginFailedOrBuilder() {
      return loginFailed_ == null ? com.spotify.Keyexchange.APLoginFailed.getDefaultInstance() : loginFailed_;
    }

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

      if (hasChallenge()) {
        if (!getChallenge().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasUpgrade()) {
        if (!getUpgrade().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasLoginFailed()) {
        if (!getLoginFailed().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getChallenge());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(20, getUpgrade());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeMessage(30, getLoginFailed());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getChallenge());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(20, getUpgrade());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(30, getLoginFailed());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.APResponseMessage)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.APResponseMessage other = (com.spotify.Keyexchange.APResponseMessage) obj;

      if (hasChallenge() != other.hasChallenge()) return false;
      if (hasChallenge()) {
        if (!getChallenge()
            .equals(other.getChallenge())) return false;
      }
      if (hasUpgrade() != other.hasUpgrade()) return false;
      if (hasUpgrade()) {
        if (!getUpgrade()
            .equals(other.getUpgrade())) return false;
      }
      if (hasLoginFailed() != other.hasLoginFailed()) return false;
      if (hasLoginFailed()) {
        if (!getLoginFailed()
            .equals(other.getLoginFailed())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasChallenge()) {
        hash = (37 * hash) + CHALLENGE_FIELD_NUMBER;
        hash = (53 * hash) + getChallenge().hashCode();
      }
      if (hasUpgrade()) {
        hash = (37 * hash) + UPGRADE_FIELD_NUMBER;
        hash = (53 * hash) + getUpgrade().hashCode();
      }
      if (hasLoginFailed()) {
        hash = (37 * hash) + LOGIN_FAILED_FIELD_NUMBER;
        hash = (53 * hash) + getLoginFailed().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.APResponseMessage parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APResponseMessage parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.APResponseMessage 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.APResponseMessage}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.APResponseMessage)
        com.spotify.Keyexchange.APResponseMessageOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_APResponseMessage_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_APResponseMessage_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.APResponseMessage.class, com.spotify.Keyexchange.APResponseMessage.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.APResponseMessage.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getChallengeFieldBuilder();
          getUpgradeFieldBuilder();
          getLoginFailedFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (challengeBuilder_ == null) {
          challenge_ = null;
        } else {
          challengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        if (upgradeBuilder_ == null) {
          upgrade_ = null;
        } else {
          upgradeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        if (loginFailedBuilder_ == null) {
          loginFailed_ = null;
        } else {
          loginFailedBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_APResponseMessage_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APResponseMessage getDefaultInstanceForType() {
        return com.spotify.Keyexchange.APResponseMessage.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APResponseMessage build() {
        com.spotify.Keyexchange.APResponseMessage result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APResponseMessage buildPartial() {
        com.spotify.Keyexchange.APResponseMessage result = new com.spotify.Keyexchange.APResponseMessage(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (challengeBuilder_ == null) {
            result.challenge_ = challenge_;
          } else {
            result.challenge_ = challengeBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          if (upgradeBuilder_ == null) {
            result.upgrade_ = upgrade_;
          } else {
            result.upgrade_ = upgradeBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          if (loginFailedBuilder_ == null) {
            result.loginFailed_ = loginFailed_;
          } else {
            result.loginFailed_ = loginFailedBuilder_.build();
          }
          to_bitField0_ |= 0x00000004;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.APResponseMessage) {
          return mergeFrom((com.spotify.Keyexchange.APResponseMessage)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.APResponseMessage other) {
        if (other == com.spotify.Keyexchange.APResponseMessage.getDefaultInstance()) return this;
        if (other.hasChallenge()) {
          mergeChallenge(other.getChallenge());
        }
        if (other.hasUpgrade()) {
          mergeUpgrade(other.getUpgrade());
        }
        if (other.hasLoginFailed()) {
          mergeLoginFailed(other.getLoginFailed());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (hasChallenge()) {
          if (!getChallenge().isInitialized()) {
            return false;
          }
        }
        if (hasUpgrade()) {
          if (!getUpgrade().isInitialized()) {
            return false;
          }
        }
        if (hasLoginFailed()) {
          if (!getLoginFailed().isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.APResponseMessage parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.APResponseMessage) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.APChallenge challenge_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.APChallenge, com.spotify.Keyexchange.APChallenge.Builder, com.spotify.Keyexchange.APChallengeOrBuilder> challengeBuilder_;
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       * @return Whether the challenge field is set.
       */
      public boolean hasChallenge() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       * @return The challenge.
       */
      public com.spotify.Keyexchange.APChallenge getChallenge() {
        if (challengeBuilder_ == null) {
          return challenge_ == null ? com.spotify.Keyexchange.APChallenge.getDefaultInstance() : challenge_;
        } else {
          return challengeBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       */
      public Builder setChallenge(com.spotify.Keyexchange.APChallenge value) {
        if (challengeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          challenge_ = value;
          onChanged();
        } else {
          challengeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       */
      public Builder setChallenge(
          com.spotify.Keyexchange.APChallenge.Builder builderForValue) {
        if (challengeBuilder_ == null) {
          challenge_ = builderForValue.build();
          onChanged();
        } else {
          challengeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       */
      public Builder mergeChallenge(com.spotify.Keyexchange.APChallenge value) {
        if (challengeBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              challenge_ != null &&
              challenge_ != com.spotify.Keyexchange.APChallenge.getDefaultInstance()) {
            challenge_ =
              com.spotify.Keyexchange.APChallenge.newBuilder(challenge_).mergeFrom(value).buildPartial();
          } else {
            challenge_ = value;
          }
          onChanged();
        } else {
          challengeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       */
      public Builder clearChallenge() {
        if (challengeBuilder_ == null) {
          challenge_ = null;
          onChanged();
        } else {
          challengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       */
      public com.spotify.Keyexchange.APChallenge.Builder getChallengeBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getChallengeFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       */
      public com.spotify.Keyexchange.APChallengeOrBuilder getChallengeOrBuilder() {
        if (challengeBuilder_ != null) {
          return challengeBuilder_.getMessageOrBuilder();
        } else {
          return challenge_ == null ?
              com.spotify.Keyexchange.APChallenge.getDefaultInstance() : challenge_;
        }
      }
      /**
       * <code>optional .spotify.APChallenge challenge = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.APChallenge, com.spotify.Keyexchange.APChallenge.Builder, com.spotify.Keyexchange.APChallengeOrBuilder> 
          getChallengeFieldBuilder() {
        if (challengeBuilder_ == null) {
          challengeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.APChallenge, com.spotify.Keyexchange.APChallenge.Builder, com.spotify.Keyexchange.APChallengeOrBuilder>(
                  getChallenge(),
                  getParentForChildren(),
                  isClean());
          challenge_ = null;
        }
        return challengeBuilder_;
      }

      private com.spotify.Keyexchange.UpgradeRequiredMessage upgrade_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.UpgradeRequiredMessage, com.spotify.Keyexchange.UpgradeRequiredMessage.Builder, com.spotify.Keyexchange.UpgradeRequiredMessageOrBuilder> upgradeBuilder_;
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       * @return Whether the upgrade field is set.
       */
      public boolean hasUpgrade() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       * @return The upgrade.
       */
      public com.spotify.Keyexchange.UpgradeRequiredMessage getUpgrade() {
        if (upgradeBuilder_ == null) {
          return upgrade_ == null ? com.spotify.Keyexchange.UpgradeRequiredMessage.getDefaultInstance() : upgrade_;
        } else {
          return upgradeBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       */
      public Builder setUpgrade(com.spotify.Keyexchange.UpgradeRequiredMessage value) {
        if (upgradeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          upgrade_ = value;
          onChanged();
        } else {
          upgradeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       */
      public Builder setUpgrade(
          com.spotify.Keyexchange.UpgradeRequiredMessage.Builder builderForValue) {
        if (upgradeBuilder_ == null) {
          upgrade_ = builderForValue.build();
          onChanged();
        } else {
          upgradeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       */
      public Builder mergeUpgrade(com.spotify.Keyexchange.UpgradeRequiredMessage value) {
        if (upgradeBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
              upgrade_ != null &&
              upgrade_ != com.spotify.Keyexchange.UpgradeRequiredMessage.getDefaultInstance()) {
            upgrade_ =
              com.spotify.Keyexchange.UpgradeRequiredMessage.newBuilder(upgrade_).mergeFrom(value).buildPartial();
          } else {
            upgrade_ = value;
          }
          onChanged();
        } else {
          upgradeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       */
      public Builder clearUpgrade() {
        if (upgradeBuilder_ == null) {
          upgrade_ = null;
          onChanged();
        } else {
          upgradeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       */
      public com.spotify.Keyexchange.UpgradeRequiredMessage.Builder getUpgradeBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getUpgradeFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       */
      public com.spotify.Keyexchange.UpgradeRequiredMessageOrBuilder getUpgradeOrBuilder() {
        if (upgradeBuilder_ != null) {
          return upgradeBuilder_.getMessageOrBuilder();
        } else {
          return upgrade_ == null ?
              com.spotify.Keyexchange.UpgradeRequiredMessage.getDefaultInstance() : upgrade_;
        }
      }
      /**
       * <code>optional .spotify.UpgradeRequiredMessage upgrade = 20;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.UpgradeRequiredMessage, com.spotify.Keyexchange.UpgradeRequiredMessage.Builder, com.spotify.Keyexchange.UpgradeRequiredMessageOrBuilder> 
          getUpgradeFieldBuilder() {
        if (upgradeBuilder_ == null) {
          upgradeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.UpgradeRequiredMessage, com.spotify.Keyexchange.UpgradeRequiredMessage.Builder, com.spotify.Keyexchange.UpgradeRequiredMessageOrBuilder>(
                  getUpgrade(),
                  getParentForChildren(),
                  isClean());
          upgrade_ = null;
        }
        return upgradeBuilder_;
      }

      private com.spotify.Keyexchange.APLoginFailed loginFailed_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.APLoginFailed, com.spotify.Keyexchange.APLoginFailed.Builder, com.spotify.Keyexchange.APLoginFailedOrBuilder> loginFailedBuilder_;
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       * @return Whether the loginFailed field is set.
       */
      public boolean hasLoginFailed() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       * @return The loginFailed.
       */
      public com.spotify.Keyexchange.APLoginFailed getLoginFailed() {
        if (loginFailedBuilder_ == null) {
          return loginFailed_ == null ? com.spotify.Keyexchange.APLoginFailed.getDefaultInstance() : loginFailed_;
        } else {
          return loginFailedBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       */
      public Builder setLoginFailed(com.spotify.Keyexchange.APLoginFailed value) {
        if (loginFailedBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          loginFailed_ = value;
          onChanged();
        } else {
          loginFailedBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       */
      public Builder setLoginFailed(
          com.spotify.Keyexchange.APLoginFailed.Builder builderForValue) {
        if (loginFailedBuilder_ == null) {
          loginFailed_ = builderForValue.build();
          onChanged();
        } else {
          loginFailedBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       */
      public Builder mergeLoginFailed(com.spotify.Keyexchange.APLoginFailed value) {
        if (loginFailedBuilder_ == null) {
          if (((bitField0_ & 0x00000004) != 0) &&
              loginFailed_ != null &&
              loginFailed_ != com.spotify.Keyexchange.APLoginFailed.getDefaultInstance()) {
            loginFailed_ =
              com.spotify.Keyexchange.APLoginFailed.newBuilder(loginFailed_).mergeFrom(value).buildPartial();
          } else {
            loginFailed_ = value;
          }
          onChanged();
        } else {
          loginFailedBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       */
      public Builder clearLoginFailed() {
        if (loginFailedBuilder_ == null) {
          loginFailed_ = null;
          onChanged();
        } else {
          loginFailedBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       */
      public com.spotify.Keyexchange.APLoginFailed.Builder getLoginFailedBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getLoginFailedFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       */
      public com.spotify.Keyexchange.APLoginFailedOrBuilder getLoginFailedOrBuilder() {
        if (loginFailedBuilder_ != null) {
          return loginFailedBuilder_.getMessageOrBuilder();
        } else {
          return loginFailed_ == null ?
              com.spotify.Keyexchange.APLoginFailed.getDefaultInstance() : loginFailed_;
        }
      }
      /**
       * <code>optional .spotify.APLoginFailed login_failed = 30;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.APLoginFailed, com.spotify.Keyexchange.APLoginFailed.Builder, com.spotify.Keyexchange.APLoginFailedOrBuilder> 
          getLoginFailedFieldBuilder() {
        if (loginFailedBuilder_ == null) {
          loginFailedBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.APLoginFailed, com.spotify.Keyexchange.APLoginFailed.Builder, com.spotify.Keyexchange.APLoginFailedOrBuilder>(
                  getLoginFailed(),
                  getParentForChildren(),
                  isClean());
          loginFailed_ = null;
        }
        return loginFailedBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.APResponseMessage)
    }

    // @@protoc_insertion_point(class_scope:spotify.APResponseMessage)
    private static final com.spotify.Keyexchange.APResponseMessage DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.APResponseMessage();
    }

    public static com.spotify.Keyexchange.APResponseMessage getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<APResponseMessage>
        PARSER = new com.google.protobuf.AbstractParser<APResponseMessage>() {
      @java.lang.Override
      public APResponseMessage parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new APResponseMessage(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.APResponseMessage getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface APChallengeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.APChallenge)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
     * @return Whether the loginCryptoChallenge field is set.
     */
    boolean hasLoginCryptoChallenge();
    /**
     * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
     * @return The loginCryptoChallenge.
     */
    com.spotify.Keyexchange.LoginCryptoChallengeUnion getLoginCryptoChallenge();
    /**
     * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
     */
    com.spotify.Keyexchange.LoginCryptoChallengeUnionOrBuilder getLoginCryptoChallengeOrBuilder();

    /**
     * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
     * @return Whether the fingerprintChallenge field is set.
     */
    boolean hasFingerprintChallenge();
    /**
     * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
     * @return The fingerprintChallenge.
     */
    com.spotify.Keyexchange.FingerprintChallengeUnion getFingerprintChallenge();
    /**
     * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
     */
    com.spotify.Keyexchange.FingerprintChallengeUnionOrBuilder getFingerprintChallengeOrBuilder();

    /**
     * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
     * @return Whether the powChallenge field is set.
     */
    boolean hasPowChallenge();
    /**
     * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
     * @return The powChallenge.
     */
    com.spotify.Keyexchange.PoWChallengeUnion getPowChallenge();
    /**
     * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
     */
    com.spotify.Keyexchange.PoWChallengeUnionOrBuilder getPowChallengeOrBuilder();

    /**
     * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
     * @return Whether the cryptoChallenge field is set.
     */
    boolean hasCryptoChallenge();
    /**
     * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
     * @return The cryptoChallenge.
     */
    com.spotify.Keyexchange.CryptoChallengeUnion getCryptoChallenge();
    /**
     * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
     */
    com.spotify.Keyexchange.CryptoChallengeUnionOrBuilder getCryptoChallengeOrBuilder();

    /**
     * <code>required bytes server_nonce = 50;</code>
     * @return Whether the serverNonce field is set.
     */
    boolean hasServerNonce();
    /**
     * <code>required bytes server_nonce = 50;</code>
     * @return The serverNonce.
     */
    com.google.protobuf.ByteString getServerNonce();

    /**
     * <code>optional bytes padding = 60;</code>
     * @return Whether the padding field is set.
     */
    boolean hasPadding();
    /**
     * <code>optional bytes padding = 60;</code>
     * @return The padding.
     */
    com.google.protobuf.ByteString getPadding();
  }
  /**
   * Protobuf type {@code spotify.APChallenge}
   */
  public  static final class APChallenge extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.APChallenge)
      APChallengeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use APChallenge.newBuilder() to construct.
    private APChallenge(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private APChallenge() {
      serverNonce_ = com.google.protobuf.ByteString.EMPTY;
      padding_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new APChallenge();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private APChallenge(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.LoginCryptoChallengeUnion.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = loginCryptoChallenge_.toBuilder();
              }
              loginCryptoChallenge_ = input.readMessage(com.spotify.Keyexchange.LoginCryptoChallengeUnion.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(loginCryptoChallenge_);
                loginCryptoChallenge_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 162: {
              com.spotify.Keyexchange.FingerprintChallengeUnion.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = fingerprintChallenge_.toBuilder();
              }
              fingerprintChallenge_ = input.readMessage(com.spotify.Keyexchange.FingerprintChallengeUnion.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(fingerprintChallenge_);
                fingerprintChallenge_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 242: {
              com.spotify.Keyexchange.PoWChallengeUnion.Builder subBuilder = null;
              if (((bitField0_ & 0x00000004) != 0)) {
                subBuilder = powChallenge_.toBuilder();
              }
              powChallenge_ = input.readMessage(com.spotify.Keyexchange.PoWChallengeUnion.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(powChallenge_);
                powChallenge_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000004;
              break;
            }
            case 322: {
              com.spotify.Keyexchange.CryptoChallengeUnion.Builder subBuilder = null;
              if (((bitField0_ & 0x00000008) != 0)) {
                subBuilder = cryptoChallenge_.toBuilder();
              }
              cryptoChallenge_ = input.readMessage(com.spotify.Keyexchange.CryptoChallengeUnion.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(cryptoChallenge_);
                cryptoChallenge_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000008;
              break;
            }
            case 402: {
              bitField0_ |= 0x00000010;
              serverNonce_ = input.readBytes();
              break;
            }
            case 482: {
              bitField0_ |= 0x00000020;
              padding_ = input.readBytes();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_APChallenge_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_APChallenge_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.APChallenge.class, com.spotify.Keyexchange.APChallenge.Builder.class);
    }

    private int bitField0_;
    public static final int LOGIN_CRYPTO_CHALLENGE_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.LoginCryptoChallengeUnion loginCryptoChallenge_;
    /**
     * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
     * @return Whether the loginCryptoChallenge field is set.
     */
    public boolean hasLoginCryptoChallenge() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
     * @return The loginCryptoChallenge.
     */
    public com.spotify.Keyexchange.LoginCryptoChallengeUnion getLoginCryptoChallenge() {
      return loginCryptoChallenge_ == null ? com.spotify.Keyexchange.LoginCryptoChallengeUnion.getDefaultInstance() : loginCryptoChallenge_;
    }
    /**
     * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
     */
    public com.spotify.Keyexchange.LoginCryptoChallengeUnionOrBuilder getLoginCryptoChallengeOrBuilder() {
      return loginCryptoChallenge_ == null ? com.spotify.Keyexchange.LoginCryptoChallengeUnion.getDefaultInstance() : loginCryptoChallenge_;
    }

    public static final int FINGERPRINT_CHALLENGE_FIELD_NUMBER = 20;
    private com.spotify.Keyexchange.FingerprintChallengeUnion fingerprintChallenge_;
    /**
     * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
     * @return Whether the fingerprintChallenge field is set.
     */
    public boolean hasFingerprintChallenge() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
     * @return The fingerprintChallenge.
     */
    public com.spotify.Keyexchange.FingerprintChallengeUnion getFingerprintChallenge() {
      return fingerprintChallenge_ == null ? com.spotify.Keyexchange.FingerprintChallengeUnion.getDefaultInstance() : fingerprintChallenge_;
    }
    /**
     * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
     */
    public com.spotify.Keyexchange.FingerprintChallengeUnionOrBuilder getFingerprintChallengeOrBuilder() {
      return fingerprintChallenge_ == null ? com.spotify.Keyexchange.FingerprintChallengeUnion.getDefaultInstance() : fingerprintChallenge_;
    }

    public static final int POW_CHALLENGE_FIELD_NUMBER = 30;
    private com.spotify.Keyexchange.PoWChallengeUnion powChallenge_;
    /**
     * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
     * @return Whether the powChallenge field is set.
     */
    public boolean hasPowChallenge() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
     * @return The powChallenge.
     */
    public com.spotify.Keyexchange.PoWChallengeUnion getPowChallenge() {
      return powChallenge_ == null ? com.spotify.Keyexchange.PoWChallengeUnion.getDefaultInstance() : powChallenge_;
    }
    /**
     * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
     */
    public com.spotify.Keyexchange.PoWChallengeUnionOrBuilder getPowChallengeOrBuilder() {
      return powChallenge_ == null ? com.spotify.Keyexchange.PoWChallengeUnion.getDefaultInstance() : powChallenge_;
    }

    public static final int CRYPTO_CHALLENGE_FIELD_NUMBER = 40;
    private com.spotify.Keyexchange.CryptoChallengeUnion cryptoChallenge_;
    /**
     * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
     * @return Whether the cryptoChallenge field is set.
     */
    public boolean hasCryptoChallenge() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
     * @return The cryptoChallenge.
     */
    public com.spotify.Keyexchange.CryptoChallengeUnion getCryptoChallenge() {
      return cryptoChallenge_ == null ? com.spotify.Keyexchange.CryptoChallengeUnion.getDefaultInstance() : cryptoChallenge_;
    }
    /**
     * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
     */
    public com.spotify.Keyexchange.CryptoChallengeUnionOrBuilder getCryptoChallengeOrBuilder() {
      return cryptoChallenge_ == null ? com.spotify.Keyexchange.CryptoChallengeUnion.getDefaultInstance() : cryptoChallenge_;
    }

    public static final int SERVER_NONCE_FIELD_NUMBER = 50;
    private com.google.protobuf.ByteString serverNonce_;
    /**
     * <code>required bytes server_nonce = 50;</code>
     * @return Whether the serverNonce field is set.
     */
    public boolean hasServerNonce() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <code>required bytes server_nonce = 50;</code>
     * @return The serverNonce.
     */
    public com.google.protobuf.ByteString getServerNonce() {
      return serverNonce_;
    }

    public static final int PADDING_FIELD_NUMBER = 60;
    private com.google.protobuf.ByteString padding_;
    /**
     * <code>optional bytes padding = 60;</code>
     * @return Whether the padding field is set.
     */
    public boolean hasPadding() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <code>optional bytes padding = 60;</code>
     * @return The padding.
     */
    public com.google.protobuf.ByteString getPadding() {
      return padding_;
    }

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

      if (!hasLoginCryptoChallenge()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasFingerprintChallenge()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasPowChallenge()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasCryptoChallenge()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasServerNonce()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!getLoginCryptoChallenge().isInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!getFingerprintChallenge().isInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getLoginCryptoChallenge());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(20, getFingerprintChallenge());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeMessage(30, getPowChallenge());
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeMessage(40, getCryptoChallenge());
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        output.writeBytes(50, serverNonce_);
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        output.writeBytes(60, padding_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getLoginCryptoChallenge());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(20, getFingerprintChallenge());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(30, getPowChallenge());
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(40, getCryptoChallenge());
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(50, serverNonce_);
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(60, padding_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.APChallenge)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.APChallenge other = (com.spotify.Keyexchange.APChallenge) obj;

      if (hasLoginCryptoChallenge() != other.hasLoginCryptoChallenge()) return false;
      if (hasLoginCryptoChallenge()) {
        if (!getLoginCryptoChallenge()
            .equals(other.getLoginCryptoChallenge())) return false;
      }
      if (hasFingerprintChallenge() != other.hasFingerprintChallenge()) return false;
      if (hasFingerprintChallenge()) {
        if (!getFingerprintChallenge()
            .equals(other.getFingerprintChallenge())) return false;
      }
      if (hasPowChallenge() != other.hasPowChallenge()) return false;
      if (hasPowChallenge()) {
        if (!getPowChallenge()
            .equals(other.getPowChallenge())) return false;
      }
      if (hasCryptoChallenge() != other.hasCryptoChallenge()) return false;
      if (hasCryptoChallenge()) {
        if (!getCryptoChallenge()
            .equals(other.getCryptoChallenge())) return false;
      }
      if (hasServerNonce() != other.hasServerNonce()) return false;
      if (hasServerNonce()) {
        if (!getServerNonce()
            .equals(other.getServerNonce())) return false;
      }
      if (hasPadding() != other.hasPadding()) return false;
      if (hasPadding()) {
        if (!getPadding()
            .equals(other.getPadding())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasLoginCryptoChallenge()) {
        hash = (37 * hash) + LOGIN_CRYPTO_CHALLENGE_FIELD_NUMBER;
        hash = (53 * hash) + getLoginCryptoChallenge().hashCode();
      }
      if (hasFingerprintChallenge()) {
        hash = (37 * hash) + FINGERPRINT_CHALLENGE_FIELD_NUMBER;
        hash = (53 * hash) + getFingerprintChallenge().hashCode();
      }
      if (hasPowChallenge()) {
        hash = (37 * hash) + POW_CHALLENGE_FIELD_NUMBER;
        hash = (53 * hash) + getPowChallenge().hashCode();
      }
      if (hasCryptoChallenge()) {
        hash = (37 * hash) + CRYPTO_CHALLENGE_FIELD_NUMBER;
        hash = (53 * hash) + getCryptoChallenge().hashCode();
      }
      if (hasServerNonce()) {
        hash = (37 * hash) + SERVER_NONCE_FIELD_NUMBER;
        hash = (53 * hash) + getServerNonce().hashCode();
      }
      if (hasPadding()) {
        hash = (37 * hash) + PADDING_FIELD_NUMBER;
        hash = (53 * hash) + getPadding().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.APChallenge parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APChallenge parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APChallenge parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APChallenge parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.APChallenge 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.APChallenge}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.APChallenge)
        com.spotify.Keyexchange.APChallengeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_APChallenge_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_APChallenge_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.APChallenge.class, com.spotify.Keyexchange.APChallenge.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.APChallenge.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getLoginCryptoChallengeFieldBuilder();
          getFingerprintChallengeFieldBuilder();
          getPowChallengeFieldBuilder();
          getCryptoChallengeFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (loginCryptoChallengeBuilder_ == null) {
          loginCryptoChallenge_ = null;
        } else {
          loginCryptoChallengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        if (fingerprintChallengeBuilder_ == null) {
          fingerprintChallenge_ = null;
        } else {
          fingerprintChallengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        if (powChallengeBuilder_ == null) {
          powChallenge_ = null;
        } else {
          powChallengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        if (cryptoChallengeBuilder_ == null) {
          cryptoChallenge_ = null;
        } else {
          cryptoChallengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        serverNonce_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000010);
        padding_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_APChallenge_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APChallenge getDefaultInstanceForType() {
        return com.spotify.Keyexchange.APChallenge.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APChallenge build() {
        com.spotify.Keyexchange.APChallenge result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APChallenge buildPartial() {
        com.spotify.Keyexchange.APChallenge result = new com.spotify.Keyexchange.APChallenge(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (loginCryptoChallengeBuilder_ == null) {
            result.loginCryptoChallenge_ = loginCryptoChallenge_;
          } else {
            result.loginCryptoChallenge_ = loginCryptoChallengeBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          if (fingerprintChallengeBuilder_ == null) {
            result.fingerprintChallenge_ = fingerprintChallenge_;
          } else {
            result.fingerprintChallenge_ = fingerprintChallengeBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          if (powChallengeBuilder_ == null) {
            result.powChallenge_ = powChallenge_;
          } else {
            result.powChallenge_ = powChallengeBuilder_.build();
          }
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          if (cryptoChallengeBuilder_ == null) {
            result.cryptoChallenge_ = cryptoChallenge_;
          } else {
            result.cryptoChallenge_ = cryptoChallengeBuilder_.build();
          }
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.serverNonce_ = serverNonce_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.padding_ = padding_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.APChallenge) {
          return mergeFrom((com.spotify.Keyexchange.APChallenge)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.APChallenge other) {
        if (other == com.spotify.Keyexchange.APChallenge.getDefaultInstance()) return this;
        if (other.hasLoginCryptoChallenge()) {
          mergeLoginCryptoChallenge(other.getLoginCryptoChallenge());
        }
        if (other.hasFingerprintChallenge()) {
          mergeFingerprintChallenge(other.getFingerprintChallenge());
        }
        if (other.hasPowChallenge()) {
          mergePowChallenge(other.getPowChallenge());
        }
        if (other.hasCryptoChallenge()) {
          mergeCryptoChallenge(other.getCryptoChallenge());
        }
        if (other.hasServerNonce()) {
          setServerNonce(other.getServerNonce());
        }
        if (other.hasPadding()) {
          setPadding(other.getPadding());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasLoginCryptoChallenge()) {
          return false;
        }
        if (!hasFingerprintChallenge()) {
          return false;
        }
        if (!hasPowChallenge()) {
          return false;
        }
        if (!hasCryptoChallenge()) {
          return false;
        }
        if (!hasServerNonce()) {
          return false;
        }
        if (!getLoginCryptoChallenge().isInitialized()) {
          return false;
        }
        if (!getFingerprintChallenge().isInitialized()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.APChallenge parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.APChallenge) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.LoginCryptoChallengeUnion loginCryptoChallenge_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoChallengeUnion, com.spotify.Keyexchange.LoginCryptoChallengeUnion.Builder, com.spotify.Keyexchange.LoginCryptoChallengeUnionOrBuilder> loginCryptoChallengeBuilder_;
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       * @return Whether the loginCryptoChallenge field is set.
       */
      public boolean hasLoginCryptoChallenge() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       * @return The loginCryptoChallenge.
       */
      public com.spotify.Keyexchange.LoginCryptoChallengeUnion getLoginCryptoChallenge() {
        if (loginCryptoChallengeBuilder_ == null) {
          return loginCryptoChallenge_ == null ? com.spotify.Keyexchange.LoginCryptoChallengeUnion.getDefaultInstance() : loginCryptoChallenge_;
        } else {
          return loginCryptoChallengeBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       */
      public Builder setLoginCryptoChallenge(com.spotify.Keyexchange.LoginCryptoChallengeUnion value) {
        if (loginCryptoChallengeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          loginCryptoChallenge_ = value;
          onChanged();
        } else {
          loginCryptoChallengeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       */
      public Builder setLoginCryptoChallenge(
          com.spotify.Keyexchange.LoginCryptoChallengeUnion.Builder builderForValue) {
        if (loginCryptoChallengeBuilder_ == null) {
          loginCryptoChallenge_ = builderForValue.build();
          onChanged();
        } else {
          loginCryptoChallengeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       */
      public Builder mergeLoginCryptoChallenge(com.spotify.Keyexchange.LoginCryptoChallengeUnion value) {
        if (loginCryptoChallengeBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              loginCryptoChallenge_ != null &&
              loginCryptoChallenge_ != com.spotify.Keyexchange.LoginCryptoChallengeUnion.getDefaultInstance()) {
            loginCryptoChallenge_ =
              com.spotify.Keyexchange.LoginCryptoChallengeUnion.newBuilder(loginCryptoChallenge_).mergeFrom(value).buildPartial();
          } else {
            loginCryptoChallenge_ = value;
          }
          onChanged();
        } else {
          loginCryptoChallengeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       */
      public Builder clearLoginCryptoChallenge() {
        if (loginCryptoChallengeBuilder_ == null) {
          loginCryptoChallenge_ = null;
          onChanged();
        } else {
          loginCryptoChallengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoChallengeUnion.Builder getLoginCryptoChallengeBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getLoginCryptoChallengeFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoChallengeUnionOrBuilder getLoginCryptoChallengeOrBuilder() {
        if (loginCryptoChallengeBuilder_ != null) {
          return loginCryptoChallengeBuilder_.getMessageOrBuilder();
        } else {
          return loginCryptoChallenge_ == null ?
              com.spotify.Keyexchange.LoginCryptoChallengeUnion.getDefaultInstance() : loginCryptoChallenge_;
        }
      }
      /**
       * <code>required .spotify.LoginCryptoChallengeUnion login_crypto_challenge = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoChallengeUnion, com.spotify.Keyexchange.LoginCryptoChallengeUnion.Builder, com.spotify.Keyexchange.LoginCryptoChallengeUnionOrBuilder> 
          getLoginCryptoChallengeFieldBuilder() {
        if (loginCryptoChallengeBuilder_ == null) {
          loginCryptoChallengeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.LoginCryptoChallengeUnion, com.spotify.Keyexchange.LoginCryptoChallengeUnion.Builder, com.spotify.Keyexchange.LoginCryptoChallengeUnionOrBuilder>(
                  getLoginCryptoChallenge(),
                  getParentForChildren(),
                  isClean());
          loginCryptoChallenge_ = null;
        }
        return loginCryptoChallengeBuilder_;
      }

      private com.spotify.Keyexchange.FingerprintChallengeUnion fingerprintChallenge_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.FingerprintChallengeUnion, com.spotify.Keyexchange.FingerprintChallengeUnion.Builder, com.spotify.Keyexchange.FingerprintChallengeUnionOrBuilder> fingerprintChallengeBuilder_;
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       * @return Whether the fingerprintChallenge field is set.
       */
      public boolean hasFingerprintChallenge() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       * @return The fingerprintChallenge.
       */
      public com.spotify.Keyexchange.FingerprintChallengeUnion getFingerprintChallenge() {
        if (fingerprintChallengeBuilder_ == null) {
          return fingerprintChallenge_ == null ? com.spotify.Keyexchange.FingerprintChallengeUnion.getDefaultInstance() : fingerprintChallenge_;
        } else {
          return fingerprintChallengeBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       */
      public Builder setFingerprintChallenge(com.spotify.Keyexchange.FingerprintChallengeUnion value) {
        if (fingerprintChallengeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          fingerprintChallenge_ = value;
          onChanged();
        } else {
          fingerprintChallengeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       */
      public Builder setFingerprintChallenge(
          com.spotify.Keyexchange.FingerprintChallengeUnion.Builder builderForValue) {
        if (fingerprintChallengeBuilder_ == null) {
          fingerprintChallenge_ = builderForValue.build();
          onChanged();
        } else {
          fingerprintChallengeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       */
      public Builder mergeFingerprintChallenge(com.spotify.Keyexchange.FingerprintChallengeUnion value) {
        if (fingerprintChallengeBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
              fingerprintChallenge_ != null &&
              fingerprintChallenge_ != com.spotify.Keyexchange.FingerprintChallengeUnion.getDefaultInstance()) {
            fingerprintChallenge_ =
              com.spotify.Keyexchange.FingerprintChallengeUnion.newBuilder(fingerprintChallenge_).mergeFrom(value).buildPartial();
          } else {
            fingerprintChallenge_ = value;
          }
          onChanged();
        } else {
          fingerprintChallengeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       */
      public Builder clearFingerprintChallenge() {
        if (fingerprintChallengeBuilder_ == null) {
          fingerprintChallenge_ = null;
          onChanged();
        } else {
          fingerprintChallengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       */
      public com.spotify.Keyexchange.FingerprintChallengeUnion.Builder getFingerprintChallengeBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getFingerprintChallengeFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       */
      public com.spotify.Keyexchange.FingerprintChallengeUnionOrBuilder getFingerprintChallengeOrBuilder() {
        if (fingerprintChallengeBuilder_ != null) {
          return fingerprintChallengeBuilder_.getMessageOrBuilder();
        } else {
          return fingerprintChallenge_ == null ?
              com.spotify.Keyexchange.FingerprintChallengeUnion.getDefaultInstance() : fingerprintChallenge_;
        }
      }
      /**
       * <code>required .spotify.FingerprintChallengeUnion fingerprint_challenge = 20;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.FingerprintChallengeUnion, com.spotify.Keyexchange.FingerprintChallengeUnion.Builder, com.spotify.Keyexchange.FingerprintChallengeUnionOrBuilder> 
          getFingerprintChallengeFieldBuilder() {
        if (fingerprintChallengeBuilder_ == null) {
          fingerprintChallengeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.FingerprintChallengeUnion, com.spotify.Keyexchange.FingerprintChallengeUnion.Builder, com.spotify.Keyexchange.FingerprintChallengeUnionOrBuilder>(
                  getFingerprintChallenge(),
                  getParentForChildren(),
                  isClean());
          fingerprintChallenge_ = null;
        }
        return fingerprintChallengeBuilder_;
      }

      private com.spotify.Keyexchange.PoWChallengeUnion powChallenge_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.PoWChallengeUnion, com.spotify.Keyexchange.PoWChallengeUnion.Builder, com.spotify.Keyexchange.PoWChallengeUnionOrBuilder> powChallengeBuilder_;
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       * @return Whether the powChallenge field is set.
       */
      public boolean hasPowChallenge() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       * @return The powChallenge.
       */
      public com.spotify.Keyexchange.PoWChallengeUnion getPowChallenge() {
        if (powChallengeBuilder_ == null) {
          return powChallenge_ == null ? com.spotify.Keyexchange.PoWChallengeUnion.getDefaultInstance() : powChallenge_;
        } else {
          return powChallengeBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       */
      public Builder setPowChallenge(com.spotify.Keyexchange.PoWChallengeUnion value) {
        if (powChallengeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          powChallenge_ = value;
          onChanged();
        } else {
          powChallengeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       */
      public Builder setPowChallenge(
          com.spotify.Keyexchange.PoWChallengeUnion.Builder builderForValue) {
        if (powChallengeBuilder_ == null) {
          powChallenge_ = builderForValue.build();
          onChanged();
        } else {
          powChallengeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       */
      public Builder mergePowChallenge(com.spotify.Keyexchange.PoWChallengeUnion value) {
        if (powChallengeBuilder_ == null) {
          if (((bitField0_ & 0x00000004) != 0) &&
              powChallenge_ != null &&
              powChallenge_ != com.spotify.Keyexchange.PoWChallengeUnion.getDefaultInstance()) {
            powChallenge_ =
              com.spotify.Keyexchange.PoWChallengeUnion.newBuilder(powChallenge_).mergeFrom(value).buildPartial();
          } else {
            powChallenge_ = value;
          }
          onChanged();
        } else {
          powChallengeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       */
      public Builder clearPowChallenge() {
        if (powChallengeBuilder_ == null) {
          powChallenge_ = null;
          onChanged();
        } else {
          powChallengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       */
      public com.spotify.Keyexchange.PoWChallengeUnion.Builder getPowChallengeBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getPowChallengeFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       */
      public com.spotify.Keyexchange.PoWChallengeUnionOrBuilder getPowChallengeOrBuilder() {
        if (powChallengeBuilder_ != null) {
          return powChallengeBuilder_.getMessageOrBuilder();
        } else {
          return powChallenge_ == null ?
              com.spotify.Keyexchange.PoWChallengeUnion.getDefaultInstance() : powChallenge_;
        }
      }
      /**
       * <code>required .spotify.PoWChallengeUnion pow_challenge = 30;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.PoWChallengeUnion, com.spotify.Keyexchange.PoWChallengeUnion.Builder, com.spotify.Keyexchange.PoWChallengeUnionOrBuilder> 
          getPowChallengeFieldBuilder() {
        if (powChallengeBuilder_ == null) {
          powChallengeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.PoWChallengeUnion, com.spotify.Keyexchange.PoWChallengeUnion.Builder, com.spotify.Keyexchange.PoWChallengeUnionOrBuilder>(
                  getPowChallenge(),
                  getParentForChildren(),
                  isClean());
          powChallenge_ = null;
        }
        return powChallengeBuilder_;
      }

      private com.spotify.Keyexchange.CryptoChallengeUnion cryptoChallenge_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoChallengeUnion, com.spotify.Keyexchange.CryptoChallengeUnion.Builder, com.spotify.Keyexchange.CryptoChallengeUnionOrBuilder> cryptoChallengeBuilder_;
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       * @return Whether the cryptoChallenge field is set.
       */
      public boolean hasCryptoChallenge() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       * @return The cryptoChallenge.
       */
      public com.spotify.Keyexchange.CryptoChallengeUnion getCryptoChallenge() {
        if (cryptoChallengeBuilder_ == null) {
          return cryptoChallenge_ == null ? com.spotify.Keyexchange.CryptoChallengeUnion.getDefaultInstance() : cryptoChallenge_;
        } else {
          return cryptoChallengeBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       */
      public Builder setCryptoChallenge(com.spotify.Keyexchange.CryptoChallengeUnion value) {
        if (cryptoChallengeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          cryptoChallenge_ = value;
          onChanged();
        } else {
          cryptoChallengeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       */
      public Builder setCryptoChallenge(
          com.spotify.Keyexchange.CryptoChallengeUnion.Builder builderForValue) {
        if (cryptoChallengeBuilder_ == null) {
          cryptoChallenge_ = builderForValue.build();
          onChanged();
        } else {
          cryptoChallengeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       */
      public Builder mergeCryptoChallenge(com.spotify.Keyexchange.CryptoChallengeUnion value) {
        if (cryptoChallengeBuilder_ == null) {
          if (((bitField0_ & 0x00000008) != 0) &&
              cryptoChallenge_ != null &&
              cryptoChallenge_ != com.spotify.Keyexchange.CryptoChallengeUnion.getDefaultInstance()) {
            cryptoChallenge_ =
              com.spotify.Keyexchange.CryptoChallengeUnion.newBuilder(cryptoChallenge_).mergeFrom(value).buildPartial();
          } else {
            cryptoChallenge_ = value;
          }
          onChanged();
        } else {
          cryptoChallengeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       */
      public Builder clearCryptoChallenge() {
        if (cryptoChallengeBuilder_ == null) {
          cryptoChallenge_ = null;
          onChanged();
        } else {
          cryptoChallengeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       */
      public com.spotify.Keyexchange.CryptoChallengeUnion.Builder getCryptoChallengeBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getCryptoChallengeFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       */
      public com.spotify.Keyexchange.CryptoChallengeUnionOrBuilder getCryptoChallengeOrBuilder() {
        if (cryptoChallengeBuilder_ != null) {
          return cryptoChallengeBuilder_.getMessageOrBuilder();
        } else {
          return cryptoChallenge_ == null ?
              com.spotify.Keyexchange.CryptoChallengeUnion.getDefaultInstance() : cryptoChallenge_;
        }
      }
      /**
       * <code>required .spotify.CryptoChallengeUnion crypto_challenge = 40;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoChallengeUnion, com.spotify.Keyexchange.CryptoChallengeUnion.Builder, com.spotify.Keyexchange.CryptoChallengeUnionOrBuilder> 
          getCryptoChallengeFieldBuilder() {
        if (cryptoChallengeBuilder_ == null) {
          cryptoChallengeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.CryptoChallengeUnion, com.spotify.Keyexchange.CryptoChallengeUnion.Builder, com.spotify.Keyexchange.CryptoChallengeUnionOrBuilder>(
                  getCryptoChallenge(),
                  getParentForChildren(),
                  isClean());
          cryptoChallenge_ = null;
        }
        return cryptoChallengeBuilder_;
      }

      private com.google.protobuf.ByteString serverNonce_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes server_nonce = 50;</code>
       * @return Whether the serverNonce field is set.
       */
      public boolean hasServerNonce() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <code>required bytes server_nonce = 50;</code>
       * @return The serverNonce.
       */
      public com.google.protobuf.ByteString getServerNonce() {
        return serverNonce_;
      }
      /**
       * <code>required bytes server_nonce = 50;</code>
       * @param value The serverNonce to set.
       * @return This builder for chaining.
       */
      public Builder setServerNonce(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        serverNonce_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes server_nonce = 50;</code>
       * @return This builder for chaining.
       */
      public Builder clearServerNonce() {
        bitField0_ = (bitField0_ & ~0x00000010);
        serverNonce_ = getDefaultInstance().getServerNonce();
        onChanged();
        return this;
      }

      private com.google.protobuf.ByteString padding_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>optional bytes padding = 60;</code>
       * @return Whether the padding field is set.
       */
      public boolean hasPadding() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <code>optional bytes padding = 60;</code>
       * @return The padding.
       */
      public com.google.protobuf.ByteString getPadding() {
        return padding_;
      }
      /**
       * <code>optional bytes padding = 60;</code>
       * @param value The padding to set.
       * @return This builder for chaining.
       */
      public Builder setPadding(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        padding_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bytes padding = 60;</code>
       * @return This builder for chaining.
       */
      public Builder clearPadding() {
        bitField0_ = (bitField0_ & ~0x00000020);
        padding_ = getDefaultInstance().getPadding();
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.APChallenge)
    }

    // @@protoc_insertion_point(class_scope:spotify.APChallenge)
    private static final com.spotify.Keyexchange.APChallenge DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.APChallenge();
    }

    public static com.spotify.Keyexchange.APChallenge getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<APChallenge>
        PARSER = new com.google.protobuf.AbstractParser<APChallenge>() {
      @java.lang.Override
      public APChallenge parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new APChallenge(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.APChallenge getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface LoginCryptoChallengeUnionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.LoginCryptoChallengeUnion)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
     * @return Whether the diffieHellman field is set.
     */
    boolean hasDiffieHellman();
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
     * @return The diffieHellman.
     */
    com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge getDiffieHellman();
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
     */
    com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallengeOrBuilder getDiffieHellmanOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.LoginCryptoChallengeUnion}
   */
  public  static final class LoginCryptoChallengeUnion extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.LoginCryptoChallengeUnion)
      LoginCryptoChallengeUnionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use LoginCryptoChallengeUnion.newBuilder() to construct.
    private LoginCryptoChallengeUnion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private LoginCryptoChallengeUnion() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new LoginCryptoChallengeUnion();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private LoginCryptoChallengeUnion(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = diffieHellman_.toBuilder();
              }
              diffieHellman_ = input.readMessage(com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(diffieHellman_);
                diffieHellman_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoChallengeUnion_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoChallengeUnion_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.LoginCryptoChallengeUnion.class, com.spotify.Keyexchange.LoginCryptoChallengeUnion.Builder.class);
    }

    private int bitField0_;
    public static final int DIFFIE_HELLMAN_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge diffieHellman_;
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
     * @return Whether the diffieHellman field is set.
     */
    public boolean hasDiffieHellman() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
     * @return The diffieHellman.
     */
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge getDiffieHellman() {
      return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.getDefaultInstance() : diffieHellman_;
    }
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
     */
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallengeOrBuilder getDiffieHellmanOrBuilder() {
      return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.getDefaultInstance() : diffieHellman_;
    }

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

      if (hasDiffieHellman()) {
        if (!getDiffieHellman().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getDiffieHellman());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getDiffieHellman());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.LoginCryptoChallengeUnion)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.LoginCryptoChallengeUnion other = (com.spotify.Keyexchange.LoginCryptoChallengeUnion) obj;

      if (hasDiffieHellman() != other.hasDiffieHellman()) return false;
      if (hasDiffieHellman()) {
        if (!getDiffieHellman()
            .equals(other.getDiffieHellman())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.LoginCryptoChallengeUnion 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.LoginCryptoChallengeUnion}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.LoginCryptoChallengeUnion)
        com.spotify.Keyexchange.LoginCryptoChallengeUnionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoChallengeUnion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoChallengeUnion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.LoginCryptoChallengeUnion.class, com.spotify.Keyexchange.LoginCryptoChallengeUnion.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.LoginCryptoChallengeUnion.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getDiffieHellmanFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = null;
        } else {
          diffieHellmanBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoChallengeUnion_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoChallengeUnion getDefaultInstanceForType() {
        return com.spotify.Keyexchange.LoginCryptoChallengeUnion.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoChallengeUnion build() {
        com.spotify.Keyexchange.LoginCryptoChallengeUnion result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoChallengeUnion buildPartial() {
        com.spotify.Keyexchange.LoginCryptoChallengeUnion result = new com.spotify.Keyexchange.LoginCryptoChallengeUnion(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (diffieHellmanBuilder_ == null) {
            result.diffieHellman_ = diffieHellman_;
          } else {
            result.diffieHellman_ = diffieHellmanBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.LoginCryptoChallengeUnion) {
          return mergeFrom((com.spotify.Keyexchange.LoginCryptoChallengeUnion)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.LoginCryptoChallengeUnion other) {
        if (other == com.spotify.Keyexchange.LoginCryptoChallengeUnion.getDefaultInstance()) return this;
        if (other.hasDiffieHellman()) {
          mergeDiffieHellman(other.getDiffieHellman());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (hasDiffieHellman()) {
          if (!getDiffieHellman().isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.LoginCryptoChallengeUnion parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.LoginCryptoChallengeUnion) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge diffieHellman_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge, com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallengeOrBuilder> diffieHellmanBuilder_;
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       * @return Whether the diffieHellman field is set.
       */
      public boolean hasDiffieHellman() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       * @return The diffieHellman.
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge getDiffieHellman() {
        if (diffieHellmanBuilder_ == null) {
          return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.getDefaultInstance() : diffieHellman_;
        } else {
          return diffieHellmanBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       */
      public Builder setDiffieHellman(com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge value) {
        if (diffieHellmanBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          diffieHellman_ = value;
          onChanged();
        } else {
          diffieHellmanBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       */
      public Builder setDiffieHellman(
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.Builder builderForValue) {
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = builderForValue.build();
          onChanged();
        } else {
          diffieHellmanBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       */
      public Builder mergeDiffieHellman(com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge value) {
        if (diffieHellmanBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              diffieHellman_ != null &&
              diffieHellman_ != com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.getDefaultInstance()) {
            diffieHellman_ =
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.newBuilder(diffieHellman_).mergeFrom(value).buildPartial();
          } else {
            diffieHellman_ = value;
          }
          onChanged();
        } else {
          diffieHellmanBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       */
      public Builder clearDiffieHellman() {
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = null;
          onChanged();
        } else {
          diffieHellmanBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.Builder getDiffieHellmanBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getDiffieHellmanFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallengeOrBuilder getDiffieHellmanOrBuilder() {
        if (diffieHellmanBuilder_ != null) {
          return diffieHellmanBuilder_.getMessageOrBuilder();
        } else {
          return diffieHellman_ == null ?
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.getDefaultInstance() : diffieHellman_;
        }
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanChallenge diffie_hellman = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge, com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallengeOrBuilder> 
          getDiffieHellmanFieldBuilder() {
        if (diffieHellmanBuilder_ == null) {
          diffieHellmanBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge, com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallengeOrBuilder>(
                  getDiffieHellman(),
                  getParentForChildren(),
                  isClean());
          diffieHellman_ = null;
        }
        return diffieHellmanBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.LoginCryptoChallengeUnion)
    }

    // @@protoc_insertion_point(class_scope:spotify.LoginCryptoChallengeUnion)
    private static final com.spotify.Keyexchange.LoginCryptoChallengeUnion DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.LoginCryptoChallengeUnion();
    }

    public static com.spotify.Keyexchange.LoginCryptoChallengeUnion getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<LoginCryptoChallengeUnion>
        PARSER = new com.google.protobuf.AbstractParser<LoginCryptoChallengeUnion>() {
      @java.lang.Override
      public LoginCryptoChallengeUnion parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LoginCryptoChallengeUnion(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.LoginCryptoChallengeUnion getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface LoginCryptoDiffieHellmanChallengeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.LoginCryptoDiffieHellmanChallenge)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required bytes gs = 10;</code>
     * @return Whether the gs field is set.
     */
    boolean hasGs();
    /**
     * <code>required bytes gs = 10;</code>
     * @return The gs.
     */
    com.google.protobuf.ByteString getGs();

    /**
     * <code>required int32 server_signature_key = 20;</code>
     * @return Whether the serverSignatureKey field is set.
     */
    boolean hasServerSignatureKey();
    /**
     * <code>required int32 server_signature_key = 20;</code>
     * @return The serverSignatureKey.
     */
    int getServerSignatureKey();

    /**
     * <code>required bytes gs_signature = 30;</code>
     * @return Whether the gsSignature field is set.
     */
    boolean hasGsSignature();
    /**
     * <code>required bytes gs_signature = 30;</code>
     * @return The gsSignature.
     */
    com.google.protobuf.ByteString getGsSignature();
  }
  /**
   * Protobuf type {@code spotify.LoginCryptoDiffieHellmanChallenge}
   */
  public  static final class LoginCryptoDiffieHellmanChallenge extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.LoginCryptoDiffieHellmanChallenge)
      LoginCryptoDiffieHellmanChallengeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use LoginCryptoDiffieHellmanChallenge.newBuilder() to construct.
    private LoginCryptoDiffieHellmanChallenge(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private LoginCryptoDiffieHellmanChallenge() {
      gs_ = com.google.protobuf.ByteString.EMPTY;
      gsSignature_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new LoginCryptoDiffieHellmanChallenge();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private LoginCryptoDiffieHellmanChallenge(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              bitField0_ |= 0x00000001;
              gs_ = input.readBytes();
              break;
            }
            case 160: {
              bitField0_ |= 0x00000002;
              serverSignatureKey_ = input.readInt32();
              break;
            }
            case 242: {
              bitField0_ |= 0x00000004;
              gsSignature_ = input.readBytes();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanChallenge_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanChallenge_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.class, com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.Builder.class);
    }

    private int bitField0_;
    public static final int GS_FIELD_NUMBER = 10;
    private com.google.protobuf.ByteString gs_;
    /**
     * <code>required bytes gs = 10;</code>
     * @return Whether the gs field is set.
     */
    public boolean hasGs() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required bytes gs = 10;</code>
     * @return The gs.
     */
    public com.google.protobuf.ByteString getGs() {
      return gs_;
    }

    public static final int SERVER_SIGNATURE_KEY_FIELD_NUMBER = 20;
    private int serverSignatureKey_;
    /**
     * <code>required int32 server_signature_key = 20;</code>
     * @return Whether the serverSignatureKey field is set.
     */
    public boolean hasServerSignatureKey() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required int32 server_signature_key = 20;</code>
     * @return The serverSignatureKey.
     */
    public int getServerSignatureKey() {
      return serverSignatureKey_;
    }

    public static final int GS_SIGNATURE_FIELD_NUMBER = 30;
    private com.google.protobuf.ByteString gsSignature_;
    /**
     * <code>required bytes gs_signature = 30;</code>
     * @return Whether the gsSignature field is set.
     */
    public boolean hasGsSignature() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required bytes gs_signature = 30;</code>
     * @return The gsSignature.
     */
    public com.google.protobuf.ByteString getGsSignature() {
      return gsSignature_;
    }

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

      if (!hasGs()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasServerSignatureKey()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasGsSignature()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeBytes(10, gs_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeInt32(20, serverSignatureKey_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeBytes(30, gsSignature_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, gs_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(20, serverSignatureKey_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(30, gsSignature_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge other = (com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge) obj;

      if (hasGs() != other.hasGs()) return false;
      if (hasGs()) {
        if (!getGs()
            .equals(other.getGs())) return false;
      }
      if (hasServerSignatureKey() != other.hasServerSignatureKey()) return false;
      if (hasServerSignatureKey()) {
        if (getServerSignatureKey()
            != other.getServerSignatureKey()) return false;
      }
      if (hasGsSignature() != other.hasGsSignature()) return false;
      if (hasGsSignature()) {
        if (!getGsSignature()
            .equals(other.getGsSignature())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasGs()) {
        hash = (37 * hash) + GS_FIELD_NUMBER;
        hash = (53 * hash) + getGs().hashCode();
      }
      if (hasServerSignatureKey()) {
        hash = (37 * hash) + SERVER_SIGNATURE_KEY_FIELD_NUMBER;
        hash = (53 * hash) + getServerSignatureKey();
      }
      if (hasGsSignature()) {
        hash = (37 * hash) + GS_SIGNATURE_FIELD_NUMBER;
        hash = (53 * hash) + getGsSignature().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.LoginCryptoDiffieHellmanChallenge}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.LoginCryptoDiffieHellmanChallenge)
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallengeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanChallenge_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanChallenge_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.class, com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        gs_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        serverSignatureKey_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        gsSignature_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanChallenge_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge getDefaultInstanceForType() {
        return com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge build() {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge buildPartial() {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge result = new com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.gs_ = gs_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.serverSignatureKey_ = serverSignatureKey_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.gsSignature_ = gsSignature_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge) {
          return mergeFrom((com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge other) {
        if (other == com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge.getDefaultInstance()) return this;
        if (other.hasGs()) {
          setGs(other.getGs());
        }
        if (other.hasServerSignatureKey()) {
          setServerSignatureKey(other.getServerSignatureKey());
        }
        if (other.hasGsSignature()) {
          setGsSignature(other.getGsSignature());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasGs()) {
          return false;
        }
        if (!hasServerSignatureKey()) {
          return false;
        }
        if (!hasGsSignature()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.ByteString gs_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes gs = 10;</code>
       * @return Whether the gs field is set.
       */
      public boolean hasGs() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required bytes gs = 10;</code>
       * @return The gs.
       */
      public com.google.protobuf.ByteString getGs() {
        return gs_;
      }
      /**
       * <code>required bytes gs = 10;</code>
       * @param value The gs to set.
       * @return This builder for chaining.
       */
      public Builder setGs(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        gs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes gs = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearGs() {
        bitField0_ = (bitField0_ & ~0x00000001);
        gs_ = getDefaultInstance().getGs();
        onChanged();
        return this;
      }

      private int serverSignatureKey_ ;
      /**
       * <code>required int32 server_signature_key = 20;</code>
       * @return Whether the serverSignatureKey field is set.
       */
      public boolean hasServerSignatureKey() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required int32 server_signature_key = 20;</code>
       * @return The serverSignatureKey.
       */
      public int getServerSignatureKey() {
        return serverSignatureKey_;
      }
      /**
       * <code>required int32 server_signature_key = 20;</code>
       * @param value The serverSignatureKey to set.
       * @return This builder for chaining.
       */
      public Builder setServerSignatureKey(int value) {
        bitField0_ |= 0x00000002;
        serverSignatureKey_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int32 server_signature_key = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearServerSignatureKey() {
        bitField0_ = (bitField0_ & ~0x00000002);
        serverSignatureKey_ = 0;
        onChanged();
        return this;
      }

      private com.google.protobuf.ByteString gsSignature_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes gs_signature = 30;</code>
       * @return Whether the gsSignature field is set.
       */
      public boolean hasGsSignature() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>required bytes gs_signature = 30;</code>
       * @return The gsSignature.
       */
      public com.google.protobuf.ByteString getGsSignature() {
        return gsSignature_;
      }
      /**
       * <code>required bytes gs_signature = 30;</code>
       * @param value The gsSignature to set.
       * @return This builder for chaining.
       */
      public Builder setGsSignature(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        gsSignature_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes gs_signature = 30;</code>
       * @return This builder for chaining.
       */
      public Builder clearGsSignature() {
        bitField0_ = (bitField0_ & ~0x00000004);
        gsSignature_ = getDefaultInstance().getGsSignature();
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.LoginCryptoDiffieHellmanChallenge)
    }

    // @@protoc_insertion_point(class_scope:spotify.LoginCryptoDiffieHellmanChallenge)
    private static final com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge();
    }

    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<LoginCryptoDiffieHellmanChallenge>
        PARSER = new com.google.protobuf.AbstractParser<LoginCryptoDiffieHellmanChallenge>() {
      @java.lang.Override
      public LoginCryptoDiffieHellmanChallenge parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LoginCryptoDiffieHellmanChallenge(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanChallenge getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface FingerprintChallengeUnionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.FingerprintChallengeUnion)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
     * @return Whether the grain field is set.
     */
    boolean hasGrain();
    /**
     * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
     * @return The grain.
     */
    com.spotify.Keyexchange.FingerprintGrainChallenge getGrain();
    /**
     * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
     */
    com.spotify.Keyexchange.FingerprintGrainChallengeOrBuilder getGrainOrBuilder();

    /**
     * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
     * @return Whether the hmacRipemd field is set.
     */
    boolean hasHmacRipemd();
    /**
     * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
     * @return The hmacRipemd.
     */
    com.spotify.Keyexchange.FingerprintHmacRipemdChallenge getHmacRipemd();
    /**
     * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
     */
    com.spotify.Keyexchange.FingerprintHmacRipemdChallengeOrBuilder getHmacRipemdOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.FingerprintChallengeUnion}
   */
  public  static final class FingerprintChallengeUnion extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.FingerprintChallengeUnion)
      FingerprintChallengeUnionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use FingerprintChallengeUnion.newBuilder() to construct.
    private FingerprintChallengeUnion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private FingerprintChallengeUnion() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new FingerprintChallengeUnion();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private FingerprintChallengeUnion(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.FingerprintGrainChallenge.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = grain_.toBuilder();
              }
              grain_ = input.readMessage(com.spotify.Keyexchange.FingerprintGrainChallenge.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(grain_);
                grain_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 162: {
              com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = hmacRipemd_.toBuilder();
              }
              hmacRipemd_ = input.readMessage(com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(hmacRipemd_);
                hmacRipemd_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_FingerprintChallengeUnion_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_FingerprintChallengeUnion_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.FingerprintChallengeUnion.class, com.spotify.Keyexchange.FingerprintChallengeUnion.Builder.class);
    }

    private int bitField0_;
    public static final int GRAIN_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.FingerprintGrainChallenge grain_;
    /**
     * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
     * @return Whether the grain field is set.
     */
    public boolean hasGrain() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
     * @return The grain.
     */
    public com.spotify.Keyexchange.FingerprintGrainChallenge getGrain() {
      return grain_ == null ? com.spotify.Keyexchange.FingerprintGrainChallenge.getDefaultInstance() : grain_;
    }
    /**
     * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
     */
    public com.spotify.Keyexchange.FingerprintGrainChallengeOrBuilder getGrainOrBuilder() {
      return grain_ == null ? com.spotify.Keyexchange.FingerprintGrainChallenge.getDefaultInstance() : grain_;
    }

    public static final int HMAC_RIPEMD_FIELD_NUMBER = 20;
    private com.spotify.Keyexchange.FingerprintHmacRipemdChallenge hmacRipemd_;
    /**
     * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
     * @return Whether the hmacRipemd field is set.
     */
    public boolean hasHmacRipemd() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
     * @return The hmacRipemd.
     */
    public com.spotify.Keyexchange.FingerprintHmacRipemdChallenge getHmacRipemd() {
      return hmacRipemd_ == null ? com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.getDefaultInstance() : hmacRipemd_;
    }
    /**
     * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
     */
    public com.spotify.Keyexchange.FingerprintHmacRipemdChallengeOrBuilder getHmacRipemdOrBuilder() {
      return hmacRipemd_ == null ? com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.getDefaultInstance() : hmacRipemd_;
    }

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

      if (hasGrain()) {
        if (!getGrain().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasHmacRipemd()) {
        if (!getHmacRipemd().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getGrain());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(20, getHmacRipemd());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getGrain());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(20, getHmacRipemd());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.FingerprintChallengeUnion)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.FingerprintChallengeUnion other = (com.spotify.Keyexchange.FingerprintChallengeUnion) obj;

      if (hasGrain() != other.hasGrain()) return false;
      if (hasGrain()) {
        if (!getGrain()
            .equals(other.getGrain())) return false;
      }
      if (hasHmacRipemd() != other.hasHmacRipemd()) return false;
      if (hasHmacRipemd()) {
        if (!getHmacRipemd()
            .equals(other.getHmacRipemd())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasGrain()) {
        hash = (37 * hash) + GRAIN_FIELD_NUMBER;
        hash = (53 * hash) + getGrain().hashCode();
      }
      if (hasHmacRipemd()) {
        hash = (37 * hash) + HMAC_RIPEMD_FIELD_NUMBER;
        hash = (53 * hash) + getHmacRipemd().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintChallengeUnion parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.FingerprintChallengeUnion 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.FingerprintChallengeUnion}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.FingerprintChallengeUnion)
        com.spotify.Keyexchange.FingerprintChallengeUnionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintChallengeUnion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintChallengeUnion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.FingerprintChallengeUnion.class, com.spotify.Keyexchange.FingerprintChallengeUnion.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.FingerprintChallengeUnion.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getGrainFieldBuilder();
          getHmacRipemdFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (grainBuilder_ == null) {
          grain_ = null;
        } else {
          grainBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        if (hmacRipemdBuilder_ == null) {
          hmacRipemd_ = null;
        } else {
          hmacRipemdBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintChallengeUnion_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintChallengeUnion getDefaultInstanceForType() {
        return com.spotify.Keyexchange.FingerprintChallengeUnion.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintChallengeUnion build() {
        com.spotify.Keyexchange.FingerprintChallengeUnion result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintChallengeUnion buildPartial() {
        com.spotify.Keyexchange.FingerprintChallengeUnion result = new com.spotify.Keyexchange.FingerprintChallengeUnion(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (grainBuilder_ == null) {
            result.grain_ = grain_;
          } else {
            result.grain_ = grainBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          if (hmacRipemdBuilder_ == null) {
            result.hmacRipemd_ = hmacRipemd_;
          } else {
            result.hmacRipemd_ = hmacRipemdBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.FingerprintChallengeUnion) {
          return mergeFrom((com.spotify.Keyexchange.FingerprintChallengeUnion)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.FingerprintChallengeUnion other) {
        if (other == com.spotify.Keyexchange.FingerprintChallengeUnion.getDefaultInstance()) return this;
        if (other.hasGrain()) {
          mergeGrain(other.getGrain());
        }
        if (other.hasHmacRipemd()) {
          mergeHmacRipemd(other.getHmacRipemd());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (hasGrain()) {
          if (!getGrain().isInitialized()) {
            return false;
          }
        }
        if (hasHmacRipemd()) {
          if (!getHmacRipemd().isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.FingerprintChallengeUnion parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.FingerprintChallengeUnion) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.FingerprintGrainChallenge grain_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.FingerprintGrainChallenge, com.spotify.Keyexchange.FingerprintGrainChallenge.Builder, com.spotify.Keyexchange.FingerprintGrainChallengeOrBuilder> grainBuilder_;
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       * @return Whether the grain field is set.
       */
      public boolean hasGrain() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       * @return The grain.
       */
      public com.spotify.Keyexchange.FingerprintGrainChallenge getGrain() {
        if (grainBuilder_ == null) {
          return grain_ == null ? com.spotify.Keyexchange.FingerprintGrainChallenge.getDefaultInstance() : grain_;
        } else {
          return grainBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       */
      public Builder setGrain(com.spotify.Keyexchange.FingerprintGrainChallenge value) {
        if (grainBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          grain_ = value;
          onChanged();
        } else {
          grainBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       */
      public Builder setGrain(
          com.spotify.Keyexchange.FingerprintGrainChallenge.Builder builderForValue) {
        if (grainBuilder_ == null) {
          grain_ = builderForValue.build();
          onChanged();
        } else {
          grainBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       */
      public Builder mergeGrain(com.spotify.Keyexchange.FingerprintGrainChallenge value) {
        if (grainBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              grain_ != null &&
              grain_ != com.spotify.Keyexchange.FingerprintGrainChallenge.getDefaultInstance()) {
            grain_ =
              com.spotify.Keyexchange.FingerprintGrainChallenge.newBuilder(grain_).mergeFrom(value).buildPartial();
          } else {
            grain_ = value;
          }
          onChanged();
        } else {
          grainBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       */
      public Builder clearGrain() {
        if (grainBuilder_ == null) {
          grain_ = null;
          onChanged();
        } else {
          grainBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       */
      public com.spotify.Keyexchange.FingerprintGrainChallenge.Builder getGrainBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getGrainFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       */
      public com.spotify.Keyexchange.FingerprintGrainChallengeOrBuilder getGrainOrBuilder() {
        if (grainBuilder_ != null) {
          return grainBuilder_.getMessageOrBuilder();
        } else {
          return grain_ == null ?
              com.spotify.Keyexchange.FingerprintGrainChallenge.getDefaultInstance() : grain_;
        }
      }
      /**
       * <code>optional .spotify.FingerprintGrainChallenge grain = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.FingerprintGrainChallenge, com.spotify.Keyexchange.FingerprintGrainChallenge.Builder, com.spotify.Keyexchange.FingerprintGrainChallengeOrBuilder> 
          getGrainFieldBuilder() {
        if (grainBuilder_ == null) {
          grainBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.FingerprintGrainChallenge, com.spotify.Keyexchange.FingerprintGrainChallenge.Builder, com.spotify.Keyexchange.FingerprintGrainChallengeOrBuilder>(
                  getGrain(),
                  getParentForChildren(),
                  isClean());
          grain_ = null;
        }
        return grainBuilder_;
      }

      private com.spotify.Keyexchange.FingerprintHmacRipemdChallenge hmacRipemd_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.FingerprintHmacRipemdChallenge, com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.Builder, com.spotify.Keyexchange.FingerprintHmacRipemdChallengeOrBuilder> hmacRipemdBuilder_;
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       * @return Whether the hmacRipemd field is set.
       */
      public boolean hasHmacRipemd() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       * @return The hmacRipemd.
       */
      public com.spotify.Keyexchange.FingerprintHmacRipemdChallenge getHmacRipemd() {
        if (hmacRipemdBuilder_ == null) {
          return hmacRipemd_ == null ? com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.getDefaultInstance() : hmacRipemd_;
        } else {
          return hmacRipemdBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       */
      public Builder setHmacRipemd(com.spotify.Keyexchange.FingerprintHmacRipemdChallenge value) {
        if (hmacRipemdBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          hmacRipemd_ = value;
          onChanged();
        } else {
          hmacRipemdBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       */
      public Builder setHmacRipemd(
          com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.Builder builderForValue) {
        if (hmacRipemdBuilder_ == null) {
          hmacRipemd_ = builderForValue.build();
          onChanged();
        } else {
          hmacRipemdBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       */
      public Builder mergeHmacRipemd(com.spotify.Keyexchange.FingerprintHmacRipemdChallenge value) {
        if (hmacRipemdBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
              hmacRipemd_ != null &&
              hmacRipemd_ != com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.getDefaultInstance()) {
            hmacRipemd_ =
              com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.newBuilder(hmacRipemd_).mergeFrom(value).buildPartial();
          } else {
            hmacRipemd_ = value;
          }
          onChanged();
        } else {
          hmacRipemdBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       */
      public Builder clearHmacRipemd() {
        if (hmacRipemdBuilder_ == null) {
          hmacRipemd_ = null;
          onChanged();
        } else {
          hmacRipemdBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       */
      public com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.Builder getHmacRipemdBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getHmacRipemdFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       */
      public com.spotify.Keyexchange.FingerprintHmacRipemdChallengeOrBuilder getHmacRipemdOrBuilder() {
        if (hmacRipemdBuilder_ != null) {
          return hmacRipemdBuilder_.getMessageOrBuilder();
        } else {
          return hmacRipemd_ == null ?
              com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.getDefaultInstance() : hmacRipemd_;
        }
      }
      /**
       * <code>optional .spotify.FingerprintHmacRipemdChallenge hmac_ripemd = 20;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.FingerprintHmacRipemdChallenge, com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.Builder, com.spotify.Keyexchange.FingerprintHmacRipemdChallengeOrBuilder> 
          getHmacRipemdFieldBuilder() {
        if (hmacRipemdBuilder_ == null) {
          hmacRipemdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.FingerprintHmacRipemdChallenge, com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.Builder, com.spotify.Keyexchange.FingerprintHmacRipemdChallengeOrBuilder>(
                  getHmacRipemd(),
                  getParentForChildren(),
                  isClean());
          hmacRipemd_ = null;
        }
        return hmacRipemdBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.FingerprintChallengeUnion)
    }

    // @@protoc_insertion_point(class_scope:spotify.FingerprintChallengeUnion)
    private static final com.spotify.Keyexchange.FingerprintChallengeUnion DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.FingerprintChallengeUnion();
    }

    public static com.spotify.Keyexchange.FingerprintChallengeUnion getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<FingerprintChallengeUnion>
        PARSER = new com.google.protobuf.AbstractParser<FingerprintChallengeUnion>() {
      @java.lang.Override
      public FingerprintChallengeUnion parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new FingerprintChallengeUnion(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.FingerprintChallengeUnion getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface FingerprintGrainChallengeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.FingerprintGrainChallenge)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required bytes kek = 10;</code>
     * @return Whether the kek field is set.
     */
    boolean hasKek();
    /**
     * <code>required bytes kek = 10;</code>
     * @return The kek.
     */
    com.google.protobuf.ByteString getKek();
  }
  /**
   * Protobuf type {@code spotify.FingerprintGrainChallenge}
   */
  public  static final class FingerprintGrainChallenge extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.FingerprintGrainChallenge)
      FingerprintGrainChallengeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use FingerprintGrainChallenge.newBuilder() to construct.
    private FingerprintGrainChallenge(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private FingerprintGrainChallenge() {
      kek_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new FingerprintGrainChallenge();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private FingerprintGrainChallenge(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              bitField0_ |= 0x00000001;
              kek_ = input.readBytes();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_FingerprintGrainChallenge_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_FingerprintGrainChallenge_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.FingerprintGrainChallenge.class, com.spotify.Keyexchange.FingerprintGrainChallenge.Builder.class);
    }

    private int bitField0_;
    public static final int KEK_FIELD_NUMBER = 10;
    private com.google.protobuf.ByteString kek_;
    /**
     * <code>required bytes kek = 10;</code>
     * @return Whether the kek field is set.
     */
    public boolean hasKek() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required bytes kek = 10;</code>
     * @return The kek.
     */
    public com.google.protobuf.ByteString getKek() {
      return kek_;
    }

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

      if (!hasKek()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeBytes(10, kek_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, kek_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.FingerprintGrainChallenge)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.FingerprintGrainChallenge other = (com.spotify.Keyexchange.FingerprintGrainChallenge) obj;

      if (hasKek() != other.hasKek()) return false;
      if (hasKek()) {
        if (!getKek()
            .equals(other.getKek())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintGrainChallenge parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.FingerprintGrainChallenge 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.FingerprintGrainChallenge}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.FingerprintGrainChallenge)
        com.spotify.Keyexchange.FingerprintGrainChallengeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintGrainChallenge_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintGrainChallenge_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.FingerprintGrainChallenge.class, com.spotify.Keyexchange.FingerprintGrainChallenge.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.FingerprintGrainChallenge.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        kek_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintGrainChallenge_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintGrainChallenge getDefaultInstanceForType() {
        return com.spotify.Keyexchange.FingerprintGrainChallenge.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintGrainChallenge build() {
        com.spotify.Keyexchange.FingerprintGrainChallenge result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintGrainChallenge buildPartial() {
        com.spotify.Keyexchange.FingerprintGrainChallenge result = new com.spotify.Keyexchange.FingerprintGrainChallenge(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.kek_ = kek_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.FingerprintGrainChallenge) {
          return mergeFrom((com.spotify.Keyexchange.FingerprintGrainChallenge)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.FingerprintGrainChallenge other) {
        if (other == com.spotify.Keyexchange.FingerprintGrainChallenge.getDefaultInstance()) return this;
        if (other.hasKek()) {
          setKek(other.getKek());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

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

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.FingerprintGrainChallenge parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.FingerprintGrainChallenge) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.ByteString kek_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes kek = 10;</code>
       * @return Whether the kek field is set.
       */
      public boolean hasKek() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required bytes kek = 10;</code>
       * @return The kek.
       */
      public com.google.protobuf.ByteString getKek() {
        return kek_;
      }
      /**
       * <code>required bytes kek = 10;</code>
       * @param value The kek to set.
       * @return This builder for chaining.
       */
      public Builder setKek(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        kek_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes kek = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearKek() {
        bitField0_ = (bitField0_ & ~0x00000001);
        kek_ = getDefaultInstance().getKek();
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.FingerprintGrainChallenge)
    }

    // @@protoc_insertion_point(class_scope:spotify.FingerprintGrainChallenge)
    private static final com.spotify.Keyexchange.FingerprintGrainChallenge DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.FingerprintGrainChallenge();
    }

    public static com.spotify.Keyexchange.FingerprintGrainChallenge getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<FingerprintGrainChallenge>
        PARSER = new com.google.protobuf.AbstractParser<FingerprintGrainChallenge>() {
      @java.lang.Override
      public FingerprintGrainChallenge parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new FingerprintGrainChallenge(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.FingerprintGrainChallenge getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface FingerprintHmacRipemdChallengeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.FingerprintHmacRipemdChallenge)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required bytes challenge = 10;</code>
     * @return Whether the challenge field is set.
     */
    boolean hasChallenge();
    /**
     * <code>required bytes challenge = 10;</code>
     * @return The challenge.
     */
    com.google.protobuf.ByteString getChallenge();
  }
  /**
   * Protobuf type {@code spotify.FingerprintHmacRipemdChallenge}
   */
  public  static final class FingerprintHmacRipemdChallenge extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.FingerprintHmacRipemdChallenge)
      FingerprintHmacRipemdChallengeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use FingerprintHmacRipemdChallenge.newBuilder() to construct.
    private FingerprintHmacRipemdChallenge(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private FingerprintHmacRipemdChallenge() {
      challenge_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new FingerprintHmacRipemdChallenge();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private FingerprintHmacRipemdChallenge(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              bitField0_ |= 0x00000001;
              challenge_ = input.readBytes();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_FingerprintHmacRipemdChallenge_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_FingerprintHmacRipemdChallenge_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.class, com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.Builder.class);
    }

    private int bitField0_;
    public static final int CHALLENGE_FIELD_NUMBER = 10;
    private com.google.protobuf.ByteString challenge_;
    /**
     * <code>required bytes challenge = 10;</code>
     * @return Whether the challenge field is set.
     */
    public boolean hasChallenge() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required bytes challenge = 10;</code>
     * @return The challenge.
     */
    public com.google.protobuf.ByteString getChallenge() {
      return challenge_;
    }

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

      if (!hasChallenge()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeBytes(10, challenge_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, challenge_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.FingerprintHmacRipemdChallenge)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.FingerprintHmacRipemdChallenge other = (com.spotify.Keyexchange.FingerprintHmacRipemdChallenge) obj;

      if (hasChallenge() != other.hasChallenge()) return false;
      if (hasChallenge()) {
        if (!getChallenge()
            .equals(other.getChallenge())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.FingerprintHmacRipemdChallenge 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.FingerprintHmacRipemdChallenge}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.FingerprintHmacRipemdChallenge)
        com.spotify.Keyexchange.FingerprintHmacRipemdChallengeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintHmacRipemdChallenge_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintHmacRipemdChallenge_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.class, com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        challenge_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_FingerprintHmacRipemdChallenge_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintHmacRipemdChallenge getDefaultInstanceForType() {
        return com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintHmacRipemdChallenge build() {
        com.spotify.Keyexchange.FingerprintHmacRipemdChallenge result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.FingerprintHmacRipemdChallenge buildPartial() {
        com.spotify.Keyexchange.FingerprintHmacRipemdChallenge result = new com.spotify.Keyexchange.FingerprintHmacRipemdChallenge(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.challenge_ = challenge_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.FingerprintHmacRipemdChallenge) {
          return mergeFrom((com.spotify.Keyexchange.FingerprintHmacRipemdChallenge)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.FingerprintHmacRipemdChallenge other) {
        if (other == com.spotify.Keyexchange.FingerprintHmacRipemdChallenge.getDefaultInstance()) return this;
        if (other.hasChallenge()) {
          setChallenge(other.getChallenge());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

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

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.FingerprintHmacRipemdChallenge parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.FingerprintHmacRipemdChallenge) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.ByteString challenge_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes challenge = 10;</code>
       * @return Whether the challenge field is set.
       */
      public boolean hasChallenge() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required bytes challenge = 10;</code>
       * @return The challenge.
       */
      public com.google.protobuf.ByteString getChallenge() {
        return challenge_;
      }
      /**
       * <code>required bytes challenge = 10;</code>
       * @param value The challenge to set.
       * @return This builder for chaining.
       */
      public Builder setChallenge(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        challenge_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes challenge = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearChallenge() {
        bitField0_ = (bitField0_ & ~0x00000001);
        challenge_ = getDefaultInstance().getChallenge();
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.FingerprintHmacRipemdChallenge)
    }

    // @@protoc_insertion_point(class_scope:spotify.FingerprintHmacRipemdChallenge)
    private static final com.spotify.Keyexchange.FingerprintHmacRipemdChallenge DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.FingerprintHmacRipemdChallenge();
    }

    public static com.spotify.Keyexchange.FingerprintHmacRipemdChallenge getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<FingerprintHmacRipemdChallenge>
        PARSER = new com.google.protobuf.AbstractParser<FingerprintHmacRipemdChallenge>() {
      @java.lang.Override
      public FingerprintHmacRipemdChallenge parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new FingerprintHmacRipemdChallenge(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.FingerprintHmacRipemdChallenge getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface PoWChallengeUnionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.PoWChallengeUnion)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
     * @return Whether the hashCash field is set.
     */
    boolean hasHashCash();
    /**
     * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
     * @return The hashCash.
     */
    com.spotify.Keyexchange.PoWHashCashChallenge getHashCash();
    /**
     * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
     */
    com.spotify.Keyexchange.PoWHashCashChallengeOrBuilder getHashCashOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.PoWChallengeUnion}
   */
  public  static final class PoWChallengeUnion extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.PoWChallengeUnion)
      PoWChallengeUnionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use PoWChallengeUnion.newBuilder() to construct.
    private PoWChallengeUnion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private PoWChallengeUnion() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new PoWChallengeUnion();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private PoWChallengeUnion(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.PoWHashCashChallenge.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = hashCash_.toBuilder();
              }
              hashCash_ = input.readMessage(com.spotify.Keyexchange.PoWHashCashChallenge.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(hashCash_);
                hashCash_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_PoWChallengeUnion_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_PoWChallengeUnion_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.PoWChallengeUnion.class, com.spotify.Keyexchange.PoWChallengeUnion.Builder.class);
    }

    private int bitField0_;
    public static final int HASH_CASH_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.PoWHashCashChallenge hashCash_;
    /**
     * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
     * @return Whether the hashCash field is set.
     */
    public boolean hasHashCash() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
     * @return The hashCash.
     */
    public com.spotify.Keyexchange.PoWHashCashChallenge getHashCash() {
      return hashCash_ == null ? com.spotify.Keyexchange.PoWHashCashChallenge.getDefaultInstance() : hashCash_;
    }
    /**
     * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
     */
    public com.spotify.Keyexchange.PoWHashCashChallengeOrBuilder getHashCashOrBuilder() {
      return hashCash_ == null ? com.spotify.Keyexchange.PoWHashCashChallenge.getDefaultInstance() : hashCash_;
    }

    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 (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getHashCash());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getHashCash());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.PoWChallengeUnion)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.PoWChallengeUnion other = (com.spotify.Keyexchange.PoWChallengeUnion) obj;

      if (hasHashCash() != other.hasHashCash()) return false;
      if (hasHashCash()) {
        if (!getHashCash()
            .equals(other.getHashCash())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWChallengeUnion parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.PoWChallengeUnion 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.PoWChallengeUnion}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.PoWChallengeUnion)
        com.spotify.Keyexchange.PoWChallengeUnionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWChallengeUnion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWChallengeUnion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.PoWChallengeUnion.class, com.spotify.Keyexchange.PoWChallengeUnion.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.PoWChallengeUnion.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getHashCashFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (hashCashBuilder_ == null) {
          hashCash_ = null;
        } else {
          hashCashBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWChallengeUnion_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWChallengeUnion getDefaultInstanceForType() {
        return com.spotify.Keyexchange.PoWChallengeUnion.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWChallengeUnion build() {
        com.spotify.Keyexchange.PoWChallengeUnion result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWChallengeUnion buildPartial() {
        com.spotify.Keyexchange.PoWChallengeUnion result = new com.spotify.Keyexchange.PoWChallengeUnion(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (hashCashBuilder_ == null) {
            result.hashCash_ = hashCash_;
          } else {
            result.hashCash_ = hashCashBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.PoWChallengeUnion) {
          return mergeFrom((com.spotify.Keyexchange.PoWChallengeUnion)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.PoWChallengeUnion other) {
        if (other == com.spotify.Keyexchange.PoWChallengeUnion.getDefaultInstance()) return this;
        if (other.hasHashCash()) {
          mergeHashCash(other.getHashCash());
        }
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.PoWChallengeUnion parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.PoWChallengeUnion) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.PoWHashCashChallenge hashCash_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.PoWHashCashChallenge, com.spotify.Keyexchange.PoWHashCashChallenge.Builder, com.spotify.Keyexchange.PoWHashCashChallengeOrBuilder> hashCashBuilder_;
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       * @return Whether the hashCash field is set.
       */
      public boolean hasHashCash() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       * @return The hashCash.
       */
      public com.spotify.Keyexchange.PoWHashCashChallenge getHashCash() {
        if (hashCashBuilder_ == null) {
          return hashCash_ == null ? com.spotify.Keyexchange.PoWHashCashChallenge.getDefaultInstance() : hashCash_;
        } else {
          return hashCashBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       */
      public Builder setHashCash(com.spotify.Keyexchange.PoWHashCashChallenge value) {
        if (hashCashBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          hashCash_ = value;
          onChanged();
        } else {
          hashCashBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       */
      public Builder setHashCash(
          com.spotify.Keyexchange.PoWHashCashChallenge.Builder builderForValue) {
        if (hashCashBuilder_ == null) {
          hashCash_ = builderForValue.build();
          onChanged();
        } else {
          hashCashBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       */
      public Builder mergeHashCash(com.spotify.Keyexchange.PoWHashCashChallenge value) {
        if (hashCashBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              hashCash_ != null &&
              hashCash_ != com.spotify.Keyexchange.PoWHashCashChallenge.getDefaultInstance()) {
            hashCash_ =
              com.spotify.Keyexchange.PoWHashCashChallenge.newBuilder(hashCash_).mergeFrom(value).buildPartial();
          } else {
            hashCash_ = value;
          }
          onChanged();
        } else {
          hashCashBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       */
      public Builder clearHashCash() {
        if (hashCashBuilder_ == null) {
          hashCash_ = null;
          onChanged();
        } else {
          hashCashBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       */
      public com.spotify.Keyexchange.PoWHashCashChallenge.Builder getHashCashBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getHashCashFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       */
      public com.spotify.Keyexchange.PoWHashCashChallengeOrBuilder getHashCashOrBuilder() {
        if (hashCashBuilder_ != null) {
          return hashCashBuilder_.getMessageOrBuilder();
        } else {
          return hashCash_ == null ?
              com.spotify.Keyexchange.PoWHashCashChallenge.getDefaultInstance() : hashCash_;
        }
      }
      /**
       * <code>optional .spotify.PoWHashCashChallenge hash_cash = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.PoWHashCashChallenge, com.spotify.Keyexchange.PoWHashCashChallenge.Builder, com.spotify.Keyexchange.PoWHashCashChallengeOrBuilder> 
          getHashCashFieldBuilder() {
        if (hashCashBuilder_ == null) {
          hashCashBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.PoWHashCashChallenge, com.spotify.Keyexchange.PoWHashCashChallenge.Builder, com.spotify.Keyexchange.PoWHashCashChallengeOrBuilder>(
                  getHashCash(),
                  getParentForChildren(),
                  isClean());
          hashCash_ = null;
        }
        return hashCashBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.PoWChallengeUnion)
    }

    // @@protoc_insertion_point(class_scope:spotify.PoWChallengeUnion)
    private static final com.spotify.Keyexchange.PoWChallengeUnion DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.PoWChallengeUnion();
    }

    public static com.spotify.Keyexchange.PoWChallengeUnion getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<PoWChallengeUnion>
        PARSER = new com.google.protobuf.AbstractParser<PoWChallengeUnion>() {
      @java.lang.Override
      public PoWChallengeUnion parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PoWChallengeUnion(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.PoWChallengeUnion getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface PoWHashCashChallengeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.PoWHashCashChallenge)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional bytes prefix = 10;</code>
     * @return Whether the prefix field is set.
     */
    boolean hasPrefix();
    /**
     * <code>optional bytes prefix = 10;</code>
     * @return The prefix.
     */
    com.google.protobuf.ByteString getPrefix();

    /**
     * <code>optional int32 length = 20;</code>
     * @return Whether the length field is set.
     */
    boolean hasLength();
    /**
     * <code>optional int32 length = 20;</code>
     * @return The length.
     */
    int getLength();

    /**
     * <code>optional int32 target = 30;</code>
     * @return Whether the target field is set.
     */
    boolean hasTarget();
    /**
     * <code>optional int32 target = 30;</code>
     * @return The target.
     */
    int getTarget();
  }
  /**
   * Protobuf type {@code spotify.PoWHashCashChallenge}
   */
  public  static final class PoWHashCashChallenge extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.PoWHashCashChallenge)
      PoWHashCashChallengeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use PoWHashCashChallenge.newBuilder() to construct.
    private PoWHashCashChallenge(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private PoWHashCashChallenge() {
      prefix_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new PoWHashCashChallenge();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private PoWHashCashChallenge(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              bitField0_ |= 0x00000001;
              prefix_ = input.readBytes();
              break;
            }
            case 160: {
              bitField0_ |= 0x00000002;
              length_ = input.readInt32();
              break;
            }
            case 240: {
              bitField0_ |= 0x00000004;
              target_ = input.readInt32();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashChallenge_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashChallenge_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.PoWHashCashChallenge.class, com.spotify.Keyexchange.PoWHashCashChallenge.Builder.class);
    }

    private int bitField0_;
    public static final int PREFIX_FIELD_NUMBER = 10;
    private com.google.protobuf.ByteString prefix_;
    /**
     * <code>optional bytes prefix = 10;</code>
     * @return Whether the prefix field is set.
     */
    public boolean hasPrefix() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional bytes prefix = 10;</code>
     * @return The prefix.
     */
    public com.google.protobuf.ByteString getPrefix() {
      return prefix_;
    }

    public static final int LENGTH_FIELD_NUMBER = 20;
    private int length_;
    /**
     * <code>optional int32 length = 20;</code>
     * @return Whether the length field is set.
     */
    public boolean hasLength() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional int32 length = 20;</code>
     * @return The length.
     */
    public int getLength() {
      return length_;
    }

    public static final int TARGET_FIELD_NUMBER = 30;
    private int target_;
    /**
     * <code>optional int32 target = 30;</code>
     * @return Whether the target field is set.
     */
    public boolean hasTarget() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>optional int32 target = 30;</code>
     * @return The target.
     */
    public int getTarget() {
      return target_;
    }

    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 (((bitField0_ & 0x00000001) != 0)) {
        output.writeBytes(10, prefix_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeInt32(20, length_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeInt32(30, target_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, prefix_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(20, length_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(30, target_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.PoWHashCashChallenge)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.PoWHashCashChallenge other = (com.spotify.Keyexchange.PoWHashCashChallenge) obj;

      if (hasPrefix() != other.hasPrefix()) return false;
      if (hasPrefix()) {
        if (!getPrefix()
            .equals(other.getPrefix())) return false;
      }
      if (hasLength() != other.hasLength()) return false;
      if (hasLength()) {
        if (getLength()
            != other.getLength()) return false;
      }
      if (hasTarget() != other.hasTarget()) return false;
      if (hasTarget()) {
        if (getTarget()
            != other.getTarget()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasPrefix()) {
        hash = (37 * hash) + PREFIX_FIELD_NUMBER;
        hash = (53 * hash) + getPrefix().hashCode();
      }
      if (hasLength()) {
        hash = (37 * hash) + LENGTH_FIELD_NUMBER;
        hash = (53 * hash) + getLength();
      }
      if (hasTarget()) {
        hash = (37 * hash) + TARGET_FIELD_NUMBER;
        hash = (53 * hash) + getTarget();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWHashCashChallenge parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.PoWHashCashChallenge 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.PoWHashCashChallenge}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.PoWHashCashChallenge)
        com.spotify.Keyexchange.PoWHashCashChallengeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashChallenge_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashChallenge_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.PoWHashCashChallenge.class, com.spotify.Keyexchange.PoWHashCashChallenge.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.PoWHashCashChallenge.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        prefix_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        length_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        target_ = 0;
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashChallenge_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWHashCashChallenge getDefaultInstanceForType() {
        return com.spotify.Keyexchange.PoWHashCashChallenge.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWHashCashChallenge build() {
        com.spotify.Keyexchange.PoWHashCashChallenge result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWHashCashChallenge buildPartial() {
        com.spotify.Keyexchange.PoWHashCashChallenge result = new com.spotify.Keyexchange.PoWHashCashChallenge(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.prefix_ = prefix_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.length_ = length_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.target_ = target_;
          to_bitField0_ |= 0x00000004;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.PoWHashCashChallenge) {
          return mergeFrom((com.spotify.Keyexchange.PoWHashCashChallenge)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.PoWHashCashChallenge other) {
        if (other == com.spotify.Keyexchange.PoWHashCashChallenge.getDefaultInstance()) return this;
        if (other.hasPrefix()) {
          setPrefix(other.getPrefix());
        }
        if (other.hasLength()) {
          setLength(other.getLength());
        }
        if (other.hasTarget()) {
          setTarget(other.getTarget());
        }
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.PoWHashCashChallenge parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.PoWHashCashChallenge) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.ByteString prefix_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>optional bytes prefix = 10;</code>
       * @return Whether the prefix field is set.
       */
      public boolean hasPrefix() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional bytes prefix = 10;</code>
       * @return The prefix.
       */
      public com.google.protobuf.ByteString getPrefix() {
        return prefix_;
      }
      /**
       * <code>optional bytes prefix = 10;</code>
       * @param value The prefix to set.
       * @return This builder for chaining.
       */
      public Builder setPrefix(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        prefix_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bytes prefix = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearPrefix() {
        bitField0_ = (bitField0_ & ~0x00000001);
        prefix_ = getDefaultInstance().getPrefix();
        onChanged();
        return this;
      }

      private int length_ ;
      /**
       * <code>optional int32 length = 20;</code>
       * @return Whether the length field is set.
       */
      public boolean hasLength() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional int32 length = 20;</code>
       * @return The length.
       */
      public int getLength() {
        return length_;
      }
      /**
       * <code>optional int32 length = 20;</code>
       * @param value The length to set.
       * @return This builder for chaining.
       */
      public Builder setLength(int value) {
        bitField0_ |= 0x00000002;
        length_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 length = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearLength() {
        bitField0_ = (bitField0_ & ~0x00000002);
        length_ = 0;
        onChanged();
        return this;
      }

      private int target_ ;
      /**
       * <code>optional int32 target = 30;</code>
       * @return Whether the target field is set.
       */
      public boolean hasTarget() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>optional int32 target = 30;</code>
       * @return The target.
       */
      public int getTarget() {
        return target_;
      }
      /**
       * <code>optional int32 target = 30;</code>
       * @param value The target to set.
       * @return This builder for chaining.
       */
      public Builder setTarget(int value) {
        bitField0_ |= 0x00000004;
        target_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 target = 30;</code>
       * @return This builder for chaining.
       */
      public Builder clearTarget() {
        bitField0_ = (bitField0_ & ~0x00000004);
        target_ = 0;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.PoWHashCashChallenge)
    }

    // @@protoc_insertion_point(class_scope:spotify.PoWHashCashChallenge)
    private static final com.spotify.Keyexchange.PoWHashCashChallenge DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.PoWHashCashChallenge();
    }

    public static com.spotify.Keyexchange.PoWHashCashChallenge getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<PoWHashCashChallenge>
        PARSER = new com.google.protobuf.AbstractParser<PoWHashCashChallenge>() {
      @java.lang.Override
      public PoWHashCashChallenge parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PoWHashCashChallenge(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.PoWHashCashChallenge getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface CryptoChallengeUnionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.CryptoChallengeUnion)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
     * @return Whether the shannon field is set.
     */
    boolean hasShannon();
    /**
     * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
     * @return The shannon.
     */
    com.spotify.Keyexchange.CryptoShannonChallenge getShannon();
    /**
     * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
     */
    com.spotify.Keyexchange.CryptoShannonChallengeOrBuilder getShannonOrBuilder();

    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
     * @return Whether the rc4Sha1Hmac field is set.
     */
    boolean hasRc4Sha1Hmac();
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
     * @return The rc4Sha1Hmac.
     */
    com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge getRc4Sha1Hmac();
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
     */
    com.spotify.Keyexchange.CryptoRc4Sha1HmacChallengeOrBuilder getRc4Sha1HmacOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.CryptoChallengeUnion}
   */
  public  static final class CryptoChallengeUnion extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.CryptoChallengeUnion)
      CryptoChallengeUnionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use CryptoChallengeUnion.newBuilder() to construct.
    private CryptoChallengeUnion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private CryptoChallengeUnion() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new CryptoChallengeUnion();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private CryptoChallengeUnion(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.CryptoShannonChallenge.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = shannon_.toBuilder();
              }
              shannon_ = input.readMessage(com.spotify.Keyexchange.CryptoShannonChallenge.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(shannon_);
                shannon_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 162: {
              com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = rc4Sha1Hmac_.toBuilder();
              }
              rc4Sha1Hmac_ = input.readMessage(com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(rc4Sha1Hmac_);
                rc4Sha1Hmac_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoChallengeUnion_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoChallengeUnion_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.CryptoChallengeUnion.class, com.spotify.Keyexchange.CryptoChallengeUnion.Builder.class);
    }

    private int bitField0_;
    public static final int SHANNON_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.CryptoShannonChallenge shannon_;
    /**
     * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
     * @return Whether the shannon field is set.
     */
    public boolean hasShannon() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
     * @return The shannon.
     */
    public com.spotify.Keyexchange.CryptoShannonChallenge getShannon() {
      return shannon_ == null ? com.spotify.Keyexchange.CryptoShannonChallenge.getDefaultInstance() : shannon_;
    }
    /**
     * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
     */
    public com.spotify.Keyexchange.CryptoShannonChallengeOrBuilder getShannonOrBuilder() {
      return shannon_ == null ? com.spotify.Keyexchange.CryptoShannonChallenge.getDefaultInstance() : shannon_;
    }

    public static final int RC4_SHA1_HMAC_FIELD_NUMBER = 20;
    private com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge rc4Sha1Hmac_;
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
     * @return Whether the rc4Sha1Hmac field is set.
     */
    public boolean hasRc4Sha1Hmac() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
     * @return The rc4Sha1Hmac.
     */
    public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge getRc4Sha1Hmac() {
      return rc4Sha1Hmac_ == null ? com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.getDefaultInstance() : rc4Sha1Hmac_;
    }
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
     */
    public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallengeOrBuilder getRc4Sha1HmacOrBuilder() {
      return rc4Sha1Hmac_ == null ? com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.getDefaultInstance() : rc4Sha1Hmac_;
    }

    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 (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getShannon());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(20, getRc4Sha1Hmac());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getShannon());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(20, getRc4Sha1Hmac());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.CryptoChallengeUnion)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.CryptoChallengeUnion other = (com.spotify.Keyexchange.CryptoChallengeUnion) obj;

      if (hasShannon() != other.hasShannon()) return false;
      if (hasShannon()) {
        if (!getShannon()
            .equals(other.getShannon())) return false;
      }
      if (hasRc4Sha1Hmac() != other.hasRc4Sha1Hmac()) return false;
      if (hasRc4Sha1Hmac()) {
        if (!getRc4Sha1Hmac()
            .equals(other.getRc4Sha1Hmac())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasShannon()) {
        hash = (37 * hash) + SHANNON_FIELD_NUMBER;
        hash = (53 * hash) + getShannon().hashCode();
      }
      if (hasRc4Sha1Hmac()) {
        hash = (37 * hash) + RC4_SHA1_HMAC_FIELD_NUMBER;
        hash = (53 * hash) + getRc4Sha1Hmac().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoChallengeUnion parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.CryptoChallengeUnion 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.CryptoChallengeUnion}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.CryptoChallengeUnion)
        com.spotify.Keyexchange.CryptoChallengeUnionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoChallengeUnion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoChallengeUnion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.CryptoChallengeUnion.class, com.spotify.Keyexchange.CryptoChallengeUnion.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.CryptoChallengeUnion.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getShannonFieldBuilder();
          getRc4Sha1HmacFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (shannonBuilder_ == null) {
          shannon_ = null;
        } else {
          shannonBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        if (rc4Sha1HmacBuilder_ == null) {
          rc4Sha1Hmac_ = null;
        } else {
          rc4Sha1HmacBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoChallengeUnion_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoChallengeUnion getDefaultInstanceForType() {
        return com.spotify.Keyexchange.CryptoChallengeUnion.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoChallengeUnion build() {
        com.spotify.Keyexchange.CryptoChallengeUnion result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoChallengeUnion buildPartial() {
        com.spotify.Keyexchange.CryptoChallengeUnion result = new com.spotify.Keyexchange.CryptoChallengeUnion(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (shannonBuilder_ == null) {
            result.shannon_ = shannon_;
          } else {
            result.shannon_ = shannonBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          if (rc4Sha1HmacBuilder_ == null) {
            result.rc4Sha1Hmac_ = rc4Sha1Hmac_;
          } else {
            result.rc4Sha1Hmac_ = rc4Sha1HmacBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.CryptoChallengeUnion) {
          return mergeFrom((com.spotify.Keyexchange.CryptoChallengeUnion)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.CryptoChallengeUnion other) {
        if (other == com.spotify.Keyexchange.CryptoChallengeUnion.getDefaultInstance()) return this;
        if (other.hasShannon()) {
          mergeShannon(other.getShannon());
        }
        if (other.hasRc4Sha1Hmac()) {
          mergeRc4Sha1Hmac(other.getRc4Sha1Hmac());
        }
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.CryptoChallengeUnion parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.CryptoChallengeUnion) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.CryptoShannonChallenge shannon_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoShannonChallenge, com.spotify.Keyexchange.CryptoShannonChallenge.Builder, com.spotify.Keyexchange.CryptoShannonChallengeOrBuilder> shannonBuilder_;
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       * @return Whether the shannon field is set.
       */
      public boolean hasShannon() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       * @return The shannon.
       */
      public com.spotify.Keyexchange.CryptoShannonChallenge getShannon() {
        if (shannonBuilder_ == null) {
          return shannon_ == null ? com.spotify.Keyexchange.CryptoShannonChallenge.getDefaultInstance() : shannon_;
        } else {
          return shannonBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       */
      public Builder setShannon(com.spotify.Keyexchange.CryptoShannonChallenge value) {
        if (shannonBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          shannon_ = value;
          onChanged();
        } else {
          shannonBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       */
      public Builder setShannon(
          com.spotify.Keyexchange.CryptoShannonChallenge.Builder builderForValue) {
        if (shannonBuilder_ == null) {
          shannon_ = builderForValue.build();
          onChanged();
        } else {
          shannonBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       */
      public Builder mergeShannon(com.spotify.Keyexchange.CryptoShannonChallenge value) {
        if (shannonBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              shannon_ != null &&
              shannon_ != com.spotify.Keyexchange.CryptoShannonChallenge.getDefaultInstance()) {
            shannon_ =
              com.spotify.Keyexchange.CryptoShannonChallenge.newBuilder(shannon_).mergeFrom(value).buildPartial();
          } else {
            shannon_ = value;
          }
          onChanged();
        } else {
          shannonBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       */
      public Builder clearShannon() {
        if (shannonBuilder_ == null) {
          shannon_ = null;
          onChanged();
        } else {
          shannonBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       */
      public com.spotify.Keyexchange.CryptoShannonChallenge.Builder getShannonBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getShannonFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       */
      public com.spotify.Keyexchange.CryptoShannonChallengeOrBuilder getShannonOrBuilder() {
        if (shannonBuilder_ != null) {
          return shannonBuilder_.getMessageOrBuilder();
        } else {
          return shannon_ == null ?
              com.spotify.Keyexchange.CryptoShannonChallenge.getDefaultInstance() : shannon_;
        }
      }
      /**
       * <code>optional .spotify.CryptoShannonChallenge shannon = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoShannonChallenge, com.spotify.Keyexchange.CryptoShannonChallenge.Builder, com.spotify.Keyexchange.CryptoShannonChallengeOrBuilder> 
          getShannonFieldBuilder() {
        if (shannonBuilder_ == null) {
          shannonBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.CryptoShannonChallenge, com.spotify.Keyexchange.CryptoShannonChallenge.Builder, com.spotify.Keyexchange.CryptoShannonChallengeOrBuilder>(
                  getShannon(),
                  getParentForChildren(),
                  isClean());
          shannon_ = null;
        }
        return shannonBuilder_;
      }

      private com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge rc4Sha1Hmac_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge, com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.Builder, com.spotify.Keyexchange.CryptoRc4Sha1HmacChallengeOrBuilder> rc4Sha1HmacBuilder_;
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       * @return Whether the rc4Sha1Hmac field is set.
       */
      public boolean hasRc4Sha1Hmac() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       * @return The rc4Sha1Hmac.
       */
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge getRc4Sha1Hmac() {
        if (rc4Sha1HmacBuilder_ == null) {
          return rc4Sha1Hmac_ == null ? com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.getDefaultInstance() : rc4Sha1Hmac_;
        } else {
          return rc4Sha1HmacBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       */
      public Builder setRc4Sha1Hmac(com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge value) {
        if (rc4Sha1HmacBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          rc4Sha1Hmac_ = value;
          onChanged();
        } else {
          rc4Sha1HmacBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       */
      public Builder setRc4Sha1Hmac(
          com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.Builder builderForValue) {
        if (rc4Sha1HmacBuilder_ == null) {
          rc4Sha1Hmac_ = builderForValue.build();
          onChanged();
        } else {
          rc4Sha1HmacBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       */
      public Builder mergeRc4Sha1Hmac(com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge value) {
        if (rc4Sha1HmacBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
              rc4Sha1Hmac_ != null &&
              rc4Sha1Hmac_ != com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.getDefaultInstance()) {
            rc4Sha1Hmac_ =
              com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.newBuilder(rc4Sha1Hmac_).mergeFrom(value).buildPartial();
          } else {
            rc4Sha1Hmac_ = value;
          }
          onChanged();
        } else {
          rc4Sha1HmacBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       */
      public Builder clearRc4Sha1Hmac() {
        if (rc4Sha1HmacBuilder_ == null) {
          rc4Sha1Hmac_ = null;
          onChanged();
        } else {
          rc4Sha1HmacBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       */
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.Builder getRc4Sha1HmacBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getRc4Sha1HmacFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       */
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallengeOrBuilder getRc4Sha1HmacOrBuilder() {
        if (rc4Sha1HmacBuilder_ != null) {
          return rc4Sha1HmacBuilder_.getMessageOrBuilder();
        } else {
          return rc4Sha1Hmac_ == null ?
              com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.getDefaultInstance() : rc4Sha1Hmac_;
        }
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 20;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge, com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.Builder, com.spotify.Keyexchange.CryptoRc4Sha1HmacChallengeOrBuilder> 
          getRc4Sha1HmacFieldBuilder() {
        if (rc4Sha1HmacBuilder_ == null) {
          rc4Sha1HmacBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge, com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.Builder, com.spotify.Keyexchange.CryptoRc4Sha1HmacChallengeOrBuilder>(
                  getRc4Sha1Hmac(),
                  getParentForChildren(),
                  isClean());
          rc4Sha1Hmac_ = null;
        }
        return rc4Sha1HmacBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.CryptoChallengeUnion)
    }

    // @@protoc_insertion_point(class_scope:spotify.CryptoChallengeUnion)
    private static final com.spotify.Keyexchange.CryptoChallengeUnion DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.CryptoChallengeUnion();
    }

    public static com.spotify.Keyexchange.CryptoChallengeUnion getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<CryptoChallengeUnion>
        PARSER = new com.google.protobuf.AbstractParser<CryptoChallengeUnion>() {
      @java.lang.Override
      public CryptoChallengeUnion parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new CryptoChallengeUnion(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.CryptoChallengeUnion getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface CryptoShannonChallengeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.CryptoShannonChallenge)
      com.google.protobuf.MessageOrBuilder {
  }
  /**
   * Protobuf type {@code spotify.CryptoShannonChallenge}
   */
  public  static final class CryptoShannonChallenge extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.CryptoShannonChallenge)
      CryptoShannonChallengeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use CryptoShannonChallenge.newBuilder() to construct.
    private CryptoShannonChallenge(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private CryptoShannonChallenge() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new CryptoShannonChallenge();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private CryptoShannonChallenge(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonChallenge_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonChallenge_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.CryptoShannonChallenge.class, com.spotify.Keyexchange.CryptoShannonChallenge.Builder.class);
    }

    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 {
      unknownFields.writeTo(output);
    }

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

      size = 0;
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.CryptoShannonChallenge)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.CryptoShannonChallenge other = (com.spotify.Keyexchange.CryptoShannonChallenge) obj;

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

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

    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoShannonChallenge parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.CryptoShannonChallenge 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.CryptoShannonChallenge}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.CryptoShannonChallenge)
        com.spotify.Keyexchange.CryptoShannonChallengeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonChallenge_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonChallenge_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.CryptoShannonChallenge.class, com.spotify.Keyexchange.CryptoShannonChallenge.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.CryptoShannonChallenge.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonChallenge_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoShannonChallenge getDefaultInstanceForType() {
        return com.spotify.Keyexchange.CryptoShannonChallenge.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoShannonChallenge build() {
        com.spotify.Keyexchange.CryptoShannonChallenge result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoShannonChallenge buildPartial() {
        com.spotify.Keyexchange.CryptoShannonChallenge result = new com.spotify.Keyexchange.CryptoShannonChallenge(this);
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.CryptoShannonChallenge) {
          return mergeFrom((com.spotify.Keyexchange.CryptoShannonChallenge)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.CryptoShannonChallenge other) {
        if (other == com.spotify.Keyexchange.CryptoShannonChallenge.getDefaultInstance()) return this;
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.CryptoShannonChallenge parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.CryptoShannonChallenge) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.CryptoShannonChallenge)
    }

    // @@protoc_insertion_point(class_scope:spotify.CryptoShannonChallenge)
    private static final com.spotify.Keyexchange.CryptoShannonChallenge DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.CryptoShannonChallenge();
    }

    public static com.spotify.Keyexchange.CryptoShannonChallenge getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<CryptoShannonChallenge>
        PARSER = new com.google.protobuf.AbstractParser<CryptoShannonChallenge>() {
      @java.lang.Override
      public CryptoShannonChallenge parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new CryptoShannonChallenge(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.CryptoShannonChallenge getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface CryptoRc4Sha1HmacChallengeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.CryptoRc4Sha1HmacChallenge)
      com.google.protobuf.MessageOrBuilder {
  }
  /**
   * Protobuf type {@code spotify.CryptoRc4Sha1HmacChallenge}
   */
  public  static final class CryptoRc4Sha1HmacChallenge extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.CryptoRc4Sha1HmacChallenge)
      CryptoRc4Sha1HmacChallengeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use CryptoRc4Sha1HmacChallenge.newBuilder() to construct.
    private CryptoRc4Sha1HmacChallenge(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private CryptoRc4Sha1HmacChallenge() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new CryptoRc4Sha1HmacChallenge();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private CryptoRc4Sha1HmacChallenge(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacChallenge_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacChallenge_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.class, com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.Builder.class);
    }

    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 {
      unknownFields.writeTo(output);
    }

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

      size = 0;
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge other = (com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge) obj;

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

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

    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.CryptoRc4Sha1HmacChallenge}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.CryptoRc4Sha1HmacChallenge)
        com.spotify.Keyexchange.CryptoRc4Sha1HmacChallengeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacChallenge_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacChallenge_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.class, com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacChallenge_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge getDefaultInstanceForType() {
        return com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge build() {
        com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge buildPartial() {
        com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge result = new com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge(this);
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge) {
          return mergeFrom((com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge other) {
        if (other == com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge.getDefaultInstance()) return this;
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.CryptoRc4Sha1HmacChallenge)
    }

    // @@protoc_insertion_point(class_scope:spotify.CryptoRc4Sha1HmacChallenge)
    private static final com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge();
    }

    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<CryptoRc4Sha1HmacChallenge>
        PARSER = new com.google.protobuf.AbstractParser<CryptoRc4Sha1HmacChallenge>() {
      @java.lang.Override
      public CryptoRc4Sha1HmacChallenge parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new CryptoRc4Sha1HmacChallenge(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.CryptoRc4Sha1HmacChallenge getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface UpgradeRequiredMessageOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.UpgradeRequiredMessage)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required bytes upgrade_signed_part = 10;</code>
     * @return Whether the upgradeSignedPart field is set.
     */
    boolean hasUpgradeSignedPart();
    /**
     * <code>required bytes upgrade_signed_part = 10;</code>
     * @return The upgradeSignedPart.
     */
    com.google.protobuf.ByteString getUpgradeSignedPart();

    /**
     * <code>required bytes signature = 20;</code>
     * @return Whether the signature field is set.
     */
    boolean hasSignature();
    /**
     * <code>required bytes signature = 20;</code>
     * @return The signature.
     */
    com.google.protobuf.ByteString getSignature();

    /**
     * <code>optional string http_suffix = 30;</code>
     * @return Whether the httpSuffix field is set.
     */
    boolean hasHttpSuffix();
    /**
     * <code>optional string http_suffix = 30;</code>
     * @return The httpSuffix.
     */
    java.lang.String getHttpSuffix();
    /**
     * <code>optional string http_suffix = 30;</code>
     * @return The bytes for httpSuffix.
     */
    com.google.protobuf.ByteString
        getHttpSuffixBytes();
  }
  /**
   * Protobuf type {@code spotify.UpgradeRequiredMessage}
   */
  public  static final class UpgradeRequiredMessage extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.UpgradeRequiredMessage)
      UpgradeRequiredMessageOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use UpgradeRequiredMessage.newBuilder() to construct.
    private UpgradeRequiredMessage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private UpgradeRequiredMessage() {
      upgradeSignedPart_ = com.google.protobuf.ByteString.EMPTY;
      signature_ = com.google.protobuf.ByteString.EMPTY;
      httpSuffix_ = "";
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new UpgradeRequiredMessage();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private UpgradeRequiredMessage(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              bitField0_ |= 0x00000001;
              upgradeSignedPart_ = input.readBytes();
              break;
            }
            case 162: {
              bitField0_ |= 0x00000002;
              signature_ = input.readBytes();
              break;
            }
            case 242: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000004;
              httpSuffix_ = bs;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_UpgradeRequiredMessage_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_UpgradeRequiredMessage_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.UpgradeRequiredMessage.class, com.spotify.Keyexchange.UpgradeRequiredMessage.Builder.class);
    }

    private int bitField0_;
    public static final int UPGRADE_SIGNED_PART_FIELD_NUMBER = 10;
    private com.google.protobuf.ByteString upgradeSignedPart_;
    /**
     * <code>required bytes upgrade_signed_part = 10;</code>
     * @return Whether the upgradeSignedPart field is set.
     */
    public boolean hasUpgradeSignedPart() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required bytes upgrade_signed_part = 10;</code>
     * @return The upgradeSignedPart.
     */
    public com.google.protobuf.ByteString getUpgradeSignedPart() {
      return upgradeSignedPart_;
    }

    public static final int SIGNATURE_FIELD_NUMBER = 20;
    private com.google.protobuf.ByteString signature_;
    /**
     * <code>required bytes signature = 20;</code>
     * @return Whether the signature field is set.
     */
    public boolean hasSignature() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required bytes signature = 20;</code>
     * @return The signature.
     */
    public com.google.protobuf.ByteString getSignature() {
      return signature_;
    }

    public static final int HTTP_SUFFIX_FIELD_NUMBER = 30;
    private volatile java.lang.Object httpSuffix_;
    /**
     * <code>optional string http_suffix = 30;</code>
     * @return Whether the httpSuffix field is set.
     */
    public boolean hasHttpSuffix() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>optional string http_suffix = 30;</code>
     * @return The httpSuffix.
     */
    public java.lang.String getHttpSuffix() {
      java.lang.Object ref = httpSuffix_;
      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();
        if (bs.isValidUtf8()) {
          httpSuffix_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string http_suffix = 30;</code>
     * @return The bytes for httpSuffix.
     */
    public com.google.protobuf.ByteString
        getHttpSuffixBytes() {
      java.lang.Object ref = httpSuffix_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        httpSuffix_ = 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;

      if (!hasUpgradeSignedPart()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasSignature()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeBytes(10, upgradeSignedPart_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeBytes(20, signature_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 30, httpSuffix_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, upgradeSignedPart_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(20, signature_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(30, httpSuffix_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.UpgradeRequiredMessage)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.UpgradeRequiredMessage other = (com.spotify.Keyexchange.UpgradeRequiredMessage) obj;

      if (hasUpgradeSignedPart() != other.hasUpgradeSignedPart()) return false;
      if (hasUpgradeSignedPart()) {
        if (!getUpgradeSignedPart()
            .equals(other.getUpgradeSignedPart())) return false;
      }
      if (hasSignature() != other.hasSignature()) return false;
      if (hasSignature()) {
        if (!getSignature()
            .equals(other.getSignature())) return false;
      }
      if (hasHttpSuffix() != other.hasHttpSuffix()) return false;
      if (hasHttpSuffix()) {
        if (!getHttpSuffix()
            .equals(other.getHttpSuffix())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasUpgradeSignedPart()) {
        hash = (37 * hash) + UPGRADE_SIGNED_PART_FIELD_NUMBER;
        hash = (53 * hash) + getUpgradeSignedPart().hashCode();
      }
      if (hasSignature()) {
        hash = (37 * hash) + SIGNATURE_FIELD_NUMBER;
        hash = (53 * hash) + getSignature().hashCode();
      }
      if (hasHttpSuffix()) {
        hash = (37 * hash) + HTTP_SUFFIX_FIELD_NUMBER;
        hash = (53 * hash) + getHttpSuffix().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.UpgradeRequiredMessage parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.UpgradeRequiredMessage 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.UpgradeRequiredMessage}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.UpgradeRequiredMessage)
        com.spotify.Keyexchange.UpgradeRequiredMessageOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_UpgradeRequiredMessage_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_UpgradeRequiredMessage_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.UpgradeRequiredMessage.class, com.spotify.Keyexchange.UpgradeRequiredMessage.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.UpgradeRequiredMessage.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        upgradeSignedPart_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        signature_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        httpSuffix_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_UpgradeRequiredMessage_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.UpgradeRequiredMessage getDefaultInstanceForType() {
        return com.spotify.Keyexchange.UpgradeRequiredMessage.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.UpgradeRequiredMessage build() {
        com.spotify.Keyexchange.UpgradeRequiredMessage result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.UpgradeRequiredMessage buildPartial() {
        com.spotify.Keyexchange.UpgradeRequiredMessage result = new com.spotify.Keyexchange.UpgradeRequiredMessage(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.upgradeSignedPart_ = upgradeSignedPart_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.signature_ = signature_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.httpSuffix_ = httpSuffix_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.UpgradeRequiredMessage) {
          return mergeFrom((com.spotify.Keyexchange.UpgradeRequiredMessage)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.UpgradeRequiredMessage other) {
        if (other == com.spotify.Keyexchange.UpgradeRequiredMessage.getDefaultInstance()) return this;
        if (other.hasUpgradeSignedPart()) {
          setUpgradeSignedPart(other.getUpgradeSignedPart());
        }
        if (other.hasSignature()) {
          setSignature(other.getSignature());
        }
        if (other.hasHttpSuffix()) {
          bitField0_ |= 0x00000004;
          httpSuffix_ = other.httpSuffix_;
          onChanged();
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasUpgradeSignedPart()) {
          return false;
        }
        if (!hasSignature()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.UpgradeRequiredMessage parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.UpgradeRequiredMessage) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.ByteString upgradeSignedPart_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes upgrade_signed_part = 10;</code>
       * @return Whether the upgradeSignedPart field is set.
       */
      public boolean hasUpgradeSignedPart() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required bytes upgrade_signed_part = 10;</code>
       * @return The upgradeSignedPart.
       */
      public com.google.protobuf.ByteString getUpgradeSignedPart() {
        return upgradeSignedPart_;
      }
      /**
       * <code>required bytes upgrade_signed_part = 10;</code>
       * @param value The upgradeSignedPart to set.
       * @return This builder for chaining.
       */
      public Builder setUpgradeSignedPart(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        upgradeSignedPart_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes upgrade_signed_part = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearUpgradeSignedPart() {
        bitField0_ = (bitField0_ & ~0x00000001);
        upgradeSignedPart_ = getDefaultInstance().getUpgradeSignedPart();
        onChanged();
        return this;
      }

      private com.google.protobuf.ByteString signature_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes signature = 20;</code>
       * @return Whether the signature field is set.
       */
      public boolean hasSignature() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required bytes signature = 20;</code>
       * @return The signature.
       */
      public com.google.protobuf.ByteString getSignature() {
        return signature_;
      }
      /**
       * <code>required bytes signature = 20;</code>
       * @param value The signature to set.
       * @return This builder for chaining.
       */
      public Builder setSignature(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        signature_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes signature = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearSignature() {
        bitField0_ = (bitField0_ & ~0x00000002);
        signature_ = getDefaultInstance().getSignature();
        onChanged();
        return this;
      }

      private java.lang.Object httpSuffix_ = "";
      /**
       * <code>optional string http_suffix = 30;</code>
       * @return Whether the httpSuffix field is set.
       */
      public boolean hasHttpSuffix() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>optional string http_suffix = 30;</code>
       * @return The httpSuffix.
       */
      public java.lang.String getHttpSuffix() {
        java.lang.Object ref = httpSuffix_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            httpSuffix_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string http_suffix = 30;</code>
       * @return The bytes for httpSuffix.
       */
      public com.google.protobuf.ByteString
          getHttpSuffixBytes() {
        java.lang.Object ref = httpSuffix_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          httpSuffix_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string http_suffix = 30;</code>
       * @param value The httpSuffix to set.
       * @return This builder for chaining.
       */
      public Builder setHttpSuffix(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        httpSuffix_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string http_suffix = 30;</code>
       * @return This builder for chaining.
       */
      public Builder clearHttpSuffix() {
        bitField0_ = (bitField0_ & ~0x00000004);
        httpSuffix_ = getDefaultInstance().getHttpSuffix();
        onChanged();
        return this;
      }
      /**
       * <code>optional string http_suffix = 30;</code>
       * @param value The bytes for httpSuffix to set.
       * @return This builder for chaining.
       */
      public Builder setHttpSuffixBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        httpSuffix_ = value;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.UpgradeRequiredMessage)
    }

    // @@protoc_insertion_point(class_scope:spotify.UpgradeRequiredMessage)
    private static final com.spotify.Keyexchange.UpgradeRequiredMessage DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.UpgradeRequiredMessage();
    }

    public static com.spotify.Keyexchange.UpgradeRequiredMessage getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<UpgradeRequiredMessage>
        PARSER = new com.google.protobuf.AbstractParser<UpgradeRequiredMessage>() {
      @java.lang.Override
      public UpgradeRequiredMessage parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new UpgradeRequiredMessage(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.UpgradeRequiredMessage getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface APLoginFailedOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.APLoginFailed)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required .spotify.ErrorCode error_code = 10;</code>
     * @return Whether the errorCode field is set.
     */
    boolean hasErrorCode();
    /**
     * <code>required .spotify.ErrorCode error_code = 10;</code>
     * @return The errorCode.
     */
    com.spotify.Keyexchange.ErrorCode getErrorCode();

    /**
     * <code>optional int32 retry_delay = 20;</code>
     * @return Whether the retryDelay field is set.
     */
    boolean hasRetryDelay();
    /**
     * <code>optional int32 retry_delay = 20;</code>
     * @return The retryDelay.
     */
    int getRetryDelay();

    /**
     * <code>optional int32 expiry = 30;</code>
     * @return Whether the expiry field is set.
     */
    boolean hasExpiry();
    /**
     * <code>optional int32 expiry = 30;</code>
     * @return The expiry.
     */
    int getExpiry();

    /**
     * <code>optional string error_description = 40;</code>
     * @return Whether the errorDescription field is set.
     */
    boolean hasErrorDescription();
    /**
     * <code>optional string error_description = 40;</code>
     * @return The errorDescription.
     */
    java.lang.String getErrorDescription();
    /**
     * <code>optional string error_description = 40;</code>
     * @return The bytes for errorDescription.
     */
    com.google.protobuf.ByteString
        getErrorDescriptionBytes();
  }
  /**
   * Protobuf type {@code spotify.APLoginFailed}
   */
  public  static final class APLoginFailed extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.APLoginFailed)
      APLoginFailedOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use APLoginFailed.newBuilder() to construct.
    private APLoginFailed(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private APLoginFailed() {
      errorCode_ = 0;
      errorDescription_ = "";
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new APLoginFailed();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private APLoginFailed(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 80: {
              int rawValue = input.readEnum();
                @SuppressWarnings("deprecation")
              com.spotify.Keyexchange.ErrorCode value = com.spotify.Keyexchange.ErrorCode.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(10, rawValue);
              } else {
                bitField0_ |= 0x00000001;
                errorCode_ = rawValue;
              }
              break;
            }
            case 160: {
              bitField0_ |= 0x00000002;
              retryDelay_ = input.readInt32();
              break;
            }
            case 240: {
              bitField0_ |= 0x00000004;
              expiry_ = input.readInt32();
              break;
            }
            case 322: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000008;
              errorDescription_ = bs;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_APLoginFailed_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_APLoginFailed_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.APLoginFailed.class, com.spotify.Keyexchange.APLoginFailed.Builder.class);
    }

    private int bitField0_;
    public static final int ERROR_CODE_FIELD_NUMBER = 10;
    private int errorCode_;
    /**
     * <code>required .spotify.ErrorCode error_code = 10;</code>
     * @return Whether the errorCode field is set.
     */
    public boolean hasErrorCode() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required .spotify.ErrorCode error_code = 10;</code>
     * @return The errorCode.
     */
    public com.spotify.Keyexchange.ErrorCode getErrorCode() {
      @SuppressWarnings("deprecation")
      com.spotify.Keyexchange.ErrorCode result = com.spotify.Keyexchange.ErrorCode.valueOf(errorCode_);
      return result == null ? com.spotify.Keyexchange.ErrorCode.ProtocolError : result;
    }

    public static final int RETRY_DELAY_FIELD_NUMBER = 20;
    private int retryDelay_;
    /**
     * <code>optional int32 retry_delay = 20;</code>
     * @return Whether the retryDelay field is set.
     */
    public boolean hasRetryDelay() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional int32 retry_delay = 20;</code>
     * @return The retryDelay.
     */
    public int getRetryDelay() {
      return retryDelay_;
    }

    public static final int EXPIRY_FIELD_NUMBER = 30;
    private int expiry_;
    /**
     * <code>optional int32 expiry = 30;</code>
     * @return Whether the expiry field is set.
     */
    public boolean hasExpiry() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>optional int32 expiry = 30;</code>
     * @return The expiry.
     */
    public int getExpiry() {
      return expiry_;
    }

    public static final int ERROR_DESCRIPTION_FIELD_NUMBER = 40;
    private volatile java.lang.Object errorDescription_;
    /**
     * <code>optional string error_description = 40;</code>
     * @return Whether the errorDescription field is set.
     */
    public boolean hasErrorDescription() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>optional string error_description = 40;</code>
     * @return The errorDescription.
     */
    public java.lang.String getErrorDescription() {
      java.lang.Object ref = errorDescription_;
      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();
        if (bs.isValidUtf8()) {
          errorDescription_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string error_description = 40;</code>
     * @return The bytes for errorDescription.
     */
    public com.google.protobuf.ByteString
        getErrorDescriptionBytes() {
      java.lang.Object ref = errorDescription_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        errorDescription_ = 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;

      if (!hasErrorCode()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeEnum(10, errorCode_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeInt32(20, retryDelay_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeInt32(30, expiry_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 40, errorDescription_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(10, errorCode_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(20, retryDelay_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(30, expiry_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(40, errorDescription_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.APLoginFailed)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.APLoginFailed other = (com.spotify.Keyexchange.APLoginFailed) obj;

      if (hasErrorCode() != other.hasErrorCode()) return false;
      if (hasErrorCode()) {
        if (errorCode_ != other.errorCode_) return false;
      }
      if (hasRetryDelay() != other.hasRetryDelay()) return false;
      if (hasRetryDelay()) {
        if (getRetryDelay()
            != other.getRetryDelay()) return false;
      }
      if (hasExpiry() != other.hasExpiry()) return false;
      if (hasExpiry()) {
        if (getExpiry()
            != other.getExpiry()) return false;
      }
      if (hasErrorDescription() != other.hasErrorDescription()) return false;
      if (hasErrorDescription()) {
        if (!getErrorDescription()
            .equals(other.getErrorDescription())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasErrorCode()) {
        hash = (37 * hash) + ERROR_CODE_FIELD_NUMBER;
        hash = (53 * hash) + errorCode_;
      }
      if (hasRetryDelay()) {
        hash = (37 * hash) + RETRY_DELAY_FIELD_NUMBER;
        hash = (53 * hash) + getRetryDelay();
      }
      if (hasExpiry()) {
        hash = (37 * hash) + EXPIRY_FIELD_NUMBER;
        hash = (53 * hash) + getExpiry();
      }
      if (hasErrorDescription()) {
        hash = (37 * hash) + ERROR_DESCRIPTION_FIELD_NUMBER;
        hash = (53 * hash) + getErrorDescription().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.APLoginFailed parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.APLoginFailed parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.APLoginFailed 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.APLoginFailed}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.APLoginFailed)
        com.spotify.Keyexchange.APLoginFailedOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_APLoginFailed_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_APLoginFailed_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.APLoginFailed.class, com.spotify.Keyexchange.APLoginFailed.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.APLoginFailed.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        errorCode_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        retryDelay_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        expiry_ = 0;
        bitField0_ = (bitField0_ & ~0x00000004);
        errorDescription_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_APLoginFailed_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APLoginFailed getDefaultInstanceForType() {
        return com.spotify.Keyexchange.APLoginFailed.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APLoginFailed build() {
        com.spotify.Keyexchange.APLoginFailed result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.APLoginFailed buildPartial() {
        com.spotify.Keyexchange.APLoginFailed result = new com.spotify.Keyexchange.APLoginFailed(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.errorCode_ = errorCode_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.retryDelay_ = retryDelay_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.expiry_ = expiry_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.errorDescription_ = errorDescription_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.APLoginFailed) {
          return mergeFrom((com.spotify.Keyexchange.APLoginFailed)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.APLoginFailed other) {
        if (other == com.spotify.Keyexchange.APLoginFailed.getDefaultInstance()) return this;
        if (other.hasErrorCode()) {
          setErrorCode(other.getErrorCode());
        }
        if (other.hasRetryDelay()) {
          setRetryDelay(other.getRetryDelay());
        }
        if (other.hasExpiry()) {
          setExpiry(other.getExpiry());
        }
        if (other.hasErrorDescription()) {
          bitField0_ |= 0x00000008;
          errorDescription_ = other.errorDescription_;
          onChanged();
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

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

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.APLoginFailed parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.APLoginFailed) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private int errorCode_ = 0;
      /**
       * <code>required .spotify.ErrorCode error_code = 10;</code>
       * @return Whether the errorCode field is set.
       */
      public boolean hasErrorCode() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required .spotify.ErrorCode error_code = 10;</code>
       * @return The errorCode.
       */
      public com.spotify.Keyexchange.ErrorCode getErrorCode() {
        @SuppressWarnings("deprecation")
        com.spotify.Keyexchange.ErrorCode result = com.spotify.Keyexchange.ErrorCode.valueOf(errorCode_);
        return result == null ? com.spotify.Keyexchange.ErrorCode.ProtocolError : result;
      }
      /**
       * <code>required .spotify.ErrorCode error_code = 10;</code>
       * @param value The errorCode to set.
       * @return This builder for chaining.
       */
      public Builder setErrorCode(com.spotify.Keyexchange.ErrorCode value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000001;
        errorCode_ = value.getNumber();
        onChanged();
        return this;
      }
      /**
       * <code>required .spotify.ErrorCode error_code = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearErrorCode() {
        bitField0_ = (bitField0_ & ~0x00000001);
        errorCode_ = 0;
        onChanged();
        return this;
      }

      private int retryDelay_ ;
      /**
       * <code>optional int32 retry_delay = 20;</code>
       * @return Whether the retryDelay field is set.
       */
      public boolean hasRetryDelay() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional int32 retry_delay = 20;</code>
       * @return The retryDelay.
       */
      public int getRetryDelay() {
        return retryDelay_;
      }
      /**
       * <code>optional int32 retry_delay = 20;</code>
       * @param value The retryDelay to set.
       * @return This builder for chaining.
       */
      public Builder setRetryDelay(int value) {
        bitField0_ |= 0x00000002;
        retryDelay_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 retry_delay = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearRetryDelay() {
        bitField0_ = (bitField0_ & ~0x00000002);
        retryDelay_ = 0;
        onChanged();
        return this;
      }

      private int expiry_ ;
      /**
       * <code>optional int32 expiry = 30;</code>
       * @return Whether the expiry field is set.
       */
      public boolean hasExpiry() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>optional int32 expiry = 30;</code>
       * @return The expiry.
       */
      public int getExpiry() {
        return expiry_;
      }
      /**
       * <code>optional int32 expiry = 30;</code>
       * @param value The expiry to set.
       * @return This builder for chaining.
       */
      public Builder setExpiry(int value) {
        bitField0_ |= 0x00000004;
        expiry_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 expiry = 30;</code>
       * @return This builder for chaining.
       */
      public Builder clearExpiry() {
        bitField0_ = (bitField0_ & ~0x00000004);
        expiry_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object errorDescription_ = "";
      /**
       * <code>optional string error_description = 40;</code>
       * @return Whether the errorDescription field is set.
       */
      public boolean hasErrorDescription() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>optional string error_description = 40;</code>
       * @return The errorDescription.
       */
      public java.lang.String getErrorDescription() {
        java.lang.Object ref = errorDescription_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            errorDescription_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string error_description = 40;</code>
       * @return The bytes for errorDescription.
       */
      public com.google.protobuf.ByteString
          getErrorDescriptionBytes() {
        java.lang.Object ref = errorDescription_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          errorDescription_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string error_description = 40;</code>
       * @param value The errorDescription to set.
       * @return This builder for chaining.
       */
      public Builder setErrorDescription(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        errorDescription_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string error_description = 40;</code>
       * @return This builder for chaining.
       */
      public Builder clearErrorDescription() {
        bitField0_ = (bitField0_ & ~0x00000008);
        errorDescription_ = getDefaultInstance().getErrorDescription();
        onChanged();
        return this;
      }
      /**
       * <code>optional string error_description = 40;</code>
       * @param value The bytes for errorDescription to set.
       * @return This builder for chaining.
       */
      public Builder setErrorDescriptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        errorDescription_ = value;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.APLoginFailed)
    }

    // @@protoc_insertion_point(class_scope:spotify.APLoginFailed)
    private static final com.spotify.Keyexchange.APLoginFailed DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.APLoginFailed();
    }

    public static com.spotify.Keyexchange.APLoginFailed getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<APLoginFailed>
        PARSER = new com.google.protobuf.AbstractParser<APLoginFailed>() {
      @java.lang.Override
      public APLoginFailed parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new APLoginFailed(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.APLoginFailed getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface ClientResponsePlaintextOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.ClientResponsePlaintext)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
     * @return Whether the loginCryptoResponse field is set.
     */
    boolean hasLoginCryptoResponse();
    /**
     * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
     * @return The loginCryptoResponse.
     */
    com.spotify.Keyexchange.LoginCryptoResponseUnion getLoginCryptoResponse();
    /**
     * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
     */
    com.spotify.Keyexchange.LoginCryptoResponseUnionOrBuilder getLoginCryptoResponseOrBuilder();

    /**
     * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
     * @return Whether the powResponse field is set.
     */
    boolean hasPowResponse();
    /**
     * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
     * @return The powResponse.
     */
    com.spotify.Keyexchange.PoWResponseUnion getPowResponse();
    /**
     * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
     */
    com.spotify.Keyexchange.PoWResponseUnionOrBuilder getPowResponseOrBuilder();

    /**
     * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
     * @return Whether the cryptoResponse field is set.
     */
    boolean hasCryptoResponse();
    /**
     * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
     * @return The cryptoResponse.
     */
    com.spotify.Keyexchange.CryptoResponseUnion getCryptoResponse();
    /**
     * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
     */
    com.spotify.Keyexchange.CryptoResponseUnionOrBuilder getCryptoResponseOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.ClientResponsePlaintext}
   */
  public  static final class ClientResponsePlaintext extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.ClientResponsePlaintext)
      ClientResponsePlaintextOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use ClientResponsePlaintext.newBuilder() to construct.
    private ClientResponsePlaintext(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private ClientResponsePlaintext() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new ClientResponsePlaintext();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private ClientResponsePlaintext(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.LoginCryptoResponseUnion.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = loginCryptoResponse_.toBuilder();
              }
              loginCryptoResponse_ = input.readMessage(com.spotify.Keyexchange.LoginCryptoResponseUnion.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(loginCryptoResponse_);
                loginCryptoResponse_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 162: {
              com.spotify.Keyexchange.PoWResponseUnion.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = powResponse_.toBuilder();
              }
              powResponse_ = input.readMessage(com.spotify.Keyexchange.PoWResponseUnion.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(powResponse_);
                powResponse_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 242: {
              com.spotify.Keyexchange.CryptoResponseUnion.Builder subBuilder = null;
              if (((bitField0_ & 0x00000004) != 0)) {
                subBuilder = cryptoResponse_.toBuilder();
              }
              cryptoResponse_ = input.readMessage(com.spotify.Keyexchange.CryptoResponseUnion.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(cryptoResponse_);
                cryptoResponse_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000004;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_ClientResponsePlaintext_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_ClientResponsePlaintext_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.ClientResponsePlaintext.class, com.spotify.Keyexchange.ClientResponsePlaintext.Builder.class);
    }

    private int bitField0_;
    public static final int LOGIN_CRYPTO_RESPONSE_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.LoginCryptoResponseUnion loginCryptoResponse_;
    /**
     * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
     * @return Whether the loginCryptoResponse field is set.
     */
    public boolean hasLoginCryptoResponse() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
     * @return The loginCryptoResponse.
     */
    public com.spotify.Keyexchange.LoginCryptoResponseUnion getLoginCryptoResponse() {
      return loginCryptoResponse_ == null ? com.spotify.Keyexchange.LoginCryptoResponseUnion.getDefaultInstance() : loginCryptoResponse_;
    }
    /**
     * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
     */
    public com.spotify.Keyexchange.LoginCryptoResponseUnionOrBuilder getLoginCryptoResponseOrBuilder() {
      return loginCryptoResponse_ == null ? com.spotify.Keyexchange.LoginCryptoResponseUnion.getDefaultInstance() : loginCryptoResponse_;
    }

    public static final int POW_RESPONSE_FIELD_NUMBER = 20;
    private com.spotify.Keyexchange.PoWResponseUnion powResponse_;
    /**
     * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
     * @return Whether the powResponse field is set.
     */
    public boolean hasPowResponse() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
     * @return The powResponse.
     */
    public com.spotify.Keyexchange.PoWResponseUnion getPowResponse() {
      return powResponse_ == null ? com.spotify.Keyexchange.PoWResponseUnion.getDefaultInstance() : powResponse_;
    }
    /**
     * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
     */
    public com.spotify.Keyexchange.PoWResponseUnionOrBuilder getPowResponseOrBuilder() {
      return powResponse_ == null ? com.spotify.Keyexchange.PoWResponseUnion.getDefaultInstance() : powResponse_;
    }

    public static final int CRYPTO_RESPONSE_FIELD_NUMBER = 30;
    private com.spotify.Keyexchange.CryptoResponseUnion cryptoResponse_;
    /**
     * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
     * @return Whether the cryptoResponse field is set.
     */
    public boolean hasCryptoResponse() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
     * @return The cryptoResponse.
     */
    public com.spotify.Keyexchange.CryptoResponseUnion getCryptoResponse() {
      return cryptoResponse_ == null ? com.spotify.Keyexchange.CryptoResponseUnion.getDefaultInstance() : cryptoResponse_;
    }
    /**
     * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
     */
    public com.spotify.Keyexchange.CryptoResponseUnionOrBuilder getCryptoResponseOrBuilder() {
      return cryptoResponse_ == null ? com.spotify.Keyexchange.CryptoResponseUnion.getDefaultInstance() : cryptoResponse_;
    }

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

      if (!hasLoginCryptoResponse()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasPowResponse()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasCryptoResponse()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!getLoginCryptoResponse().isInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!getPowResponse().isInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getLoginCryptoResponse());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(20, getPowResponse());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeMessage(30, getCryptoResponse());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getLoginCryptoResponse());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(20, getPowResponse());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(30, getCryptoResponse());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.ClientResponsePlaintext)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.ClientResponsePlaintext other = (com.spotify.Keyexchange.ClientResponsePlaintext) obj;

      if (hasLoginCryptoResponse() != other.hasLoginCryptoResponse()) return false;
      if (hasLoginCryptoResponse()) {
        if (!getLoginCryptoResponse()
            .equals(other.getLoginCryptoResponse())) return false;
      }
      if (hasPowResponse() != other.hasPowResponse()) return false;
      if (hasPowResponse()) {
        if (!getPowResponse()
            .equals(other.getPowResponse())) return false;
      }
      if (hasCryptoResponse() != other.hasCryptoResponse()) return false;
      if (hasCryptoResponse()) {
        if (!getCryptoResponse()
            .equals(other.getCryptoResponse())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasLoginCryptoResponse()) {
        hash = (37 * hash) + LOGIN_CRYPTO_RESPONSE_FIELD_NUMBER;
        hash = (53 * hash) + getLoginCryptoResponse().hashCode();
      }
      if (hasPowResponse()) {
        hash = (37 * hash) + POW_RESPONSE_FIELD_NUMBER;
        hash = (53 * hash) + getPowResponse().hashCode();
      }
      if (hasCryptoResponse()) {
        hash = (37 * hash) + CRYPTO_RESPONSE_FIELD_NUMBER;
        hash = (53 * hash) + getCryptoResponse().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.ClientResponsePlaintext parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.ClientResponsePlaintext 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.ClientResponsePlaintext}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.ClientResponsePlaintext)
        com.spotify.Keyexchange.ClientResponsePlaintextOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_ClientResponsePlaintext_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_ClientResponsePlaintext_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.ClientResponsePlaintext.class, com.spotify.Keyexchange.ClientResponsePlaintext.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.ClientResponsePlaintext.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getLoginCryptoResponseFieldBuilder();
          getPowResponseFieldBuilder();
          getCryptoResponseFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (loginCryptoResponseBuilder_ == null) {
          loginCryptoResponse_ = null;
        } else {
          loginCryptoResponseBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        if (powResponseBuilder_ == null) {
          powResponse_ = null;
        } else {
          powResponseBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        if (cryptoResponseBuilder_ == null) {
          cryptoResponse_ = null;
        } else {
          cryptoResponseBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_ClientResponsePlaintext_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.ClientResponsePlaintext getDefaultInstanceForType() {
        return com.spotify.Keyexchange.ClientResponsePlaintext.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.ClientResponsePlaintext build() {
        com.spotify.Keyexchange.ClientResponsePlaintext result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.ClientResponsePlaintext buildPartial() {
        com.spotify.Keyexchange.ClientResponsePlaintext result = new com.spotify.Keyexchange.ClientResponsePlaintext(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (loginCryptoResponseBuilder_ == null) {
            result.loginCryptoResponse_ = loginCryptoResponse_;
          } else {
            result.loginCryptoResponse_ = loginCryptoResponseBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          if (powResponseBuilder_ == null) {
            result.powResponse_ = powResponse_;
          } else {
            result.powResponse_ = powResponseBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          if (cryptoResponseBuilder_ == null) {
            result.cryptoResponse_ = cryptoResponse_;
          } else {
            result.cryptoResponse_ = cryptoResponseBuilder_.build();
          }
          to_bitField0_ |= 0x00000004;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.ClientResponsePlaintext) {
          return mergeFrom((com.spotify.Keyexchange.ClientResponsePlaintext)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.ClientResponsePlaintext other) {
        if (other == com.spotify.Keyexchange.ClientResponsePlaintext.getDefaultInstance()) return this;
        if (other.hasLoginCryptoResponse()) {
          mergeLoginCryptoResponse(other.getLoginCryptoResponse());
        }
        if (other.hasPowResponse()) {
          mergePowResponse(other.getPowResponse());
        }
        if (other.hasCryptoResponse()) {
          mergeCryptoResponse(other.getCryptoResponse());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasLoginCryptoResponse()) {
          return false;
        }
        if (!hasPowResponse()) {
          return false;
        }
        if (!hasCryptoResponse()) {
          return false;
        }
        if (!getLoginCryptoResponse().isInitialized()) {
          return false;
        }
        if (!getPowResponse().isInitialized()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.ClientResponsePlaintext parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.ClientResponsePlaintext) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.LoginCryptoResponseUnion loginCryptoResponse_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoResponseUnion, com.spotify.Keyexchange.LoginCryptoResponseUnion.Builder, com.spotify.Keyexchange.LoginCryptoResponseUnionOrBuilder> loginCryptoResponseBuilder_;
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       * @return Whether the loginCryptoResponse field is set.
       */
      public boolean hasLoginCryptoResponse() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       * @return The loginCryptoResponse.
       */
      public com.spotify.Keyexchange.LoginCryptoResponseUnion getLoginCryptoResponse() {
        if (loginCryptoResponseBuilder_ == null) {
          return loginCryptoResponse_ == null ? com.spotify.Keyexchange.LoginCryptoResponseUnion.getDefaultInstance() : loginCryptoResponse_;
        } else {
          return loginCryptoResponseBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       */
      public Builder setLoginCryptoResponse(com.spotify.Keyexchange.LoginCryptoResponseUnion value) {
        if (loginCryptoResponseBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          loginCryptoResponse_ = value;
          onChanged();
        } else {
          loginCryptoResponseBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       */
      public Builder setLoginCryptoResponse(
          com.spotify.Keyexchange.LoginCryptoResponseUnion.Builder builderForValue) {
        if (loginCryptoResponseBuilder_ == null) {
          loginCryptoResponse_ = builderForValue.build();
          onChanged();
        } else {
          loginCryptoResponseBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       */
      public Builder mergeLoginCryptoResponse(com.spotify.Keyexchange.LoginCryptoResponseUnion value) {
        if (loginCryptoResponseBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              loginCryptoResponse_ != null &&
              loginCryptoResponse_ != com.spotify.Keyexchange.LoginCryptoResponseUnion.getDefaultInstance()) {
            loginCryptoResponse_ =
              com.spotify.Keyexchange.LoginCryptoResponseUnion.newBuilder(loginCryptoResponse_).mergeFrom(value).buildPartial();
          } else {
            loginCryptoResponse_ = value;
          }
          onChanged();
        } else {
          loginCryptoResponseBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       */
      public Builder clearLoginCryptoResponse() {
        if (loginCryptoResponseBuilder_ == null) {
          loginCryptoResponse_ = null;
          onChanged();
        } else {
          loginCryptoResponseBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoResponseUnion.Builder getLoginCryptoResponseBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getLoginCryptoResponseFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoResponseUnionOrBuilder getLoginCryptoResponseOrBuilder() {
        if (loginCryptoResponseBuilder_ != null) {
          return loginCryptoResponseBuilder_.getMessageOrBuilder();
        } else {
          return loginCryptoResponse_ == null ?
              com.spotify.Keyexchange.LoginCryptoResponseUnion.getDefaultInstance() : loginCryptoResponse_;
        }
      }
      /**
       * <code>required .spotify.LoginCryptoResponseUnion login_crypto_response = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoResponseUnion, com.spotify.Keyexchange.LoginCryptoResponseUnion.Builder, com.spotify.Keyexchange.LoginCryptoResponseUnionOrBuilder> 
          getLoginCryptoResponseFieldBuilder() {
        if (loginCryptoResponseBuilder_ == null) {
          loginCryptoResponseBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.LoginCryptoResponseUnion, com.spotify.Keyexchange.LoginCryptoResponseUnion.Builder, com.spotify.Keyexchange.LoginCryptoResponseUnionOrBuilder>(
                  getLoginCryptoResponse(),
                  getParentForChildren(),
                  isClean());
          loginCryptoResponse_ = null;
        }
        return loginCryptoResponseBuilder_;
      }

      private com.spotify.Keyexchange.PoWResponseUnion powResponse_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.PoWResponseUnion, com.spotify.Keyexchange.PoWResponseUnion.Builder, com.spotify.Keyexchange.PoWResponseUnionOrBuilder> powResponseBuilder_;
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       * @return Whether the powResponse field is set.
       */
      public boolean hasPowResponse() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       * @return The powResponse.
       */
      public com.spotify.Keyexchange.PoWResponseUnion getPowResponse() {
        if (powResponseBuilder_ == null) {
          return powResponse_ == null ? com.spotify.Keyexchange.PoWResponseUnion.getDefaultInstance() : powResponse_;
        } else {
          return powResponseBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       */
      public Builder setPowResponse(com.spotify.Keyexchange.PoWResponseUnion value) {
        if (powResponseBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          powResponse_ = value;
          onChanged();
        } else {
          powResponseBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       */
      public Builder setPowResponse(
          com.spotify.Keyexchange.PoWResponseUnion.Builder builderForValue) {
        if (powResponseBuilder_ == null) {
          powResponse_ = builderForValue.build();
          onChanged();
        } else {
          powResponseBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       */
      public Builder mergePowResponse(com.spotify.Keyexchange.PoWResponseUnion value) {
        if (powResponseBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
              powResponse_ != null &&
              powResponse_ != com.spotify.Keyexchange.PoWResponseUnion.getDefaultInstance()) {
            powResponse_ =
              com.spotify.Keyexchange.PoWResponseUnion.newBuilder(powResponse_).mergeFrom(value).buildPartial();
          } else {
            powResponse_ = value;
          }
          onChanged();
        } else {
          powResponseBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       */
      public Builder clearPowResponse() {
        if (powResponseBuilder_ == null) {
          powResponse_ = null;
          onChanged();
        } else {
          powResponseBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       */
      public com.spotify.Keyexchange.PoWResponseUnion.Builder getPowResponseBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getPowResponseFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       */
      public com.spotify.Keyexchange.PoWResponseUnionOrBuilder getPowResponseOrBuilder() {
        if (powResponseBuilder_ != null) {
          return powResponseBuilder_.getMessageOrBuilder();
        } else {
          return powResponse_ == null ?
              com.spotify.Keyexchange.PoWResponseUnion.getDefaultInstance() : powResponse_;
        }
      }
      /**
       * <code>required .spotify.PoWResponseUnion pow_response = 20;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.PoWResponseUnion, com.spotify.Keyexchange.PoWResponseUnion.Builder, com.spotify.Keyexchange.PoWResponseUnionOrBuilder> 
          getPowResponseFieldBuilder() {
        if (powResponseBuilder_ == null) {
          powResponseBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.PoWResponseUnion, com.spotify.Keyexchange.PoWResponseUnion.Builder, com.spotify.Keyexchange.PoWResponseUnionOrBuilder>(
                  getPowResponse(),
                  getParentForChildren(),
                  isClean());
          powResponse_ = null;
        }
        return powResponseBuilder_;
      }

      private com.spotify.Keyexchange.CryptoResponseUnion cryptoResponse_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoResponseUnion, com.spotify.Keyexchange.CryptoResponseUnion.Builder, com.spotify.Keyexchange.CryptoResponseUnionOrBuilder> cryptoResponseBuilder_;
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       * @return Whether the cryptoResponse field is set.
       */
      public boolean hasCryptoResponse() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       * @return The cryptoResponse.
       */
      public com.spotify.Keyexchange.CryptoResponseUnion getCryptoResponse() {
        if (cryptoResponseBuilder_ == null) {
          return cryptoResponse_ == null ? com.spotify.Keyexchange.CryptoResponseUnion.getDefaultInstance() : cryptoResponse_;
        } else {
          return cryptoResponseBuilder_.getMessage();
        }
      }
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       */
      public Builder setCryptoResponse(com.spotify.Keyexchange.CryptoResponseUnion value) {
        if (cryptoResponseBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          cryptoResponse_ = value;
          onChanged();
        } else {
          cryptoResponseBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       */
      public Builder setCryptoResponse(
          com.spotify.Keyexchange.CryptoResponseUnion.Builder builderForValue) {
        if (cryptoResponseBuilder_ == null) {
          cryptoResponse_ = builderForValue.build();
          onChanged();
        } else {
          cryptoResponseBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       */
      public Builder mergeCryptoResponse(com.spotify.Keyexchange.CryptoResponseUnion value) {
        if (cryptoResponseBuilder_ == null) {
          if (((bitField0_ & 0x00000004) != 0) &&
              cryptoResponse_ != null &&
              cryptoResponse_ != com.spotify.Keyexchange.CryptoResponseUnion.getDefaultInstance()) {
            cryptoResponse_ =
              com.spotify.Keyexchange.CryptoResponseUnion.newBuilder(cryptoResponse_).mergeFrom(value).buildPartial();
          } else {
            cryptoResponse_ = value;
          }
          onChanged();
        } else {
          cryptoResponseBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       */
      public Builder clearCryptoResponse() {
        if (cryptoResponseBuilder_ == null) {
          cryptoResponse_ = null;
          onChanged();
        } else {
          cryptoResponseBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       */
      public com.spotify.Keyexchange.CryptoResponseUnion.Builder getCryptoResponseBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getCryptoResponseFieldBuilder().getBuilder();
      }
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       */
      public com.spotify.Keyexchange.CryptoResponseUnionOrBuilder getCryptoResponseOrBuilder() {
        if (cryptoResponseBuilder_ != null) {
          return cryptoResponseBuilder_.getMessageOrBuilder();
        } else {
          return cryptoResponse_ == null ?
              com.spotify.Keyexchange.CryptoResponseUnion.getDefaultInstance() : cryptoResponse_;
        }
      }
      /**
       * <code>required .spotify.CryptoResponseUnion crypto_response = 30;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoResponseUnion, com.spotify.Keyexchange.CryptoResponseUnion.Builder, com.spotify.Keyexchange.CryptoResponseUnionOrBuilder> 
          getCryptoResponseFieldBuilder() {
        if (cryptoResponseBuilder_ == null) {
          cryptoResponseBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.CryptoResponseUnion, com.spotify.Keyexchange.CryptoResponseUnion.Builder, com.spotify.Keyexchange.CryptoResponseUnionOrBuilder>(
                  getCryptoResponse(),
                  getParentForChildren(),
                  isClean());
          cryptoResponse_ = null;
        }
        return cryptoResponseBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.ClientResponsePlaintext)
    }

    // @@protoc_insertion_point(class_scope:spotify.ClientResponsePlaintext)
    private static final com.spotify.Keyexchange.ClientResponsePlaintext DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.ClientResponsePlaintext();
    }

    public static com.spotify.Keyexchange.ClientResponsePlaintext getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<ClientResponsePlaintext>
        PARSER = new com.google.protobuf.AbstractParser<ClientResponsePlaintext>() {
      @java.lang.Override
      public ClientResponsePlaintext parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ClientResponsePlaintext(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.ClientResponsePlaintext getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface LoginCryptoResponseUnionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.LoginCryptoResponseUnion)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
     * @return Whether the diffieHellman field is set.
     */
    boolean hasDiffieHellman();
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
     * @return The diffieHellman.
     */
    com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse getDiffieHellman();
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
     */
    com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponseOrBuilder getDiffieHellmanOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.LoginCryptoResponseUnion}
   */
  public  static final class LoginCryptoResponseUnion extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.LoginCryptoResponseUnion)
      LoginCryptoResponseUnionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use LoginCryptoResponseUnion.newBuilder() to construct.
    private LoginCryptoResponseUnion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private LoginCryptoResponseUnion() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new LoginCryptoResponseUnion();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private LoginCryptoResponseUnion(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = diffieHellman_.toBuilder();
              }
              diffieHellman_ = input.readMessage(com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(diffieHellman_);
                diffieHellman_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoResponseUnion_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoResponseUnion_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.LoginCryptoResponseUnion.class, com.spotify.Keyexchange.LoginCryptoResponseUnion.Builder.class);
    }

    private int bitField0_;
    public static final int DIFFIE_HELLMAN_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse diffieHellman_;
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
     * @return Whether the diffieHellman field is set.
     */
    public boolean hasDiffieHellman() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
     * @return The diffieHellman.
     */
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse getDiffieHellman() {
      return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.getDefaultInstance() : diffieHellman_;
    }
    /**
     * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
     */
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponseOrBuilder getDiffieHellmanOrBuilder() {
      return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.getDefaultInstance() : diffieHellman_;
    }

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

      if (hasDiffieHellman()) {
        if (!getDiffieHellman().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getDiffieHellman());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getDiffieHellman());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.LoginCryptoResponseUnion)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.LoginCryptoResponseUnion other = (com.spotify.Keyexchange.LoginCryptoResponseUnion) obj;

      if (hasDiffieHellman() != other.hasDiffieHellman()) return false;
      if (hasDiffieHellman()) {
        if (!getDiffieHellman()
            .equals(other.getDiffieHellman())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoResponseUnion parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.LoginCryptoResponseUnion 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.LoginCryptoResponseUnion}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.LoginCryptoResponseUnion)
        com.spotify.Keyexchange.LoginCryptoResponseUnionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoResponseUnion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoResponseUnion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.LoginCryptoResponseUnion.class, com.spotify.Keyexchange.LoginCryptoResponseUnion.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.LoginCryptoResponseUnion.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getDiffieHellmanFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = null;
        } else {
          diffieHellmanBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoResponseUnion_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoResponseUnion getDefaultInstanceForType() {
        return com.spotify.Keyexchange.LoginCryptoResponseUnion.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoResponseUnion build() {
        com.spotify.Keyexchange.LoginCryptoResponseUnion result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoResponseUnion buildPartial() {
        com.spotify.Keyexchange.LoginCryptoResponseUnion result = new com.spotify.Keyexchange.LoginCryptoResponseUnion(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (diffieHellmanBuilder_ == null) {
            result.diffieHellman_ = diffieHellman_;
          } else {
            result.diffieHellman_ = diffieHellmanBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.LoginCryptoResponseUnion) {
          return mergeFrom((com.spotify.Keyexchange.LoginCryptoResponseUnion)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.LoginCryptoResponseUnion other) {
        if (other == com.spotify.Keyexchange.LoginCryptoResponseUnion.getDefaultInstance()) return this;
        if (other.hasDiffieHellman()) {
          mergeDiffieHellman(other.getDiffieHellman());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (hasDiffieHellman()) {
          if (!getDiffieHellman().isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.LoginCryptoResponseUnion parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.LoginCryptoResponseUnion) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse diffieHellman_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse, com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponseOrBuilder> diffieHellmanBuilder_;
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       * @return Whether the diffieHellman field is set.
       */
      public boolean hasDiffieHellman() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       * @return The diffieHellman.
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse getDiffieHellman() {
        if (diffieHellmanBuilder_ == null) {
          return diffieHellman_ == null ? com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.getDefaultInstance() : diffieHellman_;
        } else {
          return diffieHellmanBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       */
      public Builder setDiffieHellman(com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse value) {
        if (diffieHellmanBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          diffieHellman_ = value;
          onChanged();
        } else {
          diffieHellmanBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       */
      public Builder setDiffieHellman(
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.Builder builderForValue) {
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = builderForValue.build();
          onChanged();
        } else {
          diffieHellmanBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       */
      public Builder mergeDiffieHellman(com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse value) {
        if (diffieHellmanBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              diffieHellman_ != null &&
              diffieHellman_ != com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.getDefaultInstance()) {
            diffieHellman_ =
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.newBuilder(diffieHellman_).mergeFrom(value).buildPartial();
          } else {
            diffieHellman_ = value;
          }
          onChanged();
        } else {
          diffieHellmanBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       */
      public Builder clearDiffieHellman() {
        if (diffieHellmanBuilder_ == null) {
          diffieHellman_ = null;
          onChanged();
        } else {
          diffieHellmanBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.Builder getDiffieHellmanBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getDiffieHellmanFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       */
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponseOrBuilder getDiffieHellmanOrBuilder() {
        if (diffieHellmanBuilder_ != null) {
          return diffieHellmanBuilder_.getMessageOrBuilder();
        } else {
          return diffieHellman_ == null ?
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.getDefaultInstance() : diffieHellman_;
        }
      }
      /**
       * <code>optional .spotify.LoginCryptoDiffieHellmanResponse diffie_hellman = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse, com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponseOrBuilder> 
          getDiffieHellmanFieldBuilder() {
        if (diffieHellmanBuilder_ == null) {
          diffieHellmanBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse, com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.Builder, com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponseOrBuilder>(
                  getDiffieHellman(),
                  getParentForChildren(),
                  isClean());
          diffieHellman_ = null;
        }
        return diffieHellmanBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.LoginCryptoResponseUnion)
    }

    // @@protoc_insertion_point(class_scope:spotify.LoginCryptoResponseUnion)
    private static final com.spotify.Keyexchange.LoginCryptoResponseUnion DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.LoginCryptoResponseUnion();
    }

    public static com.spotify.Keyexchange.LoginCryptoResponseUnion getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<LoginCryptoResponseUnion>
        PARSER = new com.google.protobuf.AbstractParser<LoginCryptoResponseUnion>() {
      @java.lang.Override
      public LoginCryptoResponseUnion parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LoginCryptoResponseUnion(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.LoginCryptoResponseUnion getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface LoginCryptoDiffieHellmanResponseOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.LoginCryptoDiffieHellmanResponse)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required bytes hmac = 10;</code>
     * @return Whether the hmac field is set.
     */
    boolean hasHmac();
    /**
     * <code>required bytes hmac = 10;</code>
     * @return The hmac.
     */
    com.google.protobuf.ByteString getHmac();
  }
  /**
   * Protobuf type {@code spotify.LoginCryptoDiffieHellmanResponse}
   */
  public  static final class LoginCryptoDiffieHellmanResponse extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.LoginCryptoDiffieHellmanResponse)
      LoginCryptoDiffieHellmanResponseOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use LoginCryptoDiffieHellmanResponse.newBuilder() to construct.
    private LoginCryptoDiffieHellmanResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private LoginCryptoDiffieHellmanResponse() {
      hmac_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new LoginCryptoDiffieHellmanResponse();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private LoginCryptoDiffieHellmanResponse(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              bitField0_ |= 0x00000001;
              hmac_ = input.readBytes();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanResponse_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanResponse_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.class, com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.Builder.class);
    }

    private int bitField0_;
    public static final int HMAC_FIELD_NUMBER = 10;
    private com.google.protobuf.ByteString hmac_;
    /**
     * <code>required bytes hmac = 10;</code>
     * @return Whether the hmac field is set.
     */
    public boolean hasHmac() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required bytes hmac = 10;</code>
     * @return The hmac.
     */
    public com.google.protobuf.ByteString getHmac() {
      return hmac_;
    }

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

      if (!hasHmac()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeBytes(10, hmac_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, hmac_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse other = (com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse) obj;

      if (hasHmac() != other.hasHmac()) return false;
      if (hasHmac()) {
        if (!getHmac()
            .equals(other.getHmac())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.LoginCryptoDiffieHellmanResponse}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.LoginCryptoDiffieHellmanResponse)
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponseOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanResponse_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanResponse_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.class, com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        hmac_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_LoginCryptoDiffieHellmanResponse_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse getDefaultInstanceForType() {
        return com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse build() {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse buildPartial() {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse result = new com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.hmac_ = hmac_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse) {
          return mergeFrom((com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse other) {
        if (other == com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse.getDefaultInstance()) return this;
        if (other.hasHmac()) {
          setHmac(other.getHmac());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

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

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.ByteString hmac_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes hmac = 10;</code>
       * @return Whether the hmac field is set.
       */
      public boolean hasHmac() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required bytes hmac = 10;</code>
       * @return The hmac.
       */
      public com.google.protobuf.ByteString getHmac() {
        return hmac_;
      }
      /**
       * <code>required bytes hmac = 10;</code>
       * @param value The hmac to set.
       * @return This builder for chaining.
       */
      public Builder setHmac(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        hmac_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes hmac = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearHmac() {
        bitField0_ = (bitField0_ & ~0x00000001);
        hmac_ = getDefaultInstance().getHmac();
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.LoginCryptoDiffieHellmanResponse)
    }

    // @@protoc_insertion_point(class_scope:spotify.LoginCryptoDiffieHellmanResponse)
    private static final com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse();
    }

    public static com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<LoginCryptoDiffieHellmanResponse>
        PARSER = new com.google.protobuf.AbstractParser<LoginCryptoDiffieHellmanResponse>() {
      @java.lang.Override
      public LoginCryptoDiffieHellmanResponse parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LoginCryptoDiffieHellmanResponse(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.LoginCryptoDiffieHellmanResponse getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface PoWResponseUnionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.PoWResponseUnion)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
     * @return Whether the hashCash field is set.
     */
    boolean hasHashCash();
    /**
     * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
     * @return The hashCash.
     */
    com.spotify.Keyexchange.PoWHashCashResponse getHashCash();
    /**
     * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
     */
    com.spotify.Keyexchange.PoWHashCashResponseOrBuilder getHashCashOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.PoWResponseUnion}
   */
  public  static final class PoWResponseUnion extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.PoWResponseUnion)
      PoWResponseUnionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use PoWResponseUnion.newBuilder() to construct.
    private PoWResponseUnion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private PoWResponseUnion() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new PoWResponseUnion();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private PoWResponseUnion(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.PoWHashCashResponse.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = hashCash_.toBuilder();
              }
              hashCash_ = input.readMessage(com.spotify.Keyexchange.PoWHashCashResponse.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(hashCash_);
                hashCash_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_PoWResponseUnion_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_PoWResponseUnion_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.PoWResponseUnion.class, com.spotify.Keyexchange.PoWResponseUnion.Builder.class);
    }

    private int bitField0_;
    public static final int HASH_CASH_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.PoWHashCashResponse hashCash_;
    /**
     * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
     * @return Whether the hashCash field is set.
     */
    public boolean hasHashCash() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
     * @return The hashCash.
     */
    public com.spotify.Keyexchange.PoWHashCashResponse getHashCash() {
      return hashCash_ == null ? com.spotify.Keyexchange.PoWHashCashResponse.getDefaultInstance() : hashCash_;
    }
    /**
     * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
     */
    public com.spotify.Keyexchange.PoWHashCashResponseOrBuilder getHashCashOrBuilder() {
      return hashCash_ == null ? com.spotify.Keyexchange.PoWHashCashResponse.getDefaultInstance() : hashCash_;
    }

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

      if (hasHashCash()) {
        if (!getHashCash().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getHashCash());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getHashCash());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.PoWResponseUnion)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.PoWResponseUnion other = (com.spotify.Keyexchange.PoWResponseUnion) obj;

      if (hasHashCash() != other.hasHashCash()) return false;
      if (hasHashCash()) {
        if (!getHashCash()
            .equals(other.getHashCash())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWResponseUnion parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.PoWResponseUnion 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.PoWResponseUnion}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.PoWResponseUnion)
        com.spotify.Keyexchange.PoWResponseUnionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWResponseUnion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWResponseUnion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.PoWResponseUnion.class, com.spotify.Keyexchange.PoWResponseUnion.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.PoWResponseUnion.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getHashCashFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (hashCashBuilder_ == null) {
          hashCash_ = null;
        } else {
          hashCashBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWResponseUnion_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWResponseUnion getDefaultInstanceForType() {
        return com.spotify.Keyexchange.PoWResponseUnion.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWResponseUnion build() {
        com.spotify.Keyexchange.PoWResponseUnion result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWResponseUnion buildPartial() {
        com.spotify.Keyexchange.PoWResponseUnion result = new com.spotify.Keyexchange.PoWResponseUnion(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (hashCashBuilder_ == null) {
            result.hashCash_ = hashCash_;
          } else {
            result.hashCash_ = hashCashBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.PoWResponseUnion) {
          return mergeFrom((com.spotify.Keyexchange.PoWResponseUnion)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.PoWResponseUnion other) {
        if (other == com.spotify.Keyexchange.PoWResponseUnion.getDefaultInstance()) return this;
        if (other.hasHashCash()) {
          mergeHashCash(other.getHashCash());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (hasHashCash()) {
          if (!getHashCash().isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.PoWResponseUnion parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.PoWResponseUnion) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.PoWHashCashResponse hashCash_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.PoWHashCashResponse, com.spotify.Keyexchange.PoWHashCashResponse.Builder, com.spotify.Keyexchange.PoWHashCashResponseOrBuilder> hashCashBuilder_;
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       * @return Whether the hashCash field is set.
       */
      public boolean hasHashCash() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       * @return The hashCash.
       */
      public com.spotify.Keyexchange.PoWHashCashResponse getHashCash() {
        if (hashCashBuilder_ == null) {
          return hashCash_ == null ? com.spotify.Keyexchange.PoWHashCashResponse.getDefaultInstance() : hashCash_;
        } else {
          return hashCashBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       */
      public Builder setHashCash(com.spotify.Keyexchange.PoWHashCashResponse value) {
        if (hashCashBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          hashCash_ = value;
          onChanged();
        } else {
          hashCashBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       */
      public Builder setHashCash(
          com.spotify.Keyexchange.PoWHashCashResponse.Builder builderForValue) {
        if (hashCashBuilder_ == null) {
          hashCash_ = builderForValue.build();
          onChanged();
        } else {
          hashCashBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       */
      public Builder mergeHashCash(com.spotify.Keyexchange.PoWHashCashResponse value) {
        if (hashCashBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              hashCash_ != null &&
              hashCash_ != com.spotify.Keyexchange.PoWHashCashResponse.getDefaultInstance()) {
            hashCash_ =
              com.spotify.Keyexchange.PoWHashCashResponse.newBuilder(hashCash_).mergeFrom(value).buildPartial();
          } else {
            hashCash_ = value;
          }
          onChanged();
        } else {
          hashCashBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       */
      public Builder clearHashCash() {
        if (hashCashBuilder_ == null) {
          hashCash_ = null;
          onChanged();
        } else {
          hashCashBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       */
      public com.spotify.Keyexchange.PoWHashCashResponse.Builder getHashCashBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getHashCashFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       */
      public com.spotify.Keyexchange.PoWHashCashResponseOrBuilder getHashCashOrBuilder() {
        if (hashCashBuilder_ != null) {
          return hashCashBuilder_.getMessageOrBuilder();
        } else {
          return hashCash_ == null ?
              com.spotify.Keyexchange.PoWHashCashResponse.getDefaultInstance() : hashCash_;
        }
      }
      /**
       * <code>optional .spotify.PoWHashCashResponse hash_cash = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.PoWHashCashResponse, com.spotify.Keyexchange.PoWHashCashResponse.Builder, com.spotify.Keyexchange.PoWHashCashResponseOrBuilder> 
          getHashCashFieldBuilder() {
        if (hashCashBuilder_ == null) {
          hashCashBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.PoWHashCashResponse, com.spotify.Keyexchange.PoWHashCashResponse.Builder, com.spotify.Keyexchange.PoWHashCashResponseOrBuilder>(
                  getHashCash(),
                  getParentForChildren(),
                  isClean());
          hashCash_ = null;
        }
        return hashCashBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.PoWResponseUnion)
    }

    // @@protoc_insertion_point(class_scope:spotify.PoWResponseUnion)
    private static final com.spotify.Keyexchange.PoWResponseUnion DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.PoWResponseUnion();
    }

    public static com.spotify.Keyexchange.PoWResponseUnion getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<PoWResponseUnion>
        PARSER = new com.google.protobuf.AbstractParser<PoWResponseUnion>() {
      @java.lang.Override
      public PoWResponseUnion parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PoWResponseUnion(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.PoWResponseUnion getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface PoWHashCashResponseOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.PoWHashCashResponse)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required bytes hash_suffix = 10;</code>
     * @return Whether the hashSuffix field is set.
     */
    boolean hasHashSuffix();
    /**
     * <code>required bytes hash_suffix = 10;</code>
     * @return The hashSuffix.
     */
    com.google.protobuf.ByteString getHashSuffix();
  }
  /**
   * Protobuf type {@code spotify.PoWHashCashResponse}
   */
  public  static final class PoWHashCashResponse extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.PoWHashCashResponse)
      PoWHashCashResponseOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use PoWHashCashResponse.newBuilder() to construct.
    private PoWHashCashResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private PoWHashCashResponse() {
      hashSuffix_ = com.google.protobuf.ByteString.EMPTY;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new PoWHashCashResponse();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private PoWHashCashResponse(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              bitField0_ |= 0x00000001;
              hashSuffix_ = input.readBytes();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashResponse_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashResponse_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.PoWHashCashResponse.class, com.spotify.Keyexchange.PoWHashCashResponse.Builder.class);
    }

    private int bitField0_;
    public static final int HASH_SUFFIX_FIELD_NUMBER = 10;
    private com.google.protobuf.ByteString hashSuffix_;
    /**
     * <code>required bytes hash_suffix = 10;</code>
     * @return Whether the hashSuffix field is set.
     */
    public boolean hasHashSuffix() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required bytes hash_suffix = 10;</code>
     * @return The hashSuffix.
     */
    public com.google.protobuf.ByteString getHashSuffix() {
      return hashSuffix_;
    }

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

      if (!hasHashSuffix()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeBytes(10, hashSuffix_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, hashSuffix_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.PoWHashCashResponse)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.PoWHashCashResponse other = (com.spotify.Keyexchange.PoWHashCashResponse) obj;

      if (hasHashSuffix() != other.hasHashSuffix()) return false;
      if (hasHashSuffix()) {
        if (!getHashSuffix()
            .equals(other.getHashSuffix())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.PoWHashCashResponse parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.PoWHashCashResponse 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.PoWHashCashResponse}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.PoWHashCashResponse)
        com.spotify.Keyexchange.PoWHashCashResponseOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashResponse_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashResponse_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.PoWHashCashResponse.class, com.spotify.Keyexchange.PoWHashCashResponse.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.PoWHashCashResponse.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        hashSuffix_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_PoWHashCashResponse_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWHashCashResponse getDefaultInstanceForType() {
        return com.spotify.Keyexchange.PoWHashCashResponse.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWHashCashResponse build() {
        com.spotify.Keyexchange.PoWHashCashResponse result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.PoWHashCashResponse buildPartial() {
        com.spotify.Keyexchange.PoWHashCashResponse result = new com.spotify.Keyexchange.PoWHashCashResponse(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.hashSuffix_ = hashSuffix_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.PoWHashCashResponse) {
          return mergeFrom((com.spotify.Keyexchange.PoWHashCashResponse)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.PoWHashCashResponse other) {
        if (other == com.spotify.Keyexchange.PoWHashCashResponse.getDefaultInstance()) return this;
        if (other.hasHashSuffix()) {
          setHashSuffix(other.getHashSuffix());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

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

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.spotify.Keyexchange.PoWHashCashResponse parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.PoWHashCashResponse) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.ByteString hashSuffix_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>required bytes hash_suffix = 10;</code>
       * @return Whether the hashSuffix field is set.
       */
      public boolean hasHashSuffix() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required bytes hash_suffix = 10;</code>
       * @return The hashSuffix.
       */
      public com.google.protobuf.ByteString getHashSuffix() {
        return hashSuffix_;
      }
      /**
       * <code>required bytes hash_suffix = 10;</code>
       * @param value The hashSuffix to set.
       * @return This builder for chaining.
       */
      public Builder setHashSuffix(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        hashSuffix_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bytes hash_suffix = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearHashSuffix() {
        bitField0_ = (bitField0_ & ~0x00000001);
        hashSuffix_ = getDefaultInstance().getHashSuffix();
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.PoWHashCashResponse)
    }

    // @@protoc_insertion_point(class_scope:spotify.PoWHashCashResponse)
    private static final com.spotify.Keyexchange.PoWHashCashResponse DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.PoWHashCashResponse();
    }

    public static com.spotify.Keyexchange.PoWHashCashResponse getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<PoWHashCashResponse>
        PARSER = new com.google.protobuf.AbstractParser<PoWHashCashResponse>() {
      @java.lang.Override
      public PoWHashCashResponse parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PoWHashCashResponse(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.PoWHashCashResponse getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface CryptoResponseUnionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.CryptoResponseUnion)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
     * @return Whether the shannon field is set.
     */
    boolean hasShannon();
    /**
     * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
     * @return The shannon.
     */
    com.spotify.Keyexchange.CryptoShannonResponse getShannon();
    /**
     * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
     */
    com.spotify.Keyexchange.CryptoShannonResponseOrBuilder getShannonOrBuilder();

    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
     * @return Whether the rc4Sha1Hmac field is set.
     */
    boolean hasRc4Sha1Hmac();
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
     * @return The rc4Sha1Hmac.
     */
    com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse getRc4Sha1Hmac();
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
     */
    com.spotify.Keyexchange.CryptoRc4Sha1HmacResponseOrBuilder getRc4Sha1HmacOrBuilder();
  }
  /**
   * Protobuf type {@code spotify.CryptoResponseUnion}
   */
  public  static final class CryptoResponseUnion extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.CryptoResponseUnion)
      CryptoResponseUnionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use CryptoResponseUnion.newBuilder() to construct.
    private CryptoResponseUnion(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private CryptoResponseUnion() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new CryptoResponseUnion();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private CryptoResponseUnion(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 82: {
              com.spotify.Keyexchange.CryptoShannonResponse.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = shannon_.toBuilder();
              }
              shannon_ = input.readMessage(com.spotify.Keyexchange.CryptoShannonResponse.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(shannon_);
                shannon_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 162: {
              com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = rc4Sha1Hmac_.toBuilder();
              }
              rc4Sha1Hmac_ = input.readMessage(com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(rc4Sha1Hmac_);
                rc4Sha1Hmac_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoResponseUnion_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoResponseUnion_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.CryptoResponseUnion.class, com.spotify.Keyexchange.CryptoResponseUnion.Builder.class);
    }

    private int bitField0_;
    public static final int SHANNON_FIELD_NUMBER = 10;
    private com.spotify.Keyexchange.CryptoShannonResponse shannon_;
    /**
     * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
     * @return Whether the shannon field is set.
     */
    public boolean hasShannon() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
     * @return The shannon.
     */
    public com.spotify.Keyexchange.CryptoShannonResponse getShannon() {
      return shannon_ == null ? com.spotify.Keyexchange.CryptoShannonResponse.getDefaultInstance() : shannon_;
    }
    /**
     * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
     */
    public com.spotify.Keyexchange.CryptoShannonResponseOrBuilder getShannonOrBuilder() {
      return shannon_ == null ? com.spotify.Keyexchange.CryptoShannonResponse.getDefaultInstance() : shannon_;
    }

    public static final int RC4_SHA1_HMAC_FIELD_NUMBER = 20;
    private com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse rc4Sha1Hmac_;
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
     * @return Whether the rc4Sha1Hmac field is set.
     */
    public boolean hasRc4Sha1Hmac() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
     * @return The rc4Sha1Hmac.
     */
    public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse getRc4Sha1Hmac() {
      return rc4Sha1Hmac_ == null ? com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.getDefaultInstance() : rc4Sha1Hmac_;
    }
    /**
     * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
     */
    public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponseOrBuilder getRc4Sha1HmacOrBuilder() {
      return rc4Sha1Hmac_ == null ? com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.getDefaultInstance() : rc4Sha1Hmac_;
    }

    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 (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(10, getShannon());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(20, getRc4Sha1Hmac());
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, getShannon());
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(20, getRc4Sha1Hmac());
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.CryptoResponseUnion)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.CryptoResponseUnion other = (com.spotify.Keyexchange.CryptoResponseUnion) obj;

      if (hasShannon() != other.hasShannon()) return false;
      if (hasShannon()) {
        if (!getShannon()
            .equals(other.getShannon())) return false;
      }
      if (hasRc4Sha1Hmac() != other.hasRc4Sha1Hmac()) return false;
      if (hasRc4Sha1Hmac()) {
        if (!getRc4Sha1Hmac()
            .equals(other.getRc4Sha1Hmac())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasShannon()) {
        hash = (37 * hash) + SHANNON_FIELD_NUMBER;
        hash = (53 * hash) + getShannon().hashCode();
      }
      if (hasRc4Sha1Hmac()) {
        hash = (37 * hash) + RC4_SHA1_HMAC_FIELD_NUMBER;
        hash = (53 * hash) + getRc4Sha1Hmac().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoResponseUnion parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.CryptoResponseUnion 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.CryptoResponseUnion}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.CryptoResponseUnion)
        com.spotify.Keyexchange.CryptoResponseUnionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoResponseUnion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoResponseUnion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.CryptoResponseUnion.class, com.spotify.Keyexchange.CryptoResponseUnion.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.CryptoResponseUnion.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getShannonFieldBuilder();
          getRc4Sha1HmacFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (shannonBuilder_ == null) {
          shannon_ = null;
        } else {
          shannonBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        if (rc4Sha1HmacBuilder_ == null) {
          rc4Sha1Hmac_ = null;
        } else {
          rc4Sha1HmacBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoResponseUnion_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoResponseUnion getDefaultInstanceForType() {
        return com.spotify.Keyexchange.CryptoResponseUnion.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoResponseUnion build() {
        com.spotify.Keyexchange.CryptoResponseUnion result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoResponseUnion buildPartial() {
        com.spotify.Keyexchange.CryptoResponseUnion result = new com.spotify.Keyexchange.CryptoResponseUnion(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (shannonBuilder_ == null) {
            result.shannon_ = shannon_;
          } else {
            result.shannon_ = shannonBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          if (rc4Sha1HmacBuilder_ == null) {
            result.rc4Sha1Hmac_ = rc4Sha1Hmac_;
          } else {
            result.rc4Sha1Hmac_ = rc4Sha1HmacBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.CryptoResponseUnion) {
          return mergeFrom((com.spotify.Keyexchange.CryptoResponseUnion)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.CryptoResponseUnion other) {
        if (other == com.spotify.Keyexchange.CryptoResponseUnion.getDefaultInstance()) return this;
        if (other.hasShannon()) {
          mergeShannon(other.getShannon());
        }
        if (other.hasRc4Sha1Hmac()) {
          mergeRc4Sha1Hmac(other.getRc4Sha1Hmac());
        }
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.CryptoResponseUnion parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.CryptoResponseUnion) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.spotify.Keyexchange.CryptoShannonResponse shannon_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoShannonResponse, com.spotify.Keyexchange.CryptoShannonResponse.Builder, com.spotify.Keyexchange.CryptoShannonResponseOrBuilder> shannonBuilder_;
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       * @return Whether the shannon field is set.
       */
      public boolean hasShannon() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       * @return The shannon.
       */
      public com.spotify.Keyexchange.CryptoShannonResponse getShannon() {
        if (shannonBuilder_ == null) {
          return shannon_ == null ? com.spotify.Keyexchange.CryptoShannonResponse.getDefaultInstance() : shannon_;
        } else {
          return shannonBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       */
      public Builder setShannon(com.spotify.Keyexchange.CryptoShannonResponse value) {
        if (shannonBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          shannon_ = value;
          onChanged();
        } else {
          shannonBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       */
      public Builder setShannon(
          com.spotify.Keyexchange.CryptoShannonResponse.Builder builderForValue) {
        if (shannonBuilder_ == null) {
          shannon_ = builderForValue.build();
          onChanged();
        } else {
          shannonBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       */
      public Builder mergeShannon(com.spotify.Keyexchange.CryptoShannonResponse value) {
        if (shannonBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              shannon_ != null &&
              shannon_ != com.spotify.Keyexchange.CryptoShannonResponse.getDefaultInstance()) {
            shannon_ =
              com.spotify.Keyexchange.CryptoShannonResponse.newBuilder(shannon_).mergeFrom(value).buildPartial();
          } else {
            shannon_ = value;
          }
          onChanged();
        } else {
          shannonBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       */
      public Builder clearShannon() {
        if (shannonBuilder_ == null) {
          shannon_ = null;
          onChanged();
        } else {
          shannonBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       */
      public com.spotify.Keyexchange.CryptoShannonResponse.Builder getShannonBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getShannonFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       */
      public com.spotify.Keyexchange.CryptoShannonResponseOrBuilder getShannonOrBuilder() {
        if (shannonBuilder_ != null) {
          return shannonBuilder_.getMessageOrBuilder();
        } else {
          return shannon_ == null ?
              com.spotify.Keyexchange.CryptoShannonResponse.getDefaultInstance() : shannon_;
        }
      }
      /**
       * <code>optional .spotify.CryptoShannonResponse shannon = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoShannonResponse, com.spotify.Keyexchange.CryptoShannonResponse.Builder, com.spotify.Keyexchange.CryptoShannonResponseOrBuilder> 
          getShannonFieldBuilder() {
        if (shannonBuilder_ == null) {
          shannonBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.CryptoShannonResponse, com.spotify.Keyexchange.CryptoShannonResponse.Builder, com.spotify.Keyexchange.CryptoShannonResponseOrBuilder>(
                  getShannon(),
                  getParentForChildren(),
                  isClean());
          shannon_ = null;
        }
        return shannonBuilder_;
      }

      private com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse rc4Sha1Hmac_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse, com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.Builder, com.spotify.Keyexchange.CryptoRc4Sha1HmacResponseOrBuilder> rc4Sha1HmacBuilder_;
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       * @return Whether the rc4Sha1Hmac field is set.
       */
      public boolean hasRc4Sha1Hmac() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       * @return The rc4Sha1Hmac.
       */
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse getRc4Sha1Hmac() {
        if (rc4Sha1HmacBuilder_ == null) {
          return rc4Sha1Hmac_ == null ? com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.getDefaultInstance() : rc4Sha1Hmac_;
        } else {
          return rc4Sha1HmacBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       */
      public Builder setRc4Sha1Hmac(com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse value) {
        if (rc4Sha1HmacBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          rc4Sha1Hmac_ = value;
          onChanged();
        } else {
          rc4Sha1HmacBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       */
      public Builder setRc4Sha1Hmac(
          com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.Builder builderForValue) {
        if (rc4Sha1HmacBuilder_ == null) {
          rc4Sha1Hmac_ = builderForValue.build();
          onChanged();
        } else {
          rc4Sha1HmacBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       */
      public Builder mergeRc4Sha1Hmac(com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse value) {
        if (rc4Sha1HmacBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
              rc4Sha1Hmac_ != null &&
              rc4Sha1Hmac_ != com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.getDefaultInstance()) {
            rc4Sha1Hmac_ =
              com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.newBuilder(rc4Sha1Hmac_).mergeFrom(value).buildPartial();
          } else {
            rc4Sha1Hmac_ = value;
          }
          onChanged();
        } else {
          rc4Sha1HmacBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       */
      public Builder clearRc4Sha1Hmac() {
        if (rc4Sha1HmacBuilder_ == null) {
          rc4Sha1Hmac_ = null;
          onChanged();
        } else {
          rc4Sha1HmacBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       */
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.Builder getRc4Sha1HmacBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getRc4Sha1HmacFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       */
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponseOrBuilder getRc4Sha1HmacOrBuilder() {
        if (rc4Sha1HmacBuilder_ != null) {
          return rc4Sha1HmacBuilder_.getMessageOrBuilder();
        } else {
          return rc4Sha1Hmac_ == null ?
              com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.getDefaultInstance() : rc4Sha1Hmac_;
        }
      }
      /**
       * <code>optional .spotify.CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 20;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse, com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.Builder, com.spotify.Keyexchange.CryptoRc4Sha1HmacResponseOrBuilder> 
          getRc4Sha1HmacFieldBuilder() {
        if (rc4Sha1HmacBuilder_ == null) {
          rc4Sha1HmacBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse, com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.Builder, com.spotify.Keyexchange.CryptoRc4Sha1HmacResponseOrBuilder>(
                  getRc4Sha1Hmac(),
                  getParentForChildren(),
                  isClean());
          rc4Sha1Hmac_ = null;
        }
        return rc4Sha1HmacBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.CryptoResponseUnion)
    }

    // @@protoc_insertion_point(class_scope:spotify.CryptoResponseUnion)
    private static final com.spotify.Keyexchange.CryptoResponseUnion DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.CryptoResponseUnion();
    }

    public static com.spotify.Keyexchange.CryptoResponseUnion getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<CryptoResponseUnion>
        PARSER = new com.google.protobuf.AbstractParser<CryptoResponseUnion>() {
      @java.lang.Override
      public CryptoResponseUnion parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new CryptoResponseUnion(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.CryptoResponseUnion getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface CryptoShannonResponseOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.CryptoShannonResponse)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional int32 dummy = 1;</code>
     * @return Whether the dummy field is set.
     */
    boolean hasDummy();
    /**
     * <code>optional int32 dummy = 1;</code>
     * @return The dummy.
     */
    int getDummy();
  }
  /**
   * Protobuf type {@code spotify.CryptoShannonResponse}
   */
  public  static final class CryptoShannonResponse extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.CryptoShannonResponse)
      CryptoShannonResponseOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use CryptoShannonResponse.newBuilder() to construct.
    private CryptoShannonResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private CryptoShannonResponse() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new CryptoShannonResponse();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private CryptoShannonResponse(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 8: {
              bitField0_ |= 0x00000001;
              dummy_ = input.readInt32();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonResponse_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonResponse_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.CryptoShannonResponse.class, com.spotify.Keyexchange.CryptoShannonResponse.Builder.class);
    }

    private int bitField0_;
    public static final int DUMMY_FIELD_NUMBER = 1;
    private int dummy_;
    /**
     * <code>optional int32 dummy = 1;</code>
     * @return Whether the dummy field is set.
     */
    public boolean hasDummy() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional int32 dummy = 1;</code>
     * @return The dummy.
     */
    public int getDummy() {
      return dummy_;
    }

    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 (((bitField0_ & 0x00000001) != 0)) {
        output.writeInt32(1, dummy_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(1, dummy_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.CryptoShannonResponse)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.CryptoShannonResponse other = (com.spotify.Keyexchange.CryptoShannonResponse) obj;

      if (hasDummy() != other.hasDummy()) return false;
      if (hasDummy()) {
        if (getDummy()
            != other.getDummy()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoShannonResponse parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.CryptoShannonResponse 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.CryptoShannonResponse}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.CryptoShannonResponse)
        com.spotify.Keyexchange.CryptoShannonResponseOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonResponse_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonResponse_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.CryptoShannonResponse.class, com.spotify.Keyexchange.CryptoShannonResponse.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.CryptoShannonResponse.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        dummy_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoShannonResponse_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoShannonResponse getDefaultInstanceForType() {
        return com.spotify.Keyexchange.CryptoShannonResponse.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoShannonResponse build() {
        com.spotify.Keyexchange.CryptoShannonResponse result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoShannonResponse buildPartial() {
        com.spotify.Keyexchange.CryptoShannonResponse result = new com.spotify.Keyexchange.CryptoShannonResponse(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.dummy_ = dummy_;
          to_bitField0_ |= 0x00000001;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.CryptoShannonResponse) {
          return mergeFrom((com.spotify.Keyexchange.CryptoShannonResponse)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.CryptoShannonResponse other) {
        if (other == com.spotify.Keyexchange.CryptoShannonResponse.getDefaultInstance()) return this;
        if (other.hasDummy()) {
          setDummy(other.getDummy());
        }
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.CryptoShannonResponse parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.CryptoShannonResponse) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private int dummy_ ;
      /**
       * <code>optional int32 dummy = 1;</code>
       * @return Whether the dummy field is set.
       */
      public boolean hasDummy() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional int32 dummy = 1;</code>
       * @return The dummy.
       */
      public int getDummy() {
        return dummy_;
      }
      /**
       * <code>optional int32 dummy = 1;</code>
       * @param value The dummy to set.
       * @return This builder for chaining.
       */
      public Builder setDummy(int value) {
        bitField0_ |= 0x00000001;
        dummy_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 dummy = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearDummy() {
        bitField0_ = (bitField0_ & ~0x00000001);
        dummy_ = 0;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.CryptoShannonResponse)
    }

    // @@protoc_insertion_point(class_scope:spotify.CryptoShannonResponse)
    private static final com.spotify.Keyexchange.CryptoShannonResponse DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.CryptoShannonResponse();
    }

    public static com.spotify.Keyexchange.CryptoShannonResponse getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<CryptoShannonResponse>
        PARSER = new com.google.protobuf.AbstractParser<CryptoShannonResponse>() {
      @java.lang.Override
      public CryptoShannonResponse parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new CryptoShannonResponse(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.CryptoShannonResponse getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface CryptoRc4Sha1HmacResponseOrBuilder extends
      // @@protoc_insertion_point(interface_extends:spotify.CryptoRc4Sha1HmacResponse)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional int32 dummy = 1;</code>
     * @return Whether the dummy field is set.
     */
    boolean hasDummy();
    /**
     * <code>optional int32 dummy = 1;</code>
     * @return The dummy.
     */
    int getDummy();
  }
  /**
   * Protobuf type {@code spotify.CryptoRc4Sha1HmacResponse}
   */
  public  static final class CryptoRc4Sha1HmacResponse extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:spotify.CryptoRc4Sha1HmacResponse)
      CryptoRc4Sha1HmacResponseOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use CryptoRc4Sha1HmacResponse.newBuilder() to construct.
    private CryptoRc4Sha1HmacResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private CryptoRc4Sha1HmacResponse() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new CryptoRc4Sha1HmacResponse();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private CryptoRc4Sha1HmacResponse(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 8: {
              bitField0_ |= 0x00000001;
              dummy_ = input.readInt32();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacResponse_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacResponse_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.class, com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.Builder.class);
    }

    private int bitField0_;
    public static final int DUMMY_FIELD_NUMBER = 1;
    private int dummy_;
    /**
     * <code>optional int32 dummy = 1;</code>
     * @return Whether the dummy field is set.
     */
    public boolean hasDummy() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional int32 dummy = 1;</code>
     * @return The dummy.
     */
    public int getDummy() {
      return dummy_;
    }

    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 (((bitField0_ & 0x00000001) != 0)) {
        output.writeInt32(1, dummy_);
      }
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(1, dummy_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse)) {
        return super.equals(obj);
      }
      com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse other = (com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse) obj;

      if (hasDummy() != other.hasDummy()) return false;
      if (hasDummy()) {
        if (getDummy()
            != other.getDummy()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

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

    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse 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.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code spotify.CryptoRc4Sha1HmacResponse}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:spotify.CryptoRc4Sha1HmacResponse)
        com.spotify.Keyexchange.CryptoRc4Sha1HmacResponseOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacResponse_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacResponse_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.class, com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.Builder.class);
      }

      // Construct using com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        dummy_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.spotify.Keyexchange.internal_static_spotify_CryptoRc4Sha1HmacResponse_descriptor;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse getDefaultInstanceForType() {
        return com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.getDefaultInstance();
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse build() {
        com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse buildPartial() {
        com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse result = new com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.dummy_ = dummy_;
          to_bitField0_ |= 0x00000001;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse) {
          return mergeFrom((com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse other) {
        if (other == com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse.getDefaultInstance()) return this;
        if (other.hasDummy()) {
          setDummy(other.getDummy());
        }
        this.mergeUnknownFields(other.unknownFields);
        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 {
        com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private int dummy_ ;
      /**
       * <code>optional int32 dummy = 1;</code>
       * @return Whether the dummy field is set.
       */
      public boolean hasDummy() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional int32 dummy = 1;</code>
       * @return The dummy.
       */
      public int getDummy() {
        return dummy_;
      }
      /**
       * <code>optional int32 dummy = 1;</code>
       * @param value The dummy to set.
       * @return This builder for chaining.
       */
      public Builder setDummy(int value) {
        bitField0_ |= 0x00000001;
        dummy_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 dummy = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearDummy() {
        bitField0_ = (bitField0_ & ~0x00000001);
        dummy_ = 0;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:spotify.CryptoRc4Sha1HmacResponse)
    }

    // @@protoc_insertion_point(class_scope:spotify.CryptoRc4Sha1HmacResponse)
    private static final com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse();
    }

    public static com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<CryptoRc4Sha1HmacResponse>
        PARSER = new com.google.protobuf.AbstractParser<CryptoRc4Sha1HmacResponse>() {
      @java.lang.Override
      public CryptoRc4Sha1HmacResponse parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new CryptoRc4Sha1HmacResponse(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.spotify.Keyexchange.CryptoRc4Sha1HmacResponse getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_ClientHello_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_ClientHello_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_BuildInfo_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_BuildInfo_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_LoginCryptoHelloUnion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_LoginCryptoHelloUnion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_LoginCryptoDiffieHellmanHello_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_LoginCryptoDiffieHellmanHello_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_FeatureSet_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_FeatureSet_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_APResponseMessage_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_APResponseMessage_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_APChallenge_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_APChallenge_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_LoginCryptoChallengeUnion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_LoginCryptoChallengeUnion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_LoginCryptoDiffieHellmanChallenge_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_LoginCryptoDiffieHellmanChallenge_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_FingerprintChallengeUnion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_FingerprintChallengeUnion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_FingerprintGrainChallenge_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_FingerprintGrainChallenge_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_FingerprintHmacRipemdChallenge_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_FingerprintHmacRipemdChallenge_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_PoWChallengeUnion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_PoWChallengeUnion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_PoWHashCashChallenge_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_PoWHashCashChallenge_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_CryptoChallengeUnion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_CryptoChallengeUnion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_CryptoShannonChallenge_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_CryptoShannonChallenge_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_CryptoRc4Sha1HmacChallenge_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_CryptoRc4Sha1HmacChallenge_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_UpgradeRequiredMessage_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_UpgradeRequiredMessage_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_APLoginFailed_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_APLoginFailed_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_ClientResponsePlaintext_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_ClientResponsePlaintext_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_LoginCryptoResponseUnion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_LoginCryptoResponseUnion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_LoginCryptoDiffieHellmanResponse_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_LoginCryptoDiffieHellmanResponse_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_PoWResponseUnion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_PoWResponseUnion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_PoWHashCashResponse_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_PoWHashCashResponse_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_CryptoResponseUnion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_CryptoResponseUnion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_CryptoShannonResponse_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_CryptoShannonResponse_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_spotify_CryptoRc4Sha1HmacResponse_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_spotify_CryptoRc4Sha1HmacResponse_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\021keyexchange.proto\022\007spotify\"\340\002\n\013ClientH" +
      "ello\022&\n\nbuild_info\030\n \002(\0132\022.spotify.Build" +
      "Info\0224\n\026fingerprints_supported\030\024 \003(\0162\024.s" +
      "potify.Fingerprint\0224\n\026cryptosuites_suppo" +
      "rted\030\036 \003(\0162\024.spotify.Cryptosuite\0220\n\024pows" +
      "chemes_supported\030( \003(\0162\022.spotify.Powsche" +
      "me\022:\n\022login_crypto_hello\0302 \002(\0132\036.spotify" +
      ".LoginCryptoHelloUnion\022\024\n\014client_nonce\030<" +
      " \002(\014\022\017\n\007padding\030F \001(\014\022(\n\013feature_set\030P \001" +
      "(\0132\023.spotify.FeatureSet\"\222\001\n\tBuildInfo\022!\n" +
      "\007product\030\n \002(\0162\020.spotify.Product\022,\n\rprod" +
      "uct_flags\030\024 \003(\0162\025.spotify.ProductFlags\022#" +
      "\n\010platform\030\036 \002(\0162\021.spotify.Platform\022\017\n\007v" +
      "ersion\030( \002(\004\"W\n\025LoginCryptoHelloUnion\022>\n" +
      "\016diffie_hellman\030\n \001(\0132&.spotify.LoginCry" +
      "ptoDiffieHellmanHello\"F\n\035LoginCryptoDiff" +
      "ieHellmanHello\022\n\n\002gc\030\n \002(\014\022\031\n\021server_key" +
      "s_known\030\024 \002(\r\";\n\nFeatureSet\022\023\n\013autoupdat" +
      "e2\030\001 \001(\010\022\030\n\020current_location\030\002 \001(\010\"\234\001\n\021A" +
      "PResponseMessage\022\'\n\tchallenge\030\n \001(\0132\024.sp" +
      "otify.APChallenge\0220\n\007upgrade\030\024 \001(\0132\037.spo" +
      "tify.UpgradeRequiredMessage\022,\n\014login_fai" +
      "led\030\036 \001(\0132\026.spotify.APLoginFailed\"\247\002\n\013AP" +
      "Challenge\022B\n\026login_crypto_challenge\030\n \002(" +
      "\0132\".spotify.LoginCryptoChallengeUnion\022A\n" +
      "\025fingerprint_challenge\030\024 \002(\0132\".spotify.F" +
      "ingerprintChallengeUnion\0221\n\rpow_challeng" +
      "e\030\036 \002(\0132\032.spotify.PoWChallengeUnion\0227\n\020c" +
      "rypto_challenge\030( \002(\0132\035.spotify.CryptoCh" +
      "allengeUnion\022\024\n\014server_nonce\0302 \002(\014\022\017\n\007pa" +
      "dding\030< \001(\014\"_\n\031LoginCryptoChallengeUnion" +
      "\022B\n\016diffie_hellman\030\n \001(\0132*.spotify.Login" +
      "CryptoDiffieHellmanChallenge\"c\n!LoginCry" +
      "ptoDiffieHellmanChallenge\022\n\n\002gs\030\n \002(\014\022\034\n" +
      "\024server_signature_key\030\024 \002(\005\022\024\n\014gs_signat" +
      "ure\030\036 \002(\014\"\214\001\n\031FingerprintChallengeUnion\022" +
      "1\n\005grain\030\n \001(\0132\".spotify.FingerprintGrai" +
      "nChallenge\022<\n\013hmac_ripemd\030\024 \001(\0132\'.spotif" +
      "y.FingerprintHmacRipemdChallenge\"(\n\031Fing" +
      "erprintGrainChallenge\022\013\n\003kek\030\n \002(\014\"3\n\036Fi" +
      "ngerprintHmacRipemdChallenge\022\021\n\tchalleng" +
      "e\030\n \002(\014\"E\n\021PoWChallengeUnion\0220\n\thash_cas" +
      "h\030\n \001(\0132\035.spotify.PoWHashCashChallenge\"F" +
      "\n\024PoWHashCashChallenge\022\016\n\006prefix\030\n \001(\014\022\016" +
      "\n\006length\030\024 \001(\005\022\016\n\006target\030\036 \001(\005\"\204\001\n\024Crypt" +
      "oChallengeUnion\0220\n\007shannon\030\n \001(\0132\037.spoti" +
      "fy.CryptoShannonChallenge\022:\n\rrc4_sha1_hm" +
      "ac\030\024 \001(\0132#.spotify.CryptoRc4Sha1HmacChal" +
      "lenge\"\030\n\026CryptoShannonChallenge\"\034\n\032Crypt" +
      "oRc4Sha1HmacChallenge\"]\n\026UpgradeRequired" +
      "Message\022\033\n\023upgrade_signed_part\030\n \002(\014\022\021\n\t" +
      "signature\030\024 \002(\014\022\023\n\013http_suffix\030\036 \001(\t\"w\n\r" +
      "APLoginFailed\022&\n\nerror_code\030\n \002(\0162\022.spot" +
      "ify.ErrorCode\022\023\n\013retry_delay\030\024 \001(\005\022\016\n\006ex" +
      "piry\030\036 \001(\005\022\031\n\021error_description\030( \001(\t\"\303\001" +
      "\n\027ClientResponsePlaintext\022@\n\025login_crypt" +
      "o_response\030\n \002(\0132!.spotify.LoginCryptoRe" +
      "sponseUnion\022/\n\014pow_response\030\024 \002(\0132\031.spot" +
      "ify.PoWResponseUnion\0225\n\017crypto_response\030" +
      "\036 \002(\0132\034.spotify.CryptoResponseUnion\"]\n\030L" +
      "oginCryptoResponseUnion\022A\n\016diffie_hellma" +
      "n\030\n \001(\0132).spotify.LoginCryptoDiffieHellm" +
      "anResponse\"0\n LoginCryptoDiffieHellmanRe" +
      "sponse\022\014\n\004hmac\030\n \002(\014\"C\n\020PoWResponseUnion" +
      "\022/\n\thash_cash\030\n \001(\0132\034.spotify.PoWHashCas" +
      "hResponse\"*\n\023PoWHashCashResponse\022\023\n\013hash" +
      "_suffix\030\n \002(\014\"\201\001\n\023CryptoResponseUnion\022/\n" +
      "\007shannon\030\n \001(\0132\036.spotify.CryptoShannonRe" +
      "sponse\0229\n\rrc4_sha1_hmac\030\024 \001(\0132\".spotify." +
      "CryptoRc4Sha1HmacResponse\"&\n\025CryptoShann" +
      "onResponse\022\r\n\005dummy\030\001 \001(\005\"*\n\031CryptoRc4Sh" +
      "a1HmacResponse\022\r\n\005dummy\030\001 \001(\005*\177\n\007Product" +
      "\022\022\n\016PRODUCT_CLIENT\020\000\022\026\n\022PRODUCT_LIBSPOTI" +
      "FY\020\001\022\022\n\016PRODUCT_MOBILE\020\002\022\023\n\017PRODUCT_PART" +
      "NER\020\003\022\037\n\033PRODUCT_LIBSPOTIFY_EMBEDDED\020\005*A" +
      "\n\014ProductFlags\022\025\n\021PRODUCT_FLAG_NONE\020\000\022\032\n" +
      "\026PRODUCT_FLAG_DEV_BUILD\020\001*\334\004\n\010Platform\022\026" +
      "\n\022PLATFORM_WIN32_X86\020\000\022\024\n\020PLATFORM_OSX_X" +
      "86\020\001\022\026\n\022PLATFORM_LINUX_X86\020\002\022\027\n\023PLATFORM" +
      "_IPHONE_ARM\020\003\022\024\n\020PLATFORM_S60_ARM\020\004\022\024\n\020P" +
      "LATFORM_OSX_PPC\020\005\022\030\n\024PLATFORM_ANDROID_AR" +
      "M\020\006\022\033\n\027PLATFORM_WINDOWS_CE_ARM\020\007\022\031\n\025PLAT" +
      "FORM_LINUX_X86_64\020\010\022\027\n\023PLATFORM_OSX_X86_" +
      "64\020\t\022\025\n\021PLATFORM_PALM_ARM\020\n\022\025\n\021PLATFORM_" +
      "LINUX_SH\020\013\022\030\n\024PLATFORM_FREEBSD_X86\020\014\022\033\n\027" +
      "PLATFORM_FREEBSD_X86_64\020\r\022\033\n\027PLATFORM_BL" +
      "ACKBERRY_ARM\020\016\022\022\n\016PLATFORM_SONOS\020\017\022\027\n\023PL" +
      "ATFORM_LINUX_MIPS\020\020\022\026\n\022PLATFORM_LINUX_AR" +
      "M\020\021\022\031\n\025PLATFORM_LOGITECH_ARM\020\022\022\033\n\027PLATFO" +
      "RM_LINUX_BLACKFIN\020\023\022\024\n\020PLATFORM_WP7_ARM\020" +
      "\024\022\026\n\022PLATFORM_ONKYO_ARM\020\025\022\027\n\023PLATFORM_QN" +
      "XNTO_ARM\020\026\022\024\n\020PLATFORM_BCO_ARM\020\027*A\n\013Fing" +
      "erprint\022\025\n\021FINGERPRINT_GRAIN\020\000\022\033\n\027FINGER" +
      "PRINT_HMAC_RIPEMD\020\001*G\n\013Cryptosuite\022\030\n\024CR" +
      "YPTO_SUITE_SHANNON\020\000\022\036\n\032CRYPTO_SUITE_RC4" +
      "_SHA1_HMAC\020\001*\036\n\tPowscheme\022\021\n\rPOW_HASH_CA" +
      "SH\020\000*\211\002\n\tErrorCode\022\021\n\rProtocolError\020\000\022\020\n" +
      "\014TryAnotherAP\020\002\022\023\n\017BadConnectionId\020\005\022\025\n\021" +
      "TravelRestriction\020\t\022\032\n\026PremiumAccountReq" +
      "uired\020\013\022\022\n\016BadCredentials\020\014\022\037\n\033CouldNotV" +
      "alidateCredentials\020\r\022\021\n\rAccountExists\020\016\022" +
      "\035\n\031ExtraVerificationRequired\020\017\022\021\n\rInvali" +
      "dAppKey\020\020\022\025\n\021ApplicationBanned\020\021B\r\n\013com." +
      "spotify"
    };
    descriptor = com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
        });
    internal_static_spotify_ClientHello_descriptor =
      getDescriptor().getMessageTypes().get(0);
    internal_static_spotify_ClientHello_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_ClientHello_descriptor,
        new java.lang.String[] { "BuildInfo", "FingerprintsSupported", "CryptosuitesSupported", "PowschemesSupported", "LoginCryptoHello", "ClientNonce", "Padding", "FeatureSet", });
    internal_static_spotify_BuildInfo_descriptor =
      getDescriptor().getMessageTypes().get(1);
    internal_static_spotify_BuildInfo_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_BuildInfo_descriptor,
        new java.lang.String[] { "Product", "ProductFlags", "Platform", "Version", });
    internal_static_spotify_LoginCryptoHelloUnion_descriptor =
      getDescriptor().getMessageTypes().get(2);
    internal_static_spotify_LoginCryptoHelloUnion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_LoginCryptoHelloUnion_descriptor,
        new java.lang.String[] { "DiffieHellman", });
    internal_static_spotify_LoginCryptoDiffieHellmanHello_descriptor =
      getDescriptor().getMessageTypes().get(3);
    internal_static_spotify_LoginCryptoDiffieHellmanHello_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_LoginCryptoDiffieHellmanHello_descriptor,
        new java.lang.String[] { "Gc", "ServerKeysKnown", });
    internal_static_spotify_FeatureSet_descriptor =
      getDescriptor().getMessageTypes().get(4);
    internal_static_spotify_FeatureSet_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_FeatureSet_descriptor,
        new java.lang.String[] { "Autoupdate2", "CurrentLocation", });
    internal_static_spotify_APResponseMessage_descriptor =
      getDescriptor().getMessageTypes().get(5);
    internal_static_spotify_APResponseMessage_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_APResponseMessage_descriptor,
        new java.lang.String[] { "Challenge", "Upgrade", "LoginFailed", });
    internal_static_spotify_APChallenge_descriptor =
      getDescriptor().getMessageTypes().get(6);
    internal_static_spotify_APChallenge_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_APChallenge_descriptor,
        new java.lang.String[] { "LoginCryptoChallenge", "FingerprintChallenge", "PowChallenge", "CryptoChallenge", "ServerNonce", "Padding", });
    internal_static_spotify_LoginCryptoChallengeUnion_descriptor =
      getDescriptor().getMessageTypes().get(7);
    internal_static_spotify_LoginCryptoChallengeUnion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_LoginCryptoChallengeUnion_descriptor,
        new java.lang.String[] { "DiffieHellman", });
    internal_static_spotify_LoginCryptoDiffieHellmanChallenge_descriptor =
      getDescriptor().getMessageTypes().get(8);
    internal_static_spotify_LoginCryptoDiffieHellmanChallenge_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_LoginCryptoDiffieHellmanChallenge_descriptor,
        new java.lang.String[] { "Gs", "ServerSignatureKey", "GsSignature", });
    internal_static_spotify_FingerprintChallengeUnion_descriptor =
      getDescriptor().getMessageTypes().get(9);
    internal_static_spotify_FingerprintChallengeUnion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_FingerprintChallengeUnion_descriptor,
        new java.lang.String[] { "Grain", "HmacRipemd", });
    internal_static_spotify_FingerprintGrainChallenge_descriptor =
      getDescriptor().getMessageTypes().get(10);
    internal_static_spotify_FingerprintGrainChallenge_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_FingerprintGrainChallenge_descriptor,
        new java.lang.String[] { "Kek", });
    internal_static_spotify_FingerprintHmacRipemdChallenge_descriptor =
      getDescriptor().getMessageTypes().get(11);
    internal_static_spotify_FingerprintHmacRipemdChallenge_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_FingerprintHmacRipemdChallenge_descriptor,
        new java.lang.String[] { "Challenge", });
    internal_static_spotify_PoWChallengeUnion_descriptor =
      getDescriptor().getMessageTypes().get(12);
    internal_static_spotify_PoWChallengeUnion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_PoWChallengeUnion_descriptor,
        new java.lang.String[] { "HashCash", });
    internal_static_spotify_PoWHashCashChallenge_descriptor =
      getDescriptor().getMessageTypes().get(13);
    internal_static_spotify_PoWHashCashChallenge_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_PoWHashCashChallenge_descriptor,
        new java.lang.String[] { "Prefix", "Length", "Target", });
    internal_static_spotify_CryptoChallengeUnion_descriptor =
      getDescriptor().getMessageTypes().get(14);
    internal_static_spotify_CryptoChallengeUnion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_CryptoChallengeUnion_descriptor,
        new java.lang.String[] { "Shannon", "Rc4Sha1Hmac", });
    internal_static_spotify_CryptoShannonChallenge_descriptor =
      getDescriptor().getMessageTypes().get(15);
    internal_static_spotify_CryptoShannonChallenge_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_CryptoShannonChallenge_descriptor,
        new java.lang.String[] { });
    internal_static_spotify_CryptoRc4Sha1HmacChallenge_descriptor =
      getDescriptor().getMessageTypes().get(16);
    internal_static_spotify_CryptoRc4Sha1HmacChallenge_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_CryptoRc4Sha1HmacChallenge_descriptor,
        new java.lang.String[] { });
    internal_static_spotify_UpgradeRequiredMessage_descriptor =
      getDescriptor().getMessageTypes().get(17);
    internal_static_spotify_UpgradeRequiredMessage_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_UpgradeRequiredMessage_descriptor,
        new java.lang.String[] { "UpgradeSignedPart", "Signature", "HttpSuffix", });
    internal_static_spotify_APLoginFailed_descriptor =
      getDescriptor().getMessageTypes().get(18);
    internal_static_spotify_APLoginFailed_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_APLoginFailed_descriptor,
        new java.lang.String[] { "ErrorCode", "RetryDelay", "Expiry", "ErrorDescription", });
    internal_static_spotify_ClientResponsePlaintext_descriptor =
      getDescriptor().getMessageTypes().get(19);
    internal_static_spotify_ClientResponsePlaintext_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_ClientResponsePlaintext_descriptor,
        new java.lang.String[] { "LoginCryptoResponse", "PowResponse", "CryptoResponse", });
    internal_static_spotify_LoginCryptoResponseUnion_descriptor =
      getDescriptor().getMessageTypes().get(20);
    internal_static_spotify_LoginCryptoResponseUnion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_LoginCryptoResponseUnion_descriptor,
        new java.lang.String[] { "DiffieHellman", });
    internal_static_spotify_LoginCryptoDiffieHellmanResponse_descriptor =
      getDescriptor().getMessageTypes().get(21);
    internal_static_spotify_LoginCryptoDiffieHellmanResponse_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_LoginCryptoDiffieHellmanResponse_descriptor,
        new java.lang.String[] { "Hmac", });
    internal_static_spotify_PoWResponseUnion_descriptor =
      getDescriptor().getMessageTypes().get(22);
    internal_static_spotify_PoWResponseUnion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_PoWResponseUnion_descriptor,
        new java.lang.String[] { "HashCash", });
    internal_static_spotify_PoWHashCashResponse_descriptor =
      getDescriptor().getMessageTypes().get(23);
    internal_static_spotify_PoWHashCashResponse_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_PoWHashCashResponse_descriptor,
        new java.lang.String[] { "HashSuffix", });
    internal_static_spotify_CryptoResponseUnion_descriptor =
      getDescriptor().getMessageTypes().get(24);
    internal_static_spotify_CryptoResponseUnion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_CryptoResponseUnion_descriptor,
        new java.lang.String[] { "Shannon", "Rc4Sha1Hmac", });
    internal_static_spotify_CryptoShannonResponse_descriptor =
      getDescriptor().getMessageTypes().get(25);
    internal_static_spotify_CryptoShannonResponse_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_CryptoShannonResponse_descriptor,
        new java.lang.String[] { "Dummy", });
    internal_static_spotify_CryptoRc4Sha1HmacResponse_descriptor =
      getDescriptor().getMessageTypes().get(26);
    internal_static_spotify_CryptoRc4Sha1HmacResponse_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_spotify_CryptoRc4Sha1HmacResponse_descriptor,
        new java.lang.String[] { "Dummy", });
  }

  // @@protoc_insertion_point(outer_class_scope)
}
