From 1400ea2b4c26f9ad660edda4d2f386d00dff34e6 Mon Sep 17 00:00:00 2001 From: siritami <102145692+FiorenMas@users.noreply.github.com> Date: Thu, 25 Jun 2026 20:40:21 +0700 Subject: [PATCH] Add support direct download from Google Play --- .github/actions/preparing/action.yml | 37 +- .github/workflows/manual-patch.yml | 4 + README.md | 2 + src/build/DeRevanced.sh | 6 +- src/build/{ => helper}/apps.json | 0 src/build/helper/ggplay_dl/ggplay_dl.py | 698 ++++++++++++++++++++ src/build/helper/ggplay_dl/ggplay_pb2.py | 633 ++++++++++++++++++ src/build/helper/ggplay_dl/requirements.txt | 3 + src/build/utils.sh | 61 +- src/etc/cf_warp.sh | 19 - 10 files changed, 1436 insertions(+), 27 deletions(-) rename src/build/{ => helper}/apps.json (100%) create mode 100644 src/build/helper/ggplay_dl/ggplay_dl.py create mode 100644 src/build/helper/ggplay_dl/ggplay_pb2.py create mode 100644 src/build/helper/ggplay_dl/requirements.txt delete mode 100644 src/etc/cf_warp.sh diff --git a/.github/actions/preparing/action.yml b/.github/actions/preparing/action.yml index a943831..f42aedc 100644 --- a/.github/actions/preparing/action.yml +++ b/.github/actions/preparing/action.yml @@ -4,6 +4,18 @@ inputs: description: 'Install Bouncy Castle provider for BKS keystore' required: false default: 'false' + install_usque: + description: 'Install usque for Cloudflare WARP proxy' + required: false + default: 'false' + install_python_deps: + description: 'Install Python dependencies for Google Play downloader' + required: false + default: 'false' + python_requirements: + description: 'Path to Python requirements.txt file' + required: false + default: '' runs: using: "composite" steps: @@ -12,6 +24,19 @@ runs: with: distribution: 'zulu' java-version: '21' + - name: Setup usque + if: inputs.install_usque == 'true' + shell: bash + run: | + wget -q -O usque.zip https://github.com/Diniboy1123/usque/releases/download/v4.2.0/usque_4.2.0_linux_amd64.zip + unzip -o usque.zip -d usque + chmod +x usque/usque + sudo mv usque/usque /usr/local/bin/usque + rm -rf usque usque.zip + usque register --accept-tos + usque socks -b 127.0.0.1 -p 9099 & + sleep 5 + curl -x socks5://127.0.0.1:9099 -s -o /dev/null -w "%{http_code}" https://www.google.com && echo "[+] usque SOCKS5 proxy is ready" || echo "[-] usque proxy failed" - name: Start FlareSolverr shell: bash run: | @@ -24,6 +49,15 @@ runs: fi sleep 2 done + - name: Set up Python + if: inputs.install_python_deps == 'true' + uses: actions/setup-python@v6 + with: + python-version: '3.x' + - name: Install Python dependencies + if: inputs.install_python_deps == 'true' + shell: bash + run: pip install -r ${{ inputs.python_requirements }} - name: Install Bouncy Castle provider for BKS keystore if: inputs.install_bouncy_castle == 'true' shell: bash @@ -36,6 +70,3 @@ runs: echo "security.provider.$((LAST_PROV+1))=org.bouncycastle.jce.provider.BouncyCastleProvider" \ | sudo tee -a "$JAVA_HOME/conf/security/java.security" echo "[+] Bouncy Castle registered as provider #$((LAST_PROV+1))" -# - name: Setup Cloudflare Warp -# shell: bash -# run: bash src/etc/cf_warp.sh diff --git a/.github/workflows/manual-patch.yml b/.github/workflows/manual-patch.yml index 0c8e8dd..682f657 100644 --- a/.github/workflows/manual-patch.yml +++ b/.github/workflows/manual-patch.yml @@ -106,6 +106,10 @@ jobs: uses: actions/checkout@v6.0.2 - name: Preparing to patch uses: ./.github/actions/preparing +# with: +# install_python_deps: 'true' +# install_usque: 'true' +# python_requirements: 'src/build/helper/ggplay_dl/requirements.txt' - name: Check github connection id: check-gh-derv run: bash src/etc/connection.sh diff --git a/README.md b/README.md index 7812f89..85df851 100644 --- a/README.md +++ b/README.md @@ -1008,6 +1008,8 @@ Web version: +[AuroraStore](https://gitlab.com/AuroraOSS/AuroraStore) - [GPL-3.0](https://gitlab.com/AuroraOSS/AuroraStore/-/blob/master/LICENSE) + [Markdown Badges](https://github.com/Ileriayo/markdown-badges) - [MIT](https://github.com/Ileriayo/markdown-badges/blob/master/LICENSE) [pup](https://github.com/ericchiang/pup) - [MIT](https://github.com/ericchiang/pup/blob/master/LICENSE) diff --git a/src/build/DeRevanced.sh b/src/build/DeRevanced.sh index c935a2e..e62edfe 100644 --- a/src/build/DeRevanced.sh +++ b/src/build/DeRevanced.sh @@ -89,9 +89,9 @@ derevanced_dl(){ split_editor "photomath" "photomath" patch "photomath" "derevanced" "morphe" # Patch Strava: - get_patches_key "strava-derevanced" - get_apkpure "com.strava" "strava-arm64-v8a" "bundle" - patch "strava-arm64-v8a" "derevanced" "morphe" + #get_patches_key "strava-derevanced" + #get_apk_chplay "com.strava" "strava-arm64-v8a" + #patch "strava-arm64-v8a" "derevanced" "morphe" } 7() { derevanced_dl diff --git a/src/build/apps.json b/src/build/helper/apps.json similarity index 100% rename from src/build/apps.json rename to src/build/helper/apps.json diff --git a/src/build/helper/ggplay_dl/ggplay_dl.py b/src/build/helper/ggplay_dl/ggplay_dl.py new file mode 100644 index 0000000..cb41d8a --- /dev/null +++ b/src/build/helper/ggplay_dl/ggplay_dl.py @@ -0,0 +1,698 @@ +#!/usr/bin/env python3 +# +# Rewritten from: https://gitlab.com/AuroraOSS/AuroraStore +# Licensed under GNU General Public License v3.0 +# +""" +Usage: + python3 ggplay_dl.py [--dispenser ] +""" + +import argparse +import hashlib +import json +import os +import random +import sys +import time +import base64 + +import requests +from google.protobuf import descriptor as _descriptor + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from ggplay_pb2 import ( + AndroidCheckinRequest, + AndroidCheckinProto, + AndroidBuildProto, + AndroidCheckinResponse, + DeviceConfigurationProto, + UploadDeviceConfigRequest, + ResponseWrapper, +) + +DISPENSER_URL = "https://auroraoss.com/api/auth" + +URL_BASE = "https://android.clients.google.com" +URL_FDFE = f"{URL_BASE}/fdfe" +URL_CHECK_IN = f"{URL_BASE}/checkin" +URL_AUTH = f"{URL_BASE}/auth" +URL_UPLOAD_DEVICE_CONFIG = f"{URL_FDFE}/uploadDeviceConfig" +URL_DETAILS = f"{URL_FDFE}/details" +URL_PURCHASE = f"{URL_FDFE}/purchase" +URL_DELIVERY = f"{URL_FDFE}/delivery" +URL_ACQUIRE = f"{URL_FDFE}/acquire" + +DEVICE_PROPERTIES = { + "UserReadableName": "Google Pixel 9a", + "Build.DEVICE": "tegu", + "Build.MODEL": "Pixel 9a", + "Build.MANUFACTURER": "Google", + "Build.BRAND": "google", + "Build.PRODUCT": "tegu", + "Build.HARDWARE": "tegu", + "Build.FINGERPRINT": "google/tegu/tegu:15/BD4A.250405.003/13238919:user/release-keys", + "Build.VERSION.SDK_INT": "35", + "Build.VERSION.RELEASE": "15", + "Build.ID": "BD4A.250405.003", + "Build.BOOTLOADER": "tegu-16.0-13238451", + "Build.RADIO": "g5300t-241101-241226-B-12850354", + "GSF.version": "251333035", + "Vending.version": "84582130", + "Vending.versionString": "45.8.21-31 [0] [PR] 747433787", + "Client": "android-google", + "SimOperator": "38", + "CellOperator": "310", + "Screen.Density": "420", + "Screen.Width": "1080", + "Screen.Height": "2424", + "Platforms": "arm64-v8a", + "Features": "android.hardware.bluetooth,android.hardware.camera,android.hardware.location,android.hardware.microphone,android.hardware.nfc,android.hardware.screen.landscape,android.hardware.screen.portrait,android.hardware.telephony,android.hardware.touchscreen,android.hardware.wifi", + "Locales": "en_US", + "SharedLibraries": "", + "TouchScreen": "3", + "Keyboard": "1", + "Navigation": "1", + "ScreenLayout": "2", + "HasHardKeyboard": "false", + "HasFiveWayNavigation": "false", + "GL.Version": "196610", + "GL.Extensions": "", + "TimeZone": "UTC-0", + "Roaming": "mobile-notroaming", +} + + +def build_device_config(): + config = DeviceConfigurationProto() + config.touchScreen = int(DEVICE_PROPERTIES["TouchScreen"]) + config.keyboard = int(DEVICE_PROPERTIES["Keyboard"]) + config.navigation = int(DEVICE_PROPERTIES["Navigation"]) + config.screenLayout = int(DEVICE_PROPERTIES["ScreenLayout"]) + config.hasHardKeyboard = DEVICE_PROPERTIES["HasHardKeyboard"] == "true" + config.hasFiveWayNavigation = DEVICE_PROPERTIES["HasFiveWayNavigation"] == "true" + config.screenDensity = int(DEVICE_PROPERTIES["Screen.Density"]) + config.glEsVersion = int(DEVICE_PROPERTIES["GL.Version"]) + config.screenWidth = int(DEVICE_PROPERTIES["Screen.Width"]) + config.screenHeight = int(DEVICE_PROPERTIES["Screen.Height"]) + + for platform in DEVICE_PROPERTIES["Platforms"].split(","): + config.nativePlatform.append(platform.strip()) + + for feature in DEVICE_PROPERTIES["Features"].split(","): + if feature.strip(): + config.systemAvailableFeature.append(feature.strip()) + + for locale in DEVICE_PROPERTIES["Locales"].split(","): + if locale.strip(): + config.systemSupportedLocale.append(locale.strip()) + + for lib in DEVICE_PROPERTIES["SharedLibraries"].split(","): + if lib.strip(): + config.systemSharedLibrary.append(lib.strip()) + + for ext in DEVICE_PROPERTIES["GL.Extensions"].split(","): + if ext.strip(): + config.glExtension.append(ext.strip()) + + return config + + +def build_checkin_request(): + build = AndroidBuildProto() + build.device = DEVICE_PROPERTIES["Build.DEVICE"] + build.model = DEVICE_PROPERTIES["Build.MODEL"] + build.manufacturer = DEVICE_PROPERTIES["Build.MANUFACTURER"] + build.product = DEVICE_PROPERTIES["Build.PRODUCT"] + build.buildProduct = DEVICE_PROPERTIES["Build.PRODUCT"] + build.client = DEVICE_PROPERTIES["Client"] + build.id = DEVICE_PROPERTIES["Build.ID"] + build.bootloader = DEVICE_PROPERTIES["Build.BOOTLOADER"] + build.radio = DEVICE_PROPERTIES["Build.RADIO"] + build.timestamp = int(time.time() * 1000) + build.sdkVersion = int(DEVICE_PROPERTIES["Build.VERSION.SDK_INT"]) + build.googleServices = int(DEVICE_PROPERTIES["GSF.version"]) + + checkin = AndroidCheckinProto() + checkin.build.CopyFrom(build) + checkin.lastCheckinMsec = 0 + checkin.cellOperator = DEVICE_PROPERTIES["CellOperator"] + checkin.simOperator = DEVICE_PROPERTIES["SimOperator"] + checkin.roaming = DEVICE_PROPERTIES["Roaming"] + checkin.userNumber = 0 + + device_config = build_device_config() + + request = AndroidCheckinRequest() + request.checkin.CopyFrom(checkin) + request.timeZone = DEVICE_PROPERTIES["TimeZone"] + request.locale = "en-US" + request.version = 3 + request.deviceConfiguration.CopyFrom(device_config) + + return request.SerializeToString() + + +def build_upload_device_config_request(): + request = UploadDeviceConfigRequest() + request.deviceConfiguration.CopyFrom(build_device_config()) + request.manufacturer = DEVICE_PROPERTIES["Build.MANUFACTURER"] + return request.SerializeToString() + + +def build_acquire_request(package_name, version_code, offer_type): + def encode_varint(value): + bits = value & 0x7f + value >>= 7 + result = b"" + while value: + result += bytes([0x80 | bits]) + bits = value & 0x7f + value >>= 7 + result += bytes([bits]) + return result + + def encode_field(field_number, wire_type, data): + tag = (field_number << 3) | wire_type + return encode_varint(tag) + data + + def encode_varint_field(field_number, value): + return encode_field(field_number, 0, encode_varint(value)) + + def encode_string_field(field_number, value): + encoded = value.encode("utf-8") + return encode_field(field_number, 2, encode_varint(len(encoded)) + encoded) + + def encode_length_delimited_field(field_number, sub_message_bytes): + return encode_field(field_number, 2, encode_varint(len(sub_message_bytes)) + sub_message_bytes) + + payload = b"" + payload += encode_varint_field(2, 1) + payload += encode_varint_field(3, 3) + payload += encode_string_field(4, package_name) + + package = b"" + package += encode_length_delimited_field(1, payload) + package += encode_varint_field(2, 1) + + version = b"" + version += encode_varint_field(1, version_code) + version += encode_varint_field(3, 0) + + msg30 = b"" + msg30 += encode_varint_field(1, 2) + msg30 += encode_varint_field(2, 0) + + nonce_bytes = bytes(random.getrandbits(8) for _ in range(256)) + nonce = base64.urlsafe_b64encode(nonce_bytes).rstrip(b"=").decode("ascii") + + request = b"" + request += encode_length_delimited_field(1, package) + request += encode_length_delimited_field(2, version) + request += encode_varint_field(15, 0) + request += encode_varint_field(16, offer_type) + request += encode_string_field(20, f"nonce={nonce}") + request += encode_varint_field(25, 2) + request += encode_length_delimited_field(30, msg30) + + return request + + +FLARESOLVERR_URL = "http://localhost:8191/v1" +SOCKS5_PROXY = "socks5://127.0.0.1:9099" + + +def _detect_socks5(): + import socket + try: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(2) + s.connect(("127.0.0.1", 9099)) + s.close() + return SOCKS5_PROXY + except Exception: + return None + + +class GooglePlaySession: + + def __init__(self, dispenser_url=None): + self.dispenser_url = dispenser_url or DISPENSER_URL + self.flaresolverr_url = self._detect_flaresolverr() + self.socks5_proxy = _detect_socks5() + self.email = None + self.aas_token = None + self.gsf_id = None + self.auth_token = None + self.device_checkin_consistency_token = None + self.device_config_token = None + self.session = requests.Session() + if self.socks5_proxy: + import socks + self.session.proxies = { + "http": self.socks5_proxy, + "https": self.socks5_proxy, + } + print(f"[+] Using SOCKS5 proxy: {self.socks5_proxy}", file=sys.stderr) + self.session.headers.update({ + "User-Agent": "com.aurora.store-4.8.3-75", + }) + + def _get_auth_headers(self): + headers = { + "app": "com.google.android.gms", + "User-Agent": f"GoogleAuth/1.4 ({DEVICE_PROPERTIES['Build.DEVICE']} {DEVICE_PROPERTIES['Build.ID']})", + } + if self.gsf_id: + headers["device"] = self.gsf_id + return headers + + def _get_default_headers(self): + ua = ( + f"Android-Finsky/{DEVICE_PROPERTIES['Vending.versionString']} " + f"(api=3,versionCode={DEVICE_PROPERTIES['Vending.version']}," + f"sdk={DEVICE_PROPERTIES['Build.VERSION.SDK_INT']}," + f"device={DEVICE_PROPERTIES['Build.DEVICE']}," + f"hardware={DEVICE_PROPERTIES['Build.HARDWARE']}," + f"product={DEVICE_PROPERTIES['Build.PRODUCT']}," + f"platformVersionRelease={DEVICE_PROPERTIES['Build.VERSION.RELEASE']}," + f"model={DEVICE_PROPERTIES['Build.MODEL']}," + f"buildId={DEVICE_PROPERTIES['Build.ID']}," + f"isWideScreen=0,supportedAbis={DEVICE_PROPERTIES['Platforms']})" + ) + headers = { + "Authorization": f"Bearer {self.auth_token}", + "User-Agent": ua, + "X-DFE-Device-Id": self.gsf_id, + "Accept-Language": "en-US", + "X-DFE-Encoded-Targets": ( + "CAESN/qigQYC2AMBFfUbyA7SM5Ij/CvfBoIDgxHqGP8R3xzIBvoQtBKFDZ4HAY4FrwSVMasHBOO2Q8akgYRAQECAQO7AQEpKZ0CnwECAwRrAQYBr9PPAoK7sQMBAQMCBAkIDAgBAwEDBAICBAUZEgMEBAMLAQEBBQEBAcYBARYED+cBfS8CHQEKkAEMMxcBIQoUDwYHIjd3DQ4MFk0JWGYZEREYAQOLAYEBFDMIEYMBAgICAgICOxkCD18LGQKEAcgDBIQBAgGLARkYCy8oBTJlBCUocxQn0QUBDkkGxgNZQq0BZSbeAmIDgAEBOgGtAaMCDAOQAZ4BBIEBKUtQUYYBQscDDxPSARA1oAEHAWmnAsMB2wFyywGLAxol+wImlwOOA80CtwN26A0WjwJVbQEJPAH+BRDeAfkHK/ABASEBCSAaHQemAzkaRiu2Ad8BdXeiAwEBGBUBBN4LEIABK4gB2AFLfwECAdoENq0CkQGMBsIBiQEtiwGgA1zyAUQ4uwS8AwhsvgPyAcEDF27vApsBHaICGhl3GSKxAR8MC6cBAgItmQYG9QIeywLvAeYBDArLAh8HASI4ELICDVmVBgsY/gHWARtcAsMBpALiAdsBA7QBpAJmIArpByn0AyAKBwHTARIHAX8D+AMBcRIBBbEDmwUBMacCHAciNp0BAQF0OgQLJDuSAh54kwFSP0eeAQQ4M5EBQgMEmwFXywFo0gFyWwMcapQBBugBPUW2AVgBKmy3AR6PAbMBGQxrUJECvQR+8gFoWDsYgQNwRSczBRXQAgtRswEW0ALMAREYAUEBIG6yATYCRE8OxgER8gMBvQEDRkwLc8MBTwHZAUOnAXiiBakDIbYBNNcCIUmuArIBSakBrgFHKs0EgwV/G3AD0wE6LgECtQJ4xQFwFbUCjQPkBS6vAQqEAUZF3QIM9wEhCoYCQhXsBCyZArQDugIziALWAdIBlQHwBdUErQE6qQaSA4EEIvYBHir9AQVLmgMCApsCKAwHuwgrENsBAjNYswEVmgIt7QJnN4wDEnta+wGfAcUBxgEtEFXQAQWdAUAeBcwBAQM7rAEJATJ0LENrdh73A6UBhAE+qwEeASxLZUMhDREuH0CGARbd7K0GlQo" + ), + "X-DFE-Phenotype": ( + "H4sIAAAAAAAAB3OO3KjMAAA0KRNuWXukBkBQkAJ2MhgAZb5u2GCwQZbCH_EJ77QHmgvtDtbv-Z9_H63zXXU0NVPB1odlyGy7751Q3CitlPDvFd8lxhz3tpNmz7P92CFw73zdHU2Ie0Ad2kmR8lxhiErTFLt3RPGfJQHSDy7Clw0bg8kqf2owLokN4SecJTLoSwBnzQSd652_MOf2d1vKBNVedzg4ciPoLz2mQ8efGAgYeLou-l-PXn_7Sa1MfhHuySxt-4esulEDp8Sbq54CPPKjpANW-lkU2IZ0F92LBI-ukCKSptqeq1eXU96LD9nZfhKHdtjSwJqUm_2r6pMHOxk01saVanmNopjX3YxQafC4iC6T55aRbC8nTI98AF_kItIQAJb5EQxnKTO7TZDWnr01HVPxelb9A2OWX6poidMWl16K54kcu_jhXw-JSBQkVcD_fPsLSZu6joIBAAA" + ), + "X-DFE-Client-Id": "am-android-google", + "X-DFE-Network-Type": "4", + "X-DFE-Content-Filters": "", + "X-Limit-Ad-Tracking-Enabled": "false", + "X-Ad-Id": "", + "X-DFE-UserLanguages": "en_US", + "X-DFE-Request-Params": "timeoutMs=4000", + } + if self.device_checkin_consistency_token: + headers["X-DFE-Device-Checkin-Consistency-Token"] = self.device_checkin_consistency_token + if self.device_config_token: + headers["X-DFE-Device-Config-Token"] = self.device_config_token + return headers + + def _get_auth_params(self): + params = { + "androidId": self.gsf_id, + "sdk_version": DEVICE_PROPERTIES["Build.VERSION.SDK_INT"], + "Email": self.email, + "google_play_services_version": "251333035", + "device_country": "us", + "lang": "en", + "callerSig": "38918a453d07199354f8b19af05ec6562ced5788", + } + return params + + def _get_token_params(self): + params = self._get_auth_params() + params.update({ + "app": "com.android.vending", + "client_sig": "38918a453d07199354f8b19af05ec6562ced5788", + "callerPkg": "com.google.android.gms", + "Token": self.aas_token, + "oauth2_foreground": "1", + "token_request_options": "CAA4AVAB", + "check_email": "1", + "system_partition": "1", + "droidguard_results": "null", + "service": "oauth2:https://www.googleapis.com/auth/googleplay", + }) + return params + + def _detect_flaresolverr(self): + try: + resp = requests.get(FLARESOLVERR_URL.replace("/v1", "/"), timeout=3) + if resp.status_code == 200: + print(f"[+] FlareSolverr detected at {FLARESOLVERR_URL}", file=sys.stderr) + return FLARESOLVERR_URL + except Exception: + pass + return None + + def _fs_get_cookies(self): + for url in [self.dispenser_url, "https://auroraoss.com/"]: + try: + resp = requests.post( + self.flaresolverr_url, + json={"cmd": "request.get", "url": url, "maxTimeout": 60000, "returnOnlyCookies": True}, + timeout=90, + ) + resp.raise_for_status() + data = resp.json() + if data.get("status") == "ok": + cookies = {} + for c in data.get("solution", {}).get("cookies", []): + cookies[c["name"]] = c["value"] + ua = data.get("solution", {}).get("userAgent", "") + if cookies: + return cookies, ua + except Exception as e: + print(f"[!] FlareSolverr failed for {url}: {e}", file=sys.stderr) + return {}, "" + + def _post_dispenser(self, url, json_data): + headers = { + "Content-Type": "application/json", + "Accept": "application/json, text/plain, */*", + "Accept-Language": "en-US,en;q=0.9", + "Origin": "https://auroraoss.com", + "Referer": "https://auroraoss.com/", + } + proxies = {} + if self.socks5_proxy: + proxies = {"https": self.socks5_proxy, "http": self.socks5_proxy} + resp = self.session.post(url, json=json_data, headers=headers, proxies=proxies, timeout=30) + if resp.status_code == 403: + if self.flaresolverr_url: + print(f"[!] Direct request blocked (403), trying FlareSolverr...", file=sys.stderr) + cookies, fs_ua = self._fs_get_cookies() + if cookies: + print(f"[+] Got {len(cookies)} cookies from FlareSolverr", file=sys.stderr) + resp = self.session.post(url, json=json_data, headers=headers, cookies=cookies, proxies=proxies, timeout=30) + resp.raise_for_status() + return resp.json() + + def step1_get_dispenser_credentials(self): + print("[+] Step 1: Getting dispenser credentials...", file=sys.stderr) + data = self._post_dispenser(self.dispenser_url, DEVICE_PROPERTIES) + self.email = data.get("email") + self.auth_token = data.get("authToken") or data.get("auth") + if not self.email or not self.auth_token: + raise Exception(f"Dispenser returned invalid data: {data}") + print(f"[+] Got credentials for: {self.email}", file=sys.stderr) + + def step2_checkin(self): + print("[+] Step 2: Performing checkin...", file=sys.stderr) + request_bytes = build_checkin_request() + headers = self._get_auth_headers() + headers["Content-Type"] = "application/x-protobuffer" + headers["Host"] = "android.clients.google.com" + + resp = self.session.post(URL_CHECK_IN, data=request_bytes, headers=headers, timeout=30) + resp.raise_for_status() + + response = AndroidCheckinResponse() + response.ParseFromString(resp.content) + + self.gsf_id = format(response.androidId, "x") + self.device_checkin_consistency_token = response.deviceCheckinConsistencyToken + print(f"[+] GSF ID: {self.gsf_id}", file=sys.stderr) + + def step3_upload_device_config(self): + print("[+] Step 3: Uploading device config...", file=sys.stderr) + request_bytes = build_upload_device_config_request() + headers = self._get_default_headers() + headers["Content-Type"] = "application/x-protobuffer" + + resp = self.session.post(URL_UPLOAD_DEVICE_CONFIG, data=request_bytes, headers=headers, timeout=30) + resp.raise_for_status() + + wrapper = ResponseWrapper() + wrapper.ParseFromString(resp.content) + + if wrapper.HasField("payload"): + payload = wrapper.payload + if payload.HasField("uploadDeviceConfigResponse"): + self.device_config_token = payload.uploadDeviceConfigResponse.uploadDeviceConfigToken + + print(f"[+] Device config token: {self.device_config_token[:30]}..." if self.device_config_token else "[!] No device config token", file=sys.stderr) + + def step4_generate_token(self): + print("[+] Step 4: Generating OAuth token...", file=sys.stderr) + headers = self._get_auth_headers() + headers["app"] = "com.google.android.gms" + params = self._get_token_params() + + resp = self.session.post(URL_AUTH, data=params, headers=headers, timeout=30) + resp.raise_for_status() + + response_text = resp.text + auth_token = None + for line in response_text.split("\n"): + if line.startswith("Auth="): + auth_token = line[5:].strip() + break + + if not auth_token: + for part in response_text.split("&"): + if part.startswith("Auth="): + auth_token = part[5:].strip() + break + + if not auth_token: + raise Exception(f"Failed to generate OAuth token. Response: {response_text[:500]}") + + self.auth_token = auth_token + print(f"[+] OAuth token obtained", file=sys.stderr) + + def step5_get_app_details(self, package_name): + print(f"[+] Step 5: Getting details for {package_name}...", file=sys.stderr) + headers = self._get_default_headers() + params = {"doc": package_name} + + resp = self.session.get(URL_DETAILS, params=params, headers=headers, timeout=30) + resp.raise_for_status() + + wrapper = ResponseWrapper() + wrapper.ParseFromString(resp.content) + + if not wrapper.HasField("payload") or not wrapper.payload.HasField("detailsResponse"): + raise Exception("No detailsResponse in payload") + + details = wrapper.payload.detailsResponse + if not details.HasField("item"): + raise Exception("No item in detailsResponse") + + item = details.item + version_code = 0 + offer_type = 1 + + if item.HasField("details") and item.details.HasField("appDetails"): + version_code = item.details.appDetails.versionCode + + if len(item.offer) > 0: + offer_type = item.offer[0].offerType + + if version_code == 0: + raise Exception(f"Could not find versionCode for {package_name}") + + print(f"[+] versionCode={version_code}, offerType={offer_type}", file=sys.stderr) + return version_code, offer_type + + def step6_purchase(self, package_name, version_code, offer_type): + print(f"[+] Step 6: Purchasing {package_name} v{version_code}...", file=sys.stderr) + + try: + acquire_bytes = build_acquire_request(package_name, version_code, offer_type) + headers = self._get_default_headers() + headers["Content-Type"] = "application/x-protobuf" + self.session.post(URL_ACQUIRE, data=acquire_bytes, headers=headers, timeout=30) + except Exception: + print("[!] Acquire failed (non-critical), continuing...", file=sys.stderr) + + headers = self._get_default_headers() + params = { + "ot": str(offer_type), + "doc": package_name, + "vc": str(version_code), + } + resp = self.session.post(URL_PURCHASE, params=params, headers=headers, timeout=30) + resp.raise_for_status() + + wrapper = ResponseWrapper() + wrapper.ParseFromString(resp.content) + + delivery_token = "" + if wrapper.HasField("payload") and wrapper.payload.HasField("buyResponse"): + delivery_token = wrapper.payload.buyResponse.encodedDeliveryToken + + if not delivery_token: + raise Exception("Failed to get delivery token") + + print(f"[+] Delivery token obtained", file=sys.stderr) + + headers = self._get_default_headers() + params = { + "ot": str(offer_type), + "doc": package_name, + "vc": str(version_code), + "dtok": delivery_token, + } + resp = self.session.get(URL_DELIVERY, params=params, headers=headers, timeout=30) + resp.raise_for_status() + + wrapper = ResponseWrapper() + wrapper.ParseFromString(resp.content) + + if not wrapper.HasField("payload") or not wrapper.payload.HasField("deliveryResponse"): + raise Exception("No deliveryResponse in payload") + + delivery = wrapper.payload.deliveryResponse + + if delivery.status != 1: + error_map = {2: "AppNotSupported", 3: "AppNotPurchased", 7: "AppRemoved", 9: "AppNotSupported"} + error_name = error_map.get(delivery.status, f"Unknown({delivery.status})") + raise Exception(f"Delivery failed with status {delivery.status}: {error_name}") + + if not delivery.HasField("appDeliveryData"): + raise Exception("No appDeliveryData in delivery response") + + app_data = delivery.appDeliveryData + download_url = app_data.downloadUrl + download_size = app_data.downloadSize + sha256 = None + if app_data.sha256: + try: + sha256 = base64.urlsafe_b64decode(app_data.sha256 + "==").hex() + except Exception: + sha256 = app_data.sha256 + + splits = [] + for split in app_data.splitDeliveryData: + splits.append({ + "name": split.name, + "downloadUrl": split.downloadUrl, + "downloadSize": split.downloadSize, + }) + + if splits: + print(f"[+] Download URL obtained (size={download_size}, splits={len(splits)})", file=sys.stderr) + else: + print(f"[+] Download URL obtained (size={download_size})", file=sys.stderr) + return download_url, download_size, sha256, splits + + def build_session(self): + self.step1_get_dispenser_credentials() + self.step2_checkin() + + def _download_file(self, url, dest): + resp = self.session.get(url, stream=True, timeout=120) + resp.raise_for_status() + sha256_hash = hashlib.sha256() + total = 0 + with open(dest, "wb") as f: + for chunk in resp.iter_content(chunk_size=8192): + if chunk: + f.write(chunk) + sha256_hash.update(chunk) + total += len(chunk) + return total, sha256_hash.hexdigest() + + def download_apk(self, package_name, output_path): + self.build_session() + version_code, offer_type = self.step5_get_app_details(package_name) + download_url, download_size, expected_sha256, splits = self.step6_purchase( + package_name, version_code, offer_type + ) + + is_split = len(splits) > 0 + + if is_split: + import zipfile + import tempfile + print(f"[+] Split APK detected ({len(splits)} splits)", file=sys.stderr) + tmp_dir = tempfile.mkdtemp() + base_apk = os.path.join(tmp_dir, "base.apk") + print(f"[+] Downloading base APK...", file=sys.stderr) + total, _ = self._download_file(download_url, base_apk) + print(f"[+] Downloaded base APK ({total} bytes)", file=sys.stderr) + for i, split in enumerate(splits): + split_name = split["name"] + split_dest = os.path.join(tmp_dir, split_name) + print(f"[+] Downloading split {i+1}/{len(splits)}: {split_name}...", file=sys.stderr) + total, _ = self._download_file(split["downloadUrl"], split_dest) + print(f"[+] Downloaded {split_name} ({total} bytes)", file=sys.stderr) + print(f"[+] Packaging splits into {output_path}...", file=sys.stderr) + with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zf: + zf.write(base_apk, "base.apk") + for split in splits: + zf.write(os.path.join(tmp_dir, split["name"]), split["name"]) + total_size = os.path.getsize(output_path) + for f in os.listdir(tmp_dir): + os.remove(os.path.join(tmp_dir, f)) + os.rmdir(tmp_dir) + print(f"[+] Packaged {len(splits)+1} APKs into {output_path} ({total_size} bytes)", file=sys.stderr) + result = { + "success": True, + "package": package_name, + "versionCode": version_code, + "offerType": offer_type, + "size": total_size, + "sha256": "", + "isSplit": True, + "outputPath": output_path, + } + print(json.dumps(result)) + return output_path + + print(f"[+] Downloading APK to {output_path}...", file=sys.stderr) + resp = self.session.get(download_url, stream=True, timeout=120) + resp.raise_for_status() + + sha256_hash = hashlib.sha256() + total = 0 + with open(output_path, "wb") as f: + for chunk in resp.iter_content(chunk_size=8192): + if chunk: + f.write(chunk) + sha256_hash.update(chunk) + total += len(chunk) + + actual_sha256 = sha256_hash.hexdigest() + if expected_sha256 and actual_sha256 != expected_sha256: + print(f"[!] SHA256 mismatch: expected {expected_sha256}, got {actual_sha256}", file=sys.stderr) + os.remove(output_path) + raise Exception("SHA256 verification failed") + + print(f"[+] Downloaded {total} bytes to {output_path}", file=sys.stderr) + if expected_sha256: + print(f"[+] SHA256 verified: {actual_sha256}", file=sys.stderr) + + result = { + "success": True, + "package": package_name, + "versionCode": version_code, + "offerType": offer_type, + "downloadUrl": download_url, + "size": total, + "sha256": actual_sha256, + "isSplit": False, + "outputPath": output_path, + } + print(json.dumps(result)) + return output_path + + +def main(): + parser = argparse.ArgumentParser(description="Download APK from Google Play Store") + parser.add_argument("package_name", help="Android package name (e.g., com.android.chrome)") + parser.add_argument("output_path", help="Output file path for the APK") + parser.add_argument("--dispenser", help="Dispenser URL (default: AuroraStore dispenser)") + args = parser.parse_args() + + try: + session = GooglePlaySession(dispenser_url=args.dispenser) + session.download_apk(args.package_name, args.output_path) + except Exception as e: + print(f"[-] Error: {e}", file=sys.stderr) + result = {"success": False, "error": str(e)} + print(json.dumps(result)) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/src/build/helper/ggplay_dl/ggplay_pb2.py b/src/build/helper/ggplay_dl/ggplay_pb2.py new file mode 100644 index 0000000..1a3f2c8 --- /dev/null +++ b/src/build/helper/ggplay_dl/ggplay_pb2.py @@ -0,0 +1,633 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: GooglePlay.proto +# Protobuf Python Version: 6.33.5 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 33, + 5, + '', + 'GooglePlay.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10GooglePlay.proto\"\xd8\x04\n\x16\x41ndroidAppDeliveryData\x12\x14\n\x0c\x64ownloadSize\x18\x01 \x01(\x03\x12\x0c\n\x04sha1\x18\x02 \x01(\t\x12\x13\n\x0b\x64ownloadUrl\x18\x03 \x01(\t\x12(\n\x0e\x61\x64\x64itionalFile\x18\x04 \x03(\x0b\x32\x10.AppFileMetadata\x12\'\n\x12\x64ownloadAuthCookie\x18\x05 \x03(\x0b\x32\x0b.HttpCookie\x12\x15\n\rforwardLocked\x18\x06 \x01(\x08\x12\x15\n\rrefundTimeout\x18\x07 \x01(\x03\x12\x1d\n\x0fserverInitiated\x18\x08 \x01(\x08:\x04true\x12%\n\x1dpostInstallRefundWindowMillis\x18\t \x01(\x03\x12\x1c\n\x14immediateStartNeeded\x18\n \x01(\x08\x12\'\n\tpatchData\x18\x0b \x01(\x0b\x32\x14.AndroidAppPatchData\x12+\n\x10\x65ncryptionParams\x18\x0c \x01(\x0b\x32\x11.EncryptionParams\x12\x1d\n\x15\x63ompressedDownloadUrl\x18\r \x01(\t\x12\x16\n\x0e\x63ompressedSize\x18\x0e \x01(\x03\x12-\n\x11splitDeliveryData\x18\x0f \x03(\x0b\x32\x12.SplitDeliveryData\x12\x17\n\x0finstallLocation\x18\x10 \x01(\x05\x12\x0c\n\x04type\x18\x11 \x01(\x03\x12-\n\x11\x63ompressedAppData\x18\x12 \x01(\x0b\x32\x12.CompressedAppData\x12\x0e\n\x06sha256\x18\x13 \x01(\t\"\xf9\x01\n\x11SplitDeliveryData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0c\x64ownloadSize\x18\x02 \x01(\x03\x12\x16\n\x0e\x63ompressedSize\x18\x03 \x01(\x03\x12\x0c\n\x04sha1\x18\x04 \x01(\t\x12\x13\n\x0b\x64ownloadUrl\x18\x05 \x01(\t\x12\x1d\n\x15\x63ompressedDownloadUrl\x18\x06 \x01(\t\x12\'\n\tpatchData\x18\x07 \x01(\x0b\x32\x14.AndroidAppPatchData\x12-\n\x11\x63ompressedAppData\x18\x08 \x01(\x0b\x32\x12.CompressedAppData\x12\x0e\n\x06sha256\x18\t \x01(\t\"\x83\x01\n\x13\x41ndroidAppPatchData\x12\x17\n\x0f\x62\x61seVersionCode\x18\x01 \x01(\x05\x12\x10\n\x08\x62\x61seSha1\x18\x02 \x01(\t\x12\x13\n\x0b\x64ownloadUrl\x18\x03 \x01(\t\x12\x16\n\x0bpatchFormat\x18\x04 \x01(\x05:\x01\x31\x12\x14\n\x0cmaxPatchSize\x18\x05 \x01(\x03\"D\n\x11\x43ompressedAppData\x12\x0c\n\x04type\x18\x01 \x01(\x03\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12\x13\n\x0b\x64ownloadUrl\x18\x03 \x01(\t\"\xc9\x01\n\x0f\x41ppFileMetadata\x12\x10\n\x08\x66ileType\x18\x01 \x01(\x05\x12\x13\n\x0bversionCode\x18\x02 \x01(\x05\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x13\n\x0b\x64ownloadUrl\x18\x04 \x01(\t\x12\'\n\tpatchData\x18\x05 \x01(\x0b\x32\x14.AndroidAppPatchData\x12\x16\n\x0e\x63ompressedSize\x18\x06 \x01(\x03\x12\x1d\n\x15\x63ompressedDownloadUrl\x18\x07 \x01(\t\x12\x0c\n\x04sha1\x18\x08 \x01(\t\"K\n\x10\x45ncryptionParams\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x15\n\rencryptionKey\x18\x02 \x01(\t\x12\x0f\n\x07hMacKey\x18\x03 \x01(\t\")\n\nHttpCookie\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xb7\x02\n\x07\x41\x64\x64ress\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0c\x61\x64\x64ressLine1\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ressLine2\x18\x03 \x01(\t\x12\x0c\n\x04\x63ity\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x12\n\npostalCode\x18\x06 \x01(\t\x12\x15\n\rpostalCountry\x18\x07 \x01(\t\x12\x19\n\x11\x64\x65pendentLocality\x18\x08 \x01(\t\x12\x13\n\x0bsortingCode\x18\t \x01(\t\x12\x14\n\x0clanguageCode\x18\n \x01(\t\x12\x13\n\x0bphoneNumber\x18\x0b \x01(\t\x12\x1b\n\x13\x64\x65precatedIsReduced\x18\x0c \x01(\x08\x12\x11\n\tfirstName\x18\r \x01(\t\x12\x10\n\x08lastName\x18\x0e \x01(\t\x12\r\n\x05\x65mail\x18\x0f \x01(\t\"[\n\nBrowseLink\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x64\x61taUrl\x18\x03 \x01(\t\x12\x18\n\x10serverLogsCookie\x18\x04 \x01(\x0c\x12\x14\n\x04icon\x18\x05 \x01(\x0b\x32\x06.Image\"\xf0\x02\n\x0e\x42rowseResponse\x12\x13\n\x0b\x63ontentsUrl\x18\x01 \x01(\t\x12\x10\n\x08promoUrl\x18\x02 \x01(\t\x12\x1d\n\x08\x63\x61tegory\x18\x03 \x03(\x0b\x32\x0b.BrowseLink\x12\x1f\n\nbreadcrumb\x18\x04 \x03(\x0b\x32\x0b.BrowseLink\x12\x1d\n\tquickLink\x18\x05 \x03(\x0b\x32\n.QuickLink\x12\x18\n\x10serverLogsCookie\x18\x06 \x01(\x0c\x12\r\n\x05title\x18\x07 \x01(\t\x12\x11\n\tbackendId\x18\x08 \x01(\x05\x12\x1d\n\tbrowseTab\x18\t \x01(\x0b\x32\n.BrowseTab\x12\x17\n\x0flandingTabIndex\x18\n \x01(\x05\x12\x19\n\x11quickLinkTabIndex\x18\x0b \x01(\x05\x12!\n\x19quickLinkFallbackTabIndex\x18\x0c \x01(\x05\x12\x14\n\x0cisFamilySafe\x18\x0e \x01(\x08\x12\x10\n\x08shareUrl\x18\x12 \x01(\t\"h\n\x0e\x44irectPurchase\x12\x12\n\ndetailsUrl\x18\x01 \x01(\t\x12\x16\n\x0epurchaseItemId\x18\x02 \x01(\t\x12\x14\n\x0cparentItemId\x18\x03 \x01(\t\x12\x14\n\tofferType\x18\x04 \x01(\x05:\x01\x31\"=\n\x0eRedeemGiftCard\x12\x13\n\x0bprefillCode\x18\x01 \x01(\t\x12\x16\n\x0epartnerPayload\x18\x02 \x01(\t\"\xc8\x02\n\x0cResolvedLink\x12\x12\n\ndetailsUrl\x18\x01 \x01(\t\x12\x11\n\tbrowseUrl\x18\x02 \x01(\t\x12\x11\n\tsearchUrl\x18\x03 \x01(\t\x12\'\n\x0e\x64irectPurchase\x18\x04 \x01(\x0b\x32\x0f.DirectPurchase\x12\x0f\n\x07homeUrl\x18\x05 \x01(\t\x12\'\n\x0eredeemGiftCard\x18\x06 \x01(\x0b\x32\x0f.RedeemGiftCard\x12\x18\n\x10serverLogsCookie\x18\x07 \x01(\x0c\x12\x15\n\x05\x44ocId\x18\x08 \x01(\x0b\x32\x06.DocId\x12\x13\n\x0bwishlistUrl\x18\t \x01(\t\x12\x0f\n\x07\x62\x61\x63kend\x18\n \x01(\x05\x12\r\n\x05query\x18\x0b \x01(\t\x12\x14\n\x0cmyAccountUrl\x18\x0c \x01(\t\x12\x1f\n\nhelpCenter\x18\r \x01(\x0b\x32\x0b.HelpCenter\"\x1f\n\nHelpCenter\x12\x11\n\tcontextId\x18\x01 \x01(\t\"\xa7\x01\n\tQuickLink\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\x05image\x18\x02 \x01(\x0b\x32\x06.Image\x12\x1b\n\x04link\x18\x03 \x01(\x0b\x32\r.ResolvedLink\x12\x17\n\x0f\x64isplayRequired\x18\x04 \x01(\x08\x12\x18\n\x10serverLogsCookie\x18\x05 \x01(\x0c\x12\x11\n\tbackendId\x18\x06 \x01(\x05\x12\x12\n\nprismStyle\x18\x07 \x01(\x08\"\xe6\x01\n\tBrowseTab\x12\r\n\x05title\x18\x01 \x01(\t\x12\x18\n\x10serverLogsCookie\x18\x02 \x01(\x0c\x12\x0f\n\x07listUrl\x18\x03 \x01(\t\x12\x1f\n\nbrowseLink\x18\x04 \x03(\x0b\x32\x0b.BrowseLink\x12\x1d\n\tquickLink\x18\x05 \x03(\x0b\x32\n.QuickLink\x12\x16\n\x0equickLinkTitle\x18\x06 \x01(\t\x12\x17\n\x0f\x63\x61tegoriesTitle\x18\x07 \x01(\t\x12\x11\n\tbackendId\x18\x08 \x01(\x05\x12\x1b\n\x13highlightsBannerUrl\x18\t \x01(\t\"\xd1\n\n\x0b\x42uyResponse\x12\x37\n\x10purchaseResponse\x18\x01 \x01(\x0b\x32\x1d.PurchaseNotificationResponse\x12/\n\x0c\x63heckoutinfo\x18\x02 \x01(\n2\x19.BuyResponse.CheckoutInfo\x12\x16\n\x0e\x63ontinueViaUrl\x18\x08 \x01(\t\x12\x19\n\x11purchaseStatusUrl\x18\t \x01(\t\x12\x19\n\x11\x63heckoutServiceId\x18\x0c \x01(\t\x12\x1d\n\x15\x63heckoutTokenRequired\x18\r \x01(\x08\x12\x17\n\x0f\x62\x61seCheckoutUrl\x18\x0e \x01(\t\x12\x17\n\x0ftosCheckboxHtml\x18% \x03(\t\x12\x1a\n\x12iabPermissionError\x18& \x01(\x05\x12\x37\n\x16purchaseStatusResponse\x18\' \x01(\x0b\x32\x17.PurchaseStatusResponse\x12\x16\n\x0epurchaseCookie\x18. \x01(\t\x12\x1d\n\tchallenge\x18\x31 \x01(\x0b\x32\n.Challenge\x12\x1f\n\x17\x61\x64\x64InstrumentPromptHtml\x18\x32 \x01(\t\x12\x19\n\x11\x63onfirmButtonText\x18\x33 \x01(\t\x12 \n\x18permissionErrorTitleText\x18\x34 \x01(\t\x12\"\n\x1apermissionErrorMessageText\x18\x35 \x01(\t\x12\x18\n\x10serverLogsCookie\x18\x36 \x01(\x0c\x12\x1c\n\x14\x65ncodedDeliveryToken\x18\x37 \x01(\t\x12\x14\n\x0cunknownToken\x18\x38 \x01(\t\x1a\xdc\x05\n\x0c\x43heckoutInfo\x12\x17\n\x04item\x18\x03 \x01(\x0b\x32\t.LineItem\x12\x1a\n\x07subItem\x18\x04 \x03(\x0b\x32\t.LineItem\x12@\n\x0e\x63heckoutoption\x18\x05 \x03(\n2(.BuyResponse.CheckoutInfo.CheckoutOption\x12\x1d\n\x15\x64\x65precatedCheckoutUrl\x18\n \x01(\t\x12\x18\n\x10\x61\x64\x64InstrumentUrl\x18\x0b \x01(\t\x12\x12\n\nfooterHtml\x18\x14 \x03(\t\x12 \n\x18\x65ligibleInstrumentFamily\x18\x1f \x03(\x05\x12\x14\n\x0c\x66ootnoteHtml\x18$ \x03(\t\x12\'\n\x12\x65ligibleInstrument\x18, \x03(\x0b\x32\x0b.Instrument\x1a\xa6\x03\n\x0e\x43heckoutOption\x12\x15\n\rformOfPayment\x18\x06 \x01(\t\x12\x1b\n\x13\x65ncodedAdjustedCart\x18\x07 \x01(\t\x12\x14\n\x0cinstrumentId\x18\x0f \x01(\t\x12\x17\n\x04item\x18\x10 \x03(\x0b\x32\t.LineItem\x12\x1a\n\x07subItem\x18\x11 \x03(\x0b\x32\t.LineItem\x12\x18\n\x05total\x18\x12 \x01(\x0b\x32\t.LineItem\x12\x12\n\nfooterHtml\x18\x13 \x03(\t\x12\x18\n\x10instrumentFamily\x18\x1d \x01(\x05\x12.\n&deprecatedInstrumentInapplicableReason\x18\x1e \x03(\x05\x12\x1a\n\x12selectedInstrument\x18 \x01(\x08\x12\x1a\n\x07summary\x18! \x01(\x0b\x32\t.LineItem\x12\x14\n\x0c\x66ootnoteHtml\x18# \x03(\t\x12\x1f\n\ninstrument\x18+ \x01(\x0b\x32\x0b.Instrument\x12\x16\n\x0epurchaseCookie\x18- \x01(\t\x12\x16\n\x0e\x64isabledReason\x18\x30 \x03(\t\"\\\n\x08LineItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x15\n\x05offer\x18\x03 \x01(\x0b\x32\x06.Offer\x12\x16\n\x06\x61mount\x18\x04 \x01(\x0b\x32\x06.Money\"F\n\x05Money\x12\x0e\n\x06micros\x18\x01 \x01(\x03\x12\x14\n\x0c\x63urrencyCode\x18\x02 \x01(\t\x12\x17\n\x0f\x66ormattedAmount\x18\x03 \x01(\t\"\x80\x01\n\x1cPurchaseNotificationResponse\x12\x0e\n\x06status\x18\x01 \x01(\x05\x12\x1d\n\tdebugInfo\x18\x02 \x01(\x0b\x32\n.DebugInfo\x12\x1d\n\x15localizedErrorMessage\x18\x03 \x01(\t\x12\x12\n\npurchaseId\x18\x04 \x01(\t\"\xf9\x01\n\x16PurchaseStatusResponse\x12\x0e\n\x06status\x18\x01 \x01(\x05\x12\x11\n\tstatusMsg\x18\x02 \x01(\t\x12\x13\n\x0bstatusTitle\x18\x03 \x01(\t\x12\x14\n\x0c\x62riefMessage\x18\x04 \x01(\t\x12\x0f\n\x07infoUrl\x18\x05 \x01(\t\x12%\n\rlibraryUpdate\x18\x06 \x01(\x0b\x32\x0e.LibraryUpdate\x12\'\n\x12rejectedInstrument\x18\x07 \x01(\x0b\x32\x0b.Instrument\x12\x30\n\x0f\x61ppDeliveryData\x18\x08 \x01(\x0b\x32\x17.AndroidAppDeliveryData\"\xe1\x01\n\x16PurchaseHistoryDetails\x12\x1f\n\x17purchaseTimestampMillis\x18\x02 \x01(\x03\x12\x1b\n\x13purchaseDetailsHtml\x18\x03 \x01(\t\x12\x15\n\x05offer\x18\x05 \x01(\x0b\x32\x06.Offer\x12\x16\n\x0epurchaseStatus\x18\x06 \x01(\t\x12\x17\n\x0ftitleBylineHtml\x18\x07 \x01(\t\x12\x1b\n\x13\x63lientRefundContext\x18\x08 \x01(\x0c\x12$\n\x14purchaseDetailsImage\x18\t \x01(\x0b\x32\x06.Image\"j\n\x16\x42illingProfileResponse\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\'\n\x0e\x62illingProfile\x18\x02 \x01(\x0b\x32\x0f.BillingProfile\x12\x17\n\x0fuserMessageHtml\x18\x03 \x01(\t\"\xa2\x01\n\x17\x43heckInstrumentResponse\x12\x1e\n\x16userHasValidInstrument\x18\x01 \x01(\x08\x12\x1d\n\x15\x63heckoutTokenRequired\x18\x02 \x01(\x08\x12\x1f\n\ninstrument\x18\x04 \x03(\x0b\x32\x0b.Instrument\x12\'\n\x12\x65ligibleInstrument\x18\x05 \x03(\x0b\x32\x0b.Instrument\"e\n\x1bInstrumentSetupInfoResponse\x12\'\n\tsetupInfo\x18\x01 \x03(\x0b\x32\x14.InstrumentSetupInfo\x12\x1d\n\x15\x63heckoutTokenRequired\x18\x02 \x01(\x08\"\x7f\n\x15RedeemGiftCardRequest\x12\x13\n\x0bgiftCardPin\x18\x01 \x01(\t\x12\x19\n\x07\x61\x64\x64ress\x18\x02 \x01(\x0b\x32\x08.Address\x12\x1f\n\x17\x61\x63\x63\x65ptedLegalDocumentId\x18\x03 \x03(\t\x12\x15\n\rcheckoutToken\x18\x04 \x01(\t\"\xa2\x01\n\x16RedeemGiftCardResponse\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x17\n\x0fuserMessageHtml\x18\x02 \x01(\t\x12\x13\n\x0b\x62\x61lanceHtml\x18\x03 \x01(\t\x12+\n\x10\x61\x64\x64ressChallenge\x18\x04 \x01(\x0b\x32\x11.AddressChallenge\x12\x1d\n\x15\x63heckoutTokenRequired\x18\x05 \x01(\x08\"Q\n\x17UpdateInstrumentRequest\x12\x1f\n\ninstrument\x18\x01 \x01(\x0b\x32\x0b.Instrument\x12\x15\n\rcheckoutToken\x18\x02 \x01(\t\"\xd4\x01\n\x18UpdateInstrumentResponse\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x14\n\x0cinstrumentId\x18\x02 \x01(\t\x12\x17\n\x0fuserMessageHtml\x18\x03 \x01(\t\x12.\n\x0f\x65rrorInputField\x18\x04 \x03(\x0b\x32\x15.InputValidationError\x12\x1d\n\x15\x63heckoutTokenRequired\x18\x05 \x01(\x08\x12*\n\rredeemedOffer\x18\x06 \x01(\x0b\x32\x13.RedeemedPromoOffer\"0\n\x1bInitiateAssociationResponse\x12\x11\n\tuserToken\x18\x01 \x01(\t\"\x8b\x01\n\x19VerifyAssociationResponse\x12\x0e\n\x06status\x18\x01 \x01(\x05\x12 \n\x0e\x62illingAddress\x18\x02 \x01(\x0b\x32\x08.Address\x12\x1f\n\ncarrierTos\x18\x03 \x01(\x0b\x32\x0b.CarrierTos\x12\x1b\n\x13\x63\x61rrierErrorMessage\x18\x04 \x01(\t\"\xb3\x02\n\x10\x41\x64\x64ressChallenge\x12\x1c\n\x14responseAddressParam\x18\x01 \x01(\t\x12\x1f\n\x17responseCheckboxesParam\x18\x02 \x01(\t\x12\r\n\x05title\x18\x03 \x01(\t\x12\x17\n\x0f\x64\x65scriptionHtml\x18\x04 \x01(\t\x12\x1f\n\x08\x63heckbox\x18\x05 \x03(\x0b\x32\r.FormCheckbox\x12\x19\n\x07\x61\x64\x64ress\x18\x06 \x01(\x0b\x32\x08.Address\x12.\n\x0f\x65rrorInputField\x18\x07 \x03(\x0b\x32\x15.InputValidationError\x12\x11\n\terrorHtml\x18\x08 \x01(\t\x12\x15\n\rrequiredField\x18\t \x03(\x05\x12\"\n\x10supportedCountry\x18\n \x03(\x0b\x32\x08.Country\"\xdd\x02\n\x17\x41uthenticationChallenge\x12\x1a\n\x12\x61uthenticationType\x18\x01 \x01(\x05\x12\'\n\x1fresponseAuthenticationTypeParam\x18\x02 \x01(\t\x12\x1f\n\x17responseRetryCountParam\x18\x03 \x01(\t\x12\x15\n\rpinHeaderText\x18\x04 \x01(\t\x12\x1e\n\x16pinDescriptionTextHtml\x18\x05 \x01(\t\x12\x16\n\x0egaiaHeaderText\x18\x06 \x01(\t\x12\x1f\n\x17gaiaDescriptionTextHtml\x18\x07 \x01(\t\x12\x1a\n\x12gaiaFooterTextHtml\x18\x08 \x01(\t\x12)\n\x12gaiaOptOutCheckbox\x18\t \x01(\x0b\x32\r.FormCheckbox\x12%\n\x1dgaiaOptOutDescriptionTextHtml\x18\n \x01(\t\"\xa0\x01\n\tChallenge\x12+\n\x10\x61\x64\x64ressChallenge\x18\x01 \x01(\x0b\x32\x11.AddressChallenge\x12\x39\n\x17\x61uthenticationChallenge\x18\x02 \x01(\x0b\x32\x18.AuthenticationChallenge\x12+\n\x10webViewChallenge\x18\x03 \x01(\x0b\x32\x11.WebViewChallenge\"2\n\x07\x43ountry\x12\x12\n\nregionCode\x18\x01 \x01(\t\x12\x13\n\x0b\x64isplayName\x18\x02 \x01(\t\"R\n\x0c\x46ormCheckbox\x12\x13\n\x0b\x64\x65scription\x18\x01 \x01(\t\x12\x0f\n\x07\x63hecked\x18\x02 \x01(\x08\x12\x10\n\x08required\x18\x03 \x01(\x08\x12\n\n\x02id\x18\x04 \x01(\t\"@\n\x14InputValidationError\x12\x12\n\ninputField\x18\x01 \x01(\x05\x12\x14\n\x0c\x65rrorMessage\x18\x02 \x01(\t\"\xa7\x01\n\x10WebViewChallenge\x12\x10\n\x08startUrl\x18\x01 \x01(\t\x12\x17\n\x0ftargetUrlRegexp\x18\x02 \x01(\t\x12 \n\x18\x63\x61ncelButtonDisplayLabel\x18\x03 \x01(\t\x12\x1e\n\x16responseTargetUrlParam\x18\x04 \x01(\t\x12\x17\n\x0f\x63\x61ncelUrlRegexp\x18\x05 \x01(\t\x12\r\n\x05title\x18\x06 \x01(\t\"\xcc\x01\n\x17\x41\x64\x64\x43reditCardPromoOffer\x12\x12\n\nheaderText\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65scriptionHtml\x18\x02 \x01(\t\x12\x15\n\x05image\x18\x03 \x01(\x0b\x32\x06.Image\x12\x1c\n\x14introductoryTextHtml\x18\x04 \x01(\t\x12\x12\n\nofferTitle\x18\x05 \x01(\t\x12\x1b\n\x13noActionDescription\x18\x06 \x01(\t\x12\x1e\n\x16termsAndConditionsHtml\x18\x07 \x01(\t\"K\n\x13\x41vailablePromoOffer\x12\x34\n\x12\x61\x64\x64\x43reditCardOffer\x18\x01 \x01(\x0b\x32\x18.AddCreditCardPromoOffer\"\x92\x01\n\x17\x43heckPromoOfferResponse\x12,\n\x0e\x61vailableOffer\x18\x01 \x03(\x0b\x32\x14.AvailablePromoOffer\x12*\n\rredeemedOffer\x18\x02 \x01(\x0b\x32\x13.RedeemedPromoOffer\x12\x1d\n\x15\x63heckoutTokenRequired\x18\x03 \x01(\x08\"X\n\x12RedeemedPromoOffer\x12\x12\n\nheaderText\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65scriptionHtml\x18\x02 \x01(\t\x12\x15\n\x05image\x18\x03 \x01(\x0b\x32\x06.Image\"?\n\x05\x44ocId\x12\x14\n\x0c\x62\x61\x63kendDocId\x18\x01 \x01(\t\x12\x0f\n\x04type\x18\x02 \x01(\x05:\x01\x31\x12\x0f\n\x07\x62\x61\x63kend\x18\x03 \x01(\x05\"d\n\x07Install\x12\x11\n\tandroidId\x18\x01 \x01(\x06\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12\x0f\n\x07\x62undled\x18\x03 \x01(\x08\x12\x0f\n\x07pending\x18\x04 \x01(\x08\x12\x13\n\x0blastUpdated\x18\x05 \x01(\x03\"\x8e\x01\n\x0fGroupLicenseKey\x12\x1a\n\x12\x64\x61sher_customer_id\x18\x01 \x01(\x06\x12\x15\n\x05\x64ocId\x18\x02 \x01(\x0b\x32\x06.DocId\x12\x1e\n\x13licensed_offer_type\x18\x03 \x01(\x05:\x01\x31\x12\x0c\n\x04type\x18\x04 \x01(\x05\x12\x1a\n\x12rental_period_days\x18\x05 \x01(\x05\"9\n\x0cLicenseTerms\x12)\n\x0fgroupLicenseKey\x18\x01 \x01(\x0b\x32\x10.GroupLicenseKey\"\xd4\x06\n\x05Offer\x12\x0e\n\x06micros\x18\x01 \x01(\x03\x12\x14\n\x0c\x63urrencyCode\x18\x02 \x01(\t\x12\x17\n\x0f\x66ormattedAmount\x18\x03 \x01(\t\x12\x1e\n\x0e\x63onvertedPrice\x18\x04 \x03(\x0b\x32\x06.Offer\x12\x1c\n\x14\x63heckoutFlowRequired\x18\x05 \x01(\x08\x12\x17\n\x0f\x66ullPriceMicros\x18\x06 \x01(\x03\x12\x1b\n\x13\x66ormattedFullAmount\x18\x07 \x01(\t\x12\x14\n\tofferType\x18\x08 \x01(\x05:\x01\x31\x12!\n\x0brentalTerms\x18\t \x01(\x0b\x32\x0c.RentalTerms\x12\x12\n\nonSaleDate\x18\n \x01(\x03\x12\x16\n\x0epromotionLabel\x18\x0b \x03(\t\x12-\n\x11subscriptionTerms\x18\x0c \x01(\x0b\x32\x12.SubscriptionTerms\x12\x15\n\rformattedName\x18\r \x01(\t\x12\x1c\n\x14\x66ormattedDescription\x18\x0e \x01(\t\x12\x10\n\x08preorder\x18\x0f \x01(\x08\x12-\n%onSaleDateDisplayTimeZoneOffsetMillis\x18\x10 \x01(\x05\x12\x19\n\x11licensedOfferType\x18\x11 \x01(\x05\x12;\n\x18subscriptionContentTerms\x18\x12 \x01(\x0b\x32\x19.SubscriptionContentTerms\x12\x0f\n\x07offerId\x18\x13 \x01(\t\x12&\n\x1epreorderFulfillmentDisplayDate\x18\x14 \x01(\x03\x12#\n\x0clicenseTerms\x18\x15 \x01(\x0b\x32\r.LicenseTerms\x12\x0c\n\x04sale\x18\x16 \x01(\x08\x12#\n\x0cvoucherTerms\x18\x17 \x01(\x0b\x32\r.VoucherTerms\x12#\n\x0cofferPayment\x18\x18 \x03(\x0b\x32\r.OfferPayment\x12\x19\n\x11repeatLastPayment\x18\x19 \x01(\x08\x12\x16\n\x0e\x62uyButtonLabel\x18\x1a \x01(\t\x12\x1e\n\x16instantPurchaseEnabled\x18\x1b \x01(\x08\x12\x18\n\x10saleEndTimestamp\x18\x1e \x01(\x03\x12\x13\n\x0bsaleMessage\x18\x1f \x01(\t\")\n\x0bMonthAndDay\x12\r\n\x05month\x18\x01 \x01(\r\x12\x0b\n\x03\x64\x61y\x18\x02 \x01(\r\"k\n\x12OfferPaymentPeriod\x12\x1d\n\x08\x64uration\x18\x01 \x01(\x0b\x32\x0b.TimePeriod\x12\x1b\n\x05start\x18\x02 \x01(\x0b\x32\x0c.MonthAndDay\x12\x19\n\x03\x65nd\x18\x03 \x01(\x0b\x32\x0c.MonthAndDay\"^\n\x14OfferPaymentOverride\x12\x0e\n\x06micros\x18\x01 \x01(\x03\x12\x1b\n\x05start\x18\x02 \x01(\x0b\x32\x0c.MonthAndDay\x12\x19\n\x03\x65nd\x18\x03 \x01(\x0b\x32\x0c.MonthAndDay\"\x9a\x01\n\x0cOfferPayment\x12\x0e\n\x06micros\x18\x01 \x01(\x03\x12\x14\n\x0c\x63urrencyCode\x18\x02 \x01(\t\x12/\n\x12offerPaymentPeriod\x18\x03 \x01(\x0b\x32\x13.OfferPaymentPeriod\x12\x33\n\x14offerPaymentOverride\x18\x04 \x03(\x0b\x32\x15.OfferPaymentOverride\"\x0e\n\x0cVoucherTerms\"\xa3\x01\n\x0bRentalTerms\x12$\n\x1c\x64\x45PRECATEDGrantPeriodSeconds\x18\x01 \x01(\x05\x12\'\n\x1f\x64\x45PRECATEDActivatePeriodSeconds\x18\x02 \x01(\x05\x12 \n\x0bgrantPeriod\x18\x03 \x01(\x0b\x32\x0b.TimePeriod\x12#\n\x0e\x61\x63tivatePeriod\x18\x04 \x01(\x0b\x32\x0b.TimePeriod\"3\n\nSignedData\x12\x12\n\nsignedData\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\t\"@\n\x18SubscriptionContentTerms\x12$\n\x14requiredSubscription\x18\x01 \x01(\x0b\x32\x06.DocId\"B\n\x10GroupLicenseInfo\x12\x19\n\x11licensedOfferType\x18\x01 \x01(\x05\x12\x13\n\x0bgaiaGroupId\x18\x02 \x01(\x06\"+\n\x14LicensedDocumentInfo\x12\x13\n\x0bgaiaGroupId\x18\x01 \x03(\x06\"\xb2\x03\n\rOwnershipInfo\x12\x1b\n\x13initiationTimestamp\x18\x01 \x01(\x03\x12\x1b\n\x13validUntilTimestamp\x18\x02 \x01(\x03\x12\x14\n\x0c\x61utoRenewing\x18\x03 \x01(\x08\x12\x1e\n\x16refundTimeoutTimestamp\x18\x04 \x01(\x03\x12&\n\x1epostDeliveryRefundWindowMillis\x18\x05 \x01(\x03\x12*\n\x15\x64\x65veloperPurchaseInfo\x18\x06 \x01(\x0b\x32\x0b.SignedData\x12\x12\n\npreOrdered\x18\x07 \x01(\x08\x12\x0e\n\x06hidden\x18\x08 \x01(\x08\x12!\n\x0brentalTerms\x18\t \x01(\x0b\x32\x0c.RentalTerms\x12+\n\x10groupLicenseInfo\x18\n \x01(\x0b\x32\x11.GroupLicenseInfo\x12\x33\n\x14licensedDocumentInfo\x18\x0b \x01(\x0b\x32\x15.LicensedDocumentInfo\x12\x10\n\x08quantity\x18\x0c \x01(\x05\x12\"\n\x1alibraryExpirationTimestamp\x18\x0e \x01(\x03\"[\n\x11SubscriptionTerms\x12$\n\x0frecurringPeriod\x18\x01 \x01(\x0b\x32\x0b.TimePeriod\x12 \n\x0btrialPeriod\x18\x02 \x01(\x0b\x32\x0b.TimePeriod\")\n\nTimePeriod\x12\x0c\n\x04unit\x18\x01 \x01(\x05\x12\r\n\x05\x63ount\x18\x02 \x01(\x05\"G\n\x12\x42illingAddressSpec\x12\x1a\n\x12\x62illingAddressType\x18\x01 \x01(\x05\x12\x15\n\rrequiredField\x18\x02 \x03(\x05\"\x8c\x01\n\x0e\x42illingProfile\x12\x1f\n\ninstrument\x18\x01 \x03(\x0b\x32\x0b.Instrument\x12$\n\x1cselectedExternalInstrumentId\x18\x02 \x01(\t\x12\x33\n\x14\x62illingProfileOption\x18\x03 \x03(\x0b\x32\x15.BillingProfileOption\"\xc0\x01\n\x14\x42illingProfileOption\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x14\n\x0c\x64isplayTitle\x18\x02 \x01(\t\x12\x1c\n\x14\x65xternalInstrumentId\x18\x03 \x01(\t\x12\x1d\n\ttopupInfo\x18\x04 \x01(\x0b\x32\n.TopupInfo\x12G\n\x1e\x63\x61rrierBillingInstrumentStatus\x18\x05 \x01(\x0b\x32\x1f.CarrierBillingInstrumentStatus\">\n\x19\x43\x61rrierBillingCredentials\x12\r\n\x05value\x18\x01 \x01(\t\x12\x12\n\nexpiration\x18\x02 \x01(\x03\"\xa9\x02\n\x18\x43\x61rrierBillingInstrument\x12\x15\n\rinstrumentKey\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63\x63ountType\x18\x02 \x01(\t\x12\x14\n\x0c\x63urrencyCode\x18\x03 \x01(\t\x12\x18\n\x10transactionLimit\x18\x04 \x01(\x03\x12\x1c\n\x14subscriberIdentifier\x18\x05 \x01(\t\x12\x39\n\x17\x65ncryptedSubscriberInfo\x18\x06 \x01(\x0b\x32\x18.EncryptedSubscriberInfo\x12/\n\x0b\x63redentials\x18\x07 \x01(\x0b\x32\x1a.CarrierBillingCredentials\x12\'\n\x12\x61\x63\x63\x65ptedCarrierTos\x18\x08 \x01(\x0b\x32\x0b.CarrierTos\"\x9c\x02\n\x1e\x43\x61rrierBillingInstrumentStatus\x12\x1f\n\ncarrierTos\x18\x01 \x01(\x0b\x32\x0b.CarrierTos\x12\x1b\n\x13\x61ssociationRequired\x18\x02 \x01(\x08\x12\x18\n\x10passwordRequired\x18\x03 \x01(\x08\x12.\n\x15\x63\x61rrierPasswordPrompt\x18\x04 \x01(\x0b\x32\x0f.PasswordPrompt\x12\x12\n\napiVersion\x18\x05 \x01(\x05\x12\x0c\n\x04name\x18\x06 \x01(\t\x12-\n\x11\x64\x65viceAssociation\x18\x07 \x01(\x0b\x32\x12.DeviceAssociation\x12!\n\x19\x63\x61rrierSupportPhoneNumber\x18\x08 \x01(\t\"\x8e\x01\n\nCarrierTos\x12 \n\x06\x64\x63\x62Tos\x18\x01 \x01(\x0b\x32\x10.CarrierTosEntry\x12 \n\x06piiTos\x18\x02 \x01(\x0b\x32\x10.CarrierTosEntry\x12\x1d\n\x15needsDcbTosAcceptance\x18\x03 \x01(\x08\x12\x1d\n\x15needsPiiTosAcceptance\x18\x04 \x01(\x08\"/\n\x0f\x43\x61rrierTosEntry\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\"\xa2\x01\n\x14\x43reditCardInstrument\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x14\n\x0c\x65scrowHandle\x18\x02 \x01(\t\x12\x12\n\nlastDigits\x18\x03 \x01(\t\x12\x17\n\x0f\x65xpirationMonth\x18\x04 \x01(\x05\x12\x16\n\x0e\x65xpirationYear\x18\x05 \x01(\x05\x12!\n\x0e\x65scrowEfeParam\x18\x06 \x03(\x0b\x32\t.EfeParam\"U\n\x11\x44\x65viceAssociation\x12\x1f\n\x17userTokenRequestMessage\x18\x01 \x01(\t\x12\x1f\n\x17userTokenRequestAddress\x18\x02 \x01(\t\"Y\n\x0c\x44isabledInfo\x12\x16\n\x0e\x64isabledReason\x18\x01 \x01(\x05\x12\x1b\n\x13\x64isabledMessageHtml\x18\x02 \x01(\t\x12\x14\n\x0c\x65rrorMessage\x18\x03 \x01(\t\"&\n\x08\x45\x66\x65Param\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t\"\xce\x03\n\nInstrument\x12\x14\n\x0cinstrumentId\x18\x01 \x01(\t\x12 \n\x0e\x62illingAddress\x18\x02 \x01(\x0b\x32\x08.Address\x12)\n\ncreditCard\x18\x03 \x01(\x0b\x32\x15.CreditCardInstrument\x12\x31\n\x0e\x63\x61rrierBilling\x18\x04 \x01(\x0b\x32\x19.CarrierBillingInstrument\x12/\n\x12\x62illingAddressSpec\x18\x05 \x01(\x0b\x32\x13.BillingAddressSpec\x12\x18\n\x10instrumentFamily\x18\x06 \x01(\x05\x12=\n\x14\x63\x61rrierBillingStatus\x18\x07 \x01(\x0b\x32\x1f.CarrierBillingInstrumentStatus\x12\x14\n\x0c\x64isplayTitle\x18\x08 \x01(\t\x12\'\n\x13topupInfoDeprecated\x18\t \x01(\x0b\x32\n.TopupInfo\x12\x0f\n\x07version\x18\n \x01(\x05\x12+\n\x0bstoredValue\x18\x0b \x01(\x0b\x32\x16.StoredValueInstrument\x12#\n\x0c\x64isabledInfo\x18\x0c \x03(\x0b\x32\r.DisabledInfo\"\x9c\x01\n\x13InstrumentSetupInfo\x12\x18\n\x10instrumentFamily\x18\x01 \x01(\x05\x12\x11\n\tsupported\x18\x02 \x01(\x08\x12+\n\x10\x61\x64\x64ressChallenge\x18\x03 \x01(\x0b\x32\x11.AddressChallenge\x12\x17\n\x07\x62\x61lance\x18\x04 \x01(\x0b\x32\x06.Money\x12\x12\n\nfooterHtml\x18\x05 \x03(\t\";\n\x0ePasswordPrompt\x12\x0e\n\x06prompt\x18\x01 \x01(\t\x12\x19\n\x11\x66orgotPasswordUrl\x18\x02 \x01(\t\"]\n\x15StoredValueInstrument\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x17\n\x07\x62\x61lance\x18\x02 \x01(\x0b\x32\x06.Money\x12\x1d\n\ttopupInfo\x18\x03 \x01(\x0b\x32\n.TopupInfo\"\x85\x01\n\tTopupInfo\x12\'\n\x1foptionsContainerDocIdDeprecated\x18\x01 \x01(\t\x12\x16\n\x0eoptionsListUrl\x18\x02 \x01(\t\x12\x10\n\x08subtitle\x18\x03 \x01(\t\x12%\n\x15optionsContainerDocId\x18\x04 \x01(\x0b\x32\x06.DocId\"P\n\x17\x43onsumePurchaseResponse\x12%\n\rlibraryUpdate\x18\x01 \x01(\x0b\x32\x0e.LibraryUpdate\x12\x0e\n\x06status\x18\x02 \x01(\x05\"\xd3\x01\n\x11\x43ontainerMetadata\x12\x11\n\tbrowseUrl\x18\x01 \x01(\t\x12\x13\n\x0bnextPageUrl\x18\x02 \x01(\t\x12\x11\n\trelevance\x18\x03 \x01(\x01\x12\x18\n\x10\x65stimatedResults\x18\x04 \x01(\x03\x12\x17\n\x0f\x61nalyticsCookie\x18\x05 \x01(\t\x12\x0f\n\x07ordered\x18\x06 \x01(\x08\x12%\n\rcontainerView\x18\x07 \x03(\x0b\x32\x0e.ContainerView\x12\x18\n\x08leftIcon\x18\x08 \x01(\x0b\x32\x06.Image\"[\n\rContainerView\x12\x10\n\x08selected\x18\x01 \x01(\x08\x12\r\n\x05title\x18\x02 \x01(\t\x12\x0f\n\x07listUrl\x18\x03 \x01(\t\x12\x18\n\x10serverLogsCookie\x18\x04 \x01(\x0c\"\x15\n\x13\x46lagContentResponse\"\xe9\x07\n\x15\x43lientDownloadRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\x12/\n\x07\x64igests\x18\x02 \x01(\x0b\x32\x1e.ClientDownloadRequest.Digests\x12\x0e\n\x06length\x18\x03 \x01(\x03\x12\x32\n\tresources\x18\x04 \x03(\x0b\x32\x1f.ClientDownloadRequest.Resource\x12\x37\n\tsignature\x18\x05 \x01(\x0b\x32$.ClientDownloadRequest.SignatureInfo\x12\x15\n\ruserInitiated\x18\x06 \x01(\x08\x12\x11\n\tclientAsn\x18\x08 \x03(\t\x12\x14\n\x0c\x66ileBasename\x18\t \x01(\t\x12\x14\n\x0c\x64ownloadType\x18\n \x01(\x05\x12\x0e\n\x06locale\x18\x0b \x01(\t\x12/\n\x07\x61pkInfo\x18\x0c \x01(\x0b\x32\x1e.ClientDownloadRequest.ApkInfo\x12\x11\n\tandroidId\x18\r \x01(\x06\x12\x1b\n\x13originatingPackages\x18\x0f \x03(\t\x12\x42\n\x14originatingSignature\x18\x11 \x01(\x0b\x32$.ClientDownloadRequest.SignatureInfo\x1a\x33\n\x07\x41pkInfo\x12\x13\n\x0bpackageName\x18\x01 \x01(\t\x12\x13\n\x0bversionCode\x18\x02 \x01(\x05\x1a\xee\x01\n\x10\x43\x65rtificateChain\x12@\n\x07\x65lement\x18\x01 \x03(\x0b\x32/.ClientDownloadRequest.CertificateChain.Element\x1a\x97\x01\n\x07\x45lement\x12\x13\n\x0b\x63\x65rtificate\x18\x01 \x01(\x0c\x12\x1a\n\x12parsedSuccessfully\x18\x02 \x01(\x08\x12\x0f\n\x07subject\x18\x03 \x01(\x0c\x12\x0e\n\x06issuer\x18\x04 \x01(\x0c\x12\x13\n\x0b\x66ingerprint\x18\x05 \x01(\x0c\x12\x12\n\nexpiryTime\x18\x06 \x01(\x03\x12\x11\n\tstartTime\x18\x07 \x01(\x03\x1a\x34\n\x07\x44igests\x12\x0e\n\x06sha256\x18\x01 \x01(\x0c\x12\x0c\n\x04sha1\x18\x02 \x01(\x0c\x12\x0b\n\x03md5\x18\x03 \x01(\x0c\x1aI\n\x08Resource\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\x05\x12\x10\n\x08remoteIp\x18\x03 \x01(\x0c\x12\x10\n\x08referrer\x18\x04 \x01(\t\x1a\x63\n\rSignatureInfo\x12\x41\n\x10\x63\x65rtificateChain\x18\x01 \x03(\x0b\x32\'.ClientDownloadRequest.CertificateChain\x12\x0f\n\x07trusted\x18\x02 \x01(\x08\"\x9a\x01\n\x16\x43lientDownloadResponse\x12\x0f\n\x07verdict\x18\x01 \x01(\x05\x12\x32\n\x08moreInfo\x18\x02 \x01(\x0b\x32 .ClientDownloadResponse.MoreInfo\x12\r\n\x05token\x18\x03 \x01(\x0c\x1a,\n\x08MoreInfo\x12\x13\n\x0b\x64\x65scription\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\"A\n\x1a\x43lientDownloadStatsRequest\x12\x14\n\x0cuserDecision\x18\x01 \x01(\x05\x12\r\n\x05token\x18\x02 \x01(\x0c\"i\n\tDebugInfo\x12\x0f\n\x07message\x18\x01 \x03(\t\x12!\n\x06timing\x18\x02 \x03(\n2\x11.DebugInfo.Timing\x1a(\n\x06Timing\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x10\n\x08timeInMs\x18\x04 \x01(\x01\"R\n\x15\x44\x65\x62ugSettingsResponse\x12\x1b\n\x13playCountryOverride\x18\x01 \x01(\t\x12\x1c\n\x14playCountryDebugInfo\x18\x02 \x01(\t\"W\n\x10\x44\x65liveryResponse\x12\x11\n\x06status\x18\x01 \x01(\x05:\x01\x31\x12\x30\n\x0f\x61ppDeliveryData\x18\x02 \x01(\x0b\x32\x17.AndroidAppDeliveryData\"\'\n\x10\x42ulkDetailsEntry\x12\x13\n\x04item\x18\x01 \x01(\x0b\x32\x05.Item\"\x94\x01\n\x12\x42ulkDetailsRequest\x12\r\n\x05\x44ocId\x18\x01 \x03(\t\x12\x1e\n\x10includeChildDocs\x18\x02 \x01(\x08:\x04true\x12\x16\n\x0eincludeDetails\x18\x03 \x01(\x08\x12\x19\n\x11sourcePackageName\x18\x04 \x01(\t\x12\x1c\n\x14installedVersionCode\x18\x07 \x03(\x05\"7\n\x13\x42ulkDetailsResponse\x12 \n\x05\x65ntry\x18\x01 \x03(\x0b\x32\x11.BulkDetailsEntry\"\xc3\x02\n\x0f\x44\x65tailsResponse\x12\x17\n\x0f\x61nalyticsCookie\x18\x02 \x01(\t\x12\x1b\n\nuserReview\x18\x03 \x01(\x0b\x32\x07.Review\x12\x13\n\x04item\x18\x04 \x01(\x0b\x32\x05.Item\x12\x12\n\nfooterHtml\x18\x05 \x01(\t\x12\x18\n\x10serverLogsCookie\x18\x06 \x01(\x0c\x12\'\n\x0e\x64iscoveryBadge\x18\x07 \x03(\x0b\x32\x0f.DiscoveryBadge\x12\x1b\n\renableReviews\x18\x08 \x01(\x08:\x04true\x12\x1b\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\t.Features\x12\x18\n\x10\x64\x65tailsStreamUrl\x18\r \x01(\t\x12\x15\n\ruserReviewUrl\x18\x0e \x01(\t\x12#\n\x1bpostAcquireDetailsStreamUrl\x18\x11 \x01(\t\"\x82\x03\n\x0e\x44iscoveryBadge\x12\r\n\x05label\x18\x01 \x01(\t\x12\x15\n\x05image\x18\x02 \x01(\x0b\x32\x06.Image\x12\x17\n\x0f\x62\x61\x63kgroundColor\x18\x03 \x01(\x05\x12,\n\x0f\x62\x61\x64geContainer1\x18\x04 \x01(\x0b\x32\x13.DiscoveryBadgeLink\x12\x18\n\x10serverLogsCookie\x18\x05 \x01(\x0c\x12\x11\n\tisPlusOne\x18\x06 \x01(\x08\x12\x17\n\x0f\x61ggregateRating\x18\x07 \x01(\x02\x12\x16\n\x0euserStarRating\x18\x08 \x01(\x05\x12\x15\n\rdownloadCount\x18\t \x01(\t\x12\x15\n\rdownloadUnits\x18\n \x01(\t\x12\x1a\n\x12\x63ontentDescription\x18\x0b \x01(\t\x12!\n\x0bplayerBadge\x18\x0c \x01(\x0b\x32\x0c.PlayerBadge\x12\x1b\n\x13\x66\x61milyAgeRangeBadge\x18\r \x01(\x0c\x12\x1b\n\x13\x66\x61milyCategoryBadge\x18\x0e \x01(\x0c\"*\n\x0bPlayerBadge\x12\x1b\n\x0boverlayIcon\x18\x01 \x01(\x0b\x32\x06.Image\"[\n\x12\x44iscoveryBadgeLink\x12\x13\n\x04link\x18\x01 \x01(\x0b\x32\x05.Link\x12\x16\n\x0euserReviewsUrl\x18\x02 \x01(\t\x12\x18\n\x10\x63riticReviewsUrl\x18\x03 \x01(\t\"N\n\x08\x46\x65\x61tures\x12!\n\x0f\x66\x65\x61turePresence\x18\x01 \x03(\x0b\x32\x08.Feature\x12\x1f\n\rfeatureRating\x18\x02 \x03(\x0b\x32\x08.Feature\"\'\n\x07\x46\x65\x61ture\x12\r\n\x05label\x18\x01 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\"\x88\x05\n\x18\x44\x65viceConfigurationProto\x12\x13\n\x0btouchScreen\x18\x01 \x01(\x05\x12\x10\n\x08keyboard\x18\x02 \x01(\x05\x12\x12\n\nnavigation\x18\x03 \x01(\x05\x12\x14\n\x0cscreenLayout\x18\x04 \x01(\x05\x12\x17\n\x0fhasHardKeyboard\x18\x05 \x01(\x08\x12\x1c\n\x14hasFiveWayNavigation\x18\x06 \x01(\x08\x12\x15\n\rscreenDensity\x18\x07 \x01(\x05\x12\x13\n\x0bglEsVersion\x18\x08 \x01(\x05\x12\x1b\n\x13systemSharedLibrary\x18\t \x03(\t\x12\x1e\n\x16systemAvailableFeature\x18\n \x03(\t\x12\x16\n\x0enativePlatform\x18\x0b \x03(\t\x12\x13\n\x0bscreenWidth\x18\x0c \x01(\x05\x12\x14\n\x0cscreenHeight\x18\r \x01(\x05\x12\x1d\n\x15systemSupportedLocale\x18\x0e \x03(\t\x12\x13\n\x0bglExtension\x18\x0f \x03(\t\x12\x13\n\x0b\x64\x65viceClass\x18\x10 \x01(\x05\x12 \n\x14maxApkDownloadSizeMb\x18\x11 \x01(\x05:\x02\x35\x30\x12\x1d\n\x15smallestScreenWidthDP\x18\x12 \x01(\x05\x12\x17\n\x0clowRamDevice\x18\x13 \x01(\x05:\x01\x30\x12$\n\x10totalMemoryBytes\x18\x14 \x01(\x03:\n8354971648\x12\x1c\n\x11maxNumOf_CPUCores\x18\x15 \x01(\x05:\x01\x38\x12%\n\rdeviceFeature\x18\x1a \x03(\x0b\x32\x0e.DeviceFeature\x12\x14\n\tunknown28\x18\x1c \x01(\x05:\x01\x30\x12\x14\n\tunknown30\x18\x1e \x01(\x05:\x01\x34\",\n\rDeviceFeature\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05\"\xc7\x04\n\x08\x44ocument\x12\x15\n\x05\x44ocId\x18\x01 \x01(\x0b\x32\x06.DocId\x12\x1a\n\nfetchDocId\x18\x02 \x01(\x0b\x32\x06.DocId\x12\x1b\n\x0bsampleDocId\x18\x03 \x01(\x0b\x32\x06.DocId\x12\r\n\x05title\x18\x04 \x01(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\x12\x0f\n\x07snippet\x18\x06 \x03(\t\x12\x1f\n\x0fpriceDeprecated\x18\x07 \x01(\x0b\x32\x06.Offer\x12#\n\x0c\x61vailability\x18\t \x01(\x0b\x32\r.Availability\x12\x15\n\x05image\x18\n \x03(\x0b\x32\x06.Image\x12\x18\n\x05\x63hild\x18\x0b \x03(\x0b\x32\t.Document\x12)\n\x0f\x61ggregateRating\x18\r \x01(\x0b\x32\x10.AggregateRating\x12\x15\n\x05offer\x18\x0e \x03(\x0b\x32\x06.Offer\x12*\n\x11translatedSnippet\x18\x0f \x03(\x0b\x32\x0f.TranslatedText\x12)\n\x0f\x64ocumentVariant\x18\x10 \x03(\x0b\x32\x10.DocumentVariant\x12\x12\n\ncategoryId\x18\x11 \x03(\t\x12\x1d\n\ndecoration\x18\x12 \x03(\x0b\x32\t.Document\x12\x19\n\x06parent\x18\x13 \x03(\x0b\x32\t.Document\x12\x18\n\x10privacyPolicyUrl\x18\x14 \x01(\t\x12\x16\n\x0e\x63onsumptionUrl\x18\x15 \x01(\t\x12\x1c\n\x14\x65stimatedNumChildren\x18\x16 \x01(\x05\x12\x10\n\x08subtitle\x18\x17 \x01(\t\"\xbe\x02\n\x0f\x44ocumentVariant\x12\x15\n\rvariationType\x18\x01 \x01(\x05\x12\x13\n\x04rule\x18\x02 \x01(\x0b\x32\x05.Rule\x12\r\n\x05title\x18\x03 \x01(\t\x12\x0f\n\x07snippet\x18\x04 \x03(\t\x12\x15\n\rrecentChanges\x18\x05 \x01(\t\x12(\n\x0f\x61utoTranslation\x18\x06 \x03(\x0b\x32\x0f.TranslatedText\x12\x15\n\x05offer\x18\x07 \x03(\x0b\x32\x06.Offer\x12\x11\n\tchannelId\x18\t \x01(\x03\x12\x18\n\x05\x63hild\x18\n \x03(\x0b\x32\t.Document\x12\x1d\n\ndecoration\x18\x0b \x03(\x0b\x32\t.Document\x12\x15\n\x05image\x18\x0c \x03(\x0b\x32\x06.Image\x12\x12\n\ncategoryId\x18\r \x03(\t\x12\x10\n\x08subtitle\x18\x0e \x01(\t\"7\n\x0cSectionImage\x12\'\n\x0eimageContainer\x18\x01 \x03(\x0b\x32\x0f.ImageContainer\"\'\n\x0eImageContainer\x12\x15\n\x05image\x18\x04 \x01(\x0b\x32\x06.Image\"\xbc\x04\n\x05Image\x12\x11\n\timageType\x18\x01 \x01(\x05\x12#\n\tdimension\x18\x02 \x01(\n2\x10.Image.Dimension\x12\x10\n\x08imageUrl\x18\x05 \x01(\t\x12\x18\n\x10\x61ltTextLocalized\x18\x06 \x01(\t\x12\x11\n\tsecureUrl\x18\x07 \x01(\t\x12\x1a\n\x12positionInSequence\x18\x08 \x01(\x05\x12\x1e\n\x16supportsFifeUrlOptions\x18\t \x01(\x08\x12!\n\x08\x63itation\x18\n \x01(\n2\x0f.Image.Citation\x12\x17\n\x0f\x64urationSeconds\x18\x0e \x01(\x05\x12\x14\n\x0c\x66illColorRGB\x18\x0f \x01(\t\x12\x0f\n\x07\x61utogen\x18\x10 \x01(\x08\x12!\n\x0b\x61ttribution\x18\x11 \x01(\x0b\x32\x0c.Attribution\x12\x1a\n\x12\x62\x61\x63kgroundColorRgb\x18\x13 \x01(\t\x12\x1e\n\x07palette\x18\x14 \x01(\x0b\x32\r.ImagePalette\x12\x13\n\x0b\x64\x65viceClass\x18\x15 \x01(\x05\x12\"\n\x1asupportsFifeMonogramOption\x18\x16 \x01(\x08\x12\x13\n\x0bimageUrlAlt\x18\x1c \x01(\t\x1a?\n\tDimension\x12\r\n\x05width\x18\x03 \x01(\x05\x12\x0e\n\x06height\x18\x04 \x01(\x05\x12\x13\n\x0b\x61spectRatio\x18\x12 \x01(\x05\x1a/\n\x08\x43itation\x12\x16\n\x0etitleLocalized\x18\x0b \x01(\t\x12\x0b\n\x03url\x18\x0c \x01(\t\"_\n\x0b\x41ttribution\x12\x13\n\x0bsourceTitle\x18\x01 \x01(\t\x12\x11\n\tsourceUrl\x18\x02 \x01(\t\x12\x14\n\x0clicenseTitle\x18\x03 \x01(\t\x12\x12\n\nlicenseUrl\x18\x04 \x01(\t\"\x92\x01\n\x0cImagePalette\x12\x17\n\x0flightVibrantRGB\x18\x01 \x01(\t\x12\x12\n\nvibrantRGB\x18\x02 \x01(\t\x12\x16\n\x0e\x64\x61rkVibrantRGB\x18\x03 \x01(\t\x12\x15\n\rlightMutedRGB\x18\x04 \x01(\t\x12\x10\n\x08mutedRGB\x18\x05 \x01(\t\x12\x14\n\x0c\x64\x61rkMutedRGB\x18\x06 \x01(\t\"J\n\x0eTranslatedText\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x14\n\x0csourceLocale\x18\x02 \x01(\t\x12\x14\n\x0ctargetLocale\x18\x03 \x01(\t\"i\n\x0bPlusOneData\x12\x11\n\tsetByUser\x18\x01 \x01(\x08\x12\r\n\x05total\x18\x02 \x01(\x03\x12\x14\n\x0c\x63irclesTotal\x18\x03 \x01(\x03\x12\"\n\rcirclesPeople\x18\x04 \x03(\x0b\x32\x0b.PlusPerson\":\n\nPlusPerson\x12\x13\n\x0b\x64isplayName\x18\x02 \x01(\t\x12\x17\n\x0fprofileImageUrl\x18\x04 \x01(\t\"\x9e\n\n\nAppDetails\x12\x15\n\rdeveloperName\x18\x01 \x01(\t\x12\x1a\n\x12majorVersionNumber\x18\x02 \x01(\x05\x12\x13\n\x0bversionCode\x18\x03 \x01(\x03\x12\x15\n\rversionString\x18\x04 \x01(\t\x12\r\n\x05title\x18\x05 \x01(\t\x12\x13\n\x0b\x61ppCategory\x18\x07 \x03(\t\x12\x15\n\rcontentRating\x18\x08 \x01(\x05\x12\x18\n\x10infoDownloadSize\x18\t \x01(\x03\x12\x12\n\npermission\x18\n \x03(\t\x12\x16\n\x0e\x64\x65veloperEmail\x18\x0b \x01(\t\x12\x18\n\x10\x64\x65veloperWebsite\x18\x0c \x01(\t\x12\x14\n\x0cinfoDownload\x18\r \x01(\t\x12\x13\n\x0bpackageName\x18\x0e \x01(\t\x12\x19\n\x11recentChangesHtml\x18\x0f \x01(\t\x12\x15\n\rinfoUpdatedOn\x18\x10 \x01(\t\x12\x1b\n\x04\x66ile\x18\x11 \x03(\x0b\x32\r.FileMetadata\x12\x0f\n\x07\x61ppType\x18\x12 \x01(\t\x12\x17\n\x0f\x63\x65rtificateHash\x18\x13 \x03(\t\x12\x1e\n\x10variesWithDevice\x18\x15 \x01(\x08:\x04true\x12\'\n\x0e\x63\x65rtificateSet\x18\x16 \x03(\x0b\x32\x0f.CertificateSet\x12\x35\n-autoAcquireFreeAppIfHigherVersionAvailableTag\x18\x17 \x03(\t\x12\x16\n\x0ehasInstantLink\x18\x18 \x01(\x08\x12\x0f\n\x07splitId\x18\x19 \x03(\t\x12\x17\n\x0fgamepadRequired\x18\x1a \x01(\x08\x12\x18\n\x10\x65xternallyHosted\x18\x1b \x01(\x08\x12\x1c\n\x14\x65verExternallyHosted\x18\x1c \x01(\x08\x12\x14\n\x0cinstallNotes\x18\x1e \x01(\t\x12\x17\n\x0finstallLocation\x18\x1f \x01(\x05\x12\x18\n\x10targetSdkVersion\x18 \x01(\x05\x12#\n\x1bhasPreregistrationPromoCode\x18! \x01(\t\x12#\n\x0c\x64\x65pendencies\x18\" \x01(\x0b\x32\r.Dependencies\x12/\n\x12testingProgramInfo\x18# \x01(\x0b\x32\x13.TestingProgramInfo\x12)\n\x0f\x65\x61rlyAccessInfo\x18$ \x01(\x0b\x32\x10.EarlyAccessInfo\x12#\n\x0c\x65\x64itorChoice\x18) \x01(\x0b\x32\r.EditorChoice\x12\x13\n\x0binstantLink\x18+ \x01(\t\x12\x18\n\x10\x64\x65veloperAddress\x18- \x01(\t\x12\x1d\n\tpublisher\x18. \x01(\x0b\x32\n.Publisher\x12\x14\n\x0c\x63\x61tegoryName\x18\x30 \x01(\t\x12\x15\n\rdownloadCount\x18\x35 \x01(\x03\x12\x1c\n\x14\x64ownloadLabelDisplay\x18= \x01(\t\x12\x1d\n\tappLaunch\x18@ \x01(\x0b\x32\n.AppLaunch\x12\x1b\n\x08tagGroup\x18\x42 \x01(\x0b\x32\t.TagGroup\x12\x14\n\x0cinAppProduct\x18\x43 \x01(\t\x12 \n\x18\x64ownloadLabelAbbreviated\x18M \x01(\t\x12\x15\n\rdownloadLabel\x18N \x01(\t\x12%\n\rcompatibility\x18R \x01(\x0b\x32\x0e.Compatibility\x12\x19\n\x07support\x18V \x01(\x0b\x32\x08.Support\"d\n\tAppLaunch\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\t\x12\x1d\n\x04time\x18\x02 \x01(\x0b\x32\x0f.AppLaunch.Time\x1a*\n\x04Time\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\x0f\n\x07unknown\x18\x02 \x01(\x03\"\xa0\x01\n\x08TagGroup\x12\x17\n\x05type1\x18\x01 \x01(\x0b\x32\x08.TagType\x12\x17\n\x05type2\x18\x02 \x01(\x0b\x32\x08.TagType\x12\x17\n\x05type3\x18\x03 \x01(\x0b\x32\x08.TagType\x12\x17\n\x05type4\x18\x04 \x01(\x0b\x32\x08.TagType\x12\x17\n\x05type5\x18\x05 \x01(\x0b\x32\x08.TagType\x12\x17\n\x05type6\x18\x06 \x01(\x0b\x32\x08.TagType\"%\n\x07TagType\x12\x1a\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\t.TagEntry\"J\n\x08TagEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1e\n\x08metadata\x18\x02 \x01(\x0b\x32\x0c.TagMetadata\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\"S\n\x0bTagMetadata\x12\x1c\n\x08\x63\x61tegory\x18\x03 \x01(\x0b\x32\x08.TagDataH\x00\x12\x1a\n\x06search\x18\x04 \x01(\x0b\x32\x08.TagDataH\x00\x42\n\n\x08metadata\"%\n\x07TagData\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"p\n\x07Support\x12\x15\n\rdeveloperName\x18\x01 \x01(\t\x12\x16\n\x0e\x64\x65veloperEmail\x18\x02 \x01(\t\x12\x18\n\x10\x64\x65veloperAddress\x18\x03 \x01(\t\x12\x1c\n\x14\x64\x65veloperPhoneNumber\x18\x04 \x01(\t\"5\n\rCompatibility\x12$\n\ractiveDevices\x18\x01 \x03(\x0b\x32\r.ActiveDevice\"0\n\x0c\x41\x63tiveDevice\x12\x12\n\nrequiredOS\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"J\n\rModifyLibrary\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0cpackageToAdd\x18\x02 \x01(\t\x12\x17\n\x0fpackageToRemove\x18\x03 \x01(\t\"6\n\tPublisher\x12)\n\x0fpublisherStream\x18\x02 \x01(\x0b\x32\x10.PublisherStream\"D\n\x0fPublisherStream\x12\x0f\n\x07moreUrl\x18\x03 \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x11\n\tbrowseUrl\x18S \x01(\t\"s\n\x0c\x45\x64itorChoice\x12\x11\n\tbulletins\x18\x01 \x03(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x1a\n\x06stream\x18\x03 \x01(\x0b\x32\n.SubStream\x12\r\n\x05title\x18\x04 \x01(\t\x12\x10\n\x08subtitle\x18\x05 \x01(\t\"9\n\x0e\x43\x65rtificateSet\x12\x17\n\x0f\x63\x65rtificateHash\x18\x01 \x01(\t\x12\x0e\n\x06sha256\x18\x02 \x01(\t\"\xb5\x01\n\x0c\x44\x65pendencies\x12\x0f\n\x07unknown\x18\x01 \x01(\x05\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12\x1f\n\ndependency\x18\x03 \x03(\x0b\x32\x0b.Dependency\x12\x11\n\ttargetSdk\x18\x04 \x01(\x05\x12\x10\n\x08unknown2\x18\x05 \x01(\x05\x12\x11\n\tsplitApks\x18\x0b \x03(\t\x12-\n\x11libraryDependency\x18\r \x03(\x0b\x32\x12.LibraryDependency\"D\n\nDependency\x12\x13\n\x0bpackageName\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12\x10\n\x08unknown4\x18\x04 \x01(\x05\"=\n\x11LibraryDependency\x12\x13\n\x0bpackageName\x18\x01 \x01(\t\x12\x13\n\x0bversionCode\x18\x02 \x01(\x03\"\x83\x01\n\x12TestingProgramInfo\x12\x12\n\nsubscribed\x18\x02 \x01(\x08\x12\x1e\n\x16subscribedAndInstalled\x18\x03 \x01(\x08\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x13\n\x0b\x64isplayName\x18\x07 \x01(\t\x12\x15\n\x05image\x18\x06 \x01(\x0b\x32\x06.Image\" \n\x0f\x45\x61rlyAccessInfo\x12\r\n\x05\x65mail\x18\x03 \x01(\t\"e\n\x0f\x44ocumentDetails\x12\x1f\n\nappDetails\x18\x01 \x01(\x0b\x32\x0b.AppDetails\x12\x31\n\x13subscriptionDetails\x18\x07 \x01(\x0b\x32\x14.SubscriptionDetails\"5\n\x0cPatchDetails\x12\x17\n\x0f\x62\x61seVersionCode\x18\x01 \x01(\x05\x12\x0c\n\x04size\x18\x02 \x01(\x03\"\x91\x01\n\x0c\x46ileMetadata\x12\x10\n\x08\x66ileType\x18\x01 \x01(\x05\x12\x13\n\x0bversionCode\x18\x02 \x01(\x05\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x0f\n\x07splitId\x18\x04 \x01(\t\x12\x16\n\x0e\x63ompressedSize\x18\x05 \x01(\x03\x12#\n\x0cpatchDetails\x18\x06 \x03(\x0b\x32\r.PatchDetails\"1\n\x13SubscriptionDetails\x12\x1a\n\x12subscriptionPeriod\x18\x01 \x01(\x05\"\xdf\x01\n\x06\x42ucket\x12\x13\n\x0bmultiCorpus\x18\x02 \x01(\x08\x12\r\n\x05title\x18\x03 \x01(\t\x12\x0f\n\x07iconUrl\x18\x04 \x01(\t\x12\x17\n\x0f\x66ullContentsUrl\x18\x05 \x01(\t\x12\x11\n\trelevance\x18\x06 \x01(\x01\x12\x18\n\x10\x65stimatedResults\x18\x07 \x01(\x03\x12\x17\n\x0f\x61nalyticsCookie\x18\x08 \x01(\t\x12\x1b\n\x13\x66ullContentsListUrl\x18\t \x01(\t\x12\x13\n\x0bnextPageUrl\x18\n \x01(\t\x12\x0f\n\x07ordered\x18\x0b \x01(\x08\"<\n\x0cListResponse\x12\x17\n\x06\x62ucket\x18\x01 \x03(\x0b\x32\x07.Bucket\x12\x13\n\x04item\x18\x02 \x01(\x0b\x32\x05.Item\"\x99\x07\n\x04Item\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05subId\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x12\n\ncategoryId\x18\x04 \x01(\x05\x12\r\n\x05title\x18\x05 \x01(\t\x12\x0f\n\x07\x63reator\x18\x06 \x01(\t\x12\x17\n\x0f\x64\x65scriptionHtml\x18\x07 \x01(\t\x12\x15\n\x05offer\x18\x08 \x03(\x0b\x32\x06.Offer\x12#\n\x0c\x61vailability\x18\t \x01(\x0b\x32\r.Availability\x12\x15\n\x05image\x18\n \x03(\x0b\x32\x06.Image\x12\x16\n\x07subItem\x18\x0b \x03(\x0b\x32\x05.Item\x12-\n\x11\x63ontainerMetadata\x18\x0c \x01(\x0b\x32\x12.ContainerMetadata\x12!\n\x07\x64\x65tails\x18\r \x01(\x0b\x32\x10.DocumentDetails\x12)\n\x0f\x61ggregateRating\x18\x0e \x01(\x0b\x32\x10.AggregateRating\x12!\n\x0b\x61nnotations\x18\x0f \x01(\x0b\x32\x0c.Annotations\x12\x12\n\ndetailsUrl\x18\x10 \x01(\t\x12\x10\n\x08shareUrl\x18\x11 \x01(\t\x12\x12\n\nreviewsUrl\x18\x12 \x01(\t\x12\x12\n\nbackendUrl\x18\x13 \x01(\t\x12\x1a\n\x12purchaseDetailsUrl\x18\x14 \x01(\t\x12\x17\n\x0f\x64\x65tailsReusable\x18\x15 \x01(\x08\x12\x10\n\x08subtitle\x18\x16 \x01(\t\x12!\n\x19translatedDescriptionHtml\x18\x17 \x01(\t\x12\x18\n\x10serverLogsCookie\x18\x18 \x01(\x0c\x12\x19\n\x07\x61ppInfo\x18\x19 \x01(\x0b\x32\x08.AppInfo\x12\x0e\n\x06mature\x18\x1a \x01(\x08\x12\x1e\n\x16promotionalDescription\x18\x1b \x01(\t\x12#\n\x1b\x61vailableForPreregistration\x18\x1d \x01(\x08\x12\x17\n\x03tip\x18\x1e \x03(\x0b\x32\n.ReviewTip\x12\x19\n\x11reviewSnippetsUrl\x18\x1f \x01(\t\x12\x19\n\x11\x66orceShareability\x18 \x01(\x08\x12\"\n\x1auseWishlistAsPrimaryAction\x18! \x01(\x08\x12\x1a\n\x12reviewQuestionsUrl\x18\" \x01(\t\x12\x18\n\x10reviewSummaryUrl\x18\' \x01(\t\x12%\n\rcontentRating\x18\x32 \x01(\x0b\x32\x0e.ContentRating\"\x85\x03\n\rContentRating\x12\r\n\x05title\x18\x01 \x01(\t\x12(\n recommendationAndDescriptionHtml\x18\x02 \x01(\t\x12=\n\x12\x63ontentRatingImage\x18\x03 \x01(\x0b\x32!.ContentRating.ContentRatingImage\x12\x16\n\x0erecommendation\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x1a\xce\x01\n\x12\x43ontentRatingImage\x12>\n\tdimension\x18\x03 \x01(\x0b\x32+.ContentRating.ContentRatingImage.Dimension\x12\x36\n\x05image\x18\x06 \x01(\x0b\x32\'.ContentRating.ContentRatingImage.Image\x1a*\n\tDimension\x12\r\n\x05width\x18\x03 \x01(\x05\x12\x0e\n\x06height\x18\x04 \x01(\x05\x1a\x14\n\x05Image\x12\x0b\n\x03url\x18\x01 \x01(\t\":\n\x07\x41ppInfo\x12\r\n\x05title\x18\x01 \x01(\t\x12 \n\x07section\x18\x02 \x03(\x0b\x32\x0f.AppInfoSection\"E\n\x0e\x41ppInfoSection\x12\r\n\x05label\x18\x01 \x01(\t\x12$\n\tcontainer\x18\x03 \x01(\x0b\x32\x11.AppInfoContainer\">\n\x10\x41ppInfoContainer\x12\x15\n\x05image\x18\x01 \x01(\x0b\x32\x06.Image\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"\xb1\r\n\x0b\x41nnotations\x12(\n\x0esectionRelated\x18\x01 \x01(\x0b\x32\x10.SectionMetaData\x12\'\n\rsectionMoreBy\x18\x02 \x01(\x0b\x32\x10.SectionMetaData\x12\x19\n\x07warning\x18\x04 \x03(\x0b\x32\x08.Warning\x12+\n\x11sectionBodyOfWork\x18\x05 \x01(\x0b\x32\x10.SectionMetaData\x12,\n\x12sectionCoreContent\x18\x06 \x01(\x0b\x32\x10.SectionMetaData\x12)\n\x0foverlayMetaData\x18\x07 \x01(\x0b\x32\x10.OverlayMetaData\x12\x1f\n\x0f\x62\x61\x64geForCreator\x18\x08 \x03(\x0b\x32\x06.Badge\x12\x19\n\tinfoBadge\x18\t \x03(\x0b\x32\x06.Badge\x12\'\n\x0e\x61nnotationLink\x18\n \x01(\x0b\x32\x0f.AnnotationLink\x12*\n\x10sectionCrossSell\x18\x0b \x01(\x0b\x32\x10.SectionMetaData\x12\x30\n\x16sectionRelatedItemType\x18\x0c \x01(\x0b\x32\x10.SectionMetaData\x12!\n\x0bpromotedDoc\x18\r \x03(\x0b\x32\x0c.PromotedDoc\x12\x11\n\tofferNote\x18\x0e \x01(\t\x12\x18\n\x10privacyPolicyUrl\x18\x12 \x01(\t\x12.\n\x12suggestion_reasons\x18\x13 \x01(\x0b\x32\x12.SuggestionReasons\x12+\n\x19optimalDeviceClassWarning\x18\x14 \x01(\x0b\x32\x08.Warning\x12\'\n\x0e\x62\x61\x64geContainer\x18\x15 \x01(\x0b\x32\x0f.BadgeContainer\x12\x31\n\x17sectionSuggestForRating\x18\x16 \x01(\x0b\x32\x10.SectionMetaData\x12\x32\n\x18sectionPurchaseCrossSell\x18\x18 \x01(\x0b\x32\x10.SectionMetaData\x12#\n\x0coverflowLink\x18\x19 \x03(\x0b\x32\r.OverflowLink\x12\x17\n\x0f\x61ttributionHtml\x18\x1b \x01(\t\x12\x37\n\x16purchaseHistoryDetails\x18\x1c \x01(\x0b\x32\x17.PurchaseHistoryDetails\x12$\n\x14\x62\x61\x64geForLegacyRating\x18\x1d \x01(\x0b\x32\x06.Badge\x12!\n\x0bvoucherInfo\x18\x1e \x03(\x0b\x32\x0c.VoucherInfo\x12-\n\x13sectionFeaturedApps\x18 \x01(\x0b\x32\x10.SectionMetaData\x12,\n\x12\x64\x65tailsPageCluster\x18\" \x03(\x0b\x32\x10.SectionMetaData\x12+\n\x10videoAnnotations\x18# \x01(\x0b\x32\x11.VideoAnnotations\x12\x36\n\x1csectionPurchaseRelatedTopics\x18$ \x01(\x0b\x32\x10.SectionMetaData\x12\x35\n\x15mySubscriptionDetails\x18% \x01(\x0b\x32\x16.MySubscriptionDetails\x12)\n\x0fmyRewardDetails\x18& \x01(\x0b\x32\x10.MyRewardDetails\x12\x1c\n\x0c\x66\x65\x61tureBadge\x18\' \x03(\x0b\x32\x06.Badge\x12\x19\n\x07snippet\x18* \x01(\x0b\x32\x08.Snippet\x12\x16\n\x0e\x64ownloadsLabel\x18\x30 \x01(\t\x12\x1e\n\x0e\x62\x61\x64geForRating\x18\x32 \x01(\x0b\x32\x06.Badge\x12#\n\x0c\x63\x61tegoryInfo\x18\x35 \x01(\x0b\x32\r.CategoryInfo\x12\x1e\n\x07reasons\x18< \x01(\x0b\x32\r.EditorReason\x12\x1f\n\x0etopChartStream\x18\x41 \x01(\x0b\x32\x07.Stream\x12\x14\n\x0c\x63\x61tegoryName\x18\x42 \x01(\t\x12\x13\n\x04\x63hip\x18G \x03(\x0b\x32\x05.Chip\x12\x1c\n\x0c\x64isplayBadge\x18H \x03(\x0b\x32\x06.Badge\x12\x15\n\rliveStreamUrl\x18P \x01(\t\x12\x1a\n\x12promotionStreamUrl\x18U \x01(\t\x12.\n\x14overlayMetaDataExtra\x18[ \x01(\x0b\x32\x10.OverlayMetaData\x12#\n\x0csectionImage\x18^ \x01(\x0b\x32\r.SectionImage\x12\"\n\x0e\x63\x61tegoryStream\x18\x61 \x01(\x0b\x32\n.SubStream\"5\n\x0c\x45\x64itorReason\x12\x10\n\x08\x62ulletin\x18\x01 \x03(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"Z\n\x0fSectionMetaData\x12\x0e\n\x06header\x18\x01 \x01(\t\x12\x0f\n\x07listUrl\x18\x02 \x01(\t\x12\x11\n\tbrowseUrl\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\"\x90\x01\n\x0fOverlayMetaData\x12%\n\roverlayHeader\x18\x01 \x01(\x0b\x32\x0e.OverlayHeader\x12$\n\x0coverlayTitle\x18\xb5\x01 \x01(\x0b\x32\r.OverlayTitle\x12\x30\n\x12overlayDescription\x18\xb6\x01 \x01(\x0b\x32\x13.OverlayDescription\"\x0f\n\rOverlayHeader\"F\n\x0cOverlayTitle\x12\r\n\x05title\x18\x01 \x01(\t\x12\'\n\x0e\x63ompositeImage\x18\x03 \x01(\x0b\x32\x0f.CompositeImage\"[\n\x0e\x43ompositeImage\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x0b\n\x03url\x18\x05 \x01(\t\x12\x0f\n\x07typeAlt\x18\t \x01(\x05\x12\r\n\x05title\x18\x18 \x01(\t\x12\x0e\n\x06urlAlt\x18\x1c \x01(\t\")\n\x12OverlayDescription\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"y\n\x11SuggestionReasons\x12\x17\n\x06reason\x18\x02 \x03(\x0b\x32\x07.Reason\x12$\n\x10neutralDismissal\x18\x04 \x01(\x0b\x32\n.Dismissal\x12%\n\x11positiveDismissal\x18\x05 \x01(\x0b\x32\n.Dismissal\"\xb9\x01\n\x06Reason\x12\x17\n\x0f\x64\x65scriptionHtml\x18\x03 \x01(\t\x12%\n\rreasonPlusOne\x18\x04 \x01(\x0b\x32\x0e.ReasonPlusOne\x12#\n\x0creasonReview\x18\x05 \x01(\x0b\x32\r.ReasonReview\x12\x1d\n\tdismissal\x18\x07 \x01(\x0b\x32\n.Dismissal\x12+\n\x10reasonUserAction\x18\t \x01(\x0b\x32\x11.ReasonUserAction\"T\n\rReasonPlusOne\x12 \n\x18localizedDescriptionHtml\x18\x01 \x01(\t\x12!\n\x0buserProfile\x18\x03 \x03(\x0b\x32\x0c.UserProfile\"\'\n\x0cReasonReview\x12\x17\n\x06review\x18\x01 \x01(\x0b\x32\x07.Review\"W\n\x10ReasonUserAction\x12!\n\x0buserProfile\x18\x01 \x01(\x0b\x32\x0c.UserProfile\x12 \n\x18localizedDescriptionHtml\x18\x02 \x01(\t\"1\n\tDismissal\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65scriptionHtml\x18\x02 \x01(\t\"\x1e\n\x07Snippet\x12\x13\n\x0bsnippetHtml\x18\x01 \x01(\t\"~\n\x0fMyRewardDetails\x12\x1c\n\x14\x65xpirationTimeMillis\x18\x01 \x01(\x03\x12\x1d\n\x15\x65xpirationDescription\x18\x02 \x01(\t\x12\x13\n\x0b\x62uttonLabel\x18\x03 \x01(\t\x12\x19\n\nlinkAction\x18\x04 \x01(\x0b\x32\x05.Link\"\x91\x02\n\x15MySubscriptionDetails\x12\x1e\n\x16subscriptionStatusHtml\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x17\n\x0ftitleByLineHtml\x18\x03 \x01(\t\x12\x16\n\x0e\x66ormattedPrice\x18\x04 \x01(\t\x12\x17\n\x0fpriceByLineHtml\x18\x05 \x01(\t\x12\x1a\n\x12\x63\x61ncelSubscription\x18\x06 \x01(\x08\x12+\n\x1cpaymentDeclinedLearnMoreLink\x18\x07 \x01(\x0b\x32\x05.Link\x12\x15\n\rinTrialPeriod\x18\x08 \x01(\x08\x12\x1f\n\x0ftitleByLineIcon\x18\t \x01(\x0b\x32\x06.Image\"\x9b\x01\n\x10VideoAnnotations\x12\x0e\n\x06\x62undle\x18\x01 \x01(\x08\x12\x1c\n\x14\x62undleContentListUrl\x18\x02 \x01(\t\x12\x1c\n\x14\x65xtrasContentListUrl\x18\x03 \x01(\t\x12\x1e\n\x16\x61lsoAvailableInListUrl\x18\x04 \x01(\t\x12\x1b\n\x0b\x62undleDocId\x18\x05 \x03(\x0b\x32\x06.DocId\"9\n\x0bVoucherInfo\x12\x13\n\x04item\x18\x01 \x01(\x0b\x32\x05.Item\x12\x15\n\x05offer\x18\x02 \x03(\x0b\x32\x06.Offer\"M\n\x0e\x42\x61\x64geContainer\x12\r\n\x05title\x18\x01 \x01(\t\x12\x15\n\x05image\x18\x02 \x03(\x0b\x32\x06.Image\x12\x15\n\x05\x62\x61\x64ge\x18\x03 \x03(\x0b\x32\x06.Badge\"2\n\x0cOverflowLink\x12\r\n\x05title\x18\x01 \x01(\t\x12\x13\n\x04link\x18\x02 \x01(\x0b\x32\x05.Link\"n\n\x0bPromotedDoc\x12\r\n\x05title\x18\x01 \x01(\t\x12\x10\n\x08subtitle\x18\x02 \x01(\t\x12\x15\n\x05image\x18\x03 \x03(\x0b\x32\x06.Image\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x12\n\ndetailsUrl\x18\x05 \x01(\t\"#\n\x07Warning\x12\x18\n\x10localizedMessage\x18\x01 \x01(\t\"V\n\x0e\x41nnotationLink\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12#\n\x0cresolvedLink\x18\x02 \x01(\x0b\x32\r.ResolvedLink\x12\x12\n\nuriBackend\x18\x03 \x01(\x05\"H\n\x05Rated\x12\r\n\x05label\x18\x01 \x01(\t\x12\x15\n\x05image\x18\x02 \x01(\x0b\x32\x06.Image\x12\x19\n\x11learnMoreHtmlLink\x18\x04 \x01(\t\"\xb8\x01\n\x05\x42\x61\x64ge\x12\r\n\x05major\x18\x01 \x01(\t\x12\x15\n\x05image\x18\x02 \x01(\x0b\x32\x06.Image\x12\r\n\x05minor\x18\x03 \x01(\t\x12\x11\n\tminorHtml\x18\x04 \x01(\t\x12\x1b\n\x08subBadge\x18\x06 \x01(\x0b\x32\t.SubBadge\x12\x19\n\x04link\x18\x07 \x01(\x0b\x32\x0b.StreamLink\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x1a\n\x06stream\x18\x0c \x01(\x0b\x32\n.SubStream\"Q\n\x08SubBadge\x12\x15\n\x05image\x18\x01 \x01(\x0b\x32\x06.Image\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x19\n\x04link\x18\x05 \x01(\x0b\x32\x0b.StreamLink\"X\n\x06Stream\x12\r\n\x05title\x18\x01 \x01(\t\x12\x1a\n\x06stream\x18\x02 \x01(\x0b\x32\n.SubStream\x12\x10\n\x08subtitle\x18\x03 \x01(\t\x12\x11\n\tbrowseUrl\x18S \x01(\t\"&\n\tSubStream\x12\x19\n\x04link\x18\x02 \x01(\x0b\x32\x0b.StreamLink\"L\n\x04Link\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12#\n\x0cresolvedLink\x18\x02 \x01(\x0b\x32\r.ResolvedLink\x12\x12\n\nuriBackend\x18\x03 \x01(\x05\"l\n\nStreamLink\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x11\n\tstreamUrl\x18\x02 \x01(\t\x12\x11\n\tsearchUrl\x18\x03 \x01(\t\x12\x16\n\x0esubCategoryUrl\x18\x05 \x01(\t\x12\x13\n\x0bsearchQuery\x18\x0b \x01(\t\"1\n\x04\x43hip\x12\r\n\x05title\x18\x01 \x01(\t\x12\x1a\n\x06stream\x18\x02 \x01(\x0b\x32\n.SubStream\"5\n\x0c\x43\x61tegoryInfo\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x13\n\x0b\x61ppCategory\x18\x02 \x01(\t\"\x99\x01\n\x17\x45ncryptedSubscriberInfo\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\t\x12\x14\n\x0c\x65ncryptedKey\x18\x02 \x01(\t\x12\x11\n\tsignature\x18\x03 \x01(\t\x12\x12\n\ninitVector\x18\x04 \x01(\t\x12\x18\n\x10googleKeyVersion\x18\x05 \x01(\x05\x12\x19\n\x11\x63\x61rrierKeyVersion\x18\x06 \x01(\x05\"\x80\x04\n\x0c\x41vailability\x12\x13\n\x0brestriction\x18\x05 \x01(\x05\x12\x11\n\tofferType\x18\x06 \x01(\x05\x12\x13\n\x04rule\x18\x07 \x01(\x0b\x32\x05.Rule\x12X\n perdeviceavailabilityrestriction\x18\t \x03(\n2..Availability.PerDeviceAvailabilityRestriction\x12\x18\n\x10\x61vailableIfOwned\x18\r \x01(\x08\x12\x19\n\x07install\x18\x0e \x03(\x0b\x32\x08.Install\x12)\n\nfilterInfo\x18\x10 \x01(\x0b\x32\x15.FilterEvaluationInfo\x12%\n\rownershipInfo\x18\x11 \x01(\x0b\x32\x0e.OwnershipInfo\x12\x31\n\x13\x61vailabilityProblem\x18\x12 \x03(\x0b\x32\x14.AvailabilityProblem\x12\x0e\n\x06hidden\x18\x15 \x01(\x08\x1a\x8e\x01\n PerDeviceAvailabilityRestriction\x12\x11\n\tandroidId\x18\n \x01(\x06\x12\x19\n\x11\x64\x65viceRestriction\x18\x0b \x01(\x05\x12\x11\n\tchannelId\x18\x0c \x01(\x03\x12)\n\nfilterInfo\x18\x0f \x01(\x0b\x32\x15.FilterEvaluationInfo\"@\n\x13\x41vailabilityProblem\x12\x13\n\x0bproblemType\x18\x01 \x01(\x05\x12\x14\n\x0cmissingValue\x18\x02 \x03(\t\"?\n\x14\x46ilterEvaluationInfo\x12\'\n\x0eruleEvaluation\x18\x01 \x03(\x0b\x32\x0f.RuleEvaluation\"\x93\x02\n\x04Rule\x12\x0e\n\x06negate\x18\x01 \x01(\x08\x12\x10\n\x08operator\x18\x02 \x01(\x05\x12\x0b\n\x03key\x18\x03 \x01(\x05\x12\x11\n\tstringArg\x18\x04 \x03(\t\x12\x0f\n\x07longArg\x18\x05 \x03(\x03\x12\x11\n\tdoubleArg\x18\x06 \x03(\x01\x12\x16\n\x07subRule\x18\x07 \x03(\x0b\x32\x05.Rule\x12\x14\n\x0cresponseCode\x18\x08 \x01(\x05\x12\x0f\n\x07\x63omment\x18\t \x01(\t\x12\x15\n\rstringArgHash\x18\n \x03(\x06\x12\x10\n\x08\x63onstArg\x18\x0b \x03(\x05\x12\x1f\n\x17\x61vailabilityProblemType\x18\x0c \x01(\x05\x12\x1c\n\x14includeMissingValues\x18\r \x01(\x08\"\x8d\x01\n\x0eRuleEvaluation\x12\x13\n\x04rule\x18\x01 \x01(\x0b\x32\x05.Rule\x12\x19\n\x11\x61\x63tualStringValue\x18\x02 \x03(\t\x12\x17\n\x0f\x61\x63tualLongValue\x18\x03 \x03(\x03\x12\x17\n\x0f\x61\x63tualBoolValue\x18\x04 \x03(\x08\x12\x19\n\x11\x61\x63tualDoubleValue\x18\x05 \x03(\x01\"t\n\x11LibraryAppDetails\x12\x17\n\x0f\x63\x65rtificateHash\x18\x02 \x01(\t\x12\x1e\n\x16refundTimeoutTimestamp\x18\x03 \x01(\x03\x12&\n\x1epostDeliveryRefundWindowMillis\x18\x04 \x01(\x03\"D\n\x13LibraryInAppDetails\x12\x1a\n\x12signedPurchaseData\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\t\"\xf0\x01\n\x0fLibraryMutation\x12\x15\n\x05\x44ocId\x18\x01 \x01(\x0b\x32\x06.DocId\x12\x11\n\tofferType\x18\x02 \x01(\x05\x12\x14\n\x0c\x64ocumentHash\x18\x03 \x01(\x03\x12\x0f\n\x07\x64\x65leted\x18\x04 \x01(\x08\x12&\n\nappDetails\x18\x05 \x01(\x0b\x32\x12.LibraryAppDetails\x12\x38\n\x13subscriptionDetails\x18\x06 \x01(\x0b\x32\x1b.LibrarySubscriptionDetails\x12*\n\x0cinAppDetails\x18\x07 \x01(\x0b\x32\x14.LibraryInAppDetails\"\xb8\x01\n\x1aLibrarySubscriptionDetails\x12\x1b\n\x13initiationTimestamp\x18\x01 \x01(\x03\x12\x1b\n\x13validUntilTimestamp\x18\x02 \x01(\x03\x12\x14\n\x0c\x61utoRenewing\x18\x03 \x01(\x08\x12\x1b\n\x13trialUntilTimestamp\x18\x04 \x01(\x03\x12\x1a\n\x12signedPurchaseData\x18\x05 \x01(\t\x12\x11\n\tsignature\x18\x06 \x01(\t\"\x8c\x01\n\rLibraryUpdate\x12\x0e\n\x06status\x18\x01 \x01(\x05\x12\x0e\n\x06\x63orpus\x18\x02 \x01(\x05\x12\x13\n\x0bserverToken\x18\x03 \x01(\x0c\x12\"\n\x08mutation\x18\x04 \x03(\x0b\x32\x10.LibraryMutation\x12\x0f\n\x07hasMore\x18\x05 \x01(\x08\x12\x11\n\tlibraryId\x18\x06 \x01(\t\"B\n\x1a\x41ndroidAppNotificationData\x12\x13\n\x0bversionCode\x18\x01 \x01(\x05\x12\x0f\n\x07\x61ssetId\x18\x02 \x01(\t\"M\n\x15InAppNotificationData\x12\x17\n\x0f\x63heckoutOrderId\x18\x01 \x01(\t\x12\x1b\n\x13inAppNotificationId\x18\x02 \x01(\t\"6\n\x10LibraryDirtyData\x12\x0f\n\x07\x62\x61\x63kend\x18\x01 \x01(\x05\x12\x11\n\tlibraryId\x18\x02 \x01(\t\"\x97\x04\n\x0cNotification\x12\x18\n\x10notificationType\x18\x01 \x01(\x05\x12\x11\n\ttimestamp\x18\x03 \x01(\x03\x12\x15\n\x05\x44ocId\x18\x04 \x01(\x0b\x32\x06.DocId\x12\x10\n\x08\x64ocTitle\x18\x05 \x01(\t\x12\x11\n\tuserEmail\x18\x06 \x01(\t\x12,\n\x07\x61ppData\x18\x07 \x01(\x0b\x32\x1b.AndroidAppNotificationData\x12\x30\n\x0f\x61ppDeliveryData\x18\x08 \x01(\x0b\x32\x17.AndroidAppDeliveryData\x12\x31\n\x13purchaseRemovalData\x18\t \x01(\x0b\x32\x14.PurchaseRemovalData\x12\x33\n\x14userNotificationData\x18\n \x01(\x0b\x32\x15.UserNotificationData\x12\x35\n\x15inAppNotificationData\x18\x0b \x01(\x0b\x32\x16.InAppNotificationData\x12\x33\n\x14purchaseDeclinedData\x18\x0c \x01(\x0b\x32\x15.PurchaseDeclinedData\x12\x16\n\x0enotificationId\x18\r \x01(\t\x12%\n\rlibraryUpdate\x18\x0e \x01(\x0b\x32\x0e.LibraryUpdate\x12+\n\x10libraryDirtyData\x18\x0f \x01(\x0b\x32\x11.LibraryDirtyData\"@\n\x14PurchaseDeclinedData\x12\x0e\n\x06reason\x18\x01 \x01(\x05\x12\x18\n\x10showNotification\x18\x02 \x01(\x08\"(\n\x13PurchaseRemovalData\x12\x11\n\tmalicious\x18\x01 \x01(\x08\"\x88\x01\n\x14UserNotificationData\x12\x19\n\x11notificationTitle\x18\x01 \x01(\t\x12\x18\n\x10notificationText\x18\x02 \x01(\t\x12\x12\n\ntickerText\x18\x03 \x01(\t\x12\x13\n\x0b\x64ialogTitle\x18\x04 \x01(\t\x12\x12\n\ndialogText\x18\x05 \x01(\t\"\x91\x03\n\x0f\x41ggregateRating\x12\x0f\n\x04type\x18\x01 \x01(\x05:\x01\x31\x12\x12\n\nstarRating\x18\x02 \x01(\x02\x12\x14\n\x0cratingsCount\x18\x03 \x01(\x04\x12\x16\n\x0eoneStarRatings\x18\x04 \x01(\x04\x12\x16\n\x0etwoStarRatings\x18\x05 \x01(\x04\x12\x18\n\x10threeStarRatings\x18\x06 \x01(\x04\x12\x17\n\x0f\x66ourStarRatings\x18\x07 \x01(\x04\x12\x17\n\x0f\x66iveStarRatings\x18\x08 \x01(\x04\x12\x15\n\rthumbsUpCount\x18\t \x01(\x04\x12\x17\n\x0fthumbsDownCount\x18\n \x01(\x04\x12\x14\n\x0c\x63ommentCount\x18\x0b \x01(\x04\x12\x1a\n\x12\x62\x61yesianMeanRating\x18\x0c \x01(\x01\x12\x11\n\x03tip\x18\r \x03(\x0b\x32\x04.Tip\x12\x13\n\x0bratingLabel\x18\x11 \x01(\t\x12#\n\x1bratingCountLabelAbbreviated\x18\x12 \x01(\t\x12\x18\n\x10ratingCountLabel\x18\x13 \x01(\t\"t\n\x03Tip\x12\r\n\x05tipId\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x10\n\x08polarity\x18\x03 \x01(\x05\x12\x13\n\x0breviewCount\x18\x04 \x01(\x03\x12\x10\n\x08language\x18\x05 \x01(\t\x12\x17\n\x0fsnippetReviewId\x18\x06 \x03(\t\"P\n\tReviewTip\x12\x0e\n\x06tipUrl\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x10\n\x08polarity\x18\x03 \x01(\x05\x12\x13\n\x0breviewCount\x18\x04 \x01(\x03\"\x13\n\x11\x41\x63\x63\x65ptTosResponse\"\xe9\x01\n\x14\x43\x61rrierBillingConfig\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\napiVersion\x18\x03 \x01(\x05\x12\x17\n\x0fprovisioningUrl\x18\x04 \x01(\t\x12\x16\n\x0e\x63redentialsUrl\x18\x05 \x01(\t\x12\x13\n\x0btosRequired\x18\x06 \x01(\x08\x12)\n!perTransactionCredentialsRequired\x18\x07 \x01(\x08\x12\x32\n*sendSubscriberIdWithCarrierBillingRequests\x18\x08 \x01(\x08\"^\n\rBillingConfig\x12\x33\n\x14\x63\x61rrierBillingConfig\x18\x01 \x01(\x0b\x32\x15.CarrierBillingConfig\x12\x18\n\x10maxIabApiVersion\x18\x02 \x01(\x05\"\x81\x01\n\x0e\x43orpusMetadata\x12\x0f\n\x07\x62\x61\x63kend\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nlandingUrl\x18\x03 \x01(\t\x12\x13\n\x0blibraryName\x18\x04 \x01(\t\x12\x15\n\rrecsWidgetUrl\x18\x06 \x01(\t\x12\x10\n\x08shopName\x18\x07 \x01(\t\"#\n\x0b\x45xperiments\x12\x14\n\x0c\x65xperimentId\x18\x01 \x03(\t\"3\n\x10SelfUpdateConfig\x12\x1f\n\x17latestClientVersionCode\x18\x01 \x01(\x05\"\xd6\x04\n\x0bTocResponse\x12\x1f\n\x06\x63orpus\x18\x01 \x03(\x0b\x32\x0f.CorpusMetadata\x12\x1c\n\x14tosVersionDeprecated\x18\x02 \x01(\x05\x12\x12\n\ntosContent\x18\x03 \x01(\t\x12\x0f\n\x07homeUrl\x18\x04 \x01(\t\x12!\n\x0b\x65xperiments\x18\x05 \x01(\x0b\x32\x0c.Experiments\x12&\n\x1etosCheckboxTextMarketingEmails\x18\x06 \x01(\t\x12\x10\n\x08tosToken\x18\x07 \x01(\t\x12#\n\x0cuserSettings\x18\x08 \x01(\x0b\x32\r.UserSettings\x12\x17\n\x0ficonOverrideUrl\x18\t \x01(\t\x12+\n\x10selfUpdateConfig\x18\n \x01(\x0b\x32\x11.SelfUpdateConfig\x12\"\n\x1arequiresUploadDeviceConfig\x18\x0b \x01(\x08\x12%\n\rbillingConfig\x18\x0c \x01(\x0b\x32\x0e.BillingConfig\x12\x15\n\rrecsWidgetUrl\x18\r \x01(\t\x12\x15\n\rsocialHomeUrl\x18\x0f \x01(\t\x12\x1f\n\x17\x61geVerificationRequired\x18\x10 \x01(\x08\x12\x1a\n\x12gPlusSignupEnabled\x18\x11 \x01(\x08\x12\x15\n\rredeemEnabled\x18\x12 \x01(\x08\x12\x0f\n\x07helpUrl\x18\x13 \x01(\t\x12\x0f\n\x07themeId\x18\x14 \x01(\x05\x12\x1c\n\x14\x65ntertainmentHomeUrl\x18\x15 \x01(\t\x12\x0e\n\x06\x63ookie\x18\x16 \x01(\t\"b\n\x0cUserSettings\x12)\n!tosCheckboxMarketingEmailsOptedIn\x18\x01 \x01(\x08\x12\'\n\x0eprivacySetting\x18\x02 \x01(\x0b\x32\x0f.PrivacySetting\"O\n\x0ePrivacySetting\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x15\n\rcurrentStatus\x18\x02 \x01(\x05\x12\x18\n\x10\x65nabledByDefault\x18\x03 \x01(\x08\"\xc4\x13\n\x07Payload\x12#\n\x0clistResponse\x18\x01 \x01(\x0b\x32\r.ListResponse\x12)\n\x0f\x64\x65tailsResponse\x18\x02 \x01(\x0b\x32\x10.DetailsResponse\x12\'\n\x0ereviewResponse\x18\x03 \x01(\x0b\x32\x0f.ReviewResponse\x12!\n\x0b\x62uyResponse\x18\x04 \x01(\x0b\x32\x0c.BuyResponse\x12\'\n\x0esearchResponse\x18\x05 \x01(\x0b\x32\x0f.SearchResponse\x12!\n\x0btocResponse\x18\x06 \x01(\x0b\x32\x0c.TocResponse\x12\'\n\x0e\x62rowseResponse\x18\x07 \x01(\x0b\x32\x0f.BrowseResponse\x12\x37\n\x16purchaseStatusResponse\x18\x08 \x01(\x0b\x32\x17.PurchaseStatusResponse\x12\x13\n\x0blogResponse\x18\n \x01(\t\x12\x1b\n\x13\x66lagContentResponse\x18\r \x01(\t\x12\x31\n\x13\x62ulkDetailsResponse\x18\x13 \x01(\x0b\x32\x14.BulkDetailsResponse\x12+\n\x10\x64\x65liveryResponse\x18\x15 \x01(\x0b\x32\x11.DeliveryResponse\x12-\n\x11\x61\x63\x63\x65ptTosResponse\x18\x16 \x01(\x0b\x32\x12.AcceptTosResponse\x12\x39\n\x17\x63heckPromoOfferResponse\x18\x18 \x01(\x0b\x32\x18.CheckPromoOfferResponse\x12\x41\n\x1binstrumentSetupInfoResponse\x18\x19 \x01(\x0b\x32\x1c.InstrumentSetupInfoResponse\x12\x37\n\x16\x61ndroidCheckinResponse\x18\x1a \x01(\x0b\x32\x17.AndroidCheckinResponse\x12?\n\x1auploadDeviceConfigResponse\x18\x1c \x01(\x0b\x32\x1b.UploadDeviceConfigResponse\x12\x35\n\x15searchSuggestResponse\x18( \x01(\x0b\x32\x16.SearchSuggestResponse\x12\x39\n\x17\x63onsumePurchaseResponse\x18\x1e \x01(\x0b\x32\x18.ConsumePurchaseResponse\x12\x37\n\x16\x62illingProfileResponse\x18\x1f \x01(\x0b\x32\x17.BillingProfileResponse\x12\x35\n\x15\x64\x65\x62ugSettingsResponse\x18\" \x01(\x0b\x32\x16.DebugSettingsResponse\x12\x35\n\x15\x63heckIabPromoResponse\x18# \x01(\x0b\x32\x16.CheckIabPromoResponse\x12\x43\n\x1cuserActivitySettingsResponse\x18$ \x01(\x0b\x32\x1d.UserActivitySettingsResponse\x12?\n\x1arecordUserActivityResponse\x18% \x01(\x0b\x32\x1b.RecordUserActivityResponse\x12/\n\x12redeemCodeResponse\x18& \x01(\x0b\x32\x13.RedeemCodeResponse\x12/\n\x12selfUpdateResponse\x18\' \x01(\x0b\x32\x13.SelfUpdateResponse\x12U\n%getInitialInstrumentFlowStateResponse\x18) \x01(\x0b\x32&.GetInitialInstrumentFlowStateResponse\x12;\n\x18\x63reateInstrumentResponse\x18* \x01(\x0b\x32\x19.CreateInstrumentResponse\x12-\n\x11\x63hallengeResponse\x18+ \x01(\x0b\x32\x12.ChallengeResponse\x12?\n\x1b\x62\x61\x63kupDeviceChoicesResponse\x18, \x01(\x0b\x32\x1a.BackDeviceChoicesResponse\x12\x45\n\x1d\x62\x61\x63kupDocumentChoicesResponse\x18- \x01(\x0b\x32\x1e.BackupDocumentChoicesResponse\x12\x31\n\x13\x65\x61rlyUpdateResponse\x18. \x01(\x0b\x32\x14.EarlyUpdateResponse\x12+\n\x10preloadsResponse\x18/ \x01(\x0b\x32\x11.PreloadsResponse\x12/\n\x12myAccountsResponse\x18\x30 \x01(\x0b\x32\x13.MyAccountsResponse\x12\x35\n\x15\x63ontentFilterResponse\x18\x31 \x01(\x0b\x32\x16.ContentFilterResponse\x12\x31\n\x13\x65xperimentsResponse\x18\x32 \x01(\x0b\x32\x14.ExperimentsResponse\x12\'\n\x0esurveyResponse\x18\x33 \x01(\x0b\x32\x0f.SurveyResponse\x12#\n\x0cpingResponse\x18\x34 \x01(\x0b\x32\r.PingResponse\x12=\n\x19updateUserSettingResponse\x18\x35 \x01(\x0b\x32\x1a.UpdateUserSettingResponse\x12\x39\n\x17getUserSettingsResponse\x18\x36 \x01(\x0b\x32\x18.GetUserSettingsResponse\x12?\n\x1agetSharingSettingsResponse\x18\x38 \x01(\x0b\x32\x1b.GetSharingSettingsResponse\x12\x45\n\x1dupdateSharingSettingsResponse\x18\x39 \x01(\x0b\x32\x1e.UpdateSharingSettingsResponse\x12\x37\n\x16reviewSnippetsResponse\x18: \x01(\x0b\x32\x17.ReviewSnippetsResponse\x12\x43\n\x1c\x64ocumentSharingStateResponse\x18; \x01(\x0b\x32\x1d.DocumentSharingStateResponse\x12\x37\n\x16moduleDeliveryResponse\x18\x46 \x01(\x0b\x32\x17.ModuleDeliveryResponse\x12\x37\n\x16testingProgramResponse\x18P \x01(\x0b\x32\x17.TestingProgramResponse\x12/\n\x15reviewSummaryResponse\x18\x81\x01 \x01(\x0b\x32\x0f.ReviewResponse\"\x17\n\x15\x43heckIabPromoResponse\"\x1e\n\x1cUserActivitySettingsResponse\"\x1c\n\x1aRecordUserActivityResponse\"\x14\n\x12RedeemCodeResponse\"\x14\n\x12SelfUpdateResponse\"\'\n%GetInitialInstrumentFlowStateResponse\"\x1a\n\x18\x43reateInstrumentResponse\"\x13\n\x11\x43hallengeResponse\"\x1b\n\x19\x42\x61\x63kDeviceChoicesResponse\"\x1f\n\x1d\x42\x61\x63kupDocumentChoicesResponse\"\x15\n\x13\x45\x61rlyUpdateResponse\"\x8e\x02\n\x10PreloadsResponse\x12\x30\n\rconfigPreload\x18\x01 \x01(\x0b\x32\x19.PreloadsResponse.Preload\x12-\n\nappPreload\x18\x02 \x03(\x0b\x32\x19.PreloadsResponse.Preload\x1a\x98\x01\n\x07Preload\x12\x15\n\x05\x44ocId\x18\x01 \x01(\x0b\x32\x06.DocId\x12\x13\n\x0bversionCode\x18\x02 \x01(\x05\x12\r\n\x05title\x18\x03 \x01(\t\x12\x14\n\x04icon\x18\x04 \x01(\x0b\x32\x06.Image\x12\x15\n\rdeliveryToken\x18\x05 \x01(\t\x12\x17\n\x0finstallLocation\x18\x06 \x01(\x05\x12\x0c\n\x04size\x18\x07 \x01(\x03\"\x14\n\x12MyAccountsResponse\"\x17\n\x15\x43ontentFilterResponse\"\x15\n\x13\x45xperimentsResponse\"\x10\n\x0eSurveyResponse\"\x0e\n\x0cPingResponse\"\x1b\n\x19UpdateUserSettingResponse\"\x19\n\x17GetUserSettingsResponse\"\x1c\n\x1aGetSharingSettingsResponse\"\x1f\n\x1dUpdateSharingSettingsResponse\"\x18\n\x16ReviewSnippetsResponse\"\x1e\n\x1c\x44ocumentSharingStateResponse\"\x18\n\x16ModuleDeliveryResponse\"g\n\x08PreFetch\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\"\n\x08response\x18\x02 \x01(\x0b\x32\x10.ResponseWrapper\x12\x0c\n\x04\x65tag\x18\x03 \x01(\t\x12\x0b\n\x03ttl\x18\x04 \x01(\x03\x12\x0f\n\x07softTtl\x18\x05 \x01(\x03\"\'\n\x0eServerMetadata\x12\x15\n\rlatencyMillis\x18\x01 \x01(\x03\".\n\x07Targets\x12\x10\n\x08targetId\x18\x01 \x03(\x03\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"+\n\x0cServerCookie\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\r\n\x05token\x18\x02 \x01(\x0c\"4\n\rServerCookies\x12#\n\x0cserverCookie\x18\x01 \x03(\x0b\x32\r.ServerCookie\"\x96\x02\n\x0fResponseWrapper\x12\x19\n\x07payload\x18\x01 \x01(\x0b\x32\x08.Payload\x12!\n\x08\x63ommands\x18\x02 \x01(\x0b\x32\x0f.ServerCommands\x12\x1b\n\x08preFetch\x18\x03 \x01(\x0b\x32\t.PreFetch\x12#\n\x0cnotification\x18\x04 \x03(\x0b\x32\r.Notification\x12\'\n\x0eserverMetadata\x18\x05 \x01(\x0b\x32\x0f.ServerMetadata\x12\x19\n\x07targets\x18\x06 \x01(\x0b\x32\x08.Targets\x12%\n\rserverCookies\x18\x07 \x01(\x0b\x32\x0e.ServerCookies\x12\x18\n\x10serverLogsCookie\x18\t \x01(\x0c\"2\n\x12ResponseWrapperApi\x12\x1c\n\x07payload\x18\x01 \x01(\x0b\x32\x0b.PayloadApi\"?\n\nPayloadApi\x12\x31\n\x13userProfileResponse\x18\x05 \x01(\x0b\x32\x14.UserProfileResponse\"8\n\x13UserProfileResponse\x12!\n\x0buserProfile\x18\x01 \x01(\x0b\x32\x0c.UserProfile\"]\n\x0eServerCommands\x12\x12\n\nclearCache\x18\x01 \x01(\x08\x12\x1b\n\x13\x64isplayErrorMessage\x18\x02 \x01(\t\x12\x1a\n\x12logErrorStacktrace\x18\x03 \x01(\t\"D\n\x12GetReviewsResponse\x12\x17\n\x06review\x18\x01 \x03(\x0b\x32\x07.Review\x12\x15\n\rmatchingCount\x18\x02 \x01(\x03\"\xed\x02\n\x06Review\x12\x12\n\nauthorName\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\x12\x11\n\ttimestamp\x18\x05 \x01(\x03\x12\x12\n\nstarRating\x18\x06 \x01(\x05\x12\r\n\x05title\x18\x07 \x01(\t\x12\x0f\n\x07\x63omment\x18\x08 \x01(\t\x12\x11\n\tcommentId\x18\t \x01(\t\x12\x12\n\ndeviceName\x18\x13 \x01(\t\x12\x11\n\treplyText\x18\x1d \x01(\t\x12\x16\n\x0ereplyTimeStamp\x18\x1e \x01(\x03\x12\x1d\n\x06\x61uthor\x18\x1f \x01(\x0b\x32\r.ReviewAuthor\x12!\n\x0buserProfile\x18! \x01(\x0b\x32\x0c.UserProfile\x12\x19\n\tsentiment\x18\" \x01(\x0b\x32\x06.Image\x12\x14\n\x0chelpfulCount\x18# \x01(\x05\x12\x15\n\rthumbsUpCount\x18& \x01(\x03\"\xb4\x01\n\x15\x43riticReviewsResponse\x12\r\n\x05title\x18\x01 \x01(\t\x12\x15\n\x05image\x18\x02 \x01(\x0b\x32\x06.Image\x12\x17\n\x0ftotalNumReviews\x18\x03 \x01(\r\x12\x18\n\x10percentFavorable\x18\x04 \x01(\r\x12\x12\n\nsourceText\x18\x05 \x01(\t\x12\x15\n\x06source\x18\x06 \x01(\x0b\x32\x05.Link\x12\x17\n\x06review\x18\x07 \x03(\x0b\x32\x07.Review\"4\n\x0cReviewAuthor\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x16\n\x06\x61vatar\x18\x05 \x01(\x0b\x32\x06.Image\"\xb0\x01\n\x0bUserProfile\x12\x11\n\tprofileId\x18\x01 \x01(\t\x12\x10\n\x08personId\x18\x02 \x01(\t\x12\x13\n\x0bprofileType\x18\x03 \x01(\x05\x12\x12\n\npersonType\x18\x04 \x01(\x05\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x15\n\x05image\x18\n \x03(\x0b\x32\x06.Image\x12\x12\n\nprofileUrl\x18\x13 \x01(\t\x12\x1a\n\x12profileDescription\x18\x16 \x01(\t\"\xc7\x01\n\x0eReviewResponse\x12\x30\n\x13userReviewsResponse\x18\x01 \x01(\x0b\x32\x13.GetReviewsResponse\x12\x13\n\x0bnextPageUrl\x18\x02 \x01(\t\x12\x1b\n\nuserReview\x18\x03 \x01(\x0b\x32\x07.Review\x12\x1a\n\x12suggestionsListUrl\x18\x04 \x01(\t\x12\x35\n\x15\x63riticReviewsResponse\x18\x05 \x01(\x0b\x32\x16.CriticReviewsResponse\"j\n\rRelatedSearch\x12\x11\n\tsearchUrl\x18\x01 \x01(\t\x12\x0e\n\x06header\x18\x02 \x01(\t\x12\x11\n\tbackendId\x18\x03 \x01(\x05\x12\x12\n\x07\x64ocType\x18\x04 \x01(\x05:\x01\x31\x12\x0f\n\x07\x63urrent\x18\x05 \x01(\x08\"\x8b\x02\n\x0eSearchResponse\x12\x15\n\roriginalQuery\x18\x01 \x01(\t\x12\x16\n\x0esuggestedQuery\x18\x02 \x01(\t\x12\x16\n\x0e\x61ggregateQuery\x18\x03 \x01(\x08\x12\x17\n\x06\x62ucket\x18\x04 \x03(\x0b\x32\x07.Bucket\x12\x13\n\x04item\x18\x05 \x03(\x0b\x32\x05.Item\x12%\n\rrelatedSearch\x18\x06 \x03(\x0b\x32\x0e.RelatedSearch\x12\x18\n\x10serverLogsCookie\x18\x07 \x01(\x0c\x12\x18\n\x10\x66ullPageReplaced\x18\x08 \x01(\x08\x12\x14\n\x0c\x63ontainsSnow\x18\t \x01(\x08\x12\x13\n\x0bnextPageUrl\x18\n \x01(\t\";\n\x15SearchSuggestResponse\x12\"\n\x05\x65ntry\x18\x01 \x03(\x0b\x32\x13.SearchSuggestEntry\"\x9e\x02\n\x12SearchSuggestEntry\x12\x0c\n\x04type\x18\x01 \x01(\x05\x12\x16\n\x0esuggestedQuery\x18\x02 \x01(\t\x12:\n\x0eimageContainer\x18\x05 \x01(\x0b\x32\".SearchSuggestEntry.ImageContainer\x12\r\n\x05title\x18\x06 \x01(\t\x12\x46\n\x14packageNameContainer\x18\x08 \x01(\x0b\x32(.SearchSuggestEntry.PackageNameContainer\x1a\"\n\x0eImageContainer\x12\x10\n\x08imageUrl\x18\x05 \x01(\t\x1a+\n\x14PackageNameContainer\x12\x13\n\x0bpackageName\x18\x01 \x01(\t\"?\n\x16TestingProgramResponse\x12%\n\x06result\x18\x02 \x01(\x0b\x32\x15.TestingProgramResult\"?\n\x14TestingProgramResult\x12\'\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32\x16.TestingProgramDetails\"M\n\x15TestingProgramDetails\x12\x12\n\nsubscribed\x18\x02 \x01(\x08\x12\n\n\x02id\x18\x03 \x01(\x03\x12\x14\n\x0cunsubscribed\x18\x04 \x01(\x08\"B\n\nLogRequest\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12!\n\x19\x64ownloadConfirmationQuery\x18\x02 \x01(\t\"?\n\x15TestingProgramRequest\x12\x13\n\x0bpackageName\x18\x01 \x01(\t\x12\x11\n\tsubscribe\x18\x02 \x01(\x08\"\x84\x01\n\x19UploadDeviceConfigRequest\x12\x36\n\x13\x64\x65viceConfiguration\x18\x01 \x01(\x0b\x32\x19.DeviceConfigurationProto\x12\x14\n\x0cmanufacturer\x18\x02 \x01(\t\x12\x19\n\x11gcmRegistrationId\x18\x03 \x01(\t\"=\n\x1aUploadDeviceConfigResponse\x12\x1f\n\x17uploadDeviceConfigToken\x18\x01 \x01(\t\"\xea\x03\n\x15\x41ndroidCheckinRequest\x12\x0c\n\x04imei\x18\x01 \x01(\t\x12\r\n\x02id\x18\x02 \x01(\x03:\x01\x30\x12\x0e\n\x06\x64igest\x18\x03 \x01(\t\x12%\n\x07\x63heckin\x18\x04 \x01(\x0b\x32\x14.AndroidCheckinProto\x12\x14\n\x0c\x64\x65siredBuild\x18\x05 \x01(\t\x12\x0e\n\x06locale\x18\x06 \x01(\t\x12\x11\n\tloggingId\x18\x07 \x01(\x03\x12\x15\n\rmarketCheckin\x18\x08 \x01(\t\x12\x0f\n\x07macAddr\x18\t \x03(\t\x12\x0c\n\x04meid\x18\n \x01(\t\x12\x15\n\raccountCookie\x18\x0b \x03(\t\x12\x10\n\x08timeZone\x18\x0c \x01(\t\x12\x15\n\rsecurityToken\x18\r \x01(\x06\x12\x0f\n\x07version\x18\x0e \x01(\x05\x12\x0f\n\x07otaCert\x18\x0f \x03(\t\x12\x14\n\x0cserialNumber\x18\x10 \x01(\t\x12\x0b\n\x03\x65sn\x18\x11 \x01(\t\x12\x36\n\x13\x64\x65viceConfiguration\x18\x12 \x01(\x0b\x32\x19.DeviceConfigurationProto\x12\x13\n\x0bmacAddrType\x18\x13 \x03(\t\x12\x10\n\x08\x66ragment\x18\x14 \x01(\x05\x12\x10\n\x08userName\x18\x15 \x01(\t\x12\x18\n\x10userSerialNumber\x18\x16 \x01(\x05\"\xa4\x02\n\x16\x41ndroidCheckinResponse\x12\x0f\n\x07statsOk\x18\x01 \x01(\x08\x12#\n\x06intent\x18\x02 \x03(\x0b\x32\x13.AndroidIntentProto\x12\x10\n\x08timeMsec\x18\x03 \x01(\x03\x12\x0e\n\x06\x64igest\x18\x04 \x01(\t\x12\"\n\x07setting\x18\x05 \x03(\x0b\x32\x11.GservicesSetting\x12\x10\n\x08marketOk\x18\x06 \x01(\x08\x12\x11\n\tandroidId\x18\x07 \x01(\x06\x12\x15\n\rsecurityToken\x18\x08 \x01(\x06\x12\x14\n\x0csettingsDiff\x18\t \x01(\x08\x12\x15\n\rdeleteSetting\x18\n \x03(\t\x12%\n\x1d\x64\x65viceCheckinConsistencyToken\x18\x0c \x01(\t\"/\n\x10GservicesSetting\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\r\n\x05value\x18\x02 \x01(\x0c\"\x94\x02\n\x11\x41ndroidBuildProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0f\n\x07product\x18\x02 \x01(\t\x12\x0f\n\x07\x63\x61rrier\x18\x03 \x01(\t\x12\r\n\x05radio\x18\x04 \x01(\t\x12\x12\n\nbootloader\x18\x05 \x01(\t\x12\x0e\n\x06\x63lient\x18\x06 \x01(\t\x12\x11\n\ttimestamp\x18\x07 \x01(\x03\x12\x16\n\x0egoogleServices\x18\x08 \x01(\x05\x12\x0e\n\x06\x64\x65vice\x18\t \x01(\t\x12\x12\n\nsdkVersion\x18\n \x01(\x05\x12\r\n\x05model\x18\x0b \x01(\t\x12\x14\n\x0cmanufacturer\x18\x0c \x01(\t\x12\x14\n\x0c\x62uildProduct\x18\r \x01(\t\x12\x14\n\x0cotaInstalled\x18\x0e \x01(\x08\"\x82\x02\n\x13\x41ndroidCheckinProto\x12!\n\x05\x62uild\x18\x01 \x01(\x0b\x32\x12.AndroidBuildProto\x12\x17\n\x0flastCheckinMsec\x18\x02 \x01(\x03\x12!\n\x05\x65vent\x18\x03 \x03(\x0b\x32\x12.AndroidEventProto\x12$\n\x04stat\x18\x04 \x03(\x0b\x32\x16.AndroidStatisticProto\x12\x16\n\x0erequestedGroup\x18\x05 \x03(\t\x12\x14\n\x0c\x63\x65llOperator\x18\x06 \x01(\t\x12\x13\n\x0bsimOperator\x18\x07 \x01(\t\x12\x0f\n\x07roaming\x18\x08 \x01(\t\x12\x12\n\nuserNumber\x18\t \x01(\x05\"A\n\x11\x41ndroidEventProto\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x10\n\x08timeMsec\x18\x03 \x01(\x03\"\xaa\x01\n\x12\x41ndroidIntentProto\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x0f\n\x07\x64\x61taUri\x18\x02 \x01(\t\x12\x10\n\x08mimeType\x18\x03 \x01(\t\x12\x11\n\tjavaClass\x18\x04 \x01(\t\x12(\n\x05\x65xtra\x18\x05 \x03(\n2\x19.AndroidIntentProto.Extra\x1a$\n\x05\x45xtra\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\r\n\x05value\x18\x07 \x01(\t\"@\n\x15\x41ndroidStatisticProto\x12\x0b\n\x03tag\x18\x01 \x01(\t\x12\r\n\x05\x63ount\x18\x02 \x01(\x05\x12\x0b\n\x03sum\x18\x03 \x01(\x02\"v\n\x12\x43lientLibraryState\x12\x0e\n\x06\x63orpus\x18\x01 \x01(\x05\x12\x13\n\x0bserverToken\x18\x02 \x01(\x0c\x12\x13\n\x0bhashCodeSum\x18\x03 \x01(\x03\x12\x13\n\x0blibrarySize\x18\x04 \x01(\x05\x12\x11\n\tlibraryId\x18\x05 \x01(\t\"\xe2\x01\n\x15\x41ndroidDataUsageProto\x12\x0f\n\x07version\x18\x01 \x01(\x05\x12\x19\n\x11\x63urrentReportMsec\x18\x02 \x01(\x03\x12\x39\n\x17keyToPackageNameMapping\x18\x03 \x03(\x0b\x32\x18.KeyToPackageNameMapping\x12\x31\n\x13payloadLevelAppStat\x18\x04 \x03(\x0b\x32\x14.PayloadLevelAppStat\x12/\n\x12ipLayerNetworkStat\x18\x05 \x03(\x0b\x32\x13.IpLayerNetworkStat\"n\n\x17\x41ndroidUsageStatsReport\x12\x11\n\tandroidId\x18\x01 \x01(\x03\x12\x11\n\tloggingId\x18\x02 \x01(\x03\x12-\n\nusageStats\x18\x03 \x01(\x0b\x32\x19.UsageStatsExtensionProto\"}\n\tAppBucket\x12\x17\n\x0f\x62ucketStartMsec\x18\x01 \x01(\x03\x12\x1a\n\x12\x62ucketDurationMsec\x18\x02 \x01(\x03\x12#\n\x0cstatCounters\x18\x03 \x03(\x0b\x32\r.StatCounters\x12\x16\n\x0eoperationCount\x18\x04 \x01(\x03\"-\n\x0b\x43ounterData\x12\r\n\x05\x62ytes\x18\x01 \x01(\x03\x12\x0f\n\x07packets\x18\x02 \x01(\x03\"b\n\x0eIpLayerAppStat\x12\x12\n\npackageKey\x18\x01 \x01(\x05\x12\x16\n\x0e\x61pplicationTag\x18\x02 \x01(\x05\x12$\n\x10ipLayerAppBucket\x18\x03 \x03(\x0b\x32\n.AppBucket\"\x8f\x01\n\x14IpLayerNetworkBucket\x12\x17\n\x0f\x62ucketStartMsec\x18\x01 \x01(\x03\x12\x1a\n\x12\x62ucketDurationMsec\x18\x02 \x01(\x03\x12#\n\x0cstatCounters\x18\x03 \x03(\x0b\x32\r.StatCounters\x12\x1d\n\x15networkActiveDuration\x18\x04 \x01(\x03\"\x98\x01\n\x12IpLayerNetworkStat\x12\x16\n\x0enetworkDetails\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\x05\x12\x33\n\x14ipLayerNetworkBucket\x18\x03 \x03(\x0b\x32\x15.IpLayerNetworkBucket\x12\'\n\x0eipLayerAppStat\x18\x04 \x03(\x0b\x32\x0f.IpLayerAppStat\"c\n\x17KeyToPackageNameMapping\x12\x12\n\npackageKey\x18\x01 \x01(\x05\x12\x0f\n\x07uidName\x18\x02 \x01(\t\x12#\n\rsharedPackage\x18\x03 \x03(\x0b\x32\x0c.PackageInfo\"3\n\x0bPackageInfo\x12\x0f\n\x07pkgName\x18\x01 \x01(\t\x12\x13\n\x0bversionCode\x18\x02 \x01(\x05\"l\n\x13PayloadLevelAppStat\x12\x12\n\npackageKey\x18\x01 \x01(\x05\x12\x16\n\x0e\x61pplicationTag\x18\x02 \x01(\x05\x12)\n\x15payloadLevelAppBucket\x18\x03 \x03(\x0b\x32\n.AppBucket\"h\n\x0cStatCounters\x12\x14\n\x0cnetworkProto\x18\x01 \x01(\x05\x12\x11\n\tdirection\x18\x02 \x01(\x05\x12!\n\x0b\x63ounterData\x18\x03 \x01(\x0b\x32\x0c.CounterData\x12\x0c\n\x04\x66gBg\x18\x04 \x01(\x05\"E\n\x18UsageStatsExtensionProto\x12)\n\tdataUsage\x18\x01 \x01(\x0b\x32\x16.AndroidDataUsageProto\"\\\n\x14ModifyLibraryRequest\x12\x11\n\tlibraryId\x18\x01 \x01(\t\x12\x16\n\x0e\x61\x64\x64PackageName\x18\x02 \x03(\t\x12\x19\n\x11removePackageName\x18\x03 \x03(\t\"P\n\x0eServerResponse\x12$\n\x05\x65rror\x18\x02 \x01(\x0b\x32\x15.ServerResponse.Error\x1a\x18\n\x05\x45rror\x12\x0f\n\x07message\x18\x02 \x01(\tB\x17\n\x13\x63om.aurora.gplayapiP\x01') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'GooglePlay_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\023com.aurora.gplayapiP\001' + _globals['_ANDROIDAPPDELIVERYDATA']._serialized_start=21 + _globals['_ANDROIDAPPDELIVERYDATA']._serialized_end=621 + _globals['_SPLITDELIVERYDATA']._serialized_start=624 + _globals['_SPLITDELIVERYDATA']._serialized_end=873 + _globals['_ANDROIDAPPPATCHDATA']._serialized_start=876 + _globals['_ANDROIDAPPPATCHDATA']._serialized_end=1007 + _globals['_COMPRESSEDAPPDATA']._serialized_start=1009 + _globals['_COMPRESSEDAPPDATA']._serialized_end=1077 + _globals['_APPFILEMETADATA']._serialized_start=1080 + _globals['_APPFILEMETADATA']._serialized_end=1281 + _globals['_ENCRYPTIONPARAMS']._serialized_start=1283 + _globals['_ENCRYPTIONPARAMS']._serialized_end=1358 + _globals['_HTTPCOOKIE']._serialized_start=1360 + _globals['_HTTPCOOKIE']._serialized_end=1401 + _globals['_ADDRESS']._serialized_start=1404 + _globals['_ADDRESS']._serialized_end=1715 + _globals['_BROWSELINK']._serialized_start=1717 + _globals['_BROWSELINK']._serialized_end=1808 + _globals['_BROWSERESPONSE']._serialized_start=1811 + _globals['_BROWSERESPONSE']._serialized_end=2179 + _globals['_DIRECTPURCHASE']._serialized_start=2181 + _globals['_DIRECTPURCHASE']._serialized_end=2285 + _globals['_REDEEMGIFTCARD']._serialized_start=2287 + _globals['_REDEEMGIFTCARD']._serialized_end=2348 + _globals['_RESOLVEDLINK']._serialized_start=2351 + _globals['_RESOLVEDLINK']._serialized_end=2679 + _globals['_HELPCENTER']._serialized_start=2681 + _globals['_HELPCENTER']._serialized_end=2712 + _globals['_QUICKLINK']._serialized_start=2715 + _globals['_QUICKLINK']._serialized_end=2882 + _globals['_BROWSETAB']._serialized_start=2885 + _globals['_BROWSETAB']._serialized_end=3115 + _globals['_BUYRESPONSE']._serialized_start=3118 + _globals['_BUYRESPONSE']._serialized_end=4479 + _globals['_BUYRESPONSE_CHECKOUTINFO']._serialized_start=3747 + _globals['_BUYRESPONSE_CHECKOUTINFO']._serialized_end=4479 + _globals['_BUYRESPONSE_CHECKOUTINFO_CHECKOUTOPTION']._serialized_start=4057 + _globals['_BUYRESPONSE_CHECKOUTINFO_CHECKOUTOPTION']._serialized_end=4479 + _globals['_LINEITEM']._serialized_start=4481 + _globals['_LINEITEM']._serialized_end=4573 + _globals['_MONEY']._serialized_start=4575 + _globals['_MONEY']._serialized_end=4645 + _globals['_PURCHASENOTIFICATIONRESPONSE']._serialized_start=4648 + _globals['_PURCHASENOTIFICATIONRESPONSE']._serialized_end=4776 + _globals['_PURCHASESTATUSRESPONSE']._serialized_start=4779 + _globals['_PURCHASESTATUSRESPONSE']._serialized_end=5028 + _globals['_PURCHASEHISTORYDETAILS']._serialized_start=5031 + _globals['_PURCHASEHISTORYDETAILS']._serialized_end=5256 + _globals['_BILLINGPROFILERESPONSE']._serialized_start=5258 + _globals['_BILLINGPROFILERESPONSE']._serialized_end=5364 + _globals['_CHECKINSTRUMENTRESPONSE']._serialized_start=5367 + _globals['_CHECKINSTRUMENTRESPONSE']._serialized_end=5529 + _globals['_INSTRUMENTSETUPINFORESPONSE']._serialized_start=5531 + _globals['_INSTRUMENTSETUPINFORESPONSE']._serialized_end=5632 + _globals['_REDEEMGIFTCARDREQUEST']._serialized_start=5634 + _globals['_REDEEMGIFTCARDREQUEST']._serialized_end=5761 + _globals['_REDEEMGIFTCARDRESPONSE']._serialized_start=5764 + _globals['_REDEEMGIFTCARDRESPONSE']._serialized_end=5926 + _globals['_UPDATEINSTRUMENTREQUEST']._serialized_start=5928 + _globals['_UPDATEINSTRUMENTREQUEST']._serialized_end=6009 + _globals['_UPDATEINSTRUMENTRESPONSE']._serialized_start=6012 + _globals['_UPDATEINSTRUMENTRESPONSE']._serialized_end=6224 + _globals['_INITIATEASSOCIATIONRESPONSE']._serialized_start=6226 + _globals['_INITIATEASSOCIATIONRESPONSE']._serialized_end=6274 + _globals['_VERIFYASSOCIATIONRESPONSE']._serialized_start=6277 + _globals['_VERIFYASSOCIATIONRESPONSE']._serialized_end=6416 + _globals['_ADDRESSCHALLENGE']._serialized_start=6419 + _globals['_ADDRESSCHALLENGE']._serialized_end=6726 + _globals['_AUTHENTICATIONCHALLENGE']._serialized_start=6729 + _globals['_AUTHENTICATIONCHALLENGE']._serialized_end=7078 + _globals['_CHALLENGE']._serialized_start=7081 + _globals['_CHALLENGE']._serialized_end=7241 + _globals['_COUNTRY']._serialized_start=7243 + _globals['_COUNTRY']._serialized_end=7293 + _globals['_FORMCHECKBOX']._serialized_start=7295 + _globals['_FORMCHECKBOX']._serialized_end=7377 + _globals['_INPUTVALIDATIONERROR']._serialized_start=7379 + _globals['_INPUTVALIDATIONERROR']._serialized_end=7443 + _globals['_WEBVIEWCHALLENGE']._serialized_start=7446 + _globals['_WEBVIEWCHALLENGE']._serialized_end=7613 + _globals['_ADDCREDITCARDPROMOOFFER']._serialized_start=7616 + _globals['_ADDCREDITCARDPROMOOFFER']._serialized_end=7820 + _globals['_AVAILABLEPROMOOFFER']._serialized_start=7822 + _globals['_AVAILABLEPROMOOFFER']._serialized_end=7897 + _globals['_CHECKPROMOOFFERRESPONSE']._serialized_start=7900 + _globals['_CHECKPROMOOFFERRESPONSE']._serialized_end=8046 + _globals['_REDEEMEDPROMOOFFER']._serialized_start=8048 + _globals['_REDEEMEDPROMOOFFER']._serialized_end=8136 + _globals['_DOCID']._serialized_start=8138 + _globals['_DOCID']._serialized_end=8201 + _globals['_INSTALL']._serialized_start=8203 + _globals['_INSTALL']._serialized_end=8303 + _globals['_GROUPLICENSEKEY']._serialized_start=8306 + _globals['_GROUPLICENSEKEY']._serialized_end=8448 + _globals['_LICENSETERMS']._serialized_start=8450 + _globals['_LICENSETERMS']._serialized_end=8507 + _globals['_OFFER']._serialized_start=8510 + _globals['_OFFER']._serialized_end=9362 + _globals['_MONTHANDDAY']._serialized_start=9364 + _globals['_MONTHANDDAY']._serialized_end=9405 + _globals['_OFFERPAYMENTPERIOD']._serialized_start=9407 + _globals['_OFFERPAYMENTPERIOD']._serialized_end=9514 + _globals['_OFFERPAYMENTOVERRIDE']._serialized_start=9516 + _globals['_OFFERPAYMENTOVERRIDE']._serialized_end=9610 + _globals['_OFFERPAYMENT']._serialized_start=9613 + _globals['_OFFERPAYMENT']._serialized_end=9767 + _globals['_VOUCHERTERMS']._serialized_start=9769 + _globals['_VOUCHERTERMS']._serialized_end=9783 + _globals['_RENTALTERMS']._serialized_start=9786 + _globals['_RENTALTERMS']._serialized_end=9949 + _globals['_SIGNEDDATA']._serialized_start=9951 + _globals['_SIGNEDDATA']._serialized_end=10002 + _globals['_SUBSCRIPTIONCONTENTTERMS']._serialized_start=10004 + _globals['_SUBSCRIPTIONCONTENTTERMS']._serialized_end=10068 + _globals['_GROUPLICENSEINFO']._serialized_start=10070 + _globals['_GROUPLICENSEINFO']._serialized_end=10136 + _globals['_LICENSEDDOCUMENTINFO']._serialized_start=10138 + _globals['_LICENSEDDOCUMENTINFO']._serialized_end=10181 + _globals['_OWNERSHIPINFO']._serialized_start=10184 + _globals['_OWNERSHIPINFO']._serialized_end=10618 + _globals['_SUBSCRIPTIONTERMS']._serialized_start=10620 + _globals['_SUBSCRIPTIONTERMS']._serialized_end=10711 + _globals['_TIMEPERIOD']._serialized_start=10713 + _globals['_TIMEPERIOD']._serialized_end=10754 + _globals['_BILLINGADDRESSSPEC']._serialized_start=10756 + _globals['_BILLINGADDRESSSPEC']._serialized_end=10827 + _globals['_BILLINGPROFILE']._serialized_start=10830 + _globals['_BILLINGPROFILE']._serialized_end=10970 + _globals['_BILLINGPROFILEOPTION']._serialized_start=10973 + _globals['_BILLINGPROFILEOPTION']._serialized_end=11165 + _globals['_CARRIERBILLINGCREDENTIALS']._serialized_start=11167 + _globals['_CARRIERBILLINGCREDENTIALS']._serialized_end=11229 + _globals['_CARRIERBILLINGINSTRUMENT']._serialized_start=11232 + _globals['_CARRIERBILLINGINSTRUMENT']._serialized_end=11529 + _globals['_CARRIERBILLINGINSTRUMENTSTATUS']._serialized_start=11532 + _globals['_CARRIERBILLINGINSTRUMENTSTATUS']._serialized_end=11816 + _globals['_CARRIERTOS']._serialized_start=11819 + _globals['_CARRIERTOS']._serialized_end=11961 + _globals['_CARRIERTOSENTRY']._serialized_start=11963 + _globals['_CARRIERTOSENTRY']._serialized_end=12010 + _globals['_CREDITCARDINSTRUMENT']._serialized_start=12013 + _globals['_CREDITCARDINSTRUMENT']._serialized_end=12175 + _globals['_DEVICEASSOCIATION']._serialized_start=12177 + _globals['_DEVICEASSOCIATION']._serialized_end=12262 + _globals['_DISABLEDINFO']._serialized_start=12264 + _globals['_DISABLEDINFO']._serialized_end=12353 + _globals['_EFEPARAM']._serialized_start=12355 + _globals['_EFEPARAM']._serialized_end=12393 + _globals['_INSTRUMENT']._serialized_start=12396 + _globals['_INSTRUMENT']._serialized_end=12858 + _globals['_INSTRUMENTSETUPINFO']._serialized_start=12861 + _globals['_INSTRUMENTSETUPINFO']._serialized_end=13017 + _globals['_PASSWORDPROMPT']._serialized_start=13019 + _globals['_PASSWORDPROMPT']._serialized_end=13078 + _globals['_STOREDVALUEINSTRUMENT']._serialized_start=13080 + _globals['_STOREDVALUEINSTRUMENT']._serialized_end=13173 + _globals['_TOPUPINFO']._serialized_start=13176 + _globals['_TOPUPINFO']._serialized_end=13309 + _globals['_CONSUMEPURCHASERESPONSE']._serialized_start=13311 + _globals['_CONSUMEPURCHASERESPONSE']._serialized_end=13391 + _globals['_CONTAINERMETADATA']._serialized_start=13394 + _globals['_CONTAINERMETADATA']._serialized_end=13605 + _globals['_CONTAINERVIEW']._serialized_start=13607 + _globals['_CONTAINERVIEW']._serialized_end=13698 + _globals['_FLAGCONTENTRESPONSE']._serialized_start=13700 + _globals['_FLAGCONTENTRESPONSE']._serialized_end=13721 + _globals['_CLIENTDOWNLOADREQUEST']._serialized_start=13724 + _globals['_CLIENTDOWNLOADREQUEST']._serialized_end=14725 + _globals['_CLIENTDOWNLOADREQUEST_APKINFO']._serialized_start=14203 + _globals['_CLIENTDOWNLOADREQUEST_APKINFO']._serialized_end=14254 + _globals['_CLIENTDOWNLOADREQUEST_CERTIFICATECHAIN']._serialized_start=14257 + _globals['_CLIENTDOWNLOADREQUEST_CERTIFICATECHAIN']._serialized_end=14495 + _globals['_CLIENTDOWNLOADREQUEST_CERTIFICATECHAIN_ELEMENT']._serialized_start=14344 + _globals['_CLIENTDOWNLOADREQUEST_CERTIFICATECHAIN_ELEMENT']._serialized_end=14495 + _globals['_CLIENTDOWNLOADREQUEST_DIGESTS']._serialized_start=14497 + _globals['_CLIENTDOWNLOADREQUEST_DIGESTS']._serialized_end=14549 + _globals['_CLIENTDOWNLOADREQUEST_RESOURCE']._serialized_start=14551 + _globals['_CLIENTDOWNLOADREQUEST_RESOURCE']._serialized_end=14624 + _globals['_CLIENTDOWNLOADREQUEST_SIGNATUREINFO']._serialized_start=14626 + _globals['_CLIENTDOWNLOADREQUEST_SIGNATUREINFO']._serialized_end=14725 + _globals['_CLIENTDOWNLOADRESPONSE']._serialized_start=14728 + _globals['_CLIENTDOWNLOADRESPONSE']._serialized_end=14882 + _globals['_CLIENTDOWNLOADRESPONSE_MOREINFO']._serialized_start=14838 + _globals['_CLIENTDOWNLOADRESPONSE_MOREINFO']._serialized_end=14882 + _globals['_CLIENTDOWNLOADSTATSREQUEST']._serialized_start=14884 + _globals['_CLIENTDOWNLOADSTATSREQUEST']._serialized_end=14949 + _globals['_DEBUGINFO']._serialized_start=14951 + _globals['_DEBUGINFO']._serialized_end=15056 + _globals['_DEBUGINFO_TIMING']._serialized_start=15016 + _globals['_DEBUGINFO_TIMING']._serialized_end=15056 + _globals['_DEBUGSETTINGSRESPONSE']._serialized_start=15058 + _globals['_DEBUGSETTINGSRESPONSE']._serialized_end=15140 + _globals['_DELIVERYRESPONSE']._serialized_start=15142 + _globals['_DELIVERYRESPONSE']._serialized_end=15229 + _globals['_BULKDETAILSENTRY']._serialized_start=15231 + _globals['_BULKDETAILSENTRY']._serialized_end=15270 + _globals['_BULKDETAILSREQUEST']._serialized_start=15273 + _globals['_BULKDETAILSREQUEST']._serialized_end=15421 + _globals['_BULKDETAILSRESPONSE']._serialized_start=15423 + _globals['_BULKDETAILSRESPONSE']._serialized_end=15478 + _globals['_DETAILSRESPONSE']._serialized_start=15481 + _globals['_DETAILSRESPONSE']._serialized_end=15804 + _globals['_DISCOVERYBADGE']._serialized_start=15807 + _globals['_DISCOVERYBADGE']._serialized_end=16193 + _globals['_PLAYERBADGE']._serialized_start=16195 + _globals['_PLAYERBADGE']._serialized_end=16237 + _globals['_DISCOVERYBADGELINK']._serialized_start=16239 + _globals['_DISCOVERYBADGELINK']._serialized_end=16330 + _globals['_FEATURES']._serialized_start=16332 + _globals['_FEATURES']._serialized_end=16410 + _globals['_FEATURE']._serialized_start=16412 + _globals['_FEATURE']._serialized_end=16451 + _globals['_DEVICECONFIGURATIONPROTO']._serialized_start=16454 + _globals['_DEVICECONFIGURATIONPROTO']._serialized_end=17102 + _globals['_DEVICEFEATURE']._serialized_start=17104 + _globals['_DEVICEFEATURE']._serialized_end=17148 + _globals['_DOCUMENT']._serialized_start=17151 + _globals['_DOCUMENT']._serialized_end=17734 + _globals['_DOCUMENTVARIANT']._serialized_start=17737 + _globals['_DOCUMENTVARIANT']._serialized_end=18055 + _globals['_SECTIONIMAGE']._serialized_start=18057 + _globals['_SECTIONIMAGE']._serialized_end=18112 + _globals['_IMAGECONTAINER']._serialized_start=18114 + _globals['_IMAGECONTAINER']._serialized_end=18153 + _globals['_IMAGE']._serialized_start=18156 + _globals['_IMAGE']._serialized_end=18728 + _globals['_IMAGE_DIMENSION']._serialized_start=18616 + _globals['_IMAGE_DIMENSION']._serialized_end=18679 + _globals['_IMAGE_CITATION']._serialized_start=18681 + _globals['_IMAGE_CITATION']._serialized_end=18728 + _globals['_ATTRIBUTION']._serialized_start=18730 + _globals['_ATTRIBUTION']._serialized_end=18825 + _globals['_IMAGEPALETTE']._serialized_start=18828 + _globals['_IMAGEPALETTE']._serialized_end=18974 + _globals['_TRANSLATEDTEXT']._serialized_start=18976 + _globals['_TRANSLATEDTEXT']._serialized_end=19050 + _globals['_PLUSONEDATA']._serialized_start=19052 + _globals['_PLUSONEDATA']._serialized_end=19157 + _globals['_PLUSPERSON']._serialized_start=19159 + _globals['_PLUSPERSON']._serialized_end=19217 + _globals['_APPDETAILS']._serialized_start=19220 + _globals['_APPDETAILS']._serialized_end=20530 + _globals['_APPLAUNCH']._serialized_start=20532 + _globals['_APPLAUNCH']._serialized_end=20632 + _globals['_APPLAUNCH_TIME']._serialized_start=20590 + _globals['_APPLAUNCH_TIME']._serialized_end=20632 + _globals['_TAGGROUP']._serialized_start=20635 + _globals['_TAGGROUP']._serialized_end=20795 + _globals['_TAGTYPE']._serialized_start=20797 + _globals['_TAGTYPE']._serialized_end=20834 + _globals['_TAGENTRY']._serialized_start=20836 + _globals['_TAGENTRY']._serialized_end=20910 + _globals['_TAGMETADATA']._serialized_start=20912 + _globals['_TAGMETADATA']._serialized_end=20995 + _globals['_TAGDATA']._serialized_start=20997 + _globals['_TAGDATA']._serialized_end=21034 + _globals['_SUPPORT']._serialized_start=21036 + _globals['_SUPPORT']._serialized_end=21148 + _globals['_COMPATIBILITY']._serialized_start=21150 + _globals['_COMPATIBILITY']._serialized_end=21203 + _globals['_ACTIVEDEVICE']._serialized_start=21205 + _globals['_ACTIVEDEVICE']._serialized_end=21253 + _globals['_MODIFYLIBRARY']._serialized_start=21255 + _globals['_MODIFYLIBRARY']._serialized_end=21329 + _globals['_PUBLISHER']._serialized_start=21331 + _globals['_PUBLISHER']._serialized_end=21385 + _globals['_PUBLISHERSTREAM']._serialized_start=21387 + _globals['_PUBLISHERSTREAM']._serialized_end=21455 + _globals['_EDITORCHOICE']._serialized_start=21457 + _globals['_EDITORCHOICE']._serialized_end=21572 + _globals['_CERTIFICATESET']._serialized_start=21574 + _globals['_CERTIFICATESET']._serialized_end=21631 + _globals['_DEPENDENCIES']._serialized_start=21634 + _globals['_DEPENDENCIES']._serialized_end=21815 + _globals['_DEPENDENCY']._serialized_start=21817 + _globals['_DEPENDENCY']._serialized_end=21885 + _globals['_LIBRARYDEPENDENCY']._serialized_start=21887 + _globals['_LIBRARYDEPENDENCY']._serialized_end=21948 + _globals['_TESTINGPROGRAMINFO']._serialized_start=21951 + _globals['_TESTINGPROGRAMINFO']._serialized_end=22082 + _globals['_EARLYACCESSINFO']._serialized_start=22084 + _globals['_EARLYACCESSINFO']._serialized_end=22116 + _globals['_DOCUMENTDETAILS']._serialized_start=22118 + _globals['_DOCUMENTDETAILS']._serialized_end=22219 + _globals['_PATCHDETAILS']._serialized_start=22221 + _globals['_PATCHDETAILS']._serialized_end=22274 + _globals['_FILEMETADATA']._serialized_start=22277 + _globals['_FILEMETADATA']._serialized_end=22422 + _globals['_SUBSCRIPTIONDETAILS']._serialized_start=22424 + _globals['_SUBSCRIPTIONDETAILS']._serialized_end=22473 + _globals['_BUCKET']._serialized_start=22476 + _globals['_BUCKET']._serialized_end=22699 + _globals['_LISTRESPONSE']._serialized_start=22701 + _globals['_LISTRESPONSE']._serialized_end=22761 + _globals['_ITEM']._serialized_start=22764 + _globals['_ITEM']._serialized_end=23685 + _globals['_CONTENTRATING']._serialized_start=23688 + _globals['_CONTENTRATING']._serialized_end=24077 + _globals['_CONTENTRATING_CONTENTRATINGIMAGE']._serialized_start=23871 + _globals['_CONTENTRATING_CONTENTRATINGIMAGE']._serialized_end=24077 + _globals['_CONTENTRATING_CONTENTRATINGIMAGE_DIMENSION']._serialized_start=18616 + _globals['_CONTENTRATING_CONTENTRATINGIMAGE_DIMENSION']._serialized_end=18658 + _globals['_CONTENTRATING_CONTENTRATINGIMAGE_IMAGE']._serialized_start=24057 + _globals['_CONTENTRATING_CONTENTRATINGIMAGE_IMAGE']._serialized_end=24077 + _globals['_APPINFO']._serialized_start=24079 + _globals['_APPINFO']._serialized_end=24137 + _globals['_APPINFOSECTION']._serialized_start=24139 + _globals['_APPINFOSECTION']._serialized_end=24208 + _globals['_APPINFOCONTAINER']._serialized_start=24210 + _globals['_APPINFOCONTAINER']._serialized_end=24272 + _globals['_ANNOTATIONS']._serialized_start=24275 + _globals['_ANNOTATIONS']._serialized_end=25988 + _globals['_EDITORREASON']._serialized_start=25990 + _globals['_EDITORREASON']._serialized_end=26043 + _globals['_SECTIONMETADATA']._serialized_start=26045 + _globals['_SECTIONMETADATA']._serialized_end=26135 + _globals['_OVERLAYMETADATA']._serialized_start=26138 + _globals['_OVERLAYMETADATA']._serialized_end=26282 + _globals['_OVERLAYHEADER']._serialized_start=26284 + _globals['_OVERLAYHEADER']._serialized_end=26299 + _globals['_OVERLAYTITLE']._serialized_start=26301 + _globals['_OVERLAYTITLE']._serialized_end=26371 + _globals['_COMPOSITEIMAGE']._serialized_start=26373 + _globals['_COMPOSITEIMAGE']._serialized_end=26464 + _globals['_OVERLAYDESCRIPTION']._serialized_start=26466 + _globals['_OVERLAYDESCRIPTION']._serialized_end=26507 + _globals['_SUGGESTIONREASONS']._serialized_start=26509 + _globals['_SUGGESTIONREASONS']._serialized_end=26630 + _globals['_REASON']._serialized_start=26633 + _globals['_REASON']._serialized_end=26818 + _globals['_REASONPLUSONE']._serialized_start=26820 + _globals['_REASONPLUSONE']._serialized_end=26904 + _globals['_REASONREVIEW']._serialized_start=26906 + _globals['_REASONREVIEW']._serialized_end=26945 + _globals['_REASONUSERACTION']._serialized_start=26947 + _globals['_REASONUSERACTION']._serialized_end=27034 + _globals['_DISMISSAL']._serialized_start=27036 + _globals['_DISMISSAL']._serialized_end=27085 + _globals['_SNIPPET']._serialized_start=27087 + _globals['_SNIPPET']._serialized_end=27117 + _globals['_MYREWARDDETAILS']._serialized_start=27119 + _globals['_MYREWARDDETAILS']._serialized_end=27245 + _globals['_MYSUBSCRIPTIONDETAILS']._serialized_start=27248 + _globals['_MYSUBSCRIPTIONDETAILS']._serialized_end=27521 + _globals['_VIDEOANNOTATIONS']._serialized_start=27524 + _globals['_VIDEOANNOTATIONS']._serialized_end=27679 + _globals['_VOUCHERINFO']._serialized_start=27681 + _globals['_VOUCHERINFO']._serialized_end=27738 + _globals['_BADGECONTAINER']._serialized_start=27740 + _globals['_BADGECONTAINER']._serialized_end=27817 + _globals['_OVERFLOWLINK']._serialized_start=27819 + _globals['_OVERFLOWLINK']._serialized_end=27869 + _globals['_PROMOTEDDOC']._serialized_start=27871 + _globals['_PROMOTEDDOC']._serialized_end=27981 + _globals['_WARNING']._serialized_start=27983 + _globals['_WARNING']._serialized_end=28018 + _globals['_ANNOTATIONLINK']._serialized_start=28020 + _globals['_ANNOTATIONLINK']._serialized_end=28106 + _globals['_RATED']._serialized_start=28108 + _globals['_RATED']._serialized_end=28180 + _globals['_BADGE']._serialized_start=28183 + _globals['_BADGE']._serialized_end=28367 + _globals['_SUBBADGE']._serialized_start=28369 + _globals['_SUBBADGE']._serialized_end=28450 + _globals['_STREAM']._serialized_start=28452 + _globals['_STREAM']._serialized_end=28540 + _globals['_SUBSTREAM']._serialized_start=28542 + _globals['_SUBSTREAM']._serialized_end=28580 + _globals['_LINK']._serialized_start=28582 + _globals['_LINK']._serialized_end=28658 + _globals['_STREAMLINK']._serialized_start=28660 + _globals['_STREAMLINK']._serialized_end=28768 + _globals['_CHIP']._serialized_start=28770 + _globals['_CHIP']._serialized_end=28819 + _globals['_CATEGORYINFO']._serialized_start=28821 + _globals['_CATEGORYINFO']._serialized_end=28874 + _globals['_ENCRYPTEDSUBSCRIBERINFO']._serialized_start=28877 + _globals['_ENCRYPTEDSUBSCRIBERINFO']._serialized_end=29030 + _globals['_AVAILABILITY']._serialized_start=29033 + _globals['_AVAILABILITY']._serialized_end=29545 + _globals['_AVAILABILITY_PERDEVICEAVAILABILITYRESTRICTION']._serialized_start=29403 + _globals['_AVAILABILITY_PERDEVICEAVAILABILITYRESTRICTION']._serialized_end=29545 + _globals['_AVAILABILITYPROBLEM']._serialized_start=29547 + _globals['_AVAILABILITYPROBLEM']._serialized_end=29611 + _globals['_FILTEREVALUATIONINFO']._serialized_start=29613 + _globals['_FILTEREVALUATIONINFO']._serialized_end=29676 + _globals['_RULE']._serialized_start=29679 + _globals['_RULE']._serialized_end=29954 + _globals['_RULEEVALUATION']._serialized_start=29957 + _globals['_RULEEVALUATION']._serialized_end=30098 + _globals['_LIBRARYAPPDETAILS']._serialized_start=30100 + _globals['_LIBRARYAPPDETAILS']._serialized_end=30216 + _globals['_LIBRARYINAPPDETAILS']._serialized_start=30218 + _globals['_LIBRARYINAPPDETAILS']._serialized_end=30286 + _globals['_LIBRARYMUTATION']._serialized_start=30289 + _globals['_LIBRARYMUTATION']._serialized_end=30529 + _globals['_LIBRARYSUBSCRIPTIONDETAILS']._serialized_start=30532 + _globals['_LIBRARYSUBSCRIPTIONDETAILS']._serialized_end=30716 + _globals['_LIBRARYUPDATE']._serialized_start=30719 + _globals['_LIBRARYUPDATE']._serialized_end=30859 + _globals['_ANDROIDAPPNOTIFICATIONDATA']._serialized_start=30861 + _globals['_ANDROIDAPPNOTIFICATIONDATA']._serialized_end=30927 + _globals['_INAPPNOTIFICATIONDATA']._serialized_start=30929 + _globals['_INAPPNOTIFICATIONDATA']._serialized_end=31006 + _globals['_LIBRARYDIRTYDATA']._serialized_start=31008 + _globals['_LIBRARYDIRTYDATA']._serialized_end=31062 + _globals['_NOTIFICATION']._serialized_start=31065 + _globals['_NOTIFICATION']._serialized_end=31600 + _globals['_PURCHASEDECLINEDDATA']._serialized_start=31602 + _globals['_PURCHASEDECLINEDDATA']._serialized_end=31666 + _globals['_PURCHASEREMOVALDATA']._serialized_start=31668 + _globals['_PURCHASEREMOVALDATA']._serialized_end=31708 + _globals['_USERNOTIFICATIONDATA']._serialized_start=31711 + _globals['_USERNOTIFICATIONDATA']._serialized_end=31847 + _globals['_AGGREGATERATING']._serialized_start=31850 + _globals['_AGGREGATERATING']._serialized_end=32251 + _globals['_TIP']._serialized_start=32253 + _globals['_TIP']._serialized_end=32369 + _globals['_REVIEWTIP']._serialized_start=32371 + _globals['_REVIEWTIP']._serialized_end=32451 + _globals['_ACCEPTTOSRESPONSE']._serialized_start=32453 + _globals['_ACCEPTTOSRESPONSE']._serialized_end=32472 + _globals['_CARRIERBILLINGCONFIG']._serialized_start=32475 + _globals['_CARRIERBILLINGCONFIG']._serialized_end=32708 + _globals['_BILLINGCONFIG']._serialized_start=32710 + _globals['_BILLINGCONFIG']._serialized_end=32804 + _globals['_CORPUSMETADATA']._serialized_start=32807 + _globals['_CORPUSMETADATA']._serialized_end=32936 + _globals['_EXPERIMENTS']._serialized_start=32938 + _globals['_EXPERIMENTS']._serialized_end=32973 + _globals['_SELFUPDATECONFIG']._serialized_start=32975 + _globals['_SELFUPDATECONFIG']._serialized_end=33026 + _globals['_TOCRESPONSE']._serialized_start=33029 + _globals['_TOCRESPONSE']._serialized_end=33627 + _globals['_USERSETTINGS']._serialized_start=33629 + _globals['_USERSETTINGS']._serialized_end=33727 + _globals['_PRIVACYSETTING']._serialized_start=33729 + _globals['_PRIVACYSETTING']._serialized_end=33808 + _globals['_PAYLOAD']._serialized_start=33811 + _globals['_PAYLOAD']._serialized_end=36311 + _globals['_CHECKIABPROMORESPONSE']._serialized_start=36313 + _globals['_CHECKIABPROMORESPONSE']._serialized_end=36336 + _globals['_USERACTIVITYSETTINGSRESPONSE']._serialized_start=36338 + _globals['_USERACTIVITYSETTINGSRESPONSE']._serialized_end=36368 + _globals['_RECORDUSERACTIVITYRESPONSE']._serialized_start=36370 + _globals['_RECORDUSERACTIVITYRESPONSE']._serialized_end=36398 + _globals['_REDEEMCODERESPONSE']._serialized_start=36400 + _globals['_REDEEMCODERESPONSE']._serialized_end=36420 + _globals['_SELFUPDATERESPONSE']._serialized_start=36422 + _globals['_SELFUPDATERESPONSE']._serialized_end=36442 + _globals['_GETINITIALINSTRUMENTFLOWSTATERESPONSE']._serialized_start=36444 + _globals['_GETINITIALINSTRUMENTFLOWSTATERESPONSE']._serialized_end=36483 + _globals['_CREATEINSTRUMENTRESPONSE']._serialized_start=36485 + _globals['_CREATEINSTRUMENTRESPONSE']._serialized_end=36511 + _globals['_CHALLENGERESPONSE']._serialized_start=36513 + _globals['_CHALLENGERESPONSE']._serialized_end=36532 + _globals['_BACKDEVICECHOICESRESPONSE']._serialized_start=36534 + _globals['_BACKDEVICECHOICESRESPONSE']._serialized_end=36561 + _globals['_BACKUPDOCUMENTCHOICESRESPONSE']._serialized_start=36563 + _globals['_BACKUPDOCUMENTCHOICESRESPONSE']._serialized_end=36594 + _globals['_EARLYUPDATERESPONSE']._serialized_start=36596 + _globals['_EARLYUPDATERESPONSE']._serialized_end=36617 + _globals['_PRELOADSRESPONSE']._serialized_start=36620 + _globals['_PRELOADSRESPONSE']._serialized_end=36890 + _globals['_PRELOADSRESPONSE_PRELOAD']._serialized_start=36738 + _globals['_PRELOADSRESPONSE_PRELOAD']._serialized_end=36890 + _globals['_MYACCOUNTSRESPONSE']._serialized_start=36892 + _globals['_MYACCOUNTSRESPONSE']._serialized_end=36912 + _globals['_CONTENTFILTERRESPONSE']._serialized_start=36914 + _globals['_CONTENTFILTERRESPONSE']._serialized_end=36937 + _globals['_EXPERIMENTSRESPONSE']._serialized_start=36939 + _globals['_EXPERIMENTSRESPONSE']._serialized_end=36960 + _globals['_SURVEYRESPONSE']._serialized_start=36962 + _globals['_SURVEYRESPONSE']._serialized_end=36978 + _globals['_PINGRESPONSE']._serialized_start=36980 + _globals['_PINGRESPONSE']._serialized_end=36994 + _globals['_UPDATEUSERSETTINGRESPONSE']._serialized_start=36996 + _globals['_UPDATEUSERSETTINGRESPONSE']._serialized_end=37023 + _globals['_GETUSERSETTINGSRESPONSE']._serialized_start=37025 + _globals['_GETUSERSETTINGSRESPONSE']._serialized_end=37050 + _globals['_GETSHARINGSETTINGSRESPONSE']._serialized_start=37052 + _globals['_GETSHARINGSETTINGSRESPONSE']._serialized_end=37080 + _globals['_UPDATESHARINGSETTINGSRESPONSE']._serialized_start=37082 + _globals['_UPDATESHARINGSETTINGSRESPONSE']._serialized_end=37113 + _globals['_REVIEWSNIPPETSRESPONSE']._serialized_start=37115 + _globals['_REVIEWSNIPPETSRESPONSE']._serialized_end=37139 + _globals['_DOCUMENTSHARINGSTATERESPONSE']._serialized_start=37141 + _globals['_DOCUMENTSHARINGSTATERESPONSE']._serialized_end=37171 + _globals['_MODULEDELIVERYRESPONSE']._serialized_start=37173 + _globals['_MODULEDELIVERYRESPONSE']._serialized_end=37197 + _globals['_PREFETCH']._serialized_start=37199 + _globals['_PREFETCH']._serialized_end=37302 + _globals['_SERVERMETADATA']._serialized_start=37304 + _globals['_SERVERMETADATA']._serialized_end=37343 + _globals['_TARGETS']._serialized_start=37345 + _globals['_TARGETS']._serialized_end=37391 + _globals['_SERVERCOOKIE']._serialized_start=37393 + _globals['_SERVERCOOKIE']._serialized_end=37436 + _globals['_SERVERCOOKIES']._serialized_start=37438 + _globals['_SERVERCOOKIES']._serialized_end=37490 + _globals['_RESPONSEWRAPPER']._serialized_start=37493 + _globals['_RESPONSEWRAPPER']._serialized_end=37771 + _globals['_RESPONSEWRAPPERAPI']._serialized_start=37773 + _globals['_RESPONSEWRAPPERAPI']._serialized_end=37823 + _globals['_PAYLOADAPI']._serialized_start=37825 + _globals['_PAYLOADAPI']._serialized_end=37888 + _globals['_USERPROFILERESPONSE']._serialized_start=37890 + _globals['_USERPROFILERESPONSE']._serialized_end=37946 + _globals['_SERVERCOMMANDS']._serialized_start=37948 + _globals['_SERVERCOMMANDS']._serialized_end=38041 + _globals['_GETREVIEWSRESPONSE']._serialized_start=38043 + _globals['_GETREVIEWSRESPONSE']._serialized_end=38111 + _globals['_REVIEW']._serialized_start=38114 + _globals['_REVIEW']._serialized_end=38479 + _globals['_CRITICREVIEWSRESPONSE']._serialized_start=38482 + _globals['_CRITICREVIEWSRESPONSE']._serialized_end=38662 + _globals['_REVIEWAUTHOR']._serialized_start=38664 + _globals['_REVIEWAUTHOR']._serialized_end=38716 + _globals['_USERPROFILE']._serialized_start=38719 + _globals['_USERPROFILE']._serialized_end=38895 + _globals['_REVIEWRESPONSE']._serialized_start=38898 + _globals['_REVIEWRESPONSE']._serialized_end=39097 + _globals['_RELATEDSEARCH']._serialized_start=39099 + _globals['_RELATEDSEARCH']._serialized_end=39205 + _globals['_SEARCHRESPONSE']._serialized_start=39208 + _globals['_SEARCHRESPONSE']._serialized_end=39475 + _globals['_SEARCHSUGGESTRESPONSE']._serialized_start=39477 + _globals['_SEARCHSUGGESTRESPONSE']._serialized_end=39536 + _globals['_SEARCHSUGGESTENTRY']._serialized_start=39539 + _globals['_SEARCHSUGGESTENTRY']._serialized_end=39825 + _globals['_SEARCHSUGGESTENTRY_IMAGECONTAINER']._serialized_start=39746 + _globals['_SEARCHSUGGESTENTRY_IMAGECONTAINER']._serialized_end=39780 + _globals['_SEARCHSUGGESTENTRY_PACKAGENAMECONTAINER']._serialized_start=39782 + _globals['_SEARCHSUGGESTENTRY_PACKAGENAMECONTAINER']._serialized_end=39825 + _globals['_TESTINGPROGRAMRESPONSE']._serialized_start=39827 + _globals['_TESTINGPROGRAMRESPONSE']._serialized_end=39890 + _globals['_TESTINGPROGRAMRESULT']._serialized_start=39892 + _globals['_TESTINGPROGRAMRESULT']._serialized_end=39955 + _globals['_TESTINGPROGRAMDETAILS']._serialized_start=39957 + _globals['_TESTINGPROGRAMDETAILS']._serialized_end=40034 + _globals['_LOGREQUEST']._serialized_start=40036 + _globals['_LOGREQUEST']._serialized_end=40102 + _globals['_TESTINGPROGRAMREQUEST']._serialized_start=40104 + _globals['_TESTINGPROGRAMREQUEST']._serialized_end=40167 + _globals['_UPLOADDEVICECONFIGREQUEST']._serialized_start=40170 + _globals['_UPLOADDEVICECONFIGREQUEST']._serialized_end=40302 + _globals['_UPLOADDEVICECONFIGRESPONSE']._serialized_start=40304 + _globals['_UPLOADDEVICECONFIGRESPONSE']._serialized_end=40365 + _globals['_ANDROIDCHECKINREQUEST']._serialized_start=40368 + _globals['_ANDROIDCHECKINREQUEST']._serialized_end=40858 + _globals['_ANDROIDCHECKINRESPONSE']._serialized_start=40861 + _globals['_ANDROIDCHECKINRESPONSE']._serialized_end=41153 + _globals['_GSERVICESSETTING']._serialized_start=41155 + _globals['_GSERVICESSETTING']._serialized_end=41202 + _globals['_ANDROIDBUILDPROTO']._serialized_start=41205 + _globals['_ANDROIDBUILDPROTO']._serialized_end=41481 + _globals['_ANDROIDCHECKINPROTO']._serialized_start=41484 + _globals['_ANDROIDCHECKINPROTO']._serialized_end=41742 + _globals['_ANDROIDEVENTPROTO']._serialized_start=41744 + _globals['_ANDROIDEVENTPROTO']._serialized_end=41809 + _globals['_ANDROIDINTENTPROTO']._serialized_start=41812 + _globals['_ANDROIDINTENTPROTO']._serialized_end=41982 + _globals['_ANDROIDINTENTPROTO_EXTRA']._serialized_start=41946 + _globals['_ANDROIDINTENTPROTO_EXTRA']._serialized_end=41982 + _globals['_ANDROIDSTATISTICPROTO']._serialized_start=41984 + _globals['_ANDROIDSTATISTICPROTO']._serialized_end=42048 + _globals['_CLIENTLIBRARYSTATE']._serialized_start=42050 + _globals['_CLIENTLIBRARYSTATE']._serialized_end=42168 + _globals['_ANDROIDDATAUSAGEPROTO']._serialized_start=42171 + _globals['_ANDROIDDATAUSAGEPROTO']._serialized_end=42397 + _globals['_ANDROIDUSAGESTATSREPORT']._serialized_start=42399 + _globals['_ANDROIDUSAGESTATSREPORT']._serialized_end=42509 + _globals['_APPBUCKET']._serialized_start=42511 + _globals['_APPBUCKET']._serialized_end=42636 + _globals['_COUNTERDATA']._serialized_start=42638 + _globals['_COUNTERDATA']._serialized_end=42683 + _globals['_IPLAYERAPPSTAT']._serialized_start=42685 + _globals['_IPLAYERAPPSTAT']._serialized_end=42783 + _globals['_IPLAYERNETWORKBUCKET']._serialized_start=42786 + _globals['_IPLAYERNETWORKBUCKET']._serialized_end=42929 + _globals['_IPLAYERNETWORKSTAT']._serialized_start=42932 + _globals['_IPLAYERNETWORKSTAT']._serialized_end=43084 + _globals['_KEYTOPACKAGENAMEMAPPING']._serialized_start=43086 + _globals['_KEYTOPACKAGENAMEMAPPING']._serialized_end=43185 + _globals['_PACKAGEINFO']._serialized_start=43187 + _globals['_PACKAGEINFO']._serialized_end=43238 + _globals['_PAYLOADLEVELAPPSTAT']._serialized_start=43240 + _globals['_PAYLOADLEVELAPPSTAT']._serialized_end=43348 + _globals['_STATCOUNTERS']._serialized_start=43350 + _globals['_STATCOUNTERS']._serialized_end=43454 + _globals['_USAGESTATSEXTENSIONPROTO']._serialized_start=43456 + _globals['_USAGESTATSEXTENSIONPROTO']._serialized_end=43525 + _globals['_MODIFYLIBRARYREQUEST']._serialized_start=43527 + _globals['_MODIFYLIBRARYREQUEST']._serialized_end=43619 + _globals['_SERVERRESPONSE']._serialized_start=43621 + _globals['_SERVERRESPONSE']._serialized_end=43701 + _globals['_SERVERRESPONSE_ERROR']._serialized_start=43677 + _globals['_SERVERRESPONSE_ERROR']._serialized_end=43701 +# @@protoc_insertion_point(module_scope) diff --git a/src/build/helper/ggplay_dl/requirements.txt b/src/build/helper/ggplay_dl/requirements.txt new file mode 100644 index 0000000..db53883 --- /dev/null +++ b/src/build/helper/ggplay_dl/requirements.txt @@ -0,0 +1,3 @@ +requests +protobuf +PySocks diff --git a/src/build/utils.sh b/src/build/utils.sh index d795d66..a9388ac 100644 --- a/src/build/utils.sh +++ b/src/build/utils.sh @@ -299,7 +299,7 @@ get_apk() { local base_url="https://www.apkmirror.com" local html="" - local apps_json="./src/build/apps.json" + local apps_json="./src/build/helper/apps.json" local list_url example_url list_url=$(jq -r --arg pkg "$pkg_name" '.apkmirror[$pkg].list_url // empty' "$apps_json") example_url=$(jq -r --arg pkg "$pkg_name" '.apkmirror[$pkg].example_url // empty' "$apps_json") @@ -508,7 +508,7 @@ get_apkpure() { local pkg_name=$1 apk_name=$2 pkg_type=${3:-apk} local html="" - local apps_json="./src/build/apps.json" + local apps_json="./src/build/helper/apps.json" local base_download_url base_download_url=$(jq -r --arg pkg "$pkg_name" '.apkpure[$pkg].download_url // empty' "$apps_json") @@ -590,6 +590,63 @@ get_apkpure() { fi } +# Download APK from Google Play Store via AuroraStore anonymous auth +get_apk_chplay() { + local pkg_name=$1 apk_name=$2 + local pkg_type=${3:-apk} dispenser_url=${4:-} + + local helper_script="./src/build/helper/ggplay_dl/ggplay_dl.py" + + green_log "[+] Downloading $apk_name from Google Play (Ch Play) [$pkg_name]" + + local dispenser_arg="" + [[ -n "$dispenser_url" ]] && dispenser_arg="--dispenser $dispenser_url" + + local result + result=$(python "$helper_script" "$pkg_name" "./download/$apk_name.apk" $dispenser_arg 2>&1) + local exit_code=$? + + local logs + logs=$(echo "$result" | grep -v '^{' | grep -v '^}') + local json_result + json_result=$(echo "$result" | grep '^{') + + if [[ $exit_code -ne 0 ]]; then + red_log "[-] Failed to download $apk_name from Google Play" + [[ -n "$logs" ]] && echo "$logs" >&2 + return 1 + fi + + local success + success=$(echo "$json_result" | jq -r '.success // false' 2>/dev/null) + if [[ "$success" != "true" ]]; then + local error_msg + error_msg=$(echo "$json_result" | jq -r '.error // "Unknown error"' 2>/dev/null) + red_log "[-] Download failed: $error_msg" + return 1 + fi + + local dl_size + dl_size=$(echo "$json_result" | jq -r '.size // 0' 2>/dev/null) + local is_split + is_split=$(echo "$json_result" | jq -r '.isSplit // false' 2>/dev/null) + + green_log "[+] Successfully downloaded $apk_name (${dl_size} bytes)" + + if [[ "$is_split" == "true" ]]; then + if [[ "$pkg_type" == "bundle_extract" ]]; then + green_log "[+] Extracting split APKs" + unzip "./download/$apk_name.apk" -d "./download/$apk_name" > /dev/null 2>&1 + else + green_log "[+] Merging split APKs to standalone apk" + java -jar $APKEditor m -i "./download/$apk_name.apk" -o "./download/$apk_name.apk.merged" > /dev/null 2>&1 + if [[ -f "./download/$apk_name.apk.merged" ]]; then + mv "./download/$apk_name.apk.merged" "./download/$apk_name.apk" + fi + fi + fi +} + # Download files from Telegram channel/group # Required secret in github setting TDL_BACKUP base64 backup file from https://docs.iyear.me/tdl/more/cli/tdl_backup/ # You must login your telegram (recommend use clone account) before backup https://docs.iyear.me/tdl/getting-started/quick-start/#login diff --git a/src/etc/cf_warp.sh b/src/etc/cf_warp.sh deleted file mode 100644 index dc9cb42..0000000 --- a/src/etc/cf_warp.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# Setup Cloudflare warp for bypass cloudflare anti ddos APKMirror: -curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg -echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list -sudo apt-get update && sudo apt-get install cloudflare-warp -y -sudo systemctl enable --now warp-svc.service -warp-cli --accept-tos registration new -warp-cli --accept-tos mode warp -warp-cli --accept-tos connect -sleep 3 -output=$(wget -qO- https://www.cloudflare.com/cdn-cgi/trace | awk -F'=' '/ip|colo|warp/ {printf "%s: %s\n", $1, $2}') -echo "$output" -warp=$(echo "$output" | awk -F':' '/warp/ {print $2}') -if [ "$warp" = " on" ]; then - echo -e "\e[32m[+] Successful install Cloudflare Warp\e[0m" -else - echo -e "\e[31m[-] Can't install Cloudflare Warp\e[0m" -fi