appium-android-driver 5.7.2 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/build/index.js +1 -2
  3. package/build/lib/android-helpers.js +2 -26
  4. package/build/lib/android-helpers.js.map +1 -1
  5. package/build/lib/bootstrap.js +1 -8
  6. package/build/lib/bootstrap.js.map +1 -1
  7. package/build/lib/commands/actions.js +1 -2
  8. package/build/lib/commands/actions.js.map +1 -1
  9. package/build/lib/commands/alert.js +1 -2
  10. package/build/lib/commands/alert.js.map +1 -1
  11. package/build/lib/commands/app-management.js +2 -16
  12. package/build/lib/commands/app-management.js.map +1 -1
  13. package/build/lib/commands/context.js +1 -15
  14. package/build/lib/commands/context.js.map +1 -1
  15. package/build/lib/commands/element.js +1 -4
  16. package/build/lib/commands/element.js.map +1 -1
  17. package/build/lib/commands/emu-console.js +1 -3
  18. package/build/lib/commands/emu-console.js.map +1 -1
  19. package/build/lib/commands/file-actions.js +1 -13
  20. package/build/lib/commands/file-actions.js.map +1 -1
  21. package/build/lib/commands/find.js +1 -5
  22. package/build/lib/commands/find.js.map +1 -1
  23. package/build/lib/commands/general.js +1 -83
  24. package/build/lib/commands/general.js.map +1 -1
  25. package/build/lib/commands/index.js +3 -3
  26. package/build/lib/commands/index.js.map +1 -1
  27. package/build/lib/commands/intent.js +1 -5
  28. package/build/lib/commands/intent.js.map +1 -1
  29. package/build/lib/commands/log.js +1 -4
  30. package/build/lib/commands/log.js.map +1 -1
  31. package/build/lib/commands/media-projection.js +1 -5
  32. package/build/lib/commands/media-projection.js.map +1 -1
  33. package/build/lib/commands/network.js +1 -7
  34. package/build/lib/commands/network.js.map +1 -1
  35. package/build/lib/commands/performance.js +1 -8
  36. package/build/lib/commands/performance.js.map +1 -1
  37. package/build/lib/commands/permissions.js +116 -0
  38. package/build/lib/commands/permissions.js.map +1 -0
  39. package/build/lib/commands/recordscreen.js +1 -3
  40. package/build/lib/commands/recordscreen.js.map +1 -1
  41. package/build/lib/commands/shell.js +4 -4
  42. package/build/lib/commands/shell.js.map +1 -1
  43. package/build/lib/commands/streamscreen.js +4 -9
  44. package/build/lib/commands/streamscreen.js.map +1 -1
  45. package/build/lib/commands/system-bars.js +1 -4
  46. package/build/lib/commands/system-bars.js.map +1 -1
  47. package/build/lib/commands/touch.js +1 -9
  48. package/build/lib/commands/touch.js.map +1 -1
  49. package/build/lib/desired-caps.js +2 -4
  50. package/build/lib/desired-caps.js.map +1 -1
  51. package/build/lib/driver.js +1 -20
  52. package/build/lib/driver.js.map +1 -1
  53. package/build/lib/uiautomator.js +1 -3
  54. package/build/lib/uiautomator.js.map +1 -1
  55. package/build/lib/unlock-helpers.js +1 -3
  56. package/build/lib/unlock-helpers.js.map +1 -1
  57. package/build/lib/utils.js +4 -1
  58. package/build/lib/utils.js.map +1 -1
  59. package/build/lib/webview-helpers.js +1 -13
  60. package/build/lib/webview-helpers.js.map +1 -1
  61. package/lib/commands/general.js +0 -112
  62. package/lib/commands/index.js +2 -0
  63. package/lib/commands/permissions.js +169 -0
  64. package/lib/commands/shell.js +2 -3
  65. package/lib/utils.js +2 -1
  66. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"android-helpers.js","names":["MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","default","SETTINGS_HELPER_PKG_ID","SETTINGS_HELPER_UNLOCK_ACTIVITY","EMULATOR_PATTERN","APP_STATE","Object","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","key","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","pushFile","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retry","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlockWithHelperApp","firstRun","launchHelper","isScreenLocked","delay","unlock","driver","capabilities","unlockKey","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","obj","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retry, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from '@appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst SETTINGS_HELPER_UNLOCK_ACTIVITY = '.Unlock';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(`Either provide 'app' option to install '${appPackage}' or ` +\n `consider setting 'noReset' to 'true' if '${appPackage}' is supposed to be preinstalled.`);\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retry(2, async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n });\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlockWithHelperApp = async function unlockWithHelperApp (adb) {\n logger.info('Unlocking screen');\n\n // Unlock succeed with a couple of retries.\n let firstRun = true;\n await retry(3, async function launchHelper () {\n // To reduce a time to call adb.isScreenLocked() since `adb shell dumpsys window` is easy to hang adb commands\n if (firstRun) {\n firstRun = false;\n } else {\n try {\n if (!(await adb.isScreenLocked())) {\n return;\n }\n } catch (e) {\n logger.warn(`Error in isScreenLocked: ${e.message}`);\n logger.warn('\"adb shell dumpsys window\" command has timed out.');\n logger.warn('The reason of this timeout is the delayed adb response. Resetting adb server can improve it.');\n }\n }\n\n logger.info(`Launching ${SETTINGS_HELPER_UNLOCK_ACTIVITY}`);\n await adb.shell([\n 'am', 'start',\n '-n', `${SETTINGS_HELPER_PKG_ID}/${SETTINGS_HELPER_UNLOCK_ACTIVITY}`,\n '-c', 'android.intent.category.LAUNCHER',\n '-a', 'android.intent.action.MAIN',\n '-f', '0x10200000',\n ]);\n await B.delay(1000);\n });\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n logger.debug('Screen is locked, trying to unlock');\n\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.warn('Using app unlock, this is going to be deprecated!');\n await helpers.unlockWithHelperApp(adb);\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n await adb.waitForDevice();\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":"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"}
