appium-adb 9.10.1 → 9.10.2

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.
@@ -43,6 +43,7 @@ const BRIDGE_VERSION_PATTERN = /^Android Debug Bridge version ([\d.]+)/m;
43
43
  const CERTS_ROOT = '/system/etc/security/cacerts';
44
44
  const SDK_BINARY_ROOTS = ['platform-tools', 'emulator', ['cmdline-tools', 'latest', 'bin'], 'tools', ['tools', 'bin'], '.'];
45
45
  const MIN_DELAY_ADB_API_LEVEL = 28;
46
+ const REQUIRED_SERVICES = ['activity', 'package', 'mount'];
46
47
 
47
48
  systemCallMethods.getSdkBinaryPath = async function getSdkBinaryPath(binaryName) {
48
49
  return await this.getBinaryFromSdkRoot(binaryName);
@@ -744,7 +745,7 @@ systemCallMethods.getVersion = _lodash.default.memoize(async function getVersion
744
745
  });
745
746
 
746
747
  systemCallMethods.waitForEmulatorReady = async function waitForEmulatorReady(timeoutMs = 20000) {
747
- const requiredServicesRe = [/\bactivity:/, /\bpackage:/];
748
+ const requiredServicesRe = REQUIRED_SERVICES.map(name => new RegExp(`\\b${name}:`));
748
749
  let services;
749
750
 
750
751
  try {
@@ -763,10 +764,12 @@ systemCallMethods.waitForEmulatorReady = async function waitForEmulatorReady(tim
763
764
  });
764
765
  } catch (e) {
765
766
  if (services) {
766
- _logger.default.debug(`Recent services:\n${services}`);
767
+ _logger.default.debug(`Recently listed services:\n${services}`);
767
768
  }
768
769
 
769
- throw new Error(`Emulator is not ready within ${timeoutMs}ms`);
770
+ const missingServices = _lodash.default.zip(REQUIRED_SERVICES, requiredServicesRe).filter(([, pattern]) => !pattern.test(services)).map(([name]) => name);
771
+
772
+ throw new Error(`Emulator is not ready within ${timeoutMs}ms ` + `(${missingServices} service${missingServices.length === 1 ? ' is' : 's are'} not running)`);
770
773
  }
771
774
  };
772
775
 
@@ -1058,4 +1061,4 @@ var _default = systemCallMethods;
1058
1061
  exports.default = _default;require('source-map-support').install();
1059
1062
 
1060
1063
 
