appium-adb 8.16.2 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,36 +5,41 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ exports.DEFAULT_ADB_EXEC_TIMEOUT = exports.APK_INSTALL_TIMEOUT = exports.APK_EXTENSION = exports.APKS_INSTALL_TIMEOUT = exports.APKS_EXTENSION = void 0;
9
+ exports.buildInstallArgs = buildInstallArgs;
10
+ exports.buildStartCmd = buildStartCmd;
11
+ exports.dirExists = dirExists;
12
+ exports.escapeShellArg = escapeShellArg;
13
+ exports.extractMatchingPermissions = void 0;
14
+ exports.formatConfigMarker = formatConfigMarker;
8
15
  exports.getAndroidPlatformAndPath = getAndroidPlatformAndPath;
9
- exports.unzipFile = unzipFile;
16
+ exports.getAndroidPrefsRoot = getAndroidPrefsRoot;
17
+ exports.getApkanalyzerForOs = getApkanalyzerForOs;
18
+ exports.getApksignerForOs = getApksignerForOs;
19
+ exports.getBuildToolsDirs = void 0;
10
20
  exports.getIMEListFromOutput = getIMEListFromOutput;
11
- exports.isShowingLockscreen = isShowingLockscreen;
12
- exports.isCurrentFocusOnKeyguard = isCurrentFocusOnKeyguard;
21
+ exports.getOpenSslForOs = exports.getJavaHome = exports.getJavaForOs = void 0;
22
+ exports.getSdkRootFromEnv = getSdkRootFromEnv;
23
+ exports.getSdkToolsVersion = void 0;
13
24
  exports.getSurfaceOrientation = getSurfaceOrientation;
25
+ exports.isCurrentFocusOnKeyguard = isCurrentFocusOnKeyguard;
14
26
  exports.isScreenOnFully = isScreenOnFully;
15
- exports.buildStartCmd = buildStartCmd;
16
- exports.getApksignerForOs = getApksignerForOs;
17
- exports.getApkanalyzerForOs = getApkanalyzerForOs;
18
- exports.buildInstallArgs = buildInstallArgs;
19
- exports.parseManifest = parseManifest;
20
- exports.parseAaptStrings = parseAaptStrings;
27
+ exports.isShowingLockscreen = isShowingLockscreen;
21
28
  exports.parseAapt2Strings = parseAapt2Strings;
22
- exports.formatConfigMarker = formatConfigMarker;
29
+ exports.parseAaptStrings = parseAaptStrings;
23
30
  exports.parseJsonData = parseJsonData;
24
- exports.unsignApk = unsignApk;
25
- exports.toAvdLocaleArgs = toAvdLocaleArgs;
31
+ exports.parseManifest = parseManifest;
26
32
  exports.requireSdkRoot = requireSdkRoot;
27
- exports.getSdkRootFromEnv = getSdkRootFromEnv;
28
- exports.getAndroidPrefsRoot = getAndroidPrefsRoot;
29
- exports.dirExists = dirExists;
30
- exports.escapeShellArg = escapeShellArg;
31
- exports.DEFAULT_ADB_EXEC_TIMEOUT = exports.APK_EXTENSION = exports.APKS_INSTALL_TIMEOUT = exports.APK_INSTALL_TIMEOUT = exports.APKS_EXTENSION = exports.extractMatchingPermissions = exports.getOpenSslForOs = exports.getBuildToolsDirs = exports.getSdkToolsVersion = exports.rootDir = exports.getJavaHome = exports.getJavaForOs = void 0;
33
+ exports.rootDir = void 0;
34
+ exports.toAvdLocaleArgs = toAvdLocaleArgs;
35
+ exports.unsignApk = unsignApk;
36
+ exports.unzipFile = unzipFile;
32
37
 
33
38
  require("source-map-support/register");
34
39
 
35
40
  var _path = _interopRequireDefault(require("path"));
36
41
 
37
- var _appiumSupport = require("appium-support");
42
+ var _support = require("@appium/support");
38
43
 
39
44
  var _logger = _interopRequireDefault(require("./logger.js"));
40
45
 
@@ -72,11 +77,11 @@ async function requireSdkRoot(customRoot = null) {
72
77
  throw new Error(`Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. ${docMsg}`);
73
78
  }
74
79
 
75
- if (!(await _appiumSupport.fs.exists(sdkRoot))) {
80
+ if (!(await _support.fs.exists(sdkRoot))) {
76
81
  throw new Error(`The Android SDK root folder '${sdkRoot}' does not exist on the local file system. ${docMsg}`);
77
82
  }
78
83
 
79
- const stats = await _appiumSupport.fs.stat(sdkRoot);
84
+ const stats = await _support.fs.stat(sdkRoot);
80
85
 
81
86
  if (!stats.isDirectory()) {
82
87
  throw new Error(`The Android SDK root '${sdkRoot}' must be a folder. ${docMsg}`);
@@ -86,14 +91,14 @@ async function requireSdkRoot(customRoot = null) {
86
91
  }
87
92
 
88
93
  async function getAndroidPlatformAndPath(sdkRoot) {
89
- const propsPaths = await _appiumSupport.fs.glob('*/build.prop', {
94
+ const propsPaths = await _support.fs.glob('*/build.prop', {
90
95
  cwd: _path.default.resolve(sdkRoot, 'platforms'),
91
96
  absolute: true
92
97
  });
93
98
  const platformsMapping = {};
94
99
 
95
100
  for (const propsPath of propsPaths) {
96
- const propsContent = await _appiumSupport.fs.readFile(propsPath, 'utf-8');
101
+ const propsContent = await _support.fs.readFile(propsPath, 'utf-8');
97
102
 
98
103
  const platformPath = _path.default.dirname(propsPath);
99
104
 
@@ -134,19 +139,19 @@ async function getAndroidPlatformAndPath(sdkRoot) {
134
139
  async function unzipFile(zipPath, dstRoot = _path.default.dirname(zipPath)) {
135
140
  _logger.default.debug(`Unzipping '${zipPath}' to '${dstRoot}'`);
136
141
 
137
- await _appiumSupport.zip.assertValidZip(zipPath);
138
- await _appiumSupport.zip.extractAllTo(zipPath, dstRoot);
142
+ await _support.zip.assertValidZip(zipPath);
143
+ await _support.zip.extractAllTo(zipPath, dstRoot);
139
144
 
140
145
  _logger.default.debug('Unzip successful');
141
146
  }
142
147
 
143
148
  async function unsignApk(apkPath) {
144
- const tmpRoot = await _appiumSupport.tempDir.openDir();
149
+ const tmpRoot = await _support.tempDir.openDir();
145
150
  const metaInfFolderName = 'META-INF';
146
151
 
147
152
  try {
148
153
  let hasMetaInf = false;
149
- await _appiumSupport.zip.readEntries(apkPath, ({
154
+ await _support.zip.readEntries(apkPath, ({
150
155
  entry
151
156
  }) => {
152
157
  hasMetaInf = entry.fileName.startsWith(`${metaInfFolderName}/`);
@@ -159,19 +164,19 @@ async function unsignApk(apkPath) {
159
164
 
160
165
  const tmpZipRoot = _path.default.resolve(tmpRoot, 'apk');
161
166
 
162
- await _appiumSupport.zip.extractAllTo(apkPath, tmpZipRoot);
163
- await _appiumSupport.fs.rimraf(_path.default.resolve(tmpZipRoot, metaInfFolderName));
167
+ await _support.zip.extractAllTo(apkPath, tmpZipRoot);
168
+ await _support.fs.rimraf(_path.default.resolve(tmpZipRoot, metaInfFolderName));
164
169
 
165
170
  const tmpResultPath = _path.default.resolve(tmpRoot, _path.default.basename(apkPath));
166
171
 
167
- await _appiumSupport.zip.toArchive(tmpResultPath, {
172
+ await _support.zip.toArchive(tmpResultPath, {
168
173
  cwd: tmpZipRoot
169
174
  });
170
- await _appiumSupport.fs.unlink(apkPath);
171
- await _appiumSupport.fs.mv(tmpResultPath, apkPath);
175
+ await _support.fs.unlink(apkPath);
176
+ await _support.fs.mv(tmpResultPath, apkPath);
172
177
  return true;
173
178
  } finally {
174
- await _appiumSupport.fs.rimraf(tmpRoot);
179
+ await _support.fs.rimraf(tmpRoot);
175
180
  }
176
181
  }
177
182
 
@@ -194,11 +199,11 @@ const getJavaHome = _lodash.default.memoize(async function getJavaHome() {
194
199
  throw new Error('The JAVA_HOME environment variable is not set for the current process');
195
200
  }
196
201
 
197
- if (!(await _appiumSupport.fs.exists(result))) {
202
+ if (!(await _support.fs.exists(result))) {
198
203
  throw new Error(`The JAVA_HOME location '${result}' must exist`);
199
204
  }
200
205
 
201
- const stats = await _appiumSupport.fs.stat(result);
206
+ const stats = await _support.fs.stat(result);
202
207
 
203
208
  if (!stats.isDirectory()) {
204
209
  throw new Error(`The JAVA_HOME location '${result}' must be a valid folder`);
@@ -219,18 +224,18 @@ const getJavaForOs = _lodash.default.memoize(async function getJavaForOs() {
219
224
  errMsg = err.message;
220
225
  }
221
226
 
222
- const executableName = `java${_appiumSupport.system.isWindows() ? '.exe' : ''}`;
227
+ const executableName = `java${_support.system.isWindows() ? '.exe' : ''}`;
223
228
 
224
229
  if (javaHome) {
225
230
  const resultPath = _path.default.resolve(javaHome, 'bin', executableName);
226
231
 
227
- if (await _appiumSupport.fs.exists(resultPath)) {
232
+ if (await _support.fs.exists(resultPath)) {
228
233
  return resultPath;
229
234
  }
230
235
  }
231
236
 
232
237
  try {
233
- return await _appiumSupport.fs.which(executableName);
238
+ return await _support.fs.which(executableName);
234
239
  } catch (ign) {}
235
240
 
236
241
  throw new Error(`The '${executableName}' binary could not be found ` + `neither in PATH nor under JAVA_HOME (${errMsg || _path.default.resolve(javaHome, 'bin')})`);
@@ -239,10 +244,10 @@ const getJavaForOs = _lodash.default.memoize(async function getJavaForOs() {
239
244
  exports.getJavaForOs = getJavaForOs;
240
245
 
241
246
  const getOpenSslForOs = async function () {
242
- const binaryName = `openssl${_appiumSupport.system.isWindows() ? '.exe' : ''}`;
247
+ const binaryName = `openssl${_support.system.isWindows() ? '.exe' : ''}`;
243
248
 
244
249
  try {
245
- return await _appiumSupport.fs.which(binaryName);
250
+ return await _support.fs.which(binaryName);
246
251
  } catch (err) {
247
252
  throw new Error('The openssl tool must be installed on the system and available on the path');
248
253
  }
@@ -290,7 +295,7 @@ function buildStartCmd(startAppOptions, apiLevel) {
290
295
  } = startAppOptions;
291
296
  const cmd = ['am', 'start'];
292
297
 
293
- if (_appiumSupport.util.hasValue(user)) {
298
+ if (_support.util.hasValue(user)) {
294
299
  cmd.push('--user', user);
295
300
  }
296
301
 
@@ -369,13 +374,13 @@ const getSdkToolsVersion = _lodash.default.memoize(async function getSdkToolsVer
369
374
 
370
375
  const propertiesPath = _path.default.resolve(androidHome, 'tools', 'source.properties');
371
376
 
372
- if (!(await _appiumSupport.fs.exists(propertiesPath))) {
377
+ if (!(await _support.fs.exists(propertiesPath))) {
373
378
  _logger.default.warn(`Cannot find ${propertiesPath} file to read SDK version from`);
374
379
 
375
380
  return;
376
381
  }
377
382
 
378
- const propertiesContent = await _appiumSupport.fs.readFile(propertiesPath, 'utf8');
383
+ const propertiesContent = await _support.fs.readFile(propertiesPath, 'utf8');
379
384
  const versionMatcher = new RegExp(/Pkg\.Revision=(\d+)\.?(\d+)?\.?(\d+)?/);
380
385
  const match = versionMatcher.exec(propertiesContent);
381
386
 
@@ -393,7 +398,7 @@ const getSdkToolsVersion = _lodash.default.memoize(async function getSdkToolsVer
393
398
  exports.getSdkToolsVersion = getSdkToolsVersion;
394
399
 
395
400
  const getBuildToolsDirs = _lodash.default.memoize(async function getBuildToolsDirs(sdkRoot) {
396
- let buildToolsDirs = await _appiumSupport.fs.glob('*/', {
401
+ let buildToolsDirs = await _support.fs.glob('*/', {
397
402
  cwd: _path.default.resolve(sdkRoot, 'build-tools'),
398
403
  absolute: true
399
404
  });
@@ -405,7 +410,7 @@ const getBuildToolsDirs = _lodash.default.memoize(async function getBuildToolsDi
405
410
 
406
411
  _logger.default.warn(`Falling back to sorting by modification date. Original error: ${err.message}`);
407
412
 
408
- const pairs = await _bluebird.default.map(buildToolsDirs, async dir => [(await _appiumSupport.fs.stat(dir)).mtime.valueOf(), dir]);
413
+ const pairs = await _bluebird.default.map(buildToolsDirs, async dir => [(await _support.fs.stat(dir)).mtime.valueOf(), dir]);
409
414
  buildToolsDirs = pairs.sort((a, b) => a[0] < b[0]).map(pair => pair[1]);
410
415
  }
411
416
 
@@ -471,7 +476,7 @@ const extractMatchingPermissions = function (dumpsysOutput, groupNames, grantedS
471
476
 
472
477
  const filteredResult = result.filter(item => !_lodash.default.isBoolean(grantedState) || item.granted === grantedState).map(item => item.permission);
473
478
 
474
- _logger.default.debug(`Retrieved ${_appiumSupport.util.pluralize('permission', filteredResult.length, true)} ` + `from ${groupNames} ${_appiumSupport.util.pluralize('group', groupNames.length, false)}`);
479
+ _logger.default.debug(`Retrieved ${_support.util.pluralize('permission', filteredResult.length, true)} ` + `from ${groupNames} ${_support.util.pluralize('group', groupNames.length, false)}`);
475
480
 
476
481
  return filteredResult;
477
482
  };
@@ -481,7 +486,7 @@ exports.extractMatchingPermissions = extractMatchingPermissions;
481
486
  function buildInstallArgs(apiLevel, options = {}) {
482
487
  const result = [];
483
488
 
484
- if (!_appiumSupport.util.hasValue(options.replace) || options.replace) {
489
+ if (!_support.util.hasValue(options.replace) || options.replace) {
485
490
  result.push('-r');
486
491
  }
487
492
 
@@ -846,13 +851,13 @@ async function getAndroidPrefsRoot() {
846
851
  }
847
852
 
848
853
  async function dirExists(location) {
849
- return location && (await _appiumSupport.fs.exists(location)) && (await _appiumSupport.fs.stat(location)).isDirectory();
854
+ return location && (await _support.fs.exists(location)) && (await _support.fs.stat(location)).isDirectory();
850
855
  }
851
856
 
852
857
  function escapeShellArg(arg) {
853
858
  arg = `${arg}`;
854
859
 
855
- if (_appiumSupport.system.isWindows()) {
860
+ if (_support.system.isWindows()) {
856
861
  return /[&|^\s]/.test(arg) ? `"${arg.replace(/"/g, '""')}"` : arg;
857
862
  }
858
863
 
@@ -860,4 +865,4 @@ function escapeShellArg(arg) {
860
865
  }require('source-map-support').install();
861
866
 
862
867
 
863
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbInJvb3REaXIiLCJwYXRoIiwicmVzb2x2ZSIsIl9fZGlybmFtZSIsInByb2Nlc3MiLCJlbnYiLCJOT19QUkVDT01QSUxFIiwiQVBLU19FWFRFTlNJT04iLCJBUEtfRVhURU5TSU9OIiwiQVBLX0lOU1RBTExfVElNRU9VVCIsIkFQS1NfSU5TVEFMTF9USU1FT1VUIiwiREVGQVVMVF9BREJfRVhFQ19USU1FT1VUIiwiZ2V0U2RrUm9vdEZyb21FbnYiLCJBTkRST0lEX0hPTUUiLCJBTkRST0lEX1NES19ST09UIiwicmVxdWlyZVNka1Jvb3QiLCJjdXN0b21Sb290Iiwic2RrUm9vdCIsImRvY01zZyIsIl8iLCJpc0VtcHR5IiwiRXJyb3IiLCJmcyIsImV4aXN0cyIsInN0YXRzIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInByb3BzUGF0aHMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJwbGF0Zm9ybXNNYXBwaW5nIiwicHJvcHNQYXRoIiwicHJvcHNDb250ZW50IiwicmVhZEZpbGUiLCJwbGF0Zm9ybVBhdGgiLCJkaXJuYW1lIiwicGxhdGZvcm0iLCJiYXNlbmFtZSIsIm1hdGNoIiwiZXhlYyIsImxvZyIsIndhcm4iLCJwYXJzZUludCIsInJlY2VudFNka1ZlcnNpb24iLCJrZXlzIiwic29ydCIsInJldmVyc2UiLCJyZXN1bHQiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bnppcEZpbGUiLCJ6aXBQYXRoIiwiZHN0Um9vdCIsInppcCIsImFzc2VydFZhbGlkWmlwIiwiZXh0cmFjdEFsbFRvIiwidW5zaWduQXBrIiwiYXBrUGF0aCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsIm1ldGFJbmZGb2xkZXJOYW1lIiwiaGFzTWV0YUluZiIsInJlYWRFbnRyaWVzIiwiZW50cnkiLCJmaWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJ0bXBaaXBSb290IiwicmltcmFmIiwidG1wUmVzdWx0UGF0aCIsInRvQXJjaGl2ZSIsInVubGluayIsIm12IiwiZ2V0SU1FTGlzdEZyb21PdXRwdXQiLCJzdGRvdXQiLCJlbmdpbmVzIiwibGluZSIsInNwbGl0IiwibGVuZ3RoIiwicHVzaCIsInRyaW0iLCJyZXBsYWNlIiwiZ2V0SmF2YUhvbWUiLCJtZW1vaXplIiwiSkFWQV9IT01FIiwiZ2V0SmF2YUZvck9zIiwiamF2YUhvbWUiLCJlcnJNc2ciLCJlcnIiLCJtZXNzYWdlIiwiZXhlY3V0YWJsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJyZXN1bHRQYXRoIiwid2hpY2giLCJpZ24iLCJnZXRPcGVuU3NsRm9yT3MiLCJiaW5hcnlOYW1lIiwiZ2V0QXBrc2lnbmVyRm9yT3MiLCJzeXNIZWxwZXJzIiwiZ2V0QmluYXJ5RnJvbVNka1Jvb3QiLCJnZXRBcGthbmFseXplckZvck9zIiwiaXNTaG93aW5nTG9ja3NjcmVlbiIsImR1bXBzeXMiLCJzb21lIiwieCIsImluY2x1ZGVzIiwiZXZlcnkiLCJ0ZXN0IiwiaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkIiwibSIsImdldFN1cmZhY2VPcmllbnRhdGlvbiIsImlzU2NyZWVuT25GdWxseSIsImJ1aWxkU3RhcnRDbWQiLCJzdGFydEFwcE9wdGlvbnMiLCJhcGlMZXZlbCIsInVzZXIiLCJ3YWl0Rm9yTGF1bmNoIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjYXRlZ29yeSIsInN0b3BBcHAiLCJmbGFncyIsImNtZCIsInV0aWwiLCJoYXNWYWx1ZSIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwicGFyc2VLZXlWYWx1ZSIsInN0ciIsInNwYWNlIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsInJlIiwiYXJncyIsImFwcGx5IiwiZmxhZyIsImZsYWdQb3MiLCJwcmV2QXJncyIsImdldFNka1Rvb2xzVmVyc2lvbiIsImFuZHJvaWRIb21lIiwicHJvcGVydGllc1BhdGgiLCJwcm9wZXJ0aWVzQ29udGVudCIsInZlcnNpb25NYXRjaGVyIiwiUmVnRXhwIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwiZ2V0QnVpbGRUb29sc0RpcnMiLCJidWlsZFRvb2xzRGlycyIsIm1hcCIsImRpciIsImEiLCJiIiwic2VtdmVyIiwicmNvbXBhcmUiLCJwYWlyIiwicGFpcnMiLCJCIiwibXRpbWUiLCJ2YWx1ZU9mIiwiaW5mbyIsImV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zIiwiZHVtcHN5c091dHB1dCIsImdyb3VwTmFtZXMiLCJncmFudGVkU3RhdGUiLCJncm91cFBhdHRlcm5CeU5hbWUiLCJncm91cE5hbWUiLCJlc2NhcGVSZWdFeHAiLCJpbmRlbnRQYXR0ZXJuIiwicGVybWlzc2lvbk5hbWVQYXR0ZXJuIiwiZ3JhbnRlZFN0YXRlUGF0dGVybiIsImdyb3VwTWF0Y2giLCJsaW5lcyIsInRpdGxlSW5kZW50Iiwic2VhcmNoIiwic2xpY2UiLCJjdXJyZW50SW5kZW50IiwicGVybWlzc2lvbk5hbWVNYXRjaCIsIml0ZW0iLCJwZXJtaXNzaW9uIiwiZ3JhbnRlZFN0YXRlTWF0Y2giLCJncmFudGVkIiwiZmlsdGVyZWRSZXN1bHQiLCJmaWx0ZXIiLCJpc0Jvb2xlYW4iLCJwbHVyYWxpemUiLCJidWlsZEluc3RhbGxBcmdzIiwib3B0aW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwidXNlU2RjYXJkIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBhcnRpYWxJbnN0YWxsIiwicGFyc2VNYW5pZmVzdCIsIm1hbmlmZXN0IiwicGFja2FnZSIsInZlcnNpb25Db2RlIiwidmVyc2lvbk5hbWUiLCJhcHBsaWNhdGlvbiIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUFsaWFzZXMiLCJlbmFibGVkIiwiaW50ZW50RmlsdGVycyIsImFjdGlvbnMiLCJjYXRlZ29yaWVzIiwiaXNNYWluQWN0aW9uIiwibmFtZSIsImlzTGF1bmNoZXJDYXRlZ29yeSIsInBhcnNlQWFwdFN0cmluZ3MiLCJyYXdPdXRwdXQiLCJjb25maWdNYXJrZXIiLCJub3JtYWxpemVTdHJpbmdNYXRjaCIsInMiLCJhcGtTdHJpbmdzIiwiaXNJbkNvbmZpZyIsImN1cnJlbnRSZXNvdXJjZUlkIiwiaXNJblBsdXJhbEdyb3VwIiwicXVvdGVkU3RyaW5nUGF0dGVybiIsIm9zIiwiRU9MIiwidHJpbW1lZExpbmUiLCJwYXJzZUFhcHQyU3RyaW5ncyIsImFsbExpbmVzIiwiZXh0cmFjdENvbnRlbnQiLCJzdGFydElkeCIsImlkeCIsInN0YXJ0Q2hhclBvcyIsInRlcm1pbmF0aW9uQ2hhck1hdGNoIiwidGVybWluYXRpb25DaGFyUG9zIiwiaW5kZXgiLCJ0cmltU3RhcnQiLCJpc0luQ3VycmVudENvbmZpZyIsImxpbmVJbmRleCIsImNvbnRlbnQiLCJpc1N0cmluZyIsImZvcm1hdENvbmZpZ01hcmtlciIsImNvbmZpZ3NHZXR0ZXIiLCJkZXNpcmVkTWFya2VyIiwiZGVmYXVsdE1hcmtlciIsImNvbmZpZ3MiLCJ0b0xvd2VyQ2FzZSIsInBhcnNlSnNvbkRhdGEiLCJvdXRwdXQiLCJlbnRpdHlOYW1lIiwianNvblN0ciIsInBhcnNlIiwiZSIsInRvQXZkTG9jYWxlQXJncyIsImxhbmd1YWdlIiwiY291bnRyeSIsInRvVXBwZXJDYXNlIiwibG9jYWxlIiwiZ2V0QW5kcm9pZFByZWZzUm9vdCIsImxvY2F0aW9uIiwiQU5EUk9JRF9FTVVMQVRPUl9IT01FIiwiZGlyRXhpc3RzIiwiaG9tZSIsIkhPTUUiLCJVU0VSUFJPRklMRSIsImVzY2FwZVNoZWxsQXJnIiwiYXJnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsT0FBTyxHQUFHQyxjQUFLQyxPQUFMLENBQWFDLFNBQWIsRUFBd0JDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxhQUFaLEdBQTRCLElBQTVCLEdBQW1DLE9BQTNELENBQWhCOzs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsT0FBdkI7O0FBQ0EsTUFBTUMsYUFBYSxHQUFHLE1BQXRCOztB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QUFSLENBQVlnUSxXQUE3Qzs7QUFDQSxNQUFJRixJQUFKLEVBQVU7QUFDUkgsSUFBQUEsUUFBUSxHQUFHL1AsY0FBS0MsT0FBTCxDQUFhaVEsSUFBYixFQUFtQixVQUFuQixDQUFYO0FBQ0Q7O0FBRUQsTUFBSSxFQUFDLE1BQU1ELFNBQVMsQ0FBQ0YsUUFBRCxDQUFoQixDQUFKLEVBQWdDO0FBQzlCdE4sb0JBQUlRLEtBQUosQ0FBVyx3QkFBdUI4TSxRQUFTLGdDQUEzQzs7QUFDQSxXQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFPQSxRQUFQO0FBQ0Q7O0FBUUQsZUFBZUUsU0FBZixDQUEwQkYsUUFBMUIsRUFBb0M7QUFDbEMsU0FBT0EsUUFBUSxLQUNWLE1BQU0xTyxrQkFBR0MsTUFBSCxDQUFVeU8sUUFBVixDQURJLENBQVIsSUFFRixDQUFDLE1BQU0xTyxrQkFBR0csSUFBSCxDQUFRdU8sUUFBUixDQUFQLEVBQTBCdE8sV0FBMUIsRUFGTDtBQUdEOztBQVlELFNBQVM0TyxjQUFULENBQXlCQyxHQUF6QixFQUE4QjtBQUM1QkEsRUFBQUEsR0FBRyxHQUFJLEdBQUVBLEdBQUksRUFBYjs7QUFDQSxNQUFJekssc0JBQU9DLFNBQVAsRUFBSixFQUF3QjtBQUN0QixXQUFPLFVBQVVnQixJQUFWLENBQWV3SixHQUFmLElBQXVCLElBQUdBLEdBQUcsQ0FBQ25MLE9BQUosQ0FBWSxJQUFaLEVBQWtCLElBQWxCLENBQXdCLEdBQWxELEdBQXVEbUwsR0FBOUQ7QUFDRDs7QUFDRCxTQUFPQSxHQUFHLENBQUNuTCxPQUFKLENBQVksSUFBWixFQUFrQixLQUFsQixDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHN5c3RlbSwgZnMsIHppcCwgdXRpbCwgdGVtcERpciB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5cbmNvbnN0IHJvb3REaXIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBwcm9jZXNzLmVudi5OT19QUkVDT01QSUxFID8gJy4uJyA6ICcuLi8uLicpO1xuY29uc3QgQVBLU19FWFRFTlNJT04gPSAnLmFwa3MnO1xuY29uc3QgQVBLX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IEFQS19JTlNUQUxMX1RJTUVPVVQgPSA2MDAwMDtcbmNvbnN0IEFQS1NfSU5TVEFMTF9USU1FT1VUID0gQVBLX0lOU1RBTExfVElNRU9VVCAqIDI7XG5jb25zdCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQgPSAyMDAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhY3R1YWwgcGF0aCB0byBTREsgcm9vdCBmb2xkZXIgZnJvbSB0aGUgc3lzdGVtIGVudmlyb25tZW50XG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgU0RLIHJvb3QgZm9sZGVyXG4gKi9cbmZ1bmN0aW9uIGdldFNka1Jvb3RGcm9tRW52ICgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkFORFJPSURfSE9NRSB8fCBwcm9jZXNzLmVudi5BTkRST0lEX1NES19ST09UO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYWN0dWFsIHBhdGggdG8gU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBTREsgcm9vdCBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgZW52IHZhcmlhYmxlIGlzIHVuc2V0IG9yIGlzXG4gKiBwb2ludGluZyB0byBhbiBpbnZhbGlkIGZpbGUgc3lzdGVtIGVudHJ5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVTZGtSb290IChjdXN0b21Sb290ID0gbnVsbCkge1xuICBjb25zdCBzZGtSb290ID0gY3VzdG9tUm9vdCB8fCBnZXRTZGtSb290RnJvbUVudigpO1xuICBjb25zdCBkb2NNc2cgPSAnUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vY29tbWFuZC1saW5lL3ZhcmlhYmxlcyBmb3IgbW9yZSBkZXRhaWxzJztcbiAgaWYgKF8uaXNFbXB0eShzZGtSb290KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIGV4cG9ydGVkLiAke2RvY01zZ31gKTtcbiAgfVxuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHNka1Jvb3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQW5kcm9pZCBTREsgcm9vdCBmb2xkZXIgJyR7c2RrUm9vdH0nIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4gJHtkb2NNc2d9YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNka1Jvb3QpO1xuICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBBbmRyb2lkIFNESyByb290ICcke3Nka1Jvb3R9JyBtdXN0IGJlIGEgZm9sZGVyLiAke2RvY01zZ31gKTtcbiAgfVxuICByZXR1cm4gc2RrUm9vdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQbGF0Zm9ybUluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGxhdGZvcm0gLSBUaGUgcGxhdGZvcm0gbmFtZSwgZm9yIGV4YW1wbGUgYGFuZHJvaWQtMjRgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwbGF0Zm9ybVBhdGggLSBGdWxsIHBhdGggdG8gdGhlIHBsYXRmb3JtIFNESyBmb2xkZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHBhdGggdG8gdGhlIHJlY2VudCBpbnN0YWxsZWQgQW5kcm9pZCBwbGF0Zm9ybS5cbiAqXG4gKiBAcmV0dXJuIHtQbGF0Zm9ybUluZm99IFRoZSByZXN1bHRpbmcgcGF0aCB0byB0aGUgbmV3ZXN0IGluc3RhbGxlZCBwbGF0Zm9ybS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCAoc2RrUm9vdCkge1xuICBjb25zdCBwcm9wc1BhdGhzID0gYXdhaXQgZnMuZ2xvYignKi9idWlsZC5wcm9wJywge1xuICAgIGN3ZDogcGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IHBsYXRmb3Jtc01hcHBpbmcgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wc1BhdGggb2YgcHJvcHNQYXRocykge1xuICAgIGNvbnN0IHByb3BzQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGxhdGZvcm1QYXRoID0gcGF0aC5kaXJuYW1lKHByb3BzUGF0aCk7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBwYXRoLmJhc2VuYW1lKHBsYXRmb3JtUGF0aCk7XG4gICAgY29uc3QgbWF0Y2ggPSAvcm9cXC5idWlsZFxcLnZlcnNpb25cXC5zZGs9KFxcZCspLy5leGVjKHByb3BzQ29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHRoZSBTREsgdmVyc2lvbiBmcm9tICcke3Byb3BzUGF0aH0nLiBTa2lwcGluZyAnJHtwbGF0Zm9ybX0nYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGxhdGZvcm1zTWFwcGluZ1twYXJzZUludChtYXRjaFsxXSwgMTApXSA9IHtcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgcGxhdGZvcm1QYXRoLFxuICAgIH07XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwbGF0Zm9ybXNNYXBwaW5nKSkge1xuICAgIGxvZy53YXJuKGBGb3VuZCB6ZXJvIHBsYXRmb3JtIGZvbGRlcnMgYXQgJyR7cGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKX0nLiBgICtcbiAgICAgIGBEbyB5b3UgaGF2ZSBhbnkgQW5kcm9pZCBTREtzIGluc3RhbGxlZD9gKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGxhdGZvcm06IG51bGwsXG4gICAgICBwbGF0Zm9ybVBhdGg6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY2VudFNka1ZlcnNpb24gPSBfLmtleXMocGxhdGZvcm1zTWFwcGluZykuc29ydCgpLnJldmVyc2UoKVswXTtcbiAgY29uc3QgcmVzdWx0ID0gcGxhdGZvcm1zTWFwcGluZ1tyZWNlbnRTZGtWZXJzaW9uXTtcbiAgbG9nLmRlYnVnKGBGb3VuZCB0aGUgbW9zdCByZWNlbnQgQW5kcm9pZCBwbGF0Zm9ybTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bnppcEZpbGUgKHppcFBhdGgsIGRzdFJvb3QgPSBwYXRoLmRpcm5hbWUoemlwUGF0aCkpIHtcbiAgbG9nLmRlYnVnKGBVbnppcHBpbmcgJyR7emlwUGF0aH0nIHRvICcke2RzdFJvb3R9J2ApO1xuICBhd2FpdCB6aXAuYXNzZXJ0VmFsaWRaaXAoemlwUGF0aCk7XG4gIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oemlwUGF0aCwgZHN0Um9vdCk7XG4gIGxvZy5kZWJ1ZygnVW56aXAgc3VjY2Vzc2Z1bCcpO1xufVxuXG4vKipcbiAqIFVuc2lnbnMgdGhlIGdpdmVuIGFwayBieSByZW1vdmluZyB0aGVcbiAqIE1FVEEtSU5GIGZvbGRlciByZWN1cnNpdmVseSBmcm9tIHRoZSBhcmNoaXZlLlxuICogISEhIFRoZSBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBnaXZlbiBhcGsgYWZ0ZXIgc3VjY2Vzc2Z1bCB1bnNpZ25pbmcgISEhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwa1BhdGggVGhlIHBhdGggdG8gdGhlIGFwa1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYXBrIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogdW5zaWduZWQgYW5kIG92ZXJ3cml0dGVuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgdW5zaWduIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiB1bnNpZ25BcGsgKGFwa1BhdGgpIHtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBjb25zdCBtZXRhSW5mRm9sZGVyTmFtZSA9ICdNRVRBLUlORic7XG4gIHRyeSB7XG4gICAgbGV0IGhhc01ldGFJbmYgPSBmYWxzZTtcbiAgICBhd2FpdCB6aXAucmVhZEVudHJpZXMoYXBrUGF0aCwgKHtlbnRyeX0pID0+IHtcbiAgICAgIGhhc01ldGFJbmYgPSBlbnRyeS5maWxlTmFtZS5zdGFydHNXaXRoKGAke21ldGFJbmZGb2xkZXJOYW1lfS9gKTtcbiAgICAgIC8vIGVudHJpZXMgaXRlcmF0aW9uIHN0b3BzIGFmdGVyIGBmYWxzZWAgaXMgcmV0dXJuZWRcbiAgICAgIHJldHVybiAhaGFzTWV0YUluZjtcbiAgICB9KTtcbiAgICBpZiAoIWhhc01ldGFJbmYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdG1wWmlwUm9vdCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCAnYXBrJyk7XG4gICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhhcGtQYXRoLCB0bXBaaXBSb290KTtcbiAgICBhd2FpdCBmcy5yaW1yYWYocGF0aC5yZXNvbHZlKHRtcFppcFJvb3QsIG1ldGFJbmZGb2xkZXJOYW1lKSk7XG4gICAgY29uc3QgdG1wUmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwa1BhdGgpKTtcbiAgICBhd2FpdCB6aXAudG9BcmNoaXZlKHRtcFJlc3VsdFBhdGgsIHtcbiAgICAgIGN3ZDogdG1wWmlwUm9vdCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy51bmxpbmsoYXBrUGF0aCk7XG4gICAgYXdhaXQgZnMubXYodG1wUmVzdWx0UGF0aCwgYXBrUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElNRUxpc3RGcm9tT3V0cHV0IChzdGRvdXQpIHtcbiAgbGV0IGVuZ2luZXMgPSBbXTtcbiAgZm9yIChsZXQgbGluZSBvZiBzdGRvdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoID4gMCAmJiBsaW5lWzBdICE9PSAnICcpIHtcbiAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIGFuZCB0cmFpbGluZyBjb2xvbiwgYW5kIGFkZCB0byB0aGUgbGlzdFxuICAgICAgZW5naW5lcy5wdXNoKGxpbmUudHJpbSgpLnJlcGxhY2UoLzokLywgJycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVuZ2luZXM7XG59XG5cbmNvbnN0IGdldEphdmFIb21lID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldEphdmFIb21lICgpIHtcbiAgY29uc3QgcmVzdWx0ID0gcHJvY2Vzcy5lbnYuSkFWQV9IT01FO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0IGZvciB0aGUgY3VycmVudCBwcm9jZXNzJyk7XG4gIH1cbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocmVzdWx0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGV4aXN0YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHJlc3VsdCk7XG4gIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGJlIGEgdmFsaWQgZm9sZGVyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5jb25zdCBnZXRKYXZhRm9yT3MgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0SmF2YUZvck9zICgpIHtcbiAgbGV0IGphdmFIb21lO1xuICBsZXQgZXJyTXNnO1xuICB0cnkge1xuICAgIGphdmFIb21lID0gYXdhaXQgZ2V0SmF2YUhvbWUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyTXNnID0gZXJyLm1lc3NhZ2U7XG4gIH1cbiAgY29uc3QgZXhlY3V0YWJsZU5hbWUgPSBgamF2YSR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgaWYgKGphdmFIb21lKSB7XG4gICAgY29uc3QgcmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicsIGV4ZWN1dGFibGVOYW1lKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0UGF0aDtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goZXhlY3V0YWJsZU5hbWUpO1xuICB9IGNhdGNoIChpZ24pIHt9XG4gIHRocm93IG5ldyBFcnJvcihgVGhlICcke2V4ZWN1dGFibGVOYW1lfScgYmluYXJ5IGNvdWxkIG5vdCBiZSBmb3VuZCBgICtcbiAgICBgbmVpdGhlciBpbiBQQVRIIG5vciB1bmRlciBKQVZBX0hPTUUgKCR7ZXJyTXNnIHx8IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicpfSlgKTtcbn0pO1xuXG5jb25zdCBnZXRPcGVuU3NsRm9yT3MgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpbmFyeU5hbWUgPSBgb3BlbnNzbCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9wZW5zc2wgdG9vbCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGUgb24gdGhlIHBhdGgnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2xcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3lzSGVscGVycyAtIEFuIGluc3RhbmNlIGNvbnRhaW5pbmcgc3lzdGVtQ2FsbE1ldGhvZHMgaGVscGVyIG1ldGhvZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEFuIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGtzaWduZXJGb3JPcyAoc3lzSGVscGVycykge1xuICByZXR1cm4gYXdhaXQgc3lzSGVscGVycy5nZXRCaW5hcnlGcm9tU2RrUm9vdCgnYXBrc2lnbmVyLmphcicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhcGthbmFseXplciB0b29sLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS9hcGthbmFseXplci5odG1sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN5c0hlbHBlcnMgLSBBbiBpbnN0YW5jZSBjb250YWluaW5nIHN5c3RlbUNhbGxNZXRob2RzIGhlbHBlciBtZXRob2RzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBbiBhYnNvbHV0ZSBwYXRoIHRvIGFwa2FuYWx5emVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGthbmFseXplckZvck9zIChzeXNIZWxwZXJzKSB7XG4gIHJldHVybiBhd2FpdCBzeXNIZWxwZXJzLmdldEJpbmFyeUZyb21TZGtSb290KCdhcGthbmFseXplcicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBtU2hvd2luZ0xvY2tzY3JlZW4gb3IgbURyZWFtaW5nTG9ja3NjcmVlbiBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmVcbiAqIGlmIGxvY2sgc2NyZWVuIGlzIHNob3dpbmdcbiAqXG4gKiBBIG5vdGU6IGBhZGIgc2hlbGwgZHVtcHN5cyB0cnVzdGAgcGVyZm9ybXMgYmV0dGVyIHdoaWxlIGRldGVjdGluZyB0aGUgbG9ja2VkIHNjcmVlbiBzdGF0ZVxuICogaW4gY29tcGFyaXNvbiB0byBgYWRiIGR1bXBzeXMgd2luZG93YCBvdXRwdXQgcGFyc2luZy5cbiAqIEJ1dCB0aGUgdHJ1c3QgY29tbWFuZCBkb2VzIG5vdCB3b3JrIGZvciBgU3dpcGVgIHVubG9jayBwYXR0ZXJuLlxuICpcbiAqIEluIHNvbWUgQW5kcm9pZCBkZXZpY2VzIChQcm9iYWJseSBhcm91bmQgQW5kcm9pZCAxMCspLCBgbVNob3dpbmdMb2Nrc2NyZWVuYCBhbmQgYG1EcmVhbWluZ0xvY2tzY3JlZW5gXG4gKiBkbyBub3Qgd29yayB0byBkZXRlY3QgbG9jayBzdGF0dXMuIEluc3RlYWQsIGtleWd1YXJkIHByZWZlcmVuY2VzIGhlbHBzIHRvIGRldGVjdCB0aGUgbG9jayBjb25kaXRpb24uXG4gKiBTb21lIGRldmljZXMgc3VjaCBhcyBBbmRyb2lkIFRWIGRvIG5vdCBoYXZlIGtleWd1YXJkLCBzbyB3ZSBzaG91bGQga2VlcFxuICogc2NyZWVuIGNvbmRpdGlvbiBhcyB0aGlzIHByaW1hcnkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzIC0gVGhlIG91dHB1dCBvZiBkdW1wc3lzIHdpbmRvdyBjb21tYW5kLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBsb2NrIHNjcmVlbiBpcyBzaG93aW5nLlxuICovXG5mdW5jdGlvbiBpc1Nob3dpbmdMb2Nrc2NyZWVuIChkdW1wc3lzKSB7XG4gIHJldHVybiBfLnNvbWUoWydtU2hvd2luZ0xvY2tzY3JlZW49dHJ1ZScsICdtRHJlYW1pbmdMb2Nrc2NyZWVuPXRydWUnXSwgKHgpID0+IGR1bXBzeXMuaW5jbHVkZXMoeCkpXG4gICAgLy8gYG1Jc1Nob3dpbmdgIGFuZCBgbUlucHV0UmVzdHJpY3RlZGAgYXJlIGB0cnVlYCBpbiBsb2NrIGNvbmRpdGlvbi4gYGZhbHNlYCBpcyB1bmxvY2sgY29uZGl0aW9uLlxuICAgIHx8IF8uZXZlcnkoWy9LZXlndWFyZFN0YXRlTW9uaXRvcltcXG5cXHNdK21Jc1Nob3dpbmc9dHJ1ZS8sIC9cXHMrbUlucHV0UmVzdHJpY3RlZD10cnVlL10sICh4KSA9PiB4LnRlc3QoZHVtcHN5cykpO1xufVxuXG4vKlxuICogQ2hlY2tzIG1DdXJyZW50Rm9jdXMgaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lIGlmIEtleWd1YXJkIGlzIGFjdGl2YXRlZFxuICovXG5mdW5jdGlvbiBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbUN1cnJlbnRGb2N1cy4rS2V5Z3VhcmQvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuIChtICYmIG0ubGVuZ3RoICYmIG1bMF0pID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG4vKlxuICogUmVhZHMgU3VyZmFjZU9yaWVudGF0aW9uIGluIGR1bXBzeXMgb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGdldFN1cmZhY2VPcmllbnRhdGlvbiAoZHVtcHN5cykge1xuICBsZXQgbSA9IC9TdXJmYWNlT3JpZW50YXRpb246IFxcZC9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gbSAmJiBwYXJzZUludChtWzBdLnNwbGl0KCc6JylbMV0sIDEwKTtcbn1cblxuLypcbiAqIENoZWNrcyBtU2NyZWVuT25GdWxseSBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmUgaWYgc2NyZWVuIGlzIHNob3dpbmdcbiAqIERlZmF1bHQgaXMgdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1NjcmVlbk9uRnVsbHkgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbVNjcmVlbk9uRnVsbHk9XFx3Ky9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gIW0gfHwgLy8gaWYgaW5mb3JtYXRpb24gaXMgbWlzc2luZyB3ZSBhc3N1bWUgc2NyZWVuIGlzIGZ1bGx5IG9uXG4gICAgICAgICAobSAmJiBtLmxlbmd0aCA+IDAgJiYgbVswXS5zcGxpdCgnPScpWzFdID09PSAndHJ1ZScpIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBjb21tYW5kIGxpbmUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlblxuICogYXBwbGljYXRpb24gc3RhcnR1cCBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtTdGFydEFwcE9wdGlvbnN9IHN0YXJ0QXBwT3B0aW9ucyAtIEFwcGxpY2F0aW9uIG9wdGlvbnMgbWFwcGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IGFwaUxldmVsIC0gVGhlIGFjdHVhbCBPUyBBUEkgbGV2ZWxcbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYWN0dWFsIGNvbW1hbmQgbGluZSBhcnJheVxuICovXG5mdW5jdGlvbiBidWlsZFN0YXJ0Q21kIChzdGFydEFwcE9wdGlvbnMsIGFwaUxldmVsKSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gICAgcGtnLFxuICAgIGFjdGl2aXR5LFxuICAgIGFjdGlvbixcbiAgICBjYXRlZ29yeSxcbiAgICBzdG9wQXBwLFxuICAgIGZsYWdzLFxuICB9ID0gc3RhcnRBcHBPcHRpb25zO1xuICBjb25zdCBjbWQgPSBbJ2FtJywgJ3N0YXJ0J107XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGlmICh3YWl0Rm9yTGF1bmNoKSB7XG4gICAgY21kLnB1c2goJy1XJyk7XG4gIH1cbiAgaWYgKGFjdGl2aXR5ICYmIHBrZykge1xuICAgIGNtZC5wdXNoKCctbicsIGAke3BrZ30vJHthY3Rpdml0eX1gKTtcbiAgfVxuICBpZiAoc3RvcEFwcCAmJiBhcGlMZXZlbCA+PSAxNSkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmIChhY3Rpb24pIHtcbiAgICBjbWQucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmIChjYXRlZ29yeSkge1xuICAgIGNtZC5wdXNoKCctYycsIGNhdGVnb3J5KTtcbiAgfVxuICBpZiAoZmxhZ3MpIHtcbiAgICBjbWQucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgaWYgKHN0YXJ0QXBwT3B0aW9ucy5vcHRpb25hbEludGVudEFyZ3VtZW50cykge1xuICAgIC8vIGV4cGVjdCBvcHRpb25hbEludGVudEFyZ3VtZW50cyB0byBiZSBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm06XG4gICAgLy8gICAgIFwiLWZsYWcga2V5XCJcbiAgICAvLyAgICAgXCItZmxhZyBrZXkgdmFsdWVcIlxuICAgIC8vIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgKGUuZy4sIFwiLWZsYWcxIGtleTEgLWZsYWcyIGtleTIgdmFsdWUyXCIpXG5cbiAgICAvLyB0YWtlIGEgc3RyaW5nIGFuZCBwYXJzZSBvdXQgdGhlIHBhcnQgYmVmb3JlIGFueSBzcGFjZXMsIGFuZCBhbnl0aGluZyBhZnRlclxuICAgIC8vIHRoZSBmaXJzdCBzcGFjZVxuICAgIGxldCBwYXJzZUtleVZhbHVlID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICAgIGxldCBzcGFjZSA9IHN0ci5pbmRleE9mKCcgJyk7XG4gICAgICBpZiAoc3BhY2UgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBzdHIubGVuZ3RoID8gW3N0cl0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbc3RyLnN1YnN0cmluZygwLCBzcGFjZSkudHJpbSgpLCBzdHIuc3Vic3RyaW5nKHNwYWNlICsgMSkudHJpbSgpXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gY3ljbGUgdGhyb3VnaCB0aGUgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgYW5kIHB1bGwgb3V0IHRoZSBhcmd1bWVudHNcbiAgICAvLyBhZGQgYSBzcGFjZSBpbml0aWFsbHkgc28gZmxhZ3MgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBhcmd1bWVudHMgdGhhdFxuICAgIC8vIGhhdmUgaW50ZXJuYWwgaHlwaGVuc1xuICAgIGxldCBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGAgJHtzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHN9YDtcbiAgICBsZXQgcmUgPSAvICgtW15cXHNdKykgKC4rKS87XG4gICAgd2hpbGUgKHRydWUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAgIGxldCBhcmdzID0gcmUuZXhlYyhvcHRpb25hbEludGVudEFyZ3VtZW50cyk7XG4gICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgaWYgKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgZmxhZ3MsIHNvIHRoZSByZW1haW5kZXIgY2FuIGJlIHRyZWF0ZWQgYXMgJ2tleScgb3IgJ2tleSB2YWx1ZSdcbiAgICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSBhcmUgZG9uZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gdGFrZSB0aGUgZmxhZyBhbmQgc2VlIGlmIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuICAgICAgLy8gaWYgaXQgaXMgbm90LCB0aGVuIGl0IG1lYW5zIHdlIGhhdmUgYmVlbiB0aHJvdWdoIGFscmVhZHksIGFuZFxuICAgICAgLy8gd2hhdCBpcyBiZWZvcmUgdGhlIGZsYWcgaXMgdGhlIGFyZ3VtZW50IGZvciB0aGUgcHJldmlvdXMgZmxhZ1xuICAgICAgbGV0IGZsYWcgPSBhcmdzWzFdO1xuICAgICAgbGV0IGZsYWdQb3MgPSBvcHRpb25hbEludGVudEFyZ3VtZW50cy5pbmRleE9mKGZsYWcpO1xuICAgICAgaWYgKGZsYWdQb3MgIT09IDApIHtcbiAgICAgICAgbGV0IHByZXZBcmdzID0gb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMuc3Vic3RyaW5nKDAsIGZsYWdQb3MpO1xuICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUocHJldkFyZ3MpKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmbGFnLCBhcyB0aGVyZSBhcmUgbm8gbW9yZSBlYXJsaWVyIGFyZ3VtZW50c1xuICAgICAgY21kLnB1c2goZmxhZyk7XG5cbiAgICAgIC8vIG1ha2Ugb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgaG9sZCB0aGUgcmVtYWluZGVyXG4gICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGFyZ3NbMl07XG4gICAgfVxuICB9XG4gIHJldHVybiBjbWQ7XG59XG5cbmNvbnN0IGdldFNka1Rvb2xzVmVyc2lvbiA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRTZGtUb29sc1ZlcnNpb24gKCkge1xuICBjb25zdCBhbmRyb2lkSG9tZSA9IHByb2Nlc3MuZW52LkFORFJPSURfSE9NRTtcbiAgaWYgKCFhbmRyb2lkSG9tZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EUk9JRF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGV4cGVjdGVkIHRvIGJlIHNldCcpO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKGFuZHJvaWRIb21lLCAndG9vbHMnLCAnc291cmNlLnByb3BlcnRpZXMnKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocHJvcGVydGllc1BhdGgpKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBmaW5kICR7cHJvcGVydGllc1BhdGh9IGZpbGUgdG8gcmVhZCBTREsgdmVyc2lvbiBmcm9tYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvcGVydGllc1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHZlcnNpb25NYXRjaGVyID0gbmV3IFJlZ0V4cCgvUGtnXFwuUmV2aXNpb249KFxcZCspXFwuPyhcXGQrKT9cXC4/KFxcZCspPy8pO1xuICBjb25zdCBtYXRjaCA9IHZlcnNpb25NYXRjaGVyLmV4ZWMocHJvcGVydGllc0NvbnRlbnQpO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFqb3I6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgICBtaW5vcjogbWF0Y2hbMl0gPyBwYXJzZUludChtYXRjaFsyXSwgMTApIDogMCxcbiAgICAgIGJ1aWxkOiBtYXRjaFszXSA/IHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgOiAwXG4gICAgfTtcbiAgfVxuICBsb2cud2FybihgQ2Fubm90IHBhcnNlIFwiUGtnLlJldmlzaW9uXCIgdmFsdWUgZnJvbSAke3Byb3BlcnRpZXNQYXRofWApO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIGZ1bGwgcGF0aHMgdG8gYWxsICdidWlsZC10b29scycgc3ViZm9sZGVycyB1bmRlciB0aGUgcGFydGljdWxhclxuICogU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNka1Jvb3QgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIFNESyByb290IGZvbGRlclxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBmdWxsIHBhdGhzIHRvIHRoZSByZXN1bHRpbmcgZm9sZGVycyBzb3J0ZWQgYnlcbiAqIG1vZGlmaWNhdGlvbiBkYXRlICh0aGUgbmV3ZXN0IGNvbWVzIGZpcnN0KSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIG1hY3RoZXMgd2VyZSBmb3VuZFxuICovXG5jb25zdCBnZXRCdWlsZFRvb2xzRGlycyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRCdWlsZFRvb2xzRGlycyAoc2RrUm9vdCkge1xuICBsZXQgYnVpbGRUb29sc0RpcnMgPSBhd2FpdCBmcy5nbG9iKCcqLycsIHtcbiAgICBjd2Q6IHBhdGgucmVzb2x2ZShzZGtSb290LCAnYnVpbGQtdG9vbHMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYnVpbGRUb29sc0RpcnMgPSBidWlsZFRvb2xzRGlyc1xuICAgICAgLm1hcCgoZGlyKSA9PiBbcGF0aC5iYXNlbmFtZShkaXIpLCBkaXJdKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHNlbXZlci5yY29tcGFyZShhWzBdLCBiWzBdKSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IHNvcnQgYnVpbGQtdG9vbHMgZm9sZGVycyAke0pTT04uc3RyaW5naWZ5KGJ1aWxkVG9vbHNEaXJzLm1hcCgoZGlyKSA9PiBwYXRoLmJhc2VuYW1lKGRpcikpKX0gYCArXG4gICAgICBgYnkgc2VtYW50aWMgdmVyc2lvbiBuYW1lcy5gKTtcbiAgICBsb2cud2FybihgRmFsbGluZyBiYWNrIHRvIHNvcnRpbmcgYnkgbW9kaWZpY2F0aW9uIGRhdGUuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGNvbnN0IHBhaXJzID0gYXdhaXQgQi5tYXAoYnVpbGRUb29sc0RpcnMsIGFzeW5jIChkaXIpID0+IFsoYXdhaXQgZnMuc3RhdChkaXIpKS5tdGltZS52YWx1ZU9mKCksIGRpcl0pO1xuICAgIGJ1aWxkVG9vbHNEaXJzID0gcGFpcnNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9XG4gIGxvZy5pbmZvKGBGb3VuZCAke2J1aWxkVG9vbHNEaXJzLmxlbmd0aH0gJ2J1aWxkLXRvb2xzJyBmb2xkZXJzIHVuZGVyICcke3Nka1Jvb3R9JyAobmV3ZXN0IGZpcnN0KTpgKTtcbiAgZm9yIChsZXQgZGlyIG9mIGJ1aWxkVG9vbHNEaXJzKSB7XG4gICAgbG9nLmluZm8oYCAgICAke2Rpcn1gKTtcbiAgfVxuICByZXR1cm4gYnVpbGRUb29sc0RpcnM7XG59KTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbiBuYW1lcyBlbmNvZGVkIGluIGBkdW1wc3lzIHBhY2thZ2VgIGNvbW1hbmQgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzT3V0cHV0IC0gVGhlIGFjdHVhbCBjb21tYW5kIG91dHB1dC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZ3JvdXBOYW1lcyAtIFRoZSBsaXN0IG9mIGdyb3VwIG5hbWVzIHRvIGxpc3QgcGVybWlzc2lvbnMgZm9yLlxuICogQHBhcmFtIHs/Ym9vbGVhbn0gZ3JhbnRlZFN0YXRlIC0gVGhlIGV4cGVjdGVkIHN0YXRlIG9mIGBncmFudGVkYCBhdHRyaWJ1dGUgdG8gZmlsdGVyIHdpdGguXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBmaWx0ZXJpbmcgaXMgZG9uZSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwZXJtaXNzaW9uIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QgaWYgbm8gbWF0Y2hlcyB3ZXJlIGZvdW5kLlxuICovXG5jb25zdCBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uIChkdW1wc3lzT3V0cHV0LCBncm91cE5hbWVzLCBncmFudGVkU3RhdGUgPSBudWxsKSB7XG4gIGNvbnN0IGdyb3VwUGF0dGVybkJ5TmFtZSA9IChncm91cE5hbWUpID0+IG5ldyBSZWdFeHAoYF4oXFxcXHMqJHtfLmVzY2FwZVJlZ0V4cChncm91cE5hbWUpfSBwZXJtaXNzaW9uczpbXFxcXHNcXFxcU10rKWAsICdtJyk7XG4gIGNvbnN0IGluZGVudFBhdHRlcm4gPSAvXFxTfCQvO1xuICBjb25zdCBwZXJtaXNzaW9uTmFtZVBhdHRlcm4gPSAvYW5kcm9pZFxcLlxcdypcXC4/cGVybWlzc2lvblxcLlxcdysvO1xuICBjb25zdCBncmFudGVkU3RhdGVQYXR0ZXJuID0gL1xcYmdyYW50ZWQ9KFxcdyspLztcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIGdyb3VwTmFtZXMpIHtcbiAgICBjb25zdCBncm91cE1hdGNoID0gZ3JvdXBQYXR0ZXJuQnlOYW1lKGdyb3VwTmFtZSkuZXhlYyhkdW1wc3lzT3V0cHV0KTtcbiAgICBpZiAoIWdyb3VwTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gZ3JvdXBNYXRjaFsxXS5zcGxpdCgnXFxuJyk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRpdGxlSW5kZW50ID0gbGluZXNbMF0uc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcy5zbGljZSgxKSkge1xuICAgICAgY29uc3QgY3VycmVudEluZGVudCA9IGxpbmUuc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgICAgaWYgKGN1cnJlbnRJbmRlbnQgPD0gdGl0bGVJbmRlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25OYW1lTWF0Y2ggPSBwZXJtaXNzaW9uTmFtZVBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghcGVybWlzc2lvbk5hbWVNYXRjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgIHBlcm1pc3Npb246IHBlcm1pc3Npb25OYW1lTWF0Y2hbMF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JhbnRlZFN0YXRlTWF0Y2ggPSBncmFudGVkU3RhdGVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgICBpZiAoZ3JhbnRlZFN0YXRlTWF0Y2gpIHtcbiAgICAgICAgaXRlbS5ncmFudGVkID0gZ3JhbnRlZFN0YXRlTWF0Y2hbMV0gPT09ICd0cnVlJztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkUmVzdWx0ID0gcmVzdWx0XG4gICAgLmZpbHRlcigoaXRlbSkgPT4gIV8uaXNCb29sZWFuKGdyYW50ZWRTdGF0ZSkgfHwgaXRlbS5ncmFudGVkID09PSBncmFudGVkU3RhdGUpXG4gICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5wZXJtaXNzaW9uKTtcbiAgbG9nLmRlYnVnKGBSZXRyaWV2ZWQgJHt1dGlsLnBsdXJhbGl6ZSgncGVybWlzc2lvbicsIGZpbHRlcmVkUmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgIGBmcm9tICR7Z3JvdXBOYW1lc30gJHt1dGlsLnBsdXJhbGl6ZSgnZ3JvdXAnLCBncm91cE5hbWVzLmxlbmd0aCwgZmFsc2UpfWApO1xuICByZXR1cm4gZmlsdGVyZWRSZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFydGlhbEluc3RhbGwgW2ZhbHNlXSAtIEluc3RhbGwgYXBrcyBwYXJ0aWFsbHkuIEl0IGlzIHVzZWQgZm9yICdpbnN0YWxsLW11bHRpcGxlJy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9hbmRyb2lkLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMTEwNjQvd2hhdC1pcy1hLXBhcnRpYWwtYXBwbGljYXRpb24taW5zdGFsbC12aWEtYWRiXG4gKi9cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGdpdmVuIG9wdGlvbnMgaW50byB0aGUgbGlzdCBvZiBgYWRiIGluc3RhbGwuaW5zdGFsbC1tdWx0aXBsZWAgY29tbWFuZCBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYXBpTGV2ZWwgLSBUaGUgY3VycmVudCBBUEkgbGV2ZWxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgbWFwcGluZyB0byB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbEFyZ3MgKGFwaUxldmVsLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG9wdGlvbnMucmVwbGFjZSkgfHwgb3B0aW9ucy5yZXBsYWNlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1yJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuYWxsb3dUZXN0UGFja2FnZXMpIHtcbiAgICByZXN1bHQucHVzaCgnLXQnKTtcbiAgfVxuICBpZiAob3B0aW9ucy51c2VTZGNhcmQpIHtcbiAgICByZXN1bHQucHVzaCgnLXMnKTtcbiAgfVxuICBpZiAob3B0aW9ucy5ncmFudFBlcm1pc3Npb25zKSB7XG4gICAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2tpcHBpbmcgcGVybWlzc2lvbnMgZ3JhbnQgb3B0aW9uLCBzaW5jZSBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGN1cnJlbnQgQVBJIGxldmVsICR7YXBpTGV2ZWx9IGRvZXMgbm90IHN1cHBvcnQgYXBwbGljYXRpb25zIGAgK1xuICAgICAgICAgICAgICAgIGBwZXJtaXNzaW9ucyBjdXN0b21pemF0aW9uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKCctZycpO1xuICAgIH1cbiAgfVxuICAvLyBGb3IgbXVsdGlwbGUtaW5zdGFsbFxuICBpZiAob3B0aW9ucy5wYXJ0aWFsSW5zdGFsbCkge1xuICAgIHJlc3VsdC5wdXNoKCctcCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYW5pZmVzdEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2cgLSBUaGUgYXBwbGljYXRpb24gaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gcGFja2FnZSBhY3Rpdml0eVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFRoZSB2ZXJzaW9uIGNvZGUgbnVtYmVyIChtaWdodCBiZSBgTmFOYClcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbk5hbWUgLSBUaGUgdmVyc2lvbiBuYW1lIChtaWdodCBiZSBgbnVsbGApXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtIHBhcnNpbmcgb2YgdGhlIG1hbmlmZXN0IG9iamVjdCBpbiBvcmRlclxuICogdG8gZXh0cmFjdCBzb21lIHZpdGFsIHZhbHVlcyBmcm9tIGl0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1hbmlmZXN0IFRoZSBtYW5pZmVzdCBjb250ZW50IGZvcm1hdHRlZCBhcyBKU09OXG4gKiBTZWUgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYWRia2l0LWFwa3JlYWRlciBmb3IgZGV0YWlsZWQgZm9ybWF0IGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyB7TWFuaWZlc3RJbmZvfVxuICovXG5mdW5jdGlvbiBwYXJzZU1hbmlmZXN0IChtYW5pZmVzdCkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgcGtnOiBtYW5pZmVzdC5wYWNrYWdlLFxuICAgIHZlcnNpb25Db2RlOiBwYXJzZUludChtYW5pZmVzdC52ZXJzaW9uQ29kZSwgMTApLFxuICAgIHZlcnNpb25OYW1lOiBtYW5pZmVzdC52ZXJzaW9uTmFtZSB8fCBudWxsLFxuICB9O1xuICBpZiAoIW1hbmlmZXN0LmFwcGxpY2F0aW9uKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIExvb2sgZm9yIGVuYWJsZWQgYWN0aXZpdHkgb3IgYWN0aXZpdHktYWxpYXMgd2l0aFxuICAvLyBhY3Rpb24gPT0gYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gYW5kXG4gIC8vIGNhdGVnb3J5ID09IGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSXG4gIGZvciAoY29uc3QgYWN0aXZpdHkgb2YgW1xuICAgIC4uLm1hbmlmZXN0LmFwcGxpY2F0aW9uLmFjdGl2aXRpZXMsXG4gICAgLi4ubWFuaWZlc3QuYXBwbGljYXRpb24uYWN0aXZpdHlBbGlhc2VzLFxuICBdKSB7XG4gICAgaWYgKGFjdGl2aXR5LmVuYWJsZWQgPT09IGZhbHNlIHx8IF8uaXNFbXB0eShhY3Rpdml0eS5pbnRlbnRGaWx0ZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7YWN0aW9ucywgY2F0ZWdvcmllc30gb2YgYWN0aXZpdHkuaW50ZW50RmlsdGVycykge1xuICAgICAgaWYgKF8uaXNFbXB0eShhY3Rpb25zKSB8fCBfLmlzRW1wdHkoY2F0ZWdvcmllcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTWFpbkFjdGlvbiA9IGFjdGlvbnNcbiAgICAgICAgLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyk7XG4gICAgICBjb25zdCBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzXG4gICAgICAgIC5zb21lKCh7bmFtZX0pID0+IG5hbWUgPT09ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicpO1xuICAgICAgaWYgKGlzTWFpbkFjdGlvbiAmJiBpc0xhdW5jaGVyQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmVzdWx0LmFjdGl2aXR5ID0gYWN0aXZpdHkubmFtZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYXBrIHN0cmluZ3MgZnJvbSBhYXB0IHRvb2wgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd091dHB1dCBUaGUgYWN0dWFsIHRvb2wgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnTWFya2VyIFRoZSBjb25maWcgbWFya2VyLiBVc3VhbGx5XG4gKiBhIGxhbmd1YWdlIGFiYnJldmlhdGlvbiBvciBgKGRlZmF1bHQpYFxuICogQHJldHVybnMge09iamVjdH0gU3RyaW5ncyBpZHMgdG8gdmFsdWVzIG1hcHBpbmcuIFBsdXJhbFxuICogdmFsdWVzIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMuIElmIG5vIGNvbmZpZyBmb3VuZCBmb3IgdGhlXG4gKiBnaXZlbiBtYXJrZXIgdGhlbiBhbiBlbXB0eSBtYXBwaW5nIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUFhcHRTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBub3JtYWxpemVTdHJpbmdNYXRjaCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvXCIkLywgJycpLnJlcGxhY2UoL15cIi8sICcnKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG4gIH07XG5cbiAgY29uc3QgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgaXNJbkNvbmZpZyA9IGZhbHNlO1xuICBsZXQgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICBsZXQgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gIC8vIFRoZSBwYXR0ZXJuIG1hdGNoZXMgYW55IHF1b3RlZCBjb250ZW50IGluY2x1ZGluZyBlc2NhcGVkIHF1b3Rlc1xuICBjb25zdCBxdW90ZWRTdHJpbmdQYXR0ZXJuID0gL1wiW15cIlxcXFxdKig/OlxcXFwuW15cIlxcXFxdKikqXCIvO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcmF3T3V0cHV0LnNwbGl0KG9zLkVPTCkpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmIChfLmlzRW1wdHkodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWydjb25maWcnLCAndHlwZScsICdzcGVjJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgaXNJbkNvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYGNvbmZpZyAke2NvbmZpZ01hcmtlcn06YCk7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNJbkNvbmZpZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJ3Jlc291cmNlJykpIHtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJzpzdHJpbmcvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvOnN0cmluZ1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6cGx1cmFscy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC86cGx1cmFsc1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiB0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoc3RyaW5nJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcXVvdGVkU3RyaW5nUGF0dGVybi5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IG5vcm1hbGl6ZVN0cmluZ01hdGNoKG1hdGNoWzBdKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiBpc0luUGx1cmFsR3JvdXAgJiYgdHJpbW1lZExpbmUuaW5jbHVkZXMoJzogKHN0cmluZycpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHF1b3RlZFN0cmluZ1BhdHRlcm4uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgLi4uKGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdIHx8IFtdKSxcbiAgICAgICAgICBub3JtYWxpemVTdHJpbmdNYXRjaChtYXRjaFswXSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFwa1N0cmluZ3M7XG59XG5cbi8qKlxuICogUGFyc2VzIGFwayBzdHJpbmdzIGZyb20gYWFwdDIgdG9vbCBvdXRwdXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3T3V0cHV0IFRoZSBhY3R1YWwgdG9vbCBvdXRwdXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdNYXJrZXIgVGhlIGNvbmZpZyBtYXJrZXIuIFVzdWFsbHlcbiAqIGEgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uIG9yIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQgb25lXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTdHJpbmdzIGlkcyB0byB2YWx1ZXMgbWFwcGluZy4gUGx1cmFsXG4gKiB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFycmF5cy4gSWYgbm8gY29uZmlnIGZvdW5kIGZvciB0aGVcbiAqIGdpdmVuIG1hcmtlciB0aGVuIGFuIGVtcHR5IG1hcHBpbmcgaXMgcmV0dXJuZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQWFwdDJTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBhbGxMaW5lcyA9IHJhd091dHB1dC5zcGxpdChvcy5FT0wpO1xuICBmdW5jdGlvbiBleHRyYWN0Q29udGVudCAoc3RhcnRJZHgpIHtcbiAgICBsZXQgaWR4ID0gc3RhcnRJZHg7XG4gICAgY29uc3Qgc3RhcnRDaGFyUG9zID0gYWxsTGluZXNbc3RhcnRJZHhdLmluZGV4T2YoJ1wiJyk7XG4gICAgaWYgKHN0YXJ0Q2hhclBvcyA8IDApIHtcbiAgICAgIHJldHVybiBbbnVsbCwgaWR4XTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHdoaWxlIChpZHggPCBhbGxMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0aW9uQ2hhck1hdGNoID0gL1wiJC8uZXhlYyhhbGxMaW5lc1tpZHhdKTtcbiAgICAgIGlmICh0ZXJtaW5hdGlvbkNoYXJNYXRjaCkge1xuICAgICAgICBjb25zdCB0ZXJtaW5hdGlvbkNoYXJQb3MgPSB0ZXJtaW5hdGlvbkNoYXJNYXRjaC5pbmRleDtcbiAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSBpZHgpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSwgdGVybWluYXRpb25DaGFyUG9zKSxcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHtyZXN1bHR9XFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKDAsIHRlcm1pbmF0aW9uQ2hhclBvcykpfWAsXG4gICAgICAgICAgaWR4LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCA+IHN0YXJ0SWR4KSB7XG4gICAgICAgIHJlc3VsdCArPSBgXFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0pfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSk7XG4gICAgICB9XG4gICAgICArK2lkeDtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXN1bHQsIGlkeF07XG4gIH1cblxuICBjb25zdCBhcGtTdHJpbmdzID0ge307XG4gIGxldCBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gIGxldCBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgbGV0IGlzSW5DdXJyZW50Q29uZmlnID0gZmFsc2U7XG4gIGxldCBsaW5lSW5kZXggPSAwO1xuICB3aGlsZSAobGluZUluZGV4IDwgYWxsTGluZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBhbGxMaW5lc1tsaW5lSW5kZXhdLnRyaW0oKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRyaW1tZWRMaW5lKSkge1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWyd0eXBlJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgncmVzb3VyY2UnKSkge1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJ3N0cmluZy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9zdHJpbmdcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCdwbHVyYWxzLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL3BsdXJhbHNcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRSZXNvdXJjZUlkKSB7XG4gICAgICBpZiAoaXNJblBsdXJhbEdyb3VwKSB7XG4gICAgICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoJykpIHtcbiAgICAgICAgICBpc0luQ3VycmVudENvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYCgke2NvbmZpZ01hcmtlcn0pYCk7XG4gICAgICAgICAgKytsaW5lSW5kZXg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5DdXJyZW50Q29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgW2NvbnRlbnQsIGlkeF0gPSBleHRyYWN0Q29udGVudChsaW5lSW5kZXgpO1xuICAgICAgICAgIGxpbmVJbmRleCA9IGlkeDtcbiAgICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgICAgIC4uLihhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSB8fCBbXSksXG4gICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKGAoJHtjb25maWdNYXJrZXJ9KWApKSB7XG4gICAgICAgIGNvbnN0IFtjb250ZW50LCBpZHhdID0gZXh0cmFjdENvbnRlbnQobGluZUluZGV4KTtcbiAgICAgICAgbGluZUluZGV4ID0gaWR4O1xuICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgICsrbGluZUluZGV4O1xuICB9XG4gIHJldHVybiBhcGtTdHJpbmdzO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGNvbmZpZyBtYXJrZXIsIHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvIHBhcnNlLi4gbWV0aG9kc1xuICogdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggcmVzb3VyY2UgZm9ybWF0cyBnZW5lcmF0ZWQgYnkgYWFwdCgyKSB0b29sXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29uZmlnc0dldHRlciBUaGUgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IGlzIGEgbGlzdFxuICogb2YgYXBrIGNvbmZpZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNpcmVkTWFya2VyIFRoZSBkZXNpcmVkIGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0TWFya2VyIFRoZSBkZWZhdWx0IGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBjb25maWcgbWFya2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdENvbmZpZ01hcmtlciAoY29uZmlnc0dldHRlciwgZGVzaXJlZE1hcmtlciwgZGVmYXVsdE1hcmtlcikge1xuICBsZXQgY29uZmlnTWFya2VyID0gZGVzaXJlZE1hcmtlciB8fCBkZWZhdWx0TWFya2VyO1xuICBpZiAoY29uZmlnTWFya2VyLmluY2x1ZGVzKCctJykgJiYgIWNvbmZpZ01hcmtlci5pbmNsdWRlcygnLXInKSkge1xuICAgIGNvbmZpZ01hcmtlciA9IGNvbmZpZ01hcmtlci5yZXBsYWNlKCctJywgJy1yJyk7XG4gIH1cbiAgY29uc3QgY29uZmlncyA9IGF3YWl0IGNvbmZpZ3NHZXR0ZXIoKTtcbiAgbG9nLmRlYnVnKGBSZXNvdXJjZSBjb25maWd1cmF0aW9uczogJHtKU09OLnN0cmluZ2lmeShjb25maWdzKX1gKTtcbiAgLy8gQXNzdW1lIHRoZSAnZW4nIGNvbmZpZ3VyYXRpb24gaXMgdGhlIGRlZmF1bHQgb25lXG4gIGlmIChjb25maWdNYXJrZXIudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdlbicpXG4gICAgJiYgIWNvbmZpZ3Muc29tZSgoeCkgPT4geC50cmltKCkgPT09IGNvbmZpZ01hcmtlcikpIHtcbiAgICBsb2cuZGVidWcoYFJlc291cmNlIGNvbmZpZ3VyYXRpb24gbmFtZSAnJHtjb25maWdNYXJrZXJ9JyBpcyB1bmtub3duLiBgICtcbiAgICAgIGBSZXBsYWNpbmcgaXQgd2l0aCAnJHtkZWZhdWx0TWFya2VyfSdgKTtcbiAgICBjb25maWdNYXJrZXIgPSBkZWZhdWx0TWFya2VyO1xuICB9IGVsc2Uge1xuICAgIGxvZy5kZWJ1ZyhgU2VsZWN0ZWQgY29uZmlndXJhdGlvbjogJyR7Y29uZmlnTWFya2VyfSdgKTtcbiAgfVxuICByZXR1cm4gY29uZmlnTWFya2VyO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgb3V0cHV0IGluIEpTT04gZm9ybWF0IHJldHJpZXZlZCBmcm9tXG4gKiB0aGUgY29ycmVzcG9uZGluZyBBcHBpdW0gU2V0dGluZ3MgYnJvYWRjYXN0IGNhbGxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dCBUaGUgYWN0dWFsIGNvbW1hbmQgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gZW50aXR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHdoaWNoIGlzXG4gKiBnb2luZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwYXJzZWQgSlNPTiBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgb3V0cHV0IGNhbm5vdCBiZSBwYXJzZWRcbiAqIGFzIGEgdmFsaWQgSlNPTlxuICovXG5mdW5jdGlvbiBwYXJzZUpzb25EYXRhIChvdXRwdXQsIGVudGl0eU5hbWUpIHtcbiAgaWYgKCEvXFxicmVzdWx0PS0xXFxiLy50ZXN0KG91dHB1dCkgfHwgIS9cXGJkYXRhPVwiLy50ZXN0KG91dHB1dCkpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gL1xcYmRhdGE9KFwiLispLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbiAgY29uc3QganNvblN0ciA9IF8udHJpbShtYXRjaFsxXSkucmVwbGFjZSgvKF5cIil8KFwiJCkvZywgJycpO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGpzb25TdHIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlICR7ZW50aXR5TmFtZX0gZnJvbSB0aGUgcmVzdWx0aW5nIGRhdGEgc3RyaW5nLiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgY291bnRyeSBhYmJyZXZpYXRpb25zXG4gKiB0byBBVkQgYXJndW1lbnRzIGFycmF5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsYW5ndWFnZSBMYW5ndWFnZSBuYW1lLCBmb3IgZXhhbXBsZSAnZnInXG4gKiBAcGFyYW0gez9zdHJpbmd9IGNvdW50cnkgQ291bnRyeSBuYW1lLCBmb3IgZXhhbXBsZSAnQ0EnXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGdlbmVyYXRlZCBhcmd1bWVudHMuIFRoZVxuICogcmVzdWx0aW5nIGFycmF5IG1pZ2h0IGJlIGVtcHR5IGlmIGJvdGggYXJndW1lbnRzIGFyZSBlbXB0eVxuICovXG5mdW5jdGlvbiB0b0F2ZExvY2FsZUFyZ3MgKGxhbmd1YWdlLCBjb3VudHJ5KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAobGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMubGFuZ3VhZ2U9JHtsYW5ndWFnZS50b0xvd2VyQ2FzZSgpfWApO1xuICB9XG4gIGlmIChjb3VudHJ5ICYmIF8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMuY291bnRyeT0ke2NvdW50cnkudG9VcHBlckNhc2UoKX1gKTtcbiAgfVxuICBsZXQgbG9jYWxlO1xuICBpZiAoXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgXy5pc1N0cmluZyhjb3VudHJ5KSAmJiBsYW5ndWFnZSAmJiBjb3VudHJ5KSB7XG4gICAgbG9jYWxlID0gbGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSArICctJyArIGNvdW50cnkudG9VcHBlckNhc2UoKTtcbiAgfSBlbHNlIGlmIChsYW5ndWFnZSAmJiBfLmlzU3RyaW5nKGxhbmd1YWdlKSkge1xuICAgIGxvY2FsZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAoY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgbG9jYWxlID0gY291bnRyeTtcbiAgfVxuICBpZiAobG9jYWxlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmxvY2FsZT0ke2xvY2FsZX1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIHByZWZlcmVuY2VzIHJvb3RcbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgZm9sZGVyIG9yIGBudWxsYCBpZiB0aGUgZm9sZGVyIGNhbm5vdCBiZSBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRyb2lkUHJlZnNSb290ICgpIHtcbiAgbGV0IGxvY2F0aW9uID0gcHJvY2Vzcy5lbnYuQU5EUk9JRF9FTVVMQVRPUl9IT01FO1xuICBpZiAoYXdhaXQgZGlyRXhpc3RzKGxvY2F0aW9uKSkge1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuXG4gIGlmIChsb2NhdGlvbikge1xuICAgIGxvZy53YXJuKGBUaGUgdmFsdWUgb2YgdGhlIEFORFJPSURfRU1VTEFUT1JfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnJHtsb2NhdGlvbn0nIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnlgKTtcbiAgfVxuXG4gIGNvbnN0IGhvbWUgPSBwcm9jZXNzLmVudi5IT01FIHx8IHByb2Nlc3MuZW52LlVTRVJQUk9GSUxFO1xuICBpZiAoaG9tZSkge1xuICAgIGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGhvbWUsICcuYW5kcm9pZCcpO1xuICB9XG5cbiAgaWYgKCFhd2FpdCBkaXJFeGlzdHMobG9jYXRpb24pKSB7XG4gICAgbG9nLmRlYnVnKGBBbmRyb2lkIGNvbmZpZyByb290ICcke2xvY2F0aW9ufScgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGF0aCBleGlzdHMgb24gdGhlIGZpbGVzeXN0ZW0gYW5kIGlzIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsb2NhdGlvbiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBkaXJFeGlzdHMgKGxvY2F0aW9uKSB7XG4gIHJldHVybiBsb2NhdGlvblxuICAgICYmIGF3YWl0IGZzLmV4aXN0cyhsb2NhdGlvbilcbiAgICAmJiAoYXdhaXQgZnMuc3RhdChsb2NhdGlvbikpLmlzRGlyZWN0b3J5KCk7XG59XG5cbi8qKlxuICogRXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy5cbiAqIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHBvc3NpYmxlIGlzc3VlcyB3aXRoIGhvdyBzeXN0ZW0gYHNwYXduYFxuICogY2FsbCBoYW5kbGVzIHRoZW0uXG4gKiBTZWUgaHR0cHM6Ly9kaXNjdXNzLmFwcGl1bS5pby90L2hvdy10by1tb2RpZnktd2QtcHJveHktYW5kLXVpYXV0b21hdG9yMi1zb3VyY2UtY29kZS10by1zdXBwb3J0LXVuaWNvZGUvMzM0NjZcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZyBOb24tZXNjYXBlZCBhcmd1bWVudCBzdHJpbmdcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVNoZWxsQXJnIChhcmcpIHtcbiAgYXJnID0gYCR7YXJnfWA7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gL1smfF5cXHNdLy50ZXN0KGFyZykgPyBgXCIke2FyZy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYCA6IGFyZztcbiAgfVxuICByZXR1cm4gYXJnLnJlcGxhY2UoLyYvZywgJ1xcXFwmJyk7XG59XG5cbmV4cG9ydCB7XG4gIGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgsIHVuemlwRmlsZSxcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldEphdmFGb3JPcywgaXNTaG93aW5nTG9ja3NjcmVlbiwgaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkLFxuICBnZXRTdXJmYWNlT3JpZW50YXRpb24sIGlzU2NyZWVuT25GdWxseSwgYnVpbGRTdGFydENtZCwgZ2V0SmF2YUhvbWUsXG4gIHJvb3REaXIsIGdldFNka1Rvb2xzVmVyc2lvbiwgZ2V0QXBrc2lnbmVyRm9yT3MsIGdldEJ1aWxkVG9vbHNEaXJzLFxuICBnZXRBcGthbmFseXplckZvck9zLCBnZXRPcGVuU3NsRm9yT3MsIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zLCBBUEtTX0VYVEVOU0lPTixcbiAgQVBLX0lOU1RBTExfVElNRU9VVCwgQVBLU19JTlNUQUxMX1RJTUVPVVQsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS19FWFRFTlNJT04sXG4gIERFRkFVTFRfQURCX0VYRUNfVElNRU9VVCwgcGFyc2VNYW5pZmVzdCwgcGFyc2VBYXB0U3RyaW5ncywgcGFyc2VBYXB0MlN0cmluZ3MsXG4gIGZvcm1hdENvbmZpZ01hcmtlciwgcGFyc2VKc29uRGF0YSwgdW5zaWduQXBrLCB0b0F2ZExvY2FsZUFyZ3MsIHJlcXVpcmVTZGtSb290LFxuICBnZXRTZGtSb290RnJvbUVudiwgZ2V0QW5kcm9pZFByZWZzUm9vdCwgZGlyRXhpc3RzLCBlc2NhcGVTaGVsbEFyZyxcbn07XG4iXSwiZmlsZSI6ImxpYi9oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
868
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbInJvb3REaXIiLCJwYXRoIiwicmVzb2x2ZSIsIl9fZGlybmFtZSIsInByb2Nlc3MiLCJlbnYiLCJOT19QUkVDT01QSUxFIiwiQVBLU19FWFRFTlNJT04iLCJBUEtfRVhURU5TSU9OIiwiQVBLX0lOU1RBTExfVElNRU9VVCIsIkFQS1NfSU5TVEFMTF9USU1FT1VUIiwiREVGQVVMVF9BREJfRVhFQ19USU1FT1VUIiwiZ2V0U2RrUm9vdEZyb21FbnYiLCJBTkRST0lEX0hPTUUiLCJBTkRST0lEX1NES19ST09UIiwicmVxdWlyZVNka1Jvb3QiLCJjdXN0b21Sb290Iiwic2RrUm9vdCIsImRvY01zZyIsIl8iLCJpc0VtcHR5IiwiRXJyb3IiLCJmcyIsImV4aXN0cyIsInN0YXRzIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInByb3BzUGF0aHMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJwbGF0Zm9ybXNNYXBwaW5nIiwicHJvcHNQYXRoIiwicHJvcHNDb250ZW50IiwicmVhZEZpbGUiLCJwbGF0Zm9ybVBhdGgiLCJkaXJuYW1lIiwicGxhdGZvcm0iLCJiYXNlbmFtZSIsIm1hdGNoIiwiZXhlYyIsImxvZyIsIndhcm4iLCJwYXJzZUludCIsInJlY2VudFNka1ZlcnNpb24iLCJrZXlzIiwic29ydCIsInJldmVyc2UiLCJyZXN1bHQiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bnppcEZpbGUiLCJ6aXBQYXRoIiwiZHN0Um9vdCIsInppcCIsImFzc2VydFZhbGlkWmlwIiwiZXh0cmFjdEFsbFRvIiwidW5zaWduQXBrIiwiYXBrUGF0aCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsIm1ldGFJbmZGb2xkZXJOYW1lIiwiaGFzTWV0YUluZiIsInJlYWRFbnRyaWVzIiwiZW50cnkiLCJmaWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJ0bXBaaXBSb290IiwicmltcmFmIiwidG1wUmVzdWx0UGF0aCIsInRvQXJjaGl2ZSIsInVubGluayIsIm12IiwiZ2V0SU1FTGlzdEZyb21PdXRwdXQiLCJzdGRvdXQiLCJlbmdpbmVzIiwibGluZSIsInNwbGl0IiwibGVuZ3RoIiwicHVzaCIsInRyaW0iLCJyZXBsYWNlIiwiZ2V0SmF2YUhvbWUiLCJtZW1vaXplIiwiSkFWQV9IT01FIiwiZ2V0SmF2YUZvck9zIiwiamF2YUhvbWUiLCJlcnJNc2ciLCJlcnIiLCJtZXNzYWdlIiwiZXhlY3V0YWJsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJyZXN1bHRQYXRoIiwid2hpY2giLCJpZ24iLCJnZXRPcGVuU3NsRm9yT3MiLCJiaW5hcnlOYW1lIiwiZ2V0QXBrc2lnbmVyRm9yT3MiLCJzeXNIZWxwZXJzIiwiZ2V0QmluYXJ5RnJvbVNka1Jvb3QiLCJnZXRBcGthbmFseXplckZvck9zIiwiaXNTaG93aW5nTG9ja3NjcmVlbiIsImR1bXBzeXMiLCJzb21lIiwieCIsImluY2x1ZGVzIiwiZXZlcnkiLCJ0ZXN0IiwiaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkIiwibSIsImdldFN1cmZhY2VPcmllbnRhdGlvbiIsImlzU2NyZWVuT25GdWxseSIsImJ1aWxkU3RhcnRDbWQiLCJzdGFydEFwcE9wdGlvbnMiLCJhcGlMZXZlbCIsInVzZXIiLCJ3YWl0Rm9yTGF1bmNoIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjYXRlZ29yeSIsInN0b3BBcHAiLCJmbGFncyIsImNtZCIsInV0aWwiLCJoYXNWYWx1ZSIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwicGFyc2VLZXlWYWx1ZSIsInN0ciIsInNwYWNlIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsInJlIiwiYXJncyIsImFwcGx5IiwiZmxhZyIsImZsYWdQb3MiLCJwcmV2QXJncyIsImdldFNka1Rvb2xzVmVyc2lvbiIsImFuZHJvaWRIb21lIiwicHJvcGVydGllc1BhdGgiLCJwcm9wZXJ0aWVzQ29udGVudCIsInZlcnNpb25NYXRjaGVyIiwiUmVnRXhwIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwiZ2V0QnVpbGRUb29sc0RpcnMiLCJidWlsZFRvb2xzRGlycyIsIm1hcCIsImRpciIsImEiLCJiIiwic2VtdmVyIiwicmNvbXBhcmUiLCJwYWlyIiwicGFpcnMiLCJCIiwibXRpbWUiLCJ2YWx1ZU9mIiwiaW5mbyIsImV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zIiwiZHVtcHN5c091dHB1dCIsImdyb3VwTmFtZXMiLCJncmFudGVkU3RhdGUiLCJncm91cFBhdHRlcm5CeU5hbWUiLCJncm91cE5hbWUiLCJlc2NhcGVSZWdFeHAiLCJpbmRlbnRQYXR0ZXJuIiwicGVybWlzc2lvbk5hbWVQYXR0ZXJuIiwiZ3JhbnRlZFN0YXRlUGF0dGVybiIsImdyb3VwTWF0Y2giLCJsaW5lcyIsInRpdGxlSW5kZW50Iiwic2VhcmNoIiwic2xpY2UiLCJjdXJyZW50SW5kZW50IiwicGVybWlzc2lvbk5hbWVNYXRjaCIsIml0ZW0iLCJwZXJtaXNzaW9uIiwiZ3JhbnRlZFN0YXRlTWF0Y2giLCJncmFudGVkIiwiZmlsdGVyZWRSZXN1bHQiLCJmaWx0ZXIiLCJpc0Jvb2xlYW4iLCJwbHVyYWxpemUiLCJidWlsZEluc3RhbGxBcmdzIiwib3B0aW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwidXNlU2RjYXJkIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBhcnRpYWxJbnN0YWxsIiwicGFyc2VNYW5pZmVzdCIsIm1hbmlmZXN0IiwicGFja2FnZSIsInZlcnNpb25Db2RlIiwidmVyc2lvbk5hbWUiLCJhcHBsaWNhdGlvbiIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUFsaWFzZXMiLCJlbmFibGVkIiwiaW50ZW50RmlsdGVycyIsImFjdGlvbnMiLCJjYXRlZ29yaWVzIiwiaXNNYWluQWN0aW9uIiwibmFtZSIsImlzTGF1bmNoZXJDYXRlZ29yeSIsInBhcnNlQWFwdFN0cmluZ3MiLCJyYXdPdXRwdXQiLCJjb25maWdNYXJrZXIiLCJub3JtYWxpemVTdHJpbmdNYXRjaCIsInMiLCJhcGtTdHJpbmdzIiwiaXNJbkNvbmZpZyIsImN1cnJlbnRSZXNvdXJjZUlkIiwiaXNJblBsdXJhbEdyb3VwIiwicXVvdGVkU3RyaW5nUGF0dGVybiIsIm9zIiwiRU9MIiwidHJpbW1lZExpbmUiLCJwYXJzZUFhcHQyU3RyaW5ncyIsImFsbExpbmVzIiwiZXh0cmFjdENvbnRlbnQiLCJzdGFydElkeCIsImlkeCIsInN0YXJ0Q2hhclBvcyIsInRlcm1pbmF0aW9uQ2hhck1hdGNoIiwidGVybWluYXRpb25DaGFyUG9zIiwiaW5kZXgiLCJ0cmltU3RhcnQiLCJpc0luQ3VycmVudENvbmZpZyIsImxpbmVJbmRleCIsImNvbnRlbnQiLCJpc1N0cmluZyIsImZvcm1hdENvbmZpZ01hcmtlciIsImNvbmZpZ3NHZXR0ZXIiLCJkZXNpcmVkTWFya2VyIiwiZGVmYXVsdE1hcmtlciIsImNvbmZpZ3MiLCJ0b0xvd2VyQ2FzZSIsInBhcnNlSnNvbkRhdGEiLCJvdXRwdXQiLCJlbnRpdHlOYW1lIiwianNvblN0ciIsInBhcnNlIiwiZSIsInRvQXZkTG9jYWxlQXJncyIsImxhbmd1YWdlIiwiY291bnRyeSIsInRvVXBwZXJDYXNlIiwibG9jYWxlIiwiZ2V0QW5kcm9pZFByZWZzUm9vdCIsImxvY2F0aW9uIiwiQU5EUk9JRF9FTVVMQVRPUl9IT01FIiwiZGlyRXhpc3RzIiwiaG9tZSIsIkhPTUUiLCJVU0VSUFJPRklMRSIsImVzY2FwZVNoZWxsQXJnIiwiYXJnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxPQUFPLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUMsU0FBYixFQUF3QkMsT0FBTyxDQUFDQyxHQUFSLENBQVlDLGFBQVosR0FBNEIsSUFBNUIsR0FBbUMsT0FBM0QsQ0FBaEI7OztBQUNBLE1BQU1DLGNBQWMsR0FBRyxPQUF2Qjs7QUFDQSxNQUFNQyxhQUFhLEdBQUcsTUFB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QSxNQUFJRixJQUFKLEVBQVU7QUFDUkgsSUFBQUEsUUFBUSxHQUFHL1AsY0FBS0MsT0FBTCxDQUFhaVEsSUFBYixFQUFtQixVQUFuQixDQUFYO0FBQ0Q7O0FBRUQsTUFBSSxFQUFDLE1BQU1ELFNBQVMsQ0FBQ0YsUUFBRCxDQUFoQixDQUFKLEVBQWdDO0FBQzlCdE4sb0JBQUlRLEtBQUosQ0FBVyx3QkFBdUI4TSxRQUFTLGdDQUEzQzs7QUFDQSxXQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFPQSxRQUFQO0FBQ0Q7O0FBUUQsZUFBZUUsU0FBZixDQUEwQkYsUUFBMUIsRUFBb0M7QUFDbEMsU0FBT0EsUUFBUSxLQUNWLE1BQU0xTyxZQUFHQyxNQUFILENBQVV5TyxRQUFWLENBREksQ0FBUixJQUVGLENBQUMsTUFBTTFPLFlBQUdHLElBQUgsQ0FBUXVPLFFBQVIsQ0FBUCxFQUEwQnRPLFdBQTFCLEVBRkw7QUFHRDs7QUFZRCxTQUFTNE8sY0FBVCxDQUF5QkMsR0FBekIsRUFBOEI7QUFDNUJBLEVBQUFBLEdBQUcsR0FBSSxHQUFFQSxHQUFJLEVBQWI7O0FBQ0EsTUFBSXpLLGdCQUFPQyxTQUFQLEVBQUosRUFBd0I7QUFDdEIsV0FBTyxVQUFVZ0IsSUFBVixDQUFld0osR0FBZixJQUF1QixJQUFHQSxHQUFHLENBQUNuTCxPQUFKLENBQVksSUFBWixFQUFrQixJQUFsQixDQUF3QixHQUFsRCxHQUF1RG1MLEdBQTlEO0FBQ0Q7O0FBQ0QsU0FBT0EsR0FBRyxDQUFDbkwsT0FBSixDQUFZLElBQVosRUFBa0IsS0FBbEIsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCB6aXAsIHV0aWwsIHRlbXBEaXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcblxuY29uc3Qgcm9vdERpciA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIHByb2Nlc3MuZW52Lk5PX1BSRUNPTVBJTEUgPyAnLi4nIDogJy4uLy4uJyk7XG5jb25zdCBBUEtTX0VYVEVOU0lPTiA9ICcuYXBrcyc7XG5jb25zdCBBUEtfRVhURU5TSU9OID0gJy5hcGsnO1xuY29uc3QgQVBLX0lOU1RBTExfVElNRU9VVCA9IDYwMDAwO1xuY29uc3QgQVBLU19JTlNUQUxMX1RJTUVPVVQgPSBBUEtfSU5TVEFMTF9USU1FT1VUICogMjtcbmNvbnN0IERFRkFVTFRfQURCX0VYRUNfVElNRU9VVCA9IDIwMDAwOyAvLyBpbiBtaWxsaXNlY29uZHNcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGFjdHVhbCBwYXRoIHRvIFNESyByb290IGZvbGRlciBmcm9tIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnRcbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBTREsgcm9vdCBmb2xkZXJcbiAqL1xuZnVuY3Rpb24gZ2V0U2RrUm9vdEZyb21FbnYgKCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuQU5EUk9JRF9IT01FIHx8IHByb2Nlc3MuZW52LkFORFJPSURfU0RLX1JPT1Q7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhY3R1YWwgcGF0aCB0byBTREsgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIFNESyByb290IGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIGVpdGhlciB0aGUgY29ycmVzcG9uZGluZyBlbnYgdmFyaWFibGUgaXMgdW5zZXQgb3IgaXNcbiAqIHBvaW50aW5nIHRvIGFuIGludmFsaWQgZmlsZSBzeXN0ZW0gZW50cnlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVxdWlyZVNka1Jvb3QgKGN1c3RvbVJvb3QgPSBudWxsKSB7XG4gIGNvbnN0IHNka1Jvb3QgPSBjdXN0b21Sb290IHx8IGdldFNka1Jvb3RGcm9tRW52KCk7XG4gIGNvbnN0IGRvY01zZyA9ICdSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvdmFyaWFibGVzIGZvciBtb3JlIGRldGFpbHMnO1xuICBpZiAoXy5pc0VtcHR5KHNka1Jvb3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgZXhwb3J0ZWQuICR7ZG9jTXNnfWApO1xuICB9XG5cbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMoc2RrUm9vdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBBbmRyb2lkIFNESyByb290IGZvbGRlciAnJHtzZGtSb290fScgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLiAke2RvY01zZ31gKTtcbiAgfVxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoc2RrUm9vdCk7XG4gIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEFuZHJvaWQgU0RLIHJvb3QgJyR7c2RrUm9vdH0nIG11c3QgYmUgYSBmb2xkZXIuICR7ZG9jTXNnfWApO1xuICB9XG4gIHJldHVybiBzZGtSb290O1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBsYXRmb3JtSW5mb1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwbGF0Zm9ybSAtIFRoZSBwbGF0Zm9ybSBuYW1lLCBmb3IgZXhhbXBsZSBgYW5kcm9pZC0yNGBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBsYXRmb3JtUGF0aCAtIEZ1bGwgcGF0aCB0byB0aGUgcGxhdGZvcm0gU0RLIGZvbGRlclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcGF0aCB0byB0aGUgcmVjZW50IGluc3RhbGxlZCBBbmRyb2lkIHBsYXRmb3JtLlxuICpcbiAqIEByZXR1cm4ge1BsYXRmb3JtSW5mb30gVGhlIHJlc3VsdGluZyBwYXRoIHRvIHRoZSBuZXdlc3QgaW5zdGFsbGVkIHBsYXRmb3JtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRyb2lkUGxhdGZvcm1BbmRQYXRoIChzZGtSb290KSB7XG4gIGNvbnN0IHByb3BzUGF0aHMgPSBhd2FpdCBmcy5nbG9iKCcqL2J1aWxkLnByb3AnLCB7XG4gICAgY3dkOiBwYXRoLnJlc29sdmUoc2RrUm9vdCwgJ3BsYXRmb3JtcycpLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICB9KTtcbiAgY29uc3QgcGxhdGZvcm1zTWFwcGluZyA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3BzUGF0aCBvZiBwcm9wc1BhdGhzKSB7XG4gICAgY29uc3QgcHJvcHNDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvcHNQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBwbGF0Zm9ybVBhdGggPSBwYXRoLmRpcm5hbWUocHJvcHNQYXRoKTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHBhdGguYmFzZW5hbWUocGxhdGZvcm1QYXRoKTtcbiAgICBjb25zdCBtYXRjaCA9IC9yb1xcLmJ1aWxkXFwudmVyc2lvblxcLnNkaz0oXFxkKykvLmV4ZWMocHJvcHNDb250ZW50KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBsb2cud2FybihgQ2Fubm90IHJlYWQgdGhlIFNESyB2ZXJzaW9uIGZyb20gJyR7cHJvcHNQYXRofScuIFNraXBwaW5nICcke3BsYXRmb3JtfSdgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwbGF0Zm9ybXNNYXBwaW5nW3BhcnNlSW50KG1hdGNoWzFdLCAxMCldID0ge1xuICAgICAgcGxhdGZvcm0sXG4gICAgICBwbGF0Zm9ybVBhdGgsXG4gICAgfTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KHBsYXRmb3Jtc01hcHBpbmcpKSB7XG4gICAgbG9nLndhcm4oYEZvdW5kIHplcm8gcGxhdGZvcm0gZm9sZGVycyBhdCAnJHtwYXRoLnJlc29sdmUoc2RrUm9vdCwgJ3BsYXRmb3JtcycpfScuIGAgK1xuICAgICAgYERvIHlvdSBoYXZlIGFueSBBbmRyb2lkIFNES3MgaW5zdGFsbGVkP2ApO1xuICAgIHJldHVybiB7XG4gICAgICBwbGF0Zm9ybTogbnVsbCxcbiAgICAgIHBsYXRmb3JtUGF0aDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcmVjZW50U2RrVmVyc2lvbiA9IF8ua2V5cyhwbGF0Zm9ybXNNYXBwaW5nKS5zb3J0KCkucmV2ZXJzZSgpWzBdO1xuICBjb25zdCByZXN1bHQgPSBwbGF0Zm9ybXNNYXBwaW5nW3JlY2VudFNka1ZlcnNpb25dO1xuICBsb2cuZGVidWcoYEZvdW5kIHRoZSBtb3N0IHJlY2VudCBBbmRyb2lkIHBsYXRmb3JtOiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVuemlwRmlsZSAoemlwUGF0aCwgZHN0Um9vdCA9IHBhdGguZGlybmFtZSh6aXBQYXRoKSkge1xuICBsb2cuZGVidWcoYFVuemlwcGluZyAnJHt6aXBQYXRofScgdG8gJyR7ZHN0Um9vdH0nYCk7XG4gIGF3YWl0IHppcC5hc3NlcnRWYWxpZFppcCh6aXBQYXRoKTtcbiAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyh6aXBQYXRoLCBkc3RSb290KTtcbiAgbG9nLmRlYnVnKCdVbnppcCBzdWNjZXNzZnVsJyk7XG59XG5cbi8qKlxuICogVW5zaWducyB0aGUgZ2l2ZW4gYXBrIGJ5IHJlbW92aW5nIHRoZVxuICogTUVUQS1JTkYgZm9sZGVyIHJlY3Vyc2l2ZWx5IGZyb20gdGhlIGFyY2hpdmUuXG4gKiAhISEgVGhlIGZ1bmN0aW9uIG92ZXJ3cml0ZXMgdGhlIGdpdmVuIGFwayBhZnRlciBzdWNjZXNzZnVsIHVuc2lnbmluZyAhISFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrUGF0aCBUaGUgcGF0aCB0byB0aGUgYXBrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBhcGsgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5XG4gKiB1bnNpZ25lZCBhbmQgb3ZlcndyaXR0ZW5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHRoZSB1bnNpZ24gb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVuc2lnbkFwayAoYXBrUGF0aCkge1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIGNvbnN0IG1ldGFJbmZGb2xkZXJOYW1lID0gJ01FVEEtSU5GJztcbiAgdHJ5IHtcbiAgICBsZXQgaGFzTWV0YUluZiA9IGZhbHNlO1xuICAgIGF3YWl0IHppcC5yZWFkRW50cmllcyhhcGtQYXRoLCAoe2VudHJ5fSkgPT4ge1xuICAgICAgaGFzTWV0YUluZiA9IGVudHJ5LmZpbGVOYW1lLnN0YXJ0c1dpdGgoYCR7bWV0YUluZkZvbGRlck5hbWV9L2ApO1xuICAgICAgLy8gZW50cmllcyBpdGVyYXRpb24gc3RvcHMgYWZ0ZXIgYGZhbHNlYCBpcyByZXR1cm5lZFxuICAgICAgcmV0dXJuICFoYXNNZXRhSW5mO1xuICAgIH0pO1xuICAgIGlmICghaGFzTWV0YUluZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0bXBaaXBSb290ID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsICdhcGsnKTtcbiAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKGFwa1BhdGgsIHRtcFppcFJvb3QpO1xuICAgIGF3YWl0IGZzLnJpbXJhZihwYXRoLnJlc29sdmUodG1wWmlwUm9vdCwgbWV0YUluZkZvbGRlck5hbWUpKTtcbiAgICBjb25zdCB0bXBSZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBrUGF0aCkpO1xuICAgIGF3YWl0IHppcC50b0FyY2hpdmUodG1wUmVzdWx0UGF0aCwge1xuICAgICAgY3dkOiB0bXBaaXBSb290LFxuICAgIH0pO1xuICAgIGF3YWl0IGZzLnVubGluayhhcGtQYXRoKTtcbiAgICBhd2FpdCBmcy5tdih0bXBSZXN1bHRQYXRoLCBhcGtQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SU1FTGlzdEZyb21PdXRwdXQgKHN0ZG91dCkge1xuICBsZXQgZW5naW5lcyA9IFtdO1xuICBmb3IgKGxldCBsaW5lIG9mIHN0ZG91dC5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAobGluZS5sZW5ndGggPiAwICYmIGxpbmVbMF0gIT09ICcgJykge1xuICAgICAgLy8gcmVtb3ZlIG5ld2xpbmUgYW5kIHRyYWlsaW5nIGNvbG9uLCBhbmQgYWRkIHRvIHRoZSBsaXN0XG4gICAgICBlbmdpbmVzLnB1c2gobGluZS50cmltKCkucmVwbGFjZSgvOiQvLCAnJykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW5naW5lcztcbn1cblxuY29uc3QgZ2V0SmF2YUhvbWUgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0SmF2YUhvbWUgKCkge1xuICBjb25zdCByZXN1bHQgPSBwcm9jZXNzLmVudi5KQVZBX0hPTUU7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MnKTtcbiAgfVxuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhyZXN1bHQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgSkFWQV9IT01FIGxvY2F0aW9uICcke3Jlc3VsdH0nIG11c3QgZXhpc3RgKTtcbiAgfVxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQocmVzdWx0KTtcbiAgaWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgSkFWQV9IT01FIGxvY2F0aW9uICcke3Jlc3VsdH0nIG11c3QgYmUgYSB2YWxpZCBmb2xkZXJgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmNvbnN0IGdldEphdmFGb3JPcyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRKYXZhRm9yT3MgKCkge1xuICBsZXQgamF2YUhvbWU7XG4gIGxldCBlcnJNc2c7XG4gIHRyeSB7XG4gICAgamF2YUhvbWUgPSBhd2FpdCBnZXRKYXZhSG9tZSgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJNc2cgPSBlcnIubWVzc2FnZTtcbiAgfVxuICBjb25zdCBleGVjdXRhYmxlTmFtZSA9IGBqYXZhJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuICBpZiAoamF2YUhvbWUpIHtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKGphdmFIb21lLCAnYmluJywgZXhlY3V0YWJsZU5hbWUpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMocmVzdWx0UGF0aCkpIHtcbiAgICAgIHJldHVybiByZXN1bHRQYXRoO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmcy53aGljaChleGVjdXRhYmxlTmFtZSk7XG4gIH0gY2F0Y2ggKGlnbikge31cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJyR7ZXhlY3V0YWJsZU5hbWV9JyBiaW5hcnkgY291bGQgbm90IGJlIGZvdW5kIGAgK1xuICAgIGBuZWl0aGVyIGluIFBBVEggbm9yIHVuZGVyIEpBVkFfSE9NRSAoJHtlcnJNc2cgfHwgcGF0aC5yZXNvbHZlKGphdmFIb21lLCAnYmluJyl9KWApO1xufSk7XG5cbmNvbnN0IGdldE9wZW5Tc2xGb3JPcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYmluYXJ5TmFtZSA9IGBvcGVuc3NsJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmcy53aGljaChiaW5hcnlOYW1lKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgb3BlbnNzbCB0b29sIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gYW5kIGF2YWlsYWJsZSBvbiB0aGUgcGF0aCcpO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhcGtzaWduZXIgdG9vbFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeXNIZWxwZXJzIC0gQW4gaW5zdGFuY2UgY29udGFpbmluZyBzeXN0ZW1DYWxsTWV0aG9kcyBoZWxwZXIgbWV0aG9kc1xuICogQHJldHVybnMge3N0cmluZ30gQW4gYWJzb2x1dGUgcGF0aCB0byBhcGtzaWduZXIgdG9vbC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdG9vbCBpcyBub3QgcHJlc2VudCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFwa3NpZ25lckZvck9zIChzeXNIZWxwZXJzKSB7XG4gIHJldHVybiBhd2FpdCBzeXNIZWxwZXJzLmdldEJpbmFyeUZyb21TZGtSb290KCdhcGtzaWduZXIuamFyJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGFwa2FuYWx5emVyIHRvb2wuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vY29tbWFuZC1saW5lL2Fwa2FuYWx5emVyLmh0bWxcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3lzSGVscGVycyAtIEFuIGluc3RhbmNlIGNvbnRhaW5pbmcgc3lzdGVtQ2FsbE1ldGhvZHMgaGVscGVyIG1ldGhvZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEFuIGFic29sdXRlIHBhdGggdG8gYXBrYW5hbHl6ZXIgdG9vbC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdG9vbCBpcyBub3QgcHJlc2VudCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFwa2FuYWx5emVyRm9yT3MgKHN5c0hlbHBlcnMpIHtcbiAgcmV0dXJuIGF3YWl0IHN5c0hlbHBlcnMuZ2V0QmluYXJ5RnJvbVNka1Jvb3QoJ2Fwa2FuYWx5emVyJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIG1TaG93aW5nTG9ja3NjcmVlbiBvciBtRHJlYW1pbmdMb2Nrc2NyZWVuIGluIGR1bXBzeXMgb3V0cHV0IHRvIGRldGVybWluZVxuICogaWYgbG9jayBzY3JlZW4gaXMgc2hvd2luZ1xuICpcbiAqIEEgbm90ZTogYGFkYiBzaGVsbCBkdW1wc3lzIHRydXN0YCBwZXJmb3JtcyBiZXR0ZXIgd2hpbGUgZGV0ZWN0aW5nIHRoZSBsb2NrZWQgc2NyZWVuIHN0YXRlXG4gKiBpbiBjb21wYXJpc29uIHRvIGBhZGIgZHVtcHN5cyB3aW5kb3dgIG91dHB1dCBwYXJzaW5nLlxuICogQnV0IHRoZSB0cnVzdCBjb21tYW5kIGRvZXMgbm90IHdvcmsgZm9yIGBTd2lwZWAgdW5sb2NrIHBhdHRlcm4uXG4gKlxuICogSW4gc29tZSBBbmRyb2lkIGRldmljZXMgKFByb2JhYmx5IGFyb3VuZCBBbmRyb2lkIDEwKyksIGBtU2hvd2luZ0xvY2tzY3JlZW5gIGFuZCBgbURyZWFtaW5nTG9ja3NjcmVlbmBcbiAqIGRvIG5vdCB3b3JrIHRvIGRldGVjdCBsb2NrIHN0YXR1cy4gSW5zdGVhZCwga2V5Z3VhcmQgcHJlZmVyZW5jZXMgaGVscHMgdG8gZGV0ZWN0IHRoZSBsb2NrIGNvbmRpdGlvbi5cbiAqIFNvbWUgZGV2aWNlcyBzdWNoIGFzIEFuZHJvaWQgVFYgZG8gbm90IGhhdmUga2V5Z3VhcmQsIHNvIHdlIHNob3VsZCBrZWVwXG4gKiBzY3JlZW4gY29uZGl0aW9uIGFzIHRoaXMgcHJpbWFyeSBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGR1bXBzeXMgLSBUaGUgb3V0cHV0IG9mIGR1bXBzeXMgd2luZG93IGNvbW1hbmQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGxvY2sgc2NyZWVuIGlzIHNob3dpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzU2hvd2luZ0xvY2tzY3JlZW4gKGR1bXBzeXMpIHtcbiAgcmV0dXJuIF8uc29tZShbJ21TaG93aW5nTG9ja3NjcmVlbj10cnVlJywgJ21EcmVhbWluZ0xvY2tzY3JlZW49dHJ1ZSddLCAoeCkgPT4gZHVtcHN5cy5pbmNsdWRlcyh4KSlcbiAgICAvLyBgbUlzU2hvd2luZ2AgYW5kIGBtSW5wdXRSZXN0cmljdGVkYCBhcmUgYHRydWVgIGluIGxvY2sgY29uZGl0aW9uLiBgZmFsc2VgIGlzIHVubG9jayBjb25kaXRpb24uXG4gICAgfHwgXy5ldmVyeShbL0tleWd1YXJkU3RhdGVNb25pdG9yW1xcblxcc10rbUlzU2hvd2luZz10cnVlLywgL1xccyttSW5wdXRSZXN0cmljdGVkPXRydWUvXSwgKHgpID0+IHgudGVzdChkdW1wc3lzKSk7XG59XG5cbi8qXG4gKiBDaGVja3MgbUN1cnJlbnRGb2N1cyBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmUgaWYgS2V5Z3VhcmQgaXMgYWN0aXZhdGVkXG4gKi9cbmZ1bmN0aW9uIGlzQ3VycmVudEZvY3VzT25LZXlndWFyZCAoZHVtcHN5cykge1xuICBsZXQgbSA9IC9tQ3VycmVudEZvY3VzLitLZXlndWFyZC9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gKG0gJiYgbS5sZW5ndGggJiYgbVswXSkgPyB0cnVlIDogZmFsc2U7XG59XG5cbi8qXG4gKiBSZWFkcyBTdXJmYWNlT3JpZW50YXRpb24gaW4gZHVtcHN5cyBvdXRwdXRcbiAqL1xuZnVuY3Rpb24gZ2V0U3VyZmFjZU9yaWVudGF0aW9uIChkdW1wc3lzKSB7XG4gIGxldCBtID0gL1N1cmZhY2VPcmllbnRhdGlvbjogXFxkL2dpLmV4ZWMoZHVtcHN5cyk7XG4gIHJldHVybiBtICYmIHBhcnNlSW50KG1bMF0uc3BsaXQoJzonKVsxXSwgMTApO1xufVxuXG4vKlxuICogQ2hlY2tzIG1TY3JlZW5PbkZ1bGx5IGluIGR1bXBzeXMgb3V0cHV0IHRvIGRldGVybWluZSBpZiBzY3JlZW4gaXMgc2hvd2luZ1xuICogRGVmYXVsdCBpcyB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzU2NyZWVuT25GdWxseSAoZHVtcHN5cykge1xuICBsZXQgbSA9IC9tU2NyZWVuT25GdWxseT1cXHcrL2dpLmV4ZWMoZHVtcHN5cyk7XG4gIHJldHVybiAhbSB8fCAvLyBpZiBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nIHdlIGFzc3VtZSBzY3JlZW4gaXMgZnVsbHkgb25cbiAgICAgICAgIChtICYmIG0ubGVuZ3RoID4gMCAmJiBtWzBdLnNwbGl0KCc9JylbMV0gPT09ICd0cnVlJykgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQnVpbGRzIGNvbW1hbmQgbGluZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGdpdmVuXG4gKiBhcHBsaWNhdGlvbiBzdGFydHVwIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1N0YXJ0QXBwT3B0aW9uc30gc3RhcnRBcHBPcHRpb25zIC0gQXBwbGljYXRpb24gb3B0aW9ucyBtYXBwaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gYXBpTGV2ZWwgLSBUaGUgYWN0dWFsIE9TIEFQSSBsZXZlbFxuICogQHJldHVybnMge0FycmF5PFN0cmluZz59IFRoZSBhY3R1YWwgY29tbWFuZCBsaW5lIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU3RhcnRDbWQgKHN0YXJ0QXBwT3B0aW9ucywgYXBpTGV2ZWwpIHtcbiAgY29uc3Qge1xuICAgIHVzZXIsXG4gICAgd2FpdEZvckxhdW5jaCxcbiAgICBwa2csXG4gICAgYWN0aXZpdHksXG4gICAgYWN0aW9uLFxuICAgIGNhdGVnb3J5LFxuICAgIHN0b3BBcHAsXG4gICAgZmxhZ3MsXG4gIH0gPSBzdGFydEFwcE9wdGlvbnM7XG4gIGNvbnN0IGNtZCA9IFsnYW0nLCAnc3RhcnQnXTtcbiAgaWYgKHV0aWwuaGFzVmFsdWUodXNlcikpIHtcbiAgICBjbWQucHVzaCgnLS11c2VyJywgdXNlcik7XG4gIH1cbiAgaWYgKHdhaXRGb3JMYXVuY2gpIHtcbiAgICBjbWQucHVzaCgnLVcnKTtcbiAgfVxuICBpZiAoYWN0aXZpdHkgJiYgcGtnKSB7XG4gICAgY21kLnB1c2goJy1uJywgYCR7cGtnfS8ke2FjdGl2aXR5fWApO1xuICB9XG4gIGlmIChzdG9wQXBwICYmIGFwaUxldmVsID49IDE1KSB7XG4gICAgY21kLnB1c2goJy1TJyk7XG4gIH1cbiAgaWYgKGFjdGlvbikge1xuICAgIGNtZC5wdXNoKCctYScsIGFjdGlvbik7XG4gIH1cbiAgaWYgKGNhdGVnb3J5KSB7XG4gICAgY21kLnB1c2goJy1jJywgY2F0ZWdvcnkpO1xuICB9XG4gIGlmIChmbGFncykge1xuICAgIGNtZC5wdXNoKCctZicsIGZsYWdzKTtcbiAgfVxuICBpZiAoc3RhcnRBcHBPcHRpb25zLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzKSB7XG4gICAgLy8gZXhwZWN0IG9wdGlvbmFsSW50ZW50QXJndW1lbnRzIHRvIGJlIGEgc2luZ2xlIHN0cmluZyBvZiB0aGUgZm9ybTpcbiAgICAvLyAgICAgXCItZmxhZyBrZXlcIlxuICAgIC8vICAgICBcIi1mbGFnIGtleSB2YWx1ZVwiXG4gICAgLy8gb3IgYSBjb21iaW5hdGlvbiBvZiB0aGVzZSAoZS5nLiwgXCItZmxhZzEga2V5MSAtZmxhZzIga2V5MiB2YWx1ZTJcIilcblxuICAgIC8vIHRha2UgYSBzdHJpbmcgYW5kIHBhcnNlIG91dCB0aGUgcGFydCBiZWZvcmUgYW55IHNwYWNlcywgYW5kIGFueXRoaW5nIGFmdGVyXG4gICAgLy8gdGhlIGZpcnN0IHNwYWNlXG4gICAgbGV0IHBhcnNlS2V5VmFsdWUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgICAgbGV0IHNwYWNlID0gc3RyLmluZGV4T2YoJyAnKTtcbiAgICAgIGlmIChzcGFjZSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5sZW5ndGggPyBbc3RyXSA6IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtzdHIuc3Vic3RyaW5nKDAsIHNwYWNlKS50cmltKCksIHN0ci5zdWJzdHJpbmcoc3BhY2UgKyAxKS50cmltKCldO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBjeWNsZSB0aHJvdWdoIHRoZSBvcHRpb25hbEludGVudEFyZ3VtZW50cyBhbmQgcHVsbCBvdXQgdGhlIGFyZ3VtZW50c1xuICAgIC8vIGFkZCBhIHNwYWNlIGluaXRpYWxseSBzbyBmbGFncyBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGFyZ3VtZW50cyB0aGF0XG4gICAgLy8gaGF2ZSBpbnRlcm5hbCBoeXBoZW5zXG4gICAgbGV0IG9wdGlvbmFsSW50ZW50QXJndW1lbnRzID0gYCAke3N0YXJ0QXBwT3B0aW9ucy5vcHRpb25hbEludGVudEFyZ3VtZW50c31gO1xuICAgIGxldCByZSA9IC8gKC1bXlxcc10rKSAoLispLztcbiAgICB3aGlsZSAodHJ1ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgICAgbGV0IGFyZ3MgPSByZS5leGVjKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzKTtcbiAgICAgIGlmICghYXJncykge1xuICAgICAgICBpZiAob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gbm8gbW9yZSBmbGFncywgc28gdGhlIHJlbWFpbmRlciBjYW4gYmUgdHJlYXRlZCBhcyAna2V5JyBvciAna2V5IHZhbHVlJ1xuICAgICAgICAgIGNtZC5wdXNoLmFwcGx5KGNtZCwgcGFyc2VLZXlWYWx1ZShvcHRpb25hbEludGVudEFyZ3VtZW50cykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlIGFyZSBkb25lXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWtlIHRoZSBmbGFnIGFuZCBzZWUgaWYgaXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nXG4gICAgICAvLyBpZiBpdCBpcyBub3QsIHRoZW4gaXQgbWVhbnMgd2UgaGF2ZSBiZWVuIHRocm91Z2ggYWxyZWFkeSwgYW5kXG4gICAgICAvLyB3aGF0IGlzIGJlZm9yZSB0aGUgZmxhZyBpcyB0aGUgYXJndW1lbnQgZm9yIHRoZSBwcmV2aW91cyBmbGFnXG4gICAgICBsZXQgZmxhZyA9IGFyZ3NbMV07XG4gICAgICBsZXQgZmxhZ1BvcyA9IG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLmluZGV4T2YoZmxhZyk7XG4gICAgICBpZiAoZmxhZ1BvcyAhPT0gMCkge1xuICAgICAgICBsZXQgcHJldkFyZ3MgPSBvcHRpb25hbEludGVudEFyZ3VtZW50cy5zdWJzdHJpbmcoMCwgZmxhZ1Bvcyk7XG4gICAgICAgIGNtZC5wdXNoLmFwcGx5KGNtZCwgcGFyc2VLZXlWYWx1ZShwcmV2QXJncykpO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgdGhlIGZsYWcsIGFzIHRoZXJlIGFyZSBubyBtb3JlIGVhcmxpZXIgYXJndW1lbnRzXG4gICAgICBjbWQucHVzaChmbGFnKTtcblxuICAgICAgLy8gbWFrZSBvcHRpb25hbEludGVudEFyZ3VtZW50cyBob2xkIHRoZSByZW1haW5kZXJcbiAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzID0gYXJnc1syXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNtZDtcbn1cblxuY29uc3QgZ2V0U2RrVG9vbHNWZXJzaW9uID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldFNka1Rvb2xzVmVyc2lvbiAoKSB7XG4gIGNvbnN0IGFuZHJvaWRIb21lID0gcHJvY2Vzcy5lbnYuQU5EUk9JRF9IT01FO1xuICBpZiAoIWFuZHJvaWRIb21lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBTkRST0lEX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZXhwZWN0ZWQgdG8gYmUgc2V0Jyk7XG4gIH1cbiAgY29uc3QgcHJvcGVydGllc1BhdGggPSBwYXRoLnJlc29sdmUoYW5kcm9pZEhvbWUsICd0b29scycsICdzb3VyY2UucHJvcGVydGllcycpO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhwcm9wZXJ0aWVzUGF0aCkpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IGZpbmQgJHtwcm9wZXJ0aWVzUGF0aH0gZmlsZSB0byByZWFkIFNESyB2ZXJzaW9uIGZyb21gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcHJvcGVydGllc0NvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwcm9wZXJ0aWVzUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgdmVyc2lvbk1hdGNoZXIgPSBuZXcgUmVnRXhwKC9Qa2dcXC5SZXZpc2lvbj0oXFxkKylcXC4/KFxcZCspP1xcLj8oXFxkKyk/Lyk7XG4gIGNvbnN0IG1hdGNoID0gdmVyc2lvbk1hdGNoZXIuZXhlYyhwcm9wZXJ0aWVzQ29udGVudCk7XG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBtYWpvcjogcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSxcbiAgICAgIG1pbm9yOiBtYXRjaFsyXSA/IHBhcnNlSW50KG1hdGNoWzJdLCAxMCkgOiAwLFxuICAgICAgYnVpbGQ6IG1hdGNoWzNdID8gcGFyc2VJbnQobWF0Y2hbM10sIDEwKSA6IDBcbiAgICB9O1xuICB9XG4gIGxvZy53YXJuKGBDYW5ub3QgcGFyc2UgXCJQa2cuUmV2aXNpb25cIiB2YWx1ZSBmcm9tICR7cHJvcGVydGllc1BhdGh9YCk7XG59KTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgZnVsbCBwYXRocyB0byBhbGwgJ2J1aWxkLXRvb2xzJyBzdWJmb2xkZXJzIHVuZGVyIHRoZSBwYXJ0aWN1bGFyXG4gKiBTREsgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc2RrUm9vdCAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIEFuZHJvaWQgU0RLIHJvb3QgZm9sZGVyXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGZ1bGwgcGF0aHMgdG8gdGhlIHJlc3VsdGluZyBmb2xkZXJzIHNvcnRlZCBieVxuICogbW9kaWZpY2F0aW9uIGRhdGUgKHRoZSBuZXdlc3QgY29tZXMgZmlyc3QpIG9yIGFuIGVtcHR5IGxpc3QgaWYgbm8gbWFjdGhlcyB3ZXJlIGZvdW5kXG4gKi9cbmNvbnN0IGdldEJ1aWxkVG9vbHNEaXJzID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldEJ1aWxkVG9vbHNEaXJzIChzZGtSb290KSB7XG4gIGxldCBidWlsZFRvb2xzRGlycyA9IGF3YWl0IGZzLmdsb2IoJyovJywge1xuICAgIGN3ZDogcGF0aC5yZXNvbHZlKHNka1Jvb3QsICdidWlsZC10b29scycpLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBidWlsZFRvb2xzRGlycyA9IGJ1aWxkVG9vbHNEaXJzXG4gICAgICAubWFwKChkaXIpID0+IFtwYXRoLmJhc2VuYW1lKGRpciksIGRpcl0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gc2VtdmVyLnJjb21wYXJlKGFbMF0sIGJbMF0pKVxuICAgICAgLm1hcCgocGFpcikgPT4gcGFpclsxXSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBDYW5ub3Qgc29ydCBidWlsZC10b29scyBmb2xkZXJzICR7SlNPTi5zdHJpbmdpZnkoYnVpbGRUb29sc0RpcnMubWFwKChkaXIpID0+IHBhdGguYmFzZW5hbWUoZGlyKSkpfSBgICtcbiAgICAgIGBieSBzZW1hbnRpYyB2ZXJzaW9uIG5hbWVzLmApO1xuICAgIGxvZy53YXJuKGBGYWxsaW5nIGJhY2sgdG8gc29ydGluZyBieSBtb2RpZmljYXRpb24gZGF0ZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgY29uc3QgcGFpcnMgPSBhd2FpdCBCLm1hcChidWlsZFRvb2xzRGlycywgYXN5bmMgKGRpcikgPT4gWyhhd2FpdCBmcy5zdGF0KGRpcikpLm10aW1lLnZhbHVlT2YoKSwgZGlyXSk7XG4gICAgYnVpbGRUb29sc0RpcnMgPSBwYWlyc1xuICAgICAgLnNvcnQoKGEsIGIpID0+IGFbMF0gPCBiWzBdKVxuICAgICAgLm1hcCgocGFpcikgPT4gcGFpclsxXSk7XG4gIH1cbiAgbG9nLmluZm8oYEZvdW5kICR7YnVpbGRUb29sc0RpcnMubGVuZ3RofSAnYnVpbGQtdG9vbHMnIGZvbGRlcnMgdW5kZXIgJyR7c2RrUm9vdH0nIChuZXdlc3QgZmlyc3QpOmApO1xuICBmb3IgKGxldCBkaXIgb2YgYnVpbGRUb29sc0RpcnMpIHtcbiAgICBsb2cuaW5mbyhgICAgICR7ZGlyfWApO1xuICB9XG4gIHJldHVybiBidWlsZFRvb2xzRGlycztcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBwZXJtaXNzaW9uIG5hbWVzIGVuY29kZWQgaW4gYGR1bXBzeXMgcGFja2FnZWAgY29tbWFuZCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGR1bXBzeXNPdXRwdXQgLSBUaGUgYWN0dWFsIGNvbW1hbmQgb3V0cHV0LlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBncm91cE5hbWVzIC0gVGhlIGxpc3Qgb2YgZ3JvdXAgbmFtZXMgdG8gbGlzdCBwZXJtaXNzaW9ucyBmb3IuXG4gKiBAcGFyYW0gez9ib29sZWFufSBncmFudGVkU3RhdGUgLSBUaGUgZXhwZWN0ZWQgc3RhdGUgb2YgYGdyYW50ZWRgIGF0dHJpYnV0ZSB0byBmaWx0ZXIgd2l0aC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGZpbHRlcmluZyBpcyBkb25lIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNldC5cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHBlcm1pc3Npb24gbmFtZXMgb3IgYW4gZW1wdHkgbGlzdCBpZiBubyBtYXRjaGVzIHdlcmUgZm91bmQuXG4gKi9cbmNvbnN0IGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zID0gZnVuY3Rpb24gKGR1bXBzeXNPdXRwdXQsIGdyb3VwTmFtZXMsIGdyYW50ZWRTdGF0ZSA9IG51bGwpIHtcbiAgY29uc3QgZ3JvdXBQYXR0ZXJuQnlOYW1lID0gKGdyb3VwTmFtZSkgPT4gbmV3IFJlZ0V4cChgXihcXFxccyoke18uZXNjYXBlUmVnRXhwKGdyb3VwTmFtZSl9IHBlcm1pc3Npb25zOltcXFxcc1xcXFxTXSspYCwgJ20nKTtcbiAgY29uc3QgaW5kZW50UGF0dGVybiA9IC9cXFN8JC87XG4gIGNvbnN0IHBlcm1pc3Npb25OYW1lUGF0dGVybiA9IC9hbmRyb2lkXFwuXFx3KlxcLj9wZXJtaXNzaW9uXFwuXFx3Ky87XG4gIGNvbnN0IGdyYW50ZWRTdGF0ZVBhdHRlcm4gPSAvXFxiZ3JhbnRlZD0oXFx3KykvO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBncm91cE5hbWUgb2YgZ3JvdXBOYW1lcykge1xuICAgIGNvbnN0IGdyb3VwTWF0Y2ggPSBncm91cFBhdHRlcm5CeU5hbWUoZ3JvdXBOYW1lKS5leGVjKGR1bXBzeXNPdXRwdXQpO1xuICAgIGlmICghZ3JvdXBNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBncm91cE1hdGNoWzFdLnNwbGl0KCdcXG4nKTtcbiAgICBpZiAobGluZXMubGVuZ3RoIDwgMikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGVJbmRlbnQgPSBsaW5lc1swXS5zZWFyY2goaW5kZW50UGF0dGVybik7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNsaWNlKDEpKSB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZW50ID0gbGluZS5zZWFyY2goaW5kZW50UGF0dGVybik7XG4gICAgICBpZiAoY3VycmVudEluZGVudCA8PSB0aXRsZUluZGVudCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGVybWlzc2lvbk5hbWVNYXRjaCA9IHBlcm1pc3Npb25OYW1lUGF0dGVybi5leGVjKGxpbmUpO1xuICAgICAgaWYgKCFwZXJtaXNzaW9uTmFtZU1hdGNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbSA9IHtcbiAgICAgICAgcGVybWlzc2lvbjogcGVybWlzc2lvbk5hbWVNYXRjaFswXSxcbiAgICAgIH07XG4gICAgICBjb25zdCBncmFudGVkU3RhdGVNYXRjaCA9IGdyYW50ZWRTdGF0ZVBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICAgIGlmIChncmFudGVkU3RhdGVNYXRjaCkge1xuICAgICAgICBpdGVtLmdyYW50ZWQgPSBncmFudGVkU3RhdGVNYXRjaFsxXSA9PT0gJ3RydWUnO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmlsdGVyZWRSZXN1bHQgPSByZXN1bHRcbiAgICAuZmlsdGVyKChpdGVtKSA9PiAhXy5pc0Jvb2xlYW4oZ3JhbnRlZFN0YXRlKSB8fCBpdGVtLmdyYW50ZWQgPT09IGdyYW50ZWRTdGF0ZSlcbiAgICAubWFwKChpdGVtKSA9PiBpdGVtLnBlcm1pc3Npb24pO1xuICBsb2cuZGVidWcoYFJldHJpZXZlZCAke3V0aWwucGx1cmFsaXplKCdwZXJtaXNzaW9uJywgZmlsdGVyZWRSZXN1bHQubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgYGZyb20gJHtncm91cE5hbWVzfSAke3V0aWwucGx1cmFsaXplKCdncm91cCcsIGdyb3VwTmFtZXMubGVuZ3RoLCBmYWxzZSl9YCk7XG4gIHJldHVybiBmaWx0ZXJlZFJlc3VsdDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBwYXJ0aWFsSW5zdGFsbCBbZmFsc2VdIC0gSW5zdGFsbCBhcGtzIHBhcnRpYWxseS4gSXQgaXMgdXNlZCBmb3IgJ2luc3RhbGwtbXVsdGlwbGUnLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgZ2l2ZW4gb3B0aW9ucyBpbnRvIHRoZSBsaXN0IG9mIGBhZGIgaW5zdGFsbC5pbnN0YWxsLW11bHRpcGxlYCBjb21tYW5kIGFyZ3VtZW50c1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcGlMZXZlbCAtIFRoZSBjdXJyZW50IEFQSSBsZXZlbFxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBtYXBwaW5nIHRvIHRyYW5zZm9ybVxuICogQHJldHVybnMge0FycmF5PFN0cmluZz59IFRoZSBhcnJheSBvZiBhcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gYnVpbGRJbnN0YWxsQXJncyAoYXBpTGV2ZWwsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcblxuICBpZiAoIXV0aWwuaGFzVmFsdWUob3B0aW9ucy5yZXBsYWNlKSB8fCBvcHRpb25zLnJlcGxhY2UpIHtcbiAgICByZXN1bHQucHVzaCgnLXInKTtcbiAgfVxuICBpZiAob3B0aW9ucy5hbGxvd1Rlc3RQYWNrYWdlcykge1xuICAgIHJlc3VsdC5wdXNoKCctdCcpO1xuICB9XG4gIGlmIChvcHRpb25zLnVzZVNkY2FyZCkge1xuICAgIHJlc3VsdC5wdXNoKCctcycpO1xuICB9XG4gIGlmIChvcHRpb25zLmdyYW50UGVybWlzc2lvbnMpIHtcbiAgICBpZiAoYXBpTGV2ZWwgPCAyMykge1xuICAgICAgbG9nLmRlYnVnKGBTa2lwcGluZyBwZXJtaXNzaW9ucyBncmFudCBvcHRpb24sIHNpbmNlIGAgK1xuICAgICAgICAgICAgICAgIGB0aGUgY3VycmVudCBBUEkgbGV2ZWwgJHthcGlMZXZlbH0gZG9lcyBub3Qgc3VwcG9ydCBhcHBsaWNhdGlvbnMgYCArXG4gICAgICAgICAgICAgICAgYHBlcm1pc3Npb25zIGN1c3RvbWl6YXRpb25gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goJy1nJyk7XG4gICAgfVxuICB9XG4gIC8vIEZvciBtdWx0aXBsZS1pbnN0YWxsXG4gIGlmIChvcHRpb25zLnBhcnRpYWxJbnN0YWxsKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wJyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1hbmlmZXN0SW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZyAtIFRoZSBhcHBsaWNhdGlvbiBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBwYWNrYWdlIGFjdGl2aXR5XG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHZlcnNpb25Db2RlIC0gVGhlIHZlcnNpb24gY29kZSBudW1iZXIgKG1pZ2h0IGJlIGBOYU5gKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIFRoZSB2ZXJzaW9uIG5hbWUgKG1pZ2h0IGJlIGBudWxsYClcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm0gcGFyc2luZyBvZiB0aGUgbWFuaWZlc3Qgb2JqZWN0IGluIG9yZGVyXG4gKiB0byBleHRyYWN0IHNvbWUgdml0YWwgdmFsdWVzIGZyb20gaXRcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbWFuaWZlc3QgVGhlIG1hbmlmZXN0IGNvbnRlbnQgZm9ybWF0dGVkIGFzIEpTT05cbiAqIFNlZSBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9hZGJraXQtYXBrcmVhZGVyIGZvciBkZXRhaWxlZCBmb3JtYXQgZGVzY3JpcHRpb25cbiAqIEByZXR1cm5zIHtNYW5pZmVzdEluZm99XG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWFuaWZlc3QgKG1hbmlmZXN0KSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBwa2c6IG1hbmlmZXN0LnBhY2thZ2UsXG4gICAgdmVyc2lvbkNvZGU6IHBhcnNlSW50KG1hbmlmZXN0LnZlcnNpb25Db2RlLCAxMCksXG4gICAgdmVyc2lvbk5hbWU6IG1hbmlmZXN0LnZlcnNpb25OYW1lIHx8IG51bGwsXG4gIH07XG4gIGlmICghbWFuaWZlc3QuYXBwbGljYXRpb24pIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gTG9vayBmb3IgZW5hYmxlZCBhY3Rpdml0eSBvciBhY3Rpdml0eS1hbGlhcyB3aXRoXG4gIC8vIGFjdGlvbiA9PSBhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiBhbmRcbiAgLy8gY2F0ZWdvcnkgPT0gYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVJcbiAgZm9yIChjb25zdCBhY3Rpdml0eSBvZiBbXG4gICAgLi4ubWFuaWZlc3QuYXBwbGljYXRpb24uYWN0aXZpdGllcyxcbiAgICAuLi5tYW5pZmVzdC5hcHBsaWNhdGlvbi5hY3Rpdml0eUFsaWFzZXMsXG4gIF0pIHtcbiAgICBpZiAoYWN0aXZpdHkuZW5hYmxlZCA9PT0gZmFsc2UgfHwgXy5pc0VtcHR5KGFjdGl2aXR5LmludGVudEZpbHRlcnMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHthY3Rpb25zLCBjYXRlZ29yaWVzfSBvZiBhY3Rpdml0eS5pbnRlbnRGaWx0ZXJzKSB7XG4gICAgICBpZiAoXy5pc0VtcHR5KGFjdGlvbnMpIHx8IF8uaXNFbXB0eShjYXRlZ29yaWVzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNNYWluQWN0aW9uID0gYWN0aW9uc1xuICAgICAgICAuc29tZSgoe25hbWV9KSA9PiBuYW1lID09PSAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nKTtcbiAgICAgIGNvbnN0IGlzTGF1bmNoZXJDYXRlZ29yeSA9IGNhdGVnb3JpZXNcbiAgICAgICAgLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyk7XG4gICAgICBpZiAoaXNNYWluQWN0aW9uICYmIGlzTGF1bmNoZXJDYXRlZ29yeSkge1xuICAgICAgICByZXN1bHQuYWN0aXZpdHkgPSBhY3Rpdml0eS5uYW1lO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhcGsgc3RyaW5ncyBmcm9tIGFhcHQgdG9vbCBvdXRwdXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3T3V0cHV0IFRoZSBhY3R1YWwgdG9vbCBvdXRwdXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdNYXJrZXIgVGhlIGNvbmZpZyBtYXJrZXIuIFVzdWFsbHlcbiAqIGEgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uIG9yIGAoZGVmYXVsdClgXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTdHJpbmdzIGlkcyB0byB2YWx1ZXMgbWFwcGluZy4gUGx1cmFsXG4gKiB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFycmF5cy4gSWYgbm8gY29uZmlnIGZvdW5kIGZvciB0aGVcbiAqIGdpdmVuIG1hcmtlciB0aGVuIGFuIGVtcHR5IG1hcHBpbmcgaXMgcmV0dXJuZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQWFwdFN0cmluZ3MgKHJhd091dHB1dCwgY29uZmlnTWFya2VyKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZVN0cmluZ01hdGNoID0gZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9cIiQvLCAnJykucmVwbGFjZSgvXlwiLywgJycpLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKTtcbiAgfTtcblxuICBjb25zdCBhcGtTdHJpbmdzID0ge307XG4gIGxldCBpc0luQ29uZmlnID0gZmFsc2U7XG4gIGxldCBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gIGxldCBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgLy8gVGhlIHBhdHRlcm4gbWF0Y2hlcyBhbnkgcXVvdGVkIGNvbnRlbnQgaW5jbHVkaW5nIGVzY2FwZWQgcXVvdGVzXG4gIGNvbnN0IHF1b3RlZFN0cmluZ1BhdHRlcm4gPSAvXCJbXlwiXFxcXF0qKD86XFxcXC5bXlwiXFxcXF0qKSpcIi87XG4gIGZvciAoY29uc3QgbGluZSBvZiByYXdPdXRwdXQuc3BsaXQob3MuRU9MKSkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgaWYgKF8uaXNFbXB0eSh0cmltbWVkTGluZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChbJ2NvbmZpZycsICd0eXBlJywgJ3NwZWMnLCAnUGFja2FnZSddLnNvbWUoKHgpID0+IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoeCkpKSB7XG4gICAgICBpc0luQ29uZmlnID0gdHJpbW1lZExpbmUuc3RhcnRzV2l0aChgY29uZmlnICR7Y29uZmlnTWFya2VyfTpgKTtcbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0luQ29uZmlnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgncmVzb3VyY2UnKSkge1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG5cbiAgICAgIGlmICh0cmltbWVkTGluZS5pbmNsdWRlcygnOnN0cmluZy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC86c3RyaW5nXFwvKFxcUyspOi8uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJzpwbHVyYWxzLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gLzpwbHVyYWxzXFwvKFxcUyspOi8uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbWF0Y2hbMV07XG4gICAgICAgICAgaXNJblBsdXJhbEdyb3VwID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRSZXNvdXJjZUlkICYmIHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJyhzdHJpbmcnKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBxdW90ZWRTdHJpbmdQYXR0ZXJuLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gbm9ybWFsaXplU3RyaW5nTWF0Y2gobWF0Y2hbMF0pO1xuICAgICAgfVxuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRSZXNvdXJjZUlkICYmIGlzSW5QbHVyYWxHcm91cCAmJiB0cmltbWVkTGluZS5pbmNsdWRlcygnOiAoc3RyaW5nJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcXVvdGVkU3RyaW5nUGF0dGVybi5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IFtcbiAgICAgICAgICAuLi4oYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gfHwgW10pLFxuICAgICAgICAgIG5vcm1hbGl6ZVN0cmluZ01hdGNoKG1hdGNoWzBdKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXBrU3RyaW5ncztcbn1cblxuLyoqXG4gKiBQYXJzZXMgYXBrIHN0cmluZ3MgZnJvbSBhYXB0MiB0b29sIG91dHB1dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdPdXRwdXQgVGhlIGFjdHVhbCB0b29sIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ01hcmtlciBUaGUgY29uZmlnIG1hcmtlci4gVXN1YWxseVxuICogYSBsYW5ndWFnZSBhYmJyZXZpYXRpb24gb3IgYW4gZW1wdHkgc3RyaW5nIGZvciB0aGUgZGVmYXVsdCBvbmVcbiAqIEByZXR1cm5zIHtPYmplY3R9IFN0cmluZ3MgaWRzIHRvIHZhbHVlcyBtYXBwaW5nLiBQbHVyYWxcbiAqIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgYXJyYXlzLiBJZiBubyBjb25maWcgZm91bmQgZm9yIHRoZVxuICogZ2l2ZW4gbWFya2VyIHRoZW4gYW4gZW1wdHkgbWFwcGluZyBpcyByZXR1cm5lZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBYXB0MlN0cmluZ3MgKHJhd091dHB1dCwgY29uZmlnTWFya2VyKSB7XG4gIGNvbnN0IGFsbExpbmVzID0gcmF3T3V0cHV0LnNwbGl0KG9zLkVPTCk7XG4gIGZ1bmN0aW9uIGV4dHJhY3RDb250ZW50IChzdGFydElkeCkge1xuICAgIGxldCBpZHggPSBzdGFydElkeDtcbiAgICBjb25zdCBzdGFydENoYXJQb3MgPSBhbGxMaW5lc1tzdGFydElkeF0uaW5kZXhPZignXCInKTtcbiAgICBpZiAoc3RhcnRDaGFyUG9zIDwgMCkge1xuICAgICAgcmV0dXJuIFtudWxsLCBpZHhdO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgd2hpbGUgKGlkeCA8IGFsbExpbmVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdGVybWluYXRpb25DaGFyTWF0Y2ggPSAvXCIkLy5leGVjKGFsbExpbmVzW2lkeF0pO1xuICAgICAgaWYgKHRlcm1pbmF0aW9uQ2hhck1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRlcm1pbmF0aW9uQ2hhclBvcyA9IHRlcm1pbmF0aW9uQ2hhck1hdGNoLmluZGV4O1xuICAgICAgICBpZiAoc3RhcnRJZHggPT09IGlkeCkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBhbGxMaW5lc1tpZHhdLnN1YnN0cmluZyhzdGFydENoYXJQb3MgKyAxLCB0ZXJtaW5hdGlvbkNoYXJQb3MpLFxuICAgICAgICAgICAgaWR4XG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGAke3Jlc3VsdH1cXFxcbiR7Xy50cmltU3RhcnQoYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoMCwgdGVybWluYXRpb25DaGFyUG9zKSl9YCxcbiAgICAgICAgICBpZHgsXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBpZiAoaWR4ID4gc3RhcnRJZHgpIHtcbiAgICAgICAgcmVzdWx0ICs9IGBcXFxcbiR7Xy50cmltU3RhcnQoYWxsTGluZXNbaWR4XSl9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCArPSBhbGxMaW5lc1tpZHhdLnN1YnN0cmluZyhzdGFydENoYXJQb3MgKyAxKTtcbiAgICAgIH1cbiAgICAgICsraWR4O1xuICAgIH1cbiAgICByZXR1cm4gW3Jlc3VsdCwgaWR4XTtcbiAgfVxuXG4gIGNvbnN0IGFwa1N0cmluZ3MgPSB7fTtcbiAgbGV0IGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgbGV0IGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICBsZXQgaXNJbkN1cnJlbnRDb25maWcgPSBmYWxzZTtcbiAgbGV0IGxpbmVJbmRleCA9IDA7XG4gIHdoaWxlIChsaW5lSW5kZXggPCBhbGxMaW5lcy5sZW5ndGgpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGFsbExpbmVzW2xpbmVJbmRleF0udHJpbSgpO1xuICAgIGlmIChfLmlzRW1wdHkodHJpbW1lZExpbmUpKSB7XG4gICAgICArK2xpbmVJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChbJ3R5cGUnLCAnUGFja2FnZSddLnNvbWUoKHgpID0+IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoeCkpKSB7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGlzSW5DdXJyZW50Q29uZmlnID0gZmFsc2U7XG4gICAgICArK2xpbmVJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCdyZXNvdXJjZScpKSB7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGlzSW5DdXJyZW50Q29uZmlnID0gZmFsc2U7XG5cbiAgICAgIGlmICh0cmltbWVkTGluZS5pbmNsdWRlcygnc3RyaW5nLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL3N0cmluZ1xcLyhcXFMrKS8uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJ3BsdXJhbHMvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvcGx1cmFsc1xcLyhcXFMrKS8uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbWF0Y2hbMV07XG4gICAgICAgICAgaXNJblBsdXJhbEdyb3VwID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFJlc291cmNlSWQpIHtcbiAgICAgIGlmIChpc0luUGx1cmFsR3JvdXApIHtcbiAgICAgICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJygnKSkge1xuICAgICAgICAgIGlzSW5DdXJyZW50Q29uZmlnID0gdHJpbW1lZExpbmUuc3RhcnRzV2l0aChgKCR7Y29uZmlnTWFya2VyfSlgKTtcbiAgICAgICAgICArK2xpbmVJbmRleDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJbkN1cnJlbnRDb25maWcpIHtcbiAgICAgICAgICBjb25zdCBbY29udGVudCwgaWR4XSA9IGV4dHJhY3RDb250ZW50KGxpbmVJbmRleCk7XG4gICAgICAgICAgbGluZUluZGV4ID0gaWR4O1xuICAgICAgICAgIGlmIChfLmlzU3RyaW5nKGNvbnRlbnQpKSB7XG4gICAgICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IFtcbiAgICAgICAgICAgICAgLi4uKGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdIHx8IFtdKSxcbiAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYCgke2NvbmZpZ01hcmtlcn0pYCkpIHtcbiAgICAgICAgY29uc3QgW2NvbnRlbnQsIGlkeF0gPSBleHRyYWN0Q29udGVudChsaW5lSW5kZXgpO1xuICAgICAgICBsaW5lSW5kZXggPSBpZHg7XG4gICAgICAgIGlmIChfLmlzU3RyaW5nKGNvbnRlbnQpKSB7XG4gICAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgKytsaW5lSW5kZXg7XG4gIH1cbiAgcmV0dXJuIGFwa1N0cmluZ3M7XG59XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgY29uZmlnIG1hcmtlciwgd2hpY2ggaXMgdGhlbiBwYXNzZWQgdG8gcGFyc2UuLiBtZXRob2RzXG4gKiB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCByZXNvdXJjZSBmb3JtYXRzIGdlbmVyYXRlZCBieSBhYXB0KDIpIHRvb2xcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25maWdzR2V0dGVyIFRoZSBmdW5jdGlvbiB3aG9zZSByZXN1bHQgaXMgYSBsaXN0XG4gKiBvZiBhcGsgY29uZmlnc1xuICogQHBhcmFtIHtzdHJpbmd9IGRlc2lyZWRNYXJrZXIgVGhlIGRlc2lyZWQgY29uZmlnIG1hcmtlciB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlZmF1bHRNYXJrZXIgVGhlIGRlZmF1bHQgY29uZmlnIG1hcmtlciB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGNvbmZpZyBtYXJrZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZm9ybWF0Q29uZmlnTWFya2VyIChjb25maWdzR2V0dGVyLCBkZXNpcmVkTWFya2VyLCBkZWZhdWx0TWFya2VyKSB7XG4gIGxldCBjb25maWdNYXJrZXIgPSBkZXNpcmVkTWFya2VyIHx8IGRlZmF1bHRNYXJrZXI7XG4gIGlmIChjb25maWdNYXJrZXIuaW5jbHVkZXMoJy0nKSAmJiAhY29uZmlnTWFya2VyLmluY2x1ZGVzKCctcicpKSB7XG4gICAgY29uZmlnTWFya2VyID0gY29uZmlnTWFya2VyLnJlcGxhY2UoJy0nLCAnLXInKTtcbiAgfVxuICBjb25zdCBjb25maWdzID0gYXdhaXQgY29uZmlnc0dldHRlcigpO1xuICBsb2cuZGVidWcoYFJlc291cmNlIGNvbmZpZ3VyYXRpb25zOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZ3MpfWApO1xuICAvLyBBc3N1bWUgdGhlICdlbicgY29uZmlndXJhdGlvbiBpcyB0aGUgZGVmYXVsdCBvbmVcbiAgaWYgKGNvbmZpZ01hcmtlci50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2VuJylcbiAgICAmJiAhY29uZmlncy5zb21lKCh4KSA9PiB4LnRyaW0oKSA9PT0gY29uZmlnTWFya2VyKSkge1xuICAgIGxvZy5kZWJ1ZyhgUmVzb3VyY2UgY29uZmlndXJhdGlvbiBuYW1lICcke2NvbmZpZ01hcmtlcn0nIGlzIHVua25vd24uIGAgK1xuICAgICAgYFJlcGxhY2luZyBpdCB3aXRoICcke2RlZmF1bHRNYXJrZXJ9J2ApO1xuICAgIGNvbmZpZ01hcmtlciA9IGRlZmF1bHRNYXJrZXI7XG4gIH0gZWxzZSB7XG4gICAgbG9nLmRlYnVnKGBTZWxlY3RlZCBjb25maWd1cmF0aW9uOiAnJHtjb25maWdNYXJrZXJ9J2ApO1xuICB9XG4gIHJldHVybiBjb25maWdNYXJrZXI7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBvdXRwdXQgaW4gSlNPTiBmb3JtYXQgcmV0cmlldmVkIGZyb21cbiAqIHRoZSBjb3JyZXNwb25kaW5nIEFwcGl1bSBTZXR0aW5ncyBicm9hZGNhc3QgY2FsbHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3V0cHV0IFRoZSBhY3R1YWwgY29tbWFuZCBvdXRwdXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbnRpdHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgd2hpY2ggaXNcbiAqIGdvaW5nIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH0gVGhlIHBhcnNlZCBKU09OIG9iamVjdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBvdXRwdXQgY2Fubm90IGJlIHBhcnNlZFxuICogYXMgYSB2YWxpZCBKU09OXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSnNvbkRhdGEgKG91dHB1dCwgZW50aXR5TmFtZSkge1xuICBpZiAoIS9cXGJyZXN1bHQ9LTFcXGIvLnRlc3Qob3V0cHV0KSB8fCAhL1xcYmRhdGE9XCIvLnRlc3Qob3V0cHV0KSkge1xuICAgIGxvZy5kZWJ1ZyhvdXRwdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJldHJpZXZlICR7ZW50aXR5TmFtZX0gZnJvbSB0aGUgZGV2aWNlLiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbiAgY29uc3QgbWF0Y2ggPSAvXFxiZGF0YT0oXCIuKykvLmV4ZWMob3V0cHV0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhvdXRwdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlICR7ZW50aXR5TmFtZX0gZnJvbSB0aGUgY29tbWFuZCBvdXRwdXQuIGAgK1xuICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMnKTtcbiAgfVxuICBjb25zdCBqc29uU3RyID0gXy50cmltKG1hdGNoWzFdKS5yZXBsYWNlKC8oXlwiKXwoXCIkKS9nLCAnJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZGVidWcoanNvblN0cik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgJHtlbnRpdHlOYW1lfSBmcm9tIHRoZSByZXN1bHRpbmcgZGF0YSBzdHJpbmcuIGAgK1xuICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGFiYnJldmlhdGlvbnNcbiAqIHRvIEFWRCBhcmd1bWVudHMgYXJyYXlcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIExhbmd1YWdlIG5hbWUsIGZvciBleGFtcGxlICdmcidcbiAqIEBwYXJhbSB7P3N0cmluZ30gY291bnRyeSBDb3VudHJ5IG5hbWUsIGZvciBleGFtcGxlICdDQSdcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgZ2VuZXJhdGVkIGFyZ3VtZW50cy4gVGhlXG4gKiByZXN1bHRpbmcgYXJyYXkgbWlnaHQgYmUgZW1wdHkgaWYgYm90aCBhcmd1bWVudHMgYXJlIGVtcHR5XG4gKi9cbmZ1bmN0aW9uIHRvQXZkTG9jYWxlQXJncyAobGFuZ3VhZ2UsIGNvdW50cnkpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGlmIChsYW5ndWFnZSAmJiBfLmlzU3RyaW5nKGxhbmd1YWdlKSkge1xuICAgIHJlc3VsdC5wdXNoKCctcHJvcCcsIGBwZXJzaXN0LnN5cy5sYW5ndWFnZT0ke2xhbmd1YWdlLnRvTG93ZXJDYXNlKCl9YCk7XG4gIH1cbiAgaWYgKGNvdW50cnkgJiYgXy5pc1N0cmluZyhjb3VudHJ5KSkge1xuICAgIHJlc3VsdC5wdXNoKCctcHJvcCcsIGBwZXJzaXN0LnN5cy5jb3VudHJ5PSR7Y291bnRyeS50b1VwcGVyQ2FzZSgpfWApO1xuICB9XG4gIGxldCBsb2NhbGU7XG4gIGlmIChfLmlzU3RyaW5nKGxhbmd1YWdlKSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpICYmIGxhbmd1YWdlICYmIGNvdW50cnkpIHtcbiAgICBsb2NhbGUgPSBsYW5ndWFnZS50b0xvd2VyQ2FzZSgpICsgJy0nICsgY291bnRyeS50b1VwcGVyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKGxhbmd1YWdlICYmIF8uaXNTdHJpbmcobGFuZ3VhZ2UpKSB7XG4gICAgbG9jYWxlID0gbGFuZ3VhZ2UudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIGlmIChjb3VudHJ5ICYmIF8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICBsb2NhbGUgPSBjb3VudHJ5O1xuICB9XG4gIGlmIChsb2NhbGUpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMubG9jYWxlPSR7bG9jYWxlfWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmdWxsIHBhdGggdG8gdGhlIEFuZHJvaWQgcHJlZmVyZW5jZXMgcm9vdFxuICpcbiAqIEByZXR1cm5zIHs/c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmb2xkZXIgb3IgYG51bGxgIGlmIHRoZSBmb2xkZXIgY2Fubm90IGJlIGZvdW5kXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFuZHJvaWRQcmVmc1Jvb3QgKCkge1xuICBsZXQgbG9jYXRpb24gPSBwcm9jZXNzLmVudi5BTkRST0lEX0VNVUxBVE9SX0hPTUU7XG4gIGlmIChhd2FpdCBkaXJFeGlzdHMobG9jYXRpb24pKSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uO1xuICB9XG5cbiAgaWYgKGxvY2F0aW9uKSB7XG4gICAgbG9nLndhcm4oYFRoZSB2YWx1ZSBvZiB0aGUgQU5EUk9JRF9FTVVMQVRPUl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlICcke2xvY2F0aW9ufScgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeWApO1xuICB9XG5cbiAgY29uc3QgaG9tZSA9IHByb2Nlc3MuZW52LkhPTUUgfHwgcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEU7XG4gIGlmIChob21lKSB7XG4gICAgbG9jYXRpb24gPSBwYXRoLnJlc29sdmUoaG9tZSwgJy5hbmRyb2lkJyk7XG4gIH1cblxuICBpZiAoIWF3YWl0IGRpckV4aXN0cyhsb2NhdGlvbikpIHtcbiAgICBsb2cuZGVidWcoYEFuZHJvaWQgY29uZmlnIHJvb3QgJyR7bG9jYXRpb259JyBpcyBub3QgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gbG9jYXRpb247XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwYXRoIGV4aXN0cyBvbiB0aGUgZmlsZXN5c3RlbSBhbmQgaXMgYSBkaXJlY3RvcnlcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxvY2F0aW9uIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpckV4aXN0cyAobG9jYXRpb24pIHtcbiAgcmV0dXJuIGxvY2F0aW9uXG4gICAgJiYgYXdhaXQgZnMuZXhpc3RzKGxvY2F0aW9uKVxuICAgICYmIChhd2FpdCBmcy5zdGF0KGxvY2F0aW9uKSkuaXNEaXJlY3RvcnkoKTtcbn1cblxuLyoqXG4gKiBFc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLlxuICogVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgcG9zc2libGUgaXNzdWVzIHdpdGggaG93IHN5c3RlbSBgc3Bhd25gXG4gKiBjYWxsIGhhbmRsZXMgdGhlbS5cbiAqIFNlZSBodHRwczovL2Rpc2N1c3MuYXBwaXVtLmlvL3QvaG93LXRvLW1vZGlmeS13ZC1wcm94eS1hbmQtdWlhdXRvbWF0b3IyLXNvdXJjZS1jb2RlLXRvLXN1cHBvcnQtdW5pY29kZS8zMzQ2NlxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJnIE5vbi1lc2NhcGVkIGFyZ3VtZW50IHN0cmluZ1xuICogQHJldHVybnMgVGhlIGVzY2FwZWQgYXJndW1lbnRcbiAqL1xuZnVuY3Rpb24gZXNjYXBlU2hlbGxBcmcgKGFyZykge1xuICBhcmcgPSBgJHthcmd9YDtcbiAgaWYgKHN5c3RlbS5pc1dpbmRvd3MoKSkge1xuICAgIHJldHVybiAvWyZ8Xlxcc10vLnRlc3QoYXJnKSA/IGBcIiR7YXJnLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgIDogYXJnO1xuICB9XG4gIHJldHVybiBhcmcucmVwbGFjZSgvJi9nLCAnXFxcXCYnKTtcbn1cblxuZXhwb3J0IHtcbiAgZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCwgdW56aXBGaWxlLFxuICBnZXRJTUVMaXN0RnJvbU91dHB1dCwgZ2V0SmF2YUZvck9zLCBpc1Nob3dpbmdMb2Nrc2NyZWVuLCBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQsXG4gIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgaXNTY3JlZW5PbkZ1bGx5LCBidWlsZFN0YXJ0Q21kLCBnZXRKYXZhSG9tZSxcbiAgcm9vdERpciwgZ2V0U2RrVG9vbHNWZXJzaW9uLCBnZXRBcGtzaWduZXJGb3JPcywgZ2V0QnVpbGRUb29sc0RpcnMsXG4gIGdldEFwa2FuYWx5emVyRm9yT3MsIGdldE9wZW5Tc2xGb3JPcywgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsIEFQS1NfRVhURU5TSU9OLFxuICBBUEtfSU5TVEFMTF9USU1FT1VULCBBUEtTX0lOU1RBTExfVElNRU9VVCwgYnVpbGRJbnN0YWxsQXJncywgQVBLX0VYVEVOU0lPTixcbiAgREVGQVVMVF9BREJfRVhFQ19USU1FT1VULCBwYXJzZU1hbmlmZXN0LCBwYXJzZUFhcHRTdHJpbmdzLCBwYXJzZUFhcHQyU3RyaW5ncyxcbiAgZm9ybWF0Q29uZmlnTWFya2VyLCBwYXJzZUpzb25EYXRhLCB1bnNpZ25BcGssIHRvQXZkTG9jYWxlQXJncywgcmVxdWlyZVNka1Jvb3QsXG4gIGdldFNka1Jvb3RGcm9tRW52LCBnZXRBbmRyb2lkUHJlZnNSb290LCBkaXJFeGlzdHMsIGVzY2FwZVNoZWxsQXJnLFxufTtcbiJdLCJmaWxlIjoibGliL2hlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==