1
+ {"version":3,"file":"android-helpers.js","names":["MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","default","SETTINGS_HELPER_PKG_ID","SETTINGS_HELPER_UNLOCK_ACTIVITY","EMULATOR_PATTERN","APP_STATE","Object","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","key","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","pushFile","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retry","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlockWithHelperApp","firstRun","launchHelper","isScreenLocked","delay","unlock","driver","capabilities","unlockKey","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","obj","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retry, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from '@appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst SETTINGS_HELPER_UNLOCK_ACTIVITY = '.Unlock';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(`Either provide 'app' option to install '${appPackage}' or ` +\n `consider setting 'noReset' to 'true' if '${appPackage}' is supposed to be preinstalled.`);\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retry(2, async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n });\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlockWithHelperApp = async function unlockWithHelperApp (adb) {\n logger.info('Unlocking screen');\n\n // Unlock succeed with a couple of retries.\n let firstRun = true;\n await retry(3, async function launchHelper () {\n // To reduce a time to call adb.isScreenLocked() since `adb shell dumpsys window` is easy to hang adb commands\n if (firstRun) {\n firstRun = false;\n } else {\n try {\n if (!(await adb.isScreenLocked())) {\n return;\n }\n } catch (e) {\n logger.warn(`Error in isScreenLocked: ${e.message}`);\n logger.warn('\"adb shell dumpsys window\" command has timed out.');\n logger.warn('The reason of this timeout is the delayed adb response. Resetting adb server can improve it.');\n }\n }\n\n logger.info(`Launching ${SETTINGS_HELPER_UNLOCK_ACTIVITY}`);\n await adb.shell([\n 'am', 'start',\n '-n', `${SETTINGS_HELPER_PKG_ID}/${SETTINGS_HELPER_UNLOCK_ACTIVITY}`,\n '-c', 'android.intent.category.LAUNCHER',\n '-a', 'android.intent.action.MAIN',\n '-f', '0x10200000',\n ]);\n await B.delay(1000);\n });\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n logger.debug('Screen is locked, trying to unlock');\n\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.warn('Using app unlock, this is going to be deprecated!');\n await helpers.unlockWithHelperApp(adb);\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n await adb.waitForDevice();\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":"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"}
@@ -20,7 +20,6 @@ const COMMAND_TYPES = {
20
20
  };
21
21
  exports.COMMAND_TYPES = COMMAND_TYPES;
22
22
  const SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;
23
-
24
23
  const getModuleRoot = _lodash.default.memoize(async function getModuleRoot() {
25
24
  let currentDir = _path.default.dirname(_path.default.resolve(__filename));
26
25
  let isAtFsRoot = false;
@@ -60,7 +59,6 @@ class AndroidBootstrap {
60
59
  await this.init();
61
60
  await this.adb.forwardPort(this.systemPort, 4724);
62
61
  this.process = await this.uiAutomator.start(bootstrapJar, 'io.appium.android.bootstrap.Bootstrap', startDetector, '-e', 'pkg', appPackage, '-e', 'disableAndroidWatchers', disableAndroidWatchers, '-e', 'acceptSslCerts', acceptSslCerts);
63
-
64
62
  this.process.on('output', (stdout, stderr) => {
65
63
  const alertRe = /Emitting system alert message/;
66
64
  if (alertRe.test(stdout)) {
@@ -71,7 +69,6 @@ class AndroidBootstrap {
71
69
  });
72
70
  }
73
71
  }
74
-
75
72
  let stdoutLines = (stdout || '').split('\n');
76
73
  const uiautoLog = /\[APPIUM-UIAUTO\](.+)\[\/APPIUM-UIAUTO\]/;
77
74
  for (let line of stdoutLines) {
@@ -95,7 +92,6 @@ class AndroidBootstrap {
95
92
  }
96
93
  }
97
94
  });
98
-
99
95
  return await new _bluebird.default((resolve, reject) => {
100
96
  try {
101
97
  this.socketClient = _net.default.connect(this.systemPort);
@@ -174,7 +170,6 @@ class AndroidBootstrap {
174
170
  log.warn('Cannot shut down Android bootstrap; it has already shut down');
175
171
  return;
176
172
  }
177
-
178
173
  this.uiAutomator.removeAllListeners(_uiautomator.default.EVENT_CHANGED);
179
174
  if (this.socketClient) {
180
175
  await this.sendCommand(COMMAND_TYPES.SHUTDOWN);
@@ -182,10 +177,8 @@ class AndroidBootstrap {
182
177
  await this.uiAutomator.shutdown();
183
178
  this.uiAutomator = null;
184
179
  }
185
-
186
180
  async init() {
187
181
  this.uiAutomator = new _uiautomator.default(this.adb);
188
-
189
182
  this.uiAutomator.on(_uiautomator.default.EVENT_CHANGED, msg => {
190
183
  if (msg.state === _uiautomator.default.STATE_STOPPED) {
191
184
  this.uiAutomator = null;
@@ -204,4 +197,4 @@ class AndroidBootstrap {
204
197
  exports.AndroidBootstrap = AndroidBootstrap;
205
198
  var _default = AndroidBootstrap;
206
199
  exports.default = _default;
207
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJDT01NQU5EX1RZUEVTIiwiQUNUSU9OIiwiU0hVVERPV04iLCJTRU5EX0NPTU1BTkRfVElNRU9VVCIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsImN1cnJlbnREaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlc29sdmUiLCJfX2ZpbGVuYW1lIiwiaXNBdEZzUm9vdCIsIm1hbmlmZXN0UGF0aCIsImpvaW4iLCJmcyIsImV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwibmFtZSIsImlnbiIsImxlbmd0aCIsIkVycm9yIiwiQW5kcm9pZEJvb3RzdHJhcCIsImNvbnN0cnVjdG9yIiwiYWRiIiwic3lzdGVtUG9ydCIsIndlYlNvY2tldCIsInVuZGVmaW5lZCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSIsInJlamVjdCIsIkIiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJjYW5jZWwiLCJzdGFydCIsImFwcFBhY2thZ2UiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJzdGFydERldGVjdG9yIiwicyIsInRlc3QiLCJib290c3RyYXBKYXIiLCJpbml0IiwiZm9yd2FyZFBvcnQiLCJwcm9jZXNzIiwidWlBdXRvbWF0b3IiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsImFsZXJ0UmUiLCJkZWJ1ZyIsInNvY2tldHMiLCJlbWl0IiwibWVzc2FnZSIsInN0ZG91dExpbmVzIiwic3BsaXQiLCJ1aWF1dG9Mb2ciLCJsaW5lIiwidHJpbSIsImlubmVyTGluZSIsImV4ZWMiLCJsb2dNZXRob2QiLCJpbmZvIiwiYmluZCIsInN0ZGVyckxpbmVzIiwic29ja2V0Q2xpZW50IiwibmV0IiwiY29ubmVjdCIsImVyciIsIm9uY2UiLCJlcnJvckFuZFRocm93Iiwic2VuZENvbW1hbmQiLCJ0eXBlIiwiZXh0cmEiLCJjbWQiLCJPYmplY3QiLCJhc3NpZ24iLCJjbWRKc29uIiwic3RyaW5naWZ5IiwidHJ1bmNhdGUiLCJ3cml0ZSIsInNldEVuY29kaW5nIiwic3RyZWFtRGF0YSIsInNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIiLCJkYXRhIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RhdHVzIiwidmFsdWUiLCJlcnJvckZyb21Db2RlIiwiaXNTdHJpbmciLCJlcnJvciIsInN0YWNrIiwic2V0VGltZW91dCIsImVyck1zZyIsInNlbmRBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbXMiLCJzaHV0ZG93biIsIndhcm4iLCJVaUF1dG9tYXRvciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJpZ25vcmUiLCJfaWdub3JlVW5leHBlY3RlZFNodXRkb3duIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVWlBdXRvbWF0b3IgZnJvbSAnLi91aWF1dG9tYXRvcic7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckZyb21Db2RlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBsb2dnZXIsIGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdBbmRyb2lkQm9vdHN0cmFwJyk7XG5jb25zdCBDT01NQU5EX1RZUEVTID0ge1xuICBBQ1RJT046ICdhY3Rpb24nLFxuICBTSFVURE9XTjogJ3NodXRkb3duJ1xufTtcbmNvbnN0IFNFTkRfQ09NTUFORF9USU1FT1VUID0gMSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byBtb2R1bGUgcm9vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IG1vZHVsZSByb290IGZvbGRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNb2R1bGVSb290ID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldE1vZHVsZVJvb3QgKCkge1xuICBsZXQgY3VycmVudERpciA9IHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoX19maWxlbmFtZSkpO1xuICBsZXQgaXNBdEZzUm9vdCA9IGZhbHNlO1xuICB3aGlsZSAoIWlzQXRGc1Jvb3QpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG1hbmlmZXN0UGF0aCkgJiZcbiAgICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcicpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS1hbmRyb2lkLWRyaXZlciBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbmNsYXNzIEFuZHJvaWRCb290c3RyYXAge1xuICBjb25zdHJ1Y3RvciAoYWRiLCBzeXN0ZW1Qb3J0ID0gNDcyNCwgd2ViU29ja2V0ID0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hZGIgPSBhZGI7XG4gICAgdGhpcy5zeXN0ZW1Qb3J0ID0gc3lzdGVtUG9ydDtcbiAgICB0aGlzLndlYlNvY2tldCA9IHdlYlNvY2tldDtcbiAgICB0aGlzLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG9uVW5leHBlY3RlZFNodXRkb3duICgpIHtcbiAgICBpZiAoIXRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSkge1xuICAgICAgbGV0IHJlamVjdDtcbiAgICAgIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSA9IG5ldyBCKGZ1bmN0aW9uIF9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2UgKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZS5jYW5jZWwgPSByZWplY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2U7XG4gIH1cblxuICBhc3luYyBzdGFydCAoYXBwUGFja2FnZSwgZGlzYWJsZUFuZHJvaWRXYXRjaGVycyA9IGZhbHNlLCBhY2NlcHRTc2xDZXJ0cyA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0RGV0ZWN0b3IgPSAocykgPT4gL0FwcGl1bSBTb2NrZXQgU2VydmVyIFJlYWR5Ly50ZXN0KHMpO1xuICAgICAgY29uc3QgYm9vdHN0cmFwSmFyID0gcGF0aC5yZXNvbHZlKGF3YWl0IGdldE1vZHVsZVJvb3QoKSwgJ2Jvb3RzdHJhcCcsICdiaW4nLCAnQXBwaXVtQm9vdHN0cmFwLmphcicpO1xuXG4gICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMuc3lzdGVtUG9ydCwgNDcyNCk7XG4gICAgICB0aGlzLnByb2Nlc3MgPSBhd2FpdCB0aGlzLnVpQXV0b21hdG9yLnN0YXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBKYXIsICdpby5hcHBpdW0uYW5kcm9pZC5ib290c3RyYXAuQm9vdHN0cmFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREZXRlY3RvciwgJy1lJywgJ3BrZycsIGFwcFBhY2thZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICctZScsICdkaXNhYmxlQW5kcm9pZFdhdGNoZXJzJywgZGlzYWJsZUFuZHJvaWRXYXRjaGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgJy1lJywgJ2FjY2VwdFNzbENlcnRzJywgYWNjZXB0U3NsQ2VydHMpO1xuXG4gICAgICAvLyBwcm9jZXNzIHRoZSBvdXRwdXRcbiAgICAgIHRoaXMucHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsZXJ0UmUgPSAvRW1pdHRpbmcgc3lzdGVtIGFsZXJ0IG1lc3NhZ2UvO1xuICAgICAgICBpZiAoYWxlcnRSZS50ZXN0KHN0ZG91dCkpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ0VtaXR0aW5nIGFsZXJ0IG1lc3NhZ2UuLi4nKTtcbiAgICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNvY2tldHMuZW1pdCgnYWxlcnQnLCB7bWVzc2FnZTogc3Rkb3V0fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIGJvb3RzdHJhcCBsb2dnZXIgd3JhcHMgaXRzIG93biBsb2cgbGluZXMgd2l0aFxuICAgICAgICAvLyBbQVBQSVVNLVVJQVVUT10gLi4uIFtBUFBJVU0tVUlBVVRPXVxuICAgICAgICAvLyBhbmQgbGVhdmVzIGFjdHVhbCBVaUF1dG9tYXRvciBsb2dzIGFzIHRoZXkgYXJlXG4gICAgICAgIGxldCBzdGRvdXRMaW5lcyA9IChzdGRvdXQgfHwgJycpLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgdWlhdXRvTG9nID0gL1xcW0FQUElVTS1VSUFVVE9cXF0oLispXFxbXFwvQVBQSVVNLVVJQVVUT1xcXS87XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2Ygc3Rkb3V0TGluZXMpIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIGlmICh1aWF1dG9Mb2cudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICBsZXQgaW5uZXJMaW5lID0gdWlhdXRvTG9nLmV4ZWMobGluZSlbMV0udHJpbSgpO1xuICAgICAgICAgICAgICBsZXQgbG9nTWV0aG9kID0gbG9nLmluZm8uYmluZChsb2cpO1xuICAgICAgICAgICAgICAvLyBpZiB0aGUgYm9vdHN0cmFwIGxvZyBjb25zaWRlcnMgc29tZXRoaW5nIGRlYnVnLCBsb2cgdGhhdCBhc1xuICAgICAgICAgICAgICAvLyBkZWJ1ZyBhbmQgbm90IGluZm9cbiAgICAgICAgICAgICAgaWYgKC9cXFtkZWJ1Z1xcXS8udGVzdChpbm5lckxpbmUpKSB7XG4gICAgICAgICAgICAgICAgbG9nTWV0aG9kID0gbG9nLmRlYnVnLmJpbmQobG9nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb2dNZXRob2QoYFtCT09UU1RSQVAgTE9HXSAke2lubmVyTGluZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1VJQVVUTyBTVERPVVRdICR7bGluZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RkZXJyTGluZXMgPSAoc3RkZXJyIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2Ygc3RkZXJyTGluZXMpIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1VJQVVUTyBTVERFUlJdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbmx5IHJldHVybiB3aGVuIHRoZSBzb2NrZXQgY2xpZW50IGhhcyBjb25uZWN0ZWRcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQgPSBuZXQuY29ubmVjdCh0aGlzLnN5c3RlbVBvcnQpO1xuICAgICAgICAgIC8vIFdpbmRvd3M6IHRoZSBzb2NrZXQgZXJyb3JzIG91dCB3aGVuIEFEQiByZXN0YXJ0cy4gTGV0J3MgY2F0Y2ggaXQgdG8gYXZvaWQgY3Jhc2hpbmcuXG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93bikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuZHJvaWQgYm9vdHN0cmFwIHNvY2tldCBjcmFzaGVkOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudC5vbmNlKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgbG9nLmluZm8oJ0FuZHJvaWQgYm9vdHN0cmFwIHNvY2tldCBpcyBub3cgY29ubmVjdGVkJyk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBFcnJvciBvY2N1cmVkIHdoaWxlIHN0YXJ0aW5nIEFuZHJvaWRCb290c3RyYXAuIE9yaWdpbmFsIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZW5kQ29tbWFuZCAodHlwZSwgZXh0cmEgPSB7fSkge1xuICAgIGlmICghdGhpcy5zb2NrZXRDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkIHVuZXhwZWN0ZWRseScpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgY21kID0gT2JqZWN0LmFzc2lnbih7Y21kOiB0eXBlfSwgZXh0cmEpO1xuICAgICAgbGV0IGNtZEpzb24gPSBgJHtKU09OLnN0cmluZ2lmeShjbWQpfSBcXG5gO1xuICAgICAgbG9nLmRlYnVnKGBTZW5kaW5nIGNvbW1hbmQgdG8gYW5kcm9pZDogJHtfLnRydW5jYXRlKGNtZEpzb24sIHtsZW5ndGg6IDEwMDB9KS50cmltKCl9YCk7XG4gICAgICB0aGlzLnNvY2tldENsaWVudC53cml0ZShjbWRKc29uKTtcbiAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnNldEVuY29kaW5nKCd1dGY4Jyk7XG4gICAgICBsZXQgc3RyZWFtRGF0YSA9ICcnO1xuICAgICAgbGV0IHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIgPSBudWxsO1xuICAgICAgdGhpcy5zb2NrZXRDbGllbnQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoc2VuZENvbW1hbmRUaW1lb3V0SGFuZGxlcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuZGVidWcoJ1JlY2VpdmVkIGNvbW1hbmQgcmVzdWx0IGZyb20gYm9vdHN0cmFwJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RyZWFtRGF0YSA9IEpTT04ucGFyc2Uoc3RyZWFtRGF0YSArIGRhdGEpO1xuICAgICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgSlNPTiBzbyB3ZSd2ZSBnb3QgYWxsIHRoZSBkYXRhLFxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc29ja2V0IGxpc3RlbmVyIGFuZCBldmFsdWF0ZVxuICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpO1xuICAgICAgICAgIGlmIChzdHJlYW1EYXRhLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoc3RyZWFtRGF0YS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlamVjdChlcnJvckZyb21Db2RlKHN0cmVhbURhdGEuc3RhdHVzLCBzdHJlYW1EYXRhLnZhbHVlKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdHJlYW1EYXRhKSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdHb3QgYW4gdW5leHBlY3RlZCBlcnJvciBpbnNpZGUgc29ja2V0IGxpc3RlbmVyJyk7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3JGcm9tQ29kZSgxMywgZXJyLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nLmRlYnVnKGBTdHJlYW0gc3RpbGwgbm90IGNvbXBsZXRlLCB3YWl0aW5nIHVwIHRvICR7U0VORF9DT01NQU5EX1RJTUVPVVR9bXMgZm9yIHRoZSBkYXRhIHRvIGFycml2ZWApO1xuICAgICAgICAgIHN0cmVhbURhdGEgKz0gZGF0YTtcbiAgICAgICAgICBzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBgU2VydmVyIHNvY2tldCBzdG9wcGVkIHJlc3BvbmRpbmcuIFRoZSByZWNlbnQgcmVzcG9uc2Ugd2FzICcke3N0cmVhbURhdGF9J2A7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yRnJvbUNvZGUoMTMsIGVyck1zZykpO1xuICAgICAgICAgIH0sIFNFTkRfQ09NTUFORF9USU1FT1VUKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzZW5kQWN0aW9uIChhY3Rpb24sIHBhcmFtcyA9IHt9KSB7XG4gICAgbGV0IGV4dHJhID0ge2FjdGlvbiwgcGFyYW1zfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChDT01NQU5EX1RZUEVTLkFDVElPTiwgZXh0cmEpO1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24gKCkge1xuICAgIGlmICghdGhpcy51aUF1dG9tYXRvcikge1xuICAgICAgbG9nLndhcm4oJ0Nhbm5vdCBzaHV0IGRvd24gQW5kcm9pZCBib290c3RyYXA7IGl0IGhhcyBhbHJlYWR5IHNodXQgZG93bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBsaXN0bmVycyBzbyB3ZSBkb24ndCB0cmlnZ2VyIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICB0aGlzLnVpQXV0b21hdG9yLnJlbW92ZUFsbExpc3RlbmVycyhVaUF1dG9tYXRvci5FVkVOVF9DSEFOR0VEKTtcbiAgICBpZiAodGhpcy5zb2NrZXRDbGllbnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoQ09NTUFORF9UWVBFUy5TSFVURE9XTik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudWlBdXRvbWF0b3Iuc2h1dGRvd24oKTtcbiAgICB0aGlzLnVpQXV0b21hdG9yID0gbnVsbDtcbiAgfVxuXG4gIC8vIHRoaXMgaGVscGVyIGZ1bmN0aW9uIG1ha2VzIHVuaXQgdGVzdGluZyBlYXNpZXIuXG4gIGFzeW5jIGluaXQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICB0aGlzLnVpQXV0b21hdG9yID0gbmV3IFVpQXV0b21hdG9yKHRoaXMuYWRiKTtcblxuICAgIC8vIEhhbmRsZSB1bmV4cGVjdGVkIFVpQXV0b21hdG9yIHNodXRkb3duXG4gICAgdGhpcy51aUF1dG9tYXRvci5vbihVaUF1dG9tYXRvci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBVaUF1dG9tYXRvci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIHRoaXMudWlBdXRvbWF0b3IgPSBudWxsO1xuICAgICAgICB0aGlzLm9uVW5leHBlY3RlZFNodXRkb3duLmNhbmNlbChuZXcgRXJyb3IoJ1VpQVV0b21hdG9yIHNodXQgZG93biB1bmV4cGVjdGVkbHknKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXQgaWdub3JlVW5leHBlY3RlZFNodXRkb3duIChpZ25vcmUpIHtcbiAgICBsb2cuZGVidWcoYCR7aWdub3JlID8gJ0lnbm9yaW5nJyA6ICdXYXRjaGluZyBmb3InfSBib290c3RyYXAgZGlzY29ubmVjdGApO1xuICAgIHRoaXMuX2lnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGlnbm9yZTtcbiAgfVxuXG4gIGdldCBpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gKCkge1xuICAgIHJldHVybiB0aGlzLl9pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd247XG4gIH1cbn1cblxuZXhwb3J0IHsgQW5kcm9pZEJvb3RzdHJhcCwgQ09NTUFORF9UWVBFUyB9O1xuZXhwb3J0IGRlZmF1bHQgQW5kcm9pZEJvb3RzdHJhcDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLEdBQUcsR0FBR0MsZUFBTSxDQUFDQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7QUFDaEQsTUFBTUMsYUFBYSxHQUFHO0VBQ3BCQyxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsUUFBUSxFQUFFO0FBQ1osQ0FB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
200
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJDT01NQU5EX1RZUEVTIiwiQUNUSU9OIiwiU0hVVERPV04iLCJTRU5EX0NPTU1BTkRfVElNRU9VVCIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsImN1cnJlbnREaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlc29sdmUiLCJfX2ZpbGVuYW1lIiwiaXNBdEZzUm9vdCIsIm1hbmlmZXN0UGF0aCIsImpvaW4iLCJmcyIsImV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwibmFtZSIsImlnbiIsImxlbmd0aCIsIkVycm9yIiwiQW5kcm9pZEJvb3RzdHJhcCIsImNvbnN0cnVjdG9yIiwiYWRiIiwic3lzdGVtUG9ydCIsIndlYlNvY2tldCIsInVuZGVmaW5lZCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSIsInJlamVjdCIsIkIiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJjYW5jZWwiLCJzdGFydCIsImFwcFBhY2thZ2UiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJzdGFydERldGVjdG9yIiwicyIsInRlc3QiLCJib290c3RyYXBKYXIiLCJpbml0IiwiZm9yd2FyZFBvcnQiLCJwcm9jZXNzIiwidWlBdXRvbWF0b3IiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsImFsZXJ0UmUiLCJkZWJ1ZyIsInNvY2tldHMiLCJlbWl0IiwibWVzc2FnZSIsInN0ZG91dExpbmVzIiwic3BsaXQiLCJ1aWF1dG9Mb2ciLCJsaW5lIiwidHJpbSIsImlubmVyTGluZSIsImV4ZWMiLCJsb2dNZXRob2QiLCJpbmZvIiwiYmluZCIsInN0ZGVyckxpbmVzIiwic29ja2V0Q2xpZW50IiwibmV0IiwiY29ubmVjdCIsImVyciIsIm9uY2UiLCJlcnJvckFuZFRocm93Iiwic2VuZENvbW1hbmQiLCJ0eXBlIiwiZXh0cmEiLCJjbWQiLCJPYmplY3QiLCJhc3NpZ24iLCJjbWRKc29uIiwic3RyaW5naWZ5IiwidHJ1bmNhdGUiLCJ3cml0ZSIsInNldEVuY29kaW5nIiwic3RyZWFtRGF0YSIsInNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIiLCJkYXRhIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RhdHVzIiwidmFsdWUiLCJlcnJvckZyb21Db2RlIiwiaXNTdHJpbmciLCJlcnJvciIsInN0YWNrIiwic2V0VGltZW91dCIsImVyck1zZyIsInNlbmRBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbXMiLCJzaHV0ZG93biIsIndhcm4iLCJVaUF1dG9tYXRvciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJpZ25vcmUiLCJfaWdub3JlVW5leHBlY3RlZFNodXRkb3duIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVWlBdXRvbWF0b3IgZnJvbSAnLi91aWF1dG9tYXRvcic7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckZyb21Db2RlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBsb2dnZXIsIGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdBbmRyb2lkQm9vdHN0cmFwJyk7XG5jb25zdCBDT01NQU5EX1RZUEVTID0ge1xuICBBQ1RJT046ICdhY3Rpb24nLFxuICBTSFVURE9XTjogJ3NodXRkb3duJ1xufTtcbmNvbnN0IFNFTkRfQ09NTUFORF9USU1FT1VUID0gMSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byBtb2R1bGUgcm9vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IG1vZHVsZSByb290IGZvbGRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNb2R1bGVSb290ID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldE1vZHVsZVJvb3QgKCkge1xuICBsZXQgY3VycmVudERpciA9IHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoX19maWxlbmFtZSkpO1xuICBsZXQgaXNBdEZzUm9vdCA9IGZhbHNlO1xuICB3aGlsZSAoIWlzQXRGc1Jvb3QpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG1hbmlmZXN0UGF0aCkgJiZcbiAgICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcicpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS1hbmRyb2lkLWRyaXZlciBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbmNsYXNzIEFuZHJvaWRCb290c3RyYXAge1xuICBjb25zdHJ1Y3RvciAoYWRiLCBzeXN0ZW1Qb3J0ID0gNDcyNCwgd2ViU29ja2V0ID0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hZGIgPSBhZGI7XG4gICAgdGhpcy5zeXN0ZW1Qb3J0ID0gc3lzdGVtUG9ydDtcbiAgICB0aGlzLndlYlNvY2tldCA9IHdlYlNvY2tldDtcbiAgICB0aGlzLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG9uVW5leHBlY3RlZFNodXRkb3duICgpIHtcbiAgICBpZiAoIXRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSkge1xuICAgICAgbGV0IHJlamVjdDtcbiAgICAgIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSA9IG5ldyBCKGZ1bmN0aW9uIF9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2UgKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZS5jYW5jZWwgPSByZWplY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2U7XG4gIH1cblxuICBhc3luYyBzdGFydCAoYXBwUGFja2FnZSwgZGlzYWJsZUFuZHJvaWRXYXRjaGVycyA9IGZhbHNlLCBhY2NlcHRTc2xDZXJ0cyA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0RGV0ZWN0b3IgPSAocykgPT4gL0FwcGl1bSBTb2NrZXQgU2VydmVyIFJlYWR5Ly50ZXN0KHMpO1xuICAgICAgY29uc3QgYm9vdHN0cmFwSmFyID0gcGF0aC5yZXNvbHZlKGF3YWl0IGdldE1vZHVsZVJvb3QoKSwgJ2Jvb3RzdHJhcCcsICdiaW4nLCAnQXBwaXVtQm9vdHN0cmFwLmphcicpO1xuXG4gICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMuc3lzdGVtUG9ydCwgNDcyNCk7XG4gICAgICB0aGlzLnByb2Nlc3MgPSBhd2FpdCB0aGlzLnVpQXV0b21hdG9yLnN0YXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBKYXIsICdpby5hcHBpdW0uYW5kcm9pZC5ib290c3RyYXAuQm9vdHN0cmFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREZXRlY3RvciwgJy1lJywgJ3BrZycsIGFwcFBhY2thZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICctZScsICdkaXNhYmxlQW5kcm9pZFdhdGNoZXJzJywgZGlzYWJsZUFuZHJvaWRXYXRjaGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgJy1lJywgJ2FjY2VwdFNzbENlcnRzJywgYWNjZXB0U3NsQ2VydHMpO1xuXG4gICAgICAvLyBwcm9jZXNzIHRoZSBvdXRwdXRcbiAgICAgIHRoaXMucHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsZXJ0UmUgPSAvRW1pdHRpbmcgc3lzdGVtIGFsZXJ0IG1lc3NhZ2UvO1xuICAgICAgICBpZiAoYWxlcnRSZS50ZXN0KHN0ZG91dCkpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ0VtaXR0aW5nIGFsZXJ0IG1lc3NhZ2UuLi4nKTtcbiAgICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNvY2tldHMuZW1pdCgnYWxlcnQnLCB7bWVzc2FnZTogc3Rkb3V0fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIGJvb3RzdHJhcCBsb2dnZXIgd3JhcHMgaXRzIG93biBsb2cgbGluZXMgd2l0aFxuICAgICAgICAvLyBbQVBQSVVNLVVJQVVUT10gLi4uIFtBUFBJVU0tVUlBVVRPXVxuICAgICAgICAvLyBhbmQgbGVhdmVzIGFjdHVhbCBVaUF1dG9tYXRvciBsb2dzIGFzIHRoZXkgYXJlXG4gICAgICAgIGxldCBzdGRvdXRMaW5lcyA9IChzdGRvdXQgfHwgJycpLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgdWlhdXRvTG9nID0gL1xcW0FQUElVTS1VSUFVVE9cXF0oLispXFxbXFwvQVBQSVVNLVVJQVVUT1xcXS87XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2Ygc3Rkb3V0TGluZXMpIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIGlmICh1aWF1dG9Mb2cudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICBsZXQgaW5uZXJMaW5lID0gdWlhdXRvTG9nLmV4ZWMobGluZSlbMV0udHJpbSgpO1xuICAgICAgICAgICAgICBsZXQgbG9nTWV0aG9kID0gbG9nLmluZm8uYmluZChsb2cpO1xuICAgICAgICAgICAgICAvLyBpZiB0aGUgYm9vdHN0cmFwIGxvZyBjb25zaWRlcnMgc29tZXRoaW5nIGRlYnVnLCBsb2cgdGhhdCBhc1xuICAgICAgICAgICAgICAvLyBkZWJ1ZyBhbmQgbm90IGluZm9cbiAgICAgICAgICAgICAgaWYgKC9cXFtkZWJ1Z1xcXS8udGVzdChpbm5lckxpbmUpKSB7XG4gICAgICAgICAgICAgICAgbG9nTWV0aG9kID0gbG9nLmRlYnVnLmJpbmQobG9nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb2dNZXRob2QoYFtCT09UU1RSQVAgTE9HXSAke2lubmVyTGluZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1VJQVVUTyBTVERPVVRdICR7bGluZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RkZXJyTGluZXMgPSAoc3RkZXJyIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2Ygc3RkZXJyTGluZXMpIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1VJQVVUTyBTVERFUlJdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbmx5IHJldHVybiB3aGVuIHRoZSBzb2NrZXQgY2xpZW50IGhhcyBjb25uZWN0ZWRcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQgPSBuZXQuY29ubmVjdCh0aGlzLnN5c3RlbVBvcnQpO1xuICAgICAgICAgIC8vIFdpbmRvd3M6IHRoZSBzb2NrZXQgZXJyb3JzIG91dCB3aGVuIEFEQiByZXN0YXJ0cy4gTGV0J3MgY2F0Y2ggaXQgdG8gYXZvaWQgY3Jhc2hpbmcuXG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93bikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuZHJvaWQgYm9vdHN0cmFwIHNvY2tldCBjcmFzaGVkOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudC5vbmNlKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgbG9nLmluZm8oJ0FuZHJvaWQgYm9vdHN0cmFwIHNvY2tldCBpcyBub3cgY29ubmVjdGVkJyk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBFcnJvciBvY2N1cmVkIHdoaWxlIHN0YXJ0aW5nIEFuZHJvaWRCb290c3RyYXAuIE9yaWdpbmFsIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZW5kQ29tbWFuZCAodHlwZSwgZXh0cmEgPSB7fSkge1xuICAgIGlmICghdGhpcy5zb2NrZXRDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkIHVuZXhwZWN0ZWRseScpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgY21kID0gT2JqZWN0LmFzc2lnbih7Y21kOiB0eXBlfSwgZXh0cmEpO1xuICAgICAgbGV0IGNtZEpzb24gPSBgJHtKU09OLnN0cmluZ2lmeShjbWQpfSBcXG5gO1xuICAgICAgbG9nLmRlYnVnKGBTZW5kaW5nIGNvbW1hbmQgdG8gYW5kcm9pZDogJHtfLnRydW5jYXRlKGNtZEpzb24sIHtsZW5ndGg6IDEwMDB9KS50cmltKCl9YCk7XG4gICAgICB0aGlzLnNvY2tldENsaWVudC53cml0ZShjbWRKc29uKTtcbiAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnNldEVuY29kaW5nKCd1dGY4Jyk7XG4gICAgICBsZXQgc3RyZWFtRGF0YSA9ICcnO1xuICAgICAgbGV0IHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIgPSBudWxsO1xuICAgICAgdGhpcy5zb2NrZXRDbGllbnQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoc2VuZENvbW1hbmRUaW1lb3V0SGFuZGxlcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuZGVidWcoJ1JlY2VpdmVkIGNvbW1hbmQgcmVzdWx0IGZyb20gYm9vdHN0cmFwJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RyZWFtRGF0YSA9IEpTT04ucGFyc2Uoc3RyZWFtRGF0YSArIGRhdGEpO1xuICAgICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgSlNPTiBzbyB3ZSd2ZSBnb3QgYWxsIHRoZSBkYXRhLFxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc29ja2V0IGxpc3RlbmVyIGFuZCBldmFsdWF0ZVxuICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpO1xuICAgICAgICAgIGlmIChzdHJlYW1EYXRhLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoc3RyZWFtRGF0YS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlamVjdChlcnJvckZyb21Db2RlKHN0cmVhbURhdGEuc3RhdHVzLCBzdHJlYW1EYXRhLnZhbHVlKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdHJlYW1EYXRhKSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdHb3QgYW4gdW5leHBlY3RlZCBlcnJvciBpbnNpZGUgc29ja2V0IGxpc3RlbmVyJyk7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3JGcm9tQ29kZSgxMywgZXJyLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nLmRlYnVnKGBTdHJlYW0gc3RpbGwgbm90IGNvbXBsZXRlLCB3YWl0aW5nIHVwIHRvICR7U0VORF9DT01NQU5EX1RJTUVPVVR9bXMgZm9yIHRoZSBkYXRhIHRvIGFycml2ZWApO1xuICAgICAgICAgIHN0cmVhbURhdGEgKz0gZGF0YTtcbiAgICAgICAgICBzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBgU2VydmVyIHNvY2tldCBzdG9wcGVkIHJlc3BvbmRpbmcuIFRoZSByZWNlbnQgcmVzcG9uc2Ugd2FzICcke3N0cmVhbURhdGF9J2A7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yRnJvbUNvZGUoMTMsIGVyck1zZykpO1xuICAgICAgICAgIH0sIFNFTkRfQ09NTUFORF9USU1FT1VUKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzZW5kQWN0aW9uIChhY3Rpb24sIHBhcmFtcyA9IHt9KSB7XG4gICAgbGV0IGV4dHJhID0ge2FjdGlvbiwgcGFyYW1zfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChDT01NQU5EX1RZUEVTLkFDVElPTiwgZXh0cmEpO1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24gKCkge1xuICAgIGlmICghdGhpcy51aUF1dG9tYXRvcikge1xuICAgICAgbG9nLndhcm4oJ0Nhbm5vdCBzaHV0IGRvd24gQW5kcm9pZCBib290c3RyYXA7IGl0IGhhcyBhbHJlYWR5IHNodXQgZG93bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBsaXN0bmVycyBzbyB3ZSBkb24ndCB0cmlnZ2VyIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICB0aGlzLnVpQXV0b21hdG9yLnJlbW92ZUFsbExpc3RlbmVycyhVaUF1dG9tYXRvci5FVkVOVF9DSEFOR0VEKTtcbiAgICBpZiAodGhpcy5zb2NrZXRDbGllbnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoQ09NTUFORF9UWVBFUy5TSFVURE9XTik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudWlBdXRvbWF0b3Iuc2h1dGRvd24oKTtcbiAgICB0aGlzLnVpQXV0b21hdG9yID0gbnVsbDtcbiAgfVxuXG4gIC8vIHRoaXMgaGVscGVyIGZ1bmN0aW9uIG1ha2VzIHVuaXQgdGVzdGluZyBlYXNpZXIuXG4gIGFzeW5jIGluaXQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICB0aGlzLnVpQXV0b21hdG9yID0gbmV3IFVpQXV0b21hdG9yKHRoaXMuYWRiKTtcblxuICAgIC8vIEhhbmRsZSB1bmV4cGVjdGVkIFVpQXV0b21hdG9yIHNodXRkb3duXG4gICAgdGhpcy51aUF1dG9tYXRvci5vbihVaUF1dG9tYXRvci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBVaUF1dG9tYXRvci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIHRoaXMudWlBdXRvbWF0b3IgPSBudWxsO1xuICAgICAgICB0aGlzLm9uVW5leHBlY3RlZFNodXRkb3duLmNhbmNlbChuZXcgRXJyb3IoJ1VpQVV0b21hdG9yIHNodXQgZG93biB1bmV4cGVjdGVkbHknKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXQgaWdub3JlVW5leHBlY3RlZFNodXRkb3duIChpZ25vcmUpIHtcbiAgICBsb2cuZGVidWcoYCR7aWdub3JlID8gJ0lnbm9yaW5nJyA6ICdXYXRjaGluZyBmb3InfSBib290c3RyYXAgZGlzY29ubmVjdGApO1xuICAgIHRoaXMuX2lnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGlnbm9yZTtcbiAgfVxuXG4gIGdldCBpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gKCkge1xuICAgIHJldHVybiB0aGlzLl9pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd247XG4gIH1cbn1cblxuZXhwb3J0IHsgQW5kcm9pZEJvb3RzdHJhcCwgQ09NTUFORF9UWVBFUyB9O1xuZXhwb3J0IGRlZmF1bHQgQW5kcm9pZEJvb3RzdHJhcDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLEdBQUcsR0FBR0MsZUFBTSxDQUFDQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7QUFDaEQsTUFBTUMsYUFBYSxHQUFHO0VBQ3BCQyxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsUUFBUSxFQUFFO0FBQ1osQ0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","names":["log","logger","getLogger","COMMAND_TYPES","ACTION","SHUTDOWN","SEND_COMMAND_TIMEOUT","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","fs","exists","JSON","parse","readFile","name","ign","length","Error","AndroidBootstrap","constructor","adb","systemPort","webSocket","undefined","ignoreUnexpectedShutdown","onUnexpectedShutdown","_onUnexpectedShutdownPromise","reject","B","_resolve","_reject","cancel","start","appPackage","disableAndroidWatchers","acceptSslCerts","startDetector","s","test","bootstrapJar","init","forwardPort","process","uiAutomator","on","stdout","stderr","alertRe","debug","sockets","emit","message","stdoutLines","split","uiautoLog","line","trim","innerLine","exec","logMethod","info","bind","stderrLines","socketClient","net","connect","err","once","errorAndThrow","sendCommand","type","extra","cmd","Object","assign","cmdJson","stringify","truncate","write","setEncoding","streamData","sendCommandTimeoutHandler","data","clearTimeout","removeAllListeners","status","value","errorFromCode","isString","error","stack","setTimeout","errMsg","sendAction","action","params","shutdown","warn","UiAutomator","EVENT_CHANGED","msg","state","STATE_STOPPED","ignore","_ignoreUnexpectedShutdown"],"sources":["../../lib/bootstrap.js"],"sourcesContent":["import UiAutomator from './uiautomator';\nimport net from 'net';\nimport path from 'path';\nimport _ from 'lodash';\nimport { errorFromCode } from 'appium/driver';\nimport B from 'bluebird';\nimport { logger, fs } from '@appium/support';\n\n\nconst log = logger.getLogger('AndroidBootstrap');\nconst COMMAND_TYPES = {\n ACTION: 'action',\n SHUTDOWN: 'shutdown'\n};\nconst SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(async function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (await fs.exists(manifestPath) &&\n JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');\n});\n\nclass AndroidBootstrap {\n constructor (adb, systemPort = 4724, webSocket = undefined) {\n this.adb = adb;\n this.systemPort = systemPort;\n this.webSocket = webSocket;\n this.ignoreUnexpectedShutdown = false;\n }\n\n get onUnexpectedShutdown () {\n if (!this._onUnexpectedShutdownPromise) {\n let reject;\n this._onUnexpectedShutdownPromise = new B(function _onUnexpectedShutdownPromise (_resolve, _reject) {\n reject = _reject;\n });\n this._onUnexpectedShutdownPromise.cancel = reject;\n }\n return this._onUnexpectedShutdownPromise;\n }\n\n async start (appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {\n try {\n const startDetector = (s) => /Appium Socket Server Ready/.test(s);\n const bootstrapJar = path.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');\n\n await this.init();\n await this.adb.forwardPort(this.systemPort, 4724);\n this.process = await this.uiAutomator.start(\n bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',\n startDetector, '-e', 'pkg', appPackage,\n '-e', 'disableAndroidWatchers', disableAndroidWatchers,\n '-e', 'acceptSslCerts', acceptSslCerts);\n\n // process the output\n this.process.on('output', (stdout, stderr) => {\n const alertRe = /Emitting system alert message/;\n if (alertRe.test(stdout)) {\n log.debug('Emitting alert message...');\n if (this.webSocket) {\n this.webSocket.sockets.emit('alert', {message: stdout});\n }\n }\n\n // the bootstrap logger wraps its own log lines with\n // [APPIUM-UIAUTO] ... [APPIUM-UIAUTO]\n // and leaves actual UiAutomator logs as they are\n let stdoutLines = (stdout || '').split('\\n');\n const uiautoLog = /\\[APPIUM-UIAUTO\\](.+)\\[\\/APPIUM-UIAUTO\\]/;\n for (let line of stdoutLines) {\n if (line.trim()) {\n if (uiautoLog.test(line)) {\n let innerLine = uiautoLog.exec(line)[1].trim();\n let logMethod = log.info.bind(log);\n // if the bootstrap log considers something debug, log that as\n // debug and not info\n if (/\\[debug\\]/.test(innerLine)) {\n logMethod = log.debug.bind(log);\n }\n logMethod(`[BOOTSTRAP LOG] ${innerLine}`);\n } else {\n log.debug(`[UIAUTO STDOUT] ${line}`);\n }\n }\n }\n\n let stderrLines = (stderr || '').split('\\n');\n for (let line of stderrLines) {\n if (line.trim()) {\n log.debug(`[UIAUTO STDERR] ${line}`);\n }\n }\n });\n\n // only return when the socket client has connected\n return await new B((resolve, reject) => {\n try {\n this.socketClient = net.connect(this.systemPort);\n // Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.\n this.socketClient.on('error', (err) => {\n if (!this.ignoreUnexpectedShutdown) {\n throw new Error(`Android bootstrap socket crashed: ${err}`);\n }\n });\n this.socketClient.once('connect', () => {\n log.info('Android bootstrap socket is now connected');\n resolve();\n });\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);\n }\n }\n\n async sendCommand (type, extra = {}) {\n if (!this.socketClient) {\n throw new Error('Socket connection closed unexpectedly');\n }\n\n return await new B((resolve, reject) => {\n let cmd = Object.assign({cmd: type}, extra);\n let cmdJson = `${JSON.stringify(cmd)} \\n`;\n log.debug(`Sending command to android: ${_.truncate(cmdJson, {length: 1000}).trim()}`);\n this.socketClient.write(cmdJson);\n this.socketClient.setEncoding('utf8');\n let streamData = '';\n let sendCommandTimeoutHandler = null;\n this.socketClient.on('data', (data) => {\n if (sendCommandTimeoutHandler) {\n clearTimeout(sendCommandTimeoutHandler);\n }\n log.debug('Received command result from bootstrap');\n try {\n streamData = JSON.parse(streamData + data);\n // we successfully parsed JSON so we've got all the data,\n // remove the socket listener and evaluate\n this.socketClient.removeAllListeners('data');\n if (streamData.status === 0) {\n return resolve(streamData.value);\n }\n reject(errorFromCode(streamData.status, streamData.value));\n } catch (err) {\n if (!_.isString(streamData)) {\n log.error('Got an unexpected error inside socket listener');\n log.error(err.stack);\n return reject(errorFromCode(13, err.message));\n }\n log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);\n streamData += data;\n sendCommandTimeoutHandler = setTimeout(() => {\n const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;\n log.error(errMsg);\n this.socketClient.removeAllListeners('data');\n reject(errorFromCode(13, errMsg));\n }, SEND_COMMAND_TIMEOUT);\n }\n });\n });\n }\n\n async sendAction (action, params = {}) {\n let extra = {action, params};\n return await this.sendCommand(COMMAND_TYPES.ACTION, extra);\n }\n\n async shutdown () {\n if (!this.uiAutomator) {\n log.warn('Cannot shut down Android bootstrap; it has already shut down');\n return;\n }\n\n // remove listners so we don't trigger unexpected shutdown\n this.uiAutomator.removeAllListeners(UiAutomator.EVENT_CHANGED);\n if (this.socketClient) {\n await this.sendCommand(COMMAND_TYPES.SHUTDOWN);\n }\n await this.uiAutomator.shutdown();\n this.uiAutomator = null;\n }\n\n // this helper function makes unit testing easier.\n async init () { // eslint-disable-line require-await\n this.uiAutomator = new UiAutomator(this.adb);\n\n // Handle unexpected UiAutomator shutdown\n this.uiAutomator.on(UiAutomator.EVENT_CHANGED, (msg) => {\n if (msg.state === UiAutomator.STATE_STOPPED) {\n this.uiAutomator = null;\n this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));\n }\n });\n }\n\n set ignoreUnexpectedShutdown (ignore) {\n log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);\n this._ignoreUnexpectedShutdown = ignore;\n }\n\n get ignoreUnexpectedShutdown () {\n return this._ignoreUnexpectedShutdown;\n }\n}\n\nexport { AndroidBootstrap, COMMAND_TYPES };\nexport default AndroidBootstrap;\n"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","names":["log","logger","getLogger","COMMAND_TYPES","ACTION","SHUTDOWN","SEND_COMMAND_TIMEOUT","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","fs","exists","JSON","parse","readFile","name","ign","length","Error","AndroidBootstrap","constructor","adb","systemPort","webSocket","undefined","ignoreUnexpectedShutdown","onUnexpectedShutdown","_onUnexpectedShutdownPromise","reject","B","_resolve","_reject","cancel","start","appPackage","disableAndroidWatchers","acceptSslCerts","startDetector","s","test","bootstrapJar","init","forwardPort","process","uiAutomator","on","stdout","stderr","alertRe","debug","sockets","emit","message","stdoutLines","split","uiautoLog","line","trim","innerLine","exec","logMethod","info","bind","stderrLines","socketClient","net","connect","err","once","errorAndThrow","sendCommand","type","extra","cmd","Object","assign","cmdJson","stringify","truncate","write","setEncoding","streamData","sendCommandTimeoutHandler","data","clearTimeout","removeAllListeners","status","value","errorFromCode","isString","error","stack","setTimeout","errMsg","sendAction","action","params","shutdown","warn","UiAutomator","EVENT_CHANGED","msg","state","STATE_STOPPED","ignore","_ignoreUnexpectedShutdown"],"sources":["../../lib/bootstrap.js"],"sourcesContent":["import UiAutomator from './uiautomator';\nimport net from 'net';\nimport path from 'path';\nimport _ from 'lodash';\nimport { errorFromCode } from 'appium/driver';\nimport B from 'bluebird';\nimport { logger, fs } from '@appium/support';\n\n\nconst log = logger.getLogger('AndroidBootstrap');\nconst COMMAND_TYPES = {\n ACTION: 'action',\n SHUTDOWN: 'shutdown'\n};\nconst SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(async function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (await fs.exists(manifestPath) &&\n JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');\n});\n\nclass AndroidBootstrap {\n constructor (adb, systemPort = 4724, webSocket = undefined) {\n this.adb = adb;\n this.systemPort = systemPort;\n this.webSocket = webSocket;\n this.ignoreUnexpectedShutdown = false;\n }\n\n get onUnexpectedShutdown () {\n if (!this._onUnexpectedShutdownPromise) {\n let reject;\n this._onUnexpectedShutdownPromise = new B(function _onUnexpectedShutdownPromise (_resolve, _reject) {\n reject = _reject;\n });\n this._onUnexpectedShutdownPromise.cancel = reject;\n }\n return this._onUnexpectedShutdownPromise;\n }\n\n async start (appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {\n try {\n const startDetector = (s) => /Appium Socket Server Ready/.test(s);\n const bootstrapJar = path.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');\n\n await this.init();\n await this.adb.forwardPort(this.systemPort, 4724);\n this.process = await this.uiAutomator.start(\n bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',\n startDetector, '-e', 'pkg', appPackage,\n '-e', 'disableAndroidWatchers', disableAndroidWatchers,\n '-e', 'acceptSslCerts', acceptSslCerts);\n\n // process the output\n this.process.on('output', (stdout, stderr) => {\n const alertRe = /Emitting system alert message/;\n if (alertRe.test(stdout)) {\n log.debug('Emitting alert message...');\n if (this.webSocket) {\n this.webSocket.sockets.emit('alert', {message: stdout});\n }\n }\n\n // the bootstrap logger wraps its own log lines with\n // [APPIUM-UIAUTO] ... [APPIUM-UIAUTO]\n // and leaves actual UiAutomator logs as they are\n let stdoutLines = (stdout || '').split('\\n');\n const uiautoLog = /\\[APPIUM-UIAUTO\\](.+)\\[\\/APPIUM-UIAUTO\\]/;\n for (let line of stdoutLines) {\n if (line.trim()) {\n if (uiautoLog.test(line)) {\n let innerLine = uiautoLog.exec(line)[1].trim();\n let logMethod = log.info.bind(log);\n // if the bootstrap log considers something debug, log that as\n // debug and not info\n if (/\\[debug\\]/.test(innerLine)) {\n logMethod = log.debug.bind(log);\n }\n logMethod(`[BOOTSTRAP LOG] ${innerLine}`);\n } else {\n log.debug(`[UIAUTO STDOUT] ${line}`);\n }\n }\n }\n\n let stderrLines = (stderr || '').split('\\n');\n for (let line of stderrLines) {\n if (line.trim()) {\n log.debug(`[UIAUTO STDERR] ${line}`);\n }\n }\n });\n\n // only return when the socket client has connected\n return await new B((resolve, reject) => {\n try {\n this.socketClient = net.connect(this.systemPort);\n // Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.\n this.socketClient.on('error', (err) => {\n if (!this.ignoreUnexpectedShutdown) {\n throw new Error(`Android bootstrap socket crashed: ${err}`);\n }\n });\n this.socketClient.once('connect', () => {\n log.info('Android bootstrap socket is now connected');\n resolve();\n });\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);\n }\n }\n\n async sendCommand (type, extra = {}) {\n if (!this.socketClient) {\n throw new Error('Socket connection closed unexpectedly');\n }\n\n return await new B((resolve, reject) => {\n let cmd = Object.assign({cmd: type}, extra);\n let cmdJson = `${JSON.stringify(cmd)} \\n`;\n log.debug(`Sending command to android: ${_.truncate(cmdJson, {length: 1000}).trim()}`);\n this.socketClient.write(cmdJson);\n this.socketClient.setEncoding('utf8');\n let streamData = '';\n let sendCommandTimeoutHandler = null;\n this.socketClient.on('data', (data) => {\n if (sendCommandTimeoutHandler) {\n clearTimeout(sendCommandTimeoutHandler);\n }\n log.debug('Received command result from bootstrap');\n try {\n streamData = JSON.parse(streamData + data);\n // we successfully parsed JSON so we've got all the data,\n // remove the socket listener and evaluate\n this.socketClient.removeAllListeners('data');\n if (streamData.status === 0) {\n return resolve(streamData.value);\n }\n reject(errorFromCode(streamData.status, streamData.value));\n } catch (err) {\n if (!_.isString(streamData)) {\n log.error('Got an unexpected error inside socket listener');\n log.error(err.stack);\n return reject(errorFromCode(13, err.message));\n }\n log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);\n streamData += data;\n sendCommandTimeoutHandler = setTimeout(() => {\n const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;\n log.error(errMsg);\n this.socketClient.removeAllListeners('data');\n reject(errorFromCode(13, errMsg));\n }, SEND_COMMAND_TIMEOUT);\n }\n });\n });\n }\n\n async sendAction (action, params = {}) {\n let extra = {action, params};\n return await this.sendCommand(COMMAND_TYPES.ACTION, extra);\n }\n\n async shutdown () {\n if (!this.uiAutomator) {\n log.warn('Cannot shut down Android bootstrap; it has already shut down');\n return;\n }\n\n // remove listners so we don't trigger unexpected shutdown\n this.uiAutomator.removeAllListeners(UiAutomator.EVENT_CHANGED);\n if (this.socketClient) {\n await this.sendCommand(COMMAND_TYPES.SHUTDOWN);\n }\n await this.uiAutomator.shutdown();\n this.uiAutomator = null;\n }\n\n // this helper function makes unit testing easier.\n async init () { // eslint-disable-line require-await\n this.uiAutomator = new UiAutomator(this.adb);\n\n // Handle unexpected UiAutomator shutdown\n this.uiAutomator.on(UiAutomator.EVENT_CHANGED, (msg) => {\n if (msg.state === UiAutomator.STATE_STOPPED) {\n this.uiAutomator = null;\n this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));\n }\n });\n }\n\n set ignoreUnexpectedShutdown (ignore) {\n log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);\n this._ignoreUnexpectedShutdown = ignore;\n }\n\n get ignoreUnexpectedShutdown () {\n return this._ignoreUnexpectedShutdown;\n }\n}\n\nexport { AndroidBootstrap, COMMAND_TYPES };\nexport default AndroidBootstrap;\n"],"mappings":"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"}