1061
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3Rvb2xzL3N5c3RlbS1jYWxscy5qcyIsIm5hbWVzIjpbInN5c3RlbUNhbGxNZXRob2RzIiwiREVGQVVMVF9BREJfUkVCT09UX1JFVFJJRVMiLCJMSU5LRVJfV0FSTklOR19SRUdFWFAiLCJBREJfUkVUUllfRVJST1JfUEFUVEVSTlMiLCJCSU5BUllfVkVSU0lPTl9QQVRURVJOIiwiQlJJREdFX1ZFUlNJT05fUEFUVEVSTiIsIkNFUlRTX1JPT1QiLCJTREtfQklOQVJZX1JPT1RTIiwiTUlOX0RFTEFZX0FEQl9BUElfTEVWRUwiLCJnZXRTZGtCaW5hcnlQYXRoIiwiYmluYXJ5TmFtZSIsImdldEJpbmFyeUZyb21TZGtSb290IiwiZ2V0QmluYXJ5TmFtZUZvck9TIiwiXyIsIm1lbW9pemUiLCJnZXRCaW5hcnlOYW1lRm9yT1NNZW1vcml6ZSIsInN5c3RlbSIsImlzV2luZG93cyIsImluY2x1ZGVzIiwicGF0aCIsImV4dG5hbWUiLCJiaW5hcmllcyIsImZ1bGxCaW5hcnlOYW1lIiwiYmluYXJ5TG9jcyIsImdldFNka0JpbmFyeUxvY2F0aW9uQ2FuZGlkYXRlcyIsInNka1Jvb3QiLCJidWlsZFRvb2xzRGlycyIsImdldEJ1aWxkVG9vbHNEaXJzIiwiYnVpbGRUb29sc1ZlcnNpb24iLCJmaWx0ZXIiLCJ4IiwiYmFzZW5hbWUiLCJpc0VtcHR5IiwibG9nIiwiaW5mbyIsInB1c2giLCJmbGF0dGVuIiwibWFwIiwiZGlyIiwicmVzb2x2ZSIsImJpbmFyeUxvYyIsImxvYyIsImZzIiwiZXhpc3RzIiwiaXNOdWxsIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNBcnJheSIsImdldEFuZHJvaWRCaW5hcnlQYXRoIiwiZ2V0U2RrUm9vdEZyb21FbnYiLCJnZXRCaW5hcnlGcm9tUGF0aCIsIndoaWNoIiwiZSIsImdldENvbm5lY3RlZERldmljZXMiLCJvcHRzIiwiZGVidWciLCJhcmdzIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwidmVyYm9zZSIsInN0ZG91dCIsImV4ZWMiLCJtZXNzYWdlIiwibGlzdEhlYWRlciIsInN0YXJ0aW5nSW5kZXgiLCJpbmRleE9mIiwic2xpY2UiLCJleGNsdWRlZExpbmVzIiwiYWxsb3dPZmZsaW5lRGV2aWNlcyIsImRldmljZXMiLCJzcGxpdCIsInRyaW0iLCJsaW5lIiwic29tZSIsInVkaWQiLCJzdGF0ZSIsImRlc2NyaXB0aW9uIiwiZGV2aWNlIiwiZW50cnkiLCJrZXkiLCJ2YWx1ZSIsImdldERldmljZXNXaXRoUmV0cnkiLCJ0aW1lb3V0TXMiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhcnQiLCJnZXREZXZpY2VzIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJsZW5ndGgiLCJpZ24iLCJyZWNvbm5lY3QiLCJyZXN0YXJ0QWRiIiwic2xlZXAiLCJ0YXJnZXQiLCJhZGJFeGVjIiwic3RkZXJyIiwic3VwcHJlc3NLaWxsU2VydmVyIiwia2lsbFNlcnZlciIsImVycm9yIiwiYWRiUG9ydCIsImV4Y2x1c2l2ZSIsInJlc2V0VGVsbmV0QXV0aFRva2VuIiwiaG9tZUZvbGRlclBhdGgiLCJwcm9jZXNzIiwiZW52IiwicGxhdGZvcm0iLCJ3YXJuIiwiZHN0UGF0aCIsIndyaXRlRmlsZSIsImFkYkV4ZWNFbXUiLCJjbWQiLCJ2ZXJpZnlFbXVsYXRvckNvbm5lY3RlZCIsImlzRXhlY0xvY2tlZCIsIkVYRUNfT1VUUFVUX0ZPUk1BVCIsIk9iamVjdCIsImZyZWV6ZSIsIlNURE9VVCIsIkZVTEwiLCJjbG9uZURlZXAiLCJ0aW1lb3V0IiwiYWRiRXhlY1RpbWVvdXQiLCJERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQiLCJ0aW1lb3V0Q2FwTmFtZSIsIm91dHB1dEZvcm1hdCIsImFkYlJldHJpZWQiLCJleGVjRnVuYyIsImZpbmQiLCJhcmciLCJ0ZXN0IiwidXRpbCIsInF1b3RlIiwiam9pbiIsInJlcGxhY2UiLCJlcnJUZXh0IiwicCIsImNvZGUiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiTnVtYmVyIiwiTUFYX1NBRkVfSU5URUdFUiIsImludGVydmFsTXMiLCJzaGVsbCIsInByaXZpbGVnZWQiLCJjbWRBcnIiLCJmdWxsQ21kIiwiaXNSb290IiwiY3JlYXRlU3ViUHJvY2VzcyIsIlN1YlByb2Nlc3MiLCJnZXRBZGJQYXRoIiwiZ2V0QWRiU2VydmVyUG9ydCIsImdldEVtdWxhdG9yUG9ydCIsImVtdWxhdG9yUG9ydCIsInBvcnQiLCJnZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nIiwiZW1TdHIiLCJwb3J0UGF0dGVybiIsInBhcnNlSW50IiwiZ2V0Q29ubmVjdGVkRW11bGF0b3JzIiwiZW11bGF0b3JzIiwicGx1cmFsaXplIiwic2V0RW11bGF0b3JQb3J0IiwiZW1Qb3J0Iiwic2V0RGV2aWNlSWQiLCJkZXZpY2VJZCIsImN1ckRldmljZUlkIiwiYXJnc0hhc0RldmljZSIsInNwbGljZSIsInNldERldmljZSIsImRldmljZU9iaiIsImdldFJ1bm5pbmdBVkQiLCJhdmROYW1lIiwiZW11bGF0b3IiLCJydW5uaW5nQVZETmFtZSIsImV4ZWNFbXVDb25zb2xlQ29tbWFuZCIsImV4ZWNUaW1lb3V0IiwiY29ublRpbWVvdXQiLCJ0b0xvd2VyIiwiZ2V0UnVubmluZ0FWRFdpdGhSZXRyeSIsImtpbGxBbGxFbXVsYXRvcnMiLCJraWxsRW11bGF0b3IiLCJoYXNWYWx1ZSIsImlzRW11bGF0b3JDb25uZWN0ZWQiLCJsYXVuY2hBVkQiLCJsYW5ndWFnZSIsImNvdW50cnkiLCJsYXVuY2hUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwicmV0cnlUaW1lcyIsImVtdWxhdG9yQmluYXJ5UGF0aCIsInN1YnN0ciIsImNoZWNrQXZkRXhpc3QiLCJsYXVuY2hBcmdzIiwidG9BdmRMb2NhbGVBcmdzIiwiaXNEZWxheUFkYkZlYXR1cmVFbmFibGVkIiwiYWxsb3dEZWxheUFkYiIsInJldmlzaW9uIiwiZ2V0RW11VmVyc2lvbkluZm8iLCJjb21wYXJlVmVyc2lvbnMiLCJnZXRFbXVJbWFnZVByb3BlcnRpZXMiLCJhcGlNYXRjaCIsInNoZWxsUGFyc2UiLCJwcm9jIiwiYXNzaWduIiwib24iLCJCb29sZWFuIiwic2lnbmFsIiwicmV0cnkiLCJ3YWl0Rm9yRW11bGF0b3JSZWFkeSIsImdldFZlcnNpb24iLCJyZXN1bHQiLCJiaW5hcnlWZXJzaW9uTWF0Y2giLCJiaW5hcnkiLCJ2ZXJzaW9uIiwic2VtdmVyIiwiY29lcmNlIiwiYnVpbGQiLCJicmlkZ2VWZXJzaW9uTWF0Y2giLCJicmlkZ2UiLCJyZXF1aXJlZFNlcnZpY2VzUmUiLCJzZXJ2aWNlcyIsImV2ZXJ5IiwicGF0dGVybiIsImVyciIsIndhaXRGb3JEZXZpY2UiLCJhcHBEZXZpY2VSZWFkeVRpbWVvdXQiLCJyZXRyaWVzIiwicGluZyIsInJlYm9vdCIsIndhc0FscmVhZHlSb290ZWQiLCJyb290IiwiQiIsImRlbGF5Iiwic2V0RGV2aWNlUHJvcGVydHkiLCJ1bnJvb3QiLCJyZXRyeUludGVydmFsIiwiZ2V0RGV2aWNlUHJvcGVydHkiLCJtc2ciLCJjaGFuZ2VVc2VyUHJpdmlsZWdlcyIsImlzRWxldmF0ZWQiLCJyZXRyeUlmT2ZmbGluZSIsImNtZEZ1bmMiLCJ0b0xvd2VyQ2FzZSIsImlzU3VjY2Vzc2Z1bCIsImZpbGVFeGlzdHMiLCJyZW1vdGVQYXRoIiwicGFzc0ZsYWciLCJjaGVja0NtZCIsImxzIiwibGluZXMiLCJsIiwiZmlsZVNpemUiLCJmaWxlcyIsIm1hdGNoIiwiaXNOYU4iLCJpbnN0YWxsTWl0bUNlcnRpZmljYXRlIiwiY2VydCIsIm9wZW5Tc2wiLCJnZXRPcGVuU3NsRm9yT3MiLCJpc0J1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJzcmNDZXJ0IiwiY2VydEhhc2giLCJkc3RDZXJ0Q29udGVudCIsImNvbmNhdCIsImRzdENlcnQiLCJyaW1yYWYiLCJpc01pdG1DZXJ0aWZpY2F0ZUluc3RhbGxlZCIsInRtcENlcnQiLCJwb3NpeCJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi90b29scy9zeXN0ZW0tY2FsbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCB1dGlsLCB0ZW1wRGlyLCB0aW1pbmcgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtcbiAgZ2V0QnVpbGRUb29sc0RpcnMsIHRvQXZkTG9jYWxlQXJncyxcbiAgZ2V0T3BlblNzbEZvck9zLCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQsIGdldFNka1Jvb3RGcm9tRW52XG59IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgZXhlYywgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBzbGVlcCwgcmV0cnksIHJldHJ5SW50ZXJ2YWwsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5cbmxldCBzeXN0ZW1DYWxsTWV0aG9kcyA9IHt9O1xuXG5jb25zdCBERUZBVUxUX0FEQl9SRUJPT1RfUkVUUklFUyA9IDkwO1xuY29uc3QgTElOS0VSX1dBUk5JTkdfUkVHRVhQID0gL15XQVJOSU5HOiBsaW5rZXIuKyQvbTtcbmNvbnN0IEFEQl9SRVRSWV9FUlJPUl9QQVRURVJOUyA9IFtcbiAgL3Byb3RvY29sIGZhdWx0IFxcKG5vIHN0YXR1c1xcKS9pLFxuICAvZXJyb3I6IGRldmljZSAoJy4rJyApP25vdCBmb3VuZC9pLFxuICAvZXJyb3I6IGRldmljZSBzdGlsbCBjb25uZWN0aW5nL2ksXG5dO1xuY29uc3QgQklOQVJZX1ZFUlNJT05fUEFUVEVSTiA9IC9eVmVyc2lvbiAoW1xcZC5dKyktKFxcZCspL207XG5jb25zdCBCUklER0VfVkVSU0lPTl9QQVRURVJOID0gL15BbmRyb2lkIERlYnVnIEJyaWRnZSB2ZXJzaW9uIChbXFxkLl0rKS9tO1xuY29uc3QgQ0VSVFNfUk9PVCA9ICcvc3lzdGVtL2V0Yy9zZWN1cml0eS9jYWNlcnRzJztcbmNvbnN0IFNES19CSU5BUllfUk9PVFMgPSBbXG4gICdwbGF0Zm9ybS10b29scycsXG4gICdlbXVsYXRvcicsXG4gIFsnY21kbGluZS10b29scycsICdsYXRlc3QnLCAnYmluJ10sXG4gICd0b29scycsXG4gIFsndG9vbHMnLCAnYmluJ10sXG4gICcuJyAvLyBBbGxvdyBjdXN0b20gc2RrUm9vdCB0byBzcGVjaWZ5IGZ1bGwgZm9sZGVyIHBhdGhcbl07XG5jb25zdCBNSU5fREVMQVlfQURCX0FQSV9MRVZFTCA9IDI4O1xuXG4vKipcbiAqIFJldHJpZXZlIGZ1bGwgcGF0aCB0byB0aGUgZ2l2ZW4gYmluYXJ5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5hcnlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJpbmFyeS5cbiAqIEByZXR1cm4ge3N0cmluZ30gRnVsbCBwYXRoIHRvIHRoZSBnaXZlbiBiaW5hcnkgaW5jbHVkaW5nIGN1cnJlbnQgU0RLIHJvb3QuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldFNka0JpbmFyeVBhdGggPSBhc3luYyBmdW5jdGlvbiBnZXRTZGtCaW5hcnlQYXRoIChiaW5hcnlOYW1lKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEJpbmFyeUZyb21TZGtSb290KGJpbmFyeU5hbWUpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSBmdWxsIGJpbmFyeSBuYW1lIGZvciB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGFzIG1lbW90aXplLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5hcnlOYW1lIC0gc2ltcGxlIGJpbmFyeSBuYW1lLCBmb3IgZXhhbXBsZSAnYW5kcm9pZCcuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBiaW5hcnkgbmFtZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0sXG4gKiAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlLCAnYW5kcm9pZC5iYXQnIG9uIFdpbmRvd3MuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldEJpbmFyeU5hbWVGb3JPUyA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRCaW5hcnlOYW1lRm9yT1NNZW1vcml6ZSAoYmluYXJ5TmFtZSkge1xuICByZXR1cm4gZ2V0QmluYXJ5TmFtZUZvck9TKGJpbmFyeU5hbWUpO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmUgZnVsbCBiaW5hcnkgbmFtZSBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluYXJ5TmFtZSAtIHNpbXBsZSBiaW5hcnkgbmFtZSwgZm9yIGV4YW1wbGUgJ2FuZHJvaWQnLlxuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgYmluYXJ5IG5hbWUgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLFxuICogICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSwgJ2FuZHJvaWQuYmF0JyBvbiBXaW5kb3dzLlxuICovXG5mdW5jdGlvbiBnZXRCaW5hcnlOYW1lRm9yT1MgKGJpbmFyeU5hbWUpIHtcbiAgaWYgKCFzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gYmluYXJ5TmFtZTtcbiAgfVxuXG4gIGlmIChbJ2FuZHJvaWQnLCAnYXBrc2lnbmVyJywgJ2Fwa2FuYWx5emVyJ10uaW5jbHVkZXMoYmluYXJ5TmFtZSkpIHtcbiAgICByZXR1cm4gYCR7YmluYXJ5TmFtZX0uYmF0YDtcbiAgfVxuICBpZiAoIXBhdGguZXh0bmFtZShiaW5hcnlOYW1lKSkge1xuICAgIHJldHVybiBgJHtiaW5hcnlOYW1lfS5leGVgO1xuICB9XG4gIHJldHVybiBiaW5hcnlOYW1lO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIGZ1bGwgcGF0aCB0byB0aGUgZ2l2ZW4gYmluYXJ5IGFuZCBjYWNoZXMgaXQgaW50byBgYmluYXJpZXNgXG4gKiBwcm9wZXJ0eSBvZiB0aGUgY3VycmVudCBBREIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJpbmFyeU5hbWUgLSBTaW1wbGUgbmFtZSBvZiBhIGJpbmFyeSBmaWxlLlxuICogQHJldHVybiB7c3RyaW5nfSBGdWxsIHBhdGggdG8gdGhlIGdpdmVuIGJpbmFyeS4gVGhlIG1ldGhvZCB0cmllc1xuICogICAgICAgICAgICAgICAgICB0byBlbnVtZXJhdGUgYWxsIHRoZSBrbm93biBsb2NhdGlvbnMgd2hlcmUgdGhlIGJpbmFyeVxuICogICAgICAgICAgICAgICAgICBtaWdodCBiZSBsb2NhdGVkIGFuZCBzdG9wcyB0aGUgc2VhcmNoIGFzIHNvb24gYXMgdGhlIGZpcnN0XG4gKiAgICAgICAgICAgICAgICAgIG1hdGNoIGlzIGZvdW5kIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYmluYXJ5IHdpdGggZ2l2ZW4gbmFtZSBpcyBub3QgcHJlc2VudCBhdCBhbnlcbiAqICAgICAgICAgICAgICAgICBvZiBrbm93biBsb2NhdGlvbnMgb3IgQW5kcm9pZCBTREsgaXMgbm90IGluc3RhbGxlZCBvbiB0aGVcbiAqICAgICAgICAgICAgICAgICBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuZ2V0QmluYXJ5RnJvbVNka1Jvb3QgPSBhc3luYyBmdW5jdGlvbiBnZXRCaW5hcnlGcm9tU2RrUm9vdCAoYmluYXJ5TmFtZSkge1xuICBpZiAodGhpcy5iaW5hcmllc1tiaW5hcnlOYW1lXSkge1xuICAgIHJldHVybiB0aGlzLmJpbmFyaWVzW2JpbmFyeU5hbWVdO1xuICB9XG4gIGNvbnN0IGZ1bGxCaW5hcnlOYW1lID0gdGhpcy5nZXRCaW5hcnlOYW1lRm9yT1MoYmluYXJ5TmFtZSk7XG4gIGNvbnN0IGJpbmFyeUxvY3MgPSBnZXRTZGtCaW5hcnlMb2NhdGlvbkNhbmRpZGF0ZXModGhpcy5zZGtSb290LCBmdWxsQmluYXJ5TmFtZSk7XG5cbiAgLy8gZ2V0IHN1YnBhdGhzIGZvciBjdXJyZW50bHkgaW5zdGFsbGVkIGJ1aWxkIHRvb2wgZGlyZWN0b3JpZXNcbiAgbGV0IGJ1aWxkVG9vbHNEaXJzID0gYXdhaXQgZ2V0QnVpbGRUb29sc0RpcnModGhpcy5zZGtSb290KTtcbiAgaWYgKHRoaXMuYnVpbGRUb29sc1ZlcnNpb24pIHtcbiAgICBidWlsZFRvb2xzRGlycyA9IGJ1aWxkVG9vbHNEaXJzXG4gICAgICAuZmlsdGVyKCh4KSA9PiBwYXRoLmJhc2VuYW1lKHgpID09PSB0aGlzLmJ1aWxkVG9vbHNWZXJzaW9uKTtcbiAgICBpZiAoXy5pc0VtcHR5KGJ1aWxkVG9vbHNEaXJzKSkge1xuICAgICAgbG9nLmluZm8oYEZvdW5kIG5vIGJ1aWxkIHRvb2xzIHdob3NlIHZlcnNpb24gbWF0Y2hlcyB0byAnJHt0aGlzLmJ1aWxkVG9vbHNWZXJzaW9ufSdgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oYFVzaW5nIGJ1aWxkIHRvb2xzIGF0ICcke2J1aWxkVG9vbHNEaXJzfSdgKTtcbiAgICB9XG4gIH1cbiAgYmluYXJ5TG9jcy5wdXNoKC4uLihfLmZsYXR0ZW4oYnVpbGRUb29sc0RpcnNcbiAgICAubWFwKChkaXIpID0+IFtcbiAgICAgIHBhdGgucmVzb2x2ZShkaXIsIGZ1bGxCaW5hcnlOYW1lKSxcbiAgICAgIHBhdGgucmVzb2x2ZShkaXIsICdsaWInLCBmdWxsQmluYXJ5TmFtZSksXG4gICAgXSkpXG4gICkpO1xuXG4gIGxldCBiaW5hcnlMb2MgPSBudWxsO1xuICBmb3IgKGNvbnN0IGxvYyBvZiBiaW5hcnlMb2NzKSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2MpKSB7XG4gICAgICBiaW5hcnlMb2MgPSBsb2M7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKF8uaXNOdWxsKGJpbmFyeUxvYykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICcke2Z1bGxCaW5hcnlOYW1lfScgaW4gJHtKU09OLnN0cmluZ2lmeShiaW5hcnlMb2NzKX0uIGAgK1xuICAgICAgYERvIHlvdSBoYXZlIEFuZHJvaWQgQnVpbGQgVG9vbHMgJHt0aGlzLmJ1aWxkVG9vbHNWZXJzaW9uID8gYHYgJHt0aGlzLmJ1aWxkVG9vbHNWZXJzaW9ufSBgIDogJyd9YCArXG4gICAgICBgaW5zdGFsbGVkIGF0ICcke3RoaXMuc2RrUm9vdH0nP2ApO1xuICB9XG4gIGxvZy5pbmZvKGBVc2luZyAnJHtmdWxsQmluYXJ5TmFtZX0nIGZyb20gJyR7YmluYXJ5TG9jfSdgKTtcbiAgdGhpcy5iaW5hcmllc1tiaW5hcnlOYW1lXSA9IGJpbmFyeUxvYztcbiAgcmV0dXJuIGJpbmFyeUxvYztcbn07XG5cbi8qKlxuICogIFJldHVybnMgdGhlIEFuZHJvaWQgYmluYXJpZXMgbG9jYXRpb25zXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNka1Jvb3QgVGhlIHBhdGggdG8gQW5kcm9pZCBTREsgcm9vdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmdWxsQmluYXJ5TmFtZSBUaGUgbmFtZSBvZiBmdWxsIGJpbmFyeSBuYW1lLlxuICogQHJldHVybiB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgU0RLX0JJTkFSWV9ST09UUyBwYXRoc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc2RrUm9vdCBhbmQgZnVsbEJpbmFyeU5hbWUuXG4gKi9cbmZ1bmN0aW9uIGdldFNka0JpbmFyeUxvY2F0aW9uQ2FuZGlkYXRlcyAoc2RrUm9vdCwgZnVsbEJpbmFyeU5hbWUpIHtcbiAgcmV0dXJuIFNES19CSU5BUllfUk9PVFMubWFwKCh4KSA9PlxuICAgIHBhdGgucmVzb2x2ZShzZGtSb290LCAuLi4oXy5pc0FycmF5KHgpID8geCA6IFt4XSksIGZ1bGxCaW5hcnlOYW1lKSk7XG59XG5cbi8qKlxuICogUmV0cmlldmUgZnVsbCBwYXRoIHRvIHRoZSBnaXZlbiBiaW5hcnkuXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBoYXZlIGNhY2hlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5hcnlOYW1lIC0gU2ltcGxlIG5hbWUgb2YgYSBiaW5hcnkgZmlsZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAnYWRiJywgJ2FuZHJvaWQnXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byB0aGUgZ2l2ZW4gYmluYXJ5LiBUaGUgbWV0aG9kIHRyaWVzXG4gKiAgICAgICAgICAgICAgICAgIHRvIGVudW1lcmF0ZSBhbGwgdGhlIGtub3duIGxvY2F0aW9ucyB3aGVyZSB0aGUgYmluYXJ5XG4gKiAgICAgICAgICAgICAgICAgIG1pZ2h0IGJlIGxvY2F0ZWQgYW5kIHN0b3BzIHRoZSBzZWFyY2ggYXMgc29vbiBhcyB0aGUgZmlyc3RcbiAqICAgICAgICAgICAgICAgICAgbWF0Y2ggaXMgZm91bmQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICogICAgICAgICAgICAgICAgICBlLmcuICcvUGF0aC9Uby9BbmRyb2lkL3Nkay9wbGF0Zm9ybS10b29scy9hZGInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGJpbmFyeSB3aXRoIGdpdmVuIG5hbWUgaXMgbm90IHByZXNlbnQgYXQgYW55XG4gKiAgICAgICAgICAgICAgICAgb2Yga25vd24gbG9jYXRpb25zIG9yIEFuZHJvaWQgU0RLIGlzIG5vdCBpbnN0YWxsZWQgb24gdGhlXG4gKiAgICAgICAgICAgICAgICAgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFuZHJvaWRCaW5hcnlQYXRoIChiaW5hcnlOYW1lKSB7XG4gIGNvbnN0IGZ1bGxCaW5hcnlOYW1lID0gZ2V0QmluYXJ5TmFtZUZvck9TKGJpbmFyeU5hbWUpO1xuICBjb25zdCBzZGtSb290ID0gZ2V0U2RrUm9vdEZyb21FbnYoKTtcbiAgY29uc3QgYmluYXJ5TG9jcyA9IGdldFNka0JpbmFyeUxvY2F0aW9uQ2FuZGlkYXRlcyhzZGtSb290LCBmdWxsQmluYXJ5TmFtZSk7XG4gIGZvciAoY29uc3QgbG9jIG9mIGJpbmFyeUxvY3MpIHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvYykpIHtcbiAgICAgIHJldHVybiBsb2M7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgJyR7ZnVsbEJpbmFyeU5hbWV9JyBpbiAke0pTT04uc3RyaW5naWZ5KGJpbmFyeUxvY3MpfS4gYCArXG4gICAgYERvIHlvdSBoYXZlIEFuZHJvaWQgQnVpbGQgVG9vbHMgaW5zdGFsbGVkIGF0ICcke3Nka1Jvb3R9Jz9gKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSBmdWxsIHBhdGggdG8gYSBiaW5hcnkgZmlsZSB1c2luZyB0aGUgc3RhbmRhcmQgc3lzdGVtIGxvb2t1cCB0b29sLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5hcnlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJpbmFyeS5cbiAqIEByZXR1cm4ge3N0cmluZ30gRnVsbCBwYXRoIHRvIHRoZSBiaW5hcnkgcmVjZWl2ZWQgZnJvbSAnd2hpY2gnLyd3aGVyZSdcbiAqICAgICAgICAgICAgICAgICAgb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvb2t1cCB0b29sIHJldHVybnMgbm9uLXplcm8gcmV0dXJuIGNvZGUuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldEJpbmFyeUZyb21QYXRoID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmluYXJ5RnJvbVBhdGggKGJpbmFyeU5hbWUpIHtcbiAgaWYgKHRoaXMuYmluYXJpZXNbYmluYXJ5TmFtZV0pIHtcbiAgICByZXR1cm4gdGhpcy5iaW5hcmllc1tiaW5hcnlOYW1lXTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxCaW5hcnlOYW1lID0gdGhpcy5nZXRCaW5hcnlOYW1lRm9yT1MoYmluYXJ5TmFtZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgYmluYXJ5TG9jID0gYXdhaXQgZnMud2hpY2goZnVsbEJpbmFyeU5hbWUpO1xuICAgIGxvZy5pbmZvKGBVc2luZyAnJHtmdWxsQmluYXJ5TmFtZX0nIGZyb20gJyR7YmluYXJ5TG9jfSdgKTtcbiAgICB0aGlzLmJpbmFyaWVzW2JpbmFyeU5hbWVdID0gYmluYXJ5TG9jO1xuICAgIHJldHVybiBiaW5hcnlMb2M7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICcke2Z1bGxCaW5hcnlOYW1lfScgaW4gUEFUSC4gUGxlYXNlIHNldCB0aGUgQU5EUk9JRF9IT01FIGAgK1xuICAgICAgYG9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRoZSBjb3JyZWN0IEFuZHJvaWQgU0RLIHJvb3QgZGlyZWN0b3J5IHBhdGguYCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29ubmVjdGVkRGV2aWNlc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHZlcmJvc2UgLSBXaGV0aGVyIHRvIGdldCBsb25nIG91dHB1dCwgd2hpY2ggaW5jbHVkZXMgZXh0cmEgcHJvcGVydGllcyBpbiBlYWNoIGRldmljZS5cbiAqIEFraW4gdG8gcnVubmluZyBgYWRiIGRldmljZXMgLWxgLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdWRpZCAtIFRoZSBkZXZpY2UgdWRpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGF0ZSAtIEN1cnJlbnQgZGV2aWNlIHN0YXRlLCBhcyBpdCBpcyB2aXNpYmxlIGluXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWRiIGRldmljZXMgLWxfIG91dHB1dC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtEZXZpY2V9IFZlcmJvc2VEZXZpY2UgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHJldHVybmVkIHdoZW4gYHZlcmJvc2VgIGlzIHRydWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdCAtIFRoZSBwcm9kdWN0IGNvZGVuYW1lIG9mIHRoZSBkZXZpY2UsIHN1Y2ggYXMgXCJyYXpvclwiLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgb2YgdGhlIGRldmljZSwgc3VjaCBhcyBcIk5leHVzXzdcIi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXZpY2UgLSBUaGUgZGV2aWNlIGNvZGVuYW1lLCBzdWNoIGFzIFwiZmxvd1wiLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1c2IgLSBSZXByZXNlbnRzIHRoZSBVU0IgcG9ydCB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZCB0bywgc3VjaCBhcyBcIjEtMVwiLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0cmFuc3BvcnRfaWQgLSBUaGUgVHJhbnNwb3J0IElEIGZvciB0aGUgZGV2aWNlLCBzdWNoIGFzIFwiMVwiLlxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZGV2aWNlcyB2aXNpYmxlIHRvIGFkYi5cbiAqXG4gKiBAcGFyYW0gez9Db25uZWN0ZWREZXZpY2VzT3B0aW9uc30gb3B0cyBbe31dIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuXG4gKiBAcmV0dXJuIHtBcnJheS48RGV2aWNlPn0gVGhlIGxpc3Qgb2YgZGV2aWNlcyBvciBhbiBlbXB0eSBsaXN0IGlmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGV2aWNlcyBhcmUgY29ubmVjdGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBsaXN0aW5nIGRldmljZXMuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldENvbm5lY3RlZERldmljZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb25uZWN0ZWREZXZpY2VzIChvcHRzID0ge30pIHtcbiAgbG9nLmRlYnVnKCdHZXR0aW5nIGNvbm5lY3RlZCBkZXZpY2VzJyk7XG4gIGNvbnN0IGFyZ3MgPSBbLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLCAnZGV2aWNlcyddO1xuICBpZiAob3B0cy52ZXJib3NlKSB7XG4gICAgYXJncy5wdXNoKCctbCcpO1xuICB9XG5cbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBhcmdzKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGdldHRpbmcgY29ubmVjdGVkIGRldmljZXMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICBjb25zdCBsaXN0SGVhZGVyID0gJ0xpc3Qgb2YgZGV2aWNlcyc7XG4gIC8vIGV4cGVjdGluZyBhZGIgZGV2aWNlcyB0byByZXR1cm4gb3V0cHV0IGFzXG4gIC8vIExpc3Qgb2YgZGV2aWNlcyBhdHRhY2hlZFxuICAvLyBlbXVsYXRvci01NTU0XHRkZXZpY2VcbiAgY29uc3Qgc3RhcnRpbmdJbmRleCA9IHN0ZG91dC5pbmRleE9mKGxpc3RIZWFkZXIpO1xuICBpZiAoc3RhcnRpbmdJbmRleCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3V0cHV0IHdoaWxlIHRyeWluZyB0byBnZXQgZGV2aWNlczogJHtzdGRvdXR9YCk7XG4gIH1cbiAgLy8gc2xpY2luZyBvdXRwdXQgd2UgY2FyZSBhYm91dFxuICBzdGRvdXQgPSBzdGRvdXQuc2xpY2Uoc3RhcnRpbmdJbmRleCk7XG4gIGxldCBleGNsdWRlZExpbmVzID0gW2xpc3RIZWFkZXIsICdhZGIgc2VydmVyJywgJyogZGFlbW9uJ107XG4gIGlmICghdGhpcy5hbGxvd09mZmxpbmVEZXZpY2VzKSB7XG4gICAgZXhjbHVkZWRMaW5lcy5wdXNoKCdvZmZsaW5lJyk7XG4gIH1cbiAgY29uc3QgZGV2aWNlcyA9IHN0ZG91dC5zcGxpdCgnXFxuJylcbiAgICAubWFwKF8udHJpbSlcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lICYmICFleGNsdWRlZExpbmVzLnNvbWUoKHgpID0+IGxpbmUuaW5jbHVkZXMoeCkpKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIC8vIHN0YXRlIGlzIFwiZGV2aWNlXCIsIGFmYWljXG4gICAgICBjb25zdCBbdWRpZCwgc3RhdGUsIC4uLmRlc2NyaXB0aW9uXSA9IGxpbmUuc3BsaXQoL1xccysvKTtcbiAgICAgIGNvbnN0IGRldmljZSA9IHt1ZGlkLCBzdGF0ZX07XG4gICAgICBpZiAob3B0cy52ZXJib3NlKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICBpZiAoZW50cnkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgICAgLy8gZWFjaCBlbnRyeSBsb29rcyBsaWtlIGtleTp2YWx1ZVxuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnkuc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGRldmljZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGV2aWNlO1xuICAgIH0pO1xuICBpZiAoXy5pc0VtcHR5KGRldmljZXMpKSB7XG4gICAgbG9nLmRlYnVnKCdObyBjb25uZWN0ZWQgZGV2aWNlcyBoYXZlIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuZGVidWcoYENvbm5lY3RlZCBkZXZpY2VzOiAke0pTT04uc3RyaW5naWZ5KGRldmljZXMpfWApO1xuICB9XG4gIHJldHVybiBkZXZpY2VzO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBkZXZpY2VzIHZpc2libGUgdG8gYWRiIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZW91dC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dE1zIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBnZXQgYXQgbGVhc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgbGlzdCBpdGVtLlxuICogQHJldHVybiB7QXJyYXkuPERldmljZT59IFRoZSBsaXN0IG9mIGNvbm5lY3RlZCBkZXZpY2VzLlxuICogQHRocm93cyB7RXJyb3J9IElmIG5vIGNvbm5lY3RlZCBkZXZpY2VzIGNhbiBiZSBkZXRlY3RlZCB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXQuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldERldmljZXNXaXRoUmV0cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VzV2l0aFJldHJ5ICh0aW1lb3V0TXMgPSAyMDAwMCkge1xuICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICBsb2cuZGVidWcoJ1RyeWluZyB0byBmaW5kIGEgY29ubmVjdGVkIGFuZHJvaWQgZGV2aWNlJyk7XG4gIGNvbnN0IGdldERldmljZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMgPiB0aW1lb3V0TXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgYSBjb25uZWN0ZWQgQW5kcm9pZCBkZXZpY2UgaW4gJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXMuYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXZpY2VzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VzKCk7XG4gICAgICBpZiAoZGV2aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZXZpY2VzO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cblxuICAgIGxvZy5kZWJ1ZygnQ291bGQgbm90IGZpbmQgb25saW5lIGRldmljZXMnKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzdGFydEFkYigpO1xuICAgIH1cbiAgICAvLyBjb29sIGRvd25cbiAgICBhd2FpdCBzbGVlcCgyMDApO1xuICAgIHJldHVybiBhd2FpdCBnZXREZXZpY2VzKCk7XG4gIH07XG4gIHJldHVybiBhd2FpdCBnZXREZXZpY2VzKCk7XG59O1xuXG4vKipcbiAqIEtpY2sgY3VycmVudCBjb25uZWN0aW9uIGZyb20gaG9zdC9kZXZpY2Ugc2lkZSBhbmQgbWFrZSBpdCByZWNvbm5lY3RcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IHRhcmdldCBbb2ZmbGluZV0gT25lIG9mIHBvc3NpYmxlIHRhcmdldHMgdG8gcmVjb25uZWN0OlxuICogb2ZmbGluZSwgZGV2aWNlIG9yIG51bGxcbiAqIFByb3ZpZGluZyBgbnVsbGAgd2lsbCBjYXVzZSByZWNvbm5lY3Rpb24gdG8gaGFwcGVuIGZyb20gdGhlIGhvc3Qgc2lkZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZWl0aGVyIEFEQiB2ZXJzaW9uIGlzIHRvbyBvbGQgYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhpc1xuICogY29tbWFuZCBvciB0aGVyZSB3YXMgYSBmYWlsdXJlIGR1cmluZyByZWNvbm5lY3QuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLnJlY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uIHJlY29ubmVjdCAodGFyZ2V0ID0gJ29mZmxpbmUnKSB7XG4gIGxvZy5kZWJ1ZyhgUmVjb25uZWN0aW5nIGFkYiAodGFyZ2V0ICR7dGFyZ2V0fSlgKTtcblxuICBjb25zdCBhcmdzID0gWydyZWNvbm5lY3QnXTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGFyZ3MucHVzaCh0YXJnZXQpO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGJFeGVjKGFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVjb25uZWN0IGFkYi4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJlc3RhcnQgYWRiIHNlcnZlciwgdW5sZXNzIF90aGlzLnN1cHByZXNzS2lsbFNlcnZlcl8gcHJvcGVydHkgaXMgdHJ1ZS5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMucmVzdGFydEFkYiA9IGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnRBZGIgKCkge1xuICBpZiAodGhpcy5zdXBwcmVzc0tpbGxTZXJ2ZXIpIHtcbiAgICBsb2cuZGVidWcoYE5vdCByZXN0YXJ0aW5nIGFiZCBzaW5jZSAnc3VwcHJlc3NLaWxsU2VydmVyJyBpcyBvbmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5kZWJ1ZygnUmVzdGFydGluZyBhZGInKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmtpbGxTZXJ2ZXIoKTtcbiAgICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydzdGFydC1zZXJ2ZXInXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3IoYEVycm9yIGtpbGxpbmcgQURCIHNlcnZlciwgZ29pbmcgdG8gc2VlIGlmIGl0J3Mgb25saW5lIGFueXdheWApO1xuICB9XG59O1xuXG4vKipcbiAqIEtpbGwgYWRiIHNlcnZlci5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMua2lsbFNlcnZlciA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxTZXJ2ZXIgKCkge1xuICBsb2cuZGVidWcoYEtpbGxpbmcgYWRiIHNlcnZlciBvbiBwb3J0ICcke3RoaXMuYWRiUG9ydH0nYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2tpbGwtc2VydmVyJ10sIHtcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXNldCBUZWxuZXQgYXV0aGVudGljYXRpb24gdG9rZW4uXG4gKiBAc2VlIHtAbGluayBodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L2VtdWxhdG9yMjUxNnJlbGVhc2Vub3Rlc30gZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgdG9rZW4gcmVzZXQgd2FzIHN1Y2Nlc3NmdWwuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLnJlc2V0VGVsbmV0QXV0aFRva2VuID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIHJlc2V0VGVsbmV0QXV0aFRva2VuICgpIHtcbiAgLy8gVGhlIG1ldGhvZHMgaXMgdXNlZCB0byByZW1vdmUgdGVsbmV0IGF1dGggdG9rZW5cbiAgLy9cbiAgY29uc3QgaG9tZUZvbGRlclBhdGggPSBwcm9jZXNzLmVudlsocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykgPyAnVVNFUlBST0ZJTEUnIDogJ0hPTUUnXTtcbiAgaWYgKCFob21lRm9sZGVyUGF0aCkge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgZmluZCB0aGUgcGF0aCB0byB1c2VyIGhvbWUgZm9sZGVyLiBJZ25vcmluZyByZXNldHRpbmcgb2YgZW11bGF0b3IncyB0ZWxuZXQgYXV0aGVudGljYXRpb24gdG9rZW5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZHN0UGF0aCA9IHBhdGgucmVzb2x2ZShob21lRm9sZGVyUGF0aCwgJy5lbXVsYXRvcl9jb25zb2xlX2F1dGhfdG9rZW4nKTtcbiAgbG9nLmRlYnVnKGBPdmVycmlkaW5nICR7ZHN0UGF0aH0gd2l0aCBhbiBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgdGVsbmV0IGF1dGhlbnRpY2F0aW9uIGZvciBlbXVsYXRvciBjb21tYW5kc2ApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkc3RQYXRoLCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cud2FybihgRXJyb3IgJHtlLm1lc3NhZ2V9IHdoaWxlIHJlc2V0dGluZyB0aGUgY29udGVudCBvZiAke2RzdFBhdGh9LiBJZ25vcmluZyByZXNldHRpbmcgb2YgZW11bGF0b3IncyB0ZWxuZXQgYXV0aGVudGljYXRpb24gdG9rZW5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KTtcblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBnaXZlbiBlbXVsYXRvciBjb21tYW5kIHVzaW5nIF9hZGIgZW11XyB0b29sLlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNtZCAtIFRoZSBhcnJheSBvZiByZXN0IGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5hZGJFeGVjRW11ID0gYXN5bmMgZnVuY3Rpb24gYWRiRXhlY0VtdSAoY21kKSB7XG4gIGF3YWl0IHRoaXMudmVyaWZ5RW11bGF0b3JDb25uZWN0ZWQoKTtcbiAgYXdhaXQgdGhpcy5yZXNldFRlbG5ldEF1dGhUb2tlbigpO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydlbXUnLCAuLi5jbWRdKTtcbn07XG5cbmxldCBpc0V4ZWNMb2NrZWQgPSBmYWxzZTtcblxuc3lzdGVtQ2FsbE1ldGhvZHMuRVhFQ19PVVRQVVRfRk9STUFUID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFNURE9VVDogJ3N0ZG91dCcsXG4gIEZVTEw6ICdmdWxsJyxcbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4ZWNSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgVGhlIHN0ZG91dCByZWNlaXZlZCBmcm9tIGV4ZWNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRlcnIgVGhlIHN0ZGVyciByZWNlaXZlZCBmcm9tIGV4ZWNcbiAqL1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIGdpdmVuIGFkYiBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNtZCAtIFRoZSBhcnJheSBvZiByZXN0IGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzXG4gKiAgICAgICAgICAgICAgICAgICAgICBvciBhIHNpbmdsZSBzdHJpbmcgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy4gU2VlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL25vZGUtdGVlbl9wcm9jZXNzfVxuICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLlxuICogICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gc2V0IHRoZSBhZGRpdGlvbmFsIGBleGNsdXNpdmVgIHBhcmFtXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGB0cnVlYCB0aGF0IGFzc3VyZXMgbm8gb3RoZXIgcGFyYWxsZWwgYWRiIGNvbW1hbmRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBnb2luZyB0byBiZSBleGVjdXRlZCB3aGlsZSB0aGUgY3VycmVudCBvbmUgaXMgcnVubmluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCB0aGUgYG91dHB1dEZvcm1hdGAgcGFyYW0gdG8gYHN0ZG91dGAgdG8gcmVjZWl2ZSBqdXN0IHRoZSBzdGRvdXRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IChkZWZhdWx0KSBvciBgZnVsbGAgdG8gcmVjZWl2ZSB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIgcmVzcG9uc2UgZnJvbSBhXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgd2l0aCBhIHplcm8gZXhpdCBjb2RlXG4gKiBAcmV0dXJuIHtzdHJpbmd8RXhlY1Jlc3VsdH0gLSBDb21tYW5kJ3Mgc3Rkb3V0IG9yIGFuIG9iamVjdCBjb250YWluaW5nIHN0ZG91dCBhbmQgc3RkZXJyLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjb21tYW5kIHJldHVybmVkIG5vbi16ZXJvIGV4aXQgY29kZS5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuYWRiRXhlYyA9IGFzeW5jIGZ1bmN0aW9uIGFkYkV4ZWMgKGNtZCwgb3B0cyA9IHt9KSB7XG4gIGlmICghY21kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBwYXNzIGluIGEgY29tbWFuZCB0byBhZGJFeGVjKCknKTtcbiAgfVxuXG4gIG9wdHMgPSBfLmNsb25lRGVlcChvcHRzKTtcbiAgLy8gc2V0dGluZyBkZWZhdWx0IHRpbWVvdXQgZm9yIGVhY2ggY29tbWFuZCB0byBwcmV2ZW50IGluZmluaXRlIHdhaXQuXG4gIG9wdHMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCB0aGlzLmFkYkV4ZWNUaW1lb3V0IHx8IERFRkFVTFRfQURCX0VYRUNfVElNRU9VVDtcbiAgb3B0cy50aW1lb3V0Q2FwTmFtZSA9IG9wdHMudGltZW91dENhcE5hbWUgfHwgJ2FkYkV4ZWNUaW1lb3V0JzsgLy8gRm9yIGVycm9yIG1lc3NhZ2VcblxuICBjb25zdCB7b3V0cHV0Rm9ybWF0ID0gdGhpcy5FWEVDX09VVFBVVF9GT1JNQVQuU1RET1VUfSA9IG9wdHM7XG5cbiAgY21kID0gXy5pc0FycmF5KGNtZCkgPyBjbWQgOiBbY21kXTtcbiAgbGV0IGFkYlJldHJpZWQgPSBmYWxzZTtcbiAgY29uc3QgZXhlY0Z1bmMgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFyZ3MgPSBbLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLCAuLi5jbWRdO1xuICAgICAgbG9nLmRlYnVnKGBSdW5uaW5nICcke3RoaXMuZXhlY3V0YWJsZS5wYXRofSBgICtcbiAgICAgICAgKGFyZ3MuZmluZCgoYXJnKSA9PiAvXFxzKy8udGVzdChhcmcpKSA/IHV0aWwucXVvdGUoYXJncykgOiBhcmdzLmpvaW4oJyAnKSkgKyBgJ2ApO1xuICAgICAgbGV0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCBleGVjKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBhcmdzLCBvcHRzKTtcbiAgICAgIC8vIHNvbWV0aW1lcyBBREIgcHJpbnRzIG91dCB3ZWlyZCBzdGRvdXQgd2FybmluZ3MgdGhhdCB3ZSBkb24ndCB3YW50XG4gICAgICAvLyB0byBpbmNsdWRlIGluIGFueSBvZiB0aGUgcmVzcG9uc2UgZGF0YSwgc28gbGV0J3Mgc3RyaXAgaXQgb3V0XG4gICAgICBzdGRvdXQgPSBzdGRvdXQucmVwbGFjZShMSU5LRVJfV0FSTklOR19SRUdFWFAsICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gb3V0cHV0Rm9ybWF0ID09PSB0aGlzLkVYRUNfT1VUUFVUX0ZPUk1BVC5GVUxMID8ge3N0ZG91dCwgc3RkZXJyfSA6IHN0ZG91dDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJUZXh0ID0gYCR7ZS5tZXNzYWdlfSwgJHtlLnN0ZG91dH0sICR7ZS5zdGRlcnJ9YDtcbiAgICAgIGlmIChBREJfUkVUUllfRVJST1JfUEFUVEVSTlMuc29tZSgocCkgPT4gcC50ZXN0KGVyclRleHQpKSkge1xuICAgICAgICBsb2cuaW5mbyhgRXJyb3Igc2VuZGluZyBjb21tYW5kLCByZWNvbm5lY3RpbmcgZGV2aWNlIGFuZCByZXRyeWluZzogJHtjbWR9YCk7XG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMDApO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERldmljZXNXaXRoUmV0cnkoKTtcblxuICAgICAgICAvLyB0cnkgYWdhaW4gb25lIHRpbWVcbiAgICAgICAgaWYgKGFkYlJldHJpZWQpIHtcbiAgICAgICAgICBhZGJSZXRyaWVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgZXhlY0Z1bmMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZS5jb2RlID09PSAwICYmIGUuc3Rkb3V0KSB7XG4gICAgICAgIHJldHVybiBlLnN0ZG91dC5yZXBsYWNlKExJTktFUl9XQVJOSU5HX1JFR0VYUCwgJycpLnRyaW0oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF8uaXNOdWxsKGUuY29kZSkpIHtcbiAgICAgICAgZS5tZXNzYWdlID0gYEVycm9yIGV4ZWN1dGluZyBhZGJFeGVjLiBPcmlnaW5hbCBlcnJvcjogJyR7ZS5tZXNzYWdlfScuIGAgK1xuICAgICAgICAgIGBUcnkgdG8gaW5jcmVhc2UgdGhlICR7b3B0cy50aW1lb3V0fW1zIGFkYiBleGVjdXRpb24gdGltZW91dCByZXByZXNlbnRlZCBieSAnJHtvcHRzLnRpbWVvdXRDYXBOYW1lfScgY2FwYWJpbGl0eWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlLm1lc3NhZ2UgPSBgRXJyb3IgZXhlY3V0aW5nIGFkYkV4ZWMuIE9yaWdpbmFsIGVycm9yOiAnJHtlLm1lc3NhZ2V9JzsgYCArXG4gICAgICAgICAgYENvbW1hbmQgb3V0cHV0OiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0IHx8ICc8ZW1wdHk+J31gO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKGlzRXhlY0xvY2tlZCkge1xuICAgIGxvZy5kZWJ1ZygnV2FpdGluZyB1bnRpbCB0aGUgb3RoZXIgZXhjbHVzaXZlIEFEQiBjb21tYW5kIGlzIGNvbXBsZXRlZCcpO1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oKCkgPT4gIWlzRXhlY0xvY2tlZCwge1xuICAgICAgd2FpdE1zOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIGludGVydmFsTXM6IDEwLFxuICAgIH0pO1xuICAgIGxvZy5kZWJ1ZygnQ29udGludWluZyB3aXRoIHRoZSBjdXJyZW50IEFEQiBjb21tYW5kJyk7XG4gIH1cbiAgaWYgKG9wdHMuZXhjbHVzaXZlKSB7XG4gICAgaXNFeGVjTG9ja2VkID0gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBleGVjRnVuYygpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvcHRzLmV4Y2x1c2l2ZSkge1xuICAgICAgaXNFeGVjTG9ja2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNoZWxsRXhlY09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdGltZW91dENhcE5hbWUgW2FkYkV4ZWNUaW1lb3V0XSAtIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIEFwcGl1bSdzIHRpbWVvdXQgY2FwYWJpbGl0eVxuICogKHVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2VzKS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGltZW91dCBbYWRiRXhlY1RpbWVvdXRdIC0gY29tbWFuZCBleGVjdXRpb24gdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHByaXZpbGVnZWQgW2ZhbHN5XSAtIFdoZXRoZXIgdG8gcnVuIHRoZSBnaXZlbiBjb21tYW5kIGFzIHJvb3QuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG91dHB1dEZvcm1hdCBbc3Rkb3V0XSAtIFdoZXRoZXIgcmVzcG9uc2Ugc2hvdWxkIGluY2x1ZGUgZnVsbCBleGVjIG91dHB1dCBvciBqdXN0IHN0ZG91dC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG90ZW50aWFsIHZhbHVlcyBhcmUgZnVsbCBvciBzdGRvdXQuXG4gKlxuICogQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIHRoZSBzYW1lIGFzIGZvciBgZXhlY2AgY2FsbCBmcm9tIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL25vZGUtdGVlbl9wcm9jZXNzfVxuICogbW9kdWxlXG4gKi9cblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kIHVzaW5nIF9hZGIgc2hlbGxfIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0geyFBcnJheS48c3RyaW5nPnxzdHJpbmd9IGNtZCAtIFRoZSBhcnJheSBvZiByZXN0IGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIG9yIGEgc2luZ2xlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7P1NoZWxsRXhlY09wdGlvbnN9IG9wdHMgW3t9XSAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbW1hbmQncyBzdGRvdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNvbW1hbmQgcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBjb2RlLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5zaGVsbCA9IGFzeW5jIGZ1bmN0aW9uIHNoZWxsIChjbWQsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgcHJpdmlsZWdlZCxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgY21kQXJyID0gXy5pc0FycmF5KGNtZCkgPyBjbWQgOiBbY21kXTtcbiAgY29uc3QgZnVsbENtZCA9IFsnc2hlbGwnXTtcbiAgaWYgKHByaXZpbGVnZWQpIHtcbiAgICBsb2cuaW5mbyhgJ2FkYiBzaGVsbCAke3V0aWwucXVvdGUoY21kQXJyKX0nIHJlcXVpcmVzIHJvb3QgYWNjZXNzYCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuaXNSb290KCkpIHtcbiAgICAgIGxvZy5pbmZvKCdUaGUgZGV2aWNlIGFscmVhZHkgaGFkIHJvb3QgYWNjZXNzJyk7XG4gICAgICBmdWxsQ21kLnB1c2goLi4uY21kQXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsbENtZC5wdXNoKCdzdScsICdyb290JywgdXRpbC5xdW90ZShjbWRBcnIpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZnVsbENtZC5wdXNoKC4uLmNtZEFycik7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiRXhlYyhmdWxsQ21kLCBvcHRzKTtcbn07XG5cbnN5c3RlbUNhbGxNZXRob2RzLmNyZWF0ZVN1YlByb2Nlc3MgPSBmdW5jdGlvbiBjcmVhdGVTdWJQcm9jZXNzIChhcmdzID0gW10pIHtcbiAgLy8gYWRkIHRoZSBkZWZhdWx0IGFyZ3VtZW50c1xuICBhcmdzID0gWy4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncywgLi4uYXJnc107XG4gIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQURCIHN1YnByb2Nlc3Mgd2l0aCBhcmdzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICByZXR1cm4gbmV3IFN1YlByb2Nlc3ModGhpcy5nZXRBZGJQYXRoKCksIGFyZ3MpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBhZGIgcG9ydC5cbiAqIEB0b2RvIGNhbiBwcm9iYWJseSBkZXByZWNhdGUgdGhpcyBub3cgdGhhdCB0aGUgbG9naWMgaXMganVzdCB0byByZWFkIHRoaXMuYWRiUG9ydFxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBhZGIgcG9ydCBudW1iZXIuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldEFkYlNlcnZlclBvcnQgPSBmdW5jdGlvbiBnZXRBZGJTZXJ2ZXJQb3J0ICgpIHtcbiAgcmV0dXJuIHRoaXMuYWRiUG9ydDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGN1cnJlbnQgZW11bGF0b3IgcG9ydCBmcm9tIF9hZGIgZGV2aXZlc18gb3V0cHV0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgZW11bGF0b3IgcG9ydC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgbm8gY29ubmVjdGVkIGRldmljZXMuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldEVtdWxhdG9yUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGdldEVtdWxhdG9yUG9ydCAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBydW5uaW5nIGVtdWxhdG9yIHBvcnQnKTtcbiAgaWYgKHRoaXMuZW11bGF0b3JQb3J0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZW11bGF0b3JQb3J0O1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IGRldmljZXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgICBsZXQgcG9ydCA9IHRoaXMuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyhkZXZpY2VzWzBdLnVkaWQpO1xuICAgIGlmIChwb3J0KSB7XG4gICAgICByZXR1cm4gcG9ydDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbXVsYXRvciBwb3J0IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZGV2aWNlcyBjb25uZWN0ZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBlbXVsYXRvciBwb3J0IGJ5IHBhcnNpbmcgZW11bGF0b3IgbmFtZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVtU3RyIC0gRW11bGF0b3IgbmFtZSBzdHJpbmcuXG4gKiBAcmV0dXJuIHtudW1iZXJ8Ym9vbGVhbn0gRWl0aGVyIHRoZSBjdXJyZW50IGVtdWxhdG9yIHBvcnQgb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBfZmFsc2VfIGlmIHBvcnQgbnVtYmVyIGNhbm5vdCBiZSBwYXJzZWQuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcgPSBmdW5jdGlvbiBnZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nIChlbVN0cikge1xuICBsZXQgcG9ydFBhdHRlcm4gPSAvZW11bGF0b3ItKFxcZCspLztcbiAgaWYgKHBvcnRQYXR0ZXJuLnRlc3QoZW1TdHIpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHBvcnRQYXR0ZXJuLmV4ZWMoZW1TdHIpWzFdLCAxMCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBjdXJyZW50bHkgY29ubmVjdGVkIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0gez9Db25uZWN0ZWREZXZpY2VzT3B0aW9uc30gb3B0cyBbe31dIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuXG4gKiBAcmV0dXJuIHtBcnJheS48RGV2aWNlPn0gVGhlIGxpc3Qgb2YgY29ubmVjdGVkIGRldmljZXMuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldENvbm5lY3RlZEVtdWxhdG9ycyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbm5lY3RlZEVtdWxhdG9ycyAob3B0cyA9IHt9KSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBjb25uZWN0ZWQgZW11bGF0b3JzJyk7XG4gIHRyeSB7XG4gICAgbGV0IGRldmljZXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMob3B0cyk7XG4gICAgbGV0IGVtdWxhdG9ycyA9IFtdO1xuICAgIGZvciAobGV0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICBsZXQgcG9ydCA9IHRoaXMuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyhkZXZpY2UudWRpZCk7XG4gICAgICBpZiAocG9ydCkge1xuICAgICAgICBkZXZpY2UucG9ydCA9IHBvcnQ7XG4gICAgICAgIGVtdWxhdG9ycy5wdXNoKGRldmljZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgJHt1dGlsLnBsdXJhbGl6ZSgnZW11bGF0b3InLCBlbXVsYXRvcnMubGVuZ3RoLCB0cnVlKX0gY29ubmVjdGVkYCk7XG4gICAgcmV0dXJuIGVtdWxhdG9ycztcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBlbXVsYXRvcnMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXQgX2VtdWxhdG9yUG9ydF8gcHJvcGVydHkgb2YgdGhlIGN1cnJlbnQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGVtUG9ydCAtIFRoZSBlbXVsYXRvciBwb3J0IHRvIGJlIHNldC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuc2V0RW11bGF0b3JQb3J0ID0gZnVuY3Rpb24gc2V0RW11bGF0b3JQb3J0IChlbVBvcnQpIHtcbiAgdGhpcy5lbXVsYXRvclBvcnQgPSBlbVBvcnQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgaWRlbnRpZmllciBvZiB0aGUgY3VycmVudCBkZXZpY2UgKF90aGlzLmN1ckRldmljZUlkXykuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IC0gVGhlIGRldmljZSBpZGVudGlmaWVyLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5zZXREZXZpY2VJZCA9IGZ1bmN0aW9uIHNldERldmljZUlkIChkZXZpY2VJZCkge1xuICBsb2cuZGVidWcoYFNldHRpbmcgZGV2aWNlIGlkIHRvICR7ZGV2aWNlSWR9YCk7XG4gIHRoaXMuY3VyRGV2aWNlSWQgPSBkZXZpY2VJZDtcbiAgbGV0IGFyZ3NIYXNEZXZpY2UgPSB0aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MuaW5kZXhPZignLXMnKTtcbiAgaWYgKGFyZ3NIYXNEZXZpY2UgIT09IC0xKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBvbGQgZGV2aWNlIGlkIGZyb20gdGhlIGFyZ3VtZW50c1xuICAgIHRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncy5zcGxpY2UoYXJnc0hhc0RldmljZSwgMik7XG4gIH1cbiAgdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLnB1c2goJy1zJywgZGV2aWNlSWQpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHRoZSBjdXJyZW50IGRldmljZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtEZXZpY2V9IGRldmljZU9iaiAtIFRoZSBkZXZpY2Ugb2JqZWN0IHRvIGJlIHNldC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuc2V0RGV2aWNlID0gZnVuY3Rpb24gc2V0RGV2aWNlIChkZXZpY2VPYmopIHtcbiAgbGV0IGRldmljZUlkID0gZGV2aWNlT2JqLnVkaWQ7XG4gIGxldCBlbVBvcnQgPSB0aGlzLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcoZGV2aWNlSWQpO1xuICB0aGlzLnNldEVtdWxhdG9yUG9ydChlbVBvcnQpO1xuICB0aGlzLnNldERldmljZUlkKGRldmljZUlkKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBvYmplY3QgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyBlbXVsYXRvci5cbiAqICEhISBUaGlzIG1ldGhvZCBoYXMgYSBzaWRlIGVmZmVjdCAtIGl0IGltcGxpY2l0bHkgY2hhbmdlcyB0aGVcbiAqIGBkZXZpY2VJZGAgKG9ubHkgaWYgQVZEIHdpdGggYSBtYXRjaGluZyBuYW1lIGlzIGZvdW5kKVxuICogYW5kIGBlbXVsYXRvclBvcnRgIGluc3RhbmNlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF2ZE5hbWUgLSBFbXVsYXRvciBuYW1lLlxuICogQHJldHVybiB7P0RldmljZX0gQ3VycmVudGx5IHJ1bm5pbmcgZW11bGF0b3Igb3IgX251bGxfLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRSdW5uaW5nQVZEID0gYXN5bmMgZnVuY3Rpb24gZ2V0UnVubmluZ0FWRCAoYXZkTmFtZSkge1xuICBsb2cuZGVidWcoYFRyeWluZyB0byBmaW5kICcke2F2ZE5hbWV9JyBlbXVsYXRvcmApO1xuICB0cnkge1xuICAgIGNvbnN0IGVtdWxhdG9ycyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRW11bGF0b3JzKCk7XG4gICAgZm9yIChjb25zdCBlbXVsYXRvciBvZiBlbXVsYXRvcnMpIHtcbiAgICAgIHRoaXMuc2V0RW11bGF0b3JQb3J0KGVtdWxhdG9yLnBvcnQpO1xuICAgICAgY29uc3QgcnVubmluZ0FWRE5hbWUgPSBhd2FpdCB0aGlzLmV4ZWNFbXVDb25zb2xlQ29tbWFuZChbJ2F2ZCcsICduYW1lJ10sIHtcbiAgICAgICAgcG9ydDogZW11bGF0b3IucG9ydCxcbiAgICAgICAgZXhlY1RpbWVvdXQ6IDUwMDAsXG4gICAgICAgIGNvbm5UaW1lb3V0OiAxMDAwLFxuICAgICAgfSk7XG4gICAgICBpZiAoXy50b0xvd2VyKGF2ZE5hbWUpID09PSBfLnRvTG93ZXIocnVubmluZ0FWRE5hbWUudHJpbSgpKSkge1xuICAgICAgICBsb2cuZGVidWcoYEZvdW5kIGVtdWxhdG9yICcke2F2ZE5hbWV9JyBvbiBwb3J0ICR7ZW11bGF0b3IucG9ydH1gKTtcbiAgICAgICAgdGhpcy5zZXREZXZpY2VJZChlbXVsYXRvci51ZGlkKTtcbiAgICAgICAgcmV0dXJuIGVtdWxhdG9yO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2cuZGVidWcoYEVtdWxhdG9yICcke2F2ZE5hbWV9JyBub3QgcnVubmluZ2ApO1xuICAgIHJldHVybiBudWxsO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIEFWRC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgb2JqZWN0IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF2ZE5hbWUgLSBFbXVsYXRvciBuYW1lLlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRNcyBbMjAwMDBdIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gd2FpdCB1bnRpbCBhdCBsZWFzdCBvbmUgcnVubmluZyBBVkQgb2JqZWN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBkZXRlY3RlZC5cbiAqIEByZXR1cm4gez9EZXZpY2V9IEN1cnJlbnRseSBydW5uaW5nIGVtdWxhdG9yIG9yIF9udWxsXy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyBkZXZpY2UgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIHRoZSB0aW1lb3V0LlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRSdW5uaW5nQVZEV2l0aFJldHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0UnVubmluZ0FWRFdpdGhSZXRyeSAoYXZkTmFtZSwgdGltZW91dE1zID0gMjAwMDApIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRSdW5uaW5nQVZEKGF2ZE5hbWUucmVwbGFjZSgnQCcsICcnKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhlLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0TXMsXG4gICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIEFWRCB3aXRoIHJldHJ5LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2h1dGRvd24gYWxsIHJ1bm5pbmcgZW11bGF0b3JzIGJ5IGtpbGxpbmcgdGhlaXIgcHJvY2Vzc2VzLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBraWxsaW5nIHRvb2wgcmV0dXJuZWQgbm9uLXplcm8gcmV0dXJuIGNvZGUuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmtpbGxBbGxFbXVsYXRvcnMgPSBhc3luYyBmdW5jdGlvbiBraWxsQWxsRW11bGF0b3JzICgpIHtcbiAgbGV0IGNtZCwgYXJncztcbiAgaWYgKHN5c3RlbS5pc1dpbmRvd3MoKSkge1xuICAgIGNtZCA9ICdUQVNLS0lMTCc7XG4gICAgYXJncyA9IFsnVEFTS0tJTEwnLCAnL0lNJywgJ2VtdWxhdG9yLmV4ZSddO1xuICB9IGVsc2Uge1xuICAgIGNtZCA9ICcvdXNyL2Jpbi9raWxsYWxsJztcbiAgICBhcmdzID0gWyctbScsICdlbXVsYXRvcionXTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoY21kLCBhcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Iga2lsbGluZyBlbXVsYXRvcnMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBLaWxsIGVtdWxhdG9yIHdpdGggdGhlIGdpdmVuIG5hbWUuIE5vIGVycm9yXG4gKiBpcyB0aHJvd24gaXMgZ2l2ZW4gYXZkIGRvZXMgbm90IGV4aXN0L2lzIG5vdCBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gYXZkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBlbXVsYXRvciB0byBiZSBraWxsZWQuIElmIGVtcHR5LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZW11bGF0b3Igd2lsbCBiZSBraWxsZWQuXG4gKiBAcGFyYW0gez9udW1iZXJ9IHRpbWVvdXQgWzYwMDAwXSAtIFRoZSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGJlZm9yZSB0aHJvd2luZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBleGNlcHRpb24gYWJvdXQgdW5zdWNjZXNzZnVsIGtpbGxpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgZW11bGF0b3Igd2FzIGtpbGxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgYnkga2lsbGluZyB0aGUgZW11bGF0b3JcbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMua2lsbEVtdWxhdG9yID0gYXN5bmMgZnVuY3Rpb24ga2lsbEVtdWxhdG9yIChhdmROYW1lID0gbnVsbCwgdGltZW91dCA9IDYwMDAwKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGF2ZE5hbWUpKSB7XG4gICAgbG9nLmRlYnVnKGBLaWxsaW5nIGF2ZCAnJHthdmROYW1lfSdgKTtcbiAgICBjb25zdCBkZXZpY2UgPSBhd2FpdCB0aGlzLmdldFJ1bm5pbmdBVkQoYXZkTmFtZSk7XG4gICAgaWYgKCFkZXZpY2UpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBhdmQgd2l0aCBuYW1lICcke2F2ZE5hbWV9JyBydW5uaW5nLiBTa2lwcGluZyBraWxsIHN0ZXAuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGtpbGxpbmcgdGhlIGN1cnJlbnQgYXZkXG4gICAgbG9nLmRlYnVnKGBLaWxsaW5nIGF2ZCB3aXRoIGlkICcke3RoaXMuY3VyRGV2aWNlSWR9J2ApO1xuICAgIGlmICghYXdhaXQgdGhpcy5pc0VtdWxhdG9yQ29ubmVjdGVkKCkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgRW11bGF0b3Igd2l0aCBpZCAnJHt0aGlzLmN1ckRldmljZUlkfScgbm90IGNvbm5lY3RlZC4gU2tpcHBpbmcga2lsbCBzdGVwYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2VtdScsICdraWxsJ10pO1xuICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHt0aW1lb3V0fW1zIHVudGlsIHRoZSBlbXVsYXRvciAnJHthdmROYW1lID8gYXZkTmFtZSA6IHRoaXMuY3VyRGV2aWNlSWR9JyBpcyBraWxsZWRgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1dGlsLmhhc1ZhbHVlKGF2ZE5hbWUpXG4gICAgICAgICAgPyAhYXdhaXQgdGhpcy5nZXRSdW5uaW5nQVZEKGF2ZE5hbWUpXG4gICAgICAgICAgOiAhYXdhaXQgdGhpcy5pc0VtdWxhdG9yQ29ubmVjdGVkKCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0LFxuICAgICAgaW50ZXJ2YWxNczogMjAwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGVtdWxhdG9yICcke2F2ZE5hbWUgPyBhdmROYW1lIDogdGhpcy5jdXJEZXZpY2VJZH0nIGlzIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgYmVpbmcga2lsbGVkICR7dGltZW91dH1tcyBhZ29gKTtcbiAgfVxuICBsb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IGtpbGxlZCB0aGUgJyR7YXZkTmFtZSA/IGF2ZE5hbWUgOiB0aGlzLmN1ckRldmljZUlkfScgZW11bGF0b3JgKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEF2ZExhdW5jaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfEFycmF5PHN0cmluZz59IGFyZ3MgQWRkaXRpb25hbCBlbXVsYXRvciBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4gKiBAcHJvcGVydHkge09iamVjdH0gZW52IEFkZGl0aW9uYWwgZW11bGF0b3IgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbGFuZ3VhZ2UgRW11bGF0b3Igc3lzdGVtIGxhbmd1YWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY291bnRyeSBFbXVsYXRvciBzeXN0ZW0gY291bnRyeVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxhdW5jaFRpbWVvdXQgWzYwMDAwXSBFbXVsYXRvciBzdGFydHVwIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmVhZHlUaW1lb3V0IFs2MDAwMF0gVGhlIG1heGltdW0gcGVyaW9kIG9mIHRpbWUgdG8gd2FpdCB1bnRpbCBFbXVsYXRvclxuICogaXMgcmVhZHkgZm9yIHVzYWdlIGluIG1pbGxpc2Vjb25kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHJldHJ5VGltZXMgWzFdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFydHVwIHJldHJpZXNcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IGFuIGVtdWxhdG9yIHdpdGggZ2l2ZW4gcGFyYW1ldGVycyBhbmQgd2FpdCB1bnRpbCBpdCBpcyBmdWxseSBzdGFydGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdmROYW1lIC0gVGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZW11bGF0b3IuXG4gKiBAcGFyYW0gez9BdmRMYXVuY2hPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7U3ViUHJvY2Vzc30gRW11bGF0b3Igc3VicHJvY2VzcyBpbnN0YW5jZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBlbXVsYXRvciBmYWlscyB0byBzdGFydCB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXQuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmxhdW5jaEFWRCA9IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEFWRCAoYXZkTmFtZSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcmdzID0gW10sXG4gICAgZW52ID0ge30sXG4gICAgbGFuZ3VhZ2UsXG4gICAgY291bnRyeSxcbiAgICBsYXVuY2hUaW1lb3V0ID0gNjAwMDAsXG4gICAgcmVhZHlUaW1lb3V0ID0gNjAwMDAsXG4gICAgcmV0cnlUaW1lcyA9IDEsXG4gIH0gPSBvcHRzO1xuICBsb2cuZGVidWcoYExhdW5jaGluZyBFbXVsYXRvciB3aXRoIEFWRCAke2F2ZE5hbWV9LCBsYXVuY2hUaW1lb3V0IGAgK1xuICAgICAgICAgICAgYCR7bGF1bmNoVGltZW91dH1tcyBhbmQgcmVhZHlUaW1lb3V0ICR7cmVhZHlUaW1lb3V0fW1zYCk7XG4gIGNvbnN0IGVtdWxhdG9yQmluYXJ5UGF0aCA9IGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnZW11bGF0b3InKTtcbiAgaWYgKGF2ZE5hbWVbMF0gPT09ICdAJykge1xuICAgIGF2ZE5hbWUgPSBhdmROYW1lLnN1YnN0cigxKTtcbiAgfVxuICBhd2FpdCB0aGlzLmNoZWNrQXZkRXhpc3QoYXZkTmFtZSk7XG5cbiAgY29uc3QgbGF1bmNoQXJncyA9IFsnLWF2ZCcsIGF2ZE5hbWVdO1xuICBsYXVuY2hBcmdzLnB1c2goLi4uKHRvQXZkTG9jYWxlQXJncyhsYW5ndWFnZSwgY291bnRyeSkpKTtcblxuICBsZXQgaXNEZWxheUFkYkZlYXR1cmVFbmFibGVkID0gZmFsc2U7XG4gIGlmICh0aGlzLmFsbG93RGVsYXlBZGIpIHtcbiAgICBjb25zdCB7cmV2aXNpb259ID0gYXdhaXQgdGhpcy5nZXRFbXVWZXJzaW9uSW5mbygpO1xuICAgIGlmIChyZXZpc2lvbiAmJiB1dGlsLmNvbXBhcmVWZXJzaW9ucyhyZXZpc2lvbiwgJz49JywgJzI5LjAuNycpKSB7XG4gICAgICAvLyBodHRwczovL2FuZHJvaWRzdHVkaW8uZ29vZ2xlYmxvZy5jb20vMjAxOS8wNS9lbXVsYXRvci0yOTA3LWNhbmFyeS5odG1sXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7dGFyZ2V0fSA9IGF3YWl0IHRoaXMuZ2V0RW11SW1hZ2VQcm9wZXJ0aWVzKGF2ZE5hbWUpO1xuICAgICAgICBjb25zdCBhcGlNYXRjaCA9IC9cXGQrLy5leGVjKHRhcmdldCk7XG4gICAgICAgIC8vIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLzE0MjUzMzM1NVxuICAgICAgICBpZiAoYXBpTWF0Y2ggJiYgcGFyc2VJbnQoYXBpTWF0Y2hbMF0sIDEwKSA+PSBNSU5fREVMQVlfQURCX0FQSV9MRVZFTCkge1xuICAgICAgICAgIGxhdW5jaEFyZ3MucHVzaCgnLWRlbGF5LWFkYicpO1xuICAgICAgICAgIGlzRGVsYXlBZGJGZWF0dXJlRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWN0dWFsIGltYWdlIEFQSSB2ZXJzaW9uIGlzIGJlbG93ICR7TUlOX0RFTEFZX0FEQl9BUElfTEVWRUx9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLmluZm8oYFRoZSAtZGVsYXktYWRiIGVtdWxhdG9yIHN0YXJ0dXAgZGV0ZWN0aW9uIGZlYXR1cmUgd2lsbCBub3QgYmUgZW5hYmxlZC4gYCArXG4gICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nLmluZm8oJ1RoZSAtZGVsYXktYWRiIGVtdWxhdG9yIHN0YXJ0dXAgZGV0ZWN0aW9uIGZlYXR1cmUgaGFzIGJlZW4gZXhwbGljaXRseSBkaXNhYmxlZCcpO1xuICB9XG5cbiAgaWYgKCFfLmlzRW1wdHkoYXJncykpIHtcbiAgICBsYXVuY2hBcmdzLnB1c2goLi4uKF8uaXNBcnJheShhcmdzKSA/IGFyZ3MgOiB1dGlsLnNoZWxsUGFyc2UoYCR7YXJnc31gKSkpO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBSdW5uaW5nICcke2VtdWxhdG9yQmluYXJ5UGF0aH0nIHdpdGggYXJnczogJHt1dGlsLnF1b3RlKGxhdW5jaEFyZ3MpfWApO1xuICBpZiAoIV8uaXNFbXB0eShlbnYpKSB7XG4gICAgbG9nLmRlYnVnKGBDdXN0b21pemVkIGVtdWxhdG9yIGVudmlyb25tZW50OiAke0pTT04uc3RyaW5naWZ5KGVudil9YCk7XG4gIH1cbiAgY29uc3QgcHJvYyA9IG5ldyBTdWJQcm9jZXNzKGVtdWxhdG9yQmluYXJ5UGF0aCwgbGF1bmNoQXJncywge1xuICAgIGVudjogT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYsIGVudiksXG4gIH0pO1xuICBhd2FpdCBwcm9jLnN0YXJ0KDApO1xuICBwcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICBmb3IgKGxldCBsaW5lIG9mIChzdGRvdXQgfHwgc3RkZXJyIHx8ICcnKS5zcGxpdCgnXFxuJykuZmlsdGVyKEJvb2xlYW4pKSB7XG4gICAgICBsb2cuaW5mbyhgW0FWRCBPVVRQVVRdICR7bGluZX1gKTtcbiAgICB9XG4gIH0pO1xuICBwcm9jLm9uKCdkaWUnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgbG9nLndhcm4oYEVtdWxhdG9yIGF2ZCAke2F2ZE5hbWV9IGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSR7c2lnbmFsID8gYCwgc2lnbmFsICR7c2lnbmFsfWAgOiAnJ31gKTtcbiAgfSk7XG4gIGF3YWl0IHJldHJ5KHJldHJ5VGltZXMsIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZ2V0UnVubmluZ0FWRFdpdGhSZXRyeShhdmROYW1lLCBsYXVuY2hUaW1lb3V0KSk7XG4gIC8vIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBkZXZpY2VJZCBhbHJlYWR5IGFzc2lnbmVkXG4gIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gIGlmIChpc0RlbGF5QWRiRmVhdHVyZUVuYWJsZWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnd2FpdC1mb3ItZGV2aWNlJ10sIHt0aW1lb3V0OiByZWFkeVRpbWVvdXR9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2F2ZE5hbWV9JyBFbXVsYXRvciBoYXMgZmFpbGVkIHRvIGJvb3Q6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICBhd2FpdCB0aGlzLndhaXRGb3JFbXVsYXRvclJlYWR5KHJlYWR5VGltZW91dCAtIHRpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMpO1xuICByZXR1cm4gcHJvYztcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQmluYXJ5VmVyc2lvblxuICogQHByb3BlcnR5IHtTZW1WZXJ9IHZlcnNpb24gLSBUaGUgQURCIGJpbmFyeSB2ZXJzaW9uIG51bWJlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJ1aWxkIC0gVGhlIEFEQiBiaW5hcnkgYnVpbGQgbnVtYmVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBCcmlkZ2VWZXJzaW9uXG4gKiBAcHJvcGVydHkge1NlbVZlcn0gdmVyc2lvbiAtIFRoZSBBbmRyb2lkIERlYnVnIEJyaWRnZSB2ZXJzaW9uIG51bWJlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVmVyc2lvblxuICogQHByb3BlcnR5IHs/QmluYXJ5VmVyc2lvbn0gYmluYXJ5IFRoaXMgdmVyc2lvbiBudW1iZXIgbWlnaHQgbm90IGJlXG4gKiBiZSBwcmVzZW50IGZvciBvbGRlciBBREIgcmVsZWFzZXMuXG4gKiBAcHJvcGVydHkge0JyaWRnZVZlcnNpb259IGJyaWRnZVxuICovXG5cbi8qKlxuICogR2V0IHRoZSBhZGIgdmVyc2lvbi4gVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyBjYWNoZWQuXG4gKlxuICogQHJldHVybiB7VmVyc2lvbn1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcGFyc2UgYWRiIGJpbmFyeSB2ZXJzaW9uLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRWZXJzaW9uID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKCkge1xuICBsZXQgc3Rkb3V0O1xuICB0cnkge1xuICAgIHN0ZG91dCA9IGF3YWl0IHRoaXMuYWRiRXhlYygndmVyc2lvbicpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGFkYiB2ZXJzaW9uOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBjb25zdCBiaW5hcnlWZXJzaW9uTWF0Y2ggPSBCSU5BUllfVkVSU0lPTl9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKGJpbmFyeVZlcnNpb25NYXRjaCkge1xuICAgIHJlc3VsdC5iaW5hcnkgPSB7XG4gICAgICB2ZXJzaW9uOiBzZW12ZXIuY29lcmNlKGJpbmFyeVZlcnNpb25NYXRjaFsxXSksXG4gICAgICBidWlsZDogcGFyc2VJbnQoYmluYXJ5VmVyc2lvbk1hdGNoWzJdLCAxMCksXG4gICAgfTtcbiAgfVxuICBjb25zdCBicmlkZ2VWZXJzaW9uTWF0Y2ggPSBCUklER0VfVkVSU0lPTl9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKGJyaWRnZVZlcnNpb25NYXRjaCkge1xuICAgIHJlc3VsdC5icmlkZ2UgPSB7XG4gICAgICB2ZXJzaW9uOiBzZW12ZXIuY29lcmNlKGJyaWRnZVZlcnNpb25NYXRjaFsxXSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZW11bGF0b3IgaXMgcmVhZHkgdG8gYWNjZXB0IGZ1cnRoZXIgY29tbWFuZHMgKGJvb3RpbmcgY29tcGxldGVkKS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGVtdWxhdG9yIGlzIG5vdCByZWFkeSB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXQuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLndhaXRGb3JFbXVsYXRvclJlYWR5ID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckVtdWxhdG9yUmVhZHkgKHRpbWVvdXRNcyA9IDIwMDAwKSB7XG4gIGNvbnN0IHJlcXVpcmVkU2VydmljZXNSZSA9IFsvXFxiYWN0aXZpdHk6LywgL1xcYnBhY2thZ2U6L107XG4gIGxldCBzZXJ2aWNlcztcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlcnZpY2VzID0gYXdhaXQgdGhpcy5zaGVsbChbJ3NlcnZpY2UnLCAnbGlzdCddKTtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVkU2VydmljZXNSZS5ldmVyeSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNlcnZpY2VzKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBXYWl0aW5nIGZvciBlbXVsYXRvciBzdGFydHVwLiBJbnRlcm1lZGlhdGUgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyxcbiAgICAgIGludGVydmFsTXM6IDMwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoc2VydmljZXMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUmVjZW50IHNlcnZpY2VzOlxcbiR7c2VydmljZXN9YCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgRW11bGF0b3IgaXMgbm90IHJlYWR5IHdpdGhpbiAke3RpbWVvdXRNc31tc2ApO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyByZWFkeSB0byBhY2NlcHQgZnVydGhlciBjb21tYW5kcyAoYm9vdGluZyBjb21wbGV0ZWQpLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcHBEZXZpY2VSZWFkeVRpbWVvdXQgWzMwXSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGRldmljZSBpcyBub3QgcmVhZHkgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy53YWl0Rm9yRGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckRldmljZSAoYXBwRGV2aWNlUmVhZHlUaW1lb3V0ID0gMzApIHtcbiAgdGhpcy5hcHBEZXZpY2VSZWFkeVRpbWVvdXQgPSBhcHBEZXZpY2VSZWFkeVRpbWVvdXQ7XG4gIGNvbnN0IHJldHJpZXMgPSAzO1xuICBjb25zdCB0aW1lb3V0ID0gcGFyc2VJbnQodGhpcy5hcHBEZXZpY2VSZWFkeVRpbWVvdXQsIDEwKSAqIDEwMDAgLyByZXRyaWVzO1xuICBhd2FpdCByZXRyeShyZXRyaWVzLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiRXhlYygnd2FpdC1mb3ItZGV2aWNlJywge3RpbWVvdXR9KTtcbiAgICAgIGF3YWl0IHRoaXMucGluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2FpdGluZyBmb3IgdGhlIGRldmljZSB0byBiZSBhdmFpbGFibGUuIE9yaWdpbmFsIGVycm9yOiAnJHtlLm1lc3NhZ2V9J2ApO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIFJlYm9vdCB0aGUgY3VycmVudCBkZXZpY2UgYW5kIHdhaXQgdW50aWwgaXQgaXMgY29tcGxldGVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFtERUZBVUxUX0FEQl9SRUJPT1RfUkVUUklFU10gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVib290IHJldHJpZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGRldmljZSBmYWlsZWQgdG8gcmVib290IGFuZCBudW1iZXIgb2YgcmV0cmllcyBpcyBleGNlZWRlZC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMucmVib290ID0gYXN5bmMgZnVuY3Rpb24gcmVib290IChyZXRyaWVzID0gREVGQVVMVF9BREJfUkVCT09UX1JFVFJJRVMpIHtcbiAgLy8gR2V0IHJvb3QgYWNjZXNzIHNvIHdlIGNhbiBydW4gdGhlIG5leHQgc2hlbGwgY29tbWFuZHMgd2hpY2ggcmVxdWlyZSByb290IGFjY2Vzc1xuICBjb25zdCB7IHdhc0FscmVhZHlSb290ZWQgfSA9IGF3YWl0IHRoaXMucm9vdCgpO1xuICB0cnkge1xuICAgIC8vIFN0b3AgYW5kIHJlLXN0YXJ0IHRoZSBkZXZpY2VcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnc3RvcCddKTtcbiAgICBhd2FpdCBCLmRlbGF5KDIwMDApOyAvLyBsZXQgdGhlIGVtdSBmaW5pc2ggc3RvcHBpbmc7XG4gICAgYXdhaXQgdGhpcy5zZXREZXZpY2VQcm9wZXJ0eSgnc3lzLmJvb3RfY29tcGxldGVkJywgMCwge1xuICAgICAgcHJpdmlsZWdlZDogZmFsc2UgLy8gbm8gbmVlZCB0byBzZXQgcHJpdmlsZWdlZCB0cnVlIGJlY2F1c2UgZGV2aWNlIGFscmVhZHkgcm9vdGVkXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3N0YXJ0J10pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3Qge21lc3NhZ2V9ID0gZTtcblxuICAgIC8vIHByb3ZpZGUgYSBoZWxwZnVsIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHJlYXNvbiByZWJvb3QgZmFpbGVkIHdhcyBiZWNhdXNlIEFEQiBjb3VsZG4ndCBnYWluIHJvb3QgYWNjZXNzXG4gICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ211c3QgYmUgcm9vdCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZWJvb3QgZGV2aWNlLiBSZWJvb3RpbmcgcmVxdWlyZXMgcm9vdCBhY2Nlc3MgYW5kIGAgK1xuICAgICAgICBgYXR0ZW1wdCB0byBnZXQgcm9vdCBhY2Nlc3Mgb24gZGV2aWNlIGZhaWxlZCB3aXRoIGVycm9yOiAnJHttZXNzYWdlfSdgKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZXR1cm4gcm9vdCBzdGF0ZSB0byB3aGF0IGl0IHdhcyBiZWZvcmVcbiAgICBpZiAoIXdhc0FscmVhZHlSb290ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMudW5yb290KCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgIGlmICgoYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgnc3lzLmJvb3RfY29tcGxldGVkJykpID09PSAnMScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGUgc3RhY2sgdHJhY2UsIHNvIG5vIGxvZy5lcnJvckFuZFRocm93XG4gICAgY29uc3QgbXNnID0gYFJlYm9vdCBpcyBub3QgY29tcGxldGVkIGFmdGVyICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYDtcbiAgICBsb2cuZGVidWcobXNnKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IHJvb3RSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNTdWNjZXNzZnVsIFRydWUgaWYgdGhlIGNhbGwgdG8gcm9vdC91bnJvb3Qgd2FzIHN1Y2Nlc3NmdWxcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2FzQWxyZWFkeVJvb3RlZCBUcnVlIGlmIHRoZSBkZXZpY2Ugd2FzIGFscmVhZHkgcm9vdGVkXG4gKi9cblxuLyoqXG4gKiBTd2l0Y2ggYWRiIHNlcnZlciByb290IHByaXZpbGVnZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRWxldmF0ZWQgLSBTaG91bGQgd2UgZWxldmF0ZSB0byB0byByb290IG9yIHVucm9vdD8gKGRlZmF1bHQgdHJ1ZSlcbiAqIEByZXR1cm4ge3Jvb3RSZXN1bHR9XG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmNoYW5nZVVzZXJQcml2aWxlZ2VzID0gYXN5bmMgZnVuY3Rpb24gY2hhbmdlVXNlclByaXZpbGVnZXMgKGlzRWxldmF0ZWQpIHtcbiAgY29uc3QgY21kID0gaXNFbGV2YXRlZCA/ICdyb290JyA6ICd1bnJvb3QnO1xuXG4gIGNvbnN0IHJldHJ5SWZPZmZsaW5lID0gYXN5bmMgKGNtZEZ1bmMpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNtZEZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIENoZWNrIHRoZSBvdXRwdXQgb2YgdGhlIHN0ZEVyciB0byBzZWUgaWYgdGhlcmUncyBhbnkgY2x1ZXMgdGhhdCBzaG93IHRoYXQgdGhlIGRldmljZSB3ZW50IG9mZmxpbmVcbiAgICAgIC8vIGFuZCBpZiBpdCBkaWQgZ28gb2ZmbGluZSwgcmVzdGFydCBBREJcbiAgICAgIGlmIChbJ2Nsb3NlZCcsICdkZXZpY2Ugb2ZmbGluZScsICd0aW1lb3V0IGV4cGlyZWQnXVxuICAgICAgICAgIC5zb21lKCh4KSA9PiAoZXJyLnN0ZGVyciB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh4KSkpIHtcbiAgICAgICAgbG9nLndhcm4oYEF0dGVtcHQgdG8gJHtjbWR9IGNhdXNlZCBBREIgdG8gdGhpbmsgdGhlIGRldmljZSB3ZW50IG9mZmxpbmVgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlY29ubmVjdCgpO1xuICAgICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgY21kRnVuYygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBJZiBpdCdzIGFscmVhZHkgcm9vdGVkLCBvdXIgam9iIGlzIGRvbmUuIE5vIG5lZWQgdG8gcm9vdCBpdCBhZ2Fpbi5cbiAgY29uc3QgaXNSb290ID0gYXdhaXQgcmV0cnlJZk9mZmxpbmUoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1Jvb3QoKSk7XG4gIGlmICgoaXNSb290ICYmIGlzRWxldmF0ZWQpIHx8ICghaXNSb290ICYmICFpc0VsZXZhdGVkKSkge1xuICAgIHJldHVybiB7aXNTdWNjZXNzZnVsOiB0cnVlLCB3YXNBbHJlYWR5Um9vdGVkOiBpc1Jvb3R9O1xuICB9XG5cbiAgbGV0IHdhc0FscmVhZHlSb290ZWQgPSBpc1Jvb3Q7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCByZXRyeUlmT2ZmbGluZShhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoW2NtZF0pKTtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcblxuICAgIC8vIG9uIHJlYWwgZGV2aWNlcyBpbiBzb21lIHNpdHVhdGlvbnMgd2UgZ2V0IGFuIGVycm9yIGluIHRoZSBzdGRvdXRcbiAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICBpZiAoc3Rkb3V0LmluY2x1ZGVzKCdhZGJkIGNhbm5vdCBydW4gYXMgcm9vdCcpKSB7XG4gICAgICAgIHJldHVybiB7aXNTdWNjZXNzZnVsOiBmYWxzZSwgd2FzQWxyZWFkeVJvb3RlZH07XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgZGV2aWNlIHdhcyBhbHJlYWR5IHJvb3RlZCwgcmV0dXJuIHRoYXQgaW4gdGhlIHJlc3VsdFxuICAgICAgaWYgKHN0ZG91dC5pbmNsdWRlcygnYWxyZWFkeSBydW5uaW5nIGFzIHJvb3QnKSkge1xuICAgICAgICB3YXNBbHJlYWR5Um9vdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtpc1N1Y2Nlc3NmdWw6IHRydWUsIHdhc0FscmVhZHlSb290ZWR9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zdCB7c3RkZXJyID0gJycsIG1lc3NhZ2V9ID0gZXJyO1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gJHtjbWR9IGFkYiBkYWVtb24uIE9yaWdpbmFsIGVycm9yOiAnJHttZXNzYWdlfScuIFN0ZGVycjogJyR7c3RkZXJyfScuIENvbnRpbnVpbmcuYCk7XG4gICAgcmV0dXJuIHtpc1N1Y2Nlc3NmdWw6IGZhbHNlLCB3YXNBbHJlYWR5Um9vdGVkfTtcbiAgfVxufTtcblxuLyoqXG4gKiBTd2l0Y2ggYWRiIHNlcnZlciB0byByb290IG1vZGVcbiAqIEByZXR1cm4ge3Jvb3RSZXN1bHR9XG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLnJvb3QgPSBhc3luYyBmdW5jdGlvbiByb290ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbmdlVXNlclByaXZpbGVnZXModHJ1ZSk7XG59O1xuXG4vKipcbiAqIFN3aXRjaCBhZGIgc2VydmVyIHRvIG5vbi1yb290IG1vZGUuXG4gKlxuICogQHJldHVybiB7cm9vdFJlc3VsdH1cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMudW5yb290ID0gYXN5bmMgZnVuY3Rpb24gdW5yb290ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbmdlVXNlclByaXZpbGVnZXMoZmFsc2UpO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGlzIHJvb3RcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB1c2VyIGlzIHJvb3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaWRlbnRpZnlpbmdcbiAqIHRoZSB1c2VyLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5pc1Jvb3QgPSBhc3luYyBmdW5jdGlvbiBpc1Jvb3QgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGwoWyd3aG9hbWknXSkpLnRyaW0oKSA9PT0gJ3Jvb3QnO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhIHJlbW90ZSBwYXRoIGV4aXN0cyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcmVtb3RlIHBhdGggdG8gdmVyaWZ5LlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcGF0aCBleGlzdHMgb24gdGhlIGRldmljZS5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuZmlsZUV4aXN0cyA9IGFzeW5jIGZ1bmN0aW9uIGZpbGVFeGlzdHMgKHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgcGFzc0ZsYWcgPSAnX19QQVNTX18nO1xuICBjb25zdCBjaGVja0NtZCA9IGBbIC1lICcke3JlbW90ZVBhdGgucmVwbGFjZSgvJy9nLCBgXFxcXCdgKX0nIF0gJiYgZWNobyAke3Bhc3NGbGFnfWA7XG4gIHRyeSB7XG4gICAgcmV0dXJuIF8uaW5jbHVkZXMoYXdhaXQgdGhpcy5zaGVsbChbY2hlY2tDbWRdKSwgcGFzc0ZsYWcpO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBvdXRwdXQgb2YgX2xzXyBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSByZW1vdGUgcGF0aCAodGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBfbHNfIGNvbW1hbmQpLlxuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gb3B0cyBbW11dIC0gQWRkaXRpb25hbCBfbHNfIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIF9sc18gb3V0cHV0IGFzIGFuIGFycmF5IG9mIHNwbGl0IGxpbmVzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIEFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkIG9mIHRoZSBnaXZlbiBfcmVtb3RlUGF0aF9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBleGlzdC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMubHMgPSBhc3luYyBmdW5jdGlvbiBscyAocmVtb3RlUGF0aCwgb3B0cyA9IFtdKSB7XG4gIHRyeSB7XG4gICAgbGV0IGFyZ3MgPSBbJ2xzJywgLi4ub3B0cywgcmVtb3RlUGF0aF07XG4gICAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gICAgbGV0IGxpbmVzID0gc3Rkb3V0LnNwbGl0KCdcXG4nKTtcbiAgICByZXR1cm4gbGluZXMubWFwKChsKSA9PiBsLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5maWx0ZXIoKGwpID0+IGwuaW5kZXhPZignTm8gc3VjaCBmaWxlJykgPT09IC0xKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5tZXNzYWdlLmluZGV4T2YoJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgcGFydGljdWxhciBmaWxlIGxvY2F0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHJlbW90ZSBwYXRoIHRvIHRoZSBmaWxlLlxuICogQHJldHVybiB7bnVtYmVyfSBGaWxlIHNpemUgaW4gYnl0ZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGZpbGUuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmZpbGVTaXplID0gYXN5bmMgZnVuY3Rpb24gZmlsZVNpemUgKHJlbW90ZVBhdGgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMubHMocmVtb3RlUGF0aCwgWyctbGEnXSk7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZW1vdGUgcGF0aCBpcyBub3QgYSBmaWxlYCk7XG4gICAgfVxuICAgIC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvZk9zNFA0LzhcbiAgICBjb25zdCBtYXRjaCA9IC9bcnd4c1N0VFxcLStdezEwfVtcXHNcXGRdKlxcc1teXFxzXStcXHMrW15cXHNdK1xccysoXFxkKykvLmV4ZWMoZmlsZXNbMF0pO1xuICAgIGlmICghbWF0Y2ggfHwgXy5pc05hTihwYXJzZUludChtYXRjaFsxXSwgMTApKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2Ugc2l6ZSBmcm9tIGxpc3Qgb3V0cHV0OiAnJHtmaWxlc1swXX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBnZXQgZmlsZSBzaXplIGZvciAnJHtyZW1vdGVQYXRofSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIGdpdmVuIGNlcnRpZmljYXRlIG9uIGEgcm9vdGVkIHJlYWwgZGV2aWNlIG9yXG4gKiBhbiBlbXVsYXRvci4gVGhlIGVtdWxhdG9yIG11c3QgYmUgZXhlY3V0ZWQgd2l0aCBgLXdyaXRhYmxlLXN5c3RlbWBcbiAqIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIGFkYiBkYWVtb24gc2hvdWxkIGJlIHJ1bm5pbmcgaW4gcm9vdFxuICogbW9kZSBmb3IgdGhpcyBtZXRob2QgdG8gd29yayBwcm9wZXJseS4gVGhlIG1ldGhvZCBhbHNvIHJlcXVpcmVzXG4gKiBvcGVuc3NsIHRvb2wgdG8gYmUgYXZhaWxhYmxlIG9uIHRoZSBkZXN0aW5hdGlvbiBzeXN0ZW0uXG4gKiBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMDk2NFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIHRvcGljXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8c3RyaW5nfSBjZXJ0IC0gYmFzZTY0LWRlY29kZWQgY29udGVudCBvZiB0aGUgYWN0dWFsIGNlcnRpZmljYXRlXG4gKiByZXByZXNlbnRlZCBhcyBhIHN0cmluZyBvciBhIGJ1ZmZlclxuICogQHRocm93cyB7RXJyb3J9IElmIG9wZW5zc2wgdG9vbCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBkZXN0aW5hdGlvbiBzeXN0ZW1cbiAqIG9yIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBpbnN0YWxsaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5pbnN0YWxsTWl0bUNlcnRpZmljYXRlID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE1pdG1DZXJ0aWZpY2F0ZSAoY2VydCkge1xuICBjb25zdCBvcGVuU3NsID0gYXdhaXQgZ2V0T3BlblNzbEZvck9zKCk7XG5cbiAgaWYgKCFfLmlzQnVmZmVyKGNlcnQpKSB7XG4gICAgY2VydCA9IEJ1ZmZlci5mcm9tKGNlcnQsICdiYXNlNjQnKTtcbiAgfVxuXG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzcmNDZXJ0ID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsICdzb3VyY2UuY2VyJyk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHNyY0NlcnQsIGNlcnQpO1xuICAgIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMob3BlblNzbCwgWyd4NTA5JywgJy1ub291dCcsICctaGFzaCcsICctaW4nLCBzcmNDZXJ0XSk7XG4gICAgY29uc3QgY2VydEhhc2ggPSBzdGRvdXQudHJpbSgpO1xuICAgIGxvZy5kZWJ1ZyhgR290IGNlcnRpZmljYXRlIGhhc2g6ICR7Y2VydEhhc2h9YCk7XG4gICAgbG9nLmRlYnVnKCdQcmVwYXJpbmcgY2VydGlmaWNhdGUgY29udGVudCcpO1xuICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMob3BlblNzbCwgWyd4NTA5JywgJy1pbicsIHNyY0NlcnRdLCB7aXNCdWZmZXI6IHRydWV9KSk7XG4gICAgbGV0IGRzdENlcnRDb250ZW50ID0gc3Rkb3V0O1xuICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMob3BlblNzbCwgWyd4NTA5JyxcbiAgICAgICctaW4nLCBzcmNDZXJ0LFxuICAgICAgJy10ZXh0JyxcbiAgICAgICctZmluZ2VycHJpbnQnLFxuICAgICAgJy1ub291dCddLCB7aXNCdWZmZXI6IHRydWV9KSk7XG4gICAgZHN0Q2VydENvbnRlbnQgPSBCdWZmZXIuY29uY2F0KFtkc3RDZXJ0Q29udGVudCwgc3Rkb3V0XSk7XG4gICAgY29uc3QgZHN0Q2VydCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBgJHtjZXJ0SGFzaH0uMGApO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkc3RDZXJ0LCBkc3RDZXJ0Q29udGVudCk7XG4gICAgbG9nLmRlYnVnKCdSZW1vdW50aW5nIC9zeXN0ZW0gaW4gcncgbW9kZScpO1xuICAgIC8vIFNvbWV0aW1lcyBlbXVsYXRvciByZWJvb3QgaXMgc3RpbGwgbm90IGZ1bGx5IGZpbmlzaGVkIG9uIHRoaXMgc3RhZ2UsIHNvIHJldHJ5XG4gICAgYXdhaXQgcmV0cnlJbnRlcnZhbCg1LCAyMDAwLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZW1vdW50J10pKTtcbiAgICBsb2cuZGVidWcoYFVwbG9hZGluZyB0aGUgZ2VuZXJhdGVkIGNlcnRpZmljYXRlIGZyb20gJyR7ZHN0Q2VydH0nIHRvICcke0NFUlRTX1JPT1R9J2ApO1xuICAgIGF3YWl0IHRoaXMucHVzaChkc3RDZXJ0LCBDRVJUU19ST09UKTtcbiAgICBsb2cuZGVidWcoJ1JlbW91bnRpbmcgL3N5c3RlbSB0byBjb25maXJtIGNoYW5nZXMnKTtcbiAgICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZW1vdW50J10pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbmplY3QgdGhlIGN1c3RvbSBjZXJ0aWZpY2F0ZS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgY2VydGlmaWNhdGUgcHJvcGVybHkgZW5jb2RlZCBpbnRvIGJhc2U2NC1zdHJpbmc/IGAgK1xuICAgICAgICAgICAgICAgICAgICBgRG8geW91IGhhdmUgcm9vdCBwZXJtaXNzaW9ucyBvbiB0aGUgZGV2aWNlPyBgICtcbiAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuLyoqXG4gKiBWZXJpZmllcyBpZiB0aGUgZ2l2ZW4gcm9vdCBjZXJ0aWZpY2F0ZSBpcyBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfHN0cmluZ30gY2VydCAtIGJhc2U2NC1kZWNvZGVkIGNvbnRlbnQgb2YgdGhlIGFjdHVhbCBjZXJ0aWZpY2F0ZVxuICogcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgb3IgYSBidWZmZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBvcGVuc3NsIHRvb2wgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgZGVzdGluYXRpb24gc3lzdGVtXG4gKiBvciBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hlY2tpbmcgdGhlIGNlcnRpZmljYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUgaXMgYWxyZWFkeSBpbnN0YWxsZWRcbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuaXNNaXRtQ2VydGlmaWNhdGVJbnN0YWxsZWQgPSBhc3luYyBmdW5jdGlvbiBpc01pdG1DZXJ0aWZpY2F0ZUluc3RhbGxlZCAoY2VydCkge1xuICBjb25zdCBvcGVuU3NsID0gYXdhaXQgZ2V0T3BlblNzbEZvck9zKCk7XG5cbiAgaWYgKCFfLmlzQnVmZmVyKGNlcnQpKSB7XG4gICAgY2VydCA9IEJ1ZmZlci5mcm9tKGNlcnQsICdiYXNlNjQnKTtcbiAgfVxuXG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgbGV0IGNlcnRIYXNoO1xuICB0cnkge1xuICAgIGNvbnN0IHRtcENlcnQgPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgJ3NvdXJjZS5jZXInKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodG1wQ2VydCwgY2VydCk7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKG9wZW5Tc2wsIFsneDUwOScsICctbm9vdXQnLCAnLWhhc2gnLCAnLWluJywgdG1wQ2VydF0pO1xuICAgIGNlcnRIYXNoID0gc3Rkb3V0LnRyaW0oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGNlcnRpZmljYXRlIGhhc2guIGAgK1xuICAgICAgICAgICAgICAgICAgICBgSXMgdGhlIGNlcnRpZmljYXRlIHByb3Blcmx5IGVuY29kZWQgaW50byBiYXNlNjQtc3RyaW5nPyBgICtcbiAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxuICBjb25zdCBkc3RQYXRoID0gcGF0aC5wb3NpeC5yZXNvbHZlKENFUlRTX1JPT1QsIGAke2NlcnRIYXNofS4wYCk7XG4gIGxvZy5kZWJ1ZyhgQ2hlY2tpbmcgaWYgdGhlIGNlcnRpZmljYXRlIGlzIGFscmVhZHkgaW5zdGFsbGVkIGF0ICcke2RzdFBhdGh9J2ApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5maWxlRXhpc3RzKGRzdFBhdGgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgc3lzdGVtQ2FsbE1ldGhvZHM7XG5leHBvcnQgeyBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQsIGdldEFuZHJvaWRCaW5hcnlQYXRoIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLElBQUlBLGlCQUFpQixHQUFHLEVBQXhCO0FBRUEsTUFBTUMsMEJBQTBCLEdBQUcsRUFBbkM7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxzQkFBOUI7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxDQUMvQiwrQkFEK0IsRUFFL0Isa0NBRitCLEVBRy9CLGlDQUgrQixDQUFqQztBQUtBLE1BQU1DLHNCQUFzQixHQUFHLDBCQUEvQjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLHlDQUEvQjtBQUNBLE1BQU1DLFVBQVUsR0FBRyw4QkFBbkI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxDQUN2QixnQkFEdUIsRUFFdkIsVUFGdUIsRUFHdkIsQ0FBQyxlQUFELEVBQWtCLFFBQWxC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
1064
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3Rvb2xzL3N5c3RlbS1jYWxscy5qcyIsIm5hbWVzIjpbInN5c3RlbUNhbGxNZXRob2RzIiwiREVGQVVMVF9BREJfUkVCT09UX1JFVFJJRVMiLCJMSU5LRVJfV0FSTklOR19SRUdFWFAiLCJBREJfUkVUUllfRVJST1JfUEFUVEVSTlMiLCJCSU5BUllfVkVSU0lPTl9QQVRURVJOIiwiQlJJREdFX1ZFUlNJT05fUEFUVEVSTiIsIkNFUlRTX1JPT1QiLCJTREtfQklOQVJZX1JPT1RTIiwiTUlOX0RFTEFZX0FEQl9BUElfTEVWRUwiLCJSRVFVSVJFRF9TRVJWSUNFUyIsImdldFNka0JpbmFyeVBhdGgiLCJiaW5hcnlOYW1lIiwiZ2V0QmluYXJ5RnJvbVNka1Jvb3QiLCJnZXRCaW5hcnlOYW1lRm9yT1MiLCJfIiwibWVtb2l6ZSIsImdldEJpbmFyeU5hbWVGb3JPU01lbW9yaXplIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiaW5jbHVkZXMiLCJwYXRoIiwiZXh0bmFtZSIsImJpbmFyaWVzIiwiZnVsbEJpbmFyeU5hbWUiLCJiaW5hcnlMb2NzIiwiZ2V0U2RrQmluYXJ5TG9jYXRpb25DYW5kaWRhdGVzIiwic2RrUm9vdCIsImJ1aWxkVG9vbHNEaXJzIiwiZ2V0QnVpbGRUb29sc0RpcnMiLCJidWlsZFRvb2xzVmVyc2lvbiIsImZpbHRlciIsIngiLCJiYXNlbmFtZSIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwicHVzaCIsImZsYXR0ZW4iLCJtYXAiLCJkaXIiLCJyZXNvbHZlIiwiYmluYXJ5TG9jIiwibG9jIiwiZnMiLCJleGlzdHMiLCJpc051bGwiLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0FycmF5IiwiZ2V0QW5kcm9pZEJpbmFyeVBhdGgiLCJnZXRTZGtSb290RnJvbUVudiIsImdldEJpbmFyeUZyb21QYXRoIiwid2hpY2giLCJlIiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsIm9wdHMiLCJkZWJ1ZyIsImFyZ3MiLCJleGVjdXRhYmxlIiwiZGVmYXVsdEFyZ3MiLCJ2ZXJib3NlIiwic3Rkb3V0IiwiZXhlYyIsIm1lc3NhZ2UiLCJsaXN0SGVhZGVyIiwic3RhcnRpbmdJbmRleCIsImluZGV4T2YiLCJzbGljZSIsImV4Y2x1ZGVkTGluZXMiLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiZGV2aWNlcyIsInNwbGl0IiwidHJpbSIsImxpbmUiLCJzb21lIiwidWRpZCIsInN0YXRlIiwiZGVzY3JpcHRpb24iLCJkZXZpY2UiLCJlbnRyeSIsImtleSIsInZhbHVlIiwiZ2V0RGV2aWNlc1dpdGhSZXRyeSIsInRpbWVvdXRNcyIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsImdldERldmljZXMiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsImxlbmd0aCIsImlnbiIsInJlY29ubmVjdCIsInJlc3RhcnRBZGIiLCJzbGVlcCIsInRhcmdldCIsImFkYkV4ZWMiLCJzdGRlcnIiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJraWxsU2VydmVyIiwiZXJyb3IiLCJhZGJQb3J0IiwiZXhjbHVzaXZlIiwicmVzZXRUZWxuZXRBdXRoVG9rZW4iLCJob21lRm9sZGVyUGF0aCIsInByb2Nlc3MiLCJlbnYiLCJwbGF0Zm9ybSIsIndhcm4iLCJkc3RQYXRoIiwid3JpdGVGaWxlIiwiYWRiRXhlY0VtdSIsImNtZCIsInZlcmlmeUVtdWxhdG9yQ29ubmVjdGVkIiwiaXNFeGVjTG9ja2VkIiwiRVhFQ19PVVRQVVRfRk9STUFUIiwiT2JqZWN0IiwiZnJlZXplIiwiU1RET1VUIiwiRlVMTCIsImNsb25lRGVlcCIsInRpbWVvdXQiLCJhZGJFeGVjVGltZW91dCIsIkRFRkFVTFRfQURCX0VYRUNfVElNRU9VVCIsInRpbWVvdXRDYXBOYW1lIiwib3V0cHV0Rm9ybWF0IiwiYWRiUmV0cmllZCIsImV4ZWNGdW5jIiwiZmluZCIsImFyZyIsInRlc3QiLCJ1dGlsIiwicXVvdGUiLCJqb2luIiwicmVwbGFjZSIsImVyclRleHQiLCJwIiwiY29kZSIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJOdW1iZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwiaW50ZXJ2YWxNcyIsInNoZWxsIiwicHJpdmlsZWdlZCIsImNtZEFyciIsImZ1bGxDbWQiLCJpc1Jvb3QiLCJjcmVhdGVTdWJQcm9jZXNzIiwiU3ViUHJvY2VzcyIsImdldEFkYlBhdGgiLCJnZXRBZGJTZXJ2ZXJQb3J0IiwiZ2V0RW11bGF0b3JQb3J0IiwiZW11bGF0b3JQb3J0IiwicG9ydCIsImdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmciLCJlbVN0ciIsInBvcnRQYXR0ZXJuIiwicGFyc2VJbnQiLCJnZXRDb25uZWN0ZWRFbXVsYXRvcnMiLCJlbXVsYXRvcnMiLCJwbHVyYWxpemUiLCJzZXRFbXVsYXRvclBvcnQiLCJlbVBvcnQiLCJzZXREZXZpY2VJZCIsImRldmljZUlkIiwiY3VyRGV2aWNlSWQiLCJhcmdzSGFzRGV2aWNlIiwic3BsaWNlIiwic2V0RGV2aWNlIiwiZGV2aWNlT2JqIiwiZ2V0UnVubmluZ0FWRCIsImF2ZE5hbWUiLCJlbXVsYXRvciIsInJ1bm5pbmdBVkROYW1lIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZXhlY1RpbWVvdXQiLCJjb25uVGltZW91dCIsInRvTG93ZXIiLCJnZXRSdW5uaW5nQVZEV2l0aFJldHJ5Iiwia2lsbEFsbEVtdWxhdG9ycyIsImtpbGxFbXVsYXRvciIsImhhc1ZhbHVlIiwiaXNFbXVsYXRvckNvbm5lY3RlZCIsImxhdW5jaEFWRCIsImxhbmd1YWdlIiwiY291bnRyeSIsImxhdW5jaFRpbWVvdXQiLCJyZWFkeVRpbWVvdXQiLCJyZXRyeVRpbWVzIiwiZW11bGF0b3JCaW5hcnlQYXRoIiwic3Vic3RyIiwiY2hlY2tBdmRFeGlzdCIsImxhdW5jaEFyZ3MiLCJ0b0F2ZExvY2FsZUFyZ3MiLCJpc0RlbGF5QWRiRmVhdHVyZUVuYWJsZWQiLCJhbGxvd0RlbGF5QWRiIiwicmV2aXNpb24iLCJnZXRFbXVWZXJzaW9uSW5mbyIsImNvbXBhcmVWZXJzaW9ucyIsImdldEVtdUltYWdlUHJvcGVydGllcyIsImFwaU1hdGNoIiwic2hlbGxQYXJzZSIsInByb2MiLCJhc3NpZ24iLCJvbiIsIkJvb2xlYW4iLCJzaWduYWwiLCJyZXRyeSIsIndhaXRGb3JFbXVsYXRvclJlYWR5IiwiZ2V0VmVyc2lvbiIsInJlc3VsdCIsImJpbmFyeVZlcnNpb25NYXRjaCIsImJpbmFyeSIsInZlcnNpb24iLCJzZW12ZXIiLCJjb2VyY2UiLCJidWlsZCIsImJyaWRnZVZlcnNpb25NYXRjaCIsImJyaWRnZSIsInJlcXVpcmVkU2VydmljZXNSZSIsIm5hbWUiLCJSZWdFeHAiLCJzZXJ2aWNlcyIsImV2ZXJ5IiwicGF0dGVybiIsImVyciIsIm1pc3NpbmdTZXJ2aWNlcyIsInppcCIsIndhaXRGb3JEZXZpY2UiLCJhcHBEZXZpY2VSZWFkeVRpbWVvdXQiLCJyZXRyaWVzIiwicGluZyIsInJlYm9vdCIsIndhc0FscmVhZHlSb290ZWQiLCJyb290IiwiQiIsImRlbGF5Iiwic2V0RGV2aWNlUHJvcGVydHkiLCJ1bnJvb3QiLCJyZXRyeUludGVydmFsIiwiZ2V0RGV2aWNlUHJvcGVydHkiLCJtc2ciLCJjaGFuZ2VVc2VyUHJpdmlsZWdlcyIsImlzRWxldmF0ZWQiLCJyZXRyeUlmT2ZmbGluZSIsImNtZEZ1bmMiLCJ0b0xvd2VyQ2FzZSIsImlzU3VjY2Vzc2Z1bCIsImZpbGVFeGlzdHMiLCJyZW1vdGVQYXRoIiwicGFzc0ZsYWciLCJjaGVja0NtZCIsImxzIiwibGluZXMiLCJsIiwiZmlsZVNpemUiLCJmaWxlcyIsIm1hdGNoIiwiaXNOYU4iLCJpbnN0YWxsTWl0bUNlcnRpZmljYXRlIiwiY2VydCIsIm9wZW5Tc2wiLCJnZXRPcGVuU3NsRm9yT3MiLCJpc0J1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJzcmNDZXJ0IiwiY2VydEhhc2giLCJkc3RDZXJ0Q29udGVudCIsImNvbmNhdCIsImRzdENlcnQiLCJyaW1yYWYiLCJpc01pdG1DZXJ0aWZpY2F0ZUluc3RhbGxlZCIsInRtcENlcnQiLCJwb3NpeCJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi90b29scy9zeXN0ZW0tY2FsbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCB1dGlsLCB0ZW1wRGlyLCB0aW1pbmcgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtcbiAgZ2V0QnVpbGRUb29sc0RpcnMsIHRvQXZkTG9jYWxlQXJncyxcbiAgZ2V0T3BlblNzbEZvck9zLCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQsIGdldFNka1Jvb3RGcm9tRW52XG59IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgZXhlYywgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBzbGVlcCwgcmV0cnksIHJldHJ5SW50ZXJ2YWwsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5cbmxldCBzeXN0ZW1DYWxsTWV0aG9kcyA9IHt9O1xuXG5jb25zdCBERUZBVUxUX0FEQl9SRUJPT1RfUkVUUklFUyA9IDkwO1xuY29uc3QgTElOS0VSX1dBUk5JTkdfUkVHRVhQID0gL15XQVJOSU5HOiBsaW5rZXIuKyQvbTtcbmNvbnN0IEFEQl9SRVRSWV9FUlJPUl9QQVRURVJOUyA9IFtcbiAgL3Byb3RvY29sIGZhdWx0IFxcKG5vIHN0YXR1c1xcKS9pLFxuICAvZXJyb3I6IGRldmljZSAoJy4rJyApP25vdCBmb3VuZC9pLFxuICAvZXJyb3I6IGRldmljZSBzdGlsbCBjb25uZWN0aW5nL2ksXG5dO1xuY29uc3QgQklOQVJZX1ZFUlNJT05fUEFUVEVSTiA9IC9eVmVyc2lvbiAoW1xcZC5dKyktKFxcZCspL207XG5jb25zdCBCUklER0VfVkVSU0lPTl9QQVRURVJOID0gL15BbmRyb2lkIERlYnVnIEJyaWRnZSB2ZXJzaW9uIChbXFxkLl0rKS9tO1xuY29uc3QgQ0VSVFNfUk9PVCA9ICcvc3lzdGVtL2V0Yy9zZWN1cml0eS9jYWNlcnRzJztcbmNvbnN0IFNES19CSU5BUllfUk9PVFMgPSBbXG4gICdwbGF0Zm9ybS10b29scycsXG4gICdlbXVsYXRvcicsXG4gIFsnY21kbGluZS10b29scycsICdsYXRlc3QnLCAnYmluJ10sXG4gICd0b29scycsXG4gIFsndG9vbHMnLCAnYmluJ10sXG4gICcuJyAvLyBBbGxvdyBjdXN0b20gc2RrUm9vdCB0byBzcGVjaWZ5IGZ1bGwgZm9sZGVyIHBhdGhcbl07XG5jb25zdCBNSU5fREVMQVlfQURCX0FQSV9MRVZFTCA9IDI4O1xuY29uc3QgUkVRVUlSRURfU0VSVklDRVMgPSBbJ2FjdGl2aXR5JywgJ3BhY2thZ2UnLCAnbW91bnQnXTtcblxuLyoqXG4gKiBSZXRyaWV2ZSBmdWxsIHBhdGggdG8gdGhlIGdpdmVuIGJpbmFyeS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluYXJ5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBiaW5hcnkuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byB0aGUgZ2l2ZW4gYmluYXJ5IGluY2x1ZGluZyBjdXJyZW50IFNESyByb290LlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRTZGtCaW5hcnlQYXRoID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2RrQmluYXJ5UGF0aCAoYmluYXJ5TmFtZSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRCaW5hcnlGcm9tU2RrUm9vdChiaW5hcnlOYW1lKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgZnVsbCBiaW5hcnkgbmFtZSBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBhcyBtZW1vdGl6ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluYXJ5TmFtZSAtIHNpbXBsZSBiaW5hcnkgbmFtZSwgZm9yIGV4YW1wbGUgJ2FuZHJvaWQnLlxuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgYmluYXJ5IG5hbWUgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLFxuICogICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSwgJ2FuZHJvaWQuYmF0JyBvbiBXaW5kb3dzLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRCaW5hcnlOYW1lRm9yT1MgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0QmluYXJ5TmFtZUZvck9TTWVtb3JpemUgKGJpbmFyeU5hbWUpIHtcbiAgcmV0dXJuIGdldEJpbmFyeU5hbWVGb3JPUyhiaW5hcnlOYW1lKTtcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlIGZ1bGwgYmluYXJ5IG5hbWUgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJpbmFyeU5hbWUgLSBzaW1wbGUgYmluYXJ5IG5hbWUsIGZvciBleGFtcGxlICdhbmRyb2lkJy5cbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGJpbmFyeSBuYW1lIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybSxcbiAqICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUsICdhbmRyb2lkLmJhdCcgb24gV2luZG93cy5cbiAqL1xuZnVuY3Rpb24gZ2V0QmluYXJ5TmFtZUZvck9TIChiaW5hcnlOYW1lKSB7XG4gIGlmICghc3lzdGVtLmlzV2luZG93cygpKSB7XG4gICAgcmV0dXJuIGJpbmFyeU5hbWU7XG4gIH1cblxuICBpZiAoWydhbmRyb2lkJywgJ2Fwa3NpZ25lcicsICdhcGthbmFseXplciddLmluY2x1ZGVzKGJpbmFyeU5hbWUpKSB7XG4gICAgcmV0dXJuIGAke2JpbmFyeU5hbWV9LmJhdGA7XG4gIH1cbiAgaWYgKCFwYXRoLmV4dG5hbWUoYmluYXJ5TmFtZSkpIHtcbiAgICByZXR1cm4gYCR7YmluYXJ5TmFtZX0uZXhlYDtcbiAgfVxuICByZXR1cm4gYmluYXJ5TmFtZTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSBmdWxsIHBhdGggdG8gdGhlIGdpdmVuIGJpbmFyeSBhbmQgY2FjaGVzIGl0IGludG8gYGJpbmFyaWVzYFxuICogcHJvcGVydHkgb2YgdGhlIGN1cnJlbnQgQURCIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5hcnlOYW1lIC0gU2ltcGxlIG5hbWUgb2YgYSBiaW5hcnkgZmlsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gRnVsbCBwYXRoIHRvIHRoZSBnaXZlbiBiaW5hcnkuIFRoZSBtZXRob2QgdHJpZXNcbiAqICAgICAgICAgICAgICAgICAgdG8gZW51bWVyYXRlIGFsbCB0aGUga25vd24gbG9jYXRpb25zIHdoZXJlIHRoZSBiaW5hcnlcbiAqICAgICAgICAgICAgICAgICAgbWlnaHQgYmUgbG9jYXRlZCBhbmQgc3RvcHMgdGhlIHNlYXJjaCBhcyBzb29uIGFzIHRoZSBmaXJzdFxuICogICAgICAgICAgICAgICAgICBtYXRjaCBpcyBmb3VuZCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGJpbmFyeSB3aXRoIGdpdmVuIG5hbWUgaXMgbm90IHByZXNlbnQgYXQgYW55XG4gKiAgICAgICAgICAgICAgICAgb2Yga25vd24gbG9jYXRpb25zIG9yIEFuZHJvaWQgU0RLIGlzIG5vdCBpbnN0YWxsZWQgb24gdGhlXG4gKiAgICAgICAgICAgICAgICAgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmdldEJpbmFyeUZyb21TZGtSb290ID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmluYXJ5RnJvbVNka1Jvb3QgKGJpbmFyeU5hbWUpIHtcbiAgaWYgKHRoaXMuYmluYXJpZXNbYmluYXJ5TmFtZV0pIHtcbiAgICByZXR1cm4gdGhpcy5iaW5hcmllc1tiaW5hcnlOYW1lXTtcbiAgfVxuICBjb25zdCBmdWxsQmluYXJ5TmFtZSA9IHRoaXMuZ2V0QmluYXJ5TmFtZUZvck9TKGJpbmFyeU5hbWUpO1xuICBjb25zdCBiaW5hcnlMb2NzID0gZ2V0U2RrQmluYXJ5TG9jYXRpb25DYW5kaWRhdGVzKHRoaXMuc2RrUm9vdCwgZnVsbEJpbmFyeU5hbWUpO1xuXG4gIC8vIGdldCBzdWJwYXRocyBmb3IgY3VycmVudGx5IGluc3RhbGxlZCBidWlsZCB0b29sIGRpcmVjdG9yaWVzXG4gIGxldCBidWlsZFRvb2xzRGlycyA9IGF3YWl0IGdldEJ1aWxkVG9vbHNEaXJzKHRoaXMuc2RrUm9vdCk7XG4gIGlmICh0aGlzLmJ1aWxkVG9vbHNWZXJzaW9uKSB7XG4gICAgYnVpbGRUb29sc0RpcnMgPSBidWlsZFRvb2xzRGlyc1xuICAgICAgLmZpbHRlcigoeCkgPT4gcGF0aC5iYXNlbmFtZSh4KSA9PT0gdGhpcy5idWlsZFRvb2xzVmVyc2lvbik7XG4gICAgaWYgKF8uaXNFbXB0eShidWlsZFRvb2xzRGlycykpIHtcbiAgICAgIGxvZy5pbmZvKGBGb3VuZCBubyBidWlsZCB0b29scyB3aG9zZSB2ZXJzaW9uIG1hdGNoZXMgdG8gJyR7dGhpcy5idWlsZFRvb2xzVmVyc2lvbn0nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGBVc2luZyBidWlsZCB0b29scyBhdCAnJHtidWlsZFRvb2xzRGlyc30nYCk7XG4gICAgfVxuICB9XG4gIGJpbmFyeUxvY3MucHVzaCguLi4oXy5mbGF0dGVuKGJ1aWxkVG9vbHNEaXJzXG4gICAgLm1hcCgoZGlyKSA9PiBbXG4gICAgICBwYXRoLnJlc29sdmUoZGlyLCBmdWxsQmluYXJ5TmFtZSksXG4gICAgICBwYXRoLnJlc29sdmUoZGlyLCAnbGliJywgZnVsbEJpbmFyeU5hbWUpLFxuICAgIF0pKVxuICApKTtcblxuICBsZXQgYmluYXJ5TG9jID0gbnVsbDtcbiAgZm9yIChjb25zdCBsb2Mgb2YgYmluYXJ5TG9jcykge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jKSkge1xuICAgICAgYmluYXJ5TG9jID0gbG9jO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChfLmlzTnVsbChiaW5hcnlMb2MpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCAnJHtmdWxsQmluYXJ5TmFtZX0nIGluICR7SlNPTi5zdHJpbmdpZnkoYmluYXJ5TG9jcyl9LiBgICtcbiAgICAgIGBEbyB5b3UgaGF2ZSBBbmRyb2lkIEJ1aWxkIFRvb2xzICR7dGhpcy5idWlsZFRvb2xzVmVyc2lvbiA/IGB2ICR7dGhpcy5idWlsZFRvb2xzVmVyc2lvbn0gYCA6ICcnfWAgK1xuICAgICAgYGluc3RhbGxlZCBhdCAnJHt0aGlzLnNka1Jvb3R9Jz9gKTtcbiAgfVxuICBsb2cuaW5mbyhgVXNpbmcgJyR7ZnVsbEJpbmFyeU5hbWV9JyBmcm9tICcke2JpbmFyeUxvY30nYCk7XG4gIHRoaXMuYmluYXJpZXNbYmluYXJ5TmFtZV0gPSBiaW5hcnlMb2M7XG4gIHJldHVybiBiaW5hcnlMb2M7XG59O1xuXG4vKipcbiAqICBSZXR1cm5zIHRoZSBBbmRyb2lkIGJpbmFyaWVzIGxvY2F0aW9uc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtSb290IFRoZSBwYXRoIHRvIEFuZHJvaWQgU0RLIHJvb3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gZnVsbEJpbmFyeU5hbWUgVGhlIG5hbWUgb2YgZnVsbCBiaW5hcnkgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIFNES19CSU5BUllfUk9PVFMgcGF0aHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNka1Jvb3QgYW5kIGZ1bGxCaW5hcnlOYW1lLlxuICovXG5mdW5jdGlvbiBnZXRTZGtCaW5hcnlMb2NhdGlvbkNhbmRpZGF0ZXMgKHNka1Jvb3QsIGZ1bGxCaW5hcnlOYW1lKSB7XG4gIHJldHVybiBTREtfQklOQVJZX1JPT1RTLm1hcCgoeCkgPT5cbiAgICBwYXRoLnJlc29sdmUoc2RrUm9vdCwgLi4uKF8uaXNBcnJheSh4KSA/IHggOiBbeF0pLCBmdWxsQmluYXJ5TmFtZSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIGZ1bGwgcGF0aCB0byB0aGUgZ2l2ZW4gYmluYXJ5LlxuICogVGhpcyBtZXRob2QgZG9lcyBub3QgaGF2ZSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluYXJ5TmFtZSAtIFNpbXBsZSBuYW1lIG9mIGEgYmluYXJ5IGZpbGUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gJ2FkYicsICdhbmRyb2lkJ1xuICogQHJldHVybiB7c3RyaW5nfSBGdWxsIHBhdGggdG8gdGhlIGdpdmVuIGJpbmFyeS4gVGhlIG1ldGhvZCB0cmllc1xuICogICAgICAgICAgICAgICAgICB0byBlbnVtZXJhdGUgYWxsIHRoZSBrbm93biBsb2NhdGlvbnMgd2hlcmUgdGhlIGJpbmFyeVxuICogICAgICAgICAgICAgICAgICBtaWdodCBiZSBsb2NhdGVkIGFuZCBzdG9wcyB0aGUgc2VhcmNoIGFzIHNvb24gYXMgdGhlIGZpcnN0XG4gKiAgICAgICAgICAgICAgICAgIG1hdGNoIGlzIGZvdW5kIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqICAgICAgICAgICAgICAgICAgZS5nLiAnL1BhdGgvVG8vQW5kcm9pZC9zZGsvcGxhdGZvcm0tdG9vbHMvYWRiJ1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBiaW5hcnkgd2l0aCBnaXZlbiBuYW1lIGlzIG5vdCBwcmVzZW50IGF0IGFueVxuICogICAgICAgICAgICAgICAgIG9mIGtub3duIGxvY2F0aW9ucyBvciBBbmRyb2lkIFNESyBpcyBub3QgaW5zdGFsbGVkIG9uIHRoZVxuICogICAgICAgICAgICAgICAgIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRyb2lkQmluYXJ5UGF0aCAoYmluYXJ5TmFtZSkge1xuICBjb25zdCBmdWxsQmluYXJ5TmFtZSA9IGdldEJpbmFyeU5hbWVGb3JPUyhiaW5hcnlOYW1lKTtcbiAgY29uc3Qgc2RrUm9vdCA9IGdldFNka1Jvb3RGcm9tRW52KCk7XG4gIGNvbnN0IGJpbmFyeUxvY3MgPSBnZXRTZGtCaW5hcnlMb2NhdGlvbkNhbmRpZGF0ZXMoc2RrUm9vdCwgZnVsbEJpbmFyeU5hbWUpO1xuICBmb3IgKGNvbnN0IGxvYyBvZiBiaW5hcnlMb2NzKSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2MpKSB7XG4gICAgICByZXR1cm4gbG9jO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICcke2Z1bGxCaW5hcnlOYW1lfScgaW4gJHtKU09OLnN0cmluZ2lmeShiaW5hcnlMb2NzKX0uIGAgK1xuICAgIGBEbyB5b3UgaGF2ZSBBbmRyb2lkIEJ1aWxkIFRvb2xzIGluc3RhbGxlZCBhdCAnJHtzZGtSb290fSc/YCk7XG59XG5cbi8qKlxuICogUmV0cmlldmUgZnVsbCBwYXRoIHRvIGEgYmluYXJ5IGZpbGUgdXNpbmcgdGhlIHN0YW5kYXJkIHN5c3RlbSBsb29rdXAgdG9vbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluYXJ5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBiaW5hcnkuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byB0aGUgYmluYXJ5IHJlY2VpdmVkIGZyb20gJ3doaWNoJy8nd2hlcmUnXG4gKiAgICAgICAgICAgICAgICAgIG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb29rdXAgdG9vbCByZXR1cm5zIG5vbi16ZXJvIHJldHVybiBjb2RlLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRCaW5hcnlGcm9tUGF0aCA9IGFzeW5jIGZ1bmN0aW9uIGdldEJpbmFyeUZyb21QYXRoIChiaW5hcnlOYW1lKSB7XG4gIGlmICh0aGlzLmJpbmFyaWVzW2JpbmFyeU5hbWVdKSB7XG4gICAgcmV0dXJuIHRoaXMuYmluYXJpZXNbYmluYXJ5TmFtZV07XG4gIH1cblxuICBjb25zdCBmdWxsQmluYXJ5TmFtZSA9IHRoaXMuZ2V0QmluYXJ5TmFtZUZvck9TKGJpbmFyeU5hbWUpO1xuICB0cnkge1xuICAgIGNvbnN0IGJpbmFyeUxvYyA9IGF3YWl0IGZzLndoaWNoKGZ1bGxCaW5hcnlOYW1lKTtcbiAgICBsb2cuaW5mbyhgVXNpbmcgJyR7ZnVsbEJpbmFyeU5hbWV9JyBmcm9tICcke2JpbmFyeUxvY30nYCk7XG4gICAgdGhpcy5iaW5hcmllc1tiaW5hcnlOYW1lXSA9IGJpbmFyeUxvYztcbiAgICByZXR1cm4gYmluYXJ5TG9jO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCAnJHtmdWxsQmluYXJ5TmFtZX0nIGluIFBBVEguIFBsZWFzZSBzZXQgdGhlIEFORFJPSURfSE9NRSBgICtcbiAgICAgIGBvciBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byB0aGUgY29ycmVjdCBBbmRyb2lkIFNESyByb290IGRpcmVjdG9yeSBwYXRoLmApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbm5lY3RlZERldmljZXNPcHRpb25zXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB2ZXJib3NlIC0gV2hldGhlciB0byBnZXQgbG9uZyBvdXRwdXQsIHdoaWNoIGluY2x1ZGVzIGV4dHJhIHByb3BlcnRpZXMgaW4gZWFjaCBkZXZpY2UuXG4gKiBBa2luIHRvIHJ1bm5pbmcgYGFkYiBkZXZpY2VzIC1sYC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldmljZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVkaWQgLSBUaGUgZGV2aWNlIHVkaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RhdGUgLSBDdXJyZW50IGRldmljZSBzdGF0ZSwgYXMgaXQgaXMgdmlzaWJsZSBpblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FkYiBkZXZpY2VzIC1sXyBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7RGV2aWNlfSBWZXJib3NlRGV2aWNlIEFkZGl0aW9uYWwgcHJvcGVydGllcyByZXR1cm5lZCB3aGVuIGB2ZXJib3NlYCBpcyB0cnVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3QgLSBUaGUgcHJvZHVjdCBjb2RlbmFtZSBvZiB0aGUgZGV2aWNlLCBzdWNoIGFzIFwicmF6b3JcIi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBkZXZpY2UsIHN1Y2ggYXMgXCJOZXh1c183XCIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGV2aWNlIC0gVGhlIGRldmljZSBjb2RlbmFtZSwgc3VjaCBhcyBcImZsb3dcIi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXNiIC0gUmVwcmVzZW50cyB0aGUgVVNCIHBvcnQgdGhlIGRldmljZSBpcyBjb25uZWN0ZWQgdG8sIHN1Y2ggYXMgXCIxLTFcIi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdHJhbnNwb3J0X2lkIC0gVGhlIFRyYW5zcG9ydCBJRCBmb3IgdGhlIGRldmljZSwgc3VjaCBhcyBcIjFcIi5cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGRldmljZXMgdmlzaWJsZSB0byBhZGIuXG4gKlxuICogQHBhcmFtIHs/Q29ubmVjdGVkRGV2aWNlc09wdGlvbnN9IG9wdHMgW3t9XSAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybiB7QXJyYXkuPERldmljZT59IFRoZSBsaXN0IG9mIGRldmljZXMgb3IgYW4gZW1wdHkgbGlzdCBpZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRldmljZXMgYXJlIGNvbm5lY3RlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgbGlzdGluZyBkZXZpY2VzLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRDb25uZWN0ZWREZXZpY2VzID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAob3B0cyA9IHt9KSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBjb25uZWN0ZWQgZGV2aWNlcycpO1xuICBjb25zdCBhcmdzID0gWy4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncywgJ2RldmljZXMnXTtcbiAgaWYgKG9wdHMudmVyYm9zZSkge1xuICAgIGFyZ3MucHVzaCgnLWwnKTtcbiAgfVxuXG4gIGxldCBzdGRvdXQ7XG4gIHRyeSB7XG4gICAgKHtzdGRvdXR9ID0gYXdhaXQgZXhlYyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgYXJncykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBnZXR0aW5nIGNvbm5lY3RlZCBkZXZpY2VzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgY29uc3QgbGlzdEhlYWRlciA9ICdMaXN0IG9mIGRldmljZXMnO1xuICAvLyBleHBlY3RpbmcgYWRiIGRldmljZXMgdG8gcmV0dXJuIG91dHB1dCBhc1xuICAvLyBMaXN0IG9mIGRldmljZXMgYXR0YWNoZWRcbiAgLy8gZW11bGF0b3ItNTU1NFx0ZGV2aWNlXG4gIGNvbnN0IHN0YXJ0aW5nSW5kZXggPSBzdGRvdXQuaW5kZXhPZihsaXN0SGVhZGVyKTtcbiAgaWYgKHN0YXJ0aW5nSW5kZXggPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG91dHB1dCB3aGlsZSB0cnlpbmcgdG8gZ2V0IGRldmljZXM6ICR7c3Rkb3V0fWApO1xuICB9XG4gIC8vIHNsaWNpbmcgb3V0cHV0IHdlIGNhcmUgYWJvdXRcbiAgc3Rkb3V0ID0gc3Rkb3V0LnNsaWNlKHN0YXJ0aW5nSW5kZXgpO1xuICBsZXQgZXhjbHVkZWRMaW5lcyA9IFtsaXN0SGVhZGVyLCAnYWRiIHNlcnZlcicsICcqIGRhZW1vbiddO1xuICBpZiAoIXRoaXMuYWxsb3dPZmZsaW5lRGV2aWNlcykge1xuICAgIGV4Y2x1ZGVkTGluZXMucHVzaCgnb2ZmbGluZScpO1xuICB9XG4gIGNvbnN0IGRldmljZXMgPSBzdGRvdXQuc3BsaXQoJ1xcbicpXG4gICAgLm1hcChfLnRyaW0pXG4gICAgLmZpbHRlcigobGluZSkgPT4gbGluZSAmJiAhZXhjbHVkZWRMaW5lcy5zb21lKCh4KSA9PiBsaW5lLmluY2x1ZGVzKHgpKSlcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICAvLyBzdGF0ZSBpcyBcImRldmljZVwiLCBhZmFpY1xuICAgICAgY29uc3QgW3VkaWQsIHN0YXRlLCAuLi5kZXNjcmlwdGlvbl0gPSBsaW5lLnNwbGl0KC9cXHMrLyk7XG4gICAgICBjb25zdCBkZXZpY2UgPSB7dWRpZCwgc3RhdGV9O1xuICAgICAgaWYgKG9wdHMudmVyYm9zZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgaWYgKGVudHJ5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgIC8vIGVhY2ggZW50cnkgbG9va3MgbGlrZSBrZXk6dmFsdWVcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5LnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICBkZXZpY2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRldmljZTtcbiAgICB9KTtcbiAgaWYgKF8uaXNFbXB0eShkZXZpY2VzKSkge1xuICAgIGxvZy5kZWJ1ZygnTm8gY29ubmVjdGVkIGRldmljZXMgaGF2ZSBiZWVuIGRldGVjdGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nLmRlYnVnKGBDb25uZWN0ZWQgZGV2aWNlczogJHtKU09OLnN0cmluZ2lmeShkZXZpY2VzKX1gKTtcbiAgfVxuICByZXR1cm4gZGV2aWNlcztcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZGV2aWNlcyB2aXNpYmxlIHRvIGFkYiB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRNcyAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZ2V0IGF0IGxlYXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIGxpc3QgaXRlbS5cbiAqIEByZXR1cm4ge0FycmF5LjxEZXZpY2U+fSBUaGUgbGlzdCBvZiBjb25uZWN0ZWQgZGV2aWNlcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyBjb25uZWN0ZWQgZGV2aWNlcyBjYW4gYmUgZGV0ZWN0ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXREZXZpY2VzV2l0aFJldHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlc1dpdGhSZXRyeSAodGltZW91dE1zID0gMjAwMDApIHtcbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgbG9nLmRlYnVnKCdUcnlpbmcgdG8gZmluZCBhIGNvbm5lY3RlZCBhbmRyb2lkIGRldmljZScpO1xuICBjb25zdCBnZXREZXZpY2VzID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICh0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzID4gdGltZW91dE1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgY29ubmVjdGVkIEFuZHJvaWQgZGV2aWNlIGluICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zLmApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGV2aWNlcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlcygpO1xuICAgICAgaWYgKGRldmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGV2aWNlcztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBsb2cuZGVidWcoJ0NvdWxkIG5vdCBmaW5kIG9ubGluZSBkZXZpY2VzJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVjb25uZWN0KCk7XG4gICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICB9XG4gICAgLy8gY29vbCBkb3duXG4gICAgYXdhaXQgc2xlZXAoMjAwKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0RGV2aWNlcygpO1xuICB9O1xuICByZXR1cm4gYXdhaXQgZ2V0RGV2aWNlcygpO1xufTtcblxuLyoqXG4gKiBLaWNrIGN1cnJlbnQgY29ubmVjdGlvbiBmcm9tIGhvc3QvZGV2aWNlIHNpZGUgYW5kIG1ha2UgaXQgcmVjb25uZWN0XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSB0YXJnZXQgW29mZmxpbmVdIE9uZSBvZiBwb3NzaWJsZSB0YXJnZXRzIHRvIHJlY29ubmVjdDpcbiAqIG9mZmxpbmUsIGRldmljZSBvciBudWxsXG4gKiBQcm92aWRpbmcgYG51bGxgIHdpbGwgY2F1c2UgcmVjb25uZWN0aW9uIHRvIGhhcHBlbiBmcm9tIHRoZSBob3N0IHNpZGUuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IElmIGVpdGhlciBBREIgdmVyc2lvbiBpcyB0b28gb2xkIGFuZCBkb2VzIG5vdCBzdXBwb3J0IHRoaXNcbiAqIGNvbW1hbmQgb3IgdGhlcmUgd2FzIGEgZmFpbHVyZSBkdXJpbmcgcmVjb25uZWN0LlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5yZWNvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiByZWNvbm5lY3QgKHRhcmdldCA9ICdvZmZsaW5lJykge1xuICBsb2cuZGVidWcoYFJlY29ubmVjdGluZyBhZGIgKHRhcmdldCAke3RhcmdldH0pYCk7XG5cbiAgY29uc3QgYXJncyA9IFsncmVjb25uZWN0J107XG4gIGlmICh0YXJnZXQpIHtcbiAgICBhcmdzLnB1c2godGFyZ2V0KTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiRXhlYyhhcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlY29ubmVjdCBhZGIuIE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXN0YXJ0IGFkYiBzZXJ2ZXIsIHVubGVzcyBfdGhpcy5zdXBwcmVzc0tpbGxTZXJ2ZXJfIHByb3BlcnR5IGlzIHRydWUuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLnJlc3RhcnRBZGIgPSBhc3luYyBmdW5jdGlvbiByZXN0YXJ0QWRiICgpIHtcbiAgaWYgKHRoaXMuc3VwcHJlc3NLaWxsU2VydmVyKSB7XG4gICAgbG9nLmRlYnVnKGBOb3QgcmVzdGFydGluZyBhYmQgc2luY2UgJ3N1cHByZXNzS2lsbFNlcnZlcicgaXMgb25gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2cuZGVidWcoJ1Jlc3RhcnRpbmcgYWRiJyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5raWxsU2VydmVyKCk7XG4gICAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnc3RhcnQtc2VydmVyJ10pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yKGBFcnJvciBraWxsaW5nIEFEQiBzZXJ2ZXIsIGdvaW5nIHRvIHNlZSBpZiBpdCdzIG9ubGluZSBhbnl3YXlgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBLaWxsIGFkYiBzZXJ2ZXIuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmtpbGxTZXJ2ZXIgPSBhc3luYyBmdW5jdGlvbiBraWxsU2VydmVyICgpIHtcbiAgbG9nLmRlYnVnKGBLaWxsaW5nIGFkYiBzZXJ2ZXIgb24gcG9ydCAnJHt0aGlzLmFkYlBvcnR9J2ApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydraWxsLXNlcnZlciddLCB7XG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICB9KTtcbn07XG5cbi8qKlxuICogUmVzZXQgVGVsbmV0IGF1dGhlbnRpY2F0aW9uIHRva2VuLlxuICogQHNlZSB7QGxpbmsgaHR0cDovL3Rvb2xzLmFuZHJvaWQuY29tL3JlY2VudC9lbXVsYXRvcjI1MTZyZWxlYXNlbm90ZXN9IGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IElmIHRva2VuIHJlc2V0IHdhcyBzdWNjZXNzZnVsLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5yZXNldFRlbG5ldEF1dGhUb2tlbiA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiByZXNldFRlbG5ldEF1dGhUb2tlbiAoKSB7XG4gIC8vIFRoZSBtZXRob2RzIGlzIHVzZWQgdG8gcmVtb3ZlIHRlbG5ldCBhdXRoIHRva2VuXG4gIC8vXG4gIGNvbnN0IGhvbWVGb2xkZXJQYXRoID0gcHJvY2Vzcy5lbnZbKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpID8gJ1VTRVJQUk9GSUxFJyA6ICdIT01FJ107XG4gIGlmICghaG9tZUZvbGRlclBhdGgpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IGZpbmQgdGhlIHBhdGggdG8gdXNlciBob21lIGZvbGRlci4gSWdub3JpbmcgcmVzZXR0aW5nIG9mIGVtdWxhdG9yJ3MgdGVsbmV0IGF1dGhlbnRpY2F0aW9uIHRva2VuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlclBhdGgsICcuZW11bGF0b3JfY29uc29sZV9hdXRoX3Rva2VuJyk7XG4gIGxvZy5kZWJ1ZyhgT3ZlcnJpZGluZyAke2RzdFBhdGh9IHdpdGggYW4gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHRlbG5ldCBhdXRoZW50aWNhdGlvbiBmb3IgZW11bGF0b3IgY29tbWFuZHNgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZHN0UGF0aCwgJycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLndhcm4oYEVycm9yICR7ZS5tZXNzYWdlfSB3aGlsZSByZXNldHRpbmcgdGhlIGNvbnRlbnQgb2YgJHtkc3RQYXRofS4gSWdub3JpbmcgcmVzZXR0aW5nIG9mIGVtdWxhdG9yJ3MgdGVsbmV0IGF1dGhlbnRpY2F0aW9uIHRva2VuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufSk7XG5cbi8qKlxuICogRXhlY3V0ZSB0aGUgZ2l2ZW4gZW11bGF0b3IgY29tbWFuZCB1c2luZyBfYWRiIGVtdV8gdG9vbC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjbWQgLSBUaGUgYXJyYXkgb2YgcmVzdCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuYWRiRXhlY0VtdSA9IGFzeW5jIGZ1bmN0aW9uIGFkYkV4ZWNFbXUgKGNtZCkge1xuICBhd2FpdCB0aGlzLnZlcmlmeUVtdWxhdG9yQ29ubmVjdGVkKCk7XG4gIGF3YWl0IHRoaXMucmVzZXRUZWxuZXRBdXRoVG9rZW4oKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZW11JywgLi4uY21kXSk7XG59O1xuXG5sZXQgaXNFeGVjTG9ja2VkID0gZmFsc2U7XG5cbnN5c3RlbUNhbGxNZXRob2RzLkVYRUNfT1VUUFVUX0ZPUk1BVCA9IE9iamVjdC5mcmVlemUoe1xuICBTVERPVVQ6ICdzdGRvdXQnLFxuICBGVUxMOiAnZnVsbCcsXG59KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFeGVjUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3Rkb3V0IFRoZSBzdGRvdXQgcmVjZWl2ZWQgZnJvbSBleGVjXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIFRoZSBzdGRlcnIgcmVjZWl2ZWQgZnJvbSBleGVjXG4gKi9cblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBnaXZlbiBhZGIgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjbWQgLSBUaGUgYXJyYXkgb2YgcmVzdCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyc1xuICogICAgICAgICAgICAgICAgICAgICAgb3IgYSBzaW5nbGUgc3RyaW5nIHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuIFNlZVxuICogICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2Vzc31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBhbHNvIHNldCB0aGUgYWRkaXRpb25hbCBgZXhjbHVzaXZlYCBwYXJhbVxuICogICAgICAgICAgICAgICAgICAgICAgICB0byBgdHJ1ZWAgdGhhdCBhc3N1cmVzIG5vIG90aGVyIHBhcmFsbGVsIGFkYiBjb21tYW5kc1xuICogICAgICAgICAgICAgICAgICAgICAgICBhcmUgZ29pbmcgdG8gYmUgZXhlY3V0ZWQgd2hpbGUgdGhlIGN1cnJlbnQgb25lIGlzIHJ1bm5pbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBzZXQgdGhlIGBvdXRwdXRGb3JtYXRgIHBhcmFtIHRvIGBzdGRvdXRgIHRvIHJlY2VpdmUganVzdCB0aGUgc3Rkb3V0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCAoZGVmYXVsdCkgb3IgYGZ1bGxgIHRvIHJlY2VpdmUgdGhlIHN0ZG91dCBhbmQgc3RkZXJyIHJlc3BvbnNlIGZyb20gYVxuICogICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIHdpdGggYSB6ZXJvIGV4aXQgY29kZVxuICogQHJldHVybiB7c3RyaW5nfEV4ZWNSZXN1bHR9IC0gQ29tbWFuZCdzIHN0ZG91dCBvciBhbiBvYmplY3QgY29udGFpbmluZyBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29tbWFuZCByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmFkYkV4ZWMgPSBhc3luYyBmdW5jdGlvbiBhZGJFeGVjIChjbWQsIG9wdHMgPSB7fSkge1xuICBpZiAoIWNtZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gcGFzcyBpbiBhIGNvbW1hbmQgdG8gYWRiRXhlYygpJyk7XG4gIH1cblxuICBvcHRzID0gXy5jbG9uZURlZXAob3B0cyk7XG4gIC8vIHNldHRpbmcgZGVmYXVsdCB0aW1lb3V0IGZvciBlYWNoIGNvbW1hbmQgdG8gcHJldmVudCBpbmZpbml0ZSB3YWl0LlxuICBvcHRzLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgdGhpcy5hZGJFeGVjVGltZW91dCB8fCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQ7XG4gIG9wdHMudGltZW91dENhcE5hbWUgPSBvcHRzLnRpbWVvdXRDYXBOYW1lIHx8ICdhZGJFeGVjVGltZW91dCc7IC8vIEZvciBlcnJvciBtZXNzYWdlXG5cbiAgY29uc3Qge291dHB1dEZvcm1hdCA9IHRoaXMuRVhFQ19PVVRQVVRfRk9STUFULlNURE9VVH0gPSBvcHRzO1xuXG4gIGNtZCA9IF8uaXNBcnJheShjbWQpID8gY21kIDogW2NtZF07XG4gIGxldCBhZGJSZXRyaWVkID0gZmFsc2U7XG4gIGNvbnN0IGV4ZWNGdW5jID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcmdzID0gWy4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncywgLi4uY21kXTtcbiAgICAgIGxvZy5kZWJ1ZyhgUnVubmluZyAnJHt0aGlzLmV4ZWN1dGFibGUucGF0aH0gYCArXG4gICAgICAgIChhcmdzLmZpbmQoKGFyZykgPT4gL1xccysvLnRlc3QoYXJnKSkgPyB1dGlsLnF1b3RlKGFyZ3MpIDogYXJncy5qb2luKCcgJykpICsgYCdgKTtcbiAgICAgIGxldCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgZXhlYyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgYXJncywgb3B0cyk7XG4gICAgICAvLyBzb21ldGltZXMgQURCIHByaW50cyBvdXQgd2VpcmQgc3Rkb3V0IHdhcm5pbmdzIHRoYXQgd2UgZG9uJ3Qgd2FudFxuICAgICAgLy8gdG8gaW5jbHVkZSBpbiBhbnkgb2YgdGhlIHJlc3BvbnNlIGRhdGEsIHNvIGxldCdzIHN0cmlwIGl0IG91dFxuICAgICAgc3Rkb3V0ID0gc3Rkb3V0LnJlcGxhY2UoTElOS0VSX1dBUk5JTkdfUkVHRVhQLCAnJykudHJpbSgpO1xuICAgICAgcmV0dXJuIG91dHB1dEZvcm1hdCA9PT0gdGhpcy5FWEVDX09VVFBVVF9GT1JNQVQuRlVMTCA/IHtzdGRvdXQsIHN0ZGVycn0gOiBzdGRvdXQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyVGV4dCA9IGAke2UubWVzc2FnZX0sICR7ZS5zdGRvdXR9LCAke2Uuc3RkZXJyfWA7XG4gICAgICBpZiAoQURCX1JFVFJZX0VSUk9SX1BBVFRFUk5TLnNvbWUoKHApID0+IHAudGVzdChlcnJUZXh0KSkpIHtcbiAgICAgICAgbG9nLmluZm8oYEVycm9yIHNlbmRpbmcgY29tbWFuZCwgcmVjb25uZWN0aW5nIGRldmljZSBhbmQgcmV0cnlpbmc6ICR7Y21kfWApO1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKTtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREZXZpY2VzV2l0aFJldHJ5KCk7XG5cbiAgICAgICAgLy8gdHJ5IGFnYWluIG9uZSB0aW1lXG4gICAgICAgIGlmIChhZGJSZXRyaWVkKSB7XG4gICAgICAgICAgYWRiUmV0cmllZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWNGdW5jKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGUuY29kZSA9PT0gMCAmJiBlLnN0ZG91dCkge1xuICAgICAgICByZXR1cm4gZS5zdGRvdXQucmVwbGFjZShMSU5LRVJfV0FSTklOR19SRUdFWFAsICcnKS50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfLmlzTnVsbChlLmNvZGUpKSB7XG4gICAgICAgIGUubWVzc2FnZSA9IGBFcnJvciBleGVjdXRpbmcgYWRiRXhlYy4gT3JpZ2luYWwgZXJyb3I6ICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgICBgVHJ5IHRvIGluY3JlYXNlIHRoZSAke29wdHMudGltZW91dH1tcyBhZGIgZXhlY3V0aW9uIHRpbWVvdXQgcmVwcmVzZW50ZWQgYnkgJyR7b3B0cy50aW1lb3V0Q2FwTmFtZX0nIGNhcGFiaWxpdHlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZS5tZXNzYWdlID0gYEVycm9yIGV4ZWN1dGluZyBhZGJFeGVjLiBPcmlnaW5hbCBlcnJvcjogJyR7ZS5tZXNzYWdlfSc7IGAgK1xuICAgICAgICAgIGBDb21tYW5kIG91dHB1dDogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dCB8fCAnPGVtcHR5Pid9YDtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9O1xuXG4gIGlmIChpc0V4ZWNMb2NrZWQpIHtcbiAgICBsb2cuZGVidWcoJ1dhaXRpbmcgdW50aWwgdGhlIG90aGVyIGV4Y2x1c2l2ZSBBREIgY29tbWFuZCBpcyBjb21wbGV0ZWQnKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+ICFpc0V4ZWNMb2NrZWQsIHtcbiAgICAgIHdhaXRNczogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICBpbnRlcnZhbE1zOiAxMCxcbiAgICB9KTtcbiAgICBsb2cuZGVidWcoJ0NvbnRpbnVpbmcgd2l0aCB0aGUgY3VycmVudCBBREIgY29tbWFuZCcpO1xuICB9XG4gIGlmIChvcHRzLmV4Y2x1c2l2ZSkge1xuICAgIGlzRXhlY0xvY2tlZCA9IHRydWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZXhlY0Z1bmMoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob3B0cy5leGNsdXNpdmUpIHtcbiAgICAgIGlzRXhlY0xvY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTaGVsbEV4ZWNPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRpbWVvdXRDYXBOYW1lIFthZGJFeGVjVGltZW91dF0gLSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBBcHBpdW0ncyB0aW1lb3V0IGNhcGFiaWxpdHlcbiAqICh1c2VkIGluIHRoZSBlcnJvciBtZXNzYWdlcykuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRpbWVvdXQgW2FkYkV4ZWNUaW1lb3V0XSAtIGNvbW1hbmQgZXhlY3V0aW9uIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBwcml2aWxlZ2VkIFtmYWxzeV0gLSBXaGV0aGVyIHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCBhcyByb290LlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBvdXRwdXRGb3JtYXQgW3N0ZG91dF0gLSBXaGV0aGVyIHJlc3BvbnNlIHNob3VsZCBpbmNsdWRlIGZ1bGwgZXhlYyBvdXRwdXQgb3IganVzdCBzdGRvdXQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvdGVudGlhbCB2YWx1ZXMgYXJlIGZ1bGwgb3Igc3Rkb3V0LlxuICpcbiAqIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYGV4ZWNgIGNhbGwgZnJvbSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2Vzc31cbiAqIG1vZHVsZVxuICovXG5cbi8qKlxuICogRXhlY3V0ZSB0aGUgZ2l2ZW4gY29tbWFuZCB1c2luZyBfYWRiIHNoZWxsXyBwcmVmaXguXG4gKlxuICogQHBhcmFtIHshQXJyYXkuPHN0cmluZz58c3RyaW5nfSBjbWQgLSBUaGUgYXJyYXkgb2YgcmVzdCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBvciBhIHNpbmdsZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0gez9TaGVsbEV4ZWNPcHRpb25zfSBvcHRzIFt7fV0gLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21tYW5kJ3Mgc3Rkb3V0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjb21tYW5kIHJldHVybmVkIG5vbi16ZXJvIGV4aXQgY29kZS5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuc2hlbGwgPSBhc3luYyBmdW5jdGlvbiBzaGVsbCAoY21kLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHByaXZpbGVnZWQsXG4gIH0gPSBvcHRzO1xuXG4gIGNvbnN0IGNtZEFyciA9IF8uaXNBcnJheShjbWQpID8gY21kIDogW2NtZF07XG4gIGNvbnN0IGZ1bGxDbWQgPSBbJ3NoZWxsJ107XG4gIGlmIChwcml2aWxlZ2VkKSB7XG4gICAgbG9nLmluZm8oYCdhZGIgc2hlbGwgJHt1dGlsLnF1b3RlKGNtZEFycil9JyByZXF1aXJlcyByb290IGFjY2Vzc2ApO1xuICAgIGlmIChhd2FpdCB0aGlzLmlzUm9vdCgpKSB7XG4gICAgICBsb2cuaW5mbygnVGhlIGRldmljZSBhbHJlYWR5IGhhZCByb290IGFjY2VzcycpO1xuICAgICAgZnVsbENtZC5wdXNoKC4uLmNtZEFycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGxDbWQucHVzaCgnc3UnLCAncm9vdCcsIHV0aWwucXVvdGUoY21kQXJyKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZ1bGxDbWQucHVzaCguLi5jbWRBcnIpO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYkV4ZWMoZnVsbENtZCwgb3B0cyk7XG59O1xuXG5zeXN0ZW1DYWxsTWV0aG9kcy5jcmVhdGVTdWJQcm9jZXNzID0gZnVuY3Rpb24gY3JlYXRlU3ViUHJvY2VzcyAoYXJncyA9IFtdKSB7XG4gIC8vIGFkZCB0aGUgZGVmYXVsdCBhcmd1bWVudHNcbiAgYXJncyA9IFsuLi50aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsIC4uLmFyZ3NdO1xuICBsb2cuZGVidWcoYENyZWF0aW5nIEFEQiBzdWJwcm9jZXNzIHdpdGggYXJnczogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgcmV0dXJuIG5ldyBTdWJQcm9jZXNzKHRoaXMuZ2V0QWRiUGF0aCgpLCBhcmdzKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGN1cnJlbnQgYWRiIHBvcnQuXG4gKiBAdG9kbyBjYW4gcHJvYmFibHkgZGVwcmVjYXRlIHRoaXMgbm93IHRoYXQgdGhlIGxvZ2ljIGlzIGp1c3QgdG8gcmVhZCB0aGlzLmFkYlBvcnRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgYWRiIHBvcnQgbnVtYmVyLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRBZGJTZXJ2ZXJQb3J0ID0gZnVuY3Rpb24gZ2V0QWRiU2VydmVyUG9ydCAoKSB7XG4gIHJldHVybiB0aGlzLmFkYlBvcnQ7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGVtdWxhdG9yIHBvcnQgZnJvbSBfYWRiIGRldml2ZXNfIG91dHB1dC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IGVtdWxhdG9yIHBvcnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgYXJlIG5vIGNvbm5lY3RlZCBkZXZpY2VzLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRFbXVsYXRvclBvcnQgPSBhc3luYyBmdW5jdGlvbiBnZXRFbXVsYXRvclBvcnQgKCkge1xuICBsb2cuZGVidWcoJ0dldHRpbmcgcnVubmluZyBlbXVsYXRvciBwb3J0Jyk7XG4gIGlmICh0aGlzLmVtdWxhdG9yUG9ydCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmVtdWxhdG9yUG9ydDtcbiAgfVxuICB0cnkge1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VzKCk7XG4gICAgbGV0IHBvcnQgPSB0aGlzLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcoZGV2aWNlc1swXS51ZGlkKTtcbiAgICBpZiAocG9ydCkge1xuICAgICAgcmV0dXJuIHBvcnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW11bGF0b3IgcG9ydCBub3QgZm91bmRgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGRldmljZXMgY29ubmVjdGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGN1cnJlbnQgZW11bGF0b3IgcG9ydCBieSBwYXJzaW5nIGVtdWxhdG9yIG5hbWUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbVN0ciAtIEVtdWxhdG9yIG5hbWUgc3RyaW5nLlxuICogQHJldHVybiB7bnVtYmVyfGJvb2xlYW59IEVpdGhlciB0aGUgY3VycmVudCBlbXVsYXRvciBwb3J0IG9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZhbHNlXyBpZiBwb3J0IG51bWJlciBjYW5ub3QgYmUgcGFyc2VkLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nID0gZnVuY3Rpb24gZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyAoZW1TdHIpIHtcbiAgbGV0IHBvcnRQYXR0ZXJuID0gL2VtdWxhdG9yLShcXGQrKS87XG4gIGlmIChwb3J0UGF0dGVybi50ZXN0KGVtU3RyKSkge1xuICAgIHJldHVybiBwYXJzZUludChwb3J0UGF0dGVybi5leGVjKGVtU3RyKVsxXSwgMTApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHs/Q29ubmVjdGVkRGV2aWNlc09wdGlvbnN9IG9wdHMgW3t9XSAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybiB7QXJyYXkuPERldmljZT59IFRoZSBsaXN0IG9mIGNvbm5lY3RlZCBkZXZpY2VzLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5nZXRDb25uZWN0ZWRFbXVsYXRvcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb25uZWN0ZWRFbXVsYXRvcnMgKG9wdHMgPSB7fSkge1xuICBsb2cuZGVidWcoJ0dldHRpbmcgY29ubmVjdGVkIGVtdWxhdG9ycycpO1xuICB0cnkge1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VzKG9wdHMpO1xuICAgIGxldCBlbXVsYXRvcnMgPSBbXTtcbiAgICBmb3IgKGxldCBkZXZpY2Ugb2YgZGV2aWNlcykge1xuICAgICAgbGV0IHBvcnQgPSB0aGlzLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcoZGV2aWNlLnVkaWQpO1xuICAgICAgaWYgKHBvcnQpIHtcbiAgICAgICAgZGV2aWNlLnBvcnQgPSBwb3J0O1xuICAgICAgICBlbXVsYXRvcnMucHVzaChkZXZpY2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2cuZGVidWcoYCR7dXRpbC5wbHVyYWxpemUoJ2VtdWxhdG9yJywgZW11bGF0b3JzLmxlbmd0aCwgdHJ1ZSl9IGNvbm5lY3RlZGApO1xuICAgIHJldHVybiBlbXVsYXRvcnM7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZW11bGF0b3JzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0IF9lbXVsYXRvclBvcnRfIHByb3BlcnR5IG9mIHRoZSBjdXJyZW50IGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbVBvcnQgLSBUaGUgZW11bGF0b3IgcG9ydCB0byBiZSBzZXQuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLnNldEVtdWxhdG9yUG9ydCA9IGZ1bmN0aW9uIHNldEVtdWxhdG9yUG9ydCAoZW1Qb3J0KSB7XG4gIHRoaXMuZW11bGF0b3JQb3J0ID0gZW1Qb3J0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGN1cnJlbnQgZGV2aWNlIChfdGhpcy5jdXJEZXZpY2VJZF8pLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSAtIFRoZSBkZXZpY2UgaWRlbnRpZmllci5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuc2V0RGV2aWNlSWQgPSBmdW5jdGlvbiBzZXREZXZpY2VJZCAoZGV2aWNlSWQpIHtcbiAgbG9nLmRlYnVnKGBTZXR0aW5nIGRldmljZSBpZCB0byAke2RldmljZUlkfWApO1xuICB0aGlzLmN1ckRldmljZUlkID0gZGV2aWNlSWQ7XG4gIGxldCBhcmdzSGFzRGV2aWNlID0gdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLmluZGV4T2YoJy1zJyk7XG4gIGlmIChhcmdzSGFzRGV2aWNlICE9PSAtMSkge1xuICAgIC8vIHJlbW92ZSB0aGUgb2xkIGRldmljZSBpZCBmcm9tIHRoZSBhcmd1bWVudHNcbiAgICB0aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3Muc3BsaWNlKGFyZ3NIYXNEZXZpY2UsIDIpO1xuICB9XG4gIHRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncy5wdXNoKCctcycsIGRldmljZUlkKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSB0aGUgY3VycmVudCBkZXZpY2Ugb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7RGV2aWNlfSBkZXZpY2VPYmogLSBUaGUgZGV2aWNlIG9iamVjdCB0byBiZSBzZXQuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLnNldERldmljZSA9IGZ1bmN0aW9uIHNldERldmljZSAoZGV2aWNlT2JqKSB7XG4gIGxldCBkZXZpY2VJZCA9IGRldmljZU9iai51ZGlkO1xuICBsZXQgZW1Qb3J0ID0gdGhpcy5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKGRldmljZUlkKTtcbiAgdGhpcy5zZXRFbXVsYXRvclBvcnQoZW1Qb3J0KTtcbiAgdGhpcy5zZXREZXZpY2VJZChkZXZpY2VJZCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgb2JqZWN0IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgZW11bGF0b3IuXG4gKiAhISEgVGhpcyBtZXRob2QgaGFzIGEgc2lkZSBlZmZlY3QgLSBpdCBpbXBsaWNpdGx5IGNoYW5nZXMgdGhlXG4gKiBgZGV2aWNlSWRgIChvbmx5IGlmIEFWRCB3aXRoIGEgbWF0Y2hpbmcgbmFtZSBpcyBmb3VuZClcbiAqIGFuZCBgZW11bGF0b3JQb3J0YCBpbnN0YW5jZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdmROYW1lIC0gRW11bGF0b3IgbmFtZS5cbiAqIEByZXR1cm4gez9EZXZpY2V9IEN1cnJlbnRseSBydW5uaW5nIGVtdWxhdG9yIG9yIF9udWxsXy5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuZ2V0UnVubmluZ0FWRCA9IGFzeW5jIGZ1bmN0aW9uIGdldFJ1bm5pbmdBVkQgKGF2ZE5hbWUpIHtcbiAgbG9nLmRlYnVnKGBUcnlpbmcgdG8gZmluZCAnJHthdmROYW1lfScgZW11bGF0b3JgKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbXVsYXRvcnMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZEVtdWxhdG9ycygpO1xuICAgIGZvciAoY29uc3QgZW11bGF0b3Igb2YgZW11bGF0b3JzKSB7XG4gICAgICB0aGlzLnNldEVtdWxhdG9yUG9ydChlbXVsYXRvci5wb3J0KTtcbiAgICAgIGNvbnN0IHJ1bm5pbmdBVkROYW1lID0gYXdhaXQgdGhpcy5leGVjRW11Q29uc29sZUNvbW1hbmQoWydhdmQnLCAnbmFtZSddLCB7XG4gICAgICAgIHBvcnQ6IGVtdWxhdG9yLnBvcnQsXG4gICAgICAgIGV4ZWNUaW1lb3V0OiA1MDAwLFxuICAgICAgICBjb25uVGltZW91dDogMTAwMCxcbiAgICAgIH0pO1xuICAgICAgaWYgKF8udG9Mb3dlcihhdmROYW1lKSA9PT0gXy50b0xvd2VyKHJ1bm5pbmdBVkROYW1lLnRyaW0oKSkpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBGb3VuZCBlbXVsYXRvciAnJHthdmROYW1lfScgb24gcG9ydCAke2VtdWxhdG9yLnBvcnR9YCk7XG4gICAgICAgIHRoaXMuc2V0RGV2aWNlSWQoZW11bGF0b3IudWRpZCk7XG4gICAgICAgIHJldHVybiBlbXVsYXRvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmRlYnVnKGBFbXVsYXRvciAnJHthdmROYW1lfScgbm90IHJ1bm5pbmdgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBBVkQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnRseSBydW5uaW5nIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdmROYW1lIC0gRW11bGF0b3IgbmFtZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDAwXSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHdhaXQgdW50aWwgYXQgbGVhc3Qgb25lIHJ1bm5pbmcgQVZEIG9iamVjdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZGV0ZWN0ZWQuXG4gKiBAcmV0dXJuIHs/RGV2aWNlfSBDdXJyZW50bHkgcnVubmluZyBlbXVsYXRvciBvciBfbnVsbF8uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gZGV2aWNlIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiB0aGUgdGltZW91dC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuZ2V0UnVubmluZ0FWRFdpdGhSZXRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldFJ1bm5pbmdBVkRXaXRoUmV0cnkgKGF2ZE5hbWUsIHRpbWVvdXRNcyA9IDIwMDAwKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0UnVubmluZ0FWRChhdmROYW1lLnJlcGxhY2UoJ0AnLCAnJykpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cuZGVidWcoZS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIHdhaXRNczogdGltZW91dE1zLFxuICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBBVkQgd2l0aCByZXRyeS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFNodXRkb3duIGFsbCBydW5uaW5nIGVtdWxhdG9ycyBieSBraWxsaW5nIHRoZWlyIHByb2Nlc3Nlcy5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYga2lsbGluZyB0b29sIHJldHVybmVkIG5vbi16ZXJvIHJldHVybiBjb2RlLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5raWxsQWxsRW11bGF0b3JzID0gYXN5bmMgZnVuY3Rpb24ga2lsbEFsbEVtdWxhdG9ycyAoKSB7XG4gIGxldCBjbWQsIGFyZ3M7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICBjbWQgPSAnVEFTS0tJTEwnO1xuICAgIGFyZ3MgPSBbJ1RBU0tLSUxMJywgJy9JTScsICdlbXVsYXRvci5leGUnXTtcbiAgfSBlbHNlIHtcbiAgICBjbWQgPSAnL3Vzci9iaW4va2lsbGFsbCc7XG4gICAgYXJncyA9IFsnLW0nLCAnZW11bGF0b3IqJ107XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKGNtZCwgYXJncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGtpbGxpbmcgZW11bGF0b3JzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogS2lsbCBlbXVsYXRvciB3aXRoIHRoZSBnaXZlbiBuYW1lLiBObyBlcnJvclxuICogaXMgdGhyb3duIGlzIGdpdmVuIGF2ZCBkb2VzIG5vdCBleGlzdC9pcyBub3QgcnVubmluZy5cbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGF2ZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZW11bGF0b3IgdG8gYmUga2lsbGVkLiBJZiBlbXB0eSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGVtdWxhdG9yIHdpbGwgYmUga2lsbGVkLlxuICogQHBhcmFtIHs/bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZWZvcmUgdGhyb3dpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXhjZXB0aW9uIGFib3V0IHVuc3VjY2Vzc2Z1bCBraWxsaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFRydWUgaWYgdGhlIGVtdWxhdG9yIHdhcyBraWxsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIGJ5IGtpbGxpbmcgdGhlIGVtdWxhdG9yXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmtpbGxFbXVsYXRvciA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxFbXVsYXRvciAoYXZkTmFtZSA9IG51bGwsIHRpbWVvdXQgPSA2MDAwMCkge1xuICBpZiAodXRpbC5oYXNWYWx1ZShhdmROYW1lKSkge1xuICAgIGxvZy5kZWJ1ZyhgS2lsbGluZyBhdmQgJyR7YXZkTmFtZX0nYCk7XG4gICAgY29uc3QgZGV2aWNlID0gYXdhaXQgdGhpcy5nZXRSdW5uaW5nQVZEKGF2ZE5hbWUpO1xuICAgIGlmICghZGV2aWNlKSB7XG4gICAgICBsb2cuaW5mbyhgTm8gYXZkIHdpdGggbmFtZSAnJHthdmROYW1lfScgcnVubmluZy4gU2tpcHBpbmcga2lsbCBzdGVwLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBraWxsaW5nIHRoZSBjdXJyZW50IGF2ZFxuICAgIGxvZy5kZWJ1ZyhgS2lsbGluZyBhdmQgd2l0aCBpZCAnJHt0aGlzLmN1ckRldmljZUlkfSdgKTtcbiAgICBpZiAoIWF3YWl0IHRoaXMuaXNFbXVsYXRvckNvbm5lY3RlZCgpKSB7XG4gICAgICBsb2cuZGVidWcoYEVtdWxhdG9yIHdpdGggaWQgJyR7dGhpcy5jdXJEZXZpY2VJZH0nIG5vdCBjb25uZWN0ZWQuIFNraXBwaW5nIGtpbGwgc3RlcGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydlbXUnLCAna2lsbCddKTtcbiAgbG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7dGltZW91dH1tcyB1bnRpbCB0aGUgZW11bGF0b3IgJyR7YXZkTmFtZSA/IGF2ZE5hbWUgOiB0aGlzLmN1ckRldmljZUlkfScgaXMga2lsbGVkYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXRpbC5oYXNWYWx1ZShhdmROYW1lKVxuICAgICAgICAgID8gIWF3YWl0IHRoaXMuZ2V0UnVubmluZ0FWRChhdmROYW1lKVxuICAgICAgICAgIDogIWF3YWl0IHRoaXMuaXNFbXVsYXRvckNvbm5lY3RlZCgpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sIHtcbiAgICAgIHdhaXRNczogdGltZW91dCxcbiAgICAgIGludGVydmFsTXM6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBlbXVsYXRvciAnJHthdmROYW1lID8gYXZkTmFtZSA6IHRoaXMuY3VyRGV2aWNlSWR9JyBpcyBzdGlsbCBydW5uaW5nIGFmdGVyIGJlaW5nIGtpbGxlZCAke3RpbWVvdXR9bXMgYWdvYCk7XG4gIH1cbiAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBraWxsZWQgdGhlICcke2F2ZE5hbWUgPyBhdmROYW1lIDogdGhpcy5jdXJEZXZpY2VJZH0nIGVtdWxhdG9yYCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBBdmRMYXVuY2hPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdzIEFkZGl0aW9uYWwgZW11bGF0b3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xuICogQHByb3BlcnR5IHtPYmplY3R9IGVudiBBZGRpdGlvbmFsIGVtdWxhdG9yIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGxhbmd1YWdlIEVtdWxhdG9yIHN5c3RlbSBsYW5ndWFnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvdW50cnkgRW11bGF0b3Igc3lzdGVtIGNvdW50cnlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsYXVuY2hUaW1lb3V0IFs2MDAwMF0gRW11bGF0b3Igc3RhcnR1cCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHJlYWR5VGltZW91dCBbNjAwMDBdIFRoZSBtYXhpbXVtIHBlcmlvZCBvZiB0aW1lIHRvIHdhaXQgdW50aWwgRW11bGF0b3JcbiAqIGlzIHJlYWR5IGZvciB1c2FnZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByZXRyeVRpbWVzIFsxXSBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhcnR1cCByZXRyaWVzXG4gKi9cblxuLyoqXG4gKiBTdGFydCBhbiBlbXVsYXRvciB3aXRoIGdpdmVuIHBhcmFtZXRlcnMgYW5kIHdhaXQgdW50aWwgaXQgaXMgZnVsbHkgc3RhcnRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXZkTmFtZSAtIFRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGVtdWxhdG9yLlxuICogQHBhcmFtIHs/QXZkTGF1bmNoT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge1N1YlByb2Nlc3N9IEVtdWxhdG9yIHN1YnByb2Nlc3MgaW5zdGFuY2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZW11bGF0b3IgZmFpbHMgdG8gc3RhcnQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5sYXVuY2hBVkQgPSBhc3luYyBmdW5jdGlvbiBsYXVuY2hBVkQgKGF2ZE5hbWUsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXJncyA9IFtdLFxuICAgIGVudiA9IHt9LFxuICAgIGxhbmd1YWdlLFxuICAgIGNvdW50cnksXG4gICAgbGF1bmNoVGltZW91dCA9IDYwMDAwLFxuICAgIHJlYWR5VGltZW91dCA9IDYwMDAwLFxuICAgIHJldHJ5VGltZXMgPSAxLFxuICB9ID0gb3B0cztcbiAgbG9nLmRlYnVnKGBMYXVuY2hpbmcgRW11bGF0b3Igd2l0aCBBVkQgJHthdmROYW1lfSwgbGF1bmNoVGltZW91dCBgICtcbiAgICAgICAgICAgIGAke2xhdW5jaFRpbWVvdXR9bXMgYW5kIHJlYWR5VGltZW91dCAke3JlYWR5VGltZW91dH1tc2ApO1xuICBjb25zdCBlbXVsYXRvckJpbmFyeVBhdGggPSBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2VtdWxhdG9yJyk7XG4gIGlmIChhdmROYW1lWzBdID09PSAnQCcpIHtcbiAgICBhdmROYW1lID0gYXZkTmFtZS5zdWJzdHIoMSk7XG4gIH1cbiAgYXdhaXQgdGhpcy5jaGVja0F2ZEV4aXN0KGF2ZE5hbWUpO1xuXG4gIGNvbnN0IGxhdW5jaEFyZ3MgPSBbJy1hdmQnLCBhdmROYW1lXTtcbiAgbGF1bmNoQXJncy5wdXNoKC4uLih0b0F2ZExvY2FsZUFyZ3MobGFuZ3VhZ2UsIGNvdW50cnkpKSk7XG5cbiAgbGV0IGlzRGVsYXlBZGJGZWF0dXJlRW5hYmxlZCA9IGZhbHNlO1xuICBpZiAodGhpcy5hbGxvd0RlbGF5QWRiKSB7XG4gICAgY29uc3Qge3JldmlzaW9ufSA9IGF3YWl0IHRoaXMuZ2V0RW11VmVyc2lvbkluZm8oKTtcbiAgICBpZiAocmV2aXNpb24gJiYgdXRpbC5jb21wYXJlVmVyc2lvbnMocmV2aXNpb24sICc+PScsICcyOS4wLjcnKSkge1xuICAgICAgLy8gaHR0cHM6Ly9hbmRyb2lkc3R1ZGlvLmdvb2dsZWJsb2cuY29tLzIwMTkvMDUvZW11bGF0b3ItMjkwNy1jYW5hcnkuaHRtbFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge3RhcmdldH0gPSBhd2FpdCB0aGlzLmdldEVtdUltYWdlUHJvcGVydGllcyhhdmROYW1lKTtcbiAgICAgICAgY29uc3QgYXBpTWF0Y2ggPSAvXFxkKy8uZXhlYyh0YXJnZXQpO1xuICAgICAgICAvLyBodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tL2lzc3Vlcy8xNDI1MzMzNTVcbiAgICAgICAgaWYgKGFwaU1hdGNoICYmIHBhcnNlSW50KGFwaU1hdGNoWzBdLCAxMCkgPj0gTUlOX0RFTEFZX0FEQl9BUElfTEVWRUwpIHtcbiAgICAgICAgICBsYXVuY2hBcmdzLnB1c2goJy1kZWxheS1hZGInKTtcbiAgICAgICAgICBpc0RlbGF5QWRiRmVhdHVyZUVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFjdHVhbCBpbWFnZSBBUEkgdmVyc2lvbiBpcyBiZWxvdyAke01JTl9ERUxBWV9BREJfQVBJX0xFVkVMfWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5pbmZvKGBUaGUgLWRlbGF5LWFkYiBlbXVsYXRvciBzdGFydHVwIGRldGVjdGlvbiBmZWF0dXJlIHdpbGwgbm90IGJlIGVuYWJsZWQuIGAgK1xuICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZy5pbmZvKCdUaGUgLWRlbGF5LWFkYiBlbXVsYXRvciBzdGFydHVwIGRldGVjdGlvbiBmZWF0dXJlIGhhcyBiZWVuIGV4cGxpY2l0bHkgZGlzYWJsZWQnKTtcbiAgfVxuXG4gIGlmICghXy5pc0VtcHR5KGFyZ3MpKSB7XG4gICAgbGF1bmNoQXJncy5wdXNoKC4uLihfLmlzQXJyYXkoYXJncykgPyBhcmdzIDogdXRpbC5zaGVsbFBhcnNlKGAke2FyZ3N9YCkpKTtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgUnVubmluZyAnJHtlbXVsYXRvckJpbmFyeVBhdGh9JyB3aXRoIGFyZ3M6ICR7dXRpbC5xdW90ZShsYXVuY2hBcmdzKX1gKTtcbiAgaWYgKCFfLmlzRW1wdHkoZW52KSkge1xuICAgIGxvZy5kZWJ1ZyhgQ3VzdG9taXplZCBlbXVsYXRvciBlbnZpcm9ubWVudDogJHtKU09OLnN0cmluZ2lmeShlbnYpfWApO1xuICB9XG4gIGNvbnN0IHByb2MgPSBuZXcgU3ViUHJvY2VzcyhlbXVsYXRvckJpbmFyeVBhdGgsIGxhdW5jaEFyZ3MsIHtcbiAgICBlbnY6IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCBlbnYpLFxuICB9KTtcbiAgYXdhaXQgcHJvYy5zdGFydCgwKTtcbiAgcHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgZm9yIChsZXQgbGluZSBvZiAoc3Rkb3V0IHx8IHN0ZGVyciB8fCAnJykuc3BsaXQoJ1xcbicpLmZpbHRlcihCb29sZWFuKSkge1xuICAgICAgbG9nLmluZm8oYFtBVkQgT1VUUFVUXSAke2xpbmV9YCk7XG4gICAgfVxuICB9KTtcbiAgcHJvYy5vbignZGllJywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy53YXJuKGBFbXVsYXRvciBhdmQgJHthdmROYW1lfSBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX0ke3NpZ25hbCA/IGAsIHNpZ25hbCAke3NpZ25hbH1gIDogJyd9YCk7XG4gIH0pO1xuICBhd2FpdCByZXRyeShyZXRyeVRpbWVzLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldFJ1bm5pbmdBVkRXaXRoUmV0cnkoYXZkTmFtZSwgbGF1bmNoVGltZW91dCkpO1xuICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZGV2aWNlSWQgYWxyZWFkeSBhc3NpZ25lZFxuICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICBpZiAoaXNEZWxheUFkYkZlYXR1cmVFbmFibGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3dhaXQtZm9yLWRldmljZSddLCB7dGltZW91dDogcmVhZHlUaW1lb3V0fSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHthdmROYW1lfScgRW11bGF0b3IgaGFzIGZhaWxlZCB0byBib290OiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgdGhpcy53YWl0Rm9yRW11bGF0b3JSZWFkeShyZWFkeVRpbWVvdXQgLSB0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzKTtcbiAgcmV0dXJuIHByb2M7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEJpbmFyeVZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7U2VtVmVyfSB2ZXJzaW9uIC0gVGhlIEFEQiBiaW5hcnkgdmVyc2lvbiBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBidWlsZCAtIFRoZSBBREIgYmluYXJ5IGJ1aWxkIG51bWJlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQnJpZGdlVmVyc2lvblxuICogQHByb3BlcnR5IHtTZW1WZXJ9IHZlcnNpb24gLSBUaGUgQW5kcm9pZCBEZWJ1ZyBCcmlkZ2UgdmVyc2lvbiBudW1iZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7P0JpbmFyeVZlcnNpb259IGJpbmFyeSBUaGlzIHZlcnNpb24gbnVtYmVyIG1pZ2h0IG5vdCBiZVxuICogYmUgcHJlc2VudCBmb3Igb2xkZXIgQURCIHJlbGVhc2VzLlxuICogQHByb3BlcnR5IHtCcmlkZ2VWZXJzaW9ufSBicmlkZ2VcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgYWRiIHZlcnNpb24uIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgY2FjaGVkLlxuICpcbiAqIEByZXR1cm4ge1ZlcnNpb259XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHBhcnNlIGFkYiBiaW5hcnkgdmVyc2lvbi5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuZ2V0VmVyc2lvbiA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uICgpIHtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoJ3ZlcnNpb24nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBhZGIgdmVyc2lvbjogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY29uc3QgYmluYXJ5VmVyc2lvbk1hdGNoID0gQklOQVJZX1ZFUlNJT05fUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmIChiaW5hcnlWZXJzaW9uTWF0Y2gpIHtcbiAgICByZXN1bHQuYmluYXJ5ID0ge1xuICAgICAgdmVyc2lvbjogc2VtdmVyLmNvZXJjZShiaW5hcnlWZXJzaW9uTWF0Y2hbMV0pLFxuICAgICAgYnVpbGQ6IHBhcnNlSW50KGJpbmFyeVZlcnNpb25NYXRjaFsyXSwgMTApLFxuICAgIH07XG4gIH1cbiAgY29uc3QgYnJpZGdlVmVyc2lvbk1hdGNoID0gQlJJREdFX1ZFUlNJT05fUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmIChicmlkZ2VWZXJzaW9uTWF0Y2gpIHtcbiAgICByZXN1bHQuYnJpZGdlID0ge1xuICAgICAgdmVyc2lvbjogc2VtdmVyLmNvZXJjZShicmlkZ2VWZXJzaW9uTWF0Y2hbMV0pLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGVtdWxhdG9yIGlzIHJlYWR5IHRvIGFjY2VwdCBmdXJ0aGVyIGNvbW1hbmRzIChib290aW5nIGNvbXBsZXRlZCkuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRNcyBbMjAwMDBdIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBlbXVsYXRvciBpcyBub3QgcmVhZHkgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy53YWl0Rm9yRW11bGF0b3JSZWFkeSA9IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JFbXVsYXRvclJlYWR5ICh0aW1lb3V0TXMgPSAyMDAwMCkge1xuICBjb25zdCByZXF1aXJlZFNlcnZpY2VzUmUgPSBSRVFVSVJFRF9TRVJWSUNFUy5tYXAoKG5hbWUpID0+IG5ldyBSZWdFeHAoYFxcXFxiJHtuYW1lfTpgKSk7XG4gIGxldCBzZXJ2aWNlcztcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlcnZpY2VzID0gYXdhaXQgdGhpcy5zaGVsbChbJ3NlcnZpY2UnLCAnbGlzdCddKTtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVkU2VydmljZXNSZS5ldmVyeSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNlcnZpY2VzKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBXYWl0aW5nIGZvciBlbXVsYXRvciBzdGFydHVwLiBJbnRlcm1lZGlhdGUgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyxcbiAgICAgIGludGVydmFsTXM6IDMwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoc2VydmljZXMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUmVjZW50bHkgbGlzdGVkIHNlcnZpY2VzOlxcbiR7c2VydmljZXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlcyA9IF8uemlwKFJFUVVJUkVEX1NFUlZJQ0VTLCByZXF1aXJlZFNlcnZpY2VzUmUpXG4gICAgICAuZmlsdGVyKChbLCBwYXR0ZXJuXSkgPT4gIXBhdHRlcm4udGVzdChzZXJ2aWNlcykpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRW11bGF0b3IgaXMgbm90IHJlYWR5IHdpdGhpbiAke3RpbWVvdXRNc31tcyBgICtcbiAgICAgIGAoJHttaXNzaW5nU2VydmljZXN9IHNlcnZpY2Uke21pc3NpbmdTZXJ2aWNlcy5sZW5ndGggPT09IDEgPyAnIGlzJyA6ICdzIGFyZSd9IG5vdCBydW5uaW5nKWApO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyByZWFkeSB0byBhY2NlcHQgZnVydGhlciBjb21tYW5kcyAoYm9vdGluZyBjb21wbGV0ZWQpLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcHBEZXZpY2VSZWFkeVRpbWVvdXQgWzMwXSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGRldmljZSBpcyBub3QgcmVhZHkgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy53YWl0Rm9yRGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckRldmljZSAoYXBwRGV2aWNlUmVhZHlUaW1lb3V0ID0gMzApIHtcbiAgdGhpcy5hcHBEZXZpY2VSZWFkeVRpbWVvdXQgPSBhcHBEZXZpY2VSZWFkeVRpbWVvdXQ7XG4gIGNvbnN0IHJldHJpZXMgPSAzO1xuICBjb25zdCB0aW1lb3V0ID0gcGFyc2VJbnQodGhpcy5hcHBEZXZpY2VSZWFkeVRpbWVvdXQsIDEwKSAqIDEwMDAgLyByZXRyaWVzO1xuICBhd2FpdCByZXRyeShyZXRyaWVzLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiRXhlYygnd2FpdC1mb3ItZGV2aWNlJywge3RpbWVvdXR9KTtcbiAgICAgIGF3YWl0IHRoaXMucGluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2FpdGluZyBmb3IgdGhlIGRldmljZSB0byBiZSBhdmFpbGFibGUuIE9yaWdpbmFsIGVycm9yOiAnJHtlLm1lc3NhZ2V9J2ApO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIFJlYm9vdCB0aGUgY3VycmVudCBkZXZpY2UgYW5kIHdhaXQgdW50aWwgaXQgaXMgY29tcGxldGVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFtERUZBVUxUX0FEQl9SRUJPT1RfUkVUUklFU10gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVib290IHJldHJpZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGRldmljZSBmYWlsZWQgdG8gcmVib290IGFuZCBudW1iZXIgb2YgcmV0cmllcyBpcyBleGNlZWRlZC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMucmVib290ID0gYXN5bmMgZnVuY3Rpb24gcmVib290IChyZXRyaWVzID0gREVGQVVMVF9BREJfUkVCT09UX1JFVFJJRVMpIHtcbiAgLy8gR2V0IHJvb3QgYWNjZXNzIHNvIHdlIGNhbiBydW4gdGhlIG5leHQgc2hlbGwgY29tbWFuZHMgd2hpY2ggcmVxdWlyZSByb290IGFjY2Vzc1xuICBjb25zdCB7IHdhc0FscmVhZHlSb290ZWQgfSA9IGF3YWl0IHRoaXMucm9vdCgpO1xuICB0cnkge1xuICAgIC8vIFN0b3AgYW5kIHJlLXN0YXJ0IHRoZSBkZXZpY2VcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnc3RvcCddKTtcbiAgICBhd2FpdCBCLmRlbGF5KDIwMDApOyAvLyBsZXQgdGhlIGVtdSBmaW5pc2ggc3RvcHBpbmc7XG4gICAgYXdhaXQgdGhpcy5zZXREZXZpY2VQcm9wZXJ0eSgnc3lzLmJvb3RfY29tcGxldGVkJywgMCwge1xuICAgICAgcHJpdmlsZWdlZDogZmFsc2UgLy8gbm8gbmVlZCB0byBzZXQgcHJpdmlsZWdlZCB0cnVlIGJlY2F1c2UgZGV2aWNlIGFscmVhZHkgcm9vdGVkXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3N0YXJ0J10pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3Qge21lc3NhZ2V9ID0gZTtcblxuICAgIC8vIHByb3ZpZGUgYSBoZWxwZnVsIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHJlYXNvbiByZWJvb3QgZmFpbGVkIHdhcyBiZWNhdXNlIEFEQiBjb3VsZG4ndCBnYWluIHJvb3QgYWNjZXNzXG4gICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ211c3QgYmUgcm9vdCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZWJvb3QgZGV2aWNlLiBSZWJvb3RpbmcgcmVxdWlyZXMgcm9vdCBhY2Nlc3MgYW5kIGAgK1xuICAgICAgICBgYXR0ZW1wdCB0byBnZXQgcm9vdCBhY2Nlc3Mgb24gZGV2aWNlIGZhaWxlZCB3aXRoIGVycm9yOiAnJHttZXNzYWdlfSdgKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZXR1cm4gcm9vdCBzdGF0ZSB0byB3aGF0IGl0IHdhcyBiZWZvcmVcbiAgICBpZiAoIXdhc0FscmVhZHlSb290ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMudW5yb290KCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgIGlmICgoYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgnc3lzLmJvb3RfY29tcGxldGVkJykpID09PSAnMScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGUgc3RhY2sgdHJhY2UsIHNvIG5vIGxvZy5lcnJvckFuZFRocm93XG4gICAgY29uc3QgbXNnID0gYFJlYm9vdCBpcyBub3QgY29tcGxldGVkIGFmdGVyICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYDtcbiAgICBsb2cuZGVidWcobXNnKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IHJvb3RSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNTdWNjZXNzZnVsIFRydWUgaWYgdGhlIGNhbGwgdG8gcm9vdC91bnJvb3Qgd2FzIHN1Y2Nlc3NmdWxcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2FzQWxyZWFkeVJvb3RlZCBUcnVlIGlmIHRoZSBkZXZpY2Ugd2FzIGFscmVhZHkgcm9vdGVkXG4gKi9cblxuLyoqXG4gKiBTd2l0Y2ggYWRiIHNlcnZlciByb290IHByaXZpbGVnZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRWxldmF0ZWQgLSBTaG91bGQgd2UgZWxldmF0ZSB0byB0byByb290IG9yIHVucm9vdD8gKGRlZmF1bHQgdHJ1ZSlcbiAqIEByZXR1cm4ge3Jvb3RSZXN1bHR9XG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmNoYW5nZVVzZXJQcml2aWxlZ2VzID0gYXN5bmMgZnVuY3Rpb24gY2hhbmdlVXNlclByaXZpbGVnZXMgKGlzRWxldmF0ZWQpIHtcbiAgY29uc3QgY21kID0gaXNFbGV2YXRlZCA/ICdyb290JyA6ICd1bnJvb3QnO1xuXG4gIGNvbnN0IHJldHJ5SWZPZmZsaW5lID0gYXN5bmMgKGNtZEZ1bmMpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNtZEZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIENoZWNrIHRoZSBvdXRwdXQgb2YgdGhlIHN0ZEVyciB0byBzZWUgaWYgdGhlcmUncyBhbnkgY2x1ZXMgdGhhdCBzaG93IHRoYXQgdGhlIGRldmljZSB3ZW50IG9mZmxpbmVcbiAgICAgIC8vIGFuZCBpZiBpdCBkaWQgZ28gb2ZmbGluZSwgcmVzdGFydCBBREJcbiAgICAgIGlmIChbJ2Nsb3NlZCcsICdkZXZpY2Ugb2ZmbGluZScsICd0aW1lb3V0IGV4cGlyZWQnXVxuICAgICAgICAgIC5zb21lKCh4KSA9PiAoZXJyLnN0ZGVyciB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh4KSkpIHtcbiAgICAgICAgbG9nLndhcm4oYEF0dGVtcHQgdG8gJHtjbWR9IGNhdXNlZCBBREIgdG8gdGhpbmsgdGhlIGRldmljZSB3ZW50IG9mZmxpbmVgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlY29ubmVjdCgpO1xuICAgICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgY21kRnVuYygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBJZiBpdCdzIGFscmVhZHkgcm9vdGVkLCBvdXIgam9iIGlzIGRvbmUuIE5vIG5lZWQgdG8gcm9vdCBpdCBhZ2Fpbi5cbiAgY29uc3QgaXNSb290ID0gYXdhaXQgcmV0cnlJZk9mZmxpbmUoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1Jvb3QoKSk7XG4gIGlmICgoaXNSb290ICYmIGlzRWxldmF0ZWQpIHx8ICghaXNSb290ICYmICFpc0VsZXZhdGVkKSkge1xuICAgIHJldHVybiB7aXNTdWNjZXNzZnVsOiB0cnVlLCB3YXNBbHJlYWR5Um9vdGVkOiBpc1Jvb3R9O1xuICB9XG5cbiAgbGV0IHdhc0FscmVhZHlSb290ZWQgPSBpc1Jvb3Q7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCByZXRyeUlmT2ZmbGluZShhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoW2NtZF0pKTtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcblxuICAgIC8vIG9uIHJlYWwgZGV2aWNlcyBpbiBzb21lIHNpdHVhdGlvbnMgd2UgZ2V0IGFuIGVycm9yIGluIHRoZSBzdGRvdXRcbiAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICBpZiAoc3Rkb3V0LmluY2x1ZGVzKCdhZGJkIGNhbm5vdCBydW4gYXMgcm9vdCcpKSB7XG4gICAgICAgIHJldHVybiB7aXNTdWNjZXNzZnVsOiBmYWxzZSwgd2FzQWxyZWFkeVJvb3RlZH07XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgZGV2aWNlIHdhcyBhbHJlYWR5IHJvb3RlZCwgcmV0dXJuIHRoYXQgaW4gdGhlIHJlc3VsdFxuICAgICAgaWYgKHN0ZG91dC5pbmNsdWRlcygnYWxyZWFkeSBydW5uaW5nIGFzIHJvb3QnKSkge1xuICAgICAgICB3YXNBbHJlYWR5Um9vdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtpc1N1Y2Nlc3NmdWw6IHRydWUsIHdhc0FscmVhZHlSb290ZWR9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zdCB7c3RkZXJyID0gJycsIG1lc3NhZ2V9ID0gZXJyO1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gJHtjbWR9IGFkYiBkYWVtb24uIE9yaWdpbmFsIGVycm9yOiAnJHttZXNzYWdlfScuIFN0ZGVycjogJyR7c3RkZXJyfScuIENvbnRpbnVpbmcuYCk7XG4gICAgcmV0dXJuIHtpc1N1Y2Nlc3NmdWw6IGZhbHNlLCB3YXNBbHJlYWR5Um9vdGVkfTtcbiAgfVxufTtcblxuLyoqXG4gKiBTd2l0Y2ggYWRiIHNlcnZlciB0byByb290IG1vZGVcbiAqIEByZXR1cm4ge3Jvb3RSZXN1bHR9XG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLnJvb3QgPSBhc3luYyBmdW5jdGlvbiByb290ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbmdlVXNlclByaXZpbGVnZXModHJ1ZSk7XG59O1xuXG4vKipcbiAqIFN3aXRjaCBhZGIgc2VydmVyIHRvIG5vbi1yb290IG1vZGUuXG4gKlxuICogQHJldHVybiB7cm9vdFJlc3VsdH1cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMudW5yb290ID0gYXN5bmMgZnVuY3Rpb24gdW5yb290ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbmdlVXNlclByaXZpbGVnZXMoZmFsc2UpO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGlzIHJvb3RcbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB1c2VyIGlzIHJvb3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaWRlbnRpZnlpbmdcbiAqIHRoZSB1c2VyLlxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5pc1Jvb3QgPSBhc3luYyBmdW5jdGlvbiBpc1Jvb3QgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGwoWyd3aG9hbWknXSkpLnRyaW0oKSA9PT0gJ3Jvb3QnO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhIHJlbW90ZSBwYXRoIGV4aXN0cyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcmVtb3RlIHBhdGggdG8gdmVyaWZ5LlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcGF0aCBleGlzdHMgb24gdGhlIGRldmljZS5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuZmlsZUV4aXN0cyA9IGFzeW5jIGZ1bmN0aW9uIGZpbGVFeGlzdHMgKHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgcGFzc0ZsYWcgPSAnX19QQVNTX18nO1xuICBjb25zdCBjaGVja0NtZCA9IGBbIC1lICcke3JlbW90ZVBhdGgucmVwbGFjZSgvJy9nLCBgXFxcXCdgKX0nIF0gJiYgZWNobyAke3Bhc3NGbGFnfWA7XG4gIHRyeSB7XG4gICAgcmV0dXJuIF8uaW5jbHVkZXMoYXdhaXQgdGhpcy5zaGVsbChbY2hlY2tDbWRdKSwgcGFzc0ZsYWcpO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBvdXRwdXQgb2YgX2xzXyBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSByZW1vdGUgcGF0aCAodGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBfbHNfIGNvbW1hbmQpLlxuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gb3B0cyBbW11dIC0gQWRkaXRpb25hbCBfbHNfIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIF9sc18gb3V0cHV0IGFzIGFuIGFycmF5IG9mIHNwbGl0IGxpbmVzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIEFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkIG9mIHRoZSBnaXZlbiBfcmVtb3RlUGF0aF9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBleGlzdC5cbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMubHMgPSBhc3luYyBmdW5jdGlvbiBscyAocmVtb3RlUGF0aCwgb3B0cyA9IFtdKSB7XG4gIHRyeSB7XG4gICAgbGV0IGFyZ3MgPSBbJ2xzJywgLi4ub3B0cywgcmVtb3RlUGF0aF07XG4gICAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gICAgbGV0IGxpbmVzID0gc3Rkb3V0LnNwbGl0KCdcXG4nKTtcbiAgICByZXR1cm4gbGluZXMubWFwKChsKSA9PiBsLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5maWx0ZXIoKGwpID0+IGwuaW5kZXhPZignTm8gc3VjaCBmaWxlJykgPT09IC0xKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5tZXNzYWdlLmluZGV4T2YoJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgcGFydGljdWxhciBmaWxlIGxvY2F0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHJlbW90ZSBwYXRoIHRvIHRoZSBmaWxlLlxuICogQHJldHVybiB7bnVtYmVyfSBGaWxlIHNpemUgaW4gYnl0ZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGZpbGUuXG4gKi9cbnN5c3RlbUNhbGxNZXRob2RzLmZpbGVTaXplID0gYXN5bmMgZnVuY3Rpb24gZmlsZVNpemUgKHJlbW90ZVBhdGgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMubHMocmVtb3RlUGF0aCwgWyctbGEnXSk7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZW1vdGUgcGF0aCBpcyBub3QgYSBmaWxlYCk7XG4gICAgfVxuICAgIC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvZk9zNFA0LzhcbiAgICBjb25zdCBtYXRjaCA9IC9bcnd4c1N0VFxcLStdezEwfVtcXHNcXGRdKlxcc1teXFxzXStcXHMrW15cXHNdK1xccysoXFxkKykvLmV4ZWMoZmlsZXNbMF0pO1xuICAgIGlmICghbWF0Y2ggfHwgXy5pc05hTihwYXJzZUludChtYXRjaFsxXSwgMTApKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2Ugc2l6ZSBmcm9tIGxpc3Qgb3V0cHV0OiAnJHtmaWxlc1swXX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBnZXQgZmlsZSBzaXplIGZvciAnJHtyZW1vdGVQYXRofSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIGdpdmVuIGNlcnRpZmljYXRlIG9uIGEgcm9vdGVkIHJlYWwgZGV2aWNlIG9yXG4gKiBhbiBlbXVsYXRvci4gVGhlIGVtdWxhdG9yIG11c3QgYmUgZXhlY3V0ZWQgd2l0aCBgLXdyaXRhYmxlLXN5c3RlbWBcbiAqIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIGFkYiBkYWVtb24gc2hvdWxkIGJlIHJ1bm5pbmcgaW4gcm9vdFxuICogbW9kZSBmb3IgdGhpcyBtZXRob2QgdG8gd29yayBwcm9wZXJseS4gVGhlIG1ldGhvZCBhbHNvIHJlcXVpcmVzXG4gKiBvcGVuc3NsIHRvb2wgdG8gYmUgYXZhaWxhYmxlIG9uIHRoZSBkZXN0aW5hdGlvbiBzeXN0ZW0uXG4gKiBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMDk2NFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIHRvcGljXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8c3RyaW5nfSBjZXJ0IC0gYmFzZTY0LWRlY29kZWQgY29udGVudCBvZiB0aGUgYWN0dWFsIGNlcnRpZmljYXRlXG4gKiByZXByZXNlbnRlZCBhcyBhIHN0cmluZyBvciBhIGJ1ZmZlclxuICogQHRocm93cyB7RXJyb3J9IElmIG9wZW5zc2wgdG9vbCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBkZXN0aW5hdGlvbiBzeXN0ZW1cbiAqIG9yIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBpbnN0YWxsaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICovXG5zeXN0ZW1DYWxsTWV0aG9kcy5pbnN0YWxsTWl0bUNlcnRpZmljYXRlID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE1pdG1DZXJ0aWZpY2F0ZSAoY2VydCkge1xuICBjb25zdCBvcGVuU3NsID0gYXdhaXQgZ2V0T3BlblNzbEZvck9zKCk7XG5cbiAgaWYgKCFfLmlzQnVmZmVyKGNlcnQpKSB7XG4gICAgY2VydCA9IEJ1ZmZlci5mcm9tKGNlcnQsICdiYXNlNjQnKTtcbiAgfVxuXG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzcmNDZXJ0ID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsICdzb3VyY2UuY2VyJyk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHNyY0NlcnQsIGNlcnQpO1xuICAgIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMob3BlblNzbCwgWyd4NTA5JywgJy1ub291dCcsICctaGFzaCcsICctaW4nLCBzcmNDZXJ0XSk7XG4gICAgY29uc3QgY2VydEhhc2ggPSBzdGRvdXQudHJpbSgpO1xuICAgIGxvZy5kZWJ1ZyhgR290IGNlcnRpZmljYXRlIGhhc2g6ICR7Y2VydEhhc2h9YCk7XG4gICAgbG9nLmRlYnVnKCdQcmVwYXJpbmcgY2VydGlmaWNhdGUgY29udGVudCcpO1xuICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMob3BlblNzbCwgWyd4NTA5JywgJy1pbicsIHNyY0NlcnRdLCB7aXNCdWZmZXI6IHRydWV9KSk7XG4gICAgbGV0IGRzdENlcnRDb250ZW50ID0gc3Rkb3V0O1xuICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMob3BlblNzbCwgWyd4NTA5JyxcbiAgICAgICctaW4nLCBzcmNDZXJ0LFxuICAgICAgJy10ZXh0JyxcbiAgICAgICctZmluZ2VycHJpbnQnLFxuICAgICAgJy1ub291dCddLCB7aXNCdWZmZXI6IHRydWV9KSk7XG4gICAgZHN0Q2VydENvbnRlbnQgPSBCdWZmZXIuY29uY2F0KFtkc3RDZXJ0Q29udGVudCwgc3Rkb3V0XSk7XG4gICAgY29uc3QgZHN0Q2VydCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBgJHtjZXJ0SGFzaH0uMGApO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkc3RDZXJ0LCBkc3RDZXJ0Q29udGVudCk7XG4gICAgbG9nLmRlYnVnKCdSZW1vdW50aW5nIC9zeXN0ZW0gaW4gcncgbW9kZScpO1xuICAgIC8vIFNvbWV0aW1lcyBlbXVsYXRvciByZWJvb3QgaXMgc3RpbGwgbm90IGZ1bGx5IGZpbmlzaGVkIG9uIHRoaXMgc3RhZ2UsIHNvIHJldHJ5XG4gICAgYXdhaXQgcmV0cnlJbnRlcnZhbCg1LCAyMDAwLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZW1vdW50J10pKTtcbiAgICBsb2cuZGVidWcoYFVwbG9hZGluZyB0aGUgZ2VuZXJhdGVkIGNlcnRpZmljYXRlIGZyb20gJyR7ZHN0Q2VydH0nIHRvICcke0NFUlRTX1JPT1R9J2ApO1xuICAgIGF3YWl0IHRoaXMucHVzaChkc3RDZXJ0LCBDRVJUU19ST09UKTtcbiAgICBsb2cuZGVidWcoJ1JlbW91bnRpbmcgL3N5c3RlbSB0byBjb25maXJtIGNoYW5nZXMnKTtcbiAgICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZW1vdW50J10pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbmplY3QgdGhlIGN1c3RvbSBjZXJ0aWZpY2F0ZS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgY2VydGlmaWNhdGUgcHJvcGVybHkgZW5jb2RlZCBpbnRvIGJhc2U2NC1zdHJpbmc/IGAgK1xuICAgICAgICAgICAgICAgICAgICBgRG8geW91IGhhdmUgcm9vdCBwZXJtaXNzaW9ucyBvbiB0aGUgZGV2aWNlPyBgICtcbiAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuLyoqXG4gKiBWZXJpZmllcyBpZiB0aGUgZ2l2ZW4gcm9vdCBjZXJ0aWZpY2F0ZSBpcyBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfHN0cmluZ30gY2VydCAtIGJhc2U2NC1kZWNvZGVkIGNvbnRlbnQgb2YgdGhlIGFjdHVhbCBjZXJ0aWZpY2F0ZVxuICogcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgb3IgYSBidWZmZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBvcGVuc3NsIHRvb2wgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgZGVzdGluYXRpb24gc3lzdGVtXG4gKiBvciBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hlY2tpbmcgdGhlIGNlcnRpZmljYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUgaXMgYWxyZWFkeSBpbnN0YWxsZWRcbiAqL1xuc3lzdGVtQ2FsbE1ldGhvZHMuaXNNaXRtQ2VydGlmaWNhdGVJbnN0YWxsZWQgPSBhc3luYyBmdW5jdGlvbiBpc01pdG1DZXJ0aWZpY2F0ZUluc3RhbGxlZCAoY2VydCkge1xuICBjb25zdCBvcGVuU3NsID0gYXdhaXQgZ2V0T3BlblNzbEZvck9zKCk7XG5cbiAgaWYgKCFfLmlzQnVmZmVyKGNlcnQpKSB7XG4gICAgY2VydCA9IEJ1ZmZlci5mcm9tKGNlcnQsICdiYXNlNjQnKTtcbiAgfVxuXG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgbGV0IGNlcnRIYXNoO1xuICB0cnkge1xuICAgIGNvbnN0IHRtcENlcnQgPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgJ3NvdXJjZS5jZXInKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodG1wQ2VydCwgY2VydCk7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKG9wZW5Tc2wsIFsneDUwOScsICctbm9vdXQnLCAnLWhhc2gnLCAnLWluJywgdG1wQ2VydF0pO1xuICAgIGNlcnRIYXNoID0gc3Rkb3V0LnRyaW0oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGNlcnRpZmljYXRlIGhhc2guIGAgK1xuICAgICAgICAgICAgICAgICAgICBgSXMgdGhlIGNlcnRpZmljYXRlIHByb3Blcmx5IGVuY29kZWQgaW50byBiYXNlNjQtc3RyaW5nPyBgICtcbiAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxuICBjb25zdCBkc3RQYXRoID0gcGF0aC5wb3NpeC5yZXNvbHZlKENFUlRTX1JPT1QsIGAke2NlcnRIYXNofS4wYCk7XG4gIGxvZy5kZWJ1ZyhgQ2hlY2tpbmcgaWYgdGhlIGNlcnRpZmljYXRlIGlzIGFscmVhZHkgaW5zdGFsbGVkIGF0ICcke2RzdFBhdGh9J2ApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5maWxlRXhpc3RzKGRzdFBhdGgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgc3lzdGVtQ2FsbE1ldGhvZHM7XG5leHBvcnQgeyBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQsIGdldEFuZHJv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
@@ -33,6 +33,7 @@ const SDK_BINARY_ROOTS = [
33
33
  '.' // Allow custom sdkRoot to specify full folder path
34
34
  ];
