appium-adb 9.10.12 → 9.10.13

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.
@@ -184,8 +184,8 @@ commands.refreshGeoLocationCache = async function refreshGeoLocationCache(timeou
184
184
  let logcatMonitor;
185
185
  let monitoringPromise;
186
186
  if (timeoutMs > 0) {
187
- const cmd = [...this.adb.defaultArgs, 'logcat', '-s', LOCATION_TRACKER_TAG];
188
- logcatMonitor = new _teen_process.SubProcess(this.adb.path, cmd);
187
+ const cmd = [...this.executable.defaultArgs, 'logcat', '-s', LOCATION_TRACKER_TAG];
188
+ logcatMonitor = new _teen_process.SubProcess(this.executable.path, cmd);
189
189
  const timeoutErrorMsg = `The GPS cache has not been refreshed within ${timeoutMs}ms timeout. ` + `Please make sure the device under test has Appium Settings app installed and running. ` + `Also, it is required that the device has Google Play Services installed or is running ` + `Android 10+ otherwise.`;
190
190
  monitoringPromise = new _bluebird.default((resolve, reject) => {
191
191
  setTimeout(() => reject(new Error(timeoutErrorMsg)), timeoutMs);
@@ -289,4 +289,4 @@ commands.scanMedia = async function scanMedia(destination) {
289
289
  };
290
290
  var _default = commands;
291
291
  exports.default = _default;
292
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRUSU5HU19IRUxQRVJfSUQiLCJTRVRUSU5HU19IRUxQRVJfTUFJTl9BQ1RJVklUWSIsIldJRklfQ09OTkVDVElPTl9TRVRUSU5HX1JFQ0VJVkVSIiwiV0lGSV9DT05ORUNUSU9OX1NFVFRJTkdfQUNUSU9OIiwiREFUQV9DT05ORUNUSU9OX1NFVFRJTkdfUkVDRUlWRVIiLCJEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04iLCJBTklNQVRJT05fU0VUVElOR19SRUNFSVZFUiIsIkFOSU1BVElPTl9TRVRUSU5HX0FDVElPTiIsIkxPQ0FMRV9TRVRUSU5HX1JFQ0VJVkVSIiwiTE9DQUxFX1NFVFRJTkdfQUNUSU9OIiwiTE9DQVRJT05fU0VSVklDRSIsIkxPQ0FUSU9OX1JFQ0VJVkVSIiwiTE9DQVRJT05fUkVUUklFVkFMX0FDVElPTiIsIkNMSVBCT0FSRF9SRUNFSVZFUiIsIkNMSVBCT0FSRF9SRVRSSUVWQUxfQUNUSU9OIiwiTk9USUZJQ0FUSU9OU19SRVRSSUVWQUxfQUNUSU9OIiwiU01TX0xJU1RfUkVDRUlWRVIiLCJTTVNfTElTVF9SRVRSSUVWQUxfQUNUSU9OIiwiTUVESUFfU0NBTl9SRUNFSVZFUiIsIk1FRElBX1NDQU5fQUNUSU9OIiwiQVBQSVVNX0lNRSIsIlVOSUNPREVfSU1FIiwiREVGQVVMVF9TQVRFTExJVEVTX0NPVU5UIiwiREVGQVVMVF9BTFRJVFVERSIsIkxPQ0FUSU9OX1RSQUNLRVJfVEFHIiwiR1BTX0NBQ0hFX1JFRlJFU0hFRF9MT0dTIiwiR1BTX0NPT1JESU5BVEVTX1BBVFRFUk4iLCJjb21tYW5kcyIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJvcHRzIiwicHJvY2Vzc0V4aXN0cyIsImxvZyIsImRlYnVnIiwidGltZW91dCIsInN0YXJ0QXBwIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjYXRlZ29yeSIsInN0b3BBcHAiLCJ3YWl0Rm9yTGF1bmNoIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnIiLCJFcnJvciIsInNldFdpZmlTdGF0ZSIsIm9uIiwiaXNFbXVsYXRvciIsInNoZWxsIiwicHJpdmlsZWdlZCIsImdldEFwaUxldmVsIiwic2V0RGF0YVN0YXRlIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJzZXREZXZpY2VTeXNMb2NhbGVWaWFTZXR0aW5nQXBwIiwibGFuZ3VhZ2UiLCJjb3VudHJ5Iiwic2NyaXB0IiwicGFyYW1zIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsInB1c2giLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZm9ybWF0TG9jYXRpb25WYWx1ZSIsInZhbHVlTmFtZSIsImlzUmVxdWlyZWQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJmbG9hdFZhbHVlIiwicGFyc2VGbG9hdCIsImlzTmFOIiwiXyIsImNlaWwiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImFsdGl0dWRlIiwic3BlZWQiLCJhcmdzIiwiaXNOaWwiLCJzYXRlbGxpdGVzIiwicGFyc2VJbnQiLCJOdW1iZXIiLCJsZW5ndGgiLCJyZXNldFRlbG5ldEF1dGhUb2tlbiIsImFkYkV4ZWMiLCJtYXAiLCJhcmciLCJyZXBsYWNlIiwiZ2V0R2VvTG9jYXRpb24iLCJvdXRwdXQiLCJzdGRlcnIiLCJzdGRvdXQiLCJtZXNzYWdlIiwibWF0Y2giLCJleGVjIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlZnJlc2hHZW9Mb2NhdGlvbkNhY2hlIiwidGltZW91dE1zIiwibG9nY2F0TW9uaXRvciIsIm1vbml0b3JpbmdQcm9taXNlIiwiY21kIiwiYWRiIiwiZGVmYXVsdEFyZ3MiLCJTdWJQcm9jZXNzIiwicGF0aCIsInRpbWVvdXRFcnJvck1zZyIsIkIiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCIsImV2dCIsImxpbmVzIiwic29tZSIsImxpbmUiLCJ4IiwiaW5jbHVkZXMiLCJzdGFydCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJpbmZvIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJpc1J1bm5pbmciLCJzdG9wIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInJ1bkluSW1lQ29udGV4dCIsImdldENsaXBib2FyZCIsInJldHJpZXZlQ2xpcGJvYXJkIiwidHJpbSIsImdldE5vdGlmaWNhdGlvbnMiLCJwYXJzZUpzb25EYXRhIiwiZ2V0U21zTGlzdCIsIm1heCIsInR5cGVVbmljb2RlIiwidGV4dCIsInBsdXJhbGl6ZSIsImlucHV0VGV4dCIsImltYXAiLCJlbmNvZGUiLCJzY2FuTWVkaWEiLCJkZXN0aW5hdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi90b29scy9zZXR0aW5ncy1jbGllbnQtY29tbWFuZHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VKc29uRGF0YSB9IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHV0aWwsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgaW1hcCB9IGZyb20gJ3V0ZjcnO1xuaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5cbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9JRCA9ICdpby5hcHBpdW0uc2V0dGluZ3MnO1xuY29uc3QgU0VUVElOR1NfSEVMUEVSX01BSU5fQUNUSVZJVFkgPSAnLlNldHRpbmdzJztcbmNvbnN0IFdJRklfQ09OTkVDVElPTl9TRVRUSU5HX1JFQ0VJVkVSID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8ucmVjZWl2ZXJzLldpRmlDb25uZWN0aW9uU2V0dGluZ1JlY2VpdmVyYDtcbmNvbnN0IFdJRklfQ09OTkVDVElPTl9TRVRUSU5HX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ud2lmaWA7XG5jb25zdCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5EYXRhQ29ubmVjdGlvblNldHRpbmdSZWNlaXZlcmA7XG5jb25zdCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9LmRhdGFfY29ubmVjdGlvbmA7XG5jb25zdCBBTklNQVRJT05fU0VUVElOR19SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5BbmltYXRpb25TZXR0aW5nUmVjZWl2ZXJgO1xuY29uc3QgQU5JTUFUSU9OX1NFVFRJTkdfQUNUSU9OID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS5hbmltYXRpb25gO1xuY29uc3QgTE9DQUxFX1NFVFRJTkdfUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuTG9jYWxlU2V0dGluZ1JlY2VpdmVyYDtcbmNvbnN0IExPQ0FMRV9TRVRUSU5HX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubG9jYWxlYDtcbmNvbnN0IExPQ0FUSU9OX1NFUlZJQ0UgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5Mb2NhdGlvblNlcnZpY2VgO1xuY29uc3QgTE9DQVRJT05fUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuTG9jYXRpb25JbmZvUmVjZWl2ZXJgO1xuY29uc3QgTE9DQVRJT05fUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubG9jYXRpb25gO1xuY29uc3QgQ0xJUEJPQVJEX1JFQ0VJVkVSID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8ucmVjZWl2ZXJzLkNsaXBib2FyZFJlY2VpdmVyYDtcbmNvbnN0IENMSVBCT0FSRF9SRVRSSUVWQUxfQUNUSU9OID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS5jbGlwYm9hcmQuZ2V0YDtcbmNvbnN0IE5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubm90aWZpY2F0aW9uc2A7XG5jb25zdCBTTVNfTElTVF9SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5TbXNSZWFkZXJgO1xuY29uc3QgU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0uc21zLnJlYWRgO1xuY29uc3QgTUVESUFfU0NBTl9SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5NZWRpYVNjYW5uZXJSZWNlaXZlcmA7XG5jb25zdCBNRURJQV9TQ0FOX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0uc2Nhbl9tZWRpYWA7XG5jb25zdCBBUFBJVU1fSU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8uQXBwaXVtSU1FYDtcbmNvbnN0IFVOSUNPREVfSU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8uVW5pY29kZUlNRWA7XG5jb25zdCBERUZBVUxUX1NBVEVMTElURVNfQ09VTlQgPSAxMjtcbmNvbnN0IERFRkFVTFRfQUxUSVRVREUgPSAwLjA7XG5jb25zdCBMT0NBVElPTl9UUkFDS0VSX1RBRyA9ICdMb2NhdGlvblRyYWNrZXInO1xuY29uc3QgR1BTX0NBQ0hFX1JFRlJFU0hFRF9MT0dTID0gW1xuICAnVGhlIGN1cnJlbnQgbG9jYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBmcm9tIFBsYXkgU2VydmljZXMnLFxuICAnVGhlIGN1cnJlbnQgbG9jYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBmcm9tIExvY2F0aW9uIE1hbmFnZXInXG5dO1xuXG5jb25zdCBHUFNfQ09PUkRJTkFURVNfUEFUVEVSTiA9IC9kYXRhPVwiKC0/W1xcZC5dKylcXHMrKC0/W1xcZC5dKylcXHMrKC0/W1xcZC5dKylcIi87XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0dGluZ3NBcHBTdGFydHVwT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzUwMDBdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAqIHRvIHdhaXQgdW50aWwgdGhlIGFwcCBoYXMgc3RhcnRlZFxuICovXG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIgYXBwbGljYXRpb24gaXMgcnVubmluZ1xuICogYW5kIHN0YXJ0cyBpdCBpZiBuZWNlc3NhcnlcbiAqXG4gKiBAcGFyYW0ge1NldHRpbmdzQXBwU3RhcnR1cE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBBcHBpdW0gU2V0dGluZ3MgaGFzIGZhaWxlZCB0byBzdGFydFxuICogQHJldHVybnMge0FEQn0gc2VsZiBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAqL1xuY29tbWFuZHMucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAgKG9wdHMgPSB7fSkge1xuICBpZiAoYXdhaXQgdGhpcy5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9JRCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxvZy5kZWJ1ZygnU3RhcnRpbmcgQXBwaXVtIFNldHRpbmdzIGFwcCcpO1xuICBjb25zdCB7XG4gICAgdGltZW91dCA9IDUwMDAsXG4gIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLnN0YXJ0QXBwKHtcbiAgICBwa2c6IFNFVFRJTkdTX0hFTFBFUl9JRCxcbiAgICBhY3Rpdml0eTogU0VUVElOR1NfSEVMUEVSX01BSU5fQUNUSVZJVFksXG4gICAgYWN0aW9uOiAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgIGNhdGVnb3J5OiAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgIHN0b3BBcHA6IGZhbHNlLFxuICAgIHdhaXRGb3JMYXVuY2g6IGZhbHNlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfSUQpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICBpbnRlcnZhbE1zOiAzMDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXBwaXVtIFNldHRpbmdzIGFwcCBpcyBub3QgcnVubmluZyBhZnRlciAke3RpbWVvdXR9bXNgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldFdpZmlTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlTdGF0ZSAob24sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAoaXNFbXVsYXRvcikge1xuICAgIC8vIFRoZSBzdmMgY29tbWFuZCBkb2VzIG5vdCByZXF1aXJlIHRvIGJlIHJvb3Qgc2luY2UgQVBJIDI2XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3N2YycsICd3aWZpJywgb24gPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10sIHtcbiAgICAgIHByaXZpbGVnZWQ6IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDI2LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAnLWEnLCBXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04sXG4gICAgICAnLW4nLCBXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAgICctLWVzJywgJ3NldHN0YXR1cycsIG9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSdcbiAgICBdKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldERhdGFTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldERhdGFTdGF0ZSAob24sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAoaXNFbXVsYXRvcikge1xuICAgIC8vIFRoZSBzdmMgY29tbWFuZCBkb2VzIG5vdCByZXF1aXJlIHRvIGJlIHJvb3Qgc2luY2UgQVBJIDI2XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3N2YycsICdkYXRhJywgb24gPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10sIHtcbiAgICAgIHByaXZpbGVnZWQ6IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDI2LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAnLWEnLCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04sXG4gICAgICAnLW4nLCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAgICctLWVzJywgJ3NldHN0YXR1cycsIG9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSdcbiAgICBdKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIGFuaW1hdGlvbiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBBbmltYXRpb24gb24gdGhlIGRldmljZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZ2xvYmFsIHByb3BlcnRpZXM6XG4gKiBbQU5JTUFUT1JfRFVSQVRJT05fU0NBTEVde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLkdsb2JhbC5odG1sI0FOSU1BVE9SX0RVUkFUSU9OX1NDQUxFfSxcbiAqIFtUUkFOU0lUSU9OX0FOSU1BVElPTl9TQ0FMRV17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuR2xvYmFsLmh0bWwjVFJBTlNJVElPTl9BTklNQVRJT05fU0NBTEV9LFxuICogW1dJTkRPV19BTklNQVRJT05fU0NBTEVde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLkdsb2JhbC5odG1sI1dJTkRPV19BTklNQVRJT05fU0NBTEV9LlxuICogVGhpcyBtZXRob2Qgc2V0cyBhbGwgdGhpcyBwcm9wZXJ0aWVzIHRvIDAuMCB0byBkaXNhYmxlICgxLjAgdG8gZW5hYmxlKSBhbmltYXRpb24uXG4gKlxuICogVHVybmluZyBvZmYgYW5pbWF0aW9uIG1pZ2h0IGJlIHVzZWZ1bCB0byBpbXByb3ZlIHN0YWJpbGl0eVxuICogYW5kIHJlZHVjZSB0ZXN0cyBleGVjdXRpb24gdGltZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKi9cbmNvbW1hbmRzLnNldEFuaW1hdGlvblN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0QW5pbWF0aW9uU3RhdGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsIEFOSU1BVElPTl9TRVRUSU5HX0FDVElPTixcbiAgICAnLW4nLCBBTklNQVRJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAnLS1lcycsICdzZXRzdGF0dXMnLCBvbiA/ICdlbmFibGUnIDogJ2Rpc2FibGUnXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGxvY2FsZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIERvbid0IG5lZWQgdG8gcmVib290IHRoZSBkZXZpY2UgYWZ0ZXIgY2hhbmdpbmcgdGhlIGxvY2FsZS5cbiAqIFRoaXMgbWV0aG9kIHNldHMgYW4gYXJiaXRyYXJ5IGxvY2FsZSBmb2xsb3dpbmc6XG4gKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbCNMb2NhbGUoamF2YS5sYW5nLlN0cmluZywlMjBqYXZhLmxhbmcuU3RyaW5nKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBlLmcuIGVuLCBqYVxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBlLmcuIFVTLCBKUFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIGUuZy4gSGFucyBpbiBgemgtSGFucy1DTmBcbiAqL1xuY29tbWFuZHMuc2V0RGV2aWNlU3lzTG9jYWxlVmlhU2V0dGluZ0FwcCA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAgKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLWEnLCBMT0NBTEVfU0VUVElOR19BQ1RJT04sXG4gICAgJy1uJywgTE9DQUxFX1NFVFRJTkdfUkVDRUlWRVIsXG4gICAgJy0tZXMnLCAnbGFuZycsIGxhbmd1YWdlLnRvTG93ZXJDYXNlKCksXG4gICAgJy0tZXMnLCAnY291bnRyeScsIGNvdW50cnkudG9VcHBlckNhc2UoKVxuICBdO1xuXG4gIGlmIChzY3JpcHQpIHtcbiAgICBwYXJhbXMucHVzaCgnLS1lcycsICdzY3JpcHQnLCBzY3JpcHQpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zaGVsbChwYXJhbXMpO1xufTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvY2F0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcnxzdHJpbmd9IGxvbmdpdHVkZSAtIFZhbGlkIGxvbmdpdHVkZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gbGF0aXR1ZGUgLSBWYWxpZCBsYXRpdHVkZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IGFsdGl0dWRlIC0gVmFsaWQgYWx0aXR1ZGUgdmFsdWUuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBzYXRlbGxpdGVzIFsxMl0gLSBOdW1iZXIgb2Ygc2F0ZWxsaXRlcyBiZWluZyB0cmFja2VkICgxLTEyKS5cbiAqIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBvbiByZWFsIGRldmljZXMuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBzcGVlZCAtIFZhbGlkIHNwZWVkIHZhbHVlLlxuICogU2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwLjAgbWV0ZXJzL3NlY29uZCBmb3IgcmVhbCBkZXZpY2VzIG9yIDAuMCBrbm90c1xuICogZm9yIGVtdWxhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgZ2VvbG9jYXRpb24gY29vcmRpbmF0ZXMgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7TG9jYXRpb259IGxvY2F0aW9uIC0gTG9jYXRpb24gb2JqZWN0LiBUaGUgYGFsdGl0dWRlYCB2YWx1ZSBpcyBpZ25vcmVkXG4gKiB3aGlsZSBtb2NraW5nIHRoZSBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uLCBpc0VtdWxhdG9yID0gZmFsc2UpIHtcbiAgY29uc3QgZm9ybWF0TG9jYXRpb25WYWx1ZSA9ICh2YWx1ZU5hbWUsIGlzUmVxdWlyZWQgPSB0cnVlKSA9PiB7XG4gICAgaWYgKCF1dGlsLmhhc1ZhbHVlKGxvY2F0aW9uW3ZhbHVlTmFtZV0pKSB7XG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dmFsdWVOYW1lfSBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmxvYXRWYWx1ZSA9IHBhcnNlRmxvYXQobG9jYXRpb25bdmFsdWVOYW1lXSk7XG4gICAgaWYgKCFpc05hTihmbG9hdFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGAke18uY2VpbChmbG9hdFZhbHVlLCA1KX1gO1xuICAgIH1cbiAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3ZhbHVlTmFtZX0gaXMgZXhwZWN0ZWQgdG8gYmUgYSB2YWxpZCBmbG9hdCBudW1iZXIuIGAgK1xuICAgICAgICBgJyR7bG9jYXRpb25bdmFsdWVOYW1lXX0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIGNvbnN0IGxvbmdpdHVkZSA9IGZvcm1hdExvY2F0aW9uVmFsdWUoJ2xvbmdpdHVkZScpO1xuICBjb25zdCBsYXRpdHVkZSA9IGZvcm1hdExvY2F0aW9uVmFsdWUoJ2xhdGl0dWRlJyk7XG4gIGNvbnN0IGFsdGl0dWRlID0gZm9ybWF0TG9jYXRpb25WYWx1ZSgnYWx0aXR1ZGUnLCBmYWxzZSk7XG4gIGNvbnN0IHNwZWVkID0gZm9ybWF0TG9jYXRpb25WYWx1ZSgnc3BlZWQnLCBmYWxzZSk7XG4gIGlmIChpc0VtdWxhdG9yKSB7XG4gICAgY29uc3QgYXJncyA9IFtsb25naXR1ZGUsIGxhdGl0dWRlXTtcbiAgICBpZiAoIV8uaXNOaWwoYWx0aXR1ZGUpKSB7XG4gICAgICBhcmdzLnB1c2goYWx0aXR1ZGUpO1xuICAgIH1cbiAgICBjb25zdCBzYXRlbGxpdGVzID0gcGFyc2VJbnQobG9jYXRpb24uc2F0ZWxsaXRlcywgMTApO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHNhdGVsbGl0ZXMpICYmIHNhdGVsbGl0ZXMgPiAwICYmIHNhdGVsbGl0ZXMgPD0gMTIpIHtcbiAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgYXJncy5wdXNoKGAke0RFRkFVTFRfQUxUSVRVREV9YCk7XG4gICAgICB9XG4gICAgICBhcmdzLnB1c2goYCR7c2F0ZWxsaXRlc31gKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTmlsKHNwZWVkKSkge1xuICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMykge1xuICAgICAgICBhcmdzLnB1c2goYCR7REVGQVVMVF9BTFRJVFVERX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgYXJncy5wdXNoKGAke0RFRkFVTFRfU0FURUxMSVRFU19DT1VOVH1gKTtcbiAgICAgIH1cbiAgICAgIGFyZ3MucHVzaChzcGVlZCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVzZXRUZWxuZXRBdXRoVG9rZW4oKTtcbiAgICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydlbXUnLCAnZ2VvJywgJ2ZpeCcsIC4uLmFyZ3NdKTtcbiAgICAvLyBBIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTIwNjE4MFxuICAgIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2VtdScsICdnZW8nLCAnZml4JywgLi4uKGFyZ3MubWFwKChhcmcpID0+IGFyZy5yZXBsYWNlKCcuJywgJywnKSkpXSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdhbScsIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjYpID8gJ3N0YXJ0LWZvcmVncm91bmQtc2VydmljZScgOiAnc3RhcnRzZXJ2aWNlJyxcbiAgICAgICctZScsICdsb25naXR1ZGUnLCBsb25naXR1ZGUsXG4gICAgICAnLWUnLCAnbGF0aXR1ZGUnLCBsYXRpdHVkZSxcbiAgICBdO1xuICAgIGlmICh1dGlsLmhhc1ZhbHVlKGFsdGl0dWRlKSkge1xuICAgICAgYXJncy5wdXNoKCctZScsICdhbHRpdHVkZScsIGFsdGl0dWRlKTtcbiAgICB9XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoc3BlZWQpKSB7XG4gICAgICBhcmdzLnB1c2goJy1lJywgJ3NwZWVkJywgc3BlZWQpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goTE9DQVRJT05fU0VSVklDRSk7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgY2FjaGVkIEdQUyBsb2NhdGlvbiBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJucyB7TG9jYXRpb259IFRoZSBjdXJyZW50IGxvY2F0aW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbG9jYXRpb24gY2Fubm90IGJlIHJldHJpZXZlZFxuICovXG5jb21tYW5kcy5nZXRHZW9Mb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldEdlb0xvY2F0aW9uICgpIHtcbiAgbGV0IG91dHB1dDtcbiAgdHJ5IHtcbiAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICAgJy1uJywgTE9DQVRJT05fUkVDRUlWRVIsXG4gICAgICAnLWEnLCBMT0NBVElPTl9SRVRSSUVWQUxfQUNUSU9OLFxuICAgIF0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSB0aGUgY3VycmVudCBnZW8gY29vcmRpbmF0ZXMgZnJvbSB0aGUgZGV2aWNlLiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlIEFwcGl1bSBTZXR0aW5ncyBhcHBsaWNhdGlvbiBpcyB1cCB0byBkYXRlIGFuZCBoYXMgbG9jYXRpb24gcGVybWlzc2lvbnMuIEFsc28gdGhlIGxvY2F0aW9uIGAgK1xuICAgICAgYHNlcnZpY2VzIG11c3QgYmUgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIuc3RkZXJyIHx8IGVyci5zdGRvdXQgfHwgZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBjb25zdCBtYXRjaCA9IEdQU19DT09SRElOQVRFU19QQVRURVJOLmV4ZWMob3V0cHV0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBhY3R1YWwgbG9jYXRpb24gdmFsdWVzIGZyb20gdGhlIGNvbW1hbmQgb3V0cHV0OiAke291dHB1dH1gKTtcbiAgfVxuICBjb25zdCBsb2NhdGlvbiA9IHtcbiAgICBsYXRpdHVkZTogbWF0Y2hbMV0sXG4gICAgbG9uZ2l0dWRlOiBtYXRjaFsyXSxcbiAgICBhbHRpdHVkZTogbWF0Y2hbM10sXG4gIH07XG4gIGxvZy5kZWJ1ZyhgR290IGdlbyBjb29yZGluYXRlczogJHtKU09OLnN0cmluZ2lmeShsb2NhdGlvbil9YCk7XG4gIHJldHVybiBsb2NhdGlvbjtcbn07XG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0TXMgWzIwMDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKiB0byBibG9jayB1bnRpbCBHUFMgY2FjaGUgaXMgcmVmcmVzaGVkLiBQcm92aWRpbmcgemVybyBvciBhIG5lZ2F0aXZlXG4gKiB2YWx1ZSB0byBpdCBza2lwcyB3YWl0aW5nIGNvbXBsZXRlbHkuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBHUFMgY2FjaGUgY2Fubm90IGJlIHJlZnJlc2hlZC5cbiAqL1xuY29tbWFuZHMucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiByZWZyZXNoR2VvTG9jYXRpb25DYWNoZSAodGltZW91dE1zID0gMjAwMDApIHtcbiAgbGV0IGxvZ2NhdE1vbml0b3I7XG4gIGxldCBtb25pdG9yaW5nUHJvbWlzZTtcblxuICBpZiAodGltZW91dE1zID4gMCkge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgIC4uLnRoaXMuYWRiLmRlZmF1bHRBcmdzLFxuICAgICAgJ2xvZ2NhdCcsICctcycsIExPQ0FUSU9OX1RSQUNLRVJfVEFHLFxuICAgIF07XG4gICAgbG9nY2F0TW9uaXRvciA9IG5ldyBTdWJQcm9jZXNzKHRoaXMuYWRiLnBhdGgsIGNtZCk7XG4gICAgY29uc3QgdGltZW91dEVycm9yTXNnID0gYFRoZSBHUFMgY2FjaGUgaGFzIG5vdCBiZWVuIHJlZnJlc2hlZCB3aXRoaW4gJHt0aW1lb3V0TXN9bXMgdGltZW91dC4gYCArXG4gICAgICBgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzIEFwcGl1bSBTZXR0aW5ncyBhcHAgaW5zdGFsbGVkIGFuZCBydW5uaW5nLiBgICtcbiAgICAgIGBBbHNvLCBpdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBkZXZpY2UgaGFzIEdvb2dsZSBQbGF5IFNlcnZpY2VzIGluc3RhbGxlZCBvciBpcyBydW5uaW5nIGAgK1xuICAgICAgYEFuZHJvaWQgMTArIG90aGVyd2lzZS5gO1xuICAgIG1vbml0b3JpbmdQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKHRpbWVvdXRFcnJvck1zZykpLCB0aW1lb3V0TXMpO1xuXG4gICAgICBsb2djYXRNb25pdG9yLm9uKCdleGl0JywgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcih0aW1lb3V0RXJyb3JNc2cpKSk7XG4gICAgICBbJ2xpbmVzLXN0ZGVycicsICdsaW5lcy1zdGRvdXQnXS5tYXAoKGV2dCkgPT4gbG9nY2F0TW9uaXRvci5vbihldnQsIChsaW5lcykgPT4ge1xuICAgICAgICBpZiAobGluZXMuc29tZSgobGluZSkgPT4gR1BTX0NBQ0hFX1JFRlJFU0hFRF9MT0dTLnNvbWUoKHgpID0+IGxpbmUuaW5jbHVkZXMoeCkpKSkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH0pO1xuICAgIGF3YWl0IGxvZ2NhdE1vbml0b3Iuc3RhcnQoMCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAnLW4nLCBMT0NBVElPTl9SRUNFSVZFUixcbiAgICAgICctYScsIExPQ0FUSU9OX1JFVFJJRVZBTF9BQ1RJT04sXG4gICAgICAnLS1leicsICdmb3JjZVVwZGF0ZScsICd0cnVlJyxcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVmcmVzaCB0aGUgR1BTIGNhY2hlIG9uIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGUgQXBwaXVtIFNldHRpbmdzIGFwcGxpY2F0aW9uIGlzIHVwIHRvIGRhdGUgYW5kIGhhcyBsb2NhdGlvbiBwZXJtaXNzaW9ucy4gQWxzbyB0aGUgbG9jYXRpb24gYCArXG4gICAgICBgc2VydmljZXMgbXVzdCBiZSBlbmFibGVkIG9uIHRoZSBkZXZpY2UuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5zdGRlcnIgfHwgZXJyLnN0ZG91dCB8fCBlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChsb2djYXRNb25pdG9yICYmIG1vbml0b3JpbmdQcm9taXNlKSB7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHt0aW1lb3V0TXN9bXMgZm9yIHRoZSBHUFMgY2FjaGUgdG8gYmUgcmVmcmVzaGVkYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1vbml0b3JpbmdQcm9taXNlO1xuICAgICAgbG9nLmluZm8oYFRoZSBHUFMgY2FjaGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlZnJlc2hlZCBhZnRlciBgICtcbiAgICAgICAgYCR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChsb2djYXRNb25pdG9yLmlzUnVubmluZykge1xuICAgICAgICBhd2FpdCBsb2djYXRNb25pdG9yLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nLmluZm8oJ1RoZSByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIEdQUyBjYWNoZSBoYXMgYmVlbiBzZW50LiBTa2lwcGluZyB3YWl0aW5nIGZvciBpdHMgcmVzdWx0LicpO1xuICB9XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBnaXZlbiBlZGl0b3IgYWN0aW9uIG9uIHRoZSBmb2N1c2VkIGlucHV0IGZpZWxkLlxuICogVGhpcyBtZXRob2QgcmVxdWlyZXMgQXBwaXVtIFNldHRpbmdzIGhlbHBlciB0byBiZSBpbnN0YWxsZWQgb24gdGhlIGRldmljZS5cbiAqIE5vIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBwZXJmb3JtaW5nIHRoZSBhY3Rpb24uXG4gKiBZb3UgbXVzdCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dCBpZiBzb21ldGhpbmcgZGlkIG5vdCB3b3JrIGFzIGV4cGVjdGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gYWN0aW9uIC0gRWl0aGVyIGFjdGlvbiBjb2RlIG9yIG5hbWUuIFRoZSBmb2xsb3dpbmcgYWN0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIGFyZSBzdXBwb3J0ZWQ6IGBub3JtYWwsIHVuc3BlY2lmaWVkLCBub25lLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbywgc2VhcmNoLCBzZW5kLCBuZXh0LCBkb25lLCBwcmV2aW91c2BcbiAqL1xuY29tbWFuZHMucGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1FZGl0b3JBY3Rpb24gKGFjdGlvbikge1xuICBsb2cuZGVidWcoYFBlcmZvcm1pbmcgZWRpdG9yIGFjdGlvbjogJHthY3Rpb259YCk7XG4gIGF3YWl0IHRoaXMucnVuSW5JbWVDb250ZXh0KEFQUElVTV9JTUUsXG4gICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBgLyR7YWN0aW9ufS9gXSkpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHRleHQgY29udGVudCBvZiB0aGUgZGV2aWNlJ3MgY2xpcGJvYXJkLlxuICogVGhlIG1ldGhvZCB3b3JrcyBmb3IgQW5kcm9pZCBiZWxvdyBhbmQgYWJvdmUgMjkuXG4gKiBJdCB0ZW1vcmFyaWx5IGVuZm9yY2VzIHRoZSBJTUUgc2V0dGluZyBpbiBvcmRlciB0byB3b3JrYXJvdW5kXG4gKiBzZWN1cml0eSBsaW1pdGF0aW9ucyBpZiBuZWVkZWQuXG4gKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIEFwcGl1bSBTZXR0aW5ncyB2LiAyLjE1KyBpcyBpbnN0YWxsZWRcbiAqIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgbWFpbiBjbGlwYm9hcmQgYXNcbiAqIGJhc2U2NC1lbmNvZGVkIHN0cmluZyBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGNsaXBib2FyZCBpcyBlbXB0eVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgZ2V0dGluZyB0aGVcbiAqIGNsaXBib2FyZCBjb250YW50XG4gKi9cbmNvbW1hbmRzLmdldENsaXBib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGdldENsaXBib2FyZCAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyB0aGUgY2xpcGJvYXJkIGNvbnRlbnQnKTtcbiAgY29uc3QgcmV0cmlldmVDbGlwYm9hcmQgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLW4nLCBDTElQQk9BUkRfUkVDRUlWRVIsXG4gICAgJy1hJywgQ0xJUEJPQVJEX1JFVFJJRVZBTF9BQ1RJT04sXG4gIF0pO1xuICBsZXQgb3V0cHV0O1xuICB0cnkge1xuICAgIG91dHB1dCA9IChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjkpXG4gICAgICA/IChhd2FpdCB0aGlzLnJ1bkluSW1lQ29udGV4dChBUFBJVU1fSU1FLCByZXRyaWV2ZUNsaXBib2FyZCkpXG4gICAgICA6IChhd2FpdCByZXRyaWV2ZUNsaXBib2FyZCgpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGN1cnJlbnQgY2xpcGJvYXJkIGNvbnRlbnQgZnJvbSB0aGUgZGV2aWNlLiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlIEFwcGl1bSBTZXR0aW5ncyBhcHBsaWNhdGlvbiBpcyB1cCB0byBkYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gL2RhdGE9XCIoW15cIl0qKVwiLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgYWN0dWFsIGNsaWJvYXJkIGNvbnRlbnQgZnJvbSB0aGUgY29tbWFuZCBvdXRwdXQ6ICR7b3V0cHV0fWApO1xuICB9XG4gIHJldHVybiBfLnRyaW0obWF0Y2hbMV0pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgQW5kcm9pZCBub3RpZmljYXRpb25zIHZpYSBBcHBpdW0gU2V0dGluZ3MgaGVscGVyLlxuICogQXBwaXVtIFNldHRpbmdzIGFwcCBpdHNlbGYgbXVzdCBiZSAqbWFudWFsbHkqIGdyYW50ZWQgdG8gYWNjZXNzIG5vdGlmaWNhdGlvbnNcbiAqIHVuZGVyIGRldmljZSBTZXR0aW5ncyBpbiBvcmRlciB0byBtYWtlIHRoaXMgZmVhdHVyZSB3b3JraW5nLlxuICogQXBwaXVtIFNldHRpbmdzIGhlbHBlciBrZWVwcyBhbGwgdGhlIGFjdGl2ZSBub3RpZmljYXRpb25zIHBsdXNcbiAqIG5vdGlmaWNhdGlvbnMgdGhhdCBhcHBlYXJlZCB3aGlsZSBpdCB3YXMgcnVubmluZyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyLFxuICogYnV0IG5vIG1vcmUgdGhhbiAxMDAgaXRlbXMgYWx0b2dldGhlci4gTmV3bHkgYXBwZWFyZWQgbm90aWZpY2F0aW9uc1xuICogYXJlIGFsd2F5cyBhZGRlZCB0byB0aGUgaGVhZCBvZiB0aGUgbm90aWZpY2F0aW9ucyBhcnJheS5cbiAqIFRoZSBgaXNSZW1vdmVkYCBmbGFnIGlzIHNldCB0byBgdHJ1ZWAgZm9yIG5vdGlmaWNhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvc2VydmljZS9ub3RpZmljYXRpb24vU3RhdHVzQmFyTm90aWZpY2F0aW9uXG4gKiBhbmQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5odG1sXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhdmFpbGFibGUgbm90aWZpY2F0aW9uIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZXhhbXBsZSBvdXRwdXQgaXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwic3RhdHVzQmFyTm90aWZpY2F0aW9uc1wiOltcbiAqICAgICB7XG4gKiAgICAgICBcImlzR3JvdXBcIjpmYWxzZSxcbiAqICAgICAgIFwicGFja2FnZU5hbWVcIjpcImlvLmFwcGl1bS5zZXR0aW5nc1wiLFxuICogICAgICAgXCJpc0NsZWFyYWJsZVwiOmZhbHNlLFxuICogICAgICAgXCJpc09uZ29pbmdcIjp0cnVlLFxuICogICAgICAgXCJpZFwiOjEsXG4gKiAgICAgICBcInRhZ1wiOm51bGwsXG4gKiAgICAgICBcIm5vdGlmaWNhdGlvblwiOntcbiAqICAgICAgICAgXCJ0aXRsZVwiOm51bGwsXG4gKiAgICAgICAgIFwiYmlnVGl0bGVcIjpcIkFwcGl1bSBTZXR0aW5nc1wiLFxuICogICAgICAgICBcInRleHRcIjpudWxsLFxuICogICAgICAgICBcImJpZ1RleHRcIjpcIktlZXAgdGhpcyBzZXJ2aWNlIHJ1bm5pbmcsIHNvIEFwcGl1bSBmb3IgQW5kcm9pZCBjYW4gcHJvcGVybHkgaW50ZXJhY3Qgd2l0aCBzZXZlcmFsIHN5c3RlbSBBUElzXCIsXG4gKiAgICAgICAgIFwidGlja2VyVGV4dFwiOm51bGwsXG4gKiAgICAgICAgIFwic3ViVGV4dFwiOm51bGwsXG4gKiAgICAgICAgIFwiaW5mb1RleHRcIjpudWxsLFxuICogICAgICAgICBcInRlbXBsYXRlXCI6XCJhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24kQmlnVGV4dFN0eWxlXCJcbiAqICAgICAgIH0sXG4gKiAgICAgICBcInVzZXJIYW5kbGVcIjowLFxuICogICAgICAgXCJncm91cEtleVwiOlwiMHxpby5hcHBpdW0uc2V0dGluZ3N8MXxudWxsfDEwMTMzXCIsXG4gKiAgICAgICBcIm92ZXJyaWRlR3JvdXBLZXlcIjpudWxsLFxuICogICAgICAgXCJwb3N0VGltZVwiOjE1NzY4NTM1MTg4NTAsXG4gKiAgICAgICBcImtleVwiOlwiMHxpby5hcHBpdW0uc2V0dGluZ3N8MXxudWxsfDEwMTMzXCIsXG4gKiAgICAgICBcImlzUmVtb3ZlZFwiOmZhbHNlXG4gKiAgICAgfVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgbm90aWZpY2F0aW9ucyBsaXN0XG4gKi9cbmNvbW1hbmRzLmdldE5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25zICgpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIG5vdGlmaWNhdGlvbnMnKTtcbiAgLy8gU29tZWhvdyBwcm92aWRpbmcgdGhlIGAtbmAgYXJnIHRvIHRoZSBgYW1gIHVuZGVybmVhdGhcbiAgLy8gcmVuZGVycyB0aGUgYnJvYWRjYXN0IHRvIGZhaWwgaW5zdGVhZCBvZiBzdGFydGluZyB0aGVcbiAgLy8gQXBwaXVtIFNldHRpbmdzIGFwcC4gVGhpcyBvbmx5IGhhcHBlbnMgdG8gdGhlIG5vdGlmaWNhdGlvbnNcbiAgLy8gcmVjZWl2ZXJcbiAgYXdhaXQgdGhpcy5yZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwKCk7XG4gIGxldCBvdXRwdXQ7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAgICctYScsIE5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTixcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGUgQXBwaXVtIFNldHRpbmdzIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBhbmQgaXMgdXAgdG8gZGF0ZS4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlSnNvbkRhdGEob3V0cHV0LCAnbm90aWZpY2F0aW9ucycpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTbXNMaXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heCBbMTAwXSAtIFRoZSBtYXhpbXVtIGNvdW50IG9mIHJlY2VudCBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiB0aGUgbW9zdCByZWNlbnQgU01TXG4gKiBwcm9wZXJ0aWVzIGxpc3QgdmlhIEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIuXG4gKiBNZXNzYWdlcyBhcmUgc29ydGVkIGJ5IGRhdGUgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZXhhbXBsZSBvdXRwdXQgaXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiaXRlbXNcIjpbXG4gKiAgICAge1xuICogICAgICAgXCJpZFwiOlwiMlwiLFxuICogICAgICAgXCJhZGRyZXNzXCI6XCIrMTIzNDU2Nzg5XCIsXG4gKiAgICAgICBcInBlcnNvblwiOm51bGwsXG4gKiAgICAgICBcImRhdGVcIjpcIjE1ODE5MzY0MjIyMDNcIixcbiAqICAgICAgIFwicmVhZFwiOlwiMFwiLFxuICogICAgICAgXCJzdGF0dXNcIjpcIi0xXCIsXG4gKiAgICAgICBcInR5cGVcIjpcIjFcIixcbiAqICAgICAgIFwic3ViamVjdFwiOm51bGwsXG4gKiAgICAgICBcImJvZHlcIjpcIlxcXCJ0ZXh0IG1lc3NhZ2UyXFxcIlwiLFxuICogICAgICAgXCJzZXJ2aWNlQ2VudGVyXCI6bnVsbFxuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgXCJpZFwiOlwiMVwiLFxuICogICAgICAgXCJhZGRyZXNzXCI6XCIrMTIzNDU2Nzg5XCIsXG4gKiAgICAgICBcInBlcnNvblwiOm51bGwsXG4gKiAgICAgICBcImRhdGVcIjpcIjE1ODE5MzYzODI3NDBcIixcbiAqICAgICAgIFwicmVhZFwiOlwiMFwiLFxuICogICAgICAgXCJzdGF0dXNcIjpcIi0xXCIsXG4gKiAgICAgICBcInR5cGVcIjpcIjFcIixcbiAqICAgICAgIFwic3ViamVjdFwiOm51bGwsXG4gKiAgICAgICBcImJvZHlcIjpcIlxcXCJ0ZXh0IG1lc3NhZ2VcXFwiXCIsXG4gKiAgICAgICBcInNlcnZpY2VDZW50ZXJcIjpudWxsXG4gKiAgICAgfVxuICogICBdLFxuICogICBcInRvdGFsXCI6MlxuICogfVxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIFNNUyBsaXN0XG4gKi9cbmNvbW1hbmRzLmdldFNtc0xpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTbXNMaXN0IChvcHRzID0ge30pIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIHRoZSByZWNlbnQgU01TIG1lc3NhZ2VzJyk7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1uJywgU01TX0xJU1RfUkVDRUlWRVIsXG4gICAgJy1hJywgU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTixcbiAgXTtcbiAgaWYgKG9wdHMubWF4KSB7XG4gICAgYXJncy5wdXNoKCctLWVzJywgJ21heCcsIG9wdHMubWF4KTtcbiAgfVxuICBsZXQgb3V0cHV0O1xuICB0cnkge1xuICAgIG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJldHJpZXZlIFNNUyBsaXN0IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZSBBcHBpdW0gU2V0dGluZ3MgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIGFuZCBpcyB1cCB0byBkYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VKc29uRGF0YShvdXRwdXQsICdTTVMgbGlzdCcpO1xufTtcblxuLyoqXG4gKiBUeXBlcyB0aGUgZ2l2ZW4gVW5pY29kZSBzdHJpbmcuXG4gKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBmb2N1cyBpcyBhbHJlYWR5IHB1dFxuICogdG8gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHN0cmluZyB0byB0eXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnB1dCB0ZXh0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGFkYlxuICovXG5jb21tYW5kcy50eXBlVW5pY29kZSA9IGFzeW5jIGZ1bmN0aW9uIHR5cGVVbmljb2RlICh0ZXh0KSB7XG4gIGlmIChfLmlzTmlsKHRleHQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGV4dCA9IGAke3RleHR9YDtcbiAgbG9nLmRlYnVnKGBUeXBpbmcgJHt1dGlsLnBsdXJhbGl6ZSgnY2hhcmFjdGVyJywgdGV4dC5sZW5ndGgsIHRydWUpfWApO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXdhaXQgdGhpcy5ydW5JbkltZUNvbnRleHQoXG4gICAgVU5JQ09ERV9JTUUsIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaW5wdXRUZXh0KGltYXAuZW5jb2RlKHRleHQpKVxuICApO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgcmVjdXJzaXZlIG1lZGlhIHNjYW4gYXQgdGhlIGdpdmVuIGRlc3RpbmF0aW9uLlxuICogQWxsIHN1Y2Nlc3NmdWxseSBzY2FubmVkIGl0ZW1zIGFyZSBiZWluZyBhZGRlZCB0byB0aGUgZGV2aWNlJ3NcbiAqIG1lZGlhIGxpYnJhcnkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uIEZpbGUvZm9sZGVyIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIHVuZXhwZWN0ZWQgZXJyb3IgYnkgc2Nhbm5pbmcuXG4gKi9cbmNvbW1hbmRzLnNjYW5NZWRpYSA9IGFzeW5jIGZ1bmN0aW9uIHNjYW5NZWRpYSAoZGVzdGluYXRpb24pIHtcbiAgbG9nLmRlYnVnKGBTY2FubmluZyAnJHtkZXN0aW5hdGlvbn0nIGZvciBtZWRpYSBmaWxlc2ApO1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLW4nLCBNRURJQV9TQ0FOX1JFQ0VJVkVSLFxuICAgICctYScsIE1FRElBX1NDQU5fQUNUSU9OLFxuICAgICctLWVzJywgJ3BhdGgnLCBkZXN0aW5hdGlvblxuICBdKTtcbiAgaWYgKCFfLmluY2x1ZGVzKG91dHB1dCwgJ3Jlc3VsdD0tMScpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBtZWRpYSBjb3VsZCBiZSBzY2FubmVkIGF0ICcke2Rlc3RpbmF0aW9ufScuIGAgK1xuICAgICAgYENoZWNrIHRoZSBkZXZpY2UgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzLmApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsb0JBQW9CO0FBQy9DLE1BQU1DLDZCQUE2QixHQUFHLFdBQVc7QUFDakQsTUFBTUMsZ0NBQWdDLEdBQUksR0FBRUYsa0JBQW1CLDJDQUEwQztBQUN6RyxNQUFNRyw4QkFBOEIsR0FBSSxHQUFFSCxrQkFBbUIsT0FBTTtBQUNuRSxNQUFNSSxnQ0FBZ0MsR0FBSSxHQUFFSixrQkFBbUIsMkNBQTBDO0FBQ3pHLE1BQU1LLDhCQUE4QixHQUFJLEdBQUVMLGtCQUFtQixrQkFBaUI7QUFDOUUsTUFBTU0sMEJBQTBCLEdBQUksR0FBRU4sa0JBQW1CLHNDQUFxQztBQUM5RixNQUFNTyx3QkFBd0IsR0FBSSxHQUFFUCxrQkFBbUIsWUFBVztBQUNsRSxNQUFNUSx1QkFBdUIsR0FBSSxHQUFFUixrQkFBbUIsbUNBQWtDO0FBQ3hGLE1BQU1TLHFCQUFxQixHQUFJLEdBQUVULGtCQUFtQixTQUFRO0FBQzVELE1BQU1VLGdCQUFnQixHQUFJLEdBQUVWLGtCQUFtQixtQkFBa0I7QUFDakUsTUFBTVcsaUJBQWlCLEdBQUksR0FBRVgsa0JBQW1CLGtDQUFpQztB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
292
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRUSU5HU19IRUxQRVJfSUQiLCJTRVRUSU5HU19IRUxQRVJfTUFJTl9BQ1RJVklUWSIsIldJRklfQ09OTkVDVElPTl9TRVRUSU5HX1JFQ0VJVkVSIiwiV0lGSV9DT05ORUNUSU9OX1NFVFRJTkdfQUNUSU9OIiwiREFUQV9DT05ORUNUSU9OX1NFVFRJTkdfUkVDRUlWRVIiLCJEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04iLCJBTklNQVRJT05fU0VUVElOR19SRUNFSVZFUiIsIkFOSU1BVElPTl9TRVRUSU5HX0FDVElPTiIsIkxPQ0FMRV9TRVRUSU5HX1JFQ0VJVkVSIiwiTE9DQUxFX1NFVFRJTkdfQUNUSU9OIiwiTE9DQVRJT05fU0VSVklDRSIsIkxPQ0FUSU9OX1JFQ0VJVkVSIiwiTE9DQVRJT05fUkVUUklFVkFMX0FDVElPTiIsIkNMSVBCT0FSRF9SRUNFSVZFUiIsIkNMSVBCT0FSRF9SRVRSSUVWQUxfQUNUSU9OIiwiTk9USUZJQ0FUSU9OU19SRVRSSUVWQUxfQUNUSU9OIiwiU01TX0xJU1RfUkVDRUlWRVIiLCJTTVNfTElTVF9SRVRSSUVWQUxfQUNUSU9OIiwiTUVESUFfU0NBTl9SRUNFSVZFUiIsIk1FRElBX1NDQU5fQUNUSU9OIiwiQVBQSVVNX0lNRSIsIlVOSUNPREVfSU1FIiwiREVGQVVMVF9TQVRFTExJVEVTX0NPVU5UIiwiREVGQVVMVF9BTFRJVFVERSIsIkxPQ0FUSU9OX1RSQUNLRVJfVEFHIiwiR1BTX0NBQ0hFX1JFRlJFU0hFRF9MT0dTIiwiR1BTX0NPT1JESU5BVEVTX1BBVFRFUk4iLCJjb21tYW5kcyIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJvcHRzIiwicHJvY2Vzc0V4aXN0cyIsImxvZyIsImRlYnVnIiwidGltZW91dCIsInN0YXJ0QXBwIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjYXRlZ29yeSIsInN0b3BBcHAiLCJ3YWl0Rm9yTGF1bmNoIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnIiLCJFcnJvciIsInNldFdpZmlTdGF0ZSIsIm9uIiwiaXNFbXVsYXRvciIsInNoZWxsIiwicHJpdmlsZWdlZCIsImdldEFwaUxldmVsIiwic2V0RGF0YVN0YXRlIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJzZXREZXZpY2VTeXNMb2NhbGVWaWFTZXR0aW5nQXBwIiwibGFuZ3VhZ2UiLCJjb3VudHJ5Iiwic2NyaXB0IiwicGFyYW1zIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsInB1c2giLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZm9ybWF0TG9jYXRpb25WYWx1ZSIsInZhbHVlTmFtZSIsImlzUmVxdWlyZWQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJmbG9hdFZhbHVlIiwicGFyc2VGbG9hdCIsImlzTmFOIiwiXyIsImNlaWwiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImFsdGl0dWRlIiwic3BlZWQiLCJhcmdzIiwiaXNOaWwiLCJzYXRlbGxpdGVzIiwicGFyc2VJbnQiLCJOdW1iZXIiLCJsZW5ndGgiLCJyZXNldFRlbG5ldEF1dGhUb2tlbiIsImFkYkV4ZWMiLCJtYXAiLCJhcmciLCJyZXBsYWNlIiwiZ2V0R2VvTG9jYXRpb24iLCJvdXRwdXQiLCJzdGRlcnIiLCJzdGRvdXQiLCJtZXNzYWdlIiwibWF0Y2giLCJleGVjIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlZnJlc2hHZW9Mb2NhdGlvbkNhY2hlIiwidGltZW91dE1zIiwibG9nY2F0TW9uaXRvciIsIm1vbml0b3JpbmdQcm9taXNlIiwiY21kIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiU3ViUHJvY2VzcyIsInBhdGgiLCJ0aW1lb3V0RXJyb3JNc2ciLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJldnQiLCJsaW5lcyIsInNvbWUiLCJsaW5lIiwieCIsImluY2x1ZGVzIiwic3RhcnQiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwiaW5mbyIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiaXNSdW5uaW5nIiwic3RvcCIsInBlcmZvcm1FZGl0b3JBY3Rpb24iLCJydW5JbkltZUNvbnRleHQiLCJnZXRDbGlwYm9hcmQiLCJyZXRyaWV2ZUNsaXBib2FyZCIsInRyaW0iLCJnZXROb3RpZmljYXRpb25zIiwicGFyc2VKc29uRGF0YSIsImdldFNtc0xpc3QiLCJtYXgiLCJ0eXBlVW5pY29kZSIsInRleHQiLCJwbHVyYWxpemUiLCJpbnB1dFRleHQiLCJpbWFwIiwiZW5jb2RlIiwic2Nhbk1lZGlhIiwiZGVzdGluYXRpb24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvc2V0dGluZ3MtY2xpZW50LWNvbW1hbmRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IHBhcnNlSnNvbkRhdGEgfSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB1dGlsLCB0aW1pbmcgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGltYXAgfSBmcm9tICd1dGY3JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBTRVRUSU5HU19IRUxQRVJfSUQgPSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9NQUlOX0FDVElWSVRZID0gJy5TZXR0aW5ncyc7XG5jb25zdCBXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5XaUZpQ29ubmVjdGlvblNldHRpbmdSZWNlaXZlcmA7XG5jb25zdCBXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9LndpZmlgO1xuY29uc3QgREFUQV9DT05ORUNUSU9OX1NFVFRJTkdfUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuRGF0YUNvbm5lY3Rpb25TZXR0aW5nUmVjZWl2ZXJgO1xuY29uc3QgREFUQV9DT05ORUNUSU9OX1NFVFRJTkdfQUNUSU9OID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS5kYXRhX2Nvbm5lY3Rpb25gO1xuY29uc3QgQU5JTUFUSU9OX1NFVFRJTkdfUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuQW5pbWF0aW9uU2V0dGluZ1JlY2VpdmVyYDtcbmNvbnN0IEFOSU1BVElPTl9TRVRUSU5HX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0uYW5pbWF0aW9uYDtcbmNvbnN0IExPQ0FMRV9TRVRUSU5HX1JFQ0VJVkVSID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8ucmVjZWl2ZXJzLkxvY2FsZVNldHRpbmdSZWNlaXZlcmA7XG5jb25zdCBMT0NBTEVfU0VUVElOR19BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9LmxvY2FsZWA7XG5jb25zdCBMT0NBVElPTl9TRVJWSUNFID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8uTG9jYXRpb25TZXJ2aWNlYDtcbmNvbnN0IExPQ0FUSU9OX1JFQ0VJVkVSID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8ucmVjZWl2ZXJzLkxvY2F0aW9uSW5mb1JlY2VpdmVyYDtcbmNvbnN0IExPQ0FUSU9OX1JFVFJJRVZBTF9BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9LmxvY2F0aW9uYDtcbmNvbnN0IENMSVBCT0FSRF9SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5DbGlwYm9hcmRSZWNlaXZlcmA7XG5jb25zdCBDTElQQk9BUkRfUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0uY2xpcGJvYXJkLmdldGA7XG5jb25zdCBOT1RJRklDQVRJT05TX1JFVFJJRVZBTF9BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Lm5vdGlmaWNhdGlvbnNgO1xuY29uc3QgU01TX0xJU1RfUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuU21zUmVhZGVyYDtcbmNvbnN0IFNNU19MSVNUX1JFVFJJRVZBTF9BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9LnNtcy5yZWFkYDtcbmNvbnN0IE1FRElBX1NDQU5fUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuTWVkaWFTY2FubmVyUmVjZWl2ZXJgO1xuY29uc3QgTUVESUFfU0NBTl9BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9LnNjYW5fbWVkaWFgO1xuY29uc3QgQVBQSVVNX0lNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLkFwcGl1bUlNRWA7XG5jb25zdCBVTklDT0RFX0lNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLlVuaWNvZGVJTUVgO1xuY29uc3QgREVGQVVMVF9TQVRFTExJVEVTX0NPVU5UID0gMTI7XG5jb25zdCBERUZBVUxUX0FMVElUVURFID0gMC4wO1xuY29uc3QgTE9DQVRJT05fVFJBQ0tFUl9UQUcgPSAnTG9jYXRpb25UcmFja2VyJztcbmNvbnN0IEdQU19DQUNIRV9SRUZSRVNIRURfTE9HUyA9IFtcbiAgJ1RoZSBjdXJyZW50IGxvY2F0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgZnJvbSBQbGF5IFNlcnZpY2VzJyxcbiAgJ1RoZSBjdXJyZW50IGxvY2F0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgZnJvbSBMb2NhdGlvbiBNYW5hZ2VyJ1xuXTtcblxuY29uc3QgR1BTX0NPT1JESU5BVEVTX1BBVFRFUk4gPSAvZGF0YT1cIigtP1tcXGQuXSspXFxzKygtP1tcXGQuXSspXFxzKygtP1tcXGQuXSspXCIvO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNldHRpbmdzQXBwU3RhcnR1cE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs1MDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKiB0byB3YWl0IHVudGlsIHRoZSBhcHAgaGFzIHN0YXJ0ZWRcbiAqL1xuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBBcHBpdW0gU2V0dGluZ3MgaGVscGVyIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmdcbiAqIGFuZCBzdGFydHMgaXQgaWYgbmVjZXNzYXJ5XG4gKlxuICogQHBhcmFtIHtTZXR0aW5nc0FwcFN0YXJ0dXBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgQXBwaXVtIFNldHRpbmdzIGhhcyBmYWlsZWQgdG8gc3RhcnRcbiAqIEByZXR1cm5zIHtBREJ9IHNlbGYgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gKi9cbmNvbW1hbmRzLnJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAgPSBhc3luYyBmdW5jdGlvbiByZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwIChvcHRzID0ge30pIHtcbiAgaWYgKGF3YWl0IHRoaXMucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfSUQpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsb2cuZGVidWcoJ1N0YXJ0aW5nIEFwcGl1bSBTZXR0aW5ncyBhcHAnKTtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSA1MDAwLFxuICB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5zdGFydEFwcCh7XG4gICAgcGtnOiBTRVRUSU5HU19IRUxQRVJfSUQsXG4gICAgYWN0aXZpdHk6IFNFVFRJTkdTX0hFTFBFUl9NQUlOX0FDVElWSVRZLFxuICAgIGFjdGlvbjogJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICBjYXRlZ29yeTogJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICBzdG9wQXBwOiBmYWxzZSxcbiAgICB3YWl0Rm9yTGF1bmNoOiBmYWxzZSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnByb2Nlc3NFeGlzdHMoU0VUVElOR1NfSEVMUEVSX0lEKSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0LFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcGl1bSBTZXR0aW5ncyBhcHAgaXMgbm90IHJ1bm5pbmcgYWZ0ZXIgJHt0aW1lb3V0fW1zYCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBXaUZpIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5jb21tYW5kcy5zZXRXaWZpU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXRXaWZpU3RhdGUgKG9uLCBpc0VtdWxhdG9yID0gZmFsc2UpIHtcbiAgaWYgKGlzRW11bGF0b3IpIHtcbiAgICAvLyBUaGUgc3ZjIGNvbW1hbmQgZG9lcyBub3QgcmVxdWlyZSB0byBiZSByb290IHNpbmNlIEFQSSAyNlxuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydzdmMnLCAnd2lmaScsIG9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSddLCB7XG4gICAgICBwcml2aWxlZ2VkOiBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyNixcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICAgJy1hJywgV0lGSV9DT05ORUNUSU9OX1NFVFRJTkdfQUNUSU9OLFxuICAgICAgJy1uJywgV0lGSV9DT05ORUNUSU9OX1NFVFRJTkdfUkVDRUlWRVIsXG4gICAgICAnLS1lcycsICdzZXRzdGF0dXMnLCBvbiA/ICdlbmFibGUnIDogJ2Rpc2FibGUnXG4gICAgXSk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBEYXRhIHRyYW5zZmVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5jb21tYW5kcy5zZXREYXRhU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXREYXRhU3RhdGUgKG9uLCBpc0VtdWxhdG9yID0gZmFsc2UpIHtcbiAgaWYgKGlzRW11bGF0b3IpIHtcbiAgICAvLyBUaGUgc3ZjIGNvbW1hbmQgZG9lcyBub3QgcmVxdWlyZSB0byBiZSByb290IHNpbmNlIEFQSSAyNlxuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydzdmMnLCAnZGF0YScsIG9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSddLCB7XG4gICAgICBwcml2aWxlZ2VkOiBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyNixcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICAgJy1hJywgREFUQV9DT05ORUNUSU9OX1NFVFRJTkdfQUNUSU9OLFxuICAgICAgJy1uJywgREFUQV9DT05ORUNUSU9OX1NFVFRJTkdfUkVDRUlWRVIsXG4gICAgICAnLS1lcycsICdzZXRzdGF0dXMnLCBvbiA/ICdlbmFibGUnIDogJ2Rpc2FibGUnXG4gICAgXSk7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBhbmltYXRpb24gb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQW5pbWF0aW9uIG9uIHRoZSBkZXZpY2UgaXMgY29udHJvbGxlZCBieSB0aGUgZm9sbG93aW5nIGdsb2JhbCBwcm9wZXJ0aWVzOlxuICogW0FOSU1BVE9SX0RVUkFUSU9OX1NDQUxFXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5HbG9iYWwuaHRtbCNBTklNQVRPUl9EVVJBVElPTl9TQ0FMRX0sXG4gKiBbVFJBTlNJVElPTl9BTklNQVRJT05fU0NBTEVde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLkdsb2JhbC5odG1sI1RSQU5TSVRJT05fQU5JTUFUSU9OX1NDQUxFfSxcbiAqIFtXSU5ET1dfQU5JTUFUSU9OX1NDQUxFXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5HbG9iYWwuaHRtbCNXSU5ET1dfQU5JTUFUSU9OX1NDQUxFfS5cbiAqIFRoaXMgbWV0aG9kIHNldHMgYWxsIHRoaXMgcHJvcGVydGllcyB0byAwLjAgdG8gZGlzYWJsZSAoMS4wIHRvIGVuYWJsZSkgYW5pbWF0aW9uLlxuICpcbiAqIFR1cm5pbmcgb2ZmIGFuaW1hdGlvbiBtaWdodCBiZSB1c2VmdWwgdG8gaW1wcm92ZSBzdGFiaWxpdHlcbiAqIGFuZCByZWR1Y2UgdGVzdHMgZXhlY3V0aW9uIHRpbWUuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIGl0LlxuICovXG5jb21tYW5kcy5zZXRBbmltYXRpb25TdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEFuaW1hdGlvblN0YXRlIChvbikge1xuICBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLWEnLCBBTklNQVRJT05fU0VUVElOR19BQ1RJT04sXG4gICAgJy1uJywgQU5JTUFUSU9OX1NFVFRJTkdfUkVDRUlWRVIsXG4gICAgJy0tZXMnLCAnc2V0c3RhdHVzJywgb24gPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ1xuICBdKTtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBsb2NhbGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBEb24ndCBuZWVkIHRvIHJlYm9vdCB0aGUgZGV2aWNlIGFmdGVyIGNoYW5naW5nIHRoZSBsb2NhbGUuXG4gKiBUaGlzIG1ldGhvZCBzZXRzIGFuIGFyYml0cmFyeSBsb2NhbGUgZm9sbG93aW5nOlxuICogICBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWwjTG9jYWxlKGphdmEubGFuZy5TdHJpbmcsJTIwamF2YS5sYW5nLlN0cmluZylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZS4gZS5nLiBlbiwgamFcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb3VudHJ5IC0gQ291bnRyeS4gZS5nLiBVUywgSlBcbiAqIEBwYXJhbSB7P3N0cmluZ30gc2NyaXB0IC0gU2NyaXB0LiBlLmcuIEhhbnMgaW4gYHpoLUhhbnMtQ05gXG4gKi9cbmNvbW1hbmRzLnNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAgPSBhc3luYyBmdW5jdGlvbiBzZXREZXZpY2VTeXNMb2NhbGVWaWFTZXR0aW5nQXBwIChsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0ID0gbnVsbCkge1xuICBjb25zdCBwYXJhbXMgPSBbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1hJywgTE9DQUxFX1NFVFRJTkdfQUNUSU9OLFxuICAgICctbicsIExPQ0FMRV9TRVRUSU5HX1JFQ0VJVkVSLFxuICAgICctLWVzJywgJ2xhbmcnLCBsYW5ndWFnZS50b0xvd2VyQ2FzZSgpLFxuICAgICctLWVzJywgJ2NvdW50cnknLCBjb3VudHJ5LnRvVXBwZXJDYXNlKClcbiAgXTtcblxuICBpZiAoc2NyaXB0KSB7XG4gICAgcGFyYW1zLnB1c2goJy0tZXMnLCAnc2NyaXB0Jywgc2NyaXB0KTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuc2hlbGwocGFyYW1zKTtcbn07XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2NhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXJ8c3RyaW5nfSBsb25naXR1ZGUgLSBWYWxpZCBsb25naXR1ZGUgdmFsdWUuXG4gKiBAcHJvcGVydHkge251bWJlcnxzdHJpbmd9IGxhdGl0dWRlIC0gVmFsaWQgbGF0aXR1ZGUgdmFsdWUuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBhbHRpdHVkZSAtIFZhbGlkIGFsdGl0dWRlIHZhbHVlLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gc2F0ZWxsaXRlcyBbMTJdIC0gTnVtYmVyIG9mIHNhdGVsbGl0ZXMgYmVpbmcgdHJhY2tlZCAoMS0xMikuXG4gKiBUaGlzIHZhbHVlIGlzIGlnbm9yZWQgb24gcmVhbCBkZXZpY2VzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gc3BlZWQgLSBWYWxpZCBzcGVlZCB2YWx1ZS5cbiAqIFNob3VsZCBiZSBncmVhdGVyIHRoYW4gMC4wIG1ldGVycy9zZWNvbmQgZm9yIHJlYWwgZGV2aWNlcyBvciAwLjAga25vdHNcbiAqIGZvciBlbXVsYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGdlb2xvY2F0aW9uIGNvb3JkaW5hdGVzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge0xvY2F0aW9ufSBsb2NhdGlvbiAtIExvY2F0aW9uIG9iamVjdC4gVGhlIGBhbHRpdHVkZWAgdmFsdWUgaXMgaWdub3JlZFxuICogd2hpbGUgbW9ja2luZyB0aGUgcG9zaXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5jb21tYW5kcy5zZXRHZW9Mb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldEdlb0xvY2F0aW9uIChsb2NhdGlvbiwgaXNFbXVsYXRvciA9IGZhbHNlKSB7XG4gIGNvbnN0IGZvcm1hdExvY2F0aW9uVmFsdWUgPSAodmFsdWVOYW1lLCBpc1JlcXVpcmVkID0gdHJ1ZSkgPT4ge1xuICAgIGlmICghdXRpbC5oYXNWYWx1ZShsb2NhdGlvblt2YWx1ZU5hbWVdKSkge1xuICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3ZhbHVlTmFtZX0gbXVzdCBiZSBwcm92aWRlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZsb2F0VmFsdWUgPSBwYXJzZUZsb2F0KGxvY2F0aW9uW3ZhbHVlTmFtZV0pO1xuICAgIGlmICghaXNOYU4oZmxvYXRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBgJHtfLmNlaWwoZmxvYXRWYWx1ZSwgNSl9YDtcbiAgICB9XG4gICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt2YWx1ZU5hbWV9IGlzIGV4cGVjdGVkIHRvIGJlIGEgdmFsaWQgZmxvYXQgbnVtYmVyLiBgICtcbiAgICAgICAgYCcke2xvY2F0aW9uW3ZhbHVlTmFtZV19JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuICBjb25zdCBsb25naXR1ZGUgPSBmb3JtYXRMb2NhdGlvblZhbHVlKCdsb25naXR1ZGUnKTtcbiAgY29uc3QgbGF0aXR1ZGUgPSBmb3JtYXRMb2NhdGlvblZhbHVlKCdsYXRpdHVkZScpO1xuICBjb25zdCBhbHRpdHVkZSA9IGZvcm1hdExvY2F0aW9uVmFsdWUoJ2FsdGl0dWRlJywgZmFsc2UpO1xuICBjb25zdCBzcGVlZCA9IGZvcm1hdExvY2F0aW9uVmFsdWUoJ3NwZWVkJywgZmFsc2UpO1xuICBpZiAoaXNFbXVsYXRvcikge1xuICAgIGNvbnN0IGFyZ3MgPSBbbG9uZ2l0dWRlLCBsYXRpdHVkZV07XG4gICAgaWYgKCFfLmlzTmlsKGFsdGl0dWRlKSkge1xuICAgICAgYXJncy5wdXNoKGFsdGl0dWRlKTtcbiAgICB9XG4gICAgY29uc3Qgc2F0ZWxsaXRlcyA9IHBhcnNlSW50KGxvY2F0aW9uLnNhdGVsbGl0ZXMsIDEwKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihzYXRlbGxpdGVzKSAmJiBzYXRlbGxpdGVzID4gMCAmJiBzYXRlbGxpdGVzIDw9IDEyKSB7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPCAzKSB7XG4gICAgICAgIGFyZ3MucHVzaChgJHtERUZBVUxUX0FMVElUVURFfWApO1xuICAgICAgfVxuICAgICAgYXJncy5wdXNoKGAke3NhdGVsbGl0ZXN9YCk7XG4gICAgfVxuICAgIGlmICghXy5pc05pbChzcGVlZCkpIHtcbiAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgYXJncy5wdXNoKGAke0RFRkFVTFRfQUxUSVRVREV9YCk7XG4gICAgICB9XG4gICAgICBpZiAoYXJncy5sZW5ndGggPCA0KSB7XG4gICAgICAgIGFyZ3MucHVzaChgJHtERUZBVUxUX1NBVEVMTElURVNfQ09VTlR9YCk7XG4gICAgICB9XG4gICAgICBhcmdzLnB1c2goc3BlZWQpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnJlc2V0VGVsbmV0QXV0aFRva2VuKCk7XG4gICAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZW11JywgJ2dlbycsICdmaXgnLCAuLi5hcmdzXSk7XG4gICAgLy8gQSB3b3JrYXJvdW5kIGZvciBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0yMDYxODBcbiAgICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydlbXUnLCAnZ2VvJywgJ2ZpeCcsIC4uLihhcmdzLm1hcCgoYXJnKSA9PiBhcmcucmVwbGFjZSgnLicsICcsJykpKV0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAnYW0nLCAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpID49IDI2KSA/ICdzdGFydC1mb3JlZ3JvdW5kLXNlcnZpY2UnIDogJ3N0YXJ0c2VydmljZScsXG4gICAgICAnLWUnLCAnbG9uZ2l0dWRlJywgbG9uZ2l0dWRlLFxuICAgICAgJy1lJywgJ2xhdGl0dWRlJywgbGF0aXR1ZGUsXG4gICAgXTtcbiAgICBpZiAodXRpbC5oYXNWYWx1ZShhbHRpdHVkZSkpIHtcbiAgICAgIGFyZ3MucHVzaCgnLWUnLCAnYWx0aXR1ZGUnLCBhbHRpdHVkZSk7XG4gICAgfVxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHNwZWVkKSkge1xuICAgICAgYXJncy5wdXNoKCctZScsICdzcGVlZCcsIHNwZWVkKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKExPQ0FUSU9OX1NFUlZJQ0UpO1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IGNhY2hlZCBHUFMgbG9jYXRpb24gZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybnMge0xvY2F0aW9ufSBUaGUgY3VycmVudCBsb2NhdGlvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNhbm5vdCBiZSByZXRyaWV2ZWRcbiAqL1xuY29tbWFuZHMuZ2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRHZW9Mb2NhdGlvbiAoKSB7XG4gIGxldCBvdXRwdXQ7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAgICctbicsIExPQ0FUSU9OX1JFQ0VJVkVSLFxuICAgICAgJy1hJywgTE9DQVRJT05fUkVUUklFVkFMX0FDVElPTixcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGN1cnJlbnQgZ2VvIGNvb3JkaW5hdGVzIGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZSBBcHBpdW0gU2V0dGluZ3MgYXBwbGljYXRpb24gaXMgdXAgdG8gZGF0ZSBhbmQgaGFzIGxvY2F0aW9uIHBlcm1pc3Npb25zLiBBbHNvIHRoZSBsb2NhdGlvbiBgICtcbiAgICAgIGBzZXJ2aWNlcyBtdXN0IGJlIGVuYWJsZWQgb24gdGhlIGRldmljZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLnN0ZGVyciB8fCBlcnIuc3Rkb3V0IHx8IGVyci5tZXNzYWdlfWApO1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBHUFNfQ09PUkRJTkFURVNfUEFUVEVSTi5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgYWN0dWFsIGxvY2F0aW9uIHZhbHVlcyBmcm9tIHRoZSBjb21tYW5kIG91dHB1dDogJHtvdXRwdXR9YCk7XG4gIH1cbiAgY29uc3QgbG9jYXRpb24gPSB7XG4gICAgbGF0aXR1ZGU6IG1hdGNoWzFdLFxuICAgIGxvbmdpdHVkZTogbWF0Y2hbMl0sXG4gICAgYWx0aXR1ZGU6IG1hdGNoWzNdLFxuICB9O1xuICBsb2cuZGVidWcoYEdvdCBnZW8gY29vcmRpbmF0ZXM6ICR7SlNPTi5zdHJpbmdpZnkobG9jYXRpb24pfWApO1xuICByZXR1cm4gbG9jYXRpb247XG59O1xuXG4vKipcbiAqIFNlbmRzIGFuIGFzeW5jIHJlcXVlc3QgdG8gcmVmcmVzaCB0aGUgR1BTIGNhY2hlLlxuICogVGhpcyBmZWF0dXJlIG9ubHkgd29ya3MgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0IGhhc1xuICogR29vZ2xlIFBsYXkgU2VydmljZXMgaW5zdGFsbGVkLiBJbiBjYXNlIHRoZSB2YW5pbGxhXG4gKiBMb2NhdGlvbk1hbmFnZXIgaXMgdXNlZCB0aGUgZGV2aWNlIEFQSSBsZXZlbCBtdXN0IGJlIGF0XG4gKiB2ZXJzaW9uIDMwIChBbmRyb2lkIFIpIG9yIGhpZ2hlci5cbiAqXG4gKiBAcGFyYW0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgR1BTIGNhY2hlIGNhbm5vdCBiZSByZWZyZXNoZWQuXG4gKi9cbmNvbW1hbmRzLnJlZnJlc2hHZW9Mb2NhdGlvbkNhY2hlID0gYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUgKHRpbWVvdXRNcyA9IDIwMDAwKSB7XG4gIGxldCBsb2djYXRNb25pdG9yO1xuICBsZXQgbW9uaXRvcmluZ1Byb21pc2U7XG5cbiAgaWYgKHRpbWVvdXRNcyA+IDApIHtcbiAgICBjb25zdCBjbWQgPSBbXG4gICAgICAuLi50aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgICAnbG9nY2F0JywgJy1zJywgTE9DQVRJT05fVFJBQ0tFUl9UQUcsXG4gICAgXTtcbiAgICBsb2djYXRNb25pdG9yID0gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGNtZCk7XG4gICAgY29uc3QgdGltZW91dEVycm9yTXNnID0gYFRoZSBHUFMgY2FjaGUgaGFzIG5vdCBiZWVuIHJlZnJlc2hlZCB3aXRoaW4gJHt0aW1lb3V0TXN9bXMgdGltZW91dC4gYCArXG4gICAgICBgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzIEFwcGl1bSBTZXR0aW5ncyBhcHAgaW5zdGFsbGVkIGFuZCBydW5uaW5nLiBgICtcbiAgICAgIGBBbHNvLCBpdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBkZXZpY2UgaGFzIEdvb2dsZSBQbGF5IFNlcnZpY2VzIGluc3RhbGxlZCBvciBpcyBydW5uaW5nIGAgK1xuICAgICAgYEFuZHJvaWQgMTArIG90aGVyd2lzZS5gO1xuICAgIG1vbml0b3JpbmdQcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKHRpbWVvdXRFcnJvck1zZykpLCB0aW1lb3V0TXMpO1xuXG4gICAgICBsb2djYXRNb25pdG9yLm9uKCdleGl0JywgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcih0aW1lb3V0RXJyb3JNc2cpKSk7XG4gICAgICBbJ2xpbmVzLXN0ZGVycicsICdsaW5lcy1zdGRvdXQnXS5tYXAoKGV2dCkgPT4gbG9nY2F0TW9uaXRvci5vbihldnQsIChsaW5lcykgPT4ge1xuICAgICAgICBpZiAobGluZXMuc29tZSgobGluZSkgPT4gR1BTX0NBQ0hFX1JFRlJFU0hFRF9MT0dTLnNvbWUoKHgpID0+IGxpbmUuaW5jbHVkZXMoeCkpKSkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH0pO1xuICAgIGF3YWl0IGxvZ2NhdE1vbml0b3Iuc3RhcnQoMCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAnLW4nLCBMT0NBVElPTl9SRUNFSVZFUixcbiAgICAgICctYScsIExPQ0FUSU9OX1JFVFJJRVZBTF9BQ1RJT04sXG4gICAgICAnLS1leicsICdmb3JjZVVwZGF0ZScsICd0cnVlJyxcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVmcmVzaCB0aGUgR1BTIGNhY2hlIG9uIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGUgQXBwaXVtIFNldHRpbmdzIGFwcGxpY2F0aW9uIGlzIHVwIHRvIGRhdGUgYW5kIGhhcyBsb2NhdGlvbiBwZXJtaXNzaW9ucy4gQWxzbyB0aGUgbG9jYXRpb24gYCArXG4gICAgICBgc2VydmljZXMgbXVzdCBiZSBlbmFibGVkIG9uIHRoZSBkZXZpY2UuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5zdGRlcnIgfHwgZXJyLnN0ZG91dCB8fCBlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChsb2djYXRNb25pdG9yICYmIG1vbml0b3JpbmdQcm9taXNlKSB7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHt0aW1lb3V0TXN9bXMgZm9yIHRoZSBHUFMgY2FjaGUgdG8gYmUgcmVmcmVzaGVkYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1vbml0b3JpbmdQcm9taXNlO1xuICAgICAgbG9nLmluZm8oYFRoZSBHUFMgY2FjaGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlZnJlc2hlZCBhZnRlciBgICtcbiAgICAgICAgYCR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChsb2djYXRNb25pdG9yLmlzUnVubmluZykge1xuICAgICAgICBhd2FpdCBsb2djYXRNb25pdG9yLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nLmluZm8oJ1RoZSByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIEdQUyBjYWNoZSBoYXMgYmVlbiBzZW50LiBTa2lwcGluZyB3YWl0aW5nIGZvciBpdHMgcmVzdWx0LicpO1xuICB9XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBnaXZlbiBlZGl0b3IgYWN0aW9uIG9uIHRoZSBmb2N1c2VkIGlucHV0IGZpZWxkLlxuICogVGhpcyBtZXRob2QgcmVxdWlyZXMgQXBwaXVtIFNldHRpbmdzIGhlbHBlciB0byBiZSBpbnN0YWxsZWQgb24gdGhlIGRldmljZS5cbiAqIE5vIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBwZXJmb3JtaW5nIHRoZSBhY3Rpb24uXG4gKiBZb3UgbXVzdCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dCBpZiBzb21ldGhpbmcgZGlkIG5vdCB3b3JrIGFzIGV4cGVjdGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gYWN0aW9uIC0gRWl0aGVyIGFjdGlvbiBjb2RlIG9yIG5hbWUuIFRoZSBmb2xsb3dpbmcgYWN0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIGFyZSBzdXBwb3J0ZWQ6IGBub3JtYWwsIHVuc3BlY2lmaWVkLCBub25lLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbywgc2VhcmNoLCBzZW5kLCBuZXh0LCBkb25lLCBwcmV2aW91c2BcbiAqL1xuY29tbWFuZHMucGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1FZGl0b3JBY3Rpb24gKGFjdGlvbikge1xuICBsb2cuZGVidWcoYFBlcmZvcm1pbmcgZWRpdG9yIGFjdGlvbjogJHthY3Rpb259YCk7XG4gIGF3YWl0IHRoaXMucnVuSW5JbWVDb250ZXh0KEFQUElVTV9JTUUsXG4gICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBgLyR7YWN0aW9ufS9gXSkpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHRleHQgY29udGVudCBvZiB0aGUgZGV2aWNlJ3MgY2xpcGJvYXJkLlxuICogVGhlIG1ldGhvZCB3b3JrcyBmb3IgQW5kcm9pZCBiZWxvdyBhbmQgYWJvdmUgMjkuXG4gKiBJdCB0ZW1vcmFyaWx5IGVuZm9yY2VzIHRoZSBJTUUgc2V0dGluZyBpbiBvcmRlciB0byB3b3JrYXJvdW5kXG4gKiBzZWN1cml0eSBsaW1pdGF0aW9ucyBpZiBuZWVkZWQuXG4gKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIEFwcGl1bSBTZXR0aW5ncyB2LiAyLjE1KyBpcyBpbnN0YWxsZWRcbiAqIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgbWFpbiBjbGlwYm9hcmQgYXNcbiAqIGJhc2U2NC1lbmNvZGVkIHN0cmluZyBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGNsaXBib2FyZCBpcyBlbXB0eVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgZ2V0dGluZyB0aGVcbiAqIGNsaXBib2FyZCBjb250YW50XG4gKi9cbmNvbW1hbmRzLmdldENsaXBib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGdldENsaXBib2FyZCAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyB0aGUgY2xpcGJvYXJkIGNvbnRlbnQnKTtcbiAgY29uc3QgcmV0cmlldmVDbGlwYm9hcmQgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLW4nLCBDTElQQk9BUkRfUkVDRUlWRVIsXG4gICAgJy1hJywgQ0xJUEJPQVJEX1JFVFJJRVZBTF9BQ1RJT04sXG4gIF0pO1xuICBsZXQgb3V0cHV0O1xuICB0cnkge1xuICAgIG91dHB1dCA9IChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjkpXG4gICAgICA/IChhd2FpdCB0aGlzLnJ1bkluSW1lQ29udGV4dChBUFBJVU1fSU1FLCByZXRyaWV2ZUNsaXBib2FyZCkpXG4gICAgICA6IChhd2FpdCByZXRyaWV2ZUNsaXBib2FyZCgpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGN1cnJlbnQgY2xpcGJvYXJkIGNvbnRlbnQgZnJvbSB0aGUgZGV2aWNlLiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlIEFwcGl1bSBTZXR0aW5ncyBhcHBsaWNhdGlvbiBpcyB1cCB0byBkYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gL2RhdGE9XCIoW15cIl0qKVwiLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgYWN0dWFsIGNsaWJvYXJkIGNvbnRlbnQgZnJvbSB0aGUgY29tbWFuZCBvdXRwdXQ6ICR7b3V0cHV0fWApO1xuICB9XG4gIHJldHVybiBfLnRyaW0obWF0Y2hbMV0pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgQW5kcm9pZCBub3RpZmljYXRpb25zIHZpYSBBcHBpdW0gU2V0dGluZ3MgaGVscGVyLlxuICogQXBwaXVtIFNldHRpbmdzIGFwcCBpdHNlbGYgbXVzdCBiZSAqbWFudWFsbHkqIGdyYW50ZWQgdG8gYWNjZXNzIG5vdGlmaWNhdGlvbnNcbiAqIHVuZGVyIGRldmljZSBTZXR0aW5ncyBpbiBvcmRlciB0byBtYWtlIHRoaXMgZmVhdHVyZSB3b3JraW5nLlxuICogQXBwaXVtIFNldHRpbmdzIGhlbHBlciBrZWVwcyBhbGwgdGhlIGFjdGl2ZSBub3RpZmljYXRpb25zIHBsdXNcbiAqIG5vdGlmaWNhdGlvbnMgdGhhdCBhcHBlYXJlZCB3aGlsZSBpdCB3YXMgcnVubmluZyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyLFxuICogYnV0IG5vIG1vcmUgdGhhbiAxMDAgaXRlbXMgYWx0b2dldGhlci4gTmV3bHkgYXBwZWFyZWQgbm90aWZpY2F0aW9uc1xuICogYXJlIGFsd2F5cyBhZGRlZCB0byB0aGUgaGVhZCBvZiB0aGUgbm90aWZpY2F0aW9ucyBhcnJheS5cbiAqIFRoZSBgaXNSZW1vdmVkYCBmbGFnIGlzIHNldCB0byBgdHJ1ZWAgZm9yIG5vdGlmaWNhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvc2VydmljZS9ub3RpZmljYXRpb24vU3RhdHVzQmFyTm90aWZpY2F0aW9uXG4gKiBhbmQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5odG1sXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhdmFpbGFibGUgbm90aWZpY2F0aW9uIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZXhhbXBsZSBvdXRwdXQgaXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwic3RhdHVzQmFyTm90aWZpY2F0aW9uc1wiOltcbiAqICAgICB7XG4gKiAgICAgICBcImlzR3JvdXBcIjpmYWxzZSxcbiAqICAgICAgIFwicGFja2FnZU5hbWVcIjpcImlvLmFwcGl1bS5zZXR0aW5nc1wiLFxuICogICAgICAgXCJpc0NsZWFyYWJsZVwiOmZhbHNlLFxuICogICAgICAgXCJpc09uZ29pbmdcIjp0cnVlLFxuICogICAgICAgXCJpZFwiOjEsXG4gKiAgICAgICBcInRhZ1wiOm51bGwsXG4gKiAgICAgICBcIm5vdGlmaWNhdGlvblwiOntcbiAqICAgICAgICAgXCJ0aXRsZVwiOm51bGwsXG4gKiAgICAgICAgIFwiYmlnVGl0bGVcIjpcIkFwcGl1bSBTZXR0aW5nc1wiLFxuICogICAgICAgICBcInRleHRcIjpudWxsLFxuICogICAgICAgICBcImJpZ1RleHRcIjpcIktlZXAgdGhpcyBzZXJ2aWNlIHJ1bm5pbmcsIHNvIEFwcGl1bSBmb3IgQW5kcm9pZCBjYW4gcHJvcGVybHkgaW50ZXJhY3Qgd2l0aCBzZXZlcmFsIHN5c3RlbSBBUElzXCIsXG4gKiAgICAgICAgIFwidGlja2VyVGV4dFwiOm51bGwsXG4gKiAgICAgICAgIFwic3ViVGV4dFwiOm51bGwsXG4gKiAgICAgICAgIFwiaW5mb1RleHRcIjpudWxsLFxuICogICAgICAgICBcInRlbXBsYXRlXCI6XCJhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24kQmlnVGV4dFN0eWxlXCJcbiAqICAgICAgIH0sXG4gKiAgICAgICBcInVzZXJIYW5kbGVcIjowLFxuICogICAgICAgXCJncm91cEtleVwiOlwiMHxpby5hcHBpdW0uc2V0dGluZ3N8MXxudWxsfDEwMTMzXCIsXG4gKiAgICAgICBcIm92ZXJyaWRlR3JvdXBLZXlcIjpudWxsLFxuICogICAgICAgXCJwb3N0VGltZVwiOjE1NzY4NTM1MTg4NTAsXG4gKiAgICAgICBcImtleVwiOlwiMHxpby5hcHBpdW0uc2V0dGluZ3N8MXxudWxsfDEwMTMzXCIsXG4gKiAgICAgICBcImlzUmVtb3ZlZFwiOmZhbHNlXG4gKiAgICAgfVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgbm90aWZpY2F0aW9ucyBsaXN0XG4gKi9cbmNvbW1hbmRzLmdldE5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25zICgpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIG5vdGlmaWNhdGlvbnMnKTtcbiAgLy8gU29tZWhvdyBwcm92aWRpbmcgdGhlIGAtbmAgYXJnIHRvIHRoZSBgYW1gIHVuZGVybmVhdGhcbiAgLy8gcmVuZGVycyB0aGUgYnJvYWRjYXN0IHRvIGZhaWwgaW5zdGVhZCBvZiBzdGFydGluZyB0aGVcbiAgLy8gQXBwaXVtIFNldHRpbmdzIGFwcC4gVGhpcyBvbmx5IGhhcHBlbnMgdG8gdGhlIG5vdGlmaWNhdGlvbnNcbiAgLy8gcmVjZWl2ZXJcbiAgYXdhaXQgdGhpcy5yZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwKCk7XG4gIGxldCBvdXRwdXQ7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAgICctYScsIE5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTixcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGUgQXBwaXVtIFNldHRpbmdzIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBhbmQgaXMgdXAgdG8gZGF0ZS4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlSnNvbkRhdGEob3V0cHV0LCAnbm90aWZpY2F0aW9ucycpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTbXNMaXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heCBbMTAwXSAtIFRoZSBtYXhpbXVtIGNvdW50IG9mIHJlY2VudCBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiB0aGUgbW9zdCByZWNlbnQgU01TXG4gKiBwcm9wZXJ0aWVzIGxpc3QgdmlhIEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIuXG4gKiBNZXNzYWdlcyBhcmUgc29ydGVkIGJ5IGRhdGUgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZXhhbXBsZSBvdXRwdXQgaXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiaXRlbXNcIjpbXG4gKiAgICAge1xuICogICAgICAgXCJpZFwiOlwiMlwiLFxuICogICAgICAgXCJhZGRyZXNzXCI6XCIrMTIzNDU2Nzg5XCIsXG4gKiAgICAgICBcInBlcnNvblwiOm51bGwsXG4gKiAgICAgICBcImRhdGVcIjpcIjE1ODE5MzY0MjIyMDNcIixcbiAqICAgICAgIFwicmVhZFwiOlwiMFwiLFxuICogICAgICAgXCJzdGF0dXNcIjpcIi0xXCIsXG4gKiAgICAgICBcInR5cGVcIjpcIjFcIixcbiAqICAgICAgIFwic3ViamVjdFwiOm51bGwsXG4gKiAgICAgICBcImJvZHlcIjpcIlxcXCJ0ZXh0IG1lc3NhZ2UyXFxcIlwiLFxuICogICAgICAgXCJzZXJ2aWNlQ2VudGVyXCI6bnVsbFxuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgXCJpZFwiOlwiMVwiLFxuICogICAgICAgXCJhZGRyZXNzXCI6XCIrMTIzNDU2Nzg5XCIsXG4gKiAgICAgICBcInBlcnNvblwiOm51bGwsXG4gKiAgICAgICBcImRhdGVcIjpcIjE1ODE5MzYzODI3NDBcIixcbiAqICAgICAgIFwicmVhZFwiOlwiMFwiLFxuICogICAgICAgXCJzdGF0dXNcIjpcIi0xXCIsXG4gKiAgICAgICBcInR5cGVcIjpcIjFcIixcbiAqICAgICAgIFwic3ViamVjdFwiOm51bGwsXG4gKiAgICAgICBcImJvZHlcIjpcIlxcXCJ0ZXh0IG1lc3NhZ2VcXFwiXCIsXG4gKiAgICAgICBcInNlcnZpY2VDZW50ZXJcIjpudWxsXG4gKiAgICAgfVxuICogICBdLFxuICogICBcInRvdGFsXCI6MlxuICogfVxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIFNNUyBsaXN0XG4gKi9cbmNvbW1hbmRzLmdldFNtc0xpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTbXNMaXN0IChvcHRzID0ge30pIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIHRoZSByZWNlbnQgU01TIG1lc3NhZ2VzJyk7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1uJywgU01TX0xJU1RfUkVDRUlWRVIsXG4gICAgJy1hJywgU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTixcbiAgXTtcbiAgaWYgKG9wdHMubWF4KSB7XG4gICAgYXJncy5wdXNoKCctLWVzJywgJ21heCcsIG9wdHMubWF4KTtcbiAgfVxuICBsZXQgb3V0cHV0O1xuICB0cnkge1xuICAgIG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJldHJpZXZlIFNNUyBsaXN0IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZSBBcHBpdW0gU2V0dGluZ3MgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIGFuZCBpcyB1cCB0byBkYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VKc29uRGF0YShvdXRwdXQsICdTTVMgbGlzdCcpO1xufTtcblxuLyoqXG4gKiBUeXBlcyB0aGUgZ2l2ZW4gVW5pY29kZSBzdHJpbmcuXG4gKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBmb2N1cyBpcyBhbHJlYWR5IHB1dFxuICogdG8gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHN0cmluZyB0byB0eXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnB1dCB0ZXh0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGFkYlxuICovXG5jb21tYW5kcy50eXBlVW5pY29kZSA9IGFzeW5jIGZ1bmN0aW9uIHR5cGVVbmljb2RlICh0ZXh0KSB7XG4gIGlmIChfLmlzTmlsKHRleHQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGV4dCA9IGAke3RleHR9YDtcbiAgbG9nLmRlYnVnKGBUeXBpbmcgJHt1dGlsLnBsdXJhbGl6ZSgnY2hhcmFjdGVyJywgdGV4dC5sZW5ndGgsIHRydWUpfWApO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXdhaXQgdGhpcy5ydW5JbkltZUNvbnRleHQoXG4gICAgVU5JQ09ERV9JTUUsIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaW5wdXRUZXh0KGltYXAuZW5jb2RlKHRleHQpKVxuICApO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgcmVjdXJzaXZlIG1lZGlhIHNjYW4gYXQgdGhlIGdpdmVuIGRlc3RpbmF0aW9uLlxuICogQWxsIHN1Y2Nlc3NmdWxseSBzY2FubmVkIGl0ZW1zIGFyZSBiZWluZyBhZGRlZCB0byB0aGUgZGV2aWNlJ3NcbiAqIG1lZGlhIGxpYnJhcnkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uIEZpbGUvZm9sZGVyIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIHVuZXhwZWN0ZWQgZXJyb3IgYnkgc2Nhbm5pbmcuXG4gKi9cbmNvbW1hbmRzLnNjYW5NZWRpYSA9IGFzeW5jIGZ1bmN0aW9uIHNjYW5NZWRpYSAoZGVzdGluYXRpb24pIHtcbiAgbG9nLmRlYnVnKGBTY2FubmluZyAnJHtkZXN0aW5hdGlvbn0nIGZvciBtZWRpYSBmaWxlc2ApO1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLW4nLCBNRURJQV9TQ0FOX1JFQ0VJVkVSLFxuICAgICctYScsIE1FRElBX1NDQU5fQUNUSU9OLFxuICAgICctLWVzJywgJ3BhdGgnLCBkZXN0aW5hdGlvblxuICBdKTtcbiAgaWYgKCFfLmluY2x1ZGVzKG91dHB1dCwgJ3Jlc3VsdD0tMScpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBtZWRpYSBjb3VsZCBiZSBzY2FubmVkIGF0ICcke2Rlc3RpbmF0aW9ufScuIGAgK1xuICAgICAgYENoZWNrIHRoZSBkZXZpY2UgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzLmApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsb0JBQW9CO0FBQy9DLE1BQU1DLDZCQUE2QixHQUFHLFdBQVc7QUFDakQsTUFBTUMsZ0NBQWdDLEdBQUksR0FBRUYsa0JBQW1CLDJDQUEwQztBQUN6RyxNQUFNRyw4QkFBOEIsR0FBSSxHQUFFSCxrQkFBbUIsT0FBTTtBQUNuRSxNQUFNSSxnQ0FBZ0MsR0FBSSxHQUFFSixrQkFBbUIsMkNBQTBDO0FBQ3pHLE1BQU1LLDhCQUE4QixHQUFJLEdBQUVMLGtCQUFtQixrQkFBaUI7QUFDOUUsTUFBTU0sMEJBQTBCLEdBQUksR0FBRU4sa0JBQW1CLHNDQUFxQztBQUM5RixNQUFNTyx3QkFBd0IsR0FBSSxHQUFFUCxrQkFBbUIsWUFBVztBQUNsRSxNQUFNUSx1QkFBdUIsR0FBSSxHQUFFUixrQkFBbUIsbUNBQWtDO0FBQ3hGLE1BQU1TLHFCQUFxQixHQUFJLEdBQUVULGtCQUFtQixTQUFRO0FBQzVELE1BQU1VLGdCQUFnQixHQUFJLEdBQUVWLGtCQUFtQixtQkFBa0I7QUFDakUsTUFBTVcsaUJBQWlCLEdBQUks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
@@ -1 +1 @@
1
- {"version":3,"file":"settings-client-commands.js","names":["SETTINGS_HELPER_ID","SETTINGS_HELPER_MAIN_ACTIVITY","WIFI_CONNECTION_SETTING_RECEIVER","WIFI_CONNECTION_SETTING_ACTION","DATA_CONNECTION_SETTING_RECEIVER","DATA_CONNECTION_SETTING_ACTION","ANIMATION_SETTING_RECEIVER","ANIMATION_SETTING_ACTION","LOCALE_SETTING_RECEIVER","LOCALE_SETTING_ACTION","LOCATION_SERVICE","LOCATION_RECEIVER","LOCATION_RETRIEVAL_ACTION","CLIPBOARD_RECEIVER","CLIPBOARD_RETRIEVAL_ACTION","NOTIFICATIONS_RETRIEVAL_ACTION","SMS_LIST_RECEIVER","SMS_LIST_RETRIEVAL_ACTION","MEDIA_SCAN_RECEIVER","MEDIA_SCAN_ACTION","APPIUM_IME","UNICODE_IME","DEFAULT_SATELLITES_COUNT","DEFAULT_ALTITUDE","LOCATION_TRACKER_TAG","GPS_CACHE_REFRESHED_LOGS","GPS_COORDINATES_PATTERN","commands","requireRunningSettingsApp","opts","processExists","log","debug","timeout","startApp","pkg","activity","action","category","stopApp","waitForLaunch","waitForCondition","waitMs","intervalMs","err","Error","setWifiState","on","isEmulator","shell","privileged","getApiLevel","setDataState","setAnimationState","setDeviceSysLocaleViaSettingApp","language","country","script","params","toLowerCase","toUpperCase","push","setGeoLocation","location","formatLocationValue","valueName","isRequired","util","hasValue","floatValue","parseFloat","isNaN","_","ceil","longitude","latitude","altitude","speed","args","isNil","satellites","parseInt","Number","length","resetTelnetAuthToken","adbExec","map","arg","replace","getGeoLocation","output","stderr","stdout","message","match","exec","JSON","stringify","refreshGeoLocationCache","timeoutMs","logcatMonitor","monitoringPromise","cmd","adb","defaultArgs","SubProcess","path","timeoutErrorMsg","B","resolve","reject","setTimeout","evt","lines","some","line","x","includes","start","timer","timing","Timer","info","getDuration","asMilliSeconds","toFixed","isRunning","stop","performEditorAction","runInImeContext","getClipboard","retrieveClipboard","trim","getNotifications","parseJsonData","getSmsList","max","typeUnicode","text","pluralize","inputText","imap","encode","scanMedia","destination"],"sources":["../../../lib/tools/settings-client-commands.js"],"sourcesContent":["import log from '../logger.js';\nimport { parseJsonData } from '../helpers.js';\nimport _ from 'lodash';\nimport { util, timing } from '@appium/support';\nimport { waitForCondition } from 'asyncbox';\nimport { imap } from 'utf7';\nimport { SubProcess } from 'teen_process';\nimport B from 'bluebird';\n\nconst SETTINGS_HELPER_ID = 'io.appium.settings';\nconst SETTINGS_HELPER_MAIN_ACTIVITY = '.Settings';\nconst WIFI_CONNECTION_SETTING_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.WiFiConnectionSettingReceiver`;\nconst WIFI_CONNECTION_SETTING_ACTION = `${SETTINGS_HELPER_ID}.wifi`;\nconst DATA_CONNECTION_SETTING_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.DataConnectionSettingReceiver`;\nconst DATA_CONNECTION_SETTING_ACTION = `${SETTINGS_HELPER_ID}.data_connection`;\nconst ANIMATION_SETTING_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.AnimationSettingReceiver`;\nconst ANIMATION_SETTING_ACTION = `${SETTINGS_HELPER_ID}.animation`;\nconst LOCALE_SETTING_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.LocaleSettingReceiver`;\nconst LOCALE_SETTING_ACTION = `${SETTINGS_HELPER_ID}.locale`;\nconst LOCATION_SERVICE = `${SETTINGS_HELPER_ID}/.LocationService`;\nconst LOCATION_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.LocationInfoReceiver`;\nconst LOCATION_RETRIEVAL_ACTION = `${SETTINGS_HELPER_ID}.location`;\nconst CLIPBOARD_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.ClipboardReceiver`;\nconst CLIPBOARD_RETRIEVAL_ACTION = `${SETTINGS_HELPER_ID}.clipboard.get`;\nconst NOTIFICATIONS_RETRIEVAL_ACTION = `${SETTINGS_HELPER_ID}.notifications`;\nconst SMS_LIST_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.SmsReader`;\nconst SMS_LIST_RETRIEVAL_ACTION = `${SETTINGS_HELPER_ID}.sms.read`;\nconst MEDIA_SCAN_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.MediaScannerReceiver`;\nconst MEDIA_SCAN_ACTION = `${SETTINGS_HELPER_ID}.scan_media`;\nconst APPIUM_IME = `${SETTINGS_HELPER_ID}/.AppiumIME`;\nconst UNICODE_IME = `${SETTINGS_HELPER_ID}/.UnicodeIME`;\nconst DEFAULT_SATELLITES_COUNT = 12;\nconst DEFAULT_ALTITUDE = 0.0;\nconst LOCATION_TRACKER_TAG = 'LocationTracker';\nconst GPS_CACHE_REFRESHED_LOGS = [\n 'The current location has been successfully retrieved from Play Services',\n 'The current location has been successfully retrieved from Location Manager'\n];\n\nconst GPS_COORDINATES_PATTERN = /data=\"(-?[\\d.]+)\\s+(-?[\\d.]+)\\s+(-?[\\d.]+)\"/;\n\nconst commands = {};\n\n/**\n * @typedef {Object} SettingsAppStartupOptions\n * @property {number} timeout [5000] The maximum number of milliseconds\n * to wait until the app has started\n */\n\n/**\n * Ensures that Appium Settings helper application is running\n * and starts it if necessary\n *\n * @param {SettingsAppStartupOptions} opts\n * @throws {Error} If Appium Settings has failed to start\n * @returns {ADB} self instance for chaining\n */\ncommands.requireRunningSettingsApp = async function requireRunningSettingsApp (opts = {}) {\n if (await this.processExists(SETTINGS_HELPER_ID)) {\n return this;\n }\n\n log.debug('Starting Appium Settings app');\n const {\n timeout = 5000,\n } = opts;\n await this.startApp({\n pkg: SETTINGS_HELPER_ID,\n activity: SETTINGS_HELPER_MAIN_ACTIVITY,\n action: 'android.intent.action.MAIN',\n category: 'android.intent.category.LAUNCHER',\n stopApp: false,\n waitForLaunch: false,\n });\n try {\n await waitForCondition(async () => await this.processExists(SETTINGS_HELPER_ID), {\n waitMs: timeout,\n intervalMs: 300,\n });\n return this;\n } catch (err) {\n throw new Error(`Appium Settings app is not running after ${timeout}ms`);\n }\n};\n\n/**\n * Change the state of WiFi on the device under test.\n *\n * @param {boolean} on - True to enable and false to disable it.\n * @param {boolean} isEmulator [false] - Set it to true if the device under test\n * is an emulator rather than a real device.\n */\ncommands.setWifiState = async function setWifiState (on, isEmulator = false) {\n if (isEmulator) {\n // The svc command does not require to be root since API 26\n await this.shell(['svc', 'wifi', on ? 'enable' : 'disable'], {\n privileged: await this.getApiLevel() < 26,\n });\n } else {\n await this.shell([\n 'am', 'broadcast',\n '-a', WIFI_CONNECTION_SETTING_ACTION,\n '-n', WIFI_CONNECTION_SETTING_RECEIVER,\n '--es', 'setstatus', on ? 'enable' : 'disable'\n ]);\n }\n};\n\n/**\n * Change the state of Data transfer on the device under test.\n *\n * @param {boolean} on - True to enable and false to disable it.\n * @param {boolean} isEmulator [false] - Set it to true if the device under test\n * is an emulator rather than a real device.\n */\ncommands.setDataState = async function setDataState (on, isEmulator = false) {\n if (isEmulator) {\n // The svc command does not require to be root since API 26\n await this.shell(['svc', 'data', on ? 'enable' : 'disable'], {\n privileged: await this.getApiLevel() < 26,\n });\n } else {\n await this.shell([\n 'am', 'broadcast',\n '-a', DATA_CONNECTION_SETTING_ACTION,\n '-n', DATA_CONNECTION_SETTING_RECEIVER,\n '--es', 'setstatus', on ? 'enable' : 'disable'\n ]);\n }\n};\n\n/**\n * Change the state of animation on the device under test.\n * Animation on the device is controlled by the following global properties:\n * [ANIMATOR_DURATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#ANIMATOR_DURATION_SCALE},\n * [TRANSITION_ANIMATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#TRANSITION_ANIMATION_SCALE},\n * [WINDOW_ANIMATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#WINDOW_ANIMATION_SCALE}.\n * This method sets all this properties to 0.0 to disable (1.0 to enable) animation.\n *\n * Turning off animation might be useful to improve stability\n * and reduce tests execution time.\n *\n * @param {boolean} on - True to enable and false to disable it.\n */\ncommands.setAnimationState = async function setAnimationState (on) {\n await this.shell([\n 'am', 'broadcast',\n '-a', ANIMATION_SETTING_ACTION,\n '-n', ANIMATION_SETTING_RECEIVER,\n '--es', 'setstatus', on ? 'enable' : 'disable'\n ]);\n};\n\n/**\n * Change the locale on the device under test. Don't need to reboot the device after changing the locale.\n * This method sets an arbitrary locale following:\n * https://developer.android.com/reference/java/util/Locale.html\n * https://developer.android.com/reference/java/util/Locale.html#Locale(java.lang.String,%20java.lang.String)\n *\n * @param {string} language - Language. e.g. en, ja\n * @param {string} country - Country. e.g. US, JP\n * @param {?string} script - Script. e.g. Hans in `zh-Hans-CN`\n */\ncommands.setDeviceSysLocaleViaSettingApp = async function setDeviceSysLocaleViaSettingApp (language, country, script = null) {\n const params = [\n 'am', 'broadcast',\n '-a', LOCALE_SETTING_ACTION,\n '-n', LOCALE_SETTING_RECEIVER,\n '--es', 'lang', language.toLowerCase(),\n '--es', 'country', country.toUpperCase()\n ];\n\n if (script) {\n params.push('--es', 'script', script);\n }\n\n await this.shell(params);\n};\n\n\n/**\n * @typedef {Object} Location\n * @property {number|string} longitude - Valid longitude value.\n * @property {number|string} latitude - Valid latitude value.\n * @property {?number|string} altitude - Valid altitude value.\n * @property {?number|string} satellites [12] - Number of satellites being tracked (1-12).\n * This value is ignored on real devices.\n * @property {?number|string} speed - Valid speed value.\n * Should be greater than 0.0 meters/second for real devices or 0.0 knots\n * for emulators.\n */\n\n/**\n * Emulate geolocation coordinates on the device under test.\n *\n * @param {Location} location - Location object. The `altitude` value is ignored\n * while mocking the position.\n * @param {boolean} isEmulator [false] - Set it to true if the device under test\n * is an emulator rather than a real device.\n */\ncommands.setGeoLocation = async function setGeoLocation (location, isEmulator = false) {\n const formatLocationValue = (valueName, isRequired = true) => {\n if (!util.hasValue(location[valueName])) {\n if (isRequired) {\n throw new Error(`${valueName} must be provided`);\n }\n return null;\n }\n const floatValue = parseFloat(location[valueName]);\n if (!isNaN(floatValue)) {\n return `${_.ceil(floatValue, 5)}`;\n }\n if (isRequired) {\n throw new Error(`${valueName} is expected to be a valid float number. ` +\n `'${location[valueName]}' is given instead`);\n }\n return null;\n };\n const longitude = formatLocationValue('longitude');\n const latitude = formatLocationValue('latitude');\n const altitude = formatLocationValue('altitude', false);\n const speed = formatLocationValue('speed', false);\n if (isEmulator) {\n const args = [longitude, latitude];\n if (!_.isNil(altitude)) {\n args.push(altitude);\n }\n const satellites = parseInt(location.satellites, 10);\n if (!Number.isNaN(satellites) && satellites > 0 && satellites <= 12) {\n if (args.length < 3) {\n args.push(`${DEFAULT_ALTITUDE}`);\n }\n args.push(`${satellites}`);\n }\n if (!_.isNil(speed)) {\n if (args.length < 3) {\n args.push(`${DEFAULT_ALTITUDE}`);\n }\n if (args.length < 4) {\n args.push(`${DEFAULT_SATELLITES_COUNT}`);\n }\n args.push(speed);\n }\n await this.resetTelnetAuthToken();\n await this.adbExec(['emu', 'geo', 'fix', ...args]);\n // A workaround for https://code.google.com/p/android/issues/detail?id=206180\n await this.adbExec(['emu', 'geo', 'fix', ...(args.map((arg) => arg.replace('.', ',')))]);\n } else {\n const args = [\n 'am', (await this.getApiLevel() >= 26) ? 'start-foreground-service' : 'startservice',\n '-e', 'longitude', longitude,\n '-e', 'latitude', latitude,\n ];\n if (util.hasValue(altitude)) {\n args.push('-e', 'altitude', altitude);\n }\n if (util.hasValue(speed)) {\n args.push('-e', 'speed', speed);\n }\n args.push(LOCATION_SERVICE);\n await this.shell(args);\n }\n};\n\n/**\n * Get the current cached GPS location from the device under test.\n *\n * @returns {Location} The current location\n * @throws {Error} If the current location cannot be retrieved\n */\ncommands.getGeoLocation = async function getGeoLocation () {\n let output;\n try {\n output = await this.shell([\n 'am', 'broadcast',\n '-n', LOCATION_RECEIVER,\n '-a', LOCATION_RETRIEVAL_ACTION,\n ]);\n } catch (err) {\n throw new Error(`Cannot retrieve the current geo coordinates from the device. ` +\n `Make sure the Appium Settings application is up to date and has location permissions. Also the location ` +\n `services must be enabled on the device. Original error: ${err.stderr || err.stdout || err.message}`);\n }\n\n const match = GPS_COORDINATES_PATTERN.exec(output);\n if (!match) {\n throw new Error(`Cannot parse the actual location values from the command output: ${output}`);\n }\n const location = {\n latitude: match[1],\n longitude: match[2],\n altitude: match[3],\n };\n log.debug(`Got geo coordinates: ${JSON.stringify(location)}`);\n return location;\n};\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n *\n * @throws {Error} If the GPS cache cannot be refreshed.\n */\ncommands.refreshGeoLocationCache = async function refreshGeoLocationCache (timeoutMs = 20000) {\n let logcatMonitor;\n let monitoringPromise;\n\n if (timeoutMs > 0) {\n const cmd = [\n ...this.adb.defaultArgs,\n 'logcat', '-s', LOCATION_TRACKER_TAG,\n ];\n logcatMonitor = new SubProcess(this.adb.path, cmd);\n const timeoutErrorMsg = `The GPS cache has not been refreshed within ${timeoutMs}ms timeout. ` +\n `Please make sure the device under test has Appium Settings app installed and running. ` +\n `Also, it is required that the device has Google Play Services installed or is running ` +\n `Android 10+ otherwise.`;\n monitoringPromise = new B((resolve, reject) => {\n setTimeout(() => reject(new Error(timeoutErrorMsg)), timeoutMs);\n\n logcatMonitor.on('exit', () => reject(new Error(timeoutErrorMsg)));\n ['lines-stderr', 'lines-stdout'].map((evt) => logcatMonitor.on(evt, (lines) => {\n if (lines.some((line) => GPS_CACHE_REFRESHED_LOGS.some((x) => line.includes(x)))) {\n resolve();\n }\n }));\n });\n await logcatMonitor.start(0);\n }\n\n try {\n await this.shell([\n 'am', 'broadcast',\n '-n', LOCATION_RECEIVER,\n '-a', LOCATION_RETRIEVAL_ACTION,\n '--ez', 'forceUpdate', 'true',\n ]);\n } catch (err) {\n throw new Error(`Cannot refresh the GPS cache on the device. ` +\n `Make sure the Appium Settings application is up to date and has location permissions. Also the location ` +\n `services must be enabled on the device. Original error: ${err.stderr || err.stdout || err.message}`);\n }\n\n if (logcatMonitor && monitoringPromise) {\n const timer = new timing.Timer().start();\n log.debug(`Waiting up to ${timeoutMs}ms for the GPS cache to be refreshed`);\n try {\n await monitoringPromise;\n log.info(`The GPS cache has been successfully refreshed after ` +\n `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n } finally {\n if (logcatMonitor.isRunning) {\n await logcatMonitor.stop();\n }\n }\n } else {\n log.info('The request to refresh the GPS cache has been sent. Skipping waiting for its result.');\n }\n};\n\n/**\n * Performs the given editor action on the focused input field.\n * This method requires Appium Settings helper to be installed on the device.\n * No exception is thrown if there was a failure while performing the action.\n * You must investigate the logcat output if something did not work as expected.\n *\n * @param {string|number} action - Either action code or name. The following action\n * names are supported: `normal, unspecified, none,\n * go, search, send, next, done, previous`\n */\ncommands.performEditorAction = async function performEditorAction (action) {\n log.debug(`Performing editor action: ${action}`);\n await this.runInImeContext(APPIUM_IME,\n async () => await this.shell(['input', 'text', `/${action}/`]));\n};\n\n/**\n * Retrieves the text content of the device's clipboard.\n * The method works for Android below and above 29.\n * It temorarily enforces the IME setting in order to workaround\n * security limitations if needed.\n * This method only works if Appium Settings v. 2.15+ is installed\n * on the device under test\n *\n * @returns {string} The actual content of the main clipboard as\n * base64-encoded string or an empty string if the clipboard is empty\n * @throws {Error} If there was a problem while getting the\n * clipboard contant\n */\ncommands.getClipboard = async function getClipboard () {\n log.debug('Getting the clipboard content');\n const retrieveClipboard = async () => await this.shell([\n 'am', 'broadcast',\n '-n', CLIPBOARD_RECEIVER,\n '-a', CLIPBOARD_RETRIEVAL_ACTION,\n ]);\n let output;\n try {\n output = (await this.getApiLevel() >= 29)\n ? (await this.runInImeContext(APPIUM_IME, retrieveClipboard))\n : (await retrieveClipboard());\n } catch (err) {\n throw new Error(`Cannot retrieve the current clipboard content from the device. ` +\n `Make sure the Appium Settings application is up to date. ` +\n `Original error: ${err.message}`);\n }\n\n const match = /data=\"([^\"]*)\"/.exec(output);\n if (!match) {\n throw new Error(`Cannot parse the actual cliboard content from the command output: ${output}`);\n }\n return _.trim(match[1]);\n};\n\n/**\n * Retrieves Android notifications via Appium Settings helper.\n * Appium Settings app itself must be *manually* granted to access notifications\n * under device Settings in order to make this feature working.\n * Appium Settings helper keeps all the active notifications plus\n * notifications that appeared while it was running in the internal buffer,\n * but no more than 100 items altogether. Newly appeared notifications\n * are always added to the head of the notifications array.\n * The `isRemoved` flag is set to `true` for notifications that have been removed.\n *\n * See https://developer.android.com/reference/android/service/notification/StatusBarNotification\n * and https://developer.android.com/reference/android/app/Notification.html\n * for more information on available notification properties and their values.\n *\n * @returns {Object} The example output is:\n * ```json\n * {\n * \"statusBarNotifications\":[\n * {\n * \"isGroup\":false,\n * \"packageName\":\"io.appium.settings\",\n * \"isClearable\":false,\n * \"isOngoing\":true,\n * \"id\":1,\n * \"tag\":null,\n * \"notification\":{\n * \"title\":null,\n * \"bigTitle\":\"Appium Settings\",\n * \"text\":null,\n * \"bigText\":\"Keep this service running, so Appium for Android can properly interact with several system APIs\",\n * \"tickerText\":null,\n * \"subText\":null,\n * \"infoText\":null,\n * \"template\":\"android.app.Notification$BigTextStyle\"\n * },\n * \"userHandle\":0,\n * \"groupKey\":\"0|io.appium.settings|1|null|10133\",\n * \"overrideGroupKey\":null,\n * \"postTime\":1576853518850,\n * \"key\":\"0|io.appium.settings|1|null|10133\",\n * \"isRemoved\":false\n * }\n * ]\n * }\n * ```\n * @throws {Error} If there was an error while getting the notifications list\n */\ncommands.getNotifications = async function getNotifications () {\n log.debug('Retrieving notifications');\n // Somehow providing the `-n` arg to the `am` underneath\n // renders the broadcast to fail instead of starting the\n // Appium Settings app. This only happens to the notifications\n // receiver\n await this.requireRunningSettingsApp();\n let output;\n try {\n output = await this.shell([\n 'am', 'broadcast',\n '-a', NOTIFICATIONS_RETRIEVAL_ACTION,\n ]);\n } catch (err) {\n throw new Error(`Cannot retrieve notifications from the device. ` +\n `Make sure the Appium Settings application is installed and is up to date. ` +\n `Original error: ${err.message}`);\n }\n return parseJsonData(output, 'notifications');\n};\n\n/**\n * @typedef {Object} SmsListOptions\n * @property {number} max [100] - The maximum count of recent messages\n * to retrieve\n */\n\n/**\n * Retrieves the list of the most recent SMS\n * properties list via Appium Settings helper.\n * Messages are sorted by date in descending order.\n *\n * @param {SmsListOptions} opts\n * @returns {Object} The example output is:\n * ```json\n * {\n * \"items\":[\n * {\n * \"id\":\"2\",\n * \"address\":\"+123456789\",\n * \"person\":null,\n * \"date\":\"1581936422203\",\n * \"read\":\"0\",\n * \"status\":\"-1\",\n * \"type\":\"1\",\n * \"subject\":null,\n * \"body\":\"\\\"text message2\\\"\",\n * \"serviceCenter\":null\n * },\n * {\n * \"id\":\"1\",\n * \"address\":\"+123456789\",\n * \"person\":null,\n * \"date\":\"1581936382740\",\n * \"read\":\"0\",\n * \"status\":\"-1\",\n * \"type\":\"1\",\n * \"subject\":null,\n * \"body\":\"\\\"text message\\\"\",\n * \"serviceCenter\":null\n * }\n * ],\n * \"total\":2\n * }\n * ```\n * @throws {Error} If there was an error while getting the SMS list\n */\ncommands.getSmsList = async function getSmsList (opts = {}) {\n log.debug('Retrieving the recent SMS messages');\n const args = [\n 'am', 'broadcast',\n '-n', SMS_LIST_RECEIVER,\n '-a', SMS_LIST_RETRIEVAL_ACTION,\n ];\n if (opts.max) {\n args.push('--es', 'max', opts.max);\n }\n let output;\n try {\n output = await this.shell(args);\n } catch (err) {\n throw new Error(`Cannot retrieve SMS list from the device. ` +\n `Make sure the Appium Settings application is installed and is up to date. ` +\n `Original error: ${err.message}`);\n }\n return parseJsonData(output, 'SMS list');\n};\n\n/**\n * Types the given Unicode string.\n * It is expected that the focus is already put\n * to the destination input field before this method is called.\n *\n * @param {string} text The string to type\n * @returns {boolean} `true` if the input text has been successfully sent to adb\n */\ncommands.typeUnicode = async function typeUnicode (text) {\n if (_.isNil(text)) {\n return false;\n }\n\n text = `${text}`;\n log.debug(`Typing ${util.pluralize('character', text.length, true)}`);\n if (!text) {\n return false;\n }\n await this.runInImeContext(\n UNICODE_IME, async () => await this.inputText(imap.encode(text))\n );\n return true;\n};\n\n/**\n * Performs recursive media scan at the given destination.\n * All successfully scanned items are being added to the device's\n * media library.\n *\n * @param {string} destination File/folder path on the remote device.\n * @throws {Error} If there was an unexpected error by scanning.\n */\ncommands.scanMedia = async function scanMedia (destination) {\n log.debug(`Scanning '${destination}' for media files`);\n const output = await this.shell([\n 'am', 'broadcast',\n '-n', MEDIA_SCAN_RECEIVER,\n '-a', MEDIA_SCAN_ACTION,\n '--es', 'path', destination\n ]);\n if (!_.includes(output, 'result=-1')) {\n throw new Error(`No media could be scanned at '${destination}'. ` +\n `Check the device logcat output for more details.`);\n }\n};\n\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"settings-client-commands.js","names":["SETTINGS_HELPER_ID","SETTINGS_HELPER_MAIN_ACTIVITY","WIFI_CONNECTION_SETTING_RECEIVER","WIFI_CONNECTION_SETTING_ACTION","DATA_CONNECTION_SETTING_RECEIVER","DATA_CONNECTION_SETTING_ACTION","ANIMATION_SETTING_RECEIVER","ANIMATION_SETTING_ACTION","LOCALE_SETTING_RECEIVER","LOCALE_SETTING_ACTION","LOCATION_SERVICE","LOCATION_RECEIVER","LOCATION_RETRIEVAL_ACTION","CLIPBOARD_RECEIVER","CLIPBOARD_RETRIEVAL_ACTION","NOTIFICATIONS_RETRIEVAL_ACTION","SMS_LIST_RECEIVER","SMS_LIST_RETRIEVAL_ACTION","MEDIA_SCAN_RECEIVER","MEDIA_SCAN_ACTION","APPIUM_IME","UNICODE_IME","DEFAULT_SATELLITES_COUNT","DEFAULT_ALTITUDE","LOCATION_TRACKER_TAG","GPS_CACHE_REFRESHED_LOGS","GPS_COORDINATES_PATTERN","commands","requireRunningSettingsApp","opts","processExists","log","debug","timeout","startApp","pkg","activity","action","category","stopApp","waitForLaunch","waitForCondition","waitMs","intervalMs","err","Error","setWifiState","on","isEmulator","shell","privileged","getApiLevel","setDataState","setAnimationState","setDeviceSysLocaleViaSettingApp","language","country","script","params","toLowerCase","toUpperCase","push","setGeoLocation","location","formatLocationValue","valueName","isRequired","util","hasValue","floatValue","parseFloat","isNaN","_","ceil","longitude","latitude","altitude","speed","args","isNil","satellites","parseInt","Number","length","resetTelnetAuthToken","adbExec","map","arg","replace","getGeoLocation","output","stderr","stdout","message","match","exec","JSON","stringify","refreshGeoLocationCache","timeoutMs","logcatMonitor","monitoringPromise","cmd","executable","defaultArgs","SubProcess","path","timeoutErrorMsg","B","resolve","reject","setTimeout","evt","lines","some","line","x","includes","start","timer","timing","Timer","info","getDuration","asMilliSeconds","toFixed","isRunning","stop","performEditorAction","runInImeContext","getClipboard","retrieveClipboard","trim","getNotifications","parseJsonData","getSmsList","max","typeUnicode","text","pluralize","inputText","imap","encode","scanMedia","destination"],"sources":["../../../lib/tools/settings-client-commands.js"],"sourcesContent":["import log from '../logger.js';\nimport { parseJsonData } from '../helpers.js';\nimport _ from 'lodash';\nimport { util, timing } from '@appium/support';\nimport { waitForCondition } from 'asyncbox';\nimport { imap } from 'utf7';\nimport { SubProcess } from 'teen_process';\nimport B from 'bluebird';\n\nconst SETTINGS_HELPER_ID = 'io.appium.settings';\nconst SETTINGS_HELPER_MAIN_ACTIVITY = '.Settings';\nconst WIFI_CONNECTION_SETTING_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.WiFiConnectionSettingReceiver`;\nconst WIFI_CONNECTION_SETTING_ACTION = `${SETTINGS_HELPER_ID}.wifi`;\nconst DATA_CONNECTION_SETTING_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.DataConnectionSettingReceiver`;\nconst DATA_CONNECTION_SETTING_ACTION = `${SETTINGS_HELPER_ID}.data_connection`;\nconst ANIMATION_SETTING_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.AnimationSettingReceiver`;\nconst ANIMATION_SETTING_ACTION = `${SETTINGS_HELPER_ID}.animation`;\nconst LOCALE_SETTING_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.LocaleSettingReceiver`;\nconst LOCALE_SETTING_ACTION = `${SETTINGS_HELPER_ID}.locale`;\nconst LOCATION_SERVICE = `${SETTINGS_HELPER_ID}/.LocationService`;\nconst LOCATION_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.LocationInfoReceiver`;\nconst LOCATION_RETRIEVAL_ACTION = `${SETTINGS_HELPER_ID}.location`;\nconst CLIPBOARD_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.ClipboardReceiver`;\nconst CLIPBOARD_RETRIEVAL_ACTION = `${SETTINGS_HELPER_ID}.clipboard.get`;\nconst NOTIFICATIONS_RETRIEVAL_ACTION = `${SETTINGS_HELPER_ID}.notifications`;\nconst SMS_LIST_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.SmsReader`;\nconst SMS_LIST_RETRIEVAL_ACTION = `${SETTINGS_HELPER_ID}.sms.read`;\nconst MEDIA_SCAN_RECEIVER = `${SETTINGS_HELPER_ID}/.receivers.MediaScannerReceiver`;\nconst MEDIA_SCAN_ACTION = `${SETTINGS_HELPER_ID}.scan_media`;\nconst APPIUM_IME = `${SETTINGS_HELPER_ID}/.AppiumIME`;\nconst UNICODE_IME = `${SETTINGS_HELPER_ID}/.UnicodeIME`;\nconst DEFAULT_SATELLITES_COUNT = 12;\nconst DEFAULT_ALTITUDE = 0.0;\nconst LOCATION_TRACKER_TAG = 'LocationTracker';\nconst GPS_CACHE_REFRESHED_LOGS = [\n 'The current location has been successfully retrieved from Play Services',\n 'The current location has been successfully retrieved from Location Manager'\n];\n\nconst GPS_COORDINATES_PATTERN = /data=\"(-?[\\d.]+)\\s+(-?[\\d.]+)\\s+(-?[\\d.]+)\"/;\n\nconst commands = {};\n\n/**\n * @typedef {Object} SettingsAppStartupOptions\n * @property {number} timeout [5000] The maximum number of milliseconds\n * to wait until the app has started\n */\n\n/**\n * Ensures that Appium Settings helper application is running\n * and starts it if necessary\n *\n * @param {SettingsAppStartupOptions} opts\n * @throws {Error} If Appium Settings has failed to start\n * @returns {ADB} self instance for chaining\n */\ncommands.requireRunningSettingsApp = async function requireRunningSettingsApp (opts = {}) {\n if (await this.processExists(SETTINGS_HELPER_ID)) {\n return this;\n }\n\n log.debug('Starting Appium Settings app');\n const {\n timeout = 5000,\n } = opts;\n await this.startApp({\n pkg: SETTINGS_HELPER_ID,\n activity: SETTINGS_HELPER_MAIN_ACTIVITY,\n action: 'android.intent.action.MAIN',\n category: 'android.intent.category.LAUNCHER',\n stopApp: false,\n waitForLaunch: false,\n });\n try {\n await waitForCondition(async () => await this.processExists(SETTINGS_HELPER_ID), {\n waitMs: timeout,\n intervalMs: 300,\n });\n return this;\n } catch (err) {\n throw new Error(`Appium Settings app is not running after ${timeout}ms`);\n }\n};\n\n/**\n * Change the state of WiFi on the device under test.\n *\n * @param {boolean} on - True to enable and false to disable it.\n * @param {boolean} isEmulator [false] - Set it to true if the device under test\n * is an emulator rather than a real device.\n */\ncommands.setWifiState = async function setWifiState (on, isEmulator = false) {\n if (isEmulator) {\n // The svc command does not require to be root since API 26\n await this.shell(['svc', 'wifi', on ? 'enable' : 'disable'], {\n privileged: await this.getApiLevel() < 26,\n });\n } else {\n await this.shell([\n 'am', 'broadcast',\n '-a', WIFI_CONNECTION_SETTING_ACTION,\n '-n', WIFI_CONNECTION_SETTING_RECEIVER,\n '--es', 'setstatus', on ? 'enable' : 'disable'\n ]);\n }\n};\n\n/**\n * Change the state of Data transfer on the device under test.\n *\n * @param {boolean} on - True to enable and false to disable it.\n * @param {boolean} isEmulator [false] - Set it to true if the device under test\n * is an emulator rather than a real device.\n */\ncommands.setDataState = async function setDataState (on, isEmulator = false) {\n if (isEmulator) {\n // The svc command does not require to be root since API 26\n await this.shell(['svc', 'data', on ? 'enable' : 'disable'], {\n privileged: await this.getApiLevel() < 26,\n });\n } else {\n await this.shell([\n 'am', 'broadcast',\n '-a', DATA_CONNECTION_SETTING_ACTION,\n '-n', DATA_CONNECTION_SETTING_RECEIVER,\n '--es', 'setstatus', on ? 'enable' : 'disable'\n ]);\n }\n};\n\n/**\n * Change the state of animation on the device under test.\n * Animation on the device is controlled by the following global properties:\n * [ANIMATOR_DURATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#ANIMATOR_DURATION_SCALE},\n * [TRANSITION_ANIMATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#TRANSITION_ANIMATION_SCALE},\n * [WINDOW_ANIMATION_SCALE]{@link https://developer.android.com/reference/android/provider/Settings.Global.html#WINDOW_ANIMATION_SCALE}.\n * This method sets all this properties to 0.0 to disable (1.0 to enable) animation.\n *\n * Turning off animation might be useful to improve stability\n * and reduce tests execution time.\n *\n * @param {boolean} on - True to enable and false to disable it.\n */\ncommands.setAnimationState = async function setAnimationState (on) {\n await this.shell([\n 'am', 'broadcast',\n '-a', ANIMATION_SETTING_ACTION,\n '-n', ANIMATION_SETTING_RECEIVER,\n '--es', 'setstatus', on ? 'enable' : 'disable'\n ]);\n};\n\n/**\n * Change the locale on the device under test. Don't need to reboot the device after changing the locale.\n * This method sets an arbitrary locale following:\n * https://developer.android.com/reference/java/util/Locale.html\n * https://developer.android.com/reference/java/util/Locale.html#Locale(java.lang.String,%20java.lang.String)\n *\n * @param {string} language - Language. e.g. en, ja\n * @param {string} country - Country. e.g. US, JP\n * @param {?string} script - Script. e.g. Hans in `zh-Hans-CN`\n */\ncommands.setDeviceSysLocaleViaSettingApp = async function setDeviceSysLocaleViaSettingApp (language, country, script = null) {\n const params = [\n 'am', 'broadcast',\n '-a', LOCALE_SETTING_ACTION,\n '-n', LOCALE_SETTING_RECEIVER,\n '--es', 'lang', language.toLowerCase(),\n '--es', 'country', country.toUpperCase()\n ];\n\n if (script) {\n params.push('--es', 'script', script);\n }\n\n await this.shell(params);\n};\n\n\n/**\n * @typedef {Object} Location\n * @property {number|string} longitude - Valid longitude value.\n * @property {number|string} latitude - Valid latitude value.\n * @property {?number|string} altitude - Valid altitude value.\n * @property {?number|string} satellites [12] - Number of satellites being tracked (1-12).\n * This value is ignored on real devices.\n * @property {?number|string} speed - Valid speed value.\n * Should be greater than 0.0 meters/second for real devices or 0.0 knots\n * for emulators.\n */\n\n/**\n * Emulate geolocation coordinates on the device under test.\n *\n * @param {Location} location - Location object. The `altitude` value is ignored\n * while mocking the position.\n * @param {boolean} isEmulator [false] - Set it to true if the device under test\n * is an emulator rather than a real device.\n */\ncommands.setGeoLocation = async function setGeoLocation (location, isEmulator = false) {\n const formatLocationValue = (valueName, isRequired = true) => {\n if (!util.hasValue(location[valueName])) {\n if (isRequired) {\n throw new Error(`${valueName} must be provided`);\n }\n return null;\n }\n const floatValue = parseFloat(location[valueName]);\n if (!isNaN(floatValue)) {\n return `${_.ceil(floatValue, 5)}`;\n }\n if (isRequired) {\n throw new Error(`${valueName} is expected to be a valid float number. ` +\n `'${location[valueName]}' is given instead`);\n }\n return null;\n };\n const longitude = formatLocationValue('longitude');\n const latitude = formatLocationValue('latitude');\n const altitude = formatLocationValue('altitude', false);\n const speed = formatLocationValue('speed', false);\n if (isEmulator) {\n const args = [longitude, latitude];\n if (!_.isNil(altitude)) {\n args.push(altitude);\n }\n const satellites = parseInt(location.satellites, 10);\n if (!Number.isNaN(satellites) && satellites > 0 && satellites <= 12) {\n if (args.length < 3) {\n args.push(`${DEFAULT_ALTITUDE}`);\n }\n args.push(`${satellites}`);\n }\n if (!_.isNil(speed)) {\n if (args.length < 3) {\n args.push(`${DEFAULT_ALTITUDE}`);\n }\n if (args.length < 4) {\n args.push(`${DEFAULT_SATELLITES_COUNT}`);\n }\n args.push(speed);\n }\n await this.resetTelnetAuthToken();\n await this.adbExec(['emu', 'geo', 'fix', ...args]);\n // A workaround for https://code.google.com/p/android/issues/detail?id=206180\n await this.adbExec(['emu', 'geo', 'fix', ...(args.map((arg) => arg.replace('.', ',')))]);\n } else {\n const args = [\n 'am', (await this.getApiLevel() >= 26) ? 'start-foreground-service' : 'startservice',\n '-e', 'longitude', longitude,\n '-e', 'latitude', latitude,\n ];\n if (util.hasValue(altitude)) {\n args.push('-e', 'altitude', altitude);\n }\n if (util.hasValue(speed)) {\n args.push('-e', 'speed', speed);\n }\n args.push(LOCATION_SERVICE);\n await this.shell(args);\n }\n};\n\n/**\n * Get the current cached GPS location from the device under test.\n *\n * @returns {Location} The current location\n * @throws {Error} If the current location cannot be retrieved\n */\ncommands.getGeoLocation = async function getGeoLocation () {\n let output;\n try {\n output = await this.shell([\n 'am', 'broadcast',\n '-n', LOCATION_RECEIVER,\n '-a', LOCATION_RETRIEVAL_ACTION,\n ]);\n } catch (err) {\n throw new Error(`Cannot retrieve the current geo coordinates from the device. ` +\n `Make sure the Appium Settings application is up to date and has location permissions. Also the location ` +\n `services must be enabled on the device. Original error: ${err.stderr || err.stdout || err.message}`);\n }\n\n const match = GPS_COORDINATES_PATTERN.exec(output);\n if (!match) {\n throw new Error(`Cannot parse the actual location values from the command output: ${output}`);\n }\n const location = {\n latitude: match[1],\n longitude: match[2],\n altitude: match[3],\n };\n log.debug(`Got geo coordinates: ${JSON.stringify(location)}`);\n return location;\n};\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n *\n * @throws {Error} If the GPS cache cannot be refreshed.\n */\ncommands.refreshGeoLocationCache = async function refreshGeoLocationCache (timeoutMs = 20000) {\n let logcatMonitor;\n let monitoringPromise;\n\n if (timeoutMs > 0) {\n const cmd = [\n ...this.executable.defaultArgs,\n 'logcat', '-s', LOCATION_TRACKER_TAG,\n ];\n logcatMonitor = new SubProcess(this.executable.path, cmd);\n const timeoutErrorMsg = `The GPS cache has not been refreshed within ${timeoutMs}ms timeout. ` +\n `Please make sure the device under test has Appium Settings app installed and running. ` +\n `Also, it is required that the device has Google Play Services installed or is running ` +\n `Android 10+ otherwise.`;\n monitoringPromise = new B((resolve, reject) => {\n setTimeout(() => reject(new Error(timeoutErrorMsg)), timeoutMs);\n\n logcatMonitor.on('exit', () => reject(new Error(timeoutErrorMsg)));\n ['lines-stderr', 'lines-stdout'].map((evt) => logcatMonitor.on(evt, (lines) => {\n if (lines.some((line) => GPS_CACHE_REFRESHED_LOGS.some((x) => line.includes(x)))) {\n resolve();\n }\n }));\n });\n await logcatMonitor.start(0);\n }\n\n try {\n await this.shell([\n 'am', 'broadcast',\n '-n', LOCATION_RECEIVER,\n '-a', LOCATION_RETRIEVAL_ACTION,\n '--ez', 'forceUpdate', 'true',\n ]);\n } catch (err) {\n throw new Error(`Cannot refresh the GPS cache on the device. ` +\n `Make sure the Appium Settings application is up to date and has location permissions. Also the location ` +\n `services must be enabled on the device. Original error: ${err.stderr || err.stdout || err.message}`);\n }\n\n if (logcatMonitor && monitoringPromise) {\n const timer = new timing.Timer().start();\n log.debug(`Waiting up to ${timeoutMs}ms for the GPS cache to be refreshed`);\n try {\n await monitoringPromise;\n log.info(`The GPS cache has been successfully refreshed after ` +\n `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n } finally {\n if (logcatMonitor.isRunning) {\n await logcatMonitor.stop();\n }\n }\n } else {\n log.info('The request to refresh the GPS cache has been sent. Skipping waiting for its result.');\n }\n};\n\n/**\n * Performs the given editor action on the focused input field.\n * This method requires Appium Settings helper to be installed on the device.\n * No exception is thrown if there was a failure while performing the action.\n * You must investigate the logcat output if something did not work as expected.\n *\n * @param {string|number} action - Either action code or name. The following action\n * names are supported: `normal, unspecified, none,\n * go, search, send, next, done, previous`\n */\ncommands.performEditorAction = async function performEditorAction (action) {\n log.debug(`Performing editor action: ${action}`);\n await this.runInImeContext(APPIUM_IME,\n async () => await this.shell(['input', 'text', `/${action}/`]));\n};\n\n/**\n * Retrieves the text content of the device's clipboard.\n * The method works for Android below and above 29.\n * It temorarily enforces the IME setting in order to workaround\n * security limitations if needed.\n * This method only works if Appium Settings v. 2.15+ is installed\n * on the device under test\n *\n * @returns {string} The actual content of the main clipboard as\n * base64-encoded string or an empty string if the clipboard is empty\n * @throws {Error} If there was a problem while getting the\n * clipboard contant\n */\ncommands.getClipboard = async function getClipboard () {\n log.debug('Getting the clipboard content');\n const retrieveClipboard = async () => await this.shell([\n 'am', 'broadcast',\n '-n', CLIPBOARD_RECEIVER,\n '-a', CLIPBOARD_RETRIEVAL_ACTION,\n ]);\n let output;\n try {\n output = (await this.getApiLevel() >= 29)\n ? (await this.runInImeContext(APPIUM_IME, retrieveClipboard))\n : (await retrieveClipboard());\n } catch (err) {\n throw new Error(`Cannot retrieve the current clipboard content from the device. ` +\n `Make sure the Appium Settings application is up to date. ` +\n `Original error: ${err.message}`);\n }\n\n const match = /data=\"([^\"]*)\"/.exec(output);\n if (!match) {\n throw new Error(`Cannot parse the actual cliboard content from the command output: ${output}`);\n }\n return _.trim(match[1]);\n};\n\n/**\n * Retrieves Android notifications via Appium Settings helper.\n * Appium Settings app itself must be *manually* granted to access notifications\n * under device Settings in order to make this feature working.\n * Appium Settings helper keeps all the active notifications plus\n * notifications that appeared while it was running in the internal buffer,\n * but no more than 100 items altogether. Newly appeared notifications\n * are always added to the head of the notifications array.\n * The `isRemoved` flag is set to `true` for notifications that have been removed.\n *\n * See https://developer.android.com/reference/android/service/notification/StatusBarNotification\n * and https://developer.android.com/reference/android/app/Notification.html\n * for more information on available notification properties and their values.\n *\n * @returns {Object} The example output is:\n * ```json\n * {\n * \"statusBarNotifications\":[\n * {\n * \"isGroup\":false,\n * \"packageName\":\"io.appium.settings\",\n * \"isClearable\":false,\n * \"isOngoing\":true,\n * \"id\":1,\n * \"tag\":null,\n * \"notification\":{\n * \"title\":null,\n * \"bigTitle\":\"Appium Settings\",\n * \"text\":null,\n * \"bigText\":\"Keep this service running, so Appium for Android can properly interact with several system APIs\",\n * \"tickerText\":null,\n * \"subText\":null,\n * \"infoText\":null,\n * \"template\":\"android.app.Notification$BigTextStyle\"\n * },\n * \"userHandle\":0,\n * \"groupKey\":\"0|io.appium.settings|1|null|10133\",\n * \"overrideGroupKey\":null,\n * \"postTime\":1576853518850,\n * \"key\":\"0|io.appium.settings|1|null|10133\",\n * \"isRemoved\":false\n * }\n * ]\n * }\n * ```\n * @throws {Error} If there was an error while getting the notifications list\n */\ncommands.getNotifications = async function getNotifications () {\n log.debug('Retrieving notifications');\n // Somehow providing the `-n` arg to the `am` underneath\n // renders the broadcast to fail instead of starting the\n // Appium Settings app. This only happens to the notifications\n // receiver\n await this.requireRunningSettingsApp();\n let output;\n try {\n output = await this.shell([\n 'am', 'broadcast',\n '-a', NOTIFICATIONS_RETRIEVAL_ACTION,\n ]);\n } catch (err) {\n throw new Error(`Cannot retrieve notifications from the device. ` +\n `Make sure the Appium Settings application is installed and is up to date. ` +\n `Original error: ${err.message}`);\n }\n return parseJsonData(output, 'notifications');\n};\n\n/**\n * @typedef {Object} SmsListOptions\n * @property {number} max [100] - The maximum count of recent messages\n * to retrieve\n */\n\n/**\n * Retrieves the list of the most recent SMS\n * properties list via Appium Settings helper.\n * Messages are sorted by date in descending order.\n *\n * @param {SmsListOptions} opts\n * @returns {Object} The example output is:\n * ```json\n * {\n * \"items\":[\n * {\n * \"id\":\"2\",\n * \"address\":\"+123456789\",\n * \"person\":null,\n * \"date\":\"1581936422203\",\n * \"read\":\"0\",\n * \"status\":\"-1\",\n * \"type\":\"1\",\n * \"subject\":null,\n * \"body\":\"\\\"text message2\\\"\",\n * \"serviceCenter\":null\n * },\n * {\n * \"id\":\"1\",\n * \"address\":\"+123456789\",\n * \"person\":null,\n * \"date\":\"1581936382740\",\n * \"read\":\"0\",\n * \"status\":\"-1\",\n * \"type\":\"1\",\n * \"subject\":null,\n * \"body\":\"\\\"text message\\\"\",\n * \"serviceCenter\":null\n * }\n * ],\n * \"total\":2\n * }\n * ```\n * @throws {Error} If there was an error while getting the SMS list\n */\ncommands.getSmsList = async function getSmsList (opts = {}) {\n log.debug('Retrieving the recent SMS messages');\n const args = [\n 'am', 'broadcast',\n '-n', SMS_LIST_RECEIVER,\n '-a', SMS_LIST_RETRIEVAL_ACTION,\n ];\n if (opts.max) {\n args.push('--es', 'max', opts.max);\n }\n let output;\n try {\n output = await this.shell(args);\n } catch (err) {\n throw new Error(`Cannot retrieve SMS list from the device. ` +\n `Make sure the Appium Settings application is installed and is up to date. ` +\n `Original error: ${err.message}`);\n }\n return parseJsonData(output, 'SMS list');\n};\n\n/**\n * Types the given Unicode string.\n * It is expected that the focus is already put\n * to the destination input field before this method is called.\n *\n * @param {string} text The string to type\n * @returns {boolean} `true` if the input text has been successfully sent to adb\n */\ncommands.typeUnicode = async function typeUnicode (text) {\n if (_.isNil(text)) {\n return false;\n }\n\n text = `${text}`;\n log.debug(`Typing ${util.pluralize('character', text.length, true)}`);\n if (!text) {\n return false;\n }\n await this.runInImeContext(\n UNICODE_IME, async () => await this.inputText(imap.encode(text))\n );\n return true;\n};\n\n/**\n * Performs recursive media scan at the given destination.\n * All successfully scanned items are being added to the device's\n * media library.\n *\n * @param {string} destination File/folder path on the remote device.\n * @throws {Error} If there was an unexpected error by scanning.\n */\ncommands.scanMedia = async function scanMedia (destination) {\n log.debug(`Scanning '${destination}' for media files`);\n const output = await this.shell([\n 'am', 'broadcast',\n '-n', MEDIA_SCAN_RECEIVER,\n '-a', MEDIA_SCAN_ACTION,\n '--es', 'path', destination\n ]);\n if (!_.includes(output, 'result=-1')) {\n throw new Error(`No media could be scanned at '${destination}'. ` +\n `Check the device logcat output for more details.`);\n }\n};\n\nexport default commands;\n"],"mappings":"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"}
@@ -314,10 +314,10 @@ commands.refreshGeoLocationCache = async function refreshGeoLocationCache (timeo
314
314
 
315
315
  if (timeoutMs > 0) {
316
316
  const cmd = [
317
- ...this.adb.defaultArgs,
317
+ ...this.executable.defaultArgs,
318
318
  'logcat', '-s', LOCATION_TRACKER_TAG,
319
319
  ];
320
- logcatMonitor = new SubProcess(this.adb.path, cmd);
320
+ logcatMonitor = new SubProcess(this.executable.path, cmd);
321
321
  const timeoutErrorMsg = `The GPS cache has not been refreshed within ${timeoutMs}ms timeout. ` +
322
322
  `Please make sure the device under test has Appium Settings app installed and running. ` +
323
323
  `Also, it is required that the device has Google Play Services installed or is running ` +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-adb",
3
- "version": "9.10.12",
3
+ "version": "9.10.13",
4
4
  "description": "Android Debug Bridge interface",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {