appium-android-driver 5.11.1 → 5.12.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.
- package/CHANGELOG.md +19 -0
- package/build/lib/android-helpers.js +8 -2
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/commands/actions.js +13 -18
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/performance.js +70 -61
- package/build/lib/commands/performance.js.map +1 -1
- package/lib/android-helpers.js +7 -1
- package/lib/commands/actions.js +23 -14
- package/lib/commands/performance.js +153 -112
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","names":["_androidHelpers","_interopRequireDefault","require","_support","_path","_bluebird","_jimp","_teen_process","_utils","swipeStepsPerSec","dragStepsPerSec","commands","helpers","extensions","exports","keyevent","keycode","metastate","log","warn","pressKeyCode","bootstrap","sendAction","longPressKeyCode","getOrientation","params","naturalOrientation","opts","androidNaturalOrientation","orientation","toUpperCase","setOrientation","fakeFlick","xSpeed","ySpeed","fakeFlickElement","elementId","xoffset","yoffset","speed","swipe","startX","startY","endX","endY","duration","touchCount","elId","swipeOpts","steps","Math","round","util","hasValue","doSwipe","pinchClose","percent","pinchOpts","direction","pinchOpen","flick","element","xOffset","yOffset","drag","destElId","dragOpts","doDrag","lock","seconds","adb","isNaN","floatSeconds","parseFloat","B","delay","unlock","isLocked","isScreenLocked","androidHelpers","caps","openNotifications","setLocation","latitude","longitude","sendTelnetCommand","fingerprint","fingerprintId","isEmulator","errorAndThrow","mobileFingerprint","requireArgs","sendSMS","phoneNumber","message","mobileSendSms","gsmCall","action","mobileGsmCall","gsmSignal","signalStrengh","mobileGsmSignal","strength","gsmVoice","state","mobileGsmVoice","powerAC","mobilePowerAc","powerCapacity","batteryPercent","mobilePowerCapacity","networkSpeed","mobileNetworkSpeed","sensorSet","sensor","sensorType","value","getScreenshotDataWithAdbShell","localFile","tempDir","path","prefix","suffix","fs","exists","unlink","pngDir","androidScreenshotPath","png","posix","resolve","cmd","shell","fileSize","Error","pull","jimp","read","getScreenshotDataWithAdbExecOut","stdout","stderr","code","exec","executable","defaultArgs","concat","encoding","isBuffer","length","toString","getScreenshot","apiLevel","getApiLevel","image","e","info","err","screenOrientation","getScreenOrientation","rotate","getBuffer","promisify","context","imgBuffer","MIME_PNG","Object","assign","_default","default"],"sources":["../../../lib/commands/actions.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { fs, util, tempDir} from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport jimp from 'jimp';\nimport { exec } from 'teen_process';\nimport { requireArgs } from '../utils';\n\nconst swipeStepsPerSec = 28;\nconst dragStepsPerSec = 40;\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keyevent = async function keyevent (keycode, metastate = null) {\n // TODO deprecate keyevent; currently wd only implements keyevent\n this.log.warn('keyevent will be deprecated use pressKeyCode');\n return await this.pressKeyCode(keycode, metastate);\n};\n\ncommands.pressKeyCode = async function pressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('pressKeyCode', {keycode, metastate});\n};\n\ncommands.longPressKeyCode = async function longPressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('longPressKeyCode', {keycode, metastate});\n};\n\ncommands.getOrientation = async function getOrientation () {\n let params = {\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n let orientation = await this.bootstrap.sendAction('orientation', params);\n return orientation.toUpperCase();\n};\n\ncommands.setOrientation = async function setOrientation (orientation) {\n orientation = orientation.toUpperCase();\n let params = {\n orientation,\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n return await this.bootstrap.sendAction('orientation', params);\n};\n\ncommands.fakeFlick = async function fakeFlick (xSpeed, ySpeed) {\n return await this.bootstrap.sendAction('flick', {xSpeed, ySpeed});\n};\n\ncommands.fakeFlickElement = async function fakeFlickElement (elementId, xoffset, yoffset, speed) {\n let params = {xoffset, yoffset, speed, elementId};\n return await this.bootstrap.sendAction('element:flick', params);\n};\n\ncommands.swipe = async function swipe (startX, startY, endX, endY, duration, touchCount, elId) {\n if (startX === 'null') {\n startX = 0.5;\n }\n if (startY === 'null') {\n startY = 0.5;\n }\n let swipeOpts = {startX, startY, endX, endY,\n steps: Math.round(duration * swipeStepsPerSec)};\n // going the long way and checking for undefined and null since\n // we can't be assured `elId` is a string and not an int\n if (util.hasValue(elId)) {\n swipeOpts.elementId = elId;\n }\n return await this.doSwipe(swipeOpts);\n};\n\ncommands.doSwipe = async function doSwipe (swipeOpts) {\n if (util.hasValue(swipeOpts.elementId)) {\n return await this.bootstrap.sendAction('element:swipe', swipeOpts);\n } else {\n return await this.bootstrap.sendAction('swipe', swipeOpts);\n }\n};\n\ncommands.pinchClose = async function pinchClose (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {\n direction: 'in',\n elementId: elId,\n percent,\n steps\n };\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.pinchOpen = async function pinchOpen (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {direction: 'out', elementId: elId, percent, steps};\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.flick = async function flick (element, xSpeed, ySpeed, xOffset, yOffset, speed) {\n if (element) {\n await this.fakeFlickElement(element, xOffset, yOffset, speed);\n } else {\n await this.fakeFlick(xSpeed, ySpeed);\n }\n};\n\ncommands.drag = async function drag (startX, startY, endX, endY, duration, touchCount, elementId, destElId) {\n let dragOpts = {\n elementId, destElId, startX, startY, endX, endY,\n steps: Math.round(duration * dragStepsPerSec)\n };\n return await this.doDrag(dragOpts);\n\n};\n\ncommands.doDrag = async function doDrag (dragOpts) {\n if (util.hasValue(dragOpts.elementId)) {\n return await this.bootstrap.sendAction('element:drag', dragOpts);\n } else {\n return await this.bootstrap.sendAction('drag', dragOpts);\n }\n};\n\ncommands.lock = async function lock (seconds) {\n await this.adb.lock();\n if (isNaN(seconds)) {\n return;\n }\n\n const floatSeconds = parseFloat(seconds);\n if (floatSeconds <= 0) {\n return;\n }\n await B.delay(1000 * floatSeconds);\n await this.unlock();\n};\n\ncommands.isLocked = async function isLocked () {\n return await this.adb.isScreenLocked();\n};\n\ncommands.unlock = async function unlock () {\n return await androidHelpers.unlock(this, this.adb, this.caps);\n};\n\ncommands.openNotifications = async function openNotifications () {\n return await this.bootstrap.sendAction('openNotification');\n};\n\ncommands.setLocation = async function setLocation (latitude, longitude) {\n return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);\n};\n\ncommands.fingerprint = async function fingerprint (fingerprintId) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('fingerprint method is only available for emulators');\n }\n await this.adb.fingerprint(fingerprintId);\n};\n\n/**\n * @typedef {Object} FingerprintOpts\n * @param {string|number} fingerprintId The value is the finger_id for the finger that\n * was \"scanned\". It is a unique integer that you assign for each virtual fingerprint.\n * When the app is running you can run this same command each time the\n * emulator prompts you for a fingerprint, you can run the adb command and pass it\n * the finger_id to simulate the fingerprint scan.\n */\n\n/**\n * Emulate fingerprint on Android Emulator.\n * Only works on API 23+\n *\n * @param {FingerprintOpts} opts\n */\ncommands.mobileFingerprint = async function mobileFingerprint(opts = {}) {\n const {fingerprintId} = requireArgs('fingerprintId', opts);\n await this.fingerprint(fingerprintId);\n};\n\ncommands.sendSMS = async function sendSMS (phoneNumber, message) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sendSMS method is only available for emulators');\n }\n await this.adb.sendSMS(phoneNumber, message);\n};\n\n/**\n * @typedef {Object} SendSmsOptions\n * @property {string} phoneNumber The phone number to send SMS to\n * @property {string} message The message payload\n */\n\n/**\n * Emulate sending an SMS to the given phone number.\n * Only works on emulators.\n *\n * @param {SendSmsOptions} opts\n */\ncommands.mobileSendSms = async function mobileSendSms(opts = {}) {\n const {phoneNumber, message} = requireArgs(['phoneNumber', 'message'], opts);\n await this.sendSMS(phoneNumber, message);\n};\n\ncommands.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmCall method is only available for emulators');\n }\n await this.adb.gsmCall(phoneNumber, action);\n};\n\n/**\n * @typedef {Object} GsmCallOptions\n * @property {string} phoneNumber The phone number to call to\n * @property {call|accept|cancel|hold} action One of possible actions to take\n */\n\n/**\n * Emulate a GSM call to the given phone number.\n * Only works on emulators.\n *\n * @param {GsmCallOptions} opts\n */\ncommands.mobileGsmCall = async function mobileGsmCall(opts = {}) {\n const {phoneNumber, action} = requireArgs(['phoneNumber', 'action'], opts);\n await this.gsmCall(phoneNumber, action);\n};\n\ncommands.gsmSignal = async function gsmSignal (signalStrengh) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmSignal method is only available for emulators');\n }\n await this.adb.gsmSignal(signalStrengh);\n};\n\n/**\n * @typedef {Object} GsmSignalOptions\n * @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.\n */\n\n/**\n * Emulate GSM signal strength change event.\n * Only works on emulators.\n *\n * @param {GsmSignalOptions} opts\n */\ncommands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {\n const {strength} = requireArgs('strength', opts);\n await this.gsmSignal(strength);\n};\n\ncommands.gsmVoice = async function gsmVoice (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmVoice method is only available for emulators');\n }\n await this.adb.gsmVoice(state);\n};\n\n/**\n * @typedef {Object} GsmVoiceOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate GSM voice state change event.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.gsmVoice(state);\n};\n\ncommands.powerAC = async function powerAC (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerAC method is only available for emulators');\n }\n await this.adb.powerAC(state);\n};\n\n/**\n * @typedef {Object} PowerAcOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate AC power state change.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobilePowerAc = async function mobilePowerAc(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.powerAC(state);\n};\n\ncommands.powerCapacity = async function powerCapacity (batteryPercent) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerCapacity method is only available for emulators');\n }\n await this.adb.powerCapacity(batteryPercent);\n};\n\n/**\n * @typedef {Object} PowerCapacityOptions\n * @property {number} percent - Percentage value in range [0, 100]\n */\n\n/**\n * Emulate power capacity change.\n * Only works on emulators.\n *\n * @param {PowerCapacityOptions} opts\n */\ncommands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {\n const {percent} = requireArgs('percent', opts);\n await this.powerCapacity(percent);\n};\n\ncommands.networkSpeed = async function networkSpeed (networkSpeed) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('networkSpeed method is only available for emulators');\n }\n await this.adb.networkSpeed(networkSpeed);\n};\n\n/**\n * @typedef {Object} NetworkSpeedOptions\n * @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed\n */\n\n/**\n * Emulate different network connection speed modes.\n * Only works on emulators.\n *\n * @param {NetworkSpeedOptions} opts\n */\ncommands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {\n const {speed} = requireArgs('speed', opts);\n await this.networkSpeed(speed);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @typedef {Object} Sensor\n * @property {string} sensorType - sensor type declared in adb.SENSORS\n * @property {string} value - value to set to the sensor\n *\n * @param {Object} Sensor\n * @throws {Error} - If sensorType is not defined\n * @throws {Error} - If value for the se sor is not defined\n * @throws {Error} - If deviceType is not an emulator\n */\ncommands.sensorSet = async function sensorSet (sensor = {}) {\n const {sensorType, value} = sensor;\n if (!util.hasValue(sensorType)) {\n this.log.errorAndThrow(`'sensorType' argument is required`);\n }\n if (!util.hasValue(value)) {\n this.log.errorAndThrow(`'value' argument is required`);\n }\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sensorSet method is only available for emulators');\n }\n await this.adb.sensorSet(sensorType, value);\n};\n\nhelpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell (adb, opts) {\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.png'});\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n try {\n const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';\n const png = path.posix.resolve(pngDir, 'screenshot.png');\n const cmd = ['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png];\n await adb.shell(cmd);\n if (!await adb.fileSize(png)) {\n throw new Error('The size of the taken screenshot equals to zero.');\n }\n await adb.pull(png, localFile);\n return await jimp.read(localFile);\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n }\n};\n\nhelpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut (adb) {\n let {stdout, stderr, code} = await exec(adb.executable.path,\n adb.executable.defaultArgs\n .concat(['exec-out', '/system/bin/screencap', '-p']),\n {encoding: 'binary', isBuffer: true});\n // if there is an error, throw\n if (code || stderr.length) {\n throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);\n }\n // if we don't get anything at all, throw\n if (!stdout.length) {\n throw new Error('Screenshot returned no data');\n }\n\n return await jimp.read(stdout);\n};\n\ncommands.getScreenshot = async function getScreenshot () {\n const apiLevel = await this.adb.getApiLevel();\n let image = null;\n if (apiLevel > 20) {\n try {\n // This screenshoting approach is way faster, since it requires less external commands\n // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)\n image = await this.getScreenshotDataWithAdbExecOut(this.adb);\n } catch (e) {\n this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +\n `Defaulting to 'adb shell' call`);\n }\n }\n if (!image) {\n try {\n image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);\n } catch (e) {\n const err = `Cannot get screenshot data because of '${e.message}'. ` +\n `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +\n `the current view`;\n this.log.errorAndThrow(err);\n }\n }\n if (apiLevel < 23) {\n // Android bug 8433742 - rotate screenshot if screen is rotated\n let screenOrientation = await this.adb.getScreenOrientation();\n try {\n image = await image.rotate(-90 * screenOrientation);\n } catch (err) {\n this.log.warn(`Could not rotate screenshot due to error: ${err}`);\n }\n }\n const getBuffer = B.promisify(image.getBuffer, {context: image});\n const imgBuffer = await getBuffer(jimp.MIME_PNG);\n return imgBuffer.toString('base64');\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"actions.js","names":["_androidHelpers","_interopRequireDefault","require","_support","_path","_bluebird","_sharp","_teen_process","_utils","swipeStepsPerSec","dragStepsPerSec","commands","exports","helpers","extensions","keyevent","keycode","metastate","log","warn","pressKeyCode","bootstrap","sendAction","longPressKeyCode","getOrientation","params","naturalOrientation","opts","androidNaturalOrientation","orientation","toUpperCase","setOrientation","fakeFlick","xSpeed","ySpeed","fakeFlickElement","elementId","xoffset","yoffset","speed","swipe","startX","startY","endX","endY","duration","touchCount","elId","swipeOpts","steps","Math","round","util","hasValue","doSwipe","pinchClose","percent","pinchOpts","direction","pinchOpen","flick","element","xOffset","yOffset","drag","destElId","dragOpts","doDrag","lock","seconds","adb","isNaN","floatSeconds","parseFloat","B","delay","unlock","isLocked","isScreenLocked","androidHelpers","caps","openNotifications","setLocation","latitude","longitude","sendTelnetCommand","fingerprint","fingerprintId","isEmulator","errorAndThrow","mobileFingerprint","requireArgs","sendSMS","phoneNumber","message","mobileSendSms","gsmCall","action","mobileGsmCall","gsmSignal","signalStrengh","mobileGsmSignal","strength","gsmVoice","state","mobileGsmVoice","powerAC","mobilePowerAc","powerCapacity","batteryPercent","mobilePowerCapacity","networkSpeed","mobileNetworkSpeed","sensorSet","sensor","sensorType","value","getScreenshotDataWithAdbShell","localFile","tempDir","path","prefix","suffix","fs","exists","unlink","pngDir","androidScreenshotPath","png","posix","resolve","shell","fileSize","Error","pull","sharp","getScreenshotDataWithAdbExecOut","stdout","stderr","code","exec","executable","defaultArgs","encoding","isBuffer","length","toString","getScreenshot","apiLevel","getApiLevel","image","e","info","err","screenOrientation","getScreenOrientation","rotate","toBuffer","Object","assign","_default","default"],"sources":["../../../lib/commands/actions.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { fs, util, tempDir} from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport sharp from 'sharp';\nimport { exec } from 'teen_process';\nimport { requireArgs } from '../utils';\n\nconst swipeStepsPerSec = 28;\nconst dragStepsPerSec = 40;\n\nconst commands = {};\nconst helpers = {};\nconst extensions = {};\n\ncommands.keyevent = async function keyevent (keycode, metastate = null) {\n // TODO deprecate keyevent; currently wd only implements keyevent\n this.log.warn('keyevent will be deprecated use pressKeyCode');\n return await this.pressKeyCode(keycode, metastate);\n};\n\ncommands.pressKeyCode = async function pressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('pressKeyCode', {keycode, metastate});\n};\n\ncommands.longPressKeyCode = async function longPressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('longPressKeyCode', {keycode, metastate});\n};\n\ncommands.getOrientation = async function getOrientation () {\n let params = {\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n let orientation = await this.bootstrap.sendAction('orientation', params);\n return orientation.toUpperCase();\n};\n\ncommands.setOrientation = async function setOrientation (orientation) {\n orientation = orientation.toUpperCase();\n let params = {\n orientation,\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n return await this.bootstrap.sendAction('orientation', params);\n};\n\ncommands.fakeFlick = async function fakeFlick (xSpeed, ySpeed) {\n return await this.bootstrap.sendAction('flick', {xSpeed, ySpeed});\n};\n\ncommands.fakeFlickElement = async function fakeFlickElement (elementId, xoffset, yoffset, speed) {\n let params = {xoffset, yoffset, speed, elementId};\n return await this.bootstrap.sendAction('element:flick', params);\n};\n\ncommands.swipe = async function swipe (startX, startY, endX, endY, duration, touchCount, elId) {\n if (startX === 'null') {\n startX = 0.5;\n }\n if (startY === 'null') {\n startY = 0.5;\n }\n let swipeOpts = {startX, startY, endX, endY,\n steps: Math.round(duration * swipeStepsPerSec)};\n // going the long way and checking for undefined and null since\n // we can't be assured `elId` is a string and not an int\n if (util.hasValue(elId)) {\n swipeOpts.elementId = elId;\n }\n return await this.doSwipe(swipeOpts);\n};\n\ncommands.doSwipe = async function doSwipe (swipeOpts) {\n if (util.hasValue(swipeOpts.elementId)) {\n return await this.bootstrap.sendAction('element:swipe', swipeOpts);\n } else {\n return await this.bootstrap.sendAction('swipe', swipeOpts);\n }\n};\n\ncommands.pinchClose = async function pinchClose (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {\n direction: 'in',\n elementId: elId,\n percent,\n steps\n };\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.pinchOpen = async function pinchOpen (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {direction: 'out', elementId: elId, percent, steps};\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.flick = async function flick (element, xSpeed, ySpeed, xOffset, yOffset, speed) {\n if (element) {\n await this.fakeFlickElement(element, xOffset, yOffset, speed);\n } else {\n await this.fakeFlick(xSpeed, ySpeed);\n }\n};\n\ncommands.drag = async function drag (startX, startY, endX, endY, duration, touchCount, elementId, destElId) {\n let dragOpts = {\n elementId, destElId, startX, startY, endX, endY,\n steps: Math.round(duration * dragStepsPerSec)\n };\n return await this.doDrag(dragOpts);\n\n};\n\ncommands.doDrag = async function doDrag (dragOpts) {\n if (util.hasValue(dragOpts.elementId)) {\n return await this.bootstrap.sendAction('element:drag', dragOpts);\n } else {\n return await this.bootstrap.sendAction('drag', dragOpts);\n }\n};\n\ncommands.lock = async function lock (seconds) {\n await this.adb.lock();\n if (isNaN(seconds)) {\n return;\n }\n\n const floatSeconds = parseFloat(seconds);\n if (floatSeconds <= 0) {\n return;\n }\n await B.delay(1000 * floatSeconds);\n await this.unlock();\n};\n\ncommands.isLocked = async function isLocked () {\n return await this.adb.isScreenLocked();\n};\n\ncommands.unlock = async function unlock () {\n return await androidHelpers.unlock(this, this.adb, this.caps);\n};\n\ncommands.openNotifications = async function openNotifications () {\n return await this.bootstrap.sendAction('openNotification');\n};\n\ncommands.setLocation = async function setLocation (latitude, longitude) {\n return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);\n};\n\ncommands.fingerprint = async function fingerprint (fingerprintId) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('fingerprint method is only available for emulators');\n }\n await this.adb.fingerprint(fingerprintId);\n};\n\n/**\n * @typedef {Object} FingerprintOpts\n * @param {string|number} fingerprintId The value is the finger_id for the finger that\n * was \"scanned\". It is a unique integer that you assign for each virtual fingerprint.\n * When the app is running you can run this same command each time the\n * emulator prompts you for a fingerprint, you can run the adb command and pass it\n * the finger_id to simulate the fingerprint scan.\n */\n\n/**\n * Emulate fingerprint on Android Emulator.\n * Only works on API 23+\n *\n * @param {FingerprintOpts} opts\n */\ncommands.mobileFingerprint = async function mobileFingerprint(opts = {}) {\n const {fingerprintId} = requireArgs('fingerprintId', opts);\n await this.fingerprint(fingerprintId);\n};\n\ncommands.sendSMS = async function sendSMS (phoneNumber, message) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sendSMS method is only available for emulators');\n }\n await this.adb.sendSMS(phoneNumber, message);\n};\n\n/**\n * @typedef {Object} SendSmsOptions\n * @property {string} phoneNumber The phone number to send SMS to\n * @property {string} message The message payload\n */\n\n/**\n * Emulate sending an SMS to the given phone number.\n * Only works on emulators.\n *\n * @param {SendSmsOptions} opts\n */\ncommands.mobileSendSms = async function mobileSendSms(opts = {}) {\n const {phoneNumber, message} = requireArgs(['phoneNumber', 'message'], opts);\n await this.sendSMS(phoneNumber, message);\n};\n\ncommands.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmCall method is only available for emulators');\n }\n await this.adb.gsmCall(phoneNumber, action);\n};\n\n/**\n * @typedef {Object} GsmCallOptions\n * @property {string} phoneNumber The phone number to call to\n * @property {call|accept|cancel|hold} action One of possible actions to take\n */\n\n/**\n * Emulate a GSM call to the given phone number.\n * Only works on emulators.\n *\n * @param {GsmCallOptions} opts\n */\ncommands.mobileGsmCall = async function mobileGsmCall(opts = {}) {\n const {phoneNumber, action} = requireArgs(['phoneNumber', 'action'], opts);\n await this.gsmCall(phoneNumber, action);\n};\n\ncommands.gsmSignal = async function gsmSignal (signalStrengh) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmSignal method is only available for emulators');\n }\n await this.adb.gsmSignal(signalStrengh);\n};\n\n/**\n * @typedef {Object} GsmSignalOptions\n * @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.\n */\n\n/**\n * Emulate GSM signal strength change event.\n * Only works on emulators.\n *\n * @param {GsmSignalOptions} opts\n */\ncommands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {\n const {strength} = requireArgs('strength', opts);\n await this.gsmSignal(strength);\n};\n\ncommands.gsmVoice = async function gsmVoice (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmVoice method is only available for emulators');\n }\n await this.adb.gsmVoice(state);\n};\n\n/**\n * @typedef {Object} GsmVoiceOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate GSM voice state change event.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.gsmVoice(state);\n};\n\ncommands.powerAC = async function powerAC (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerAC method is only available for emulators');\n }\n await this.adb.powerAC(state);\n};\n\n/**\n * @typedef {Object} PowerAcOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate AC power state change.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobilePowerAc = async function mobilePowerAc(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.powerAC(state);\n};\n\ncommands.powerCapacity = async function powerCapacity (batteryPercent) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerCapacity method is only available for emulators');\n }\n await this.adb.powerCapacity(batteryPercent);\n};\n\n/**\n * @typedef {Object} PowerCapacityOptions\n * @property {number} percent - Percentage value in range [0, 100]\n */\n\n/**\n * Emulate power capacity change.\n * Only works on emulators.\n *\n * @param {PowerCapacityOptions} opts\n */\ncommands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {\n const {percent} = requireArgs('percent', opts);\n await this.powerCapacity(percent);\n};\n\ncommands.networkSpeed = async function networkSpeed (networkSpeed) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('networkSpeed method is only available for emulators');\n }\n await this.adb.networkSpeed(networkSpeed);\n};\n\n/**\n * @typedef {Object} NetworkSpeedOptions\n * @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed\n */\n\n/**\n * Emulate different network connection speed modes.\n * Only works on emulators.\n *\n * @param {NetworkSpeedOptions} opts\n */\ncommands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {\n const {speed} = requireArgs('speed', opts);\n await this.networkSpeed(speed);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @typedef {Object} Sensor\n * @property {string} sensorType - sensor type declared in adb.SENSORS\n * @property {string} value - value to set to the sensor\n *\n * @param {Object} Sensor\n * @throws {Error} - If sensorType is not defined\n * @throws {Error} - If value for the se sor is not defined\n * @throws {Error} - If deviceType is not an emulator\n */\ncommands.sensorSet = async function sensorSet (sensor = {}) {\n const {sensorType, value} = sensor;\n if (!util.hasValue(sensorType)) {\n this.log.errorAndThrow(`'sensorType' argument is required`);\n }\n if (!util.hasValue(value)) {\n this.log.errorAndThrow(`'value' argument is required`);\n }\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sensorSet method is only available for emulators');\n }\n await this.adb.sensorSet(sensorType, value);\n};\n\n/**\n * @param {ADB} adb\n * @param {Object} opts\n * @returns {Promise<sharp>}\n */\nhelpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell (adb, opts) {\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.png'});\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n try {\n const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';\n const png = path.posix.resolve(pngDir, 'screenshot.png');\n await adb.shell(['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png]);\n if (!await adb.fileSize(png)) {\n throw new Error('The size of the taken screenshot equals to zero.');\n }\n await adb.pull(png, localFile);\n return sharp(localFile);\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n }\n};\n\n/**\n * @param {ADB} adb\n * @returns {Promise<sharp>}\n */\nhelpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut (adb) {\n const {stdout, stderr, code} = await exec(\n adb.executable.path,\n [...adb.executable.defaultArgs, 'exec-out', '/system/bin/screencap', '-p'],\n {encoding: 'binary', isBuffer: true}\n );\n // if there is an error, throw\n if (code || stderr.length) {\n throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);\n }\n // if we don't get anything at all, throw\n if (!stdout.length) {\n throw new Error('Screenshot returned no data');\n }\n\n return sharp(stdout);\n};\n\ncommands.getScreenshot = async function getScreenshot () {\n const apiLevel = await this.adb.getApiLevel();\n let image = null;\n if (apiLevel > 20) {\n try {\n // This screenshoting approach is way faster, since it requires less external commands\n // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)\n image = await this.getScreenshotDataWithAdbExecOut(this.adb);\n } catch (e) {\n this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +\n `Defaulting to 'adb shell' call`);\n }\n }\n if (!image) {\n try {\n image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);\n } catch (e) {\n const err = `Cannot get screenshot data because of '${e.message}'. ` +\n `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +\n `the current view`;\n this.log.errorAndThrow(err);\n }\n }\n if (apiLevel < 23) {\n // Android bug 8433742 - rotate screenshot if screen is rotated\n let screenOrientation = await this.adb.getScreenOrientation();\n try {\n image = image.rotate(-90 * screenOrientation);\n } catch (err) {\n this.log.warn(`Could not rotate screenshot due to error: ${err}`);\n }\n }\n return (await image.toBuffer()).toString('base64');\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
@@ -4,14 +4,16 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.
|
|
7
|
+
exports.default = exports.commands = exports.SUPPORTED_PERFORMANCE_DATA_TYPES = exports.NETWORK_KEYS = exports.MEMORY_KEYS = exports.CPU_KEYS = exports.BATTERY_KEYS = void 0;
|
|
8
|
+
exports.getBatteryInfo = getBatteryInfo;
|
|
9
|
+
exports.getCPUInfo = getCPUInfo;
|
|
10
|
+
exports.getMemoryInfo = getMemoryInfo;
|
|
11
|
+
exports.getNetworkTrafficInfo = getNetworkTrafficInfo;
|
|
8
12
|
require("source-map-support/register");
|
|
9
13
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
10
14
|
var _asyncbox = require("asyncbox");
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
extensions = {};
|
|
14
|
-
exports.helpers = helpers;
|
|
15
|
+
var _utils = require("../utils");
|
|
16
|
+
const commands = {};
|
|
15
17
|
exports.commands = commands;
|
|
16
18
|
const NETWORK_KEYS = [['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'], ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']];
|
|
17
19
|
exports.NETWORK_KEYS = NETWORK_KEYS;
|
|
@@ -80,57 +82,7 @@ function parseMeminfoForApiAbove29(entries, valDict) {
|
|
|
80
82
|
[, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;
|
|
81
83
|
}
|
|
82
84
|
}
|
|
83
|
-
|
|
84
|
-
return _lodash.default.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);
|
|
85
|
-
};
|
|
86
|
-
commands.getPerformanceData = async function getPerformanceData(packageName, dataType, retries = 2) {
|
|
87
|
-
switch (_lodash.default.toLower(dataType)) {
|
|
88
|
-
case 'batteryinfo':
|
|
89
|
-
return await this.getBatteryInfo(retries);
|
|
90
|
-
case 'cpuinfo':
|
|
91
|
-
return await this.getCPUInfo(packageName, retries);
|
|
92
|
-
case 'memoryinfo':
|
|
93
|
-
return await this.getMemoryInfo(packageName, retries);
|
|
94
|
-
case 'networkinfo':
|
|
95
|
-
return await this.getNetworkTrafficInfo(retries);
|
|
96
|
-
default:
|
|
97
|
-
throw new Error(`No performance data of type '${dataType}' found. ` + `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
helpers.getCPUInfo = async function getCPUInfo(packageName, retries = 2) {
|
|
101
|
-
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
102
|
-
let output;
|
|
103
|
-
try {
|
|
104
|
-
output = await this.adb.shell(['dumpsys', 'cpuinfo']);
|
|
105
|
-
} catch (e) {
|
|
106
|
-
if (e.stderr) {
|
|
107
|
-
this.log.info(e.stderr);
|
|
108
|
-
}
|
|
109
|
-
throw e;
|
|
110
|
-
}
|
|
111
|
-
const usagesPattern = new RegExp(`^.+\\/${_lodash.default.escapeRegExp(packageName)}:\\D+([\\d.]+)%\\s+user\\s+\\+\\s+([\\d.]+)%\\s+kernel`, 'm');
|
|
112
|
-
const match = usagesPattern.exec(output);
|
|
113
|
-
if (!match) {
|
|
114
|
-
this.log.debug(output);
|
|
115
|
-
throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);
|
|
116
|
-
}
|
|
117
|
-
return [CPU_KEYS, [match[1], match[2]]];
|
|
118
|
-
});
|
|
119
|
-
};
|
|
120
|
-
helpers.getBatteryInfo = async function getBatteryInfo(retries = 2) {
|
|
121
|
-
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
122
|
-
let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];
|
|
123
|
-
let data = await this.adb.shell(cmd);
|
|
124
|
-
if (!data) throw new Error('No data from dumpsys');
|
|
125
|
-
let power = parseInt((data.split(':')[1] || '').trim(), 10);
|
|
126
|
-
if (!Number.isNaN(power)) {
|
|
127
|
-
return [_lodash.default.clone(BATTERY_KEYS), [power.toString()]];
|
|
128
|
-
} else {
|
|
129
|
-
throw new Error(`Unable to parse battery data: '${data}'`);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
};
|
|
133
|
-
helpers.getMemoryInfo = async function getMemoryInfo(packageName, retries = 2) {
|
|
85
|
+
async function getMemoryInfo(packageName, retries = 2) {
|
|
134
86
|
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
135
87
|
const cmd = ['dumpsys', 'meminfo', `'${packageName}'`, '|', 'grep', '-E', `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` + `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`];
|
|
136
88
|
const data = await this.adb.shell(cmd);
|
|
@@ -158,8 +110,9 @@ helpers.getMemoryInfo = async function getMemoryInfo(packageName, retries = 2) {
|
|
|
158
110
|
}
|
|
159
111
|
throw new Error(`Unable to parse memory data: '${data}'`);
|
|
160
112
|
});
|
|
161
|
-
}
|
|
162
|
-
|
|
113
|
+
}
|
|
114
|
+
;
|
|
115
|
+
async function getNetworkTrafficInfo(retries = 2) {
|
|
163
116
|
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
164
117
|
let returnValue = [];
|
|
165
118
|
let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;
|
|
@@ -261,8 +214,64 @@ helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2
|
|
|
261
214
|
throw new Error(`Unable to parse network traffic data: '${data}'`);
|
|
262
215
|
}
|
|
263
216
|
});
|
|
217
|
+
}
|
|
218
|
+
async function getCPUInfo(packageName, retries = 2) {
|
|
219
|
+
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
220
|
+
let output;
|
|
221
|
+
try {
|
|
222
|
+
output = await this.adb.shell(['dumpsys', 'cpuinfo']);
|
|
223
|
+
} catch (e) {
|
|
224
|
+
if (e.stderr) {
|
|
225
|
+
this.log.info(e.stderr);
|
|
226
|
+
}
|
|
227
|
+
throw e;
|
|
228
|
+
}
|
|
229
|
+
const usagesPattern = new RegExp(`^.+\\/${_lodash.default.escapeRegExp(packageName)}:\\D+([\\d.]+)%\\s+user\\s+\\+\\s+([\\d.]+)%\\s+kernel`, 'm');
|
|
230
|
+
const match = usagesPattern.exec(output);
|
|
231
|
+
if (!match) {
|
|
232
|
+
this.log.debug(output);
|
|
233
|
+
throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);
|
|
234
|
+
}
|
|
235
|
+
return [CPU_KEYS, [match[1], match[2]]];
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
async function getBatteryInfo(retries = 2) {
|
|
239
|
+
return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
|
|
240
|
+
let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];
|
|
241
|
+
let data = await this.adb.shell(cmd);
|
|
242
|
+
if (!data) throw new Error('No data from dumpsys');
|
|
243
|
+
let power = parseInt((data.split(':')[1] || '').trim(), 10);
|
|
244
|
+
if (!Number.isNaN(power)) {
|
|
245
|
+
return [_lodash.default.clone(BATTERY_KEYS), [power.toString()]];
|
|
246
|
+
} else {
|
|
247
|
+
throw new Error(`Unable to parse battery data: '${data}'`);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
commands.getPerformanceDataTypes = function getPerformanceDataTypes() {
|
|
252
|
+
return _lodash.default.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);
|
|
253
|
+
};
|
|
254
|
+
commands.getPerformanceData = async function getPerformanceData(packageName, dataType, retries = 2) {
|
|
255
|
+
switch (_lodash.default.toLower(dataType)) {
|
|
256
|
+
case 'batteryinfo':
|
|
257
|
+
return await getBatteryInfo.bind(this)(retries);
|
|
258
|
+
case 'cpuinfo':
|
|
259
|
+
return await getCPUInfo.bind(this)(packageName, retries);
|
|
260
|
+
case 'memoryinfo':
|
|
261
|
+
return await getMemoryInfo.bind(this)(packageName, retries);
|
|
262
|
+
case 'networkinfo':
|
|
263
|
+
return await getNetworkTrafficInfo.bind(this)(retries);
|
|
264
|
+
default:
|
|
265
|
+
throw new Error(`No performance data of type '${dataType}' found. ` + `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
commands.mobileGetPerformanceData = async function mobileGetPerformanceData(opts = {}) {
|
|
269
|
+
const {
|
|
270
|
+
packageName,
|
|
271
|
+
dataType
|
|
272
|
+
} = (0, _utils.requireArgs)(['packageName', 'dataType'], opts);
|
|
273
|
+
return await this.getPerformanceData(packageName, dataType);
|
|
264
274
|
};
|
|
265
|
-
|
|
266
|
-
var _default = extensions;
|
|
275
|
+
var _default = commands;
|
|
267
276
|
exports.default = _default;
|
|
268
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsIk5FVFdPUktfS0VZUyIsIkNQVV9LRVlTIiwiQkFUVEVSWV9LRVlTIiwiTUVNT1JZX0tFWVMiLCJTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyIsIk9iamVjdCIsImZyZWV6ZSIsImNwdWluZm8iLCJtZW1vcnlpbmZvIiwiYmF0dGVyeWluZm8iLCJuZXR3b3JraW5mbyIsIk1FTUlORk9fVElUTEVTIiwiTkFUSVZFIiwiREFMVklLIiwiRUdMIiwiR0wiLCJNVFJBQ0siLCJUT1RBTCIsIkhFQVAiLCJSRVRSWV9QQVVTRV9NUyIsInBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSIsImVudHJpZXMiLCJ2YWxEaWN0IiwidHlwZSIsInN1YlR5cGUiLCJuYXRpdmVQc3MiLCJuYXRpdmVQcml2YXRlRGlydHkiLCJuYXRpdmVIZWFwU2l6ZSIsIm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplIiwiZGFsdmlrUHNzIiwiZGFsdmlrUHJpdmF0ZURpcnR5IiwiZWdsUHNzIiwiZWdsUHJpdmF0ZURpcnR5IiwiZ2xQc3MiLCJnbFByaXZhdGVEaXJ0eSIsImxlbmd0aCIsInRvdGFsUHNzIiwidG90YWxQcml2YXRlRGlydHkiLCJwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IiwicGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSIsIm5hdGl2ZVJzcyIsImRhbHZpa1JzcyIsInRvdGFsUnNzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMiLCJfIiwia2V5cyIsImdldFBlcmZvcm1hbmNlRGF0YSIsInBhY2thZ2VOYW1lIiwiZGF0YVR5cGUiLCJyZXRyaWVzIiwidG9Mb3dlciIsImdldEJhdHRlcnlJbmZvIiwiZ2V0Q1BVSW5mbyIsImdldE1lbW9yeUluZm8iLCJnZXROZXR3b3JrVHJhZmZpY0luZm8iLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXRyeUludGVydmFsIiwib3V0cHV0IiwiYWRiIiwic2hlbGwiLCJlIiwic3RkZXJyIiwibG9nIiwiaW5mbyIsInVzYWdlc1BhdHRlcm4iLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtYXRjaCIsImV4ZWMiLCJkZWJ1ZyIsImNtZCIsImRhdGEiLCJwb3dlciIsInBhcnNlSW50Iiwic3BsaXQiLCJ0cmltIiwiTnVtYmVyIiwiaXNOYU4iLCJjbG9uZSIsInRvU3RyaW5nIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImxpbmUiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaGVhZGVycyIsInZhbHVlcyIsIm1hcCIsImhlYWRlciIsInJldHVyblZhbHVlIiwiYnVja2V0RHVyYXRpb24iLCJidWNrZXRTdGFydCIsImFjdGl2ZVRpbWUiLCJyeEJ5dGVzIiwicnhQYWNrZXRzIiwidHhCeXRlcyIsInR4UGFja2V0cyIsIm9wZXJhdGlvbnMiLCJpbmRleCIsImZyb21YdHN0YXRzIiwiaW5kZXhPZiIsInN0YXJ0IiwiZGVsaW1pdGVyIiwiZW5kIiwicGVuZGluZ0J5dGVzIiwic3Vic3RyaW5nIiwiYXJyYXlMaXN0IiwiaiIsImsiLCJyZXR1cm5JbmRleCIsImkiLCJpc0VxdWFsIiwiaXNVbmRlZmluZWQiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvcGVyZm9ybWFuY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBORVRXT1JLX0tFWVMgPSBbXG4gIFsnYnVja2V0U3RhcnQnLCAnYWN0aXZlVGltZScsICdyeEJ5dGVzJywgJ3J4UGFja2V0cycsICd0eEJ5dGVzJywgJ3R4UGFja2V0cycsICdvcGVyYXRpb25zJywgJ2J1Y2tldER1cmF0aW9uJ10sXG4gIFsnc3QnLCAnYWN0aXZlVGltZScsICdyYicsICdycCcsICd0YicsICd0cCcsICdvcCcsICdidWNrZXREdXJhdGlvbiddXG5dO1xuY29uc3QgQ1BVX0tFWVMgPSBbJ3VzZXInLCAna2VybmVsJ107XG5jb25zdCBCQVRURVJZX0tFWVMgPSBbJ3Bvd2VyJ107XG5jb25zdCBNRU1PUllfS0VZUyA9IFtcbiAgJ3RvdGFsUHJpdmF0ZURpcnR5JywgJ25hdGl2ZVByaXZhdGVEaXJ0eScsICdkYWx2aWtQcml2YXRlRGlydHknLFxuICAnZWdsUHJpdmF0ZURpcnR5JywgJ2dsUHJpdmF0ZURpcnR5JyxcbiAgJ3RvdGFsUHNzJywgJ25hdGl2ZVBzcycsICdkYWx2aWtQc3MnLCAnZWdsUHNzJywgJ2dsUHNzJyxcbiAgJ25hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplJywgJ25hdGl2ZUhlYXBTaXplJyxcbiAgJ25hdGl2ZVJzcycsICdkYWx2aWtSc3MnLCAndG90YWxSc3MnXG5dO1xuY29uc3QgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgY3B1aW5mbzogJ3RoZSBhbW91bnQgb2YgY3B1IGJ5IHVzZXIgYW5kIGtlcm5lbCBwcm9jZXNzIC0gY3B1IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJyxcbiAgbWVtb3J5aW5mbzogJ3RoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHByb2Nlc3MgLSBtZW1vcnkgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBiYXR0ZXJ5aW5mbzogJ3RoZSByZW1haW5pbmcgYmF0dGVyeSBwb3dlciAtIGJhdHRlcnkgcG93ZXIgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBuZXR3b3JraW5mbzogJ3RoZSBuZXR3b3JrIHN0YXRpc3RpY3MgLSBuZXR3b3JrIHJ4L3R4IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJ1xufSk7XG5jb25zdCBNRU1JTkZPX1RJVExFUyA9IE9iamVjdC5mcmVlemUoe1xuICBOQVRJVkU6ICdOYXRpdmUnLFxuICBEQUxWSUs6ICdEYWx2aWsnLFxuICBFR0w6ICdFR0wnLFxuICBHTDogJ0dMJyxcbiAgTVRSQUNLOiAnbXRyYWNrJyxcbiAgVE9UQUw6ICdUT1RBTCcsXG4gIEhFQVA6ICdIZWFwJ1xufSk7XG5jb25zdCBSRVRSWV9QQVVTRV9NUyA9IDEwMDA7XG5cbi8qKlxuICogQVBJIGxldmVsIGJldHdlZW4gMTggYW5kIDMwXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqIGV4Y2VwdCAnVE9UQUwnLCB3aGljaCBza2lwcyB0aGUgc2Vjb25kIHR5cGUgbmFtZVxuICogISEhIHZhbERpY3QgZ2V0cyBtdXRhdGVkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDgpIHtcbiAgICAvLyB0aGVyZSBhcmUgdHdvIHRvdGFscywgYW5kIHdlIG9ubHkgd2FudCB0aGUgZnVsbCBsaXN0aW5nLCB3aGljaCBoYXMgOCBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8qKlxuICogWyc8U3lzdGVtIFR5cGUnLCAnPHBwcz4nLCAnPHNoYXJlZCBkaXJ0eT4nLCAnPHByaXZhdGUgZGlydHk+JywgJzxoZWFwIHNpemU+JywgJzxoZWFwIGFsbG9jPicsICc8aGVhcCBmcmVlPiddXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQmVsb3cxOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCB0eXBlID0gZW50cmllc1swXTtcbiAgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLk5BVElWRSkge1xuICAgIFssIHZhbERpY3QubmF0aXZlUHNzLCwgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUspIHtcbiAgICBbLCB2YWxEaWN0LmRhbHZpa1BzcywsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMKSB7XG4gICAgWywgdmFsRGljdC5lZ2xQc3MsLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMKSB7XG4gICAgWywgdmFsRGljdC5nbFBzcywsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCkge1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkgbGV2ZWwgMzAgYW5kIGFib3ZlXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8cnNzIHRvdGFsPiwgPGhlYXAgc2l6ZT4sIDxoZWFwIGFsbG9jPiwgPGhlYXAgZnJlZT5dXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlUnNzLCB2YWxEaWN0Lm5hdGl2ZUhlYXBTaXplLCB2YWxEaWN0Lm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuREFMVklLICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5kYWx2aWtQc3MsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QuZGFsdmlrUnNzXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmVnbFBzcywgdmFsRGljdC5lZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5HTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5nbFBzcywgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMICYmIGVudHJpZXMubGVuZ3RoID09PSA5KSB7XG4gICAgLy8gaGFzIDkgZW50cmllc1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHksLCwgdmFsRGljdC50b3RhbFJzc10gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8vXG4vLyByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbi8vIG91dHB1dCAtIGFycmF5IGxpa2UgYmVsb3dcbi8vIFtjcHVpbmZvLCBiYXR0ZXJ5aW5mbywgbmV0d29ya2luZm8sIG1lbW9yeWluZm9dXG4vL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMgPSBmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyAoKSB7XG4gIHJldHVybiBfLmtleXMoU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgaW5mb3JtYXRpb24gdHlwZSBvZiB0aGUgc3lzdGVtIHN0YXRlIHdoaWNoIGlzIHN1cHBvcnRlZCB0byByZWFkIGFzIGxpa2UgY3B1LCBtZW1vcnksIG5ldHdvcmsgdHJhZmZpYywgYW5kIGJhdHRlcnkuXG4gKiBpbnB1dCAtIChwYWNrYWdlTmFtZSkgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAqICAgICAgICAoZGF0YVR5cGUpIHRoZSB0eXBlIG9mIHN5c3RlbSBzdGF0ZSB3aGljaCB3YW50cyB0byByZWFkLiBJdCBzaG91bGQgYmUgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFU1xuICogICAgICAgIChkYXRhUmVhZFRpbWVvdXQpIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gcmVhZFxuICogb3V0cHV0IC0gdGFibGUgb2YgdGhlIHBlcmZvcm1hbmNlIGRhdGEsIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSB0YWJsZSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGRhdGEuIFRoZSByZW1haW5pbmcgbGluZXMgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlIGRhdGEuXG4gKlxuICogaW4gY2FzZSBvZiBiYXR0ZXJ5IGluZm8gOiBbW3Bvd2VyXSwgWzIzXV1cbiAqIGluIGNhc2Ugb2YgbWVtb3J5IGluZm8gOiAgW1t0b3RhbFByaXZhdGVEaXJ0eSwgbmF0aXZlUHJpdmF0ZURpcnR5LCBkYWx2aWtQcml2YXRlRGlydHksIGVnbFByaXZhdGVEaXJ0eSwgZ2xQcml2YXRlRGlydHksIHRvdGFsUHNzLFxuICogICBuYXRpdmVQc3MsIGRhbHZpa1BzcywgZWdsUHNzLCBnbFBzcywgbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUsIG5hdGl2ZUhlYXBTaXplXSwgWzE4MzYwLCA4Mjk2LCA2MTMyLCBudWxsLCBudWxsLCA0MjU4OCwgODQwNiwgNzAyNCwgbnVsbCwgbnVsbCwgMjY1MTksIDEwMzQ0XV1cbiAqIGluIGNhc2Ugb2YgbmV0d29yayBpbmZvIDogW1tidWNrZXRTdGFydCwgYWN0aXZlVGltZSwgcnhCeXRlcywgcnhQYWNrZXRzLCB0eEJ5dGVzLCB0eFBhY2tldHMsIG9wZXJhdGlvbnMsIGJ1Y2tldER1cmF0aW9uLF0sXG4gKiAgIFsxNDc4MDkxNjAwMDAwLCBudWxsLCAxMDk5MDc1LCA2MTA5NDcsIDkyOCwgMTE0MzYyLCA3NjksIDAsIDM2MDAwMDBdLCBbMTQ3ODA5NTIwMDAwMCwgbnVsbCwgMTMwNjMwMCwgNDA1OTk3LCA1MDksIDQ2MzU5LCAzNzAsIDAsIDM2MDAwMDBdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW3N0LCBhY3RpdmVUaW1lLCByYiwgcnAsIHRiLCB0cCwgb3AsIGJ1Y2tldER1cmF0aW9uXSwgWzE0NzgwODgwMDAsIG51bGwsIG51bGwsIDMyMTE1Mjk2LCAzNDI5MSwgMjk1NjgwNSwgMjU3MDUsIDAsIDM2MDBdLFxuICogICBbMTQ3ODA5MTYwMCwgbnVsbCwgbnVsbCwgMjcxNDY4MywgMTE4MjEsIDE0MjA1NjQsIDEyNjUwLCAwLCAzNjAwXSwgWzE0NzgwOTUyMDAsIG51bGwsIG51bGwsIDEwMDc5MjEzLCAxOTk2MiwgMjQ4NzcwNSwgMjAwMTUsIDAsIDM2MDBdLFxuICogICBbMTQ3ODA5ODgwMCwgbnVsbCwgbnVsbCwgNDQ0NDQzMywgMTAyMjcsIDE0MzAzNTYsIDEwNDkzLCAwLCAzNjAwXV1cbiAqIGluIGNhc2Ugb2YgY3B1IGluZm8gOiBbW3VzZXIsIGtlcm5lbF0sIFswLjksIDEuM11dXG4gKi9cbmNvbW1hbmRzLmdldFBlcmZvcm1hbmNlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YSAocGFja2FnZU5hbWUsIGRhdGFUeXBlLCByZXRyaWVzID0gMikge1xuICBzd2l0Y2ggKF8udG9Mb3dlcihkYXRhVHlwZSkpIHtcbiAgICBjYXNlICdiYXR0ZXJ5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRCYXR0ZXJ5SW5mbyhyZXRyaWVzKTtcbiAgICBjYXNlICdjcHVpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENQVUluZm8ocGFja2FnZU5hbWUsIHJldHJpZXMpO1xuICAgIGNhc2UgJ21lbW9yeWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TWVtb3J5SW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbmV0d29ya2luZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvKHJldHJpZXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBlcmZvcm1hbmNlIGRhdGEgb2YgdHlwZSAnJHtkYXRhVHlwZX0nIGZvdW5kLiBgICtcbiAgICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZDogJHtKU09OLnN0cmluZ2lmeShTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUywgJyAnLCAyKX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIENQVSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBnaXZlbiBwYWNrYWdlTmFtZS5cbiAqIEl0IHJhaXNlcyBhbiBleGNlcHRpb24gaWYgdGhlIGR1bXBlZCBDUFUgaW5mb3JtYXRpb24gZGlkIG5vdCBpbmNsdWRlIHRoZSBnaXZlbiBwYWNrYWdlTmFtZVxuICogb3IgdGhlIGZvcm1hdCB3YXMgd3JvbmcuXG4gKiBUaGUgQ1BVIGluZm9ybWF0aW9uJ3Mgc2FtcGxpbmcgaW50ZXJ2YWwgZGVwZW5kcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBGb3IgZXhhbXBsZSwgc29tZSBkZXZpY2VzIGhhdmUgNSBtaW51dGVzIGludGVydmFsLiBXaGVuIHlvdSBnZXQgdGhlIGluZm9ybWF0aW9uXG4gKiBmcm9tIDIwMjMtMDItMDcgMTE6NTk6NDAuNDY4IHRvIDIwMjMtMDItMDcgMTI6MDQ6NDAuNTU2LCB0aGVuIHRoZSBuZXh0IHdpbGwgYmVcbiAqIGZyb20gMjAyMy0wMi0wNyAxMjowNDo0MC41NTYgdG8gMjAyMy0wMi0wNyAxMjowOTo0MC42NjguIE5vIHByb2Nlc3MgaW5mb3JtYXRpb25cbiAqIGV4aXN0cyBpbiB0aGUgcmVzdWx0IGlmIHRoZSBwcm9jZXNzIHdhcyBub3QgcnVubmluZyBkdXJpbmcgdGhlIHBlcmlvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZSB0byBnZXQgdGhlIENQVSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFRoZSBudW1iZXIgb2YgcmV0cnkgY291bnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBvZiB0aGUgcGFyc2VkIENQVSB1cHNhZ2UgcGVyY2VudGFnZXMuXG4gKiAgICAgICAgICAgICAgICAgIGUuZy4gWydjcHVpbmZvJywgWycxNC4zJywgJzI4LjInXV1cbiAqICAgICAgICAgICAgICAgICAgJzE0LjMnIGlzIHVzYWdlIGJ5IHRoZSB1c2VyICglKSwgJzI4LjInIGlzIHVzYWdlIGJ5IHRoZSBrZXJuZWwgKCUpXG4gKiBAdGhyb3cge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gcGFyc2UgdGhlIHJlc3VsdCBvZiBkdW1wc3lzLCBvciBubyBwYWNrYWdlIG5hbWUgZXhpc3RzLlxuICovXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUVBLE1BQU1FLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRW5ELE1BQU1JLFlBQVksR0FBRyxDQUNuQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxnQkFB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
|
|
277
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJfdXRpbHMiLCJjb21tYW5kcyIsImV4cG9ydHMiLCJORVRXT1JLX0tFWVMiLCJDUFVfS0VZUyIsIkJBVFRFUllfS0VZUyIsIk1FTU9SWV9LRVlTIiwiU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMiLCJPYmplY3QiLCJmcmVlemUiLCJjcHVpbmZvIiwibWVtb3J5aW5mbyIsImJhdHRlcnlpbmZvIiwibmV0d29ya2luZm8iLCJNRU1JTkZPX1RJVExFUyIsIk5BVElWRSIsIkRBTFZJSyIsIkVHTCIsIkdMIiwiTVRSQUNLIiwiVE9UQUwiLCJIRUFQIiwiUkVUUllfUEFVU0VfTVMiLCJwYXJzZU1lbWluZm9Gb3JBcGkxOVRvMjkiLCJlbnRyaWVzIiwidmFsRGljdCIsInR5cGUiLCJzdWJUeXBlIiwibmF0aXZlUHNzIiwibmF0aXZlUHJpdmF0ZURpcnR5IiwibmF0aXZlSGVhcFNpemUiLCJuYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZSIsImRhbHZpa1BzcyIsImRhbHZpa1ByaXZhdGVEaXJ0eSIsImVnbFBzcyIsImVnbFByaXZhdGVEaXJ0eSIsImdsUHNzIiwiZ2xQcml2YXRlRGlydHkiLCJsZW5ndGgiLCJ0b3RhbFBzcyIsInRvdGFsUHJpdmF0ZURpcnR5IiwicGFyc2VNZW1pbmZvRm9yQXBpQmVsb3cxOSIsInBhcnNlTWVtaW5mb0ZvckFwaUFib3ZlMjkiLCJuYXRpdmVSc3MiLCJkYWx2aWtSc3MiLCJ0b3RhbFJzcyIsImdldE1lbW9yeUluZm8iLCJwYWNrYWdlTmFtZSIsInJldHJpZXMiLCJyZXRyeUludGVydmFsIiwiY21kIiwiZGF0YSIsImFkYiIsInNoZWxsIiwiRXJyb3IiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwibGluZSIsInNwbGl0IiwidHJpbSIsImZpbHRlciIsIkJvb2xlYW4iLCJoZWFkZXJzIiwiXyIsImNsb25lIiwidmFsdWVzIiwibWFwIiwiaGVhZGVyIiwiZ2V0TmV0d29ya1RyYWZmaWNJbmZvIiwicmV0dXJuVmFsdWUiLCJidWNrZXREdXJhdGlvbiIsImJ1Y2tldFN0YXJ0IiwiYWN0aXZlVGltZSIsInJ4Qnl0ZXMiLCJyeFBhY2tldHMiLCJ0eEJ5dGVzIiwidHhQYWNrZXRzIiwib3BlcmF0aW9ucyIsImluZGV4IiwiZnJvbVh0c3RhdHMiLCJpbmRleE9mIiwic3RhcnQiLCJkZWxpbWl0ZXIiLCJlbmQiLCJwZW5kaW5nQnl0ZXMiLCJzdWJzdHJpbmciLCJhcnJheUxpc3QiLCJqIiwiayIsInJldHVybkluZGV4IiwiaSIsImlzRXF1YWwiLCJpc1VuZGVmaW5lZCIsImdldENQVUluZm8iLCJvdXRwdXQiLCJlIiwic3RkZXJyIiwibG9nIiwiaW5mbyIsInVzYWdlc1BhdHRlcm4iLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtYXRjaCIsImV4ZWMiLCJkZWJ1ZyIsImdldEJhdHRlcnlJbmZvIiwicG93ZXIiLCJwYXJzZUludCIsIk51bWJlciIsImlzTmFOIiwidG9TdHJpbmciLCJnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyIsImtleXMiLCJnZXRQZXJmb3JtYW5jZURhdGEiLCJkYXRhVHlwZSIsInRvTG93ZXIiLCJiaW5kIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1vYmlsZUdldFBlcmZvcm1hbmNlRGF0YSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJmb3JtYW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHJlcXVpcmVBcmdzIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBORVRXT1JLX0tFWVMgPSBbXG4gIFsnYnVja2V0U3RhcnQnLCAnYWN0aXZlVGltZScsICdyeEJ5dGVzJywgJ3J4UGFja2V0cycsICd0eEJ5dGVzJywgJ3R4UGFja2V0cycsICdvcGVyYXRpb25zJywgJ2J1Y2tldER1cmF0aW9uJ10sXG4gIFsnc3QnLCAnYWN0aXZlVGltZScsICdyYicsICdycCcsICd0YicsICd0cCcsICdvcCcsICdidWNrZXREdXJhdGlvbiddXG5dO1xuY29uc3QgQ1BVX0tFWVMgPSBbJ3VzZXInLCAna2VybmVsJ107XG5jb25zdCBCQVRURVJZX0tFWVMgPSBbJ3Bvd2VyJ107XG5jb25zdCBNRU1PUllfS0VZUyA9IFtcbiAgJ3RvdGFsUHJpdmF0ZURpcnR5JywgJ25hdGl2ZVByaXZhdGVEaXJ0eScsICdkYWx2aWtQcml2YXRlRGlydHknLFxuICAnZWdsUHJpdmF0ZURpcnR5JywgJ2dsUHJpdmF0ZURpcnR5JyxcbiAgJ3RvdGFsUHNzJywgJ25hdGl2ZVBzcycsICdkYWx2aWtQc3MnLCAnZWdsUHNzJywgJ2dsUHNzJyxcbiAgJ25hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplJywgJ25hdGl2ZUhlYXBTaXplJyxcbiAgJ25hdGl2ZVJzcycsICdkYWx2aWtSc3MnLCAndG90YWxSc3MnXG5dO1xuY29uc3QgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgY3B1aW5mbzogJ3RoZSBhbW91bnQgb2YgY3B1IGJ5IHVzZXIgYW5kIGtlcm5lbCBwcm9jZXNzIC0gY3B1IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJyxcbiAgbWVtb3J5aW5mbzogJ3RoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHByb2Nlc3MgLSBtZW1vcnkgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBiYXR0ZXJ5aW5mbzogJ3RoZSByZW1haW5pbmcgYmF0dGVyeSBwb3dlciAtIGJhdHRlcnkgcG93ZXIgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBuZXR3b3JraW5mbzogJ3RoZSBuZXR3b3JrIHN0YXRpc3RpY3MgLSBuZXR3b3JrIHJ4L3R4IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJ1xufSk7XG5jb25zdCBNRU1JTkZPX1RJVExFUyA9IE9iamVjdC5mcmVlemUoe1xuICBOQVRJVkU6ICdOYXRpdmUnLFxuICBEQUxWSUs6ICdEYWx2aWsnLFxuICBFR0w6ICdFR0wnLFxuICBHTDogJ0dMJyxcbiAgTVRSQUNLOiAnbXRyYWNrJyxcbiAgVE9UQUw6ICdUT1RBTCcsXG4gIEhFQVA6ICdIZWFwJ1xufSk7XG5jb25zdCBSRVRSWV9QQVVTRV9NUyA9IDEwMDA7XG5cbi8qKlxuICogQVBJIGxldmVsIGJldHdlZW4gMTggYW5kIDMwXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqIGV4Y2VwdCAnVE9UQUwnLCB3aGljaCBza2lwcyB0aGUgc2Vjb25kIHR5cGUgbmFtZVxuICogISEhIHZhbERpY3QgZ2V0cyBtdXRhdGVkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDgpIHtcbiAgICAvLyB0aGVyZSBhcmUgdHdvIHRvdGFscywgYW5kIHdlIG9ubHkgd2FudCB0aGUgZnVsbCBsaXN0aW5nLCB3aGljaCBoYXMgOCBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8qKlxuICogWyc8U3lzdGVtIFR5cGUnLCAnPHBwcz4nLCAnPHNoYXJlZCBkaXJ0eT4nLCAnPHByaXZhdGUgZGlydHk+JywgJzxoZWFwIHNpemU+JywgJzxoZWFwIGFsbG9jPicsICc8aGVhcCBmcmVlPiddXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQmVsb3cxOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCB0eXBlID0gZW50cmllc1swXTtcbiAgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLk5BVElWRSkge1xuICAgIFssIHZhbERpY3QubmF0aXZlUHNzLCwgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUspIHtcbiAgICBbLCB2YWxEaWN0LmRhbHZpa1BzcywsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMKSB7XG4gICAgWywgdmFsRGljdC5lZ2xQc3MsLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMKSB7XG4gICAgWywgdmFsRGljdC5nbFBzcywsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCkge1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkgbGV2ZWwgMzAgYW5kIGFib3ZlXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8cnNzIHRvdGFsPiwgPGhlYXAgc2l6ZT4sIDxoZWFwIGFsbG9jPiwgPGhlYXAgZnJlZT5dXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlUnNzLCB2YWxEaWN0Lm5hdGl2ZUhlYXBTaXplLCB2YWxEaWN0Lm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuREFMVklLICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5kYWx2aWtQc3MsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QuZGFsdmlrUnNzXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmVnbFBzcywgdmFsRGljdC5lZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5HTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5nbFBzcywgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMICYmIGVudHJpZXMubGVuZ3RoID09PSA5KSB7XG4gICAgLy8gaGFzIDkgZW50cmllc1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHksLCwgdmFsRGljdC50b3RhbFJzc10gPSBlbnRyaWVzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbi8qKlxuICogQHRoaXMge0FuZHJvaWREcml2ZXJ9XG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cmllc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrVHJhZmZpY0luZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gW107XG4gICAgbGV0IGJ1Y2tldER1cmF0aW9uLCBidWNrZXRTdGFydCwgYWN0aXZlVGltZSwgcnhCeXRlcywgcnhQYWNrZXRzLCB0eEJ5dGVzLCB0eFBhY2tldHMsIG9wZXJhdGlvbnM7XG5cbiAgICBsZXQgY21kID0gWydkdW1wc3lzJywgJ25ldHN0YXRzJ107XG4gICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xuICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhIGZyb20gZHVtcHN5cycpOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIC8vIEluIGNhc2Ugb2YgbmV0d29yayB0cmFmZmljIGluZm9ybWF0aW9uLCBpdCBpcyBkaWZmZXJlbnQgZm9yIHRoZSByZXR1cm4gZGF0YSBiZXR3ZWVuIGVtdWxhdG9yIGFuZCByZWFsIGRldmljZS5cbiAgICAvLyB0aGUgcmV0dXJuIGRhdGEgb2YgZW11bGF0b3JcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogMzkyNTBcbiAgICAvLyAgIEhpc3Rvcnkgc2luY2UgYm9vdDpcbiAgICAvLyAgIGlkZW50PVtbdHlwZT1XSUZJLCBzdWJUeXBlPUNPTUJJTkVELCBuZXR3b3JrSWQ9XCJXaXJlZFNTSURcIl1dIHVpZD0tMSBzZXQ9QUxMIHRhZz0weDBcbiAgICAvLyAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDAwMDBcbiAgICAvLyAgIGJ1Y2tldFN0YXJ0PTE0NzgwOTg4MDAwMDAgYWN0aXZlVGltZT0zMTgyNCByeEJ5dGVzPTIxNTAyIHJ4UGFja2V0cz03OCB0eEJ5dGVzPTE3NzQ4IHR4UGFja2V0cz05MCBvcGVyYXRpb25zPTBcbiAgICAvL1xuICAgIC8vIDcuMVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiA0ODE0ODdcbiAgICAvLyAgIEhpc3Rvcnkgc2luY2UgYm9vdDpcbiAgICAvLyAgIGlkZW50PVt7dHlwZT1NT0JJTEUsIHN1YlR5cGU9Q09NQklORUQsIHN1YnNjcmliZXJJZD0zMTAyNjAuLi4sIG1ldGVyZWQ9dHJ1ZX1dIHVpZD0tMSBzZXQ9QUxMIHRhZz0weDBcbiAgICAvLyAgICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODQ4MDAgcmI9MCBycD0wIHRiPTEyMDMxIHRwPTE4NCBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk4ODQwMCByYj0wIHJwPTAgdGI9Mzg0NzYgdHA9NTg3IG9wPTBcbiAgICAvLyAgICAgICBzdD0xNDgzOTk5MjAwIHJiPTMxNTYxNiBycD00MDAgdGI9OTQ4MDAgdHA9MzYyIG9wPTBcbiAgICAvLyAgICAgICBzdD0xNDg0MDAyODAwIHJiPTE1ODI2IHJwPTIwIHRiPTQ3MzggdHA9MTYgb3A9MFxuICAgIC8vXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIHJlYWwgZGV2aWNlXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDBcbiAgICAvLyAgIEhpc3Rvcnkgc2luY2UgYm9vdDpcbiAgICAvLyAgIGlkZW50PVt7dHlwZT1NT0JJTEUsIHN1YlR5cGU9Q09NQklORUQsIHN1YnNjcmliZXJJZD00NTAwNTAuLi59XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwXG4gICAgLy8gICBzdD0xNDc4MDg4MDAwIHJiPTMyMTE1Mjk2IHJwPTM0MjkxIHRiPTI5NTY4MDUgdHA9MjU3MDUgb3A9MFxuICAgIC8vICAgc3Q9MTQ3ODA5MTYwMCByYj0yNzE0NjgzIHJwPTExODIxIHRiPTE0MjA1NjQgdHA9MTI2NTAgb3A9MFxuICAgIC8vICAgc3Q9MTQ3ODA5NTIwMCByYj0xMDA3OTIxMyBycD0xOTk2MiB0Yj0yNDg3NzA1IHRwPTIwMDE1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTg4MDAgcmI9NDQ0NDQzMyBycD0xMDIyNyB0Yj0xNDMwMzU2IHRwPTEwNDkzIG9wPTBcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGxldCBmcm9tWHRzdGF0cyA9IGRhdGEuaW5kZXhPZignWHQgc3RhdHM6Jyk7XG5cbiAgICBsZXQgc3RhcnQgPSBkYXRhLmluZGV4T2YoJ1BlbmRpbmcgYnl0ZXM6JywgZnJvbVh0c3RhdHMpO1xuICAgIGxldCBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJzonLCBzdGFydCArIDEpO1xuICAgIGxldCBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgIGxldCBwZW5kaW5nQnl0ZXMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdidWNrZXREdXJhdGlvbicsIGVuZCArIDEpO1xuICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignXFxuJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICBidWNrZXREdXJhdGlvbiA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICBkYXRhID0gZGF0YS5zdWJzdHJpbmcoZW5kICsgMSwgZGF0YS5sZW5ndGgpO1xuICAgICAgbGV0IGFycmF5TGlzdCA9IGRhdGEuc3BsaXQoJ1xcbicpO1xuXG4gICAgICBpZiAoYXJyYXlMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RhcnQgPSAtMTtcblxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IE5FVFdPUktfS0VZUy5sZW5ndGg7ICsraikge1xuICAgICAgICAgIHN0YXJ0ID0gYXJyYXlMaXN0WzBdLmluZGV4T2YoTkVUV09SS19LRVlTW2pdWzBdKTtcblxuICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBpbmRleCA9IGo7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZVswXSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IE5FVFdPUktfS0VZU1tqXS5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICByZXR1cm5WYWx1ZVswXVtrXSA9IE5FVFdPUktfS0VZU1tqXVtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXR1cm5JbmRleCA9IDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZGF0YSA9IGFycmF5TGlzdFtpXTtcbiAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzBdKTtcblxuICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICBidWNrZXRTdGFydCA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMV0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgYWN0aXZlVGltZSA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVsyXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeEJ5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzNdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIHJ4UGFja2V0cyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs0XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eEJ5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzVdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIHR4UGFja2V0cyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs2XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25zID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuVmFsdWVbcmV0dXJuSW5kZXgrK10gPSBbYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zLCBidWNrZXREdXJhdGlvbl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRXF1YWwocGVuZGluZ0J5dGVzLCAnJykgJiYgIV8uaXNVbmRlZmluZWQocGVuZGluZ0J5dGVzKSAmJiAhXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJ25vZGV4JykpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbmV0d29yayB0cmFmZmljIGRhdGE6ICcke2RhdGF9J2ApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBDUFUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZ2l2ZW4gcGFja2FnZU5hbWUuXG4gKiBJdCByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBkdW1wZWQgQ1BVIGluZm9ybWF0aW9uIGRpZCBub3QgaW5jbHVkZSB0aGUgZ2l2ZW4gcGFja2FnZU5hbWVcbiAqIG9yIHRoZSBmb3JtYXQgd2FzIHdyb25nLlxuICogVGhlIENQVSBpbmZvcm1hdGlvbidzIHNhbXBsaW5nIGludGVydmFsIGRlcGVuZHMgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogRm9yIGV4YW1wbGUsIHNvbWUgZGV2aWNlcyBoYXZlIDUgbWludXRlcyBpbnRlcnZhbC4gV2hlbiB5b3UgZ2V0IHRoZSBpbmZvcm1hdGlvblxuICogZnJvbSAyMDIzLTAyLTA3IDExOjU5OjQwLjQ2OCB0byAyMDIzLTAyLTA3IDEyOjA0OjQwLjU1NiwgdGhlbiB0aGUgbmV4dCB3aWxsIGJlXG4gKiBmcm9tIDIwMjMtMDItMDcgMTI6MDQ6NDAuNTU2IHRvIDIwMjMtMDItMDcgMTI6MDk6NDAuNjY4LiBObyBwcm9jZXNzIGluZm9ybWF0aW9uXG4gKiBleGlzdHMgaW4gdGhlIHJlc3VsdCBpZiB0aGUgcHJvY2VzcyB3YXMgbm90IHJ1bm5pbmcgZHVyaW5nIHRoZSBwZXJpb2QuXG4gKlxuICogQHRoaXMge0FuZHJvaWREcml2ZXJ9XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZSB0byBnZXQgdGhlIENQVSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFRoZSBudW1iZXIgb2YgcmV0cnkgY291bnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBvZiB0aGUgcGFyc2VkIENQVSB1cHNhZ2UgcGVyY2VudGFnZXMuXG4gKiAgICAgICAgICAgICAgICAgIGUuZy4gWydjcHVpbmZvJywgWycxNC4zJywgJzI4LjInXV1cbiAqICAgICAgICAgICAgICAgICAgJzE0LjMnIGlzIHVzYWdlIGJ5IHRoZSB1c2VyICglKSwgJzI4LjInIGlzIHVzYWdlIGJ5IHRoZSBrZXJuZWwgKCUpXG4gKiBAdGhyb3cge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gcGFyc2UgdGhlIHJlc3VsdCBvZiBkdW1wc3lzLCBvciBubyBwYWNrYWdlIG5hbWUgZXhpc3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQHRoaXMge0FuZHJvaWREcml2ZXJ9XG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cmllc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCYXR0ZXJ5SW5mbyAocmV0cmllcyA9IDIpIHtcbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY21kID0gWydkdW1wc3lzJywgJ2JhdHRlcnknLCAnfCcsICdncmVwJywgJ2xldmVsJ107XG4gICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xuICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhIGZyb20gZHVtcHN5cycpOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIGxldCBwb3dlciA9IHBhcnNlSW50KChkYXRhLnNwbGl0KCc6JylbMV0gfHwgJycpLnRyaW0oKSwgMTApO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4ocG93ZXIpKSB7XG4gICAgICByZXR1cm4gW18uY2xvbmUoQkFUVEVSWV9LRVlTKSwgW3Bvd2VyLnRvU3RyaW5nKCldXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgYmF0dGVyeSBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vL1xuLy8gcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gdHlwZSBvZiB0aGUgc3lzdGVtIHN0YXRlIHdoaWNoIGlzIHN1cHBvcnRlZCB0byByZWFkIGFzIGxpa2UgY3B1LCBtZW1vcnksIG5ldHdvcmsgdHJhZmZpYywgYW5kIGJhdHRlcnkuXG4vLyBvdXRwdXQgLSBhcnJheSBsaWtlIGJlbG93XG4vLyBbY3B1aW5mbywgYmF0dGVyeWluZm8sIG5ldHdvcmtpbmZvLCBtZW1vcnlpbmZvXVxuLy9cbmNvbW1hbmRzLmdldFBlcmZvcm1hbmNlRGF0YVR5cGVzID0gZnVuY3Rpb24gZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMgKCkge1xuICByZXR1cm4gXy5rZXlzKFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTKTtcbn07XG5cbi8qKlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIHR5cGUgb2YgdGhlIHN5c3RlbSBzdGF0ZSB3aGljaCBpcyBzdXBwb3J0ZWQgdG8gcmVhZCBhcyBsaWtlIGNwdSwgbWVtb3J5LCBuZXR3b3JrIHRyYWZmaWMsIGFuZCBiYXR0ZXJ5LlxuICogaW5wdXQgLSAocGFja2FnZU5hbWUpIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKiAgICAgICAgKGRhdGFUeXBlKSB0aGUgdHlwZSBvZiBzeXN0ZW0gc3RhdGUgd2hpY2ggd2FudHMgdG8gcmVhZC4gSXQgc2hvdWxkIGJlIG9uZSBvZiB0aGUga2V5cyBvZiB0aGUgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVNcbiAqICAgICAgICAoZGF0YVJlYWRUaW1lb3V0KSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIHRvIHJlYWRcbiAqIG91dHB1dCAtIHRhYmxlIG9mIHRoZSBwZXJmb3JtYW5jZSBkYXRhLCBUaGUgZmlyc3QgbGluZSBvZiB0aGUgdGFibGUgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiBkYXRhLiBUaGUgcmVtYWluaW5nIGxpbmVzIHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIHRoZSBkYXRhLlxuICpcbiAqIGluIGNhc2Ugb2YgYmF0dGVyeSBpbmZvIDogW1twb3dlcl0sIFsyM11dXG4gKiBpbiBjYXNlIG9mIG1lbW9yeSBpbmZvIDogIFtbdG90YWxQcml2YXRlRGlydHksIG5hdGl2ZVByaXZhdGVEaXJ0eSwgZGFsdmlrUHJpdmF0ZURpcnR5LCBlZ2xQcml2YXRlRGlydHksIGdsUHJpdmF0ZURpcnR5LCB0b3RhbFBzcyxcbiAqICAgbmF0aXZlUHNzLCBkYWx2aWtQc3MsIGVnbFBzcywgZ2xQc3MsIG5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplLCBuYXRpdmVIZWFwU2l6ZV0sIFsxODM2MCwgODI5NiwgNjEzMiwgbnVsbCwgbnVsbCwgNDI1ODgsIDg0MDYsIDcwMjQsIG51bGwsIG51bGwsIDI2NTE5LCAxMDM0NF1dXG4gKiBpbiBjYXNlIG9mIG5ldHdvcmsgaW5mbyA6IFtbYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zLCBidWNrZXREdXJhdGlvbixdLFxuICogICBbMTQ3ODA5MTYwMDAwMCwgbnVsbCwgMTA5OTA3NSwgNjEwOTQ3LCA5MjgsIDExNDM2MiwgNzY5LCAwLCAzNjAwMDAwXSwgWzE0NzgwOTUyMDAwMDAsIG51bGwsIDEzMDYzMDAsIDQwNTk5NywgNTA5LCA0NjM1OSwgMzcwLCAwLCAzNjAwMDAwXV1cbiAqIGluIGNhc2Ugb2YgbmV0d29yayBpbmZvIDogW1tzdCwgYWN0aXZlVGltZSwgcmIsIHJwLCB0YiwgdHAsIG9wLCBidWNrZXREdXJhdGlvbl0sIFsxNDc4MDg4MDAwLCBudWxsLCBudWxsLCAzMjExNTI5NiwgMzQyOTEsIDI5NTY4MDUsIDI1NzA1LCAwLCAzNjAwXSxcbiAqICAgWzE0NzgwOTE2MDAsIG51bGwsIG51bGwsIDI3MTQ2ODMsIDExODIxLCAxNDIwNTY0LCAxMjY1MCwgMCwgMzYwMF0sIFsxNDc4MDk1MjAwLCBudWxsLCBudWxsLCAxMDA3OTIxMywgMTk5NjIsIDI0ODc3MDUsIDIwMDE1LCAwLCAzNjAwXSxcbiAqICAgWzE0NzgwOTg4MDAsIG51bGwsIG51bGwsIDQ0NDQ0MzMsIDEwMjI3LCAxNDMwMzU2LCAxMDQ5MywgMCwgMzYwMF1dXG4gKiBpbiBjYXNlIG9mIGNwdSBpbmZvIDogW1t1c2VyLCBrZXJuZWxdLCBbMC45LCAxLjNdXVxuICovXG5jb21tYW5kcy5nZXRQZXJmb3JtYW5jZURhdGEgPSBhc3luYyBmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZURhdGEgKHBhY2thZ2VOYW1lLCBkYXRhVHlwZSwgcmV0cmllcyA9IDIpIHtcbiAgc3dpdGNoIChfLnRvTG93ZXIoZGF0YVR5cGUpKSB7XG4gICAgY2FzZSAnYmF0dGVyeWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IGdldEJhdHRlcnlJbmZvLmJpbmQodGhpcykocmV0cmllcyk7XG4gICAgY2FzZSAnY3B1aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Q1BVSW5mby5iaW5kKHRoaXMpKHBhY2thZ2VOYW1lLCByZXRyaWVzKTtcbiAgICBjYXNlICdtZW1vcnlpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCBnZXRNZW1vcnlJbmZvLmJpbmQodGhpcykocGFja2FnZU5hbWUsIHJldHJpZXMpO1xuICAgIGNhc2UgJ25ldHdvcmtpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCBnZXROZXR3b3JrVHJhZmZpY0luZm8uYmluZCh0aGlzKShyZXRyaWVzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwZXJmb3JtYW5jZSBkYXRhIG9mIHR5cGUgJyR7ZGF0YVR5cGV9JyBmb3VuZC4gYCArXG4gICAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBzdXBwb3J0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsICcgJywgMil9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGVyZm9ybWFuY2VEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGlkZW50aWZpZXIgdG8gZmV0Y2ggdGhlIGRhdGEgZm9yXG4gKiBAcHJvcGVydHkgeydiYXR0ZXJ5aW5mbycgfCAnY3B1aW5mbycgfCAnbWVtb3J5aW5mbycgfCAnbmV0d29ya2luZm8nfSBkYXRhVHlwZSBPbmUgb2Ygc3VwcG9ydGVkIHN1YnN5c3RlbVxuICogdG8gZmV0Y2ggdGhlIGRhdGEgZm9yLlxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHBlcmZvcm1hbmNlIGRhdGEgYWJvdXQgdGhlIGdpdmVuIEFuZHJvaWQgc3Vic3lzdGVtLlxuICogVGhlIGRhdGEgaXMgcGFyc2VkIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgZHVtcHN5cyB1dGlsaXR5LlxuICpcbiAqIEBwYXJhbSB7UGVyZm9ybWFuY2VEYXRhT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge1Byb21pc2U8YW55W11bXT59IFRoZSBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgc3Vic3lzdGVtLlxuICogSXQgaXMgb3JnaW5pemVkIGludG8gYSB0YWJsZSwgd2hlcmUgdGhlIGZpcnN0IHJvdyByZXByZXNlbnQgY29sdW1uIG5hbWVzXG4gKiBhbmQgdGhlIGZvbGxvd2luZyByb3dzIHJlcHJlc2VudCB0aGUgc2FtcGxlZCBkYXRhIGZvciBlYWNoIGNvbHVtbi5cbiAqIEV4YW1wbGUgb3V0cHV0IGZvciBkaWZmZXJlbnQgZGF0YSB0eXBlczpcbiAqIC0gYmF0dGVyeWluZm86IFtbcG93ZXJdLCBbMjNdXVxuICogLSBtZW1vcnkgaW5mbzogW1t0b3RhbFByaXZhdGVEaXJ0eSwgbmF0aXZlUHJpdmF0ZURpcnR5LCBkYWx2aWtQcml2YXRlRGlydHksIGVnbFByaXZhdGVEaXJ0eSwgZ2xQcml2YXRlRGlydHksIHRvdGFsUHNzLFxuICogICBuYXRpdmVQc3MsIGRhbHZpa1BzcywgZWdsUHNzLCBnbFBzcywgbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUsIG5hdGl2ZUhlYXBTaXplXSwgWzE4MzYwLCA4Mjk2LCA2MTMyLCBudWxsLCBudWxsLCA0MjU4OCwgODQwNiwgNzAyNCwgbnVsbCwgbnVsbCwgMjY1MTksIDEwMzQ0XV1cbiAqIC0gbmV0d29ya2luZm86IFtbYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zLCBidWNrZXREdXJhdGlvbixdLFxuICogICBbMTQ3ODA5MTYwMDAwMCwgbnVsbCwgMTA5OTA3NSwgNjEwOTQ3LCA5MjgsIDExNDM2MiwgNzY5LCAwLCAzNjAwMDAwXSwgWzE0NzgwOTUyMDAwMDAsIG51bGwsIDEzMDYzMDAsIDQwNTk5NywgNTA5LCA0NjM1OSwgMzcwLCAwLCAzNjAwMDAwXV1cbiAqXG4gKiAgIFtbc3QsIGFjdGl2ZVRpbWUsIHJiLCBycCwgdGIsIHRwLCBvcCwgYnVja2V0RHVyYXRpb25dLCBbMTQ3ODA4ODAwMCwgbnVsbCwgbnVsbCwgMzIxMTUyOTYsIDM0MjkxLCAyOTU2ODA1LCAyNTcwNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDkxNjAwLCBudWxsLCBudWxsLCAyNzE0NjgzLCAxMTgyMSwgMTQyMDU2NCwgMTI2NTAsIDAsIDM2MDBdLCBbMTQ3ODA5NTIwMCwgbnVsbCwgbnVsbCwgMTAwNzkyMTMsIDE5OTYyLCAyNDg3NzA1LCAyMDAxNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDk4ODAwLCBudWxsLCBudWxsLCA0NDQ0NDMzLCAxMDIyNywgMTQzMDM1NiwgMTA0OTMsIDAsIDM2MDBdXVxuICogLSBjcHVpbmZvOiBbW3VzZXIsIGtlcm5lbF0sIFswLjksIDEuM11dXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldFBlcmZvcm1hbmNlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldFBlcmZvcm1hbmNlRGF0YSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcGFja2FnZU5hbWUsIGRhdGFUeXBlIH0gPSByZXF1aXJlQXJncyhbJ3BhY2thZ2VOYW1lJywgJ2RhdGFUeXBlJ10sIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRQZXJmb3JtYW5jZURhdGEocGFja2FnZU5hbWUsIGRhdGFUeXBlKTtcbn07XG5cbmV4cG9ydCB7XG4gIGNvbW1hbmRzLCBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUywgQ1BVX0tFWVMsIE1FTU9SWV9LRVlTLFxuICBCQVRURVJZX0tFWVMsIE5FVFdPUktfS0VZUywgZ2V0TWVtb3J5SW5mbywgZ2V0TmV0d29ya1RyYWZmaWNJbmZvLFxuICBnZXRDUFVJbmZvLCBnZXRCYXR0ZXJ5SW5mbyxcbn07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxP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
|