35
35
  const MIN_DELAY_ADB_API_LEVEL = 28;
36
+ const REQUIRED_SERVICES = ['activity', 'package', 'mount'];
36
37
 
37
38
  /**
38
39
  * Retrieve full path to the given binary.
@@ -951,7 +952,7 @@ systemCallMethods.getVersion = _.memoize(async function getVersion () {
951
952
  * @throws {Error} If the emulator is not ready within the given timeout.
952
953
  */
953
954
  systemCallMethods.waitForEmulatorReady = async function waitForEmulatorReady (timeoutMs = 20000) {
954
- const requiredServicesRe = [/\bactivity:/, /\bpackage:/];
955
+ const requiredServicesRe = REQUIRED_SERVICES.map((name) => new RegExp(`\\b${name}:`));
955
956
  let services;
956
957
  try {
957
958
  await waitForCondition(async () => {
@@ -968,9 +969,13 @@ systemCallMethods.waitForEmulatorReady = async function waitForEmulatorReady (ti
968
969
  });
969
970
  } catch (e) {
970
971
  if (services) {
971
- log.debug(`Recent services:\n${services}`);
972
+ log.debug(`Recently listed services:\n${services}`);
972
973
  }
973
- throw new Error(`Emulator is not ready within ${timeoutMs}ms`);
974
+ const missingServices = _.zip(REQUIRED_SERVICES, requiredServicesRe)
975
+ .filter(([, pattern]) => !pattern.test(services))
976
+ .map(([name]) => name);
977
+ throw new Error(`Emulator is not ready within ${timeoutMs}ms ` +
978
+ `(${missingServices} service${missingServices.length === 1 ? ' is' : 's are'} not running)`);
974
979
  }
975
980
  };
976
981
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-adb",
3
- "version": "9.10.1",
3
+ "version": "9.10.2",
4
4
  "description": "Android Debug Bridge interface",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {