appium-android-driver 5.10.4 → 5.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/lib/android-helpers.js +1 -1
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +1 -1
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +52 -1
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +1 -1
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +1 -1
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +1 -1
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/execute.js +1 -1
  15. package/build/lib/commands/execute.js.map +1 -1
  16. package/build/lib/commands/file-actions.js +1 -1
  17. package/build/lib/commands/file-actions.js.map +1 -1
  18. package/build/lib/commands/find.js +1 -1
  19. package/build/lib/commands/find.js.map +1 -1
  20. package/build/lib/commands/general.js +1 -1
  21. package/build/lib/commands/general.js.map +1 -1
  22. package/build/lib/commands/ime.js +1 -1
  23. package/build/lib/commands/ime.js.map +1 -1
  24. package/build/lib/commands/index.js +1 -1
  25. package/build/lib/commands/index.js.map +1 -1
  26. package/build/lib/commands/intent.js +1 -1
  27. package/build/lib/commands/intent.js.map +1 -1
  28. package/build/lib/commands/keyboard.js +1 -1
  29. package/build/lib/commands/keyboard.js.map +1 -1
  30. package/build/lib/commands/log.js +1 -1
  31. package/build/lib/commands/log.js.map +1 -1
  32. package/build/lib/commands/media-projection.js +1 -1
  33. package/build/lib/commands/media-projection.js.map +1 -1
  34. package/build/lib/commands/network.js +6 -55
  35. package/build/lib/commands/network.js.map +1 -1
  36. package/build/lib/commands/performance.js +1 -1
  37. package/build/lib/commands/performance.js.map +1 -1
  38. package/build/lib/commands/permissions.js +1 -1
  39. package/build/lib/commands/permissions.js.map +1 -1
  40. package/build/lib/commands/recordscreen.js +1 -1
  41. package/build/lib/commands/recordscreen.js.map +1 -1
  42. package/build/lib/commands/streamscreen.js +1 -1
  43. package/build/lib/commands/streamscreen.js.map +1 -1
  44. package/build/lib/commands/touch.js +1 -1
  45. package/build/lib/commands/touch.js.map +1 -1
  46. package/build/lib/driver.js +1 -1
  47. package/build/lib/driver.js.map +1 -1
  48. package/build/lib/uiautomator.js +1 -1
  49. package/build/lib/uiautomator.js.map +1 -1
  50. package/build/lib/unlock-helpers.js +1 -1
  51. package/build/lib/unlock-helpers.js.map +1 -1
  52. package/build/lib/utils.js +1 -1
  53. package/build/lib/utils.js.map +1 -1
  54. package/build/lib/webview-helpers.js +1 -1
  55. package/build/lib/webview-helpers.js.map +1 -1
  56. package/lib/commands/actions.js +135 -0
  57. package/lib/commands/network.js +18 -90
  58. package/lib/utils.js +4 -3
  59. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"streamscreen.js","names":["_lodash","_interopRequireDefault","require","_support","_teen_process","_portscanner","_http","_net","_bluebird","_asyncbox","_child_process","_url","commands","RECORDING_INTERVAL_SEC","STREAMING_STARTUP_TIMEOUT_MS","GSTREAMER_BINARY","system","isWindows","GST_INSPECT_BINARY","REQUIRED_GST_PLUGINS","avdec_h264","h264parse","jpegenc","tcpserversink","multipartmux","SCREENRECORD_BINARY","GST_TUTORIAL_URL","DEFAULT_HOST","TCP_HOST","DEFAULT_PORT","DEFAULT_QUALITY","DEFAULT_BITRATE","BOUNDARY_STRING","ADB_SCREEN_STREAMING_FEATURE","createStreamingLogger","streamName","udid","logger","getLogger","_","truncate","length","omission","verifyStreamingRequirements","adb","trim","shell","Error","gstreamerCheckPromises","binaryName","push","fs","which","e","B","all","moduleCheckPromises","name","modName","toPairs","stdout","exec","includes","getDeviceInfo","log","output","result","key","pattern","match","debug","parseInt","curDeviceId","initDeviceStreamingProc","deviceInfo","opts","width","height","bitRate","adjustedWidth","adjustedHeight","adjustedBitrate","screenRecordCmd","adbArgs","executable","defaultArgs","deviceStreaming","spawn","path","on","code","signal","isStarted","deviceStreamingLogger","errorsListener","chunk","stderr","toString","startupListener","isEmpty","info","util","quote","waitForCondition","waitMs","intervalMs","errorAndThrow","message","removeListener","initGstreamerPipeline","deviceStreamingProc","quality","tcpPort","considerRotation","logPipelineDetails","gstreamerPipeline","SubProcess","Math","max","fps","stdio","gstreamerLogger","gstOutputListener","didFail","rep","start","checkPortStatus","ign","extractRemoteAddress","req","headers","socket","remoteAddress","connection","mobileStartScreenStreaming","options","ensureFeatureEnabled","host","port","pathname","isUndefined","_screenStreamingProps","kill","mjpegSocket","mjpegServer","resolve","reject","net","createConnection","http","createServer","res","currentPathname","url","parse","writeHead","Connection","write","end","Pragma","pipe","warn","listen","error","timeout","isRunning","stop","destroy","listening","close","mobileStopScreenStreaming","e1","_default","exports","default"],"sources":["../../../lib/commands/streamscreen.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, system, logger, util } from '@appium/support';\nimport { exec, SubProcess } from 'teen_process';\nimport { checkPortStatus } from 'portscanner';\nimport http from 'http';\nimport net from 'net';\nimport B from 'bluebird';\nimport { waitForCondition } from 'asyncbox';\nimport { spawn } from 'child_process';\nimport url from 'url';\n\nconst commands = {};\n\nconst RECORDING_INTERVAL_SEC = 5;\nconst STREAMING_STARTUP_TIMEOUT_MS = 5000;\nconst GSTREAMER_BINARY = `gst-launch-1.0${system.isWindows() ? '.exe' : ''}`;\nconst GST_INSPECT_BINARY = `gst-inspect-1.0${system.isWindows() ? '.exe' : ''}`;\nconst REQUIRED_GST_PLUGINS = {\n avdec_h264: 'gst-libav',\n h264parse: 'gst-plugins-bad',\n jpegenc: 'gst-plugins-good',\n tcpserversink: 'gst-plugins-base',\n multipartmux: 'gst-plugins-good',\n};\nconst SCREENRECORD_BINARY = 'screenrecord';\nconst GST_TUTORIAL_URL = 'https://gstreamer.freedesktop.org/documentation/installing/index.html';\nconst DEFAULT_HOST = '127.0.0.1';\nconst TCP_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 8093;\nconst DEFAULT_QUALITY = 70;\nconst DEFAULT_BITRATE = 4000000; // 4 Mbps\nconst BOUNDARY_STRING = '--2ae9746887f170b8cf7c271047ce314c';\n\nconst ADB_SCREEN_STREAMING_FEATURE = 'adb_screen_streaming';\n\nfunction createStreamingLogger (streamName, udid) {\n return logger.getLogger(`${streamName}@` + _.truncate(udid, {\n length: 8,\n omission: '',\n }));\n}\n\nasync function verifyStreamingRequirements (adb) {\n if (!_.trim(await adb.shell(['which', SCREENRECORD_BINARY]))) {\n throw new Error(\n `The required '${SCREENRECORD_BINARY}' binary is not available on the device under test`);\n }\n\n const gstreamerCheckPromises = [];\n for (const binaryName of [GSTREAMER_BINARY, GST_INSPECT_BINARY]) {\n gstreamerCheckPromises.push((async () => {\n try {\n await fs.which(binaryName);\n } catch (e) {\n throw new Error(`The '${binaryName}' binary is not available in the PATH on the host system. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(gstreamerCheckPromises);\n\n const moduleCheckPromises = [];\n for (const [name, modName] of _.toPairs(REQUIRED_GST_PLUGINS)) {\n moduleCheckPromises.push((async () => {\n const {stdout} = await exec(GST_INSPECT_BINARY, [name]);\n if (!_.includes(stdout, modName)) {\n throw new Error(\n `The required GStreamer plugin '${name}' from '${modName}' module is not installed. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(moduleCheckPromises);\n}\n\nasync function getDeviceInfo (adb, log = null) {\n const output = await adb.shell(['dumpsys', 'display']);\n const result = {};\n for (const [key, pattern] of [\n ['width', /\\bdeviceWidth=(\\d+)/],\n ['height', /\\bdeviceHeight=(\\d+)/],\n ['fps', /\\bfps=(\\d+)/],\n ]) {\n const match = pattern.exec(output);\n if (!match) {\n log?.debug(output);\n throw new Error(`Cannot parse the device ${key} from the adb command output. ` +\n `Check the server log for more details.`);\n }\n result[key] = parseInt(match[1], 10);\n }\n result.udid = adb.curDeviceId;\n return result;\n}\n\nasync function initDeviceStreamingProc (adb, log, deviceInfo, opts = {}) {\n const {\n width,\n height,\n bitRate,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const adjustedBitrate = parseInt(bitRate, 10) || DEFAULT_BITRATE;\n let screenRecordCmd = SCREENRECORD_BINARY +\n ` --output-format=h264` +\n // 5 seconds is fine to detect rotation changes\n ` --time-limit=${RECORDING_INTERVAL_SEC}`;\n if (width || height) {\n screenRecordCmd += ` --size=${adjustedWidth}x${adjustedHeight}`;\n }\n if (bitRate) {\n screenRecordCmd += ` --bit-rate=${adjustedBitrate}`;\n }\n const adbArgs = [\n ...adb.executable.defaultArgs,\n 'exec-out',\n // The loop is required, because by default the maximum record duration\n // for screenrecord is always limited\n `while true; do ${screenRecordCmd} -; done`,\n ];\n const deviceStreaming = spawn(adb.executable.path, adbArgs);\n deviceStreaming.on('exit', (code, signal) => {\n log.debug(`Device streaming process exited with code ${code}, signal ${signal}`);\n });\n\n let isStarted = false;\n const deviceStreamingLogger = createStreamingLogger(SCREENRECORD_BINARY, deviceInfo.udid);\n const errorsListener = (chunk) => {\n const stderr = chunk.toString();\n if (_.trim(stderr)) {\n deviceStreamingLogger.debug(stderr);\n }\n };\n deviceStreaming.stderr.on('data', errorsListener);\n\n const startupListener = (chunk) => {\n if (!isStarted) {\n isStarted = !_.isEmpty(chunk);\n }\n };\n deviceStreaming.stdout.on('data', startupListener);\n\n try {\n log.info(`Starting device streaming: ${util.quote([adb.executable.path, ...adbArgs])}`);\n await waitForCondition(() => isStarted, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n log.errorAndThrow(\n `Cannot start the screen streaming process. Original error: ${e.message}`);\n } finally {\n deviceStreaming.stderr.removeListener('data', errorsListener);\n deviceStreaming.stdout.removeListener('data', startupListener);\n }\n return deviceStreaming;\n}\n\nasync function initGstreamerPipeline (deviceStreamingProc, deviceInfo, log, opts = {}) {\n const {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const gstreamerPipeline = new SubProcess(GSTREAMER_BINARY, [\n '-v',\n 'fdsrc', 'fd=0',\n '!', 'video/x-h264,' +\n `width=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedWidth},` +\n `height=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedHeight},` +\n `framerate=${deviceInfo.fps}/1,` +\n 'byte-stream=true',\n '!', 'h264parse',\n '!', 'queue', 'leaky=downstream',\n '!', 'avdec_h264',\n '!', 'queue', 'leaky=downstream',\n '!', 'jpegenc', `quality=${quality}`,\n '!', 'multipartmux', `boundary=${BOUNDARY_STRING}`,\n '!', 'tcpserversink', `host=${TCP_HOST}`, `port=${tcpPort}`,\n ], {\n stdio: [deviceStreamingProc.stdout, 'pipe', 'pipe']\n });\n gstreamerPipeline.on('exit', (code, signal) => {\n log.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);\n });\n const gstreamerLogger = createStreamingLogger('gst', deviceInfo.udid);\n const gstOutputListener = (stdout, stderr) => {\n if (_.trim(stderr || stdout)) {\n gstreamerLogger.debug(stderr || stdout);\n }\n };\n gstreamerPipeline.on('output', gstOutputListener);\n let didFail = false;\n try {\n log.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);\n await gstreamerPipeline.start(0);\n await waitForCondition(async () => {\n try {\n return (await checkPortStatus(tcpPort, TCP_HOST)) === 'open';\n } catch (ign) {\n return false;\n }\n }, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n didFail = true;\n log.errorAndThrow(\n `Cannot start the screen streaming pipeline. Original error: ${e.message}`);\n } finally {\n if (!logPipelineDetails || didFail) {\n gstreamerPipeline.removeListener('output', gstOutputListener);\n }\n }\n return gstreamerPipeline;\n}\n\nfunction extractRemoteAddress (req) {\n return req.headers['x-forwarded-for']\n || req.socket.remoteAddress\n || req.connection.remoteAddress\n || req.connection.socket.remoteAddress;\n}\n\n\n/**\n * @typedef {Object} StartScreenStreamingOptions\n *\n * @property {?number} width - The scaled width of the device's screen. If unset then the script will assign it\n * to the actual screen width measured in pixels.\n * @property {?number} height - The scaled height of the device's screen. If unset then the script will assign it\n * to the actual screen height measured in pixels.\n * @property {?number} bitRate - The video bit rate for the video, in bits per second.\n * The default value is 4000000 (4 Mb/s). You can increase the bit rate to improve video quality,\n * but doing so results in larger movie files.\n * @property {?string} host [127.0.0.1] - The IP address/host name to start the MJPEG server on.\n * You can set it to `0.0.0.0` to trigger the broadcast on all available network interfaces.\n * @property {?string} pathname - The HTTP request path the MJPEG server should be available on.\n * If unset then any pathname on the given `host`/`port` combination will work. Note that the value\n * should always start with a single slash: `/`\n * @property {?number} tcpPort [8094] - The port number to start the internal TCP MJPEG broadcast on.\n * This type of broadcast always starts on the loopback interface (`127.0.0.1`).\n * @property {?number} port [8093] - The port number to start the MJPEG server on.\n * @property {?number} quality [70] - The quality value for the streamed JPEG images.\n * This number should be in range [1, 100], where 100 is the best quality.\n * @property {?boolean} considerRotation [false] - If set to `true` then GStreamer pipeline will\n * increase the dimensions of the resulting images to properly fit images in both landscape and\n * portrait orientations. Set it to `true` if the device rotation is not going to be the same during the\n * broadcasting session.\n * @property {?boolean} logPipelineDetails [false] - Whether to log GStreamer pipeline events into\n * the standard log output. Might be useful for debugging purposes.\n */\n\n/**\n * Starts device screen broadcast by creating MJPEG server.\n * Multiple calls to this method have no effect unless the previous streaming\n * session is stopped.\n * This method only works if the `adb_screen_streaming` feature is\n * enabled on the server side.\n *\n * @param {?StartScreenStreamingOptions} options - The available options.\n * @throws {Error} If screen streaming has failed to start or\n * is not supported on the host system or\n * the corresponding server feature is not enabled.\n */\ncommands.mobileStartScreenStreaming = async function mobileStartScreenStreaming (options = {}) {\n this.ensureFeatureEnabled(ADB_SCREEN_STREAMING_FEATURE);\n\n const {\n width,\n height,\n bitRate,\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n pathname,\n tcpPort = DEFAULT_PORT + 1,\n quality = DEFAULT_QUALITY,\n considerRotation = false,\n logPipelineDetails = false,\n } = options;\n\n if (_.isUndefined(this._screenStreamingProps)) {\n await verifyStreamingRequirements(this.adb);\n }\n if (!_.isEmpty(this._screenStreamingProps)) {\n this.log.info(`The screen streaming session is already running. ` +\n `Stop it first in order to start a new one.`);\n return;\n }\n if ((await checkPortStatus(port, host)) === 'open') {\n this.log.info(`The port #${port} at ${host} is busy. ` +\n `Assuming the screen streaming is already running`);\n return;\n }\n if ((await checkPortStatus(tcpPort, TCP_HOST)) === 'open') {\n this.log.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` +\n `Make sure there are no leftovers from previous sessions.`);\n }\n this._screenStreamingProps = null;\n\n const deviceInfo = await getDeviceInfo(this.adb, this.log);\n const deviceStreamingProc = await initDeviceStreamingProc(this.adb, this.log, deviceInfo, {\n width,\n height,\n bitRate,\n });\n let gstreamerPipeline;\n try {\n gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, this.log, {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n });\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n throw e;\n }\n\n let mjpegSocket;\n let mjpegServer;\n try {\n await new B((resolve, reject) => {\n mjpegSocket = net.createConnection(tcpPort, TCP_HOST, () => {\n this.log.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);\n mjpegServer = http.createServer((req, res) => {\n const remoteAddress = extractRemoteAddress(req);\n const currentPathname = url.parse(req.url).pathname;\n this.log.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` +\n `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);\n\n if (pathname && currentPathname !== pathname) {\n this.log.info('Rejecting the broadcast request since it does not match the given pathname');\n res.writeHead(404, {\n Connection: 'close',\n 'Content-Type': 'text/plain; charset=utf-8',\n });\n res.write(`'${currentPathname}' did not match any known endpoints`);\n res.end();\n return;\n }\n\n this.log.info('Starting MJPEG broadcast');\n res.writeHead(200, {\n 'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',\n Pragma: 'no-cache',\n Connection: 'close',\n 'Content-Type': `multipart/x-mixed-replace; boundary=${BOUNDARY_STRING}`\n });\n\n mjpegSocket.pipe(res);\n });\n mjpegServer.on('error', (e) => {\n this.log.warn(e);\n reject(e);\n });\n mjpegServer.on('close', () => {\n this.log.debug(`MJPEG server at http://${host}:${port} has been closed`);\n });\n mjpegServer.on('listening', () => {\n this.log.info(`Successfully started MJPEG server at http://${host}:${port}`);\n resolve();\n });\n mjpegServer.listen(port, host);\n });\n mjpegSocket.on('error', (e) => {\n this.log.error(e);\n reject(e);\n });\n }).timeout(STREAMING_STARTUP_TIMEOUT_MS,\n `Cannot connect to the streaming server within ${STREAMING_STARTUP_TIMEOUT_MS}ms`);\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n if (gstreamerPipeline.isRunning) {\n await gstreamerPipeline.stop();\n }\n if (mjpegSocket) {\n mjpegSocket.destroy();\n }\n if (mjpegServer && mjpegServer.listening) {\n mjpegServer.close();\n }\n throw e;\n }\n\n this._screenStreamingProps = {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n };\n};\n\n/**\n * Stop screen streaming.\n * If no screen streaming server has been started then nothing is done.\n */\ncommands.mobileStopScreenStreaming = async function mobileStopScreenStreaming (/* options = {} */) {\n if (_.isEmpty(this._screenStreamingProps)) {\n if (!_.isUndefined(this._screenStreamingProps)) {\n this.log.debug(`Screen streaming is not running. There is nothing to stop`);\n }\n return;\n }\n\n const {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n } = this._screenStreamingProps;\n\n try {\n mjpegSocket.end();\n if (mjpegServer.listening) {\n mjpegServer.close();\n }\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill('SIGINT');\n }\n if (gstreamerPipeline.isRunning) {\n try {\n await gstreamerPipeline.stop('SIGINT');\n } catch (e) {\n this.log.warn(e);\n try {\n await gstreamerPipeline.stop('SIGKILL');\n } catch (e1) {\n this.log.error(e1);\n }\n }\n }\n this.log.info(`Successfully terminated the screen streaming MJPEG server`);\n } finally {\n this._screenStreamingProps = null;\n }\n};\n\n\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"streamscreen.js","names":["_lodash","_interopRequireDefault","require","_support","_teen_process","_portscanner","_http","_net","_bluebird","_asyncbox","_child_process","_url","commands","RECORDING_INTERVAL_SEC","STREAMING_STARTUP_TIMEOUT_MS","GSTREAMER_BINARY","system","isWindows","GST_INSPECT_BINARY","REQUIRED_GST_PLUGINS","avdec_h264","h264parse","jpegenc","tcpserversink","multipartmux","SCREENRECORD_BINARY","GST_TUTORIAL_URL","DEFAULT_HOST","TCP_HOST","DEFAULT_PORT","DEFAULT_QUALITY","DEFAULT_BITRATE","BOUNDARY_STRING","ADB_SCREEN_STREAMING_FEATURE","createStreamingLogger","streamName","udid","logger","getLogger","_","truncate","length","omission","verifyStreamingRequirements","adb","trim","shell","Error","gstreamerCheckPromises","binaryName","push","fs","which","e","B","all","moduleCheckPromises","name","modName","toPairs","stdout","exec","includes","getDeviceInfo","log","output","result","key","pattern","match","debug","parseInt","curDeviceId","initDeviceStreamingProc","deviceInfo","opts","width","height","bitRate","adjustedWidth","adjustedHeight","adjustedBitrate","screenRecordCmd","adbArgs","executable","defaultArgs","deviceStreaming","spawn","path","on","code","signal","isStarted","deviceStreamingLogger","errorsListener","chunk","stderr","toString","startupListener","isEmpty","info","util","quote","waitForCondition","waitMs","intervalMs","errorAndThrow","message","removeListener","initGstreamerPipeline","deviceStreamingProc","quality","tcpPort","considerRotation","logPipelineDetails","gstreamerPipeline","SubProcess","Math","max","fps","stdio","gstreamerLogger","gstOutputListener","didFail","rep","start","checkPortStatus","ign","extractRemoteAddress","req","headers","socket","remoteAddress","connection","mobileStartScreenStreaming","options","ensureFeatureEnabled","host","port","pathname","isUndefined","_screenStreamingProps","kill","mjpegSocket","mjpegServer","resolve","reject","net","createConnection","http","createServer","res","currentPathname","url","parse","writeHead","Connection","write","end","Pragma","pipe","warn","listen","error","timeout","isRunning","stop","destroy","listening","close","mobileStopScreenStreaming","e1","_default","exports","default"],"sources":["../../../lib/commands/streamscreen.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, system, logger, util } from '@appium/support';\nimport { exec, SubProcess } from 'teen_process';\nimport { checkPortStatus } from 'portscanner';\nimport http from 'http';\nimport net from 'net';\nimport B from 'bluebird';\nimport { waitForCondition } from 'asyncbox';\nimport { spawn } from 'child_process';\nimport url from 'url';\n\nconst commands = {};\n\nconst RECORDING_INTERVAL_SEC = 5;\nconst STREAMING_STARTUP_TIMEOUT_MS = 5000;\nconst GSTREAMER_BINARY = `gst-launch-1.0${system.isWindows() ? '.exe' : ''}`;\nconst GST_INSPECT_BINARY = `gst-inspect-1.0${system.isWindows() ? '.exe' : ''}`;\nconst REQUIRED_GST_PLUGINS = {\n avdec_h264: 'gst-libav',\n h264parse: 'gst-plugins-bad',\n jpegenc: 'gst-plugins-good',\n tcpserversink: 'gst-plugins-base',\n multipartmux: 'gst-plugins-good',\n};\nconst SCREENRECORD_BINARY = 'screenrecord';\nconst GST_TUTORIAL_URL = 'https://gstreamer.freedesktop.org/documentation/installing/index.html';\nconst DEFAULT_HOST = '127.0.0.1';\nconst TCP_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 8093;\nconst DEFAULT_QUALITY = 70;\nconst DEFAULT_BITRATE = 4000000; // 4 Mbps\nconst BOUNDARY_STRING = '--2ae9746887f170b8cf7c271047ce314c';\n\nconst ADB_SCREEN_STREAMING_FEATURE = 'adb_screen_streaming';\n\nfunction createStreamingLogger (streamName, udid) {\n return logger.getLogger(`${streamName}@` + _.truncate(udid, {\n length: 8,\n omission: '',\n }));\n}\n\nasync function verifyStreamingRequirements (adb) {\n if (!_.trim(await adb.shell(['which', SCREENRECORD_BINARY]))) {\n throw new Error(\n `The required '${SCREENRECORD_BINARY}' binary is not available on the device under test`);\n }\n\n const gstreamerCheckPromises = [];\n for (const binaryName of [GSTREAMER_BINARY, GST_INSPECT_BINARY]) {\n gstreamerCheckPromises.push((async () => {\n try {\n await fs.which(binaryName);\n } catch (e) {\n throw new Error(`The '${binaryName}' binary is not available in the PATH on the host system. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(gstreamerCheckPromises);\n\n const moduleCheckPromises = [];\n for (const [name, modName] of _.toPairs(REQUIRED_GST_PLUGINS)) {\n moduleCheckPromises.push((async () => {\n const {stdout} = await exec(GST_INSPECT_BINARY, [name]);\n if (!_.includes(stdout, modName)) {\n throw new Error(\n `The required GStreamer plugin '${name}' from '${modName}' module is not installed. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(moduleCheckPromises);\n}\n\nasync function getDeviceInfo (adb, log = null) {\n const output = await adb.shell(['dumpsys', 'display']);\n const result = {};\n for (const [key, pattern] of [\n ['width', /\\bdeviceWidth=(\\d+)/],\n ['height', /\\bdeviceHeight=(\\d+)/],\n ['fps', /\\bfps=(\\d+)/],\n ]) {\n const match = pattern.exec(output);\n if (!match) {\n log?.debug(output);\n throw new Error(`Cannot parse the device ${key} from the adb command output. ` +\n `Check the server log for more details.`);\n }\n result[key] = parseInt(match[1], 10);\n }\n result.udid = adb.curDeviceId;\n return result;\n}\n\nasync function initDeviceStreamingProc (adb, log, deviceInfo, opts = {}) {\n const {\n width,\n height,\n bitRate,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const adjustedBitrate = parseInt(bitRate, 10) || DEFAULT_BITRATE;\n let screenRecordCmd = SCREENRECORD_BINARY +\n ` --output-format=h264` +\n // 5 seconds is fine to detect rotation changes\n ` --time-limit=${RECORDING_INTERVAL_SEC}`;\n if (width || height) {\n screenRecordCmd += ` --size=${adjustedWidth}x${adjustedHeight}`;\n }\n if (bitRate) {\n screenRecordCmd += ` --bit-rate=${adjustedBitrate}`;\n }\n const adbArgs = [\n ...adb.executable.defaultArgs,\n 'exec-out',\n // The loop is required, because by default the maximum record duration\n // for screenrecord is always limited\n `while true; do ${screenRecordCmd} -; done`,\n ];\n const deviceStreaming = spawn(adb.executable.path, adbArgs);\n deviceStreaming.on('exit', (code, signal) => {\n log.debug(`Device streaming process exited with code ${code}, signal ${signal}`);\n });\n\n let isStarted = false;\n const deviceStreamingLogger = createStreamingLogger(SCREENRECORD_BINARY, deviceInfo.udid);\n const errorsListener = (chunk) => {\n const stderr = chunk.toString();\n if (_.trim(stderr)) {\n deviceStreamingLogger.debug(stderr);\n }\n };\n deviceStreaming.stderr.on('data', errorsListener);\n\n const startupListener = (chunk) => {\n if (!isStarted) {\n isStarted = !_.isEmpty(chunk);\n }\n };\n deviceStreaming.stdout.on('data', startupListener);\n\n try {\n log.info(`Starting device streaming: ${util.quote([adb.executable.path, ...adbArgs])}`);\n await waitForCondition(() => isStarted, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n log.errorAndThrow(\n `Cannot start the screen streaming process. Original error: ${e.message}`);\n } finally {\n deviceStreaming.stderr.removeListener('data', errorsListener);\n deviceStreaming.stdout.removeListener('data', startupListener);\n }\n return deviceStreaming;\n}\n\nasync function initGstreamerPipeline (deviceStreamingProc, deviceInfo, log, opts = {}) {\n const {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const gstreamerPipeline = new SubProcess(GSTREAMER_BINARY, [\n '-v',\n 'fdsrc', 'fd=0',\n '!', 'video/x-h264,' +\n `width=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedWidth},` +\n `height=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedHeight},` +\n `framerate=${deviceInfo.fps}/1,` +\n 'byte-stream=true',\n '!', 'h264parse',\n '!', 'queue', 'leaky=downstream',\n '!', 'avdec_h264',\n '!', 'queue', 'leaky=downstream',\n '!', 'jpegenc', `quality=${quality}`,\n '!', 'multipartmux', `boundary=${BOUNDARY_STRING}`,\n '!', 'tcpserversink', `host=${TCP_HOST}`, `port=${tcpPort}`,\n ], {\n stdio: [deviceStreamingProc.stdout, 'pipe', 'pipe']\n });\n gstreamerPipeline.on('exit', (code, signal) => {\n log.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);\n });\n const gstreamerLogger = createStreamingLogger('gst', deviceInfo.udid);\n const gstOutputListener = (stdout, stderr) => {\n if (_.trim(stderr || stdout)) {\n gstreamerLogger.debug(stderr || stdout);\n }\n };\n gstreamerPipeline.on('output', gstOutputListener);\n let didFail = false;\n try {\n log.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);\n await gstreamerPipeline.start(0);\n await waitForCondition(async () => {\n try {\n return (await checkPortStatus(tcpPort, TCP_HOST)) === 'open';\n } catch (ign) {\n return false;\n }\n }, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n didFail = true;\n log.errorAndThrow(\n `Cannot start the screen streaming pipeline. Original error: ${e.message}`);\n } finally {\n if (!logPipelineDetails || didFail) {\n gstreamerPipeline.removeListener('output', gstOutputListener);\n }\n }\n return gstreamerPipeline;\n}\n\nfunction extractRemoteAddress (req) {\n return req.headers['x-forwarded-for']\n || req.socket.remoteAddress\n || req.connection.remoteAddress\n || req.connection.socket.remoteAddress;\n}\n\n\n/**\n * @typedef {Object} StartScreenStreamingOptions\n *\n * @property {?number} width - The scaled width of the device's screen. If unset then the script will assign it\n * to the actual screen width measured in pixels.\n * @property {?number} height - The scaled height of the device's screen. If unset then the script will assign it\n * to the actual screen height measured in pixels.\n * @property {?number} bitRate - The video bit rate for the video, in bits per second.\n * The default value is 4000000 (4 Mb/s). You can increase the bit rate to improve video quality,\n * but doing so results in larger movie files.\n * @property {?string} host [127.0.0.1] - The IP address/host name to start the MJPEG server on.\n * You can set it to `0.0.0.0` to trigger the broadcast on all available network interfaces.\n * @property {?string} pathname - The HTTP request path the MJPEG server should be available on.\n * If unset then any pathname on the given `host`/`port` combination will work. Note that the value\n * should always start with a single slash: `/`\n * @property {?number} tcpPort [8094] - The port number to start the internal TCP MJPEG broadcast on.\n * This type of broadcast always starts on the loopback interface (`127.0.0.1`).\n * @property {?number} port [8093] - The port number to start the MJPEG server on.\n * @property {?number} quality [70] - The quality value for the streamed JPEG images.\n * This number should be in range [1, 100], where 100 is the best quality.\n * @property {?boolean} considerRotation [false] - If set to `true` then GStreamer pipeline will\n * increase the dimensions of the resulting images to properly fit images in both landscape and\n * portrait orientations. Set it to `true` if the device rotation is not going to be the same during the\n * broadcasting session.\n * @property {?boolean} logPipelineDetails [false] - Whether to log GStreamer pipeline events into\n * the standard log output. Might be useful for debugging purposes.\n */\n\n/**\n * Starts device screen broadcast by creating MJPEG server.\n * Multiple calls to this method have no effect unless the previous streaming\n * session is stopped.\n * This method only works if the `adb_screen_streaming` feature is\n * enabled on the server side.\n *\n * @param {?StartScreenStreamingOptions} options - The available options.\n * @throws {Error} If screen streaming has failed to start or\n * is not supported on the host system or\n * the corresponding server feature is not enabled.\n */\ncommands.mobileStartScreenStreaming = async function mobileStartScreenStreaming (options = {}) {\n this.ensureFeatureEnabled(ADB_SCREEN_STREAMING_FEATURE);\n\n const {\n width,\n height,\n bitRate,\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n pathname,\n tcpPort = DEFAULT_PORT + 1,\n quality = DEFAULT_QUALITY,\n considerRotation = false,\n logPipelineDetails = false,\n } = options;\n\n if (_.isUndefined(this._screenStreamingProps)) {\n await verifyStreamingRequirements(this.adb);\n }\n if (!_.isEmpty(this._screenStreamingProps)) {\n this.log.info(`The screen streaming session is already running. ` +\n `Stop it first in order to start a new one.`);\n return;\n }\n if ((await checkPortStatus(port, host)) === 'open') {\n this.log.info(`The port #${port} at ${host} is busy. ` +\n `Assuming the screen streaming is already running`);\n return;\n }\n if ((await checkPortStatus(tcpPort, TCP_HOST)) === 'open') {\n this.log.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` +\n `Make sure there are no leftovers from previous sessions.`);\n }\n this._screenStreamingProps = null;\n\n const deviceInfo = await getDeviceInfo(this.adb, this.log);\n const deviceStreamingProc = await initDeviceStreamingProc(this.adb, this.log, deviceInfo, {\n width,\n height,\n bitRate,\n });\n let gstreamerPipeline;\n try {\n gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, this.log, {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n });\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n throw e;\n }\n\n let mjpegSocket;\n let mjpegServer;\n try {\n await new B((resolve, reject) => {\n mjpegSocket = net.createConnection(tcpPort, TCP_HOST, () => {\n this.log.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);\n mjpegServer = http.createServer((req, res) => {\n const remoteAddress = extractRemoteAddress(req);\n const currentPathname = url.parse(req.url).pathname;\n this.log.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` +\n `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);\n\n if (pathname && currentPathname !== pathname) {\n this.log.info('Rejecting the broadcast request since it does not match the given pathname');\n res.writeHead(404, {\n Connection: 'close',\n 'Content-Type': 'text/plain; charset=utf-8',\n });\n res.write(`'${currentPathname}' did not match any known endpoints`);\n res.end();\n return;\n }\n\n this.log.info('Starting MJPEG broadcast');\n res.writeHead(200, {\n 'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',\n Pragma: 'no-cache',\n Connection: 'close',\n 'Content-Type': `multipart/x-mixed-replace; boundary=${BOUNDARY_STRING}`\n });\n\n mjpegSocket.pipe(res);\n });\n mjpegServer.on('error', (e) => {\n this.log.warn(e);\n reject(e);\n });\n mjpegServer.on('close', () => {\n this.log.debug(`MJPEG server at http://${host}:${port} has been closed`);\n });\n mjpegServer.on('listening', () => {\n this.log.info(`Successfully started MJPEG server at http://${host}:${port}`);\n resolve();\n });\n mjpegServer.listen(port, host);\n });\n mjpegSocket.on('error', (e) => {\n this.log.error(e);\n reject(e);\n });\n }).timeout(STREAMING_STARTUP_TIMEOUT_MS,\n `Cannot connect to the streaming server within ${STREAMING_STARTUP_TIMEOUT_MS}ms`);\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n if (gstreamerPipeline.isRunning) {\n await gstreamerPipeline.stop();\n }\n if (mjpegSocket) {\n mjpegSocket.destroy();\n }\n if (mjpegServer && mjpegServer.listening) {\n mjpegServer.close();\n }\n throw e;\n }\n\n this._screenStreamingProps = {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n };\n};\n\n/**\n * Stop screen streaming.\n * If no screen streaming server has been started then nothing is done.\n */\ncommands.mobileStopScreenStreaming = async function mobileStopScreenStreaming (/* options = {} */) {\n if (_.isEmpty(this._screenStreamingProps)) {\n if (!_.isUndefined(this._screenStreamingProps)) {\n this.log.debug(`Screen streaming is not running. There is nothing to stop`);\n }\n return;\n }\n\n const {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n } = this._screenStreamingProps;\n\n try {\n mjpegSocket.end();\n if (mjpegServer.listening) {\n mjpegServer.close();\n }\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill('SIGINT');\n }\n if (gstreamerPipeline.isRunning) {\n try {\n await gstreamerPipeline.stop('SIGINT');\n } catch (e) {\n this.log.warn(e);\n try {\n await gstreamerPipeline.stop('SIGKILL');\n } catch (e1) {\n this.log.error(e1);\n }\n }\n }\n this.log.info(`Successfully terminated the screen streaming MJPEG server`);\n } finally {\n this._screenStreamingProps = null;\n }\n};\n\n\nexport default commands;\n"],"mappings":"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"}
@@ -319,4 +319,4 @@ commands.doPerformMultiAction = async function doPerformMultiAction(elementId, s
319
319
  Object.assign(extensions, commands, helpers);
320
320
  var _default = extensions;
321
321
  exports.default = _default;
322
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYW5kcm9pZEhlbHBlcnMiLCJfYmx1ZWJpcmQiLCJfZHJpdmVyIiwiX2FzeW5jYm94IiwiX3N1cHBvcnQiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsImdldENvb3JkRGVmYXVsdCIsInZhbCIsInV0aWwiLCJoYXNWYWx1ZSIsImdldFN3aXBlVG91Y2hEdXJhdGlvbiIsIndhaXRHZXN0dXJlIiwiZHVyYXRpb24iLCJvcHRpb25zIiwibXMiLCJkb1RvdWNoQWN0aW9uIiwiYWN0aW9uIiwib3B0cyIsImVsZW1lbnQiLCJ4IiwieSIsImNvdW50IiwidGFwIiwidG91Y2hEb3duIiwidG91Y2hVcCIsInRvdWNoTW92ZSIsIkIiLCJkZWxheSIsInRvdWNoTG9uZ0NsaWNrIiwibG9nIiwid2FybiIsImVycm9yQW5kVGhyb3ciLCJkb1RvdWNoRHJhZyIsImdlc3R1cmVzIiwibG9uZ1ByZXNzIiwibW92ZVRvIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJnZXRMb2NhdGlvbkluVmlldyIsImFwaUxldmVsIiwiYWRiIiwiZ2V0QXBpTGV2ZWwiLCJNYXRoIiwibWF4IiwiZHJhZyIsImZpeFJlbGVhc2UiLCJyZWxlYXNlIiwiXyIsImxhc3QiLCJjbG9uZSIsInJlZiIsImdlc3R1cmUiLCJyZXZlcnNlIiwibG9jIiwic2l6ZSIsImdldFNpemUiLCJ3aWR0aCIsImhlaWdodCIsInBpY2siLCJwZXJmb3JtR2VzdHVyZSIsImUiLCJpc0Vycm9yVHlwZSIsImVycm9ycyIsIk5vU3VjaEVsZW1lbnRFcnJvciIsImRlYnVnIiwiZ2V0U3dpcGVPcHRpb25zIiwidG91Y2hDb3VudCIsImRlc3RFbGVtZW50IiwibG9jUmVzdWx0Iiwic2l6ZVJlc3VsdCIsIm9mZnNldFgiLCJhYnMiLCJvZmZzZXRZIiwiZmlyc3RFbExvY2F0aW9uIiwicGVyZm9ybVRvdWNoIiwibGVuZ3RoIiwic3dpcGVPcHRzIiwic3dpcGUiLCJhY3Rpb25zIiwibWFwIiwiaGVhZCIsInBvcCIsInNsaWNlIiwicHJlc3MiLCJzaGlmdCIsIndhaXQiLCJmaXhlZEdlc3R1cmVzIiwicGFyc2VUb3VjaCIsImciLCJtdWx0aSIsInRvdWNoU3RhdGVPYmplY3RzIiwiYXN5bmNtYXAiLCJpbmNsdWRlcyIsIm9mZnNldCIsImVsZW1lbnRJZCIsInBvcyIsInRvdWNoU3RhdGVPYmplY3QiLCJ0aW1lT2Zmc2V0IiwicGFyc2VJbnQiLCJwcmV2UG9zIiwidGltZSIsInN0YXRlIiwiaXNVbmRlZmluZWQiLCJhbmRyb2lkSGVscGVycyIsInRydW5jYXRlRGVjaW1hbHMiLCJ0b3VjaCIsInBlcmZvcm1NdWx0aUFjdGlvbiIsIkVycm9yIiwic3RhdGVzIiwiZG9QZXJmb3JtTXVsdGlBY3Rpb24iLCJib290c3RyYXAiLCJzZW5kQWN0aW9uIiwiT2JqZWN0IiwiYXNzaWduIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3RvdWNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGVycm9ycywgaXNFcnJvclR5cGUgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IGFzeW5jbWFwIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q29vcmREZWZhdWx0ICh2YWwpIHtcbiAgLy8gZ29pbmcgdGhlIGxvbmcgd2F5IGFuZCBjaGVja2luZyBmb3IgdW5kZWZpbmVkIGFuZCBudWxsIHNpbmNlXG4gIC8vIHdlIGNhbid0IGJlIGFzc3VyZWQgYGVsSWRgIGlzIGEgc3RyaW5nIGFuZCBub3QgYW4gaW50LiBTYW1lXG4gIC8vIHRoaW5nIHdpdGggZGVzdEVsZW1lbnQgYmVsb3cuXG4gIHJldHVybiB1dGlsLmhhc1ZhbHVlKHZhbCkgPyB2YWwgOiAwLjU7XG59XG5cbmZ1bmN0aW9uIGdldFN3aXBlVG91Y2hEdXJhdGlvbiAod2FpdEdlc3R1cmUpIHtcbiAgLy8gdGhlIHRvdWNoIGFjdGlvbiBhcGkgdXNlcyBtcywgd2Ugd2FudCBzZWNvbmRzXG4gIC8vIDAuOCBpcyB0aGUgZGVmYXVsdCB0aW1lIGZvciB0aGUgb3BlcmF0aW9uXG4gIGxldCBkdXJhdGlvbiA9IDAuODtcbiAgaWYgKHR5cGVvZiB3YWl0R2VzdHVyZS5vcHRpb25zLm1zICE9PSAndW5kZWZpbmVkJyAmJiB3YWl0R2VzdHVyZS5vcHRpb25zLm1zKSB7XG4gICAgZHVyYXRpb24gPSB3YWl0R2VzdHVyZS5vcHRpb25zLm1zIC8gMTAwMDtcbiAgICBpZiAoZHVyYXRpb24gPT09IDApIHtcbiAgICAgIC8vIHNldCB0byBhIHZlcnkgbG93IG51bWJlciwgc2luY2UgdGhleSB3YW50ZWQgaXQgZmFzdFxuICAgICAgLy8gYnV0IGJlbG93IDAuMSBiZWNvbWVzIDAgc3RlcHMsIHdoaWNoIGNhdXNlcyBlcnJvcnNcbiAgICAgIGR1cmF0aW9uID0gMC4xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZHVyYXRpb247XG59XG5cbmNvbW1hbmRzLmRvVG91Y2hBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBkb1RvdWNoQWN0aW9uIChhY3Rpb24sIG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGVsZW1lbnQsIHgsIHksIGNvdW50LCBtcywgZHVyYXRpb24gfSA9IG9wdHM7XG4gIC8vIHBhcnNlVG91Y2ggcHJlY2FsY3VsYXRlcyBhYnNvbHV0ZSBlbGVtZW50IHBvc2l0aW9uc1xuICAvLyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHBhc3MgYGVsZW1lbnRgIHRvIHRoZSBhZmZlY3RlZCBnZXN0dXJlc1xuICBzd2l0Y2ggKGFjdGlvbikge1xuICAgIGNhc2UgJ3RhcCc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50YXAobnVsbCwgeCwgeSwgY291bnQpO1xuICAgIGNhc2UgJ3ByZXNzJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRvdWNoRG93bihudWxsLCB4LCB5KTtcbiAgICBjYXNlICdyZWxlYXNlJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRvdWNoVXAoZWxlbWVudCwgeCwgeSk7XG4gICAgY2FzZSAnbW92ZVRvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRvdWNoTW92ZShudWxsLCB4LCB5KTtcbiAgICBjYXNlICd3YWl0JzpcbiAgICAgIHJldHVybiBhd2FpdCBCLmRlbGF5KG1zKTtcbiAgICBjYXNlICdsb25nUHJlc3MnOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudG91Y2hMb25nQ2xpY2sobnVsbCwgeCwgeSwgZHVyYXRpb24gfHwgMTAwMCk7XG4gICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgIC8vIFRPRE86IGNsYXJpZnkgYmVoYXZpb3Igb2YgJ2NhbmNlbCcgYWN0aW9uIGFuZCBmaXggdGhpc1xuICAgICAgdGhpcy5sb2cud2FybignQ2FuY2VsIGFjdGlvbiBjdXJyZW50bHkgaGFzIG5vIGVmZmVjdCcpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYHVua25vd24gYWN0aW9uICR7YWN0aW9ufWApO1xuICB9XG59O1xuXG4vLyBkcmFnIGlzICpub3QqIHByZXNzLW1vdmUtcmVsZWFzZSwgc28gd2UgbmVlZCB0byB0cmFuc2xhdGVcbi8vIGRyYWcgd29ya3MgZmluZSBmb3Igc2Nyb2xsLCBhcyB3ZWxsXG5oZWxwZXJzLmRvVG91Y2hEcmFnID0gYXN5bmMgZnVuY3Rpb24gZG9Ub3VjaERyYWcgKGdlc3R1cmVzKSB7XG4gIGxldCBsb25nUHJlc3MgPSBnZXN0dXJlc1swXTtcbiAgbGV0IG1vdmVUbyA9IGdlc3R1cmVzWzFdO1xuICBsZXQgc3RhcnRYID0gbG9uZ1ByZXNzLm9wdGlvbnMueCB8fCAwLFxuICAgICAgc3RhcnRZID0gbG9uZ1ByZXNzLm9wdGlvbnMueSB8fCAwLFxuICAgICAgZW5kWCA9IG1vdmVUby5vcHRpb25zLnggfHwgMCxcbiAgICAgIGVuZFkgPSBtb3ZlVG8ub3B0aW9ucy55IHx8IDA7XG4gIGlmIChsb25nUHJlc3Mub3B0aW9ucy5lbGVtZW50KSB7XG4gICAgbGV0IHt4LCB5fSA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcobG9uZ1ByZXNzLm9wdGlvbnMuZWxlbWVudCk7XG4gICAgc3RhcnRYICs9IHggfHwgMDtcbiAgICBzdGFydFkgKz0geSB8fCAwO1xuICB9XG4gIGlmIChtb3ZlVG8ub3B0aW9ucy5lbGVtZW50KSB7XG4gICAgbGV0IHt4LCB5fSA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcobW92ZVRvLm9wdGlvbnMuZWxlbWVudCk7XG4gICAgZW5kWCArPSB4IHx8IDA7XG4gICAgZW5kWSArPSB5IHx8IDA7XG4gIH1cblxuICBsZXQgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAvLyBsb2xsaXBvcCB0YWtlcyBhIGxpdHRsZSBsb25nZXIgdG8gZ2V0IHRoaW5ncyByb2xsaW5nXG4gIGxldCBkdXJhdGlvbiA9IGFwaUxldmVsID49IDUgPyAyIDogMTtcbiAgLy8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlIGxvbmcgcHJlc3MgaGFzIGEgZHVyYXRpb24sIHdlIHVzZSBpdC5cbiAgaWYgKGxvbmdQcmVzcy5vcHRpb25zICYmIGxvbmdQcmVzcy5vcHRpb25zLmR1cmF0aW9uKSB7XG4gICAgZHVyYXRpb24gPSBNYXRoLm1heChsb25nUHJlc3Mub3B0aW9ucy5kdXJhdGlvbiAvIDEwMDAsIGR1cmF0aW9uKTtcbiAgfVxuXG4gIC8vIGBkcmFnYCB3aWxsIHRha2UgY2FyZSBvZiB3aGV0aGVyIHRoZXJlIGlzIGFuIGVsZW1lbnQgb3Igbm90IGF0IHRoYXQgbGV2ZWxcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZHJhZyhzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIDEsIGxvbmdQcmVzcy5vcHRpb25zLmVsZW1lbnQsIG1vdmVUby5vcHRpb25zLmVsZW1lbnQpO1xufTtcblxuLy8gUmVsZWFzZSBnZXN0dXJlIG5lZWRzIGVsZW1lbnQgb3IgY28tb3JkaW5hdGVzIHRvIHJlbGVhc2UgaXQgZnJvbSB0aGF0IHBvc2l0aW9uXG4vLyBvciBlbHNlIHJlbGVhc2UgZ2VzdHVyZSBpcyBwZXJmb3JtZWQgZnJvbSBjZW50ZXIgb2YgdGhlIHNjcmVlbiwgc28gdG8gZml4IGl0XG4vLyBUaGlzIG1ldGhvZCBzZXRzIGNvLW9yZGluYXRlcy9lbGVtZW50IHRvIHJlbGVhc2UgZ2VzdHVyZSBpZiBpdCBoYXMgbm8gb3B0aW9ucyBzZXQgYWxyZWFkeS5cbmhlbHBlcnMuZml4UmVsZWFzZSA9IGFzeW5jIGZ1bmN0aW9uIGZpeFJlbGVhc2UgKGdlc3R1cmVzKSB7XG4gIGxldCByZWxlYXNlID0gXy5sYXN0KGdlc3R1cmVzKTtcbiAgLy8gc29tZXRpbWVzIHRoZXJlIGFyZSBubyBvcHRpb25zXG4gIHJlbGVhc2Uub3B0aW9ucyA9IHJlbGVhc2Uub3B0aW9ucyB8fCB7fTtcbiAgLy8gbm90aGluZyB0byBkbyBpZiByZWxlYXNlIG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0XG4gIGlmIChyZWxlYXNlLm9wdGlvbnMuZWxlbWVudCB8fCAocmVsZWFzZS5vcHRpb25zLnggJiYgcmVsZWFzZS5vcHRpb25zLnkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHdpdGhvdXQgY29vcmRpbmF0ZXMsIGByZWxlYXNlYCB1c2VzIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbiwgd2hpY2gsXG4gIC8vIGdlbmVyYWxseSBzcGVha2luZywgaXMgbm90IHdoYXQgd2Ugd2FudFxuICAvLyB0aGVyZWZvcmU6IGxvb3AgYmFja3dhcmRzIGFuZCB1c2UgdGhlIGxhc3QgY29tbWFuZCB3aXRoIGFuIGVsZW1lbnQgYW5kL29yXG4gIC8vIG9mZnNldCBjb29yZGluYXRlc1xuICBnZXN0dXJlcyA9IF8uY2xvbmUoZ2VzdHVyZXMpO1xuICBsZXQgcmVmID0gbnVsbDtcbiAgZm9yIChsZXQgZ2VzdHVyZSBvZiBnZXN0dXJlcy5yZXZlcnNlKCkpIHtcbiAgICBsZXQgb3B0cyA9IGdlc3R1cmUub3B0aW9ucztcbiAgICBpZiAob3B0cy5lbGVtZW50IHx8IChvcHRzLnggJiYgb3B0cy55KSkge1xuICAgICAgcmVmID0gZ2VzdHVyZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAocmVmKSB7XG4gICAgbGV0IG9wdHMgPSByZWYub3B0aW9ucztcbiAgICBpZiAob3B0cy5lbGVtZW50KSB7XG4gICAgICBsZXQgbG9jID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbkluVmlldyhvcHRzLmVsZW1lbnQpO1xuICAgICAgaWYgKG9wdHMueCAmJiBvcHRzLnkpIHtcbiAgICAgICAgLy8gdGhpcyBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgZWxlbWVudFxuICAgICAgICByZWxlYXNlLm9wdGlvbnMgPSB7XG4gICAgICAgICAgeDogbG9jLnggKyBvcHRzLngsXG4gICAgICAgICAgeTogbG9jLnkgKyBvcHRzLnlcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudFxuICAgICAgICBsZXQgc2l6ZSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShvcHRzLmVsZW1lbnQpO1xuICAgICAgICByZWxlYXNlLm9wdGlvbnMgPSB7XG4gICAgICAgICAgeDogbG9jLnggKyBzaXplLndpZHRoIC8gMixcbiAgICAgICAgICB5OiBsb2MueSArIHNpemUuaGVpZ2h0IC8gMlxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWxlYXNlLm9wdGlvbnMgPSBfLnBpY2sob3B0cywgJ3gnLCAneScpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVsZWFzZTtcbn07XG5cbi8vIFBlcmZvcm0gb25lIGdlc3R1cmVcbmhlbHBlcnMucGVyZm9ybUdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBwZXJmb3JtR2VzdHVyZSAoZ2VzdHVyZSkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmRvVG91Y2hBY3Rpb24oZ2VzdHVyZS5hY3Rpb24sIGdlc3R1cmUub3B0aW9ucyB8fCB7fSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBzb21ldGltZSB0aGUgZWxlbWVudCBpcyBub3QgYXZhaWxhYmxlIHdoZW4gcmVsZWFzaW5nLCByZXRyeSB3aXRob3V0IGl0XG4gICAgaWYgKGlzRXJyb3JUeXBlKGUsIGVycm9ycy5Ob1N1Y2hFbGVtZW50RXJyb3IpICYmIGdlc3R1cmUuYWN0aW9uID09PSAncmVsZWFzZScgJiZcbiAgICAgICAgZ2VzdHVyZS5vcHRpb25zLmVsZW1lbnQpIHtcbiAgICAgIGRlbGV0ZSBnZXN0dXJlLm9wdGlvbnMuZWxlbWVudDtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGByZXRyeWluZyByZWxlYXNlIHdpdGhvdXQgZWxlbWVudCBvcHRzOiAke2dlc3R1cmUub3B0aW9uc30uYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5kb1RvdWNoQWN0aW9uKGdlc3R1cmUuYWN0aW9uLCBnZXN0dXJlLm9wdGlvbnMgfHwge30pO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG5jb21tYW5kcy5nZXRTd2lwZU9wdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRTd2lwZU9wdGlvbnMgKGdlc3R1cmVzLCB0b3VjaENvdW50ID0gMSkge1xuICBsZXQgc3RhcnRYID0gZ2V0Q29vcmREZWZhdWx0KGdlc3R1cmVzWzBdLm9wdGlvbnMueCksXG4gICAgICBzdGFydFkgPSBnZXRDb29yZERlZmF1bHQoZ2VzdHVyZXNbMF0ub3B0aW9ucy55KSxcbiAgICAgIGVuZFggPSBnZXRDb29yZERlZmF1bHQoZ2VzdHVyZXNbMl0ub3B0aW9ucy54KSxcbiAgICAgIGVuZFkgPSBnZXRDb29yZERlZmF1bHQoZ2VzdHVyZXNbMl0ub3B0aW9ucy55KSxcbiAgICAgIGR1cmF0aW9uID0gZ2V0U3dpcGVUb3VjaER1cmF0aW9uKGdlc3R1cmVzWzFdKSxcbiAgICAgIGVsZW1lbnQgPSBnZXN0dXJlc1swXS5vcHRpb25zLmVsZW1lbnQsXG4gICAgICBkZXN0RWxlbWVudCA9IGdlc3R1cmVzWzJdLm9wdGlvbnMuZWxlbWVudCB8fCBnZXN0dXJlc1swXS5vcHRpb25zLmVsZW1lbnQ7XG5cbiAgLy8gdGhlcmUncyBubyBkZXN0aW5hdGlvbiBlbGVtZW50IGhhbmRsaW5nIGluIGJvb3RzdHJhcCBhbmQgc2luY2UgaXQgYXBwbGllcyB0byBhbGwgcGxhdGZvcm1zLCB3ZSBoYW5kbGUgaXQgaGVyZVxuICBpZiAodXRpbC5oYXNWYWx1ZShkZXN0RWxlbWVudCkpIHtcbiAgICBsZXQgbG9jUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbkluVmlldyhkZXN0RWxlbWVudCk7XG4gICAgbGV0IHNpemVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFNpemUoZGVzdEVsZW1lbnQpO1xuICAgIGxldCBvZmZzZXRYID0gKE1hdGguYWJzKGVuZFgpIDwgMSAmJiBNYXRoLmFicyhlbmRYKSA+IDApID8gc2l6ZVJlc3VsdC53aWR0aCAqIGVuZFggOiBlbmRYO1xuICAgIGxldCBvZmZzZXRZID0gKE1hdGguYWJzKGVuZFkpIDwgMSAmJiBNYXRoLmFicyhlbmRZKSA+IDApID8gc2l6ZVJlc3VsdC5oZWlnaHQgKiBlbmRZIDogZW5kWTtcbiAgICBlbmRYID0gbG9jUmVzdWx0LnggKyBvZmZzZXRYO1xuICAgIGVuZFkgPSBsb2NSZXN1bHQueSArIG9mZnNldFk7XG4gICAgLy8gaWYgdGhlIHRhcmdldCBlbGVtZW50IHdhcyBwcm92aWRlZCwgdGhlIGNvb3JkaW5hdGVzIGZvciB0aGUgZGVzdGluYXRpb24gbmVlZCB0byBiZSByZWxhdGl2ZSB0byBpdC5cbiAgICBpZiAodXRpbC5oYXNWYWx1ZShlbGVtZW50KSkge1xuICAgICAgbGV0IGZpcnN0RWxMb2NhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZWxlbWVudCk7XG4gICAgICBlbmRYIC09IGZpcnN0RWxMb2NhdGlvbi54O1xuICAgICAgZW5kWSAtPSBmaXJzdEVsTG9jYXRpb24ueTtcbiAgICB9XG4gIH1cbiAgLy8gY2xpZW50cyBhcmUgcmVzcG9uc2libGUgdG8gdXNlIHRoZXNlIG9wdGlvbnMgY29ycmVjdGx5XG4gIHJldHVybiB7c3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCB0b3VjaENvdW50LCBlbGVtZW50fTtcbn07XG5cbmNvbW1hbmRzLnBlcmZvcm1Ub3VjaCA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1Ub3VjaCAoZ2VzdHVyZXMpIHtcbiAgLy8gcHJlc3Mtd2FpdC1tb3ZlVG8tcmVsZWFzZSBpcyBgc3dpcGVgLCBzbyB1c2UgbmF0aXZlIG1ldGhvZFxuICBpZiAoZ2VzdHVyZXMubGVuZ3RoID09PSA0ICYmXG4gICAgICBnZXN0dXJlc1swXS5hY3Rpb24gPT09ICdwcmVzcycgJiZcbiAgICAgIGdlc3R1cmVzWzFdLmFjdGlvbiA9PT0gJ3dhaXQnICYmXG4gICAgICBnZXN0dXJlc1syXS5hY3Rpb24gPT09ICdtb3ZlVG8nICYmXG4gICAgICBnZXN0dXJlc1szXS5hY3Rpb24gPT09ICdyZWxlYXNlJykge1xuXG4gICAgbGV0IHN3aXBlT3B0cyA9IGF3YWl0IHRoaXMuZ2V0U3dpcGVPcHRpb25zKGdlc3R1cmVzKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zd2lwZShzd2lwZU9wdHMuc3RhcnRYLCBzd2lwZU9wdHMuc3RhcnRZLCBzd2lwZU9wdHMuZW5kWCxcbiAgICAgICAgc3dpcGVPcHRzLmVuZFksIHN3aXBlT3B0cy5kdXJhdGlvbiwgc3dpcGVPcHRzLnRvdWNoQ291bnQsXG4gICAgICAgIHN3aXBlT3B0cy5lbGVtZW50KTtcbiAgfVxuICBsZXQgYWN0aW9ucyA9IF8ubWFwKGdlc3R1cmVzLCAnYWN0aW9uJyk7XG5cbiAgaWYgKGFjdGlvbnNbMF0gPT09ICdsb25nUHJlc3MnICYmIGFjdGlvbnNbMV0gPT09ICdtb3ZlVG8nICYmIGFjdGlvbnNbMl0gPT09ICdyZWxlYXNlJykge1xuICAgIC8vIHNvbWUgdGhpbmdzIGFyZSBzcGVjaWFsXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZG9Ub3VjaERyYWcoZ2VzdHVyZXMpO1xuICB9IGVsc2Uge1xuICAgIGlmIChhY3Rpb25zLmxlbmd0aCA9PT0gMikge1xuICAgICAgLy8gYHByZXNzYCB3aXRob3V0IGEgd2FpdCBpcyB0b28gc2xvdyBhbmQgZ2V0cyBpbnRlcnByZXR0ZWQgYXMgYSBgbG9uZ1ByZXNzYFxuICAgICAgaWYgKF8uaGVhZChhY3Rpb25zKSA9PT0gJ3ByZXNzJyAmJiBfLmxhc3QoYWN0aW9ucykgPT09ICdyZWxlYXNlJykge1xuICAgICAgICBhY3Rpb25zWzBdID0gJ3RhcCc7XG4gICAgICAgIGdlc3R1cmVzWzBdLmFjdGlvbiA9ICd0YXAnO1xuICAgICAgfVxuXG4gICAgICAvLyB0aGUgYGxvbmdQcmVzc2AgYW5kIGB0YXBgIG1ldGhvZHMgcmVsZWFzZSBvbiB0aGVpciBvd25cbiAgICAgIGlmICgoXy5oZWFkKGFjdGlvbnMpID09PSAndGFwJyB8fCBfLmhlYWQoYWN0aW9ucykgPT09ICdsb25nUHJlc3MnKSAmJiBfLmxhc3QoYWN0aW9ucykgPT09ICdyZWxlYXNlJykge1xuICAgICAgICBnZXN0dXJlcy5wb3AoKTtcbiAgICAgICAgYWN0aW9ucy5wb3AoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9uZ3ByZXNzIGZvbGxvd2VkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gcmVsZWFzZSBzaG91bGQgYmVjb21lIGEgcHJlc3MgYW5kIHdhaXRcbiAgICAgIGlmIChhY3Rpb25zWzBdID09PSAnbG9uZ1ByZXNzJykge1xuICAgICAgICBhY3Rpb25zID0gWydwcmVzcycsICd3YWl0JywgLi4uYWN0aW9ucy5zbGljZSgxKV07XG5cbiAgICAgICAgbGV0IHByZXNzID0gZ2VzdHVyZXMuc2hpZnQoKTtcbiAgICAgICAgcHJlc3MuYWN0aW9uID0gJ3ByZXNzJztcbiAgICAgICAgbGV0IHdhaXQgPSB7XG4gICAgICAgICAgYWN0aW9uOiAnd2FpdCcsXG4gICAgICAgICAgb3B0aW9uczoge21zOiBwcmVzcy5vcHRpb25zLmR1cmF0aW9uIHx8IDEwMDB9XG4gICAgICAgIH07XG4gICAgICAgIGRlbGV0ZSBwcmVzcy5vcHRpb25zLmR1cmF0aW9uO1xuICAgICAgICBnZXN0dXJlcyA9IFtwcmVzcywgd2FpdCwgLi4uZ2VzdHVyZXNdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBmaXhlZEdlc3R1cmVzID0gYXdhaXQgdGhpcy5wYXJzZVRvdWNoKGdlc3R1cmVzLCBmYWxzZSk7XG4gICAgLy8gZml4IHJlbGVhc2UgYWN0aW9uIHRoZW4gcGVyZm9ybSBhbGwgYWN0aW9uc1xuICAgIGlmIChhY3Rpb25zW2FjdGlvbnMubGVuZ3RoIC0gMV0gPT09ICdyZWxlYXNlJykge1xuICAgICAgYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdID0gYXdhaXQgdGhpcy5maXhSZWxlYXNlKGdlc3R1cmVzKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZyBvZiBmaXhlZEdlc3R1cmVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnBlcmZvcm1HZXN0dXJlKGcpO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy5wYXJzZVRvdWNoID0gYXN5bmMgZnVuY3Rpb24gcGFyc2VUb3VjaCAoZ2VzdHVyZXMsIG11bHRpKSB7XG4gIC8vIGJlY2F1c2UgbXVsdGktdG91Y2ggcmVsZWFzZXMgYXQgdGhlIGVuZCBieSBkZWZhdWx0XG4gIGlmIChtdWx0aSAmJiBfLmxhc3QoZ2VzdHVyZXMpLmFjdGlvbiA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgZ2VzdHVyZXMucG9wKCk7XG4gIH1cblxuICBsZXQgdG91Y2hTdGF0ZU9iamVjdHMgPSBhd2FpdCBhc3luY21hcChnZXN0dXJlcywgYXN5bmMgKGdlc3R1cmUpID0+IHtcbiAgICBsZXQgb3B0aW9ucyA9IGdlc3R1cmUub3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoXy5pbmNsdWRlcyhbJ3ByZXNzJywgJ21vdmVUbycsICd0YXAnLCAnbG9uZ1ByZXNzJ10sIGdlc3R1cmUuYWN0aW9uKSkge1xuICAgICAgb3B0aW9ucy5vZmZzZXQgPSBmYWxzZTtcbiAgICAgIGxldCBlbGVtZW50SWQgPSBnZXN0dXJlLm9wdGlvbnMuZWxlbWVudDtcbiAgICAgIGlmIChlbGVtZW50SWQpIHtcbiAgICAgICAgbGV0IHBvcyA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZWxlbWVudElkKTtcbiAgICAgICAgaWYgKGdlc3R1cmUub3B0aW9ucy54IHx8IGdlc3R1cmUub3B0aW9ucy55KSB7XG4gICAgICAgICAgb3B0aW9ucy54ID0gcG9zLnggKyAoZ2VzdHVyZS5vcHRpb25zLnggfHwgMCk7XG4gICAgICAgICAgb3B0aW9ucy55ID0gcG9zLnkgKyAoZ2VzdHVyZS5vcHRpb25zLnkgfHwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRTaXplKGVsZW1lbnRJZCk7XG4gICAgICAgICAgb3B0aW9ucy54ID0gcG9zLnggKyAod2lkdGggLyAyKTtcbiAgICAgICAgICBvcHRpb25zLnkgPSBwb3MueSArIChoZWlnaHQgLyAyKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG91Y2hTdGF0ZU9iamVjdCA9IHtcbiAgICAgICAgICBhY3Rpb246IGdlc3R1cmUuYWN0aW9uLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgdGltZU9mZnNldDogMC4wMDUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0b3VjaFN0YXRlT2JqZWN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy54ID0gKGdlc3R1cmUub3B0aW9ucy54IHx8IDApO1xuICAgICAgICBvcHRpb25zLnkgPSAoZ2VzdHVyZS5vcHRpb25zLnkgfHwgMCk7XG5cbiAgICAgICAgbGV0IHRvdWNoU3RhdGVPYmplY3QgPSB7XG4gICAgICAgICAgYWN0aW9uOiBnZXN0dXJlLmFjdGlvbixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHRpbWVPZmZzZXQ6IDAuMDA1LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdG91Y2hTdGF0ZU9iamVjdDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG9mZnNldCA9IDAuMDA1O1xuICAgICAgaWYgKGdlc3R1cmUuYWN0aW9uID09PSAnd2FpdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IGdlc3R1cmUub3B0aW9ucztcbiAgICAgICAgb2Zmc2V0ID0gKHBhcnNlSW50KGdlc3R1cmUub3B0aW9ucy5tcywgMTApIC8gMTAwMCk7XG4gICAgICB9XG4gICAgICBsZXQgdG91Y2hTdGF0ZU9iamVjdCA9IHtcbiAgICAgICAgYWN0aW9uOiBnZXN0dXJlLmFjdGlvbixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgdGltZU9mZnNldDogb2Zmc2V0LFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b3VjaFN0YXRlT2JqZWN0O1xuICAgIH1cbiAgfSwgZmFsc2UpO1xuICAvLyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgdGltZSAod2hpY2ggaXMgbm93IGFuIG9mZnNldClcbiAgLy8gYW5kIHRoZSBwb3NpdGlvbiAod2hpY2ggbWF5IGJlIGFuIG9mZnNldClcbiAgbGV0IHByZXZQb3MgPSBudWxsLFxuICAgICAgdGltZSA9IDA7XG4gIGZvciAobGV0IHN0YXRlIG9mIHRvdWNoU3RhdGVPYmplY3RzKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc3RhdGUub3B0aW9ucy54KSAmJiBfLmlzVW5kZWZpbmVkKHN0YXRlLm9wdGlvbnMueSkgJiYgcHJldlBvcyAhPT0gbnVsbCkge1xuICAgICAgLy8gdGhpcyBoYXBwZW5zIHdpdGggd2FpdFxuICAgICAgc3RhdGUub3B0aW9ucy54ID0gcHJldlBvcy54O1xuICAgICAgc3RhdGUub3B0aW9ucy55ID0gcHJldlBvcy55O1xuICAgIH1cbiAgICBpZiAoc3RhdGUub3B0aW9ucy5vZmZzZXQgJiYgcHJldlBvcykge1xuICAgICAgLy8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYW4gb2Zmc2V0XG4gICAgICBzdGF0ZS5vcHRpb25zLnggKz0gcHJldlBvcy54O1xuICAgICAgc3RhdGUub3B0aW9ucy55ICs9IHByZXZQb3MueTtcbiAgICB9XG4gICAgZGVsZXRlIHN0YXRlLm9wdGlvbnMub2Zmc2V0O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLngpICYmICFfLmlzVW5kZWZpbmVkKHN0YXRlLm9wdGlvbnMueSkpIHtcbiAgICAgIHByZXZQb3MgPSBzdGF0ZS5vcHRpb25zO1xuICAgIH1cblxuICAgIGlmIChtdWx0aSkge1xuICAgICAgbGV0IHRpbWVPZmZzZXQgPSBzdGF0ZS50aW1lT2Zmc2V0O1xuICAgICAgdGltZSArPSB0aW1lT2Zmc2V0O1xuICAgICAgc3RhdGUudGltZSA9IGFuZHJvaWRIZWxwZXJzLnRydW5jYXRlRGVjaW1hbHModGltZSwgMyk7XG5cbiAgICAgIC8vIG11bHRpIGdlc3R1cmVzIHJlcXVpcmUgJ3RvdWNoJyByYXRoZXIgdGhhbiAnb3B0aW9ucydcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLngpICYmICFfLmlzVW5kZWZpbmVkKHN0YXRlLm9wdGlvbnMueSkpIHtcbiAgICAgICAgc3RhdGUudG91Y2ggPSB7XG4gICAgICAgICAgeDogc3RhdGUub3B0aW9ucy54LFxuICAgICAgICAgIHk6IHN0YXRlLm9wdGlvbnMueVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgZGVsZXRlIHN0YXRlLm9wdGlvbnM7XG4gICAgfVxuICAgIGRlbGV0ZSBzdGF0ZS50aW1lT2Zmc2V0O1xuICB9XG4gIHJldHVybiB0b3VjaFN0YXRlT2JqZWN0cztcbn07XG5cblxuY29tbWFuZHMucGVyZm9ybU11bHRpQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gcGVyZm9ybU11bHRpQWN0aW9uIChhY3Rpb25zLCBlbGVtZW50SWQpIHtcbiAgLy8gQW5kcm9pZCBuZWVkcyBhdCBsZWFzdCB0d28gYWN0aW9ucyB0byBiZSBhYmxlIHRvIHBlcmZvcm0gYSBtdWx0aSBwb2ludGVyIGdlc3R1cmVcbiAgaWYgKGFjdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aSBQb2ludGVyIEdlc3R1cmVzIG5lZWQgYXQgbGVhc3QgdHdvIGFjdGlvbnMuICcgK1xuICAgICAgICAnVXNlIFRvdWNoIEFjdGlvbnMgZm9yIGEgc2luZ2xlIGFjdGlvbi4nKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlcyA9IGF3YWl0IGFzeW5jbWFwKGFjdGlvbnMsIGFzeW5jIChhY3Rpb24pID0+IGF3YWl0IHRoaXMucGFyc2VUb3VjaChhY3Rpb24sIHRydWUpLCBmYWxzZSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZG9QZXJmb3JtTXVsdGlBY3Rpb24oZWxlbWVudElkLCBzdGF0ZXMpO1xufTtcblxuLyoqXG4gKiBSZWFzb24gZm9yIGlzb2xhdGluZyBkb1BlcmZvcm1NdWx0aUFjdGlvbiBmcm9tIHBlcmZvcm1NdWx0aUFjdGlvbiBpcyBmb3IgcmV1c2luZyBwZXJmb3JtTXVsdGlBY3Rpb25cbiAqIGFjcm9zcyBhbmRyb2lkLWRyaXZlcnMgKGxpa2UgYXBwaXVtLXVpYXV0b21hdG9yMi1kcml2ZXIpIGFuZCB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLlxuICogT3RoZXIgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBuZWVkIHRvIG92ZXJyaWRlIGRvUGVyZm9ybU11bHRpQWN0aW9uXG4gKiB0byBmYWNpbGl0YXRlIHBlcmZvcm1NdWx0aUFjdGlvbi5cbiAqL1xuY29tbWFuZHMuZG9QZXJmb3JtTXVsdGlBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBkb1BlcmZvcm1NdWx0aUFjdGlvbiAoZWxlbWVudElkLCBzdGF0ZXMpIHtcbiAgbGV0IG9wdHM7XG4gIGlmIChlbGVtZW50SWQpIHtcbiAgICBvcHRzID0ge1xuICAgICAgZWxlbWVudElkLFxuICAgICAgYWN0aW9uczogc3RhdGVzXG4gICAgfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwZXJmb3JtTXVsdGlQb2ludGVyR2VzdHVyZScsIG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIG9wdHMgPSB7XG4gICAgICBhY3Rpb25zOiBzdGF0ZXNcbiAgICB9O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwZXJmb3JtTXVsdGlQb2ludGVyR2VzdHVyZScsIG9wdHMpO1xuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGVBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFNBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUlNLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxR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
322
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYW5kcm9pZEhlbHBlcnMiLCJfYmx1ZWJpcmQiLCJfZHJpdmVyIiwiX2FzeW5jYm94IiwiX3N1cHBvcnQiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsImdldENvb3JkRGVmYXVsdCIsInZhbCIsInV0aWwiLCJoYXNWYWx1ZSIsImdldFN3aXBlVG91Y2hEdXJhdGlvbiIsIndhaXRHZXN0dXJlIiwiZHVyYXRpb24iLCJvcHRpb25zIiwibXMiLCJkb1RvdWNoQWN0aW9uIiwiYWN0aW9uIiwib3B0cyIsImVsZW1lbnQiLCJ4IiwieSIsImNvdW50IiwidGFwIiwidG91Y2hEb3duIiwidG91Y2hVcCIsInRvdWNoTW92ZSIsIkIiLCJkZWxheSIsInRvdWNoTG9uZ0NsaWNrIiwibG9nIiwid2FybiIsImVycm9yQW5kVGhyb3ciLCJkb1RvdWNoRHJhZyIsImdlc3R1cmVzIiwibG9uZ1ByZXNzIiwibW92ZVRvIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJnZXRMb2NhdGlvbkluVmlldyIsImFwaUxldmVsIiwiYWRiIiwiZ2V0QXBpTGV2ZWwiLCJNYXRoIiwibWF4IiwiZHJhZyIsImZpeFJlbGVhc2UiLCJyZWxlYXNlIiwiXyIsImxhc3QiLCJjbG9uZSIsInJlZiIsImdlc3R1cmUiLCJyZXZlcnNlIiwibG9jIiwic2l6ZSIsImdldFNpemUiLCJ3aWR0aCIsImhlaWdodCIsInBpY2siLCJwZXJmb3JtR2VzdHVyZSIsImUiLCJpc0Vycm9yVHlwZSIsImVycm9ycyIsIk5vU3VjaEVsZW1lbnRFcnJvciIsImRlYnVnIiwiZ2V0U3dpcGVPcHRpb25zIiwidG91Y2hDb3VudCIsImRlc3RFbGVtZW50IiwibG9jUmVzdWx0Iiwic2l6ZVJlc3VsdCIsIm9mZnNldFgiLCJhYnMiLCJvZmZzZXRZIiwiZmlyc3RFbExvY2F0aW9uIiwicGVyZm9ybVRvdWNoIiwibGVuZ3RoIiwic3dpcGVPcHRzIiwic3dpcGUiLCJhY3Rpb25zIiwibWFwIiwiaGVhZCIsInBvcCIsInNsaWNlIiwicHJlc3MiLCJzaGlmdCIsIndhaXQiLCJmaXhlZEdlc3R1cmVzIiwicGFyc2VUb3VjaCIsImciLCJtdWx0aSIsInRvdWNoU3RhdGVPYmplY3RzIiwiYXN5bmNtYXAiLCJpbmNsdWRlcyIsIm9mZnNldCIsImVsZW1lbnRJZCIsInBvcyIsInRvdWNoU3RhdGVPYmplY3QiLCJ0aW1lT2Zmc2V0IiwicGFyc2VJbnQiLCJwcmV2UG9zIiwidGltZSIsInN0YXRlIiwiaXNVbmRlZmluZWQiLCJhbmRyb2lkSGVscGVycyIsInRydW5jYXRlRGVjaW1hbHMiLCJ0b3VjaCIsInBlcmZvcm1NdWx0aUFjdGlvbiIsIkVycm9yIiwic3RhdGVzIiwiZG9QZXJmb3JtTXVsdGlBY3Rpb24iLCJib290c3RyYXAiLCJzZW5kQWN0aW9uIiwiT2JqZWN0IiwiYXNzaWduIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3RvdWNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGVycm9ycywgaXNFcnJvclR5cGUgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IGFzeW5jbWFwIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q29vcmREZWZhdWx0ICh2YWwpIHtcbiAgLy8gZ29pbmcgdGhlIGxvbmcgd2F5IGFuZCBjaGVja2luZyBmb3IgdW5kZWZpbmVkIGFuZCBudWxsIHNpbmNlXG4gIC8vIHdlIGNhbid0IGJlIGFzc3VyZWQgYGVsSWRgIGlzIGEgc3RyaW5nIGFuZCBub3QgYW4gaW50LiBTYW1lXG4gIC8vIHRoaW5nIHdpdGggZGVzdEVsZW1lbnQgYmVsb3cuXG4gIHJldHVybiB1dGlsLmhhc1ZhbHVlKHZhbCkgPyB2YWwgOiAwLjU7XG59XG5cbmZ1bmN0aW9uIGdldFN3aXBlVG91Y2hEdXJhdGlvbiAod2FpdEdlc3R1cmUpIHtcbiAgLy8gdGhlIHRvdWNoIGFjdGlvbiBhcGkgdXNlcyBtcywgd2Ugd2FudCBzZWNvbmRzXG4gIC8vIDAuOCBpcyB0aGUgZGVmYXVsdCB0aW1lIGZvciB0aGUgb3BlcmF0aW9uXG4gIGxldCBkdXJhdGlvbiA9IDAuODtcbiAgaWYgKHR5cGVvZiB3YWl0R2VzdHVyZS5vcHRpb25zLm1zICE9PSAndW5kZWZpbmVkJyAmJiB3YWl0R2VzdHVyZS5vcHRpb25zLm1zKSB7XG4gICAgZHVyYXRpb24gPSB3YWl0R2VzdHVyZS5vcHRpb25zLm1zIC8gMTAwMDtcbiAgICBpZiAoZHVyYXRpb24gPT09IDApIHtcbiAgICAgIC8vIHNldCB0byBhIHZlcnkgbG93IG51bWJlciwgc2luY2UgdGhleSB3YW50ZWQgaXQgZmFzdFxuICAgICAgLy8gYnV0IGJlbG93IDAuMSBiZWNvbWVzIDAgc3RlcHMsIHdoaWNoIGNhdXNlcyBlcnJvcnNcbiAgICAgIGR1cmF0aW9uID0gMC4xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZHVyYXRpb247XG59XG5cbmNvbW1hbmRzLmRvVG91Y2hBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBkb1RvdWNoQWN0aW9uIChhY3Rpb24sIG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGVsZW1lbnQsIHgsIHksIGNvdW50LCBtcywgZHVyYXRpb24gfSA9IG9wdHM7XG4gIC8vIHBhcnNlVG91Y2ggcHJlY2FsY3VsYXRlcyBhYnNvbHV0ZSBlbGVtZW50IHBvc2l0aW9uc1xuICAvLyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHBhc3MgYGVsZW1lbnRgIHRvIHRoZSBhZmZlY3RlZCBnZXN0dXJlc1xuICBzd2l0Y2ggKGFjdGlvbikge1xuICAgIGNhc2UgJ3RhcCc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50YXAobnVsbCwgeCwgeSwgY291bnQpO1xuICAgIGNhc2UgJ3ByZXNzJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRvdWNoRG93bihudWxsLCB4LCB5KTtcbiAgICBjYXNlICdyZWxlYXNlJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRvdWNoVXAoZWxlbWVudCwgeCwgeSk7XG4gICAgY2FzZSAnbW92ZVRvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRvdWNoTW92ZShudWxsLCB4LCB5KTtcbiAgICBjYXNlICd3YWl0JzpcbiAgICAgIHJldHVybiBhd2FpdCBCLmRlbGF5KG1zKTtcbiAgICBjYXNlICdsb25nUHJlc3MnOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudG91Y2hMb25nQ2xpY2sobnVsbCwgeCwgeSwgZHVyYXRpb24gfHwgMTAwMCk7XG4gICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgIC8vIFRPRE86IGNsYXJpZnkgYmVoYXZpb3Igb2YgJ2NhbmNlbCcgYWN0aW9uIGFuZCBmaXggdGhpc1xuICAgICAgdGhpcy5sb2cud2FybignQ2FuY2VsIGFjdGlvbiBjdXJyZW50bHkgaGFzIG5vIGVmZmVjdCcpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYHVua25vd24gYWN0aW9uICR7YWN0aW9ufWApO1xuICB9XG59O1xuXG4vLyBkcmFnIGlzICpub3QqIHByZXNzLW1vdmUtcmVsZWFzZSwgc28gd2UgbmVlZCB0byB0cmFuc2xhdGVcbi8vIGRyYWcgd29ya3MgZmluZSBmb3Igc2Nyb2xsLCBhcyB3ZWxsXG5oZWxwZXJzLmRvVG91Y2hEcmFnID0gYXN5bmMgZnVuY3Rpb24gZG9Ub3VjaERyYWcgKGdlc3R1cmVzKSB7XG4gIGxldCBsb25nUHJlc3MgPSBnZXN0dXJlc1swXTtcbiAgbGV0IG1vdmVUbyA9IGdlc3R1cmVzWzFdO1xuICBsZXQgc3RhcnRYID0gbG9uZ1ByZXNzLm9wdGlvbnMueCB8fCAwLFxuICAgICAgc3RhcnRZID0gbG9uZ1ByZXNzLm9wdGlvbnMueSB8fCAwLFxuICAgICAgZW5kWCA9IG1vdmVUby5vcHRpb25zLnggfHwgMCxcbiAgICAgIGVuZFkgPSBtb3ZlVG8ub3B0aW9ucy55IHx8IDA7XG4gIGlmIChsb25nUHJlc3Mub3B0aW9ucy5lbGVtZW50KSB7XG4gICAgbGV0IHt4LCB5fSA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcobG9uZ1ByZXNzLm9wdGlvbnMuZWxlbWVudCk7XG4gICAgc3RhcnRYICs9IHggfHwgMDtcbiAgICBzdGFydFkgKz0geSB8fCAwO1xuICB9XG4gIGlmIChtb3ZlVG8ub3B0aW9ucy5lbGVtZW50KSB7XG4gICAgbGV0IHt4LCB5fSA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcobW92ZVRvLm9wdGlvbnMuZWxlbWVudCk7XG4gICAgZW5kWCArPSB4IHx8IDA7XG4gICAgZW5kWSArPSB5IHx8IDA7XG4gIH1cblxuICBsZXQgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAvLyBsb2xsaXBvcCB0YWtlcyBhIGxpdHRsZSBsb25nZXIgdG8gZ2V0IHRoaW5ncyByb2xsaW5nXG4gIGxldCBkdXJhdGlvbiA9IGFwaUxldmVsID49IDUgPyAyIDogMTtcbiAgLy8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlIGxvbmcgcHJlc3MgaGFzIGEgZHVyYXRpb24sIHdlIHVzZSBpdC5cbiAgaWYgKGxvbmdQcmVzcy5vcHRpb25zICYmIGxvbmdQcmVzcy5vcHRpb25zLmR1cmF0aW9uKSB7XG4gICAgZHVyYXRpb24gPSBNYXRoLm1heChsb25nUHJlc3Mub3B0aW9ucy5kdXJhdGlvbiAvIDEwMDAsIGR1cmF0aW9uKTtcbiAgfVxuXG4gIC8vIGBkcmFnYCB3aWxsIHRha2UgY2FyZSBvZiB3aGV0aGVyIHRoZXJlIGlzIGFuIGVsZW1lbnQgb3Igbm90IGF0IHRoYXQgbGV2ZWxcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZHJhZyhzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIDEsIGxvbmdQcmVzcy5vcHRpb25zLmVsZW1lbnQsIG1vdmVUby5vcHRpb25zLmVsZW1lbnQpO1xufTtcblxuLy8gUmVsZWFzZSBnZXN0dXJlIG5lZWRzIGVsZW1lbnQgb3IgY28tb3JkaW5hdGVzIHRvIHJlbGVhc2UgaXQgZnJvbSB0aGF0IHBvc2l0aW9uXG4vLyBvciBlbHNlIHJlbGVhc2UgZ2VzdHVyZSBpcyBwZXJmb3JtZWQgZnJvbSBjZW50ZXIgb2YgdGhlIHNjcmVlbiwgc28gdG8gZml4IGl0XG4vLyBUaGlzIG1ldGhvZCBzZXRzIGNvLW9yZGluYXRlcy9lbGVtZW50IHRvIHJlbGVhc2UgZ2VzdHVyZSBpZiBpdCBoYXMgbm8gb3B0aW9ucyBzZXQgYWxyZWFkeS5cbmhlbHBlcnMuZml4UmVsZWFzZSA9IGFzeW5jIGZ1bmN0aW9uIGZpeFJlbGVhc2UgKGdlc3R1cmVzKSB7XG4gIGxldCByZWxlYXNlID0gXy5sYXN0KGdlc3R1cmVzKTtcbiAgLy8gc29tZXRpbWVzIHRoZXJlIGFyZSBubyBvcHRpb25zXG4gIHJlbGVhc2Uub3B0aW9ucyA9IHJlbGVhc2Uub3B0aW9ucyB8fCB7fTtcbiAgLy8gbm90aGluZyB0byBkbyBpZiByZWxlYXNlIG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0XG4gIGlmIChyZWxlYXNlLm9wdGlvbnMuZWxlbWVudCB8fCAocmVsZWFzZS5vcHRpb25zLnggJiYgcmVsZWFzZS5vcHRpb25zLnkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHdpdGhvdXQgY29vcmRpbmF0ZXMsIGByZWxlYXNlYCB1c2VzIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbiwgd2hpY2gsXG4gIC8vIGdlbmVyYWxseSBzcGVha2luZywgaXMgbm90IHdoYXQgd2Ugd2FudFxuICAvLyB0aGVyZWZvcmU6IGxvb3AgYmFja3dhcmRzIGFuZCB1c2UgdGhlIGxhc3QgY29tbWFuZCB3aXRoIGFuIGVsZW1lbnQgYW5kL29yXG4gIC8vIG9mZnNldCBjb29yZGluYXRlc1xuICBnZXN0dXJlcyA9IF8uY2xvbmUoZ2VzdHVyZXMpO1xuICBsZXQgcmVmID0gbnVsbDtcbiAgZm9yIChsZXQgZ2VzdHVyZSBvZiBnZXN0dXJlcy5yZXZlcnNlKCkpIHtcbiAgICBsZXQgb3B0cyA9IGdlc3R1cmUub3B0aW9ucztcbiAgICBpZiAob3B0cy5lbGVtZW50IHx8IChvcHRzLnggJiYgb3B0cy55KSkge1xuICAgICAgcmVmID0gZ2VzdHVyZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAocmVmKSB7XG4gICAgbGV0IG9wdHMgPSByZWYub3B0aW9ucztcbiAgICBpZiAob3B0cy5lbGVtZW50KSB7XG4gICAgICBsZXQgbG9jID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbkluVmlldyhvcHRzLmVsZW1lbnQpO1xuICAgICAgaWYgKG9wdHMueCAmJiBvcHRzLnkpIHtcbiAgICAgICAgLy8gdGhpcyBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgZWxlbWVudFxuICAgICAgICByZWxlYXNlLm9wdGlvbnMgPSB7XG4gICAgICAgICAgeDogbG9jLnggKyBvcHRzLngsXG4gICAgICAgICAgeTogbG9jLnkgKyBvcHRzLnlcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudFxuICAgICAgICBsZXQgc2l6ZSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShvcHRzLmVsZW1lbnQpO1xuICAgICAgICByZWxlYXNlLm9wdGlvbnMgPSB7XG4gICAgICAgICAgeDogbG9jLnggKyBzaXplLndpZHRoIC8gMixcbiAgICAgICAgICB5OiBsb2MueSArIHNpemUuaGVpZ2h0IC8gMlxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWxlYXNlLm9wdGlvbnMgPSBfLnBpY2sob3B0cywgJ3gnLCAneScpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVsZWFzZTtcbn07XG5cbi8vIFBlcmZvcm0gb25lIGdlc3R1cmVcbmhlbHBlcnMucGVyZm9ybUdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBwZXJmb3JtR2VzdHVyZSAoZ2VzdHVyZSkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmRvVG91Y2hBY3Rpb24oZ2VzdHVyZS5hY3Rpb24sIGdlc3R1cmUub3B0aW9ucyB8fCB7fSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBzb21ldGltZSB0aGUgZWxlbWVudCBpcyBub3QgYXZhaWxhYmxlIHdoZW4gcmVsZWFzaW5nLCByZXRyeSB3aXRob3V0IGl0XG4gICAgaWYgKGlzRXJyb3JUeXBlKGUsIGVycm9ycy5Ob1N1Y2hFbGVtZW50RXJyb3IpICYmIGdlc3R1cmUuYWN0aW9uID09PSAncmVsZWFzZScgJiZcbiAgICAgICAgZ2VzdHVyZS5vcHRpb25zLmVsZW1lbnQpIHtcbiAgICAgIGRlbGV0ZSBnZXN0dXJlLm9wdGlvbnMuZWxlbWVudDtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGByZXRyeWluZyByZWxlYXNlIHdpdGhvdXQgZWxlbWVudCBvcHRzOiAke2dlc3R1cmUub3B0aW9uc30uYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5kb1RvdWNoQWN0aW9uKGdlc3R1cmUuYWN0aW9uLCBnZXN0dXJlLm9wdGlvbnMgfHwge30pO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG5jb21tYW5kcy5nZXRTd2lwZU9wdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRTd2lwZU9wdGlvbnMgKGdlc3R1cmVzLCB0b3VjaENvdW50ID0gMSkge1xuICBsZXQgc3RhcnRYID0gZ2V0Q29vcmREZWZhdWx0KGdlc3R1cmVzWzBdLm9wdGlvbnMueCksXG4gICAgICBzdGFydFkgPSBnZXRDb29yZERlZmF1bHQoZ2VzdHVyZXNbMF0ub3B0aW9ucy55KSxcbiAgICAgIGVuZFggPSBnZXRDb29yZERlZmF1bHQoZ2VzdHVyZXNbMl0ub3B0aW9ucy54KSxcbiAgICAgIGVuZFkgPSBnZXRDb29yZERlZmF1bHQoZ2VzdHVyZXNbMl0ub3B0aW9ucy55KSxcbiAgICAgIGR1cmF0aW9uID0gZ2V0U3dpcGVUb3VjaER1cmF0aW9uKGdlc3R1cmVzWzFdKSxcbiAgICAgIGVsZW1lbnQgPSBnZXN0dXJlc1swXS5vcHRpb25zLmVsZW1lbnQsXG4gICAgICBkZXN0RWxlbWVudCA9IGdlc3R1cmVzWzJdLm9wdGlvbnMuZWxlbWVudCB8fCBnZXN0dXJlc1swXS5vcHRpb25zLmVsZW1lbnQ7XG5cbiAgLy8gdGhlcmUncyBubyBkZXN0aW5hdGlvbiBlbGVtZW50IGhhbmRsaW5nIGluIGJvb3RzdHJhcCBhbmQgc2luY2UgaXQgYXBwbGllcyB0byBhbGwgcGxhdGZvcm1zLCB3ZSBoYW5kbGUgaXQgaGVyZVxuICBpZiAodXRpbC5oYXNWYWx1ZShkZXN0RWxlbWVudCkpIHtcbiAgICBsZXQgbG9jUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbkluVmlldyhkZXN0RWxlbWVudCk7XG4gICAgbGV0IHNpemVSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFNpemUoZGVzdEVsZW1lbnQpO1xuICAgIGxldCBvZmZzZXRYID0gKE1hdGguYWJzKGVuZFgpIDwgMSAmJiBNYXRoLmFicyhlbmRYKSA+IDApID8gc2l6ZVJlc3VsdC53aWR0aCAqIGVuZFggOiBlbmRYO1xuICAgIGxldCBvZmZzZXRZID0gKE1hdGguYWJzKGVuZFkpIDwgMSAmJiBNYXRoLmFicyhlbmRZKSA+IDApID8gc2l6ZVJlc3VsdC5oZWlnaHQgKiBlbmRZIDogZW5kWTtcbiAgICBlbmRYID0gbG9jUmVzdWx0LnggKyBvZmZzZXRYO1xuICAgIGVuZFkgPSBsb2NSZXN1bHQueSArIG9mZnNldFk7XG4gICAgLy8gaWYgdGhlIHRhcmdldCBlbGVtZW50IHdhcyBwcm92aWRlZCwgdGhlIGNvb3JkaW5hdGVzIGZvciB0aGUgZGVzdGluYXRpb24gbmVlZCB0byBiZSByZWxhdGl2ZSB0byBpdC5cbiAgICBpZiAodXRpbC5oYXNWYWx1ZShlbGVtZW50KSkge1xuICAgICAgbGV0IGZpcnN0RWxMb2NhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZWxlbWVudCk7XG4gICAgICBlbmRYIC09IGZpcnN0RWxMb2NhdGlvbi54O1xuICAgICAgZW5kWSAtPSBmaXJzdEVsTG9jYXRpb24ueTtcbiAgICB9XG4gIH1cbiAgLy8gY2xpZW50cyBhcmUgcmVzcG9uc2libGUgdG8gdXNlIHRoZXNlIG9wdGlvbnMgY29ycmVjdGx5XG4gIHJldHVybiB7c3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCB0b3VjaENvdW50LCBlbGVtZW50fTtcbn07XG5cbmNvbW1hbmRzLnBlcmZvcm1Ub3VjaCA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1Ub3VjaCAoZ2VzdHVyZXMpIHtcbiAgLy8gcHJlc3Mtd2FpdC1tb3ZlVG8tcmVsZWFzZSBpcyBgc3dpcGVgLCBzbyB1c2UgbmF0aXZlIG1ldGhvZFxuICBpZiAoZ2VzdHVyZXMubGVuZ3RoID09PSA0ICYmXG4gICAgICBnZXN0dXJlc1swXS5hY3Rpb24gPT09ICdwcmVzcycgJiZcbiAgICAgIGdlc3R1cmVzWzFdLmFjdGlvbiA9PT0gJ3dhaXQnICYmXG4gICAgICBnZXN0dXJlc1syXS5hY3Rpb24gPT09ICdtb3ZlVG8nICYmXG4gICAgICBnZXN0dXJlc1szXS5hY3Rpb24gPT09ICdyZWxlYXNlJykge1xuXG4gICAgbGV0IHN3aXBlT3B0cyA9IGF3YWl0IHRoaXMuZ2V0U3dpcGVPcHRpb25zKGdlc3R1cmVzKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zd2lwZShzd2lwZU9wdHMuc3RhcnRYLCBzd2lwZU9wdHMuc3RhcnRZLCBzd2lwZU9wdHMuZW5kWCxcbiAgICAgICAgc3dpcGVPcHRzLmVuZFksIHN3aXBlT3B0cy5kdXJhdGlvbiwgc3dpcGVPcHRzLnRvdWNoQ291bnQsXG4gICAgICAgIHN3aXBlT3B0cy5lbGVtZW50KTtcbiAgfVxuICBsZXQgYWN0aW9ucyA9IF8ubWFwKGdlc3R1cmVzLCAnYWN0aW9uJyk7XG5cbiAgaWYgKGFjdGlvbnNbMF0gPT09ICdsb25nUHJlc3MnICYmIGFjdGlvbnNbMV0gPT09ICdtb3ZlVG8nICYmIGFjdGlvbnNbMl0gPT09ICdyZWxlYXNlJykge1xuICAgIC8vIHNvbWUgdGhpbmdzIGFyZSBzcGVjaWFsXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZG9Ub3VjaERyYWcoZ2VzdHVyZXMpO1xuICB9IGVsc2Uge1xuICAgIGlmIChhY3Rpb25zLmxlbmd0aCA9PT0gMikge1xuICAgICAgLy8gYHByZXNzYCB3aXRob3V0IGEgd2FpdCBpcyB0b28gc2xvdyBhbmQgZ2V0cyBpbnRlcnByZXR0ZWQgYXMgYSBgbG9uZ1ByZXNzYFxuICAgICAgaWYgKF8uaGVhZChhY3Rpb25zKSA9PT0gJ3ByZXNzJyAmJiBfLmxhc3QoYWN0aW9ucykgPT09ICdyZWxlYXNlJykge1xuICAgICAgICBhY3Rpb25zWzBdID0gJ3RhcCc7XG4gICAgICAgIGdlc3R1cmVzWzBdLmFjdGlvbiA9ICd0YXAnO1xuICAgICAgfVxuXG4gICAgICAvLyB0aGUgYGxvbmdQcmVzc2AgYW5kIGB0YXBgIG1ldGhvZHMgcmVsZWFzZSBvbiB0aGVpciBvd25cbiAgICAgIGlmICgoXy5oZWFkKGFjdGlvbnMpID09PSAndGFwJyB8fCBfLmhlYWQoYWN0aW9ucykgPT09ICdsb25nUHJlc3MnKSAmJiBfLmxhc3QoYWN0aW9ucykgPT09ICdyZWxlYXNlJykge1xuICAgICAgICBnZXN0dXJlcy5wb3AoKTtcbiAgICAgICAgYWN0aW9ucy5wb3AoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9uZ3ByZXNzIGZvbGxvd2VkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gcmVsZWFzZSBzaG91bGQgYmVjb21lIGEgcHJlc3MgYW5kIHdhaXRcbiAgICAgIGlmIChhY3Rpb25zWzBdID09PSAnbG9uZ1ByZXNzJykge1xuICAgICAgICBhY3Rpb25zID0gWydwcmVzcycsICd3YWl0JywgLi4uYWN0aW9ucy5zbGljZSgxKV07XG5cbiAgICAgICAgbGV0IHByZXNzID0gZ2VzdHVyZXMuc2hpZnQoKTtcbiAgICAgICAgcHJlc3MuYWN0aW9uID0gJ3ByZXNzJztcbiAgICAgICAgbGV0IHdhaXQgPSB7XG4gICAgICAgICAgYWN0aW9uOiAnd2FpdCcsXG4gICAgICAgICAgb3B0aW9uczoge21zOiBwcmVzcy5vcHRpb25zLmR1cmF0aW9uIHx8IDEwMDB9XG4gICAgICAgIH07XG4gICAgICAgIGRlbGV0ZSBwcmVzcy5vcHRpb25zLmR1cmF0aW9uO1xuICAgICAgICBnZXN0dXJlcyA9IFtwcmVzcywgd2FpdCwgLi4uZ2VzdHVyZXNdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBmaXhlZEdlc3R1cmVzID0gYXdhaXQgdGhpcy5wYXJzZVRvdWNoKGdlc3R1cmVzLCBmYWxzZSk7XG4gICAgLy8gZml4IHJlbGVhc2UgYWN0aW9uIHRoZW4gcGVyZm9ybSBhbGwgYWN0aW9uc1xuICAgIGlmIChhY3Rpb25zW2FjdGlvbnMubGVuZ3RoIC0gMV0gPT09ICdyZWxlYXNlJykge1xuICAgICAgYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdID0gYXdhaXQgdGhpcy5maXhSZWxlYXNlKGdlc3R1cmVzKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZyBvZiBmaXhlZEdlc3R1cmVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnBlcmZvcm1HZXN0dXJlKGcpO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy5wYXJzZVRvdWNoID0gYXN5bmMgZnVuY3Rpb24gcGFyc2VUb3VjaCAoZ2VzdHVyZXMsIG11bHRpKSB7XG4gIC8vIGJlY2F1c2UgbXVsdGktdG91Y2ggcmVsZWFzZXMgYXQgdGhlIGVuZCBieSBkZWZhdWx0XG4gIGlmIChtdWx0aSAmJiBfLmxhc3QoZ2VzdHVyZXMpLmFjdGlvbiA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgZ2VzdHVyZXMucG9wKCk7XG4gIH1cblxuICBsZXQgdG91Y2hTdGF0ZU9iamVjdHMgPSBhd2FpdCBhc3luY21hcChnZXN0dXJlcywgYXN5bmMgKGdlc3R1cmUpID0+IHtcbiAgICBsZXQgb3B0aW9ucyA9IGdlc3R1cmUub3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoXy5pbmNsdWRlcyhbJ3ByZXNzJywgJ21vdmVUbycsICd0YXAnLCAnbG9uZ1ByZXNzJ10sIGdlc3R1cmUuYWN0aW9uKSkge1xuICAgICAgb3B0aW9ucy5vZmZzZXQgPSBmYWxzZTtcbiAgICAgIGxldCBlbGVtZW50SWQgPSBnZXN0dXJlLm9wdGlvbnMuZWxlbWVudDtcbiAgICAgIGlmIChlbGVtZW50SWQpIHtcbiAgICAgICAgbGV0IHBvcyA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZWxlbWVudElkKTtcbiAgICAgICAgaWYgKGdlc3R1cmUub3B0aW9ucy54IHx8IGdlc3R1cmUub3B0aW9ucy55KSB7XG4gICAgICAgICAgb3B0aW9ucy54ID0gcG9zLnggKyAoZ2VzdHVyZS5vcHRpb25zLnggfHwgMCk7XG4gICAgICAgICAgb3B0aW9ucy55ID0gcG9zLnkgKyAoZ2VzdHVyZS5vcHRpb25zLnkgfHwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRTaXplKGVsZW1lbnRJZCk7XG4gICAgICAgICAgb3B0aW9ucy54ID0gcG9zLnggKyAod2lkdGggLyAyKTtcbiAgICAgICAgICBvcHRpb25zLnkgPSBwb3MueSArIChoZWlnaHQgLyAyKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG91Y2hTdGF0ZU9iamVjdCA9IHtcbiAgICAgICAgICBhY3Rpb246IGdlc3R1cmUuYWN0aW9uLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgdGltZU9mZnNldDogMC4wMDUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0b3VjaFN0YXRlT2JqZWN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy54ID0gKGdlc3R1cmUub3B0aW9ucy54IHx8IDApO1xuICAgICAgICBvcHRpb25zLnkgPSAoZ2VzdHVyZS5vcHRpb25zLnkgfHwgMCk7XG5cbiAgICAgICAgbGV0IHRvdWNoU3RhdGVPYmplY3QgPSB7XG4gICAgICAgICAgYWN0aW9uOiBnZXN0dXJlLmFjdGlvbixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHRpbWVPZmZzZXQ6IDAuMDA1LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdG91Y2hTdGF0ZU9iamVjdDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG9mZnNldCA9IDAuMDA1O1xuICAgICAgaWYgKGdlc3R1cmUuYWN0aW9uID09PSAnd2FpdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IGdlc3R1cmUub3B0aW9ucztcbiAgICAgICAgb2Zmc2V0ID0gKHBhcnNlSW50KGdlc3R1cmUub3B0aW9ucy5tcywgMTApIC8gMTAwMCk7XG4gICAgICB9XG4gICAgICBsZXQgdG91Y2hTdGF0ZU9iamVjdCA9IHtcbiAgICAgICAgYWN0aW9uOiBnZXN0dXJlLmFjdGlvbixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgdGltZU9mZnNldDogb2Zmc2V0LFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b3VjaFN0YXRlT2JqZWN0O1xuICAgIH1cbiAgfSwgZmFsc2UpO1xuICAvLyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgdGltZSAod2hpY2ggaXMgbm93IGFuIG9mZnNldClcbiAgLy8gYW5kIHRoZSBwb3NpdGlvbiAod2hpY2ggbWF5IGJlIGFuIG9mZnNldClcbiAgbGV0IHByZXZQb3MgPSBudWxsLFxuICAgICAgdGltZSA9IDA7XG4gIGZvciAobGV0IHN0YXRlIG9mIHRvdWNoU3RhdGVPYmplY3RzKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc3RhdGUub3B0aW9ucy54KSAmJiBfLmlzVW5kZWZpbmVkKHN0YXRlLm9wdGlvbnMueSkgJiYgcHJldlBvcyAhPT0gbnVsbCkge1xuICAgICAgLy8gdGhpcyBoYXBwZW5zIHdpdGggd2FpdFxuICAgICAgc3RhdGUub3B0aW9ucy54ID0gcHJldlBvcy54O1xuICAgICAgc3RhdGUub3B0aW9ucy55ID0gcHJldlBvcy55O1xuICAgIH1cbiAgICBpZiAoc3RhdGUub3B0aW9ucy5vZmZzZXQgJiYgcHJldlBvcykge1xuICAgICAgLy8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYW4gb2Zmc2V0XG4gICAgICBzdGF0ZS5vcHRpb25zLnggKz0gcHJldlBvcy54O1xuICAgICAgc3RhdGUub3B0aW9ucy55ICs9IHByZXZQb3MueTtcbiAgICB9XG4gICAgZGVsZXRlIHN0YXRlLm9wdGlvbnMub2Zmc2V0O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLngpICYmICFfLmlzVW5kZWZpbmVkKHN0YXRlLm9wdGlvbnMueSkpIHtcbiAgICAgIHByZXZQb3MgPSBzdGF0ZS5vcHRpb25zO1xuICAgIH1cblxuICAgIGlmIChtdWx0aSkge1xuICAgICAgbGV0IHRpbWVPZmZzZXQgPSBzdGF0ZS50aW1lT2Zmc2V0O1xuICAgICAgdGltZSArPSB0aW1lT2Zmc2V0O1xuICAgICAgc3RhdGUudGltZSA9IGFuZHJvaWRIZWxwZXJzLnRydW5jYXRlRGVjaW1hbHModGltZSwgMyk7XG5cbiAgICAgIC8vIG11bHRpIGdlc3R1cmVzIHJlcXVpcmUgJ3RvdWNoJyByYXRoZXIgdGhhbiAnb3B0aW9ucydcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChzdGF0ZS5vcHRpb25zLngpICYmICFfLmlzVW5kZWZpbmVkKHN0YXRlLm9wdGlvbnMueSkpIHtcbiAgICAgICAgc3RhdGUudG91Y2ggPSB7XG4gICAgICAgICAgeDogc3RhdGUub3B0aW9ucy54LFxuICAgICAgICAgIHk6IHN0YXRlLm9wdGlvbnMueVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgZGVsZXRlIHN0YXRlLm9wdGlvbnM7XG4gICAgfVxuICAgIGRlbGV0ZSBzdGF0ZS50aW1lT2Zmc2V0O1xuICB9XG4gIHJldHVybiB0b3VjaFN0YXRlT2JqZWN0cztcbn07XG5cblxuY29tbWFuZHMucGVyZm9ybU11bHRpQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gcGVyZm9ybU11bHRpQWN0aW9uIChhY3Rpb25zLCBlbGVtZW50SWQpIHtcbiAgLy8gQW5kcm9pZCBuZWVkcyBhdCBsZWFzdCB0d28gYWN0aW9ucyB0byBiZSBhYmxlIHRvIHBlcmZvcm0gYSBtdWx0aSBwb2ludGVyIGdlc3R1cmVcbiAgaWYgKGFjdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aSBQb2ludGVyIEdlc3R1cmVzIG5lZWQgYXQgbGVhc3QgdHdvIGFjdGlvbnMuICcgK1xuICAgICAgICAnVXNlIFRvdWNoIEFjdGlvbnMgZm9yIGEgc2luZ2xlIGFjdGlvbi4nKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlcyA9IGF3YWl0IGFzeW5jbWFwKGFjdGlvbnMsIGFzeW5jIChhY3Rpb24pID0+IGF3YWl0IHRoaXMucGFyc2VUb3VjaChhY3Rpb24sIHRydWUpLCBmYWxzZSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZG9QZXJmb3JtTXVsdGlBY3Rpb24oZWxlbWVudElkLCBzdGF0ZXMpO1xufTtcblxuLyoqXG4gKiBSZWFzb24gZm9yIGlzb2xhdGluZyBkb1BlcmZvcm1NdWx0aUFjdGlvbiBmcm9tIHBlcmZvcm1NdWx0aUFjdGlvbiBpcyBmb3IgcmV1c2luZyBwZXJmb3JtTXVsdGlBY3Rpb25cbiAqIGFjcm9zcyBhbmRyb2lkLWRyaXZlcnMgKGxpa2UgYXBwaXVtLXVpYXV0b21hdG9yMi1kcml2ZXIpIGFuZCB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLlxuICogT3RoZXIgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBuZWVkIHRvIG92ZXJyaWRlIGRvUGVyZm9ybU11bHRpQWN0aW9uXG4gKiB0byBmYWNpbGl0YXRlIHBlcmZvcm1NdWx0aUFjdGlvbi5cbiAqL1xuY29tbWFuZHMuZG9QZXJmb3JtTXVsdGlBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBkb1BlcmZvcm1NdWx0aUFjdGlvbiAoZWxlbWVudElkLCBzdGF0ZXMpIHtcbiAgbGV0IG9wdHM7XG4gIGlmIChlbGVtZW50SWQpIHtcbiAgICBvcHRzID0ge1xuICAgICAgZWxlbWVudElkLFxuICAgICAgYWN0aW9uczogc3RhdGVzXG4gICAgfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwZXJmb3JtTXVsdGlQb2ludGVyR2VzdHVyZScsIG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIG9wdHMgPSB7XG4gICAgICBhY3Rpb25zOiBzdGF0ZXNcbiAgICB9O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwZXJmb3JtTXVsdGlQb2ludGVyR2VzdHVyZScsIG9wdHMpO1xuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGVBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFNBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUlNLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxR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
@@ -1 +1 @@
1
- {"version":3,"file":"touch.js","names":["_lodash","_interopRequireDefault","require","_androidHelpers","_bluebird","_driver","_asyncbox","_support","commands","helpers","extensions","exports","getCoordDefault","val","util","hasValue","getSwipeTouchDuration","waitGesture","duration","options","ms","doTouchAction","action","opts","element","x","y","count","tap","touchDown","touchUp","touchMove","B","delay","touchLongClick","log","warn","errorAndThrow","doTouchDrag","gestures","longPress","moveTo","startX","startY","endX","endY","getLocationInView","apiLevel","adb","getApiLevel","Math","max","drag","fixRelease","release","_","last","clone","ref","gesture","reverse","loc","size","getSize","width","height","pick","performGesture","e","isErrorType","errors","NoSuchElementError","debug","getSwipeOptions","touchCount","destElement","locResult","sizeResult","offsetX","abs","offsetY","firstElLocation","performTouch","length","swipeOpts","swipe","actions","map","head","pop","slice","press","shift","wait","fixedGestures","parseTouch","g","multi","touchStateObjects","asyncmap","includes","offset","elementId","pos","touchStateObject","timeOffset","parseInt","prevPos","time","state","isUndefined","androidHelpers","truncateDecimals","touch","performMultiAction","Error","states","doPerformMultiAction","bootstrap","sendAction","Object","assign","_default","default"],"sources":["../../../lib/commands/touch.js"],"sourcesContent":["import _ from 'lodash';\nimport androidHelpers from '../android-helpers';\nimport B from 'bluebird';\nimport { errors, isErrorType } from 'appium/driver';\nimport { asyncmap } from 'asyncbox';\nimport { util } from '@appium/support';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nfunction getCoordDefault (val) {\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. Same\n // thing with destElement below.\n return util.hasValue(val) ? val : 0.5;\n}\n\nfunction getSwipeTouchDuration (waitGesture) {\n // the touch action api uses ms, we want seconds\n // 0.8 is the default time for the operation\n let duration = 0.8;\n if (typeof waitGesture.options.ms !== 'undefined' && waitGesture.options.ms) {\n duration = waitGesture.options.ms / 1000;\n if (duration === 0) {\n // set to a very low number, since they wanted it fast\n // but below 0.1 becomes 0 steps, which causes errors\n duration = 0.1;\n }\n }\n return duration;\n}\n\ncommands.doTouchAction = async function doTouchAction (action, opts = {}) {\n const { element, x, y, count, ms, duration } = opts;\n // parseTouch precalculates absolute element positions\n // so there is no need to pass `element` to the affected gestures\n switch (action) {\n case 'tap':\n return await this.tap(null, x, y, count);\n case 'press':\n return await this.touchDown(null, x, y);\n case 'release':\n return await this.touchUp(element, x, y);\n case 'moveTo':\n return await this.touchMove(null, x, y);\n case 'wait':\n return await B.delay(ms);\n case 'longPress':\n return await this.touchLongClick(null, x, y, duration || 1000);\n case 'cancel':\n // TODO: clarify behavior of 'cancel' action and fix this\n this.log.warn('Cancel action currently has no effect');\n break;\n default:\n this.log.errorAndThrow(`unknown action ${action}`);\n }\n};\n\n// drag is *not* press-move-release, so we need to translate\n// drag works fine for scroll, as well\nhelpers.doTouchDrag = async function doTouchDrag (gestures) {\n let longPress = gestures[0];\n let moveTo = gestures[1];\n let startX = longPress.options.x || 0,\n startY = longPress.options.y || 0,\n endX = moveTo.options.x || 0,\n endY = moveTo.options.y || 0;\n if (longPress.options.element) {\n let {x, y} = await this.getLocationInView(longPress.options.element);\n startX += x || 0;\n startY += y || 0;\n }\n if (moveTo.options.element) {\n let {x, y} = await this.getLocationInView(moveTo.options.element);\n endX += x || 0;\n endY += y || 0;\n }\n\n let apiLevel = await this.adb.getApiLevel();\n // lollipop takes a little longer to get things rolling\n let duration = apiLevel >= 5 ? 2 : 1;\n // make sure that if the long press has a duration, we use it.\n if (longPress.options && longPress.options.duration) {\n duration = Math.max(longPress.options.duration / 1000, duration);\n }\n\n // `drag` will take care of whether there is an element or not at that level\n return await this.drag(startX, startY, endX, endY, duration, 1, longPress.options.element, moveTo.options.element);\n};\n\n// Release gesture needs element or co-ordinates to release it from that position\n// or else release gesture is performed from center of the screen, so to fix it\n// This method sets co-ordinates/element to release gesture if it has no options set already.\nhelpers.fixRelease = async function fixRelease (gestures) {\n let release = _.last(gestures);\n // sometimes there are no options\n release.options = release.options || {};\n // nothing to do if release options are already set\n if (release.options.element || (release.options.x && release.options.y)) {\n return;\n }\n // without coordinates, `release` uses the center of the screen, which,\n // generally speaking, is not what we want\n // therefore: loop backwards and use the last command with an element and/or\n // offset coordinates\n gestures = _.clone(gestures);\n let ref = null;\n for (let gesture of gestures.reverse()) {\n let opts = gesture.options;\n if (opts.element || (opts.x && opts.y)) {\n ref = gesture;\n break;\n }\n }\n if (ref) {\n let opts = ref.options;\n if (opts.element) {\n let loc = await this.getLocationInView(opts.element);\n if (opts.x && opts.y) {\n // this is an offset from the element\n release.options = {\n x: loc.x + opts.x,\n y: loc.y + opts.y\n };\n } else {\n // this is the center of the element\n let size = await this.getSize(opts.element);\n release.options = {\n x: loc.x + size.width / 2,\n y: loc.y + size.height / 2\n };\n }\n } else {\n release.options = _.pick(opts, 'x', 'y');\n }\n }\n return release;\n};\n\n// Perform one gesture\nhelpers.performGesture = async function performGesture (gesture) {\n try {\n return await this.doTouchAction(gesture.action, gesture.options || {});\n } catch (e) {\n // sometime the element is not available when releasing, retry without it\n if (isErrorType(e, errors.NoSuchElementError) && gesture.action === 'release' &&\n gesture.options.element) {\n delete gesture.options.element;\n this.log.debug(`retrying release without element opts: ${gesture.options}.`);\n return await this.doTouchAction(gesture.action, gesture.options || {});\n }\n throw e;\n }\n};\n\ncommands.getSwipeOptions = async function getSwipeOptions (gestures, touchCount = 1) {\n let startX = getCoordDefault(gestures[0].options.x),\n startY = getCoordDefault(gestures[0].options.y),\n endX = getCoordDefault(gestures[2].options.x),\n endY = getCoordDefault(gestures[2].options.y),\n duration = getSwipeTouchDuration(gestures[1]),\n element = gestures[0].options.element,\n destElement = gestures[2].options.element || gestures[0].options.element;\n\n // there's no destination element handling in bootstrap and since it applies to all platforms, we handle it here\n if (util.hasValue(destElement)) {\n let locResult = await this.getLocationInView(destElement);\n let sizeResult = await this.getSize(destElement);\n let offsetX = (Math.abs(endX) < 1 && Math.abs(endX) > 0) ? sizeResult.width * endX : endX;\n let offsetY = (Math.abs(endY) < 1 && Math.abs(endY) > 0) ? sizeResult.height * endY : endY;\n endX = locResult.x + offsetX;\n endY = locResult.y + offsetY;\n // if the target element was provided, the coordinates for the destination need to be relative to it.\n if (util.hasValue(element)) {\n let firstElLocation = await this.getLocationInView(element);\n endX -= firstElLocation.x;\n endY -= firstElLocation.y;\n }\n }\n // clients are responsible to use these options correctly\n return {startX, startY, endX, endY, duration, touchCount, element};\n};\n\ncommands.performTouch = async function performTouch (gestures) {\n // press-wait-moveTo-release is `swipe`, so use native method\n if (gestures.length === 4 &&\n gestures[0].action === 'press' &&\n gestures[1].action === 'wait' &&\n gestures[2].action === 'moveTo' &&\n gestures[3].action === 'release') {\n\n let swipeOpts = await this.getSwipeOptions(gestures);\n return await this.swipe(swipeOpts.startX, swipeOpts.startY, swipeOpts.endX,\n swipeOpts.endY, swipeOpts.duration, swipeOpts.touchCount,\n swipeOpts.element);\n }\n let actions = _.map(gestures, 'action');\n\n if (actions[0] === 'longPress' && actions[1] === 'moveTo' && actions[2] === 'release') {\n // some things are special\n return await this.doTouchDrag(gestures);\n } else {\n if (actions.length === 2) {\n // `press` without a wait is too slow and gets interpretted as a `longPress`\n if (_.head(actions) === 'press' && _.last(actions) === 'release') {\n actions[0] = 'tap';\n gestures[0].action = 'tap';\n }\n\n // the `longPress` and `tap` methods release on their own\n if ((_.head(actions) === 'tap' || _.head(actions) === 'longPress') && _.last(actions) === 'release') {\n gestures.pop();\n actions.pop();\n }\n } else {\n // longpress followed by anything other than release should become a press and wait\n if (actions[0] === 'longPress') {\n actions = ['press', 'wait', ...actions.slice(1)];\n\n let press = gestures.shift();\n press.action = 'press';\n let wait = {\n action: 'wait',\n options: {ms: press.options.duration || 1000}\n };\n delete press.options.duration;\n gestures = [press, wait, ...gestures];\n }\n }\n\n let fixedGestures = await this.parseTouch(gestures, false);\n // fix release action then perform all actions\n if (actions[actions.length - 1] === 'release') {\n actions[actions.length - 1] = await this.fixRelease(gestures);\n }\n for (let g of fixedGestures) {\n await this.performGesture(g);\n }\n }\n};\n\nhelpers.parseTouch = async function parseTouch (gestures, multi) {\n // because multi-touch releases at the end by default\n if (multi && _.last(gestures).action === 'release') {\n gestures.pop();\n }\n\n let touchStateObjects = await asyncmap(gestures, async (gesture) => {\n let options = gesture.options || {};\n if (_.includes(['press', 'moveTo', 'tap', 'longPress'], gesture.action)) {\n options.offset = false;\n let elementId = gesture.options.element;\n if (elementId) {\n let pos = await this.getLocationInView(elementId);\n if (gesture.options.x || gesture.options.y) {\n options.x = pos.x + (gesture.options.x || 0);\n options.y = pos.y + (gesture.options.y || 0);\n } else {\n const {width, height} = await this.getSize(elementId);\n options.x = pos.x + (width / 2);\n options.y = pos.y + (height / 2);\n }\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: 0.005,\n };\n return touchStateObject;\n } else {\n options.x = (gesture.options.x || 0);\n options.y = (gesture.options.y || 0);\n\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: 0.005,\n };\n return touchStateObject;\n }\n } else {\n let offset = 0.005;\n if (gesture.action === 'wait') {\n options = gesture.options;\n offset = (parseInt(gesture.options.ms, 10) / 1000);\n }\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: offset,\n };\n return touchStateObject;\n }\n }, false);\n // we need to change the time (which is now an offset)\n // and the position (which may be an offset)\n let prevPos = null,\n time = 0;\n for (let state of touchStateObjects) {\n if (_.isUndefined(state.options.x) && _.isUndefined(state.options.y) && prevPos !== null) {\n // this happens with wait\n state.options.x = prevPos.x;\n state.options.y = prevPos.y;\n }\n if (state.options.offset && prevPos) {\n // the current position is an offset\n state.options.x += prevPos.x;\n state.options.y += prevPos.y;\n }\n delete state.options.offset;\n if (!_.isUndefined(state.options.x) && !_.isUndefined(state.options.y)) {\n prevPos = state.options;\n }\n\n if (multi) {\n let timeOffset = state.timeOffset;\n time += timeOffset;\n state.time = androidHelpers.truncateDecimals(time, 3);\n\n // multi gestures require 'touch' rather than 'options'\n if (!_.isUndefined(state.options.x) && !_.isUndefined(state.options.y)) {\n state.touch = {\n x: state.options.x,\n y: state.options.y\n };\n }\n delete state.options;\n }\n delete state.timeOffset;\n }\n return touchStateObjects;\n};\n\n\ncommands.performMultiAction = async function performMultiAction (actions, elementId) {\n // Android needs at least two actions to be able to perform a multi pointer gesture\n if (actions.length === 1) {\n throw new Error('Multi Pointer Gestures need at least two actions. ' +\n 'Use Touch Actions for a single action.');\n }\n\n const states = await asyncmap(actions, async (action) => await this.parseTouch(action, true), false);\n\n return await this.doPerformMultiAction(elementId, states);\n};\n\n/**\n * Reason for isolating doPerformMultiAction from performMultiAction is for reusing performMultiAction\n * across android-drivers (like appium-uiautomator2-driver) and to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doPerformMultiAction\n * to facilitate performMultiAction.\n */\ncommands.doPerformMultiAction = async function doPerformMultiAction (elementId, states) {\n let opts;\n if (elementId) {\n opts = {\n elementId,\n actions: states\n };\n return await this.bootstrap.sendAction('element:performMultiPointerGesture', opts);\n } else {\n opts = {\n actions: states\n };\n return await this.bootstrap.sendAction('performMultiPointerGesture', opts);\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,SAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAL,OAAA;AAEA,IAAIM,QAAQ,GAAG,CAAC,CAAC;EAAEC,OAAO,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAF,OAAA,GAAAA,OAAA;AAAAE,OAAA,CAAAH,QAAA,GAAAA,QAAA;AAEjD,SAASI,eAAeA,CAAEC,GAAG,EAAE;EAI7B,OAAOC,aAAI,CAACC,QAAQ,CAACF,GAAG,CAAC,GAAGA,GAAG,GAAG,GAAG;AACvC;AAEA,SAASG,qBAAqBA,CAAEC,WAAW,EAAE;EAG3C,IAAIC,QAAQ,GAAG,GAAG;EAClB,IAAI,OAAOD,WAAW,CAACE,OAAO,CAACC,EAAE,KAAK,WAAW,IAAIH,WAAW,CAACE,OAAO,CAACC,EAAE,EAAE;IAC3EF,QAAQ,GAAGD,WAAW,CAACE,OAAO,CAACC,EAAE,GAAG,IAAI;IACxC,IAAIF,QAAQ,KAAK,CAAC,EAAE;MAGlBA,QAAQ,GAAG,GAAG;IAChB;EACF;EACA,OAAOA,QAAQ;AACjB;AAEAV,QAAQ,CAACa,aAAa,GAAG,eAAeA,aAAaA,CAAEC,MAAM,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EACxE,MAAM;IAAEC,OAAO;IAAEC,CAAC;IAAEC,CAAC;IAAEC,KAAK;IAAEP,EAAE;IAAEF;EAAS,CAAC,GAAGK,IAAI;EAGnD,QAAQD,MAAM;IACZ,KAAK,KAAK;MACR,OAAO,MAAM,IAAI,CAACM,GAAG,CAAC,IAAI,EAAEH,CAAC,EAAEC,CAAC,EAAEC,KAAK,CAAC;IAC1C,KAAK,OAAO;MACV,OAAO,MAAM,IAAI,CAACE,SAAS,CAAC,IAAI,EAAEJ,CAAC,EAAEC,CAAC,CAAC;IACzC,KAAK,SAAS;MACZ,OAAO,MAAM,IAAI,CAACI,OAAO,CAACN,OAAO,EAAEC,CAAC,EAAEC,CAAC,CAAC;IAC1C,KAAK,QAAQ;MACX,OAAO,MAAM,IAAI,CAACK,SAAS,CAAC,IAAI,EAAEN,CAAC,EAAEC,CAAC,CAAC;IACzC,KAAK,MAAM;MACT,OAAO,MAAMM,iBAAC,CAACC,KAAK,CAACb,EAAE,CAAC;IAC1B,KAAK,WAAW;MACd,OAAO,MAAM,IAAI,CAACc,cAAc,CAAC,IAAI,EAAET,CAAC,EAAEC,CAAC,EAAER,QAAQ,IAAI,IAAI,CAAC;IAChE,KAAK,QAAQ;MAEX,IAAI,CAACiB,GAAG,CAACC,IAAI,CAAC,uCAAuC,CAAC;MACtD;IACF;MACE,IAAI,CAACD,GAAG,CAACE,aAAa,CAAE,kBAAiBf,MAAO,EAAC,CAAC;EAAC;AAEzD,CAAC;AAIDb,OAAO,CAAC6B,WAAW,GAAG,eAAeA,WAAWA,CAAEC,QAAQ,EAAE;EAC1D,IAAIC,SAAS,GAAGD,QAAQ,CAAC,CAAC,CAAC;EAC3B,IAAIE,MAAM,GAAGF,QAAQ,CAAC,CAAC,CAAC;EACxB,IAAIG,MAAM,GAAGF,SAAS,CAACrB,OAAO,CAACM,CAAC,IAAI,CAAC;IACjCkB,MAAM,GAAGH,SAAS,CAACrB,OAAO,CAACO,CAAC,IAAI,CAAC;IACjCkB,IAAI,GAAGH,MAAM,CAACtB,OAAO,CAACM,CAAC,IAAI,CAAC;IAC5BoB,IAAI,GAAGJ,MAAM,CAACtB,OAAO,CAACO,CAAC,IAAI,CAAC;EAChC,IAAIc,SAAS,CAACrB,OAAO,CAACK,OAAO,EAAE;IAC7B,IAAI;MAACC,CAAC;MAAEC;IAAC,CAAC,GAAG,MAAM,IAAI,CAACoB,iBAAiB,CAACN,SAAS,CAACrB,OAAO,CAACK,OAAO,CAAC;IACpEkB,MAAM,IAAIjB,CAAC,IAAI,CAAC;IAChBkB,MAAM,IAAIjB,CAAC,IAAI,CAAC;EAClB;EACA,IAAIe,MAAM,CAACtB,OAAO,CAACK,OAAO,EAAE;IAC1B,IAAI;MAACC,CAAC;MAAEC;IAAC,CAAC,GAAG,MAAM,IAAI,CAACoB,iBAAiB,CAACL,MAAM,CAACtB,OAAO,CAACK,OAAO,CAAC;IACjEoB,IAAI,IAAInB,CAAC,IAAI,CAAC;IACdoB,IAAI,IAAInB,CAAC,IAAI,CAAC;EAChB;EAEA,IAAIqB,QAAQ,GAAG,MAAM,IAAI,CAACC,GAAG,CAACC,WAAW,EAAE;EAE3C,IAAI/B,QAAQ,GAAG6B,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;EAEpC,IAAIP,SAAS,CAACrB,OAAO,IAAIqB,SAAS,CAACrB,OAAO,CAACD,QAAQ,EAAE;IACnDA,QAAQ,GAAGgC,IAAI,CAACC,GAAG,CAACX,SAAS,CAACrB,OAAO,CAACD,QAAQ,GAAG,IAAI,EAAEA,QAAQ,CAAC;EAClE;EAGA,OAAO,MAAM,IAAI,CAACkC,IAAI,CAACV,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAE3B,QAAQ,EAAE,CAAC,EAAEsB,SAAS,CAACrB,OAAO,CAACK,OAAO,EAAEiB,MAAM,CAACtB,OAAO,CAACK,OAAO,CAAC;AACpH,CAAC;AAKDf,OAAO,CAAC4C,UAAU,GAAG,eAAeA,UAAUA,CAAEd,QAAQ,EAAE;EACxD,IAAIe,OAAO,GAAGC,eAAC,CAACC,IAAI,CAACjB,QAAQ,CAAC;EAE9Be,OAAO,CAACnC,OAAO,GAAGmC,OAAO,CAACnC,OAAO,IAAI,CAAC,CAAC;EAEvC,IAAImC,OAAO,CAACnC,OAAO,CAACK,OAAO,IAAK8B,OAAO,CAACnC,OAAO,CAACM,CAAC,IAAI6B,OAAO,CAACnC,OAAO,CAACO,CAAE,EAAE;IACvE;EACF;EAKAa,QAAQ,GAAGgB,eAAC,CAACE,KAAK,CAAClB,QAAQ,CAAC;EAC5B,IAAImB,GAAG,GAAG,IAAI;EACd,KAAK,IAAIC,OAAO,IAAIpB,QAAQ,CAACqB,OAAO,EAAE,EAAE;IACtC,IAAIrC,IAAI,GAAGoC,OAAO,CAACxC,OAAO;IAC1B,IAAII,IAAI,CAACC,OAAO,IAAKD,IAAI,CAACE,CAAC,IAAIF,IAAI,CAACG,CAAE,EAAE;MACtCgC,GAAG,GAAGC,OAAO;MACb;IACF;EACF;EACA,IAAID,GAAG,EAAE;IACP,IAAInC,IAAI,GAAGmC,GAAG,CAACvC,OAAO;IACtB,IAAII,IAAI,CAACC,OAAO,EAAE;MAChB,IAAIqC,GAAG,GAAG,MAAM,IAAI,CAACf,iBAAiB,CAACvB,IAAI,CAACC,OAAO,CAAC;MACpD,IAAID,IAAI,CAACE,CAAC,IAAIF,IAAI,CAACG,CAAC,EAAE;QAEpB4B,OAAO,CAACnC,OAAO,GAAG;UAChBM,CAAC,EAAEoC,GAAG,CAACpC,CAAC,GAAGF,IAAI,CAACE,CAAC;UACjBC,CAAC,EAAEmC,GAAG,CAACnC,CAAC,GAAGH,IAAI,CAACG;QAClB,CAAC;MACH,CAAC,MAAM;QAEL,IAAIoC,IAAI,GAAG,MAAM,IAAI,CAACC,OAAO,CAACxC,IAAI,CAACC,OAAO,CAAC;QAC3C8B,OAAO,CAACnC,OAAO,GAAG;UAChBM,CAAC,EAAEoC,GAAG,CAACpC,CAAC,GAAGqC,IAAI,CAACE,KAAK,GAAG,CAAC;UACzBtC,CAAC,EAAEmC,GAAG,CAACnC,CAAC,GAAGoC,IAAI,CAACG,MAAM,GAAG;QAC3B,CAAC;MACH;IACF,CAAC,MAAM;MACLX,OAAO,CAACnC,OAAO,GAAGoC,eAAC,CAACW,IAAI,CAAC3C,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;IAC1C;EACF;EACA,OAAO+B,OAAO;AAChB,CAAC;AAGD7C,OAAO,CAAC0D,cAAc,GAAG,eAAeA,cAAcA,CAAER,OAAO,EAAE;EAC/D,IAAI;IACF,OAAO,MAAM,IAAI,CAACtC,aAAa,CAACsC,OAAO,CAACrC,MAAM,EAAEqC,OAAO,CAACxC,OAAO,IAAI,CAAC,CAAC,CAAC;EACxE,CAAC,CAAC,OAAOiD,CAAC,EAAE;IAEV,IAAI,IAAAC,mBAAW,EAACD,CAAC,EAAEE,cAAM,CAACC,kBAAkB,CAAC,IAAIZ,OAAO,CAACrC,MAAM,KAAK,SAAS,IACzEqC,OAAO,CAACxC,OAAO,CAACK,OAAO,EAAE;MAC3B,OAAOmC,OAAO,CAACxC,OAAO,CAACK,OAAO;MAC9B,IAAI,CAACW,GAAG,CAACqC,KAAK,CAAE,0CAAyCb,OAAO,CAACxC,OAAQ,GAAE,CAAC;MAC5E,OAAO,MAAM,IAAI,CAACE,aAAa,CAACsC,OAAO,CAACrC,MAAM,EAAEqC,OAAO,CAACxC,OAAO,IAAI,CAAC,CAAC,CAAC;IACxE;IACA,MAAMiD,CAAC;EACT;AACF,CAAC;AAED5D,QAAQ,CAACiE,eAAe,GAAG,eAAeA,eAAeA,CAAElC,QAAQ,EAAEmC,UAAU,GAAG,CAAC,EAAE;EACnF,IAAIhC,MAAM,GAAG9B,eAAe,CAAC2B,QAAQ,CAAC,CAAC,CAAC,CAACpB,OAAO,CAACM,CAAC,CAAC;IAC/CkB,MAAM,GAAG/B,eAAe,CAAC2B,QAAQ,CAAC,CAAC,CAAC,CAACpB,OAAO,CAACO,CAAC,CAAC;IAC/CkB,IAAI,GAAGhC,eAAe,CAAC2B,QAAQ,CAAC,CAAC,CAAC,CAACpB,OAAO,CAACM,CAAC,CAAC;IAC7CoB,IAAI,GAAGjC,eAAe,CAAC2B,QAAQ,CAAC,CAAC,CAAC,CAACpB,OAAO,CAACO,CAAC,CAAC;IAC7CR,QAAQ,GAAGF,qBAAqB,CAACuB,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7Cf,OAAO,GAAGe,QAAQ,CAAC,CAAC,CAAC,CAACpB,OAAO,CAACK,OAAO;IACrCmD,WAAW,GAAGpC,QAAQ,CAAC,CAAC,CAAC,CAACpB,OAAO,CAACK,OAAO,IAAIe,QAAQ,CAAC,CAAC,CAAC,CAACpB,OAAO,CAACK,OAAO;EAG5E,IAAIV,aAAI,CAACC,QAAQ,CAAC4D,WAAW,CAAC,EAAE;IAC9B,IAAIC,SAAS,GAAG,MAAM,IAAI,CAAC9B,iBAAiB,CAAC6B,WAAW,CAAC;IACzD,IAAIE,UAAU,GAAG,MAAM,IAAI,CAACd,OAAO,CAACY,WAAW,CAAC;IAChD,IAAIG,OAAO,GAAI5B,IAAI,CAAC6B,GAAG,CAACnC,IAAI,CAAC,GAAG,CAAC,IAAIM,IAAI,CAAC6B,GAAG,CAACnC,IAAI,CAAC,GAAG,CAAC,GAAIiC,UAAU,CAACb,KAAK,GAAGpB,IAAI,GAAGA,IAAI;IACzF,IAAIoC,OAAO,GAAI9B,IAAI,CAAC6B,GAAG,CAAClC,IAAI,CAAC,GAAG,CAAC,IAAIK,IAAI,CAAC6B,GAAG,CAAClC,IAAI,CAAC,GAAG,CAAC,GAAIgC,UAAU,CAACZ,MAAM,GAAGpB,IAAI,GAAGA,IAAI;IAC1FD,IAAI,GAAGgC,SAAS,CAACnD,CAAC,GAAGqD,OAAO;IAC5BjC,IAAI,GAAG+B,SAAS,CAAClD,CAAC,GAAGsD,OAAO;IAE5B,IAAIlE,aAAI,CAACC,QAAQ,CAACS,OAAO,CAAC,EAAE;MAC1B,IAAIyD,eAAe,GAAG,MAAM,IAAI,CAACnC,iBAAiB,CAACtB,OAAO,CAAC;MAC3DoB,IAAI,IAAIqC,eAAe,CAACxD,CAAC;MACzBoB,IAAI,IAAIoC,eAAe,CAACvD,CAAC;IAC3B;EACF;EAEA,OAAO;IAACgB,MAAM;IAAEC,MAAM;IAAEC,IAAI;IAAEC,IAAI;IAAE3B,QAAQ;IAAEwD,UAAU;IAAElD;EAAO,CAAC;AACpE,CAAC;AAEDhB,QAAQ,CAAC0E,YAAY,GAAG,eAAeA,YAAYA,CAAE3C,QAAQ,EAAE;EAE7D,IAAIA,QAAQ,CAAC4C,MAAM,KAAK,CAAC,IACrB5C,QAAQ,CAAC,CAAC,CAAC,CAACjB,MAAM,KAAK,OAAO,IAC9BiB,QAAQ,CAAC,CAAC,CAAC,CAACjB,MAAM,KAAK,MAAM,IAC7BiB,QAAQ,CAAC,CAAC,CAAC,CAACjB,MAAM,KAAK,QAAQ,IAC/BiB,QAAQ,CAAC,CAAC,CAAC,CAACjB,MAAM,KAAK,SAAS,EAAE;IAEpC,IAAI8D,SAAS,GAAG,MAAM,IAAI,CAACX,eAAe,CAAClC,QAAQ,CAAC;IACpD,OAAO,MAAM,IAAI,CAAC8C,KAAK,CAACD,SAAS,CAAC1C,MAAM,EAAE0C,SAAS,CAACzC,MAAM,EAAEyC,SAAS,CAACxC,IAAI,EACtEwC,SAAS,CAACvC,IAAI,EAAEuC,SAAS,CAAClE,QAAQ,EAAEkE,SAAS,CAACV,UAAU,EACxDU,SAAS,CAAC5D,OAAO,CAAC;EACxB;EACA,IAAI8D,OAAO,GAAG/B,eAAC,CAACgC,GAAG,CAAChD,QAAQ,EAAE,QAAQ,CAAC;EAEvC,IAAI+C,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,IAAIA,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAIA,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;IAErF,OAAO,MAAM,IAAI,CAAChD,WAAW,CAACC,QAAQ,CAAC;EACzC,CAAC,MAAM;IACL,IAAI+C,OAAO,CAACH,MAAM,KAAK,CAAC,EAAE;MAExB,IAAI5B,eAAC,CAACiC,IAAI,CAACF,OAAO,CAAC,KAAK,OAAO,IAAI/B,eAAC,CAACC,IAAI,CAAC8B,OAAO,CAAC,KAAK,SAAS,EAAE;QAChEA,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;QAClB/C,QAAQ,CAAC,CAAC,CAAC,CAACjB,MAAM,GAAG,KAAK;MAC5B;MAGA,IAAI,CAACiC,eAAC,CAACiC,IAAI,CAACF,OAAO,CAAC,KAAK,KAAK,IAAI/B,eAAC,CAACiC,IAAI,CAACF,OAAO,CAAC,KAAK,WAAW,KAAK/B,eAAC,CAACC,IAAI,CAAC8B,OAAO,CAAC,KAAK,SAAS,EAAE;QACnG/C,QAAQ,CAACkD,GAAG,EAAE;QACdH,OAAO,CAACG,GAAG,EAAE;MACf;IACF,CAAC,MAAM;MAEL,IAAIH,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE;QAC9BA,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAGA,OAAO,CAACI,KAAK,CAAC,CAAC,CAAC,CAAC;QAEhD,IAAIC,KAAK,GAAGpD,QAAQ,CAACqD,KAAK,EAAE;QAC5BD,KAAK,CAACrE,MAAM,GAAG,OAAO;QACtB,IAAIuE,IAAI,GAAG;UACTvE,MAAM,EAAE,MAAM;UACdH,OAAO,EAAE;YAACC,EAAE,EAAEuE,KAAK,CAACxE,OAAO,CAACD,QAAQ,IAAI;UAAI;QAC9C,CAAC;QACD,OAAOyE,KAAK,CAACxE,OAAO,CAACD,QAAQ;QAC7BqB,QAAQ,GAAG,CAACoD,KAAK,EAAEE,IAAI,EAAE,GAAGtD,QAAQ,CAAC;MACvC;IACF;IAEA,IAAIuD,aAAa,GAAG,MAAM,IAAI,CAACC,UAAU,CAACxD,QAAQ,EAAE,KAAK,CAAC;IAE1D,IAAI+C,OAAO,CAACA,OAAO,CAACH,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,EAAE;MAC7CG,OAAO,CAACA,OAAO,CAACH,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC9B,UAAU,CAACd,QAAQ,CAAC;IAC/D;IACA,KAAK,IAAIyD,CAAC,IAAIF,aAAa,EAAE;MAC3B,MAAM,IAAI,CAAC3B,cAAc,CAAC6B,CAAC,CAAC;IAC9B;EACF;AACF,CAAC;AAEDvF,OAAO,CAACsF,UAAU,GAAG,eAAeA,UAAUA,CAAExD,QAAQ,EAAE0D,KAAK,EAAE;EAE/D,IAAIA,KAAK,IAAI1C,eAAC,CAACC,IAAI,CAACjB,QAAQ,CAAC,CAACjB,MAAM,KAAK,SAAS,EAAE;IAClDiB,QAAQ,CAACkD,GAAG,EAAE;EAChB;EAEA,IAAIS,iBAAiB,GAAG,MAAM,IAAAC,kBAAQ,EAAC5D,QAAQ,EAAE,MAAOoB,OAAO,IAAK;IAClE,IAAIxC,OAAO,GAAGwC,OAAO,CAACxC,OAAO,IAAI,CAAC,CAAC;IACnC,IAAIoC,eAAC,CAAC6C,QAAQ,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,EAAEzC,OAAO,CAACrC,MAAM,CAAC,EAAE;MACvEH,OAAO,CAACkF,MAAM,GAAG,KAAK;MACtB,IAAIC,SAAS,GAAG3C,OAAO,CAACxC,OAAO,CAACK,OAAO;MACvC,IAAI8E,SAAS,EAAE;QACb,IAAIC,GAAG,GAAG,MAAM,IAAI,CAACzD,iBAAiB,CAACwD,SAAS,CAAC;QACjD,IAAI3C,OAAO,CAACxC,OAAO,CAACM,CAAC,IAAIkC,OAAO,CAACxC,OAAO,CAACO,CAAC,EAAE;UAC1CP,OAAO,CAACM,CAAC,GAAG8E,GAAG,CAAC9E,CAAC,IAAIkC,OAAO,CAACxC,OAAO,CAACM,CAAC,IAAI,CAAC,CAAC;UAC5CN,OAAO,CAACO,CAAC,GAAG6E,GAAG,CAAC7E,CAAC,IAAIiC,OAAO,CAACxC,OAAO,CAACO,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC,MAAM;UACL,MAAM;YAACsC,KAAK;YAAEC;UAAM,CAAC,GAAG,MAAM,IAAI,CAACF,OAAO,CAACuC,SAAS,CAAC;UACrDnF,OAAO,CAACM,CAAC,GAAG8E,GAAG,CAAC9E,CAAC,GAAIuC,KAAK,GAAG,CAAE;UAC/B7C,OAAO,CAACO,CAAC,GAAG6E,GAAG,CAAC7E,CAAC,GAAIuC,MAAM,GAAG,CAAE;QAClC;QACA,IAAIuC,gBAAgB,GAAG;UACrBlF,MAAM,EAAEqC,OAAO,CAACrC,MAAM;UACtBH,OAAO;UACPsF,UAAU,EAAE;QACd,CAAC;QACD,OAAOD,gBAAgB;MACzB,CAAC,MAAM;QACLrF,OAAO,CAACM,CAAC,GAAIkC,OAAO,CAACxC,OAAO,CAACM,CAAC,IAAI,CAAE;QACpCN,OAAO,CAACO,CAAC,GAAIiC,OAAO,CAACxC,OAAO,CAACO,CAAC,IAAI,CAAE;QAEpC,IAAI8E,gBAAgB,GAAG;UACrBlF,MAAM,EAAEqC,OAAO,CAACrC,MAAM;UACtBH,OAAO;UACPsF,UAAU,EAAE;QACd,CAAC;QACD,OAAOD,gBAAgB;MACzB;IACF,CAAC,MAAM;MACL,IAAIH,MAAM,GAAG,KAAK;MAClB,IAAI1C,OAAO,CAACrC,MAAM,KAAK,MAAM,EAAE;QAC7BH,OAAO,GAAGwC,OAAO,CAACxC,OAAO;QACzBkF,MAAM,GAAIK,QAAQ,CAAC/C,OAAO,CAACxC,OAAO,CAACC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAK;MACpD;MACA,IAAIoF,gBAAgB,GAAG;QACrBlF,MAAM,EAAEqC,OAAO,CAACrC,MAAM;QACtBH,OAAO;QACPsF,UAAU,EAAEJ;MACd,CAAC;MACD,OAAOG,gBAAgB;IACzB;EACF,CAAC,EAAE,KAAK,CAAC;EAGT,IAAIG,OAAO,GAAG,IAAI;IACdC,IAAI,GAAG,CAAC;EACZ,KAAK,IAAIC,KAAK,IAAIX,iBAAiB,EAAE;IACnC,IAAI3C,eAAC,CAACuD,WAAW,CAACD,KAAK,CAAC1F,OAAO,CAACM,CAAC,CAAC,IAAI8B,eAAC,CAACuD,WAAW,CAACD,KAAK,CAAC1F,OAAO,CAACO,CAAC,CAAC,IAAIiF,OAAO,KAAK,IAAI,EAAE;MAExFE,KAAK,CAAC1F,OAAO,CAACM,CAAC,GAAGkF,OAAO,CAAClF,CAAC;MAC3BoF,KAAK,CAAC1F,OAAO,CAACO,CAAC,GAAGiF,OAAO,CAACjF,CAAC;IAC7B;IACA,IAAImF,KAAK,CAAC1F,OAAO,CAACkF,MAAM,IAAIM,OAAO,EAAE;MAEnCE,KAAK,CAAC1F,OAAO,CAACM,CAAC,IAAIkF,OAAO,CAAClF,CAAC;MAC5BoF,KAAK,CAAC1F,OAAO,CAACO,CAAC,IAAIiF,OAAO,CAACjF,CAAC;IAC9B;IACA,OAAOmF,KAAK,CAAC1F,OAAO,CAACkF,MAAM;IAC3B,IAAI,CAAC9C,eAAC,CAACuD,WAAW,CAACD,KAAK,CAAC1F,OAAO,CAACM,CAAC,CAAC,IAAI,CAAC8B,eAAC,CAACuD,WAAW,CAACD,KAAK,CAAC1F,OAAO,CAACO,CAAC,CAAC,EAAE;MACtEiF,OAAO,GAAGE,KAAK,CAAC1F,OAAO;IACzB;IAEA,IAAI8E,KAAK,EAAE;MACT,IAAIQ,UAAU,GAAGI,KAAK,CAACJ,UAAU;MACjCG,IAAI,IAAIH,UAAU;MAClBI,KAAK,CAACD,IAAI,GAAGG,uBAAc,CAACC,gBAAgB,CAACJ,IAAI,EAAE,CAAC,CAAC;MAGrD,IAAI,CAACrD,eAAC,CAACuD,WAAW,CAACD,KAAK,CAAC1F,OAAO,CAACM,CAAC,CAAC,IAAI,CAAC8B,eAAC,CAACuD,WAAW,CAACD,KAAK,CAAC1F,OAAO,CAACO,CAAC,CAAC,EAAE;QACtEmF,KAAK,CAACI,KAAK,GAAG;UACZxF,CAAC,EAAEoF,KAAK,CAAC1F,OAAO,CAACM,CAAC;UAClBC,CAAC,EAAEmF,KAAK,CAAC1F,OAAO,CAACO;QACnB,CAAC;MACH;MACA,OAAOmF,KAAK,CAAC1F,OAAO;IACtB;IACA,OAAO0F,KAAK,CAACJ,UAAU;EACzB;EACA,OAAOP,iBAAiB;AAC1B,CAAC;AAGD1F,QAAQ,CAAC0G,kBAAkB,GAAG,eAAeA,kBAAkBA,CAAE5B,OAAO,EAAEgB,SAAS,EAAE;EAEnF,IAAIhB,OAAO,CAACH,MAAM,KAAK,CAAC,EAAE;IACxB,MAAM,IAAIgC,KAAK,CAAC,oDAAoD,GAChE,wCAAwC,CAAC;EAC/C;EAEA,MAAMC,MAAM,GAAG,MAAM,IAAAjB,kBAAQ,EAACb,OAAO,EAAE,MAAOhE,MAAM,IAAK,MAAM,IAAI,CAACyE,UAAU,CAACzE,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC;EAEpG,OAAO,MAAM,IAAI,CAAC+F,oBAAoB,CAACf,SAAS,EAAEc,MAAM,CAAC;AAC3D,CAAC;AAQD5G,QAAQ,CAAC6G,oBAAoB,GAAG,eAAeA,oBAAoBA,CAAEf,SAAS,EAAEc,MAAM,EAAE;EACtF,IAAI7F,IAAI;EACR,IAAI+E,SAAS,EAAE;IACb/E,IAAI,GAAG;MACL+E,SAAS;MACThB,OAAO,EAAE8B;IACX,CAAC;IACD,OAAO,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,oCAAoC,EAAEhG,IAAI,CAAC;EACpF,CAAC,MAAM;IACLA,IAAI,GAAG;MACL+D,OAAO,EAAE8B;IACX,CAAC;IACD,OAAO,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,4BAA4B,EAAEhG,IAAI,CAAC;EAC5E;AACF,CAAC;AAEDiG,MAAM,CAACC,MAAM,CAAC/G,UAAU,EAAEF,QAAQ,EAAEC,OAAO,CAAC;AAAC,IAAAiH,QAAA,GAE9BhH,UAAU;AAAAC,OAAA,CAAAgH,OAAA,GAAAD,QAAA"}
1
+ {"version":3,"file":"touch.js","names":["_lodash","_interopRequireDefault","require","_androidHelpers","_bluebird","_driver","_asyncbox","_support","commands","helpers","extensions","exports","getCoordDefault","val","util","hasValue","getSwipeTouchDuration","waitGesture","duration","options","ms","doTouchAction","action","opts","element","x","y","count","tap","touchDown","touchUp","touchMove","B","delay","touchLongClick","log","warn","errorAndThrow","doTouchDrag","gestures","longPress","moveTo","startX","startY","endX","endY","getLocationInView","apiLevel","adb","getApiLevel","Math","max","drag","fixRelease","release","_","last","clone","ref","gesture","reverse","loc","size","getSize","width","height","pick","performGesture","e","isErrorType","errors","NoSuchElementError","debug","getSwipeOptions","touchCount","destElement","locResult","sizeResult","offsetX","abs","offsetY","firstElLocation","performTouch","length","swipeOpts","swipe","actions","map","head","pop","slice","press","shift","wait","fixedGestures","parseTouch","g","multi","touchStateObjects","asyncmap","includes","offset","elementId","pos","touchStateObject","timeOffset","parseInt","prevPos","time","state","isUndefined","androidHelpers","truncateDecimals","touch","performMultiAction","Error","states","doPerformMultiAction","bootstrap","sendAction","Object","assign","_default","default"],"sources":["../../../lib/commands/touch.js"],"sourcesContent":["import _ from 'lodash';\nimport androidHelpers from '../android-helpers';\nimport B from 'bluebird';\nimport { errors, isErrorType } from 'appium/driver';\nimport { asyncmap } from 'asyncbox';\nimport { util } from '@appium/support';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nfunction getCoordDefault (val) {\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. Same\n // thing with destElement below.\n return util.hasValue(val) ? val : 0.5;\n}\n\nfunction getSwipeTouchDuration (waitGesture) {\n // the touch action api uses ms, we want seconds\n // 0.8 is the default time for the operation\n let duration = 0.8;\n if (typeof waitGesture.options.ms !== 'undefined' && waitGesture.options.ms) {\n duration = waitGesture.options.ms / 1000;\n if (duration === 0) {\n // set to a very low number, since they wanted it fast\n // but below 0.1 becomes 0 steps, which causes errors\n duration = 0.1;\n }\n }\n return duration;\n}\n\ncommands.doTouchAction = async function doTouchAction (action, opts = {}) {\n const { element, x, y, count, ms, duration } = opts;\n // parseTouch precalculates absolute element positions\n // so there is no need to pass `element` to the affected gestures\n switch (action) {\n case 'tap':\n return await this.tap(null, x, y, count);\n case 'press':\n return await this.touchDown(null, x, y);\n case 'release':\n return await this.touchUp(element, x, y);\n case 'moveTo':\n return await this.touchMove(null, x, y);\n case 'wait':\n return await B.delay(ms);\n case 'longPress':\n return await this.touchLongClick(null, x, y, duration || 1000);\n case 'cancel':\n // TODO: clarify behavior of 'cancel' action and fix this\n this.log.warn('Cancel action currently has no effect');\n break;\n default:\n this.log.errorAndThrow(`unknown action ${action}`);\n }\n};\n\n// drag is *not* press-move-release, so we need to translate\n// drag works fine for scroll, as well\nhelpers.doTouchDrag = async function doTouchDrag (gestures) {\n let longPress = gestures[0];\n let moveTo = gestures[1];\n let startX = longPress.options.x || 0,\n startY = longPress.options.y || 0,\n endX = moveTo.options.x || 0,\n endY = moveTo.options.y || 0;\n if (longPress.options.element) {\n let {x, y} = await this.getLocationInView(longPress.options.element);\n startX += x || 0;\n startY += y || 0;\n }\n if (moveTo.options.element) {\n let {x, y} = await this.getLocationInView(moveTo.options.element);\n endX += x || 0;\n endY += y || 0;\n }\n\n let apiLevel = await this.adb.getApiLevel();\n // lollipop takes a little longer to get things rolling\n let duration = apiLevel >= 5 ? 2 : 1;\n // make sure that if the long press has a duration, we use it.\n if (longPress.options && longPress.options.duration) {\n duration = Math.max(longPress.options.duration / 1000, duration);\n }\n\n // `drag` will take care of whether there is an element or not at that level\n return await this.drag(startX, startY, endX, endY, duration, 1, longPress.options.element, moveTo.options.element);\n};\n\n// Release gesture needs element or co-ordinates to release it from that position\n// or else release gesture is performed from center of the screen, so to fix it\n// This method sets co-ordinates/element to release gesture if it has no options set already.\nhelpers.fixRelease = async function fixRelease (gestures) {\n let release = _.last(gestures);\n // sometimes there are no options\n release.options = release.options || {};\n // nothing to do if release options are already set\n if (release.options.element || (release.options.x && release.options.y)) {\n return;\n }\n // without coordinates, `release` uses the center of the screen, which,\n // generally speaking, is not what we want\n // therefore: loop backwards and use the last command with an element and/or\n // offset coordinates\n gestures = _.clone(gestures);\n let ref = null;\n for (let gesture of gestures.reverse()) {\n let opts = gesture.options;\n if (opts.element || (opts.x && opts.y)) {\n ref = gesture;\n break;\n }\n }\n if (ref) {\n let opts = ref.options;\n if (opts.element) {\n let loc = await this.getLocationInView(opts.element);\n if (opts.x && opts.y) {\n // this is an offset from the element\n release.options = {\n x: loc.x + opts.x,\n y: loc.y + opts.y\n };\n } else {\n // this is the center of the element\n let size = await this.getSize(opts.element);\n release.options = {\n x: loc.x + size.width / 2,\n y: loc.y + size.height / 2\n };\n }\n } else {\n release.options = _.pick(opts, 'x', 'y');\n }\n }\n return release;\n};\n\n// Perform one gesture\nhelpers.performGesture = async function performGesture (gesture) {\n try {\n return await this.doTouchAction(gesture.action, gesture.options || {});\n } catch (e) {\n // sometime the element is not available when releasing, retry without it\n if (isErrorType(e, errors.NoSuchElementError) && gesture.action === 'release' &&\n gesture.options.element) {\n delete gesture.options.element;\n this.log.debug(`retrying release without element opts: ${gesture.options}.`);\n return await this.doTouchAction(gesture.action, gesture.options || {});\n }\n throw e;\n }\n};\n\ncommands.getSwipeOptions = async function getSwipeOptions (gestures, touchCount = 1) {\n let startX = getCoordDefault(gestures[0].options.x),\n startY = getCoordDefault(gestures[0].options.y),\n endX = getCoordDefault(gestures[2].options.x),\n endY = getCoordDefault(gestures[2].options.y),\n duration = getSwipeTouchDuration(gestures[1]),\n element = gestures[0].options.element,\n destElement = gestures[2].options.element || gestures[0].options.element;\n\n // there's no destination element handling in bootstrap and since it applies to all platforms, we handle it here\n if (util.hasValue(destElement)) {\n let locResult = await this.getLocationInView(destElement);\n let sizeResult = await this.getSize(destElement);\n let offsetX = (Math.abs(endX) < 1 && Math.abs(endX) > 0) ? sizeResult.width * endX : endX;\n let offsetY = (Math.abs(endY) < 1 && Math.abs(endY) > 0) ? sizeResult.height * endY : endY;\n endX = locResult.x + offsetX;\n endY = locResult.y + offsetY;\n // if the target element was provided, the coordinates for the destination need to be relative to it.\n if (util.hasValue(element)) {\n let firstElLocation = await this.getLocationInView(element);\n endX -= firstElLocation.x;\n endY -= firstElLocation.y;\n }\n }\n // clients are responsible to use these options correctly\n return {startX, startY, endX, endY, duration, touchCount, element};\n};\n\ncommands.performTouch = async function performTouch (gestures) {\n // press-wait-moveTo-release is `swipe`, so use native method\n if (gestures.length === 4 &&\n gestures[0].action === 'press' &&\n gestures[1].action === 'wait' &&\n gestures[2].action === 'moveTo' &&\n gestures[3].action === 'release') {\n\n let swipeOpts = await this.getSwipeOptions(gestures);\n return await this.swipe(swipeOpts.startX, swipeOpts.startY, swipeOpts.endX,\n swipeOpts.endY, swipeOpts.duration, swipeOpts.touchCount,\n swipeOpts.element);\n }\n let actions = _.map(gestures, 'action');\n\n if (actions[0] === 'longPress' && actions[1] === 'moveTo' && actions[2] === 'release') {\n // some things are special\n return await this.doTouchDrag(gestures);\n } else {\n if (actions.length === 2) {\n // `press` without a wait is too slow and gets interpretted as a `longPress`\n if (_.head(actions) === 'press' && _.last(actions) === 'release') {\n actions[0] = 'tap';\n gestures[0].action = 'tap';\n }\n\n // the `longPress` and `tap` methods release on their own\n if ((_.head(actions) === 'tap' || _.head(actions) === 'longPress') && _.last(actions) === 'release') {\n gestures.pop();\n actions.pop();\n }\n } else {\n // longpress followed by anything other than release should become a press and wait\n if (actions[0] === 'longPress') {\n actions = ['press', 'wait', ...actions.slice(1)];\n\n let press = gestures.shift();\n press.action = 'press';\n let wait = {\n action: 'wait',\n options: {ms: press.options.duration || 1000}\n };\n delete press.options.duration;\n gestures = [press, wait, ...gestures];\n }\n }\n\n let fixedGestures = await this.parseTouch(gestures, false);\n // fix release action then perform all actions\n if (actions[actions.length - 1] === 'release') {\n actions[actions.length - 1] = await this.fixRelease(gestures);\n }\n for (let g of fixedGestures) {\n await this.performGesture(g);\n }\n }\n};\n\nhelpers.parseTouch = async function parseTouch (gestures, multi) {\n // because multi-touch releases at the end by default\n if (multi && _.last(gestures).action === 'release') {\n gestures.pop();\n }\n\n let touchStateObjects = await asyncmap(gestures, async (gesture) => {\n let options = gesture.options || {};\n if (_.includes(['press', 'moveTo', 'tap', 'longPress'], gesture.action)) {\n options.offset = false;\n let elementId = gesture.options.element;\n if (elementId) {\n let pos = await this.getLocationInView(elementId);\n if (gesture.options.x || gesture.options.y) {\n options.x = pos.x + (gesture.options.x || 0);\n options.y = pos.y + (gesture.options.y || 0);\n } else {\n const {width, height} = await this.getSize(elementId);\n options.x = pos.x + (width / 2);\n options.y = pos.y + (height / 2);\n }\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: 0.005,\n };\n return touchStateObject;\n } else {\n options.x = (gesture.options.x || 0);\n options.y = (gesture.options.y || 0);\n\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: 0.005,\n };\n return touchStateObject;\n }\n } else {\n let offset = 0.005;\n if (gesture.action === 'wait') {\n options = gesture.options;\n offset = (parseInt(gesture.options.ms, 10) / 1000);\n }\n let touchStateObject = {\n action: gesture.action,\n options,\n timeOffset: offset,\n };\n return touchStateObject;\n }\n }, false);\n // we need to change the time (which is now an offset)\n // and the position (which may be an offset)\n let prevPos = null,\n time = 0;\n for (let state of touchStateObjects) {\n if (_.isUndefined(state.options.x) && _.isUndefined(state.options.y) && prevPos !== null) {\n // this happens with wait\n state.options.x = prevPos.x;\n state.options.y = prevPos.y;\n }\n if (state.options.offset && prevPos) {\n // the current position is an offset\n state.options.x += prevPos.x;\n state.options.y += prevPos.y;\n }\n delete state.options.offset;\n if (!_.isUndefined(state.options.x) && !_.isUndefined(state.options.y)) {\n prevPos = state.options;\n }\n\n if (multi) {\n let timeOffset = state.timeOffset;\n time += timeOffset;\n state.time = androidHelpers.truncateDecimals(time, 3);\n\n // multi gestures require 'touch' rather than 'options'\n if (!_.isUndefined(state.options.x) && !_.isUndefined(state.options.y)) {\n state.touch = {\n x: state.options.x,\n y: state.options.y\n };\n }\n delete state.options;\n }\n delete state.timeOffset;\n }\n return touchStateObjects;\n};\n\n\ncommands.performMultiAction = async function performMultiAction (actions, elementId) {\n // Android needs at least two actions to be able to perform a multi pointer gesture\n if (actions.length === 1) {\n throw new Error('Multi Pointer Gestures need at least two actions. ' +\n 'Use Touch Actions for a single action.');\n }\n\n const states = await asyncmap(actions, async (action) => await this.parseTouch(action, true), false);\n\n return await this.doPerformMultiAction(elementId, states);\n};\n\n/**\n * Reason for isolating doPerformMultiAction from performMultiAction is for reusing performMultiAction\n * across android-drivers (like appium-uiautomator2-driver) and to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doPerformMultiAction\n * to facilitate performMultiAction.\n */\ncommands.doPerformMultiAction = async function doPerformMultiAction (elementId, states) {\n let opts;\n if (elementId) {\n opts = {\n elementId,\n actions: states\n };\n return await this.bootstrap.sendAction('element:performMultiPointerGesture', opts);\n } else {\n opts = {\n actions: states\n };\n return await this.bootstrap.sendAction('performMultiPointerGesture', opts);\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}