appium-remote-debugger 9.1.4 → 9.1.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-client.js","names":["DATA_LOG_LENGTH","length","WAIT_FOR_TARGET_TIMEOUT","WAIT_FOR_TARGET_INTERVAL","MIN_PLATFORM_FOR_TARGET_BASED","MIN_PLATFORM_NO_TARGET_EXISTS","isTargetBased","isSafari","platformVersion","isHighVersion","util","compareVersions","log","debug","RpcClient","constructor","opts","_targets","_shouldCheckForTarget","shouldCheckForTarget","bundleId","logAllCommunication","logAllCommunicationHexDump","webInspectorMaxFrameLength","socketChunkSize","fullPageInitialization","isConnected","connId","uuidV4","senderId","msgId","_contexts","contexts","needsTarget","targets","connected","on","event","listener","messageHandler","once","off","warn","_isTargetBased","remoteMessages","RemoteMessages","RpcMessageHandler","addTarget","bind","updateTarget","removeTarget","onExecutionContextCreated","onGarbageCollected","waitForTarget","appIdKey","pageIdKey","force","getTarget","waitForCondition","_","isEmpty","waitMs","intervalMs","error","err","message","includes","Error","send","command","waitForResponse","timer","timing","Timer","start","sendToDevice","toLowerCase","info","getDuration","asMilliSeconds","toFixed","B","resolve","reject","wrapperMsgId","toString","targetId","fullOpts","defaults","id","cmd","getRemoteCommand","__argument","WIRSocketDataKey","isNil","Buffer","from","JSON","stringify","messageHandled","truncate","listeners","__selector","prependOnceListener","args","value","code","msg","res","sendMessage","connect","disconnect","removeAllListeners","receive","app","targetInfo","pendingTargetNotification","isProvisional","has","oldTargetId","newTargetId","provisional","page","toPairs","selectPage","sendOpts","enabled","Object","assign","initializePageFull","initializePage","disabled","instruments","active","state","depth","shouldPause","loggingChannels","source","channels","map","entry","level","selectApp","onAppChange","dict","oldAppIdKey","WIRHostApplicationIdentifierKey","correctAppIdKey","WIRApplicationIdentifierKey","pageDict","connectedAppIdKey","context","push","onScriptParsed","scriptInfo"],"sources":["../../../lib/rpc/rpc-client.js"],"sourcesContent":["import RemoteMessages from './remote-messages';\nimport { waitForCondition } from 'asyncbox';\nimport log from '../logger';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport RpcMessageHandler from './rpc-message-handler';\nimport { util, timing } from 'appium/support';\n\n\nconst DATA_LOG_LENGTH = {length: 200};\n\nconst WAIT_FOR_TARGET_TIMEOUT = 10000;\nconst WAIT_FOR_TARGET_INTERVAL = 1000;\n\nconst MIN_PLATFORM_FOR_TARGET_BASED = '12.2';\n\n// `Target.exists` protocol method was removed from WebKitin 13.4\nconst MIN_PLATFORM_NO_TARGET_EXISTS = '13.4';\n\nfunction isTargetBased (isSafari, platformVersion) {\n // On iOS 12.2 the messages get sent through the Target domain\n // On iOS 13.0+, WKWebView also needs to follow the Target domain,\n // so here only check the target OS version as the default behaviour.\n const isHighVersion = util.compareVersions(platformVersion, '>=', MIN_PLATFORM_FOR_TARGET_BASED);\n log.debug(`Checking which communication style to use (${isSafari ? '' : 'non-'}Safari on platform version '${platformVersion}')`);\n log.debug(`Platform version equal or higher than '${MIN_PLATFORM_FOR_TARGET_BASED}': ${isHighVersion}`);\n return isHighVersion;\n}\n\nexport default class RpcClient {\n constructor (opts = {}) {\n this._targets = [];\n this._shouldCheckForTarget = !!opts.shouldCheckForTarget;\n\n const {\n bundleId,\n platformVersion = {},\n isSafari = true,\n logAllCommunication = false,\n logAllCommunicationHexDump = false,\n webInspectorMaxFrameLength,\n socketChunkSize,\n fullPageInitialization = false,\n } = opts;\n\n this.isSafari = isSafari;\n\n this.isConnected = false;\n this.connId = util.uuidV4();\n this.senderId = util.uuidV4();\n this.msgId = 0;\n\n this.logAllCommunication = logAllCommunication;\n this.logAllCommunicationHexDump = logAllCommunicationHexDump;\n this.socketChunkSize = socketChunkSize;\n this.webInspectorMaxFrameLength = webInspectorMaxFrameLength;\n\n this.fullPageInitialization = fullPageInitialization;\n\n this.bundleId = bundleId;\n this.platformVersion = platformVersion;\n\n this._contexts = [];\n this._targets = {};\n\n // start with a best guess for the protocol\n this.isTargetBased = isTargetBased(isSafari, this.platformVersion);\n }\n\n get contexts () {\n return this._contexts;\n }\n\n get needsTarget () {\n return this.shouldCheckForTarget && this.isTargetBased;\n }\n\n get targets () {\n return this._targets;\n }\n\n get shouldCheckForTarget () {\n return this._shouldCheckForTarget;\n }\n\n set shouldCheckForTarget (shouldCheckForTarget) {\n this._shouldCheckForTarget = !!shouldCheckForTarget;\n }\n\n get isConnected () {\n return this.connected;\n }\n\n set isConnected (connected) {\n this.connected = !!connected;\n }\n\n on (event, listener) {\n this.messageHandler.on(event, listener);\n return this;\n }\n\n once (event, listener) {\n this.messageHandler.once(event, listener);\n return this;\n }\n\n off (event, listener) {\n this.messageHandler.off(event, listener);\n return this;\n }\n\n set isTargetBased (isTargetBased) {\n log.warn(`Setting communication protocol: using ${isTargetBased ? 'Target-based' : 'full Web Inspector protocol'} communication`);\n this._isTargetBased = isTargetBased;\n\n if (!this.remoteMessages) {\n this.remoteMessages = new RemoteMessages(isTargetBased);\n } else {\n this.remoteMessages.isTargetBased = isTargetBased;\n }\n\n if (!this.messageHandler) {\n this.messageHandler = new RpcMessageHandler(isTargetBased);\n\n // add handlers for internal events\n this.messageHandler.on('Target.targetCreated', this.addTarget.bind(this));\n this.messageHandler.on('Target.didCommitProvisionalTarget', this.updateTarget.bind(this));\n this.messageHandler.on('Target.targetDestroyed', this.removeTarget.bind(this));\n this.messageHandler.on('Runtime.executionContextCreated', this.onExecutionContextCreated.bind(this));\n this.messageHandler.on('Heap.garbageCollected', this.onGarbageCollected.bind(this));\n } else {\n this.messageHandler.isTargetBased = isTargetBased;\n }\n }\n\n get isTargetBased () {\n return this._isTargetBased;\n }\n\n async waitForTarget (appIdKey, pageIdKey, force = false) {\n if (!force && !this.needsTarget) {\n return;\n }\n\n if (this.getTarget(appIdKey, pageIdKey)) {\n return;\n }\n\n // otherwise waiting is necessary to see what the target is\n try {\n await waitForCondition(() => !_.isEmpty(this.getTarget(appIdKey, pageIdKey)), {\n waitMs: WAIT_FOR_TARGET_TIMEOUT,\n intervalMs: WAIT_FOR_TARGET_INTERVAL,\n error: 'No targets found, unable to communicate with device',\n });\n } catch (err) {\n if (!err.message.includes('Condition unmet')) {\n throw err;\n }\n throw new Error('No targets found, unable to communicate with device');\n }\n }\n\n async send (command, opts = {}, waitForResponse = true) {\n const timer = new timing.Timer().start();\n const {\n appIdKey,\n pageIdKey\n } = opts;\n try {\n if (!_.isEmpty(appIdKey) && !_.isEmpty(pageIdKey)) {\n await this.waitForTarget(appIdKey, pageIdKey);\n }\n return await this.sendToDevice(command, opts, waitForResponse);\n } catch (err) {\n let { message = '' } = err;\n message = message.toLowerCase();\n if (message.includes(`'target' domain was not found`)) {\n log.info('The target device does not support Target based communication. ' +\n 'Will follow non-target based communication.');\n this.isTargetBased = false;\n return await this.sendToDevice(command, opts, waitForResponse);\n } else if (message.includes(`domain was not found`) ||\n message.includes(`some arguments of method`) ||\n message.includes(`missing target`)) {\n this.isTargetBased = true;\n await this.waitForTarget(appIdKey, pageIdKey);\n return await this.sendToDevice(command, opts, waitForResponse);\n }\n throw err;\n } finally {\n log.debug(`Sending to Web Inspector took ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n }\n }\n\n async sendToDevice (command, opts = {}, waitForResponse = true) {\n return await new B(async (resolve, reject) => {\n // promise to be resolved whenever remote debugger\n // replies to our request\n\n // keep track of the messages coming and going using a simple sequential id\n const msgId = this.msgId++;\n let wrapperMsgId = msgId;\n if (this.isTargetBased) {\n // for target-base communication, everything is wrapped up\n wrapperMsgId = this.msgId++;\n // acknowledge wrapper message\n this.messageHandler.on(wrapperMsgId.toString(), function (err) {\n if (err) {\n reject(err);\n }\n });\n }\n\n const appIdKey = opts.appIdKey;\n const pageIdKey = opts.pageIdKey;\n const targetId = this.getTarget(appIdKey, pageIdKey);\n\n // retrieve the correct command to send\n const fullOpts = _.defaults({\n connId: this.connId,\n senderId: this.senderId,\n targetId,\n id: msgId,\n }, opts);\n const cmd = this.remoteMessages.getRemoteCommand(command, fullOpts);\n\n if (cmd?.__argument?.WIRSocketDataKey) {\n // make sure the message being sent has all the information that is needed\n if (_.isNil(cmd.__argument.WIRSocketDataKey.id)) {\n cmd.__argument.WIRSocketDataKey.id = wrapperMsgId;\n }\n cmd.__argument.WIRSocketDataKey =\n Buffer.from(JSON.stringify(cmd.__argument.WIRSocketDataKey));\n }\n\n let messageHandled = true;\n if (!waitForResponse) {\n // the promise will be resolved as soon as the socket has been sent\n messageHandled = false;\n // do not log receipts\n this.messageHandler.once(msgId.toString(), function (err) {\n if (err) {\n // we are not waiting for this, and if it errors it is most likely\n // a protocol change. Log and check during testing\n log.error(`Received error from send that is not being waited for (id: ${msgId}): '${_.truncate(JSON.stringify(err), DATA_LOG_LENGTH)}'`);\n // reject, though it is very rare that this will be triggered, since\n // the promise is resolved directlty after send. On the off chance,\n // though, it will alert of a protocol change.\n reject(err);\n }\n });\n } else if (this.messageHandler.listeners(cmd.__selector).length) {\n this.messageHandler.prependOnceListener(cmd.__selector, function (err, ...args) {\n if (err) {\n return reject(err);\n }\n log.debug(`Received response from send (id: ${msgId}): '${_.truncate(JSON.stringify(args), DATA_LOG_LENGTH)}'`);\n resolve(args);\n });\n } else if (cmd?.__argument?.WIRSocketDataKey) {\n this.messageHandler.once(msgId.toString(), function (err, value) {\n if (err) {\n return reject(new Error(`Remote debugger error with code '${err.code}': ${err.message}`));\n }\n log.debug(`Received data response from send (id: ${msgId}): '${_.truncate(JSON.stringify(value), DATA_LOG_LENGTH)}'`);\n resolve(value);\n });\n } else {\n // nothing else is handling things, so just resolve when the message is sent\n messageHandled = false;\n }\n\n const msg = `Sending '${cmd.__selector}' message` +\n (fullOpts.appIdKey ? ` to app '${fullOpts.appIdKey}'` : '') +\n (fullOpts.pageIdKey ? `, page '${fullOpts.pageIdKey}'` : '') +\n (this.needsTarget && targetId ? `, target '${targetId}'` : '') +\n ` (id: ${msgId}): '${command}'`;\n log.debug(msg);\n try {\n const res = await this.sendMessage(cmd);\n if (!messageHandled) {\n // There are no handlers waiting for a response before resolving,\n // and no errors sending the message over the socket, so resolve\n resolve(res);\n }\n } catch (err) {\n return reject(err);\n }\n });\n }\n\n async connect () { // eslint-disable-line require-await\n throw new Error(`Sub-classes need to implement a 'connect' function`);\n }\n\n async disconnect () { // eslint-disable-line require-await\n this.messageHandler.removeAllListeners();\n }\n\n async sendMessage (/* command */) { // eslint-disable-line require-await\n throw new Error(`Sub-classes need to implement a 'sendMessage' function`);\n }\n\n async receive (/* data */) { // eslint-disable-line require-await\n throw new Error(`Sub-classes need to implement a 'receive' function`);\n }\n\n addTarget (err, app, targetInfo) {\n if (_.isNil(targetInfo?.targetId)) {\n log.warn(`Received 'Target.targetCreated' event for app '${app}' with no target. Skipping`);\n return;\n }\n if (_.isEmpty(this.pendingTargetNotification) && !targetInfo.isProvisional) {\n log.warn(`Received 'Target.targetCreated' event for app '${app}' with no pending request: ${JSON.stringify(targetInfo)}`);\n return;\n }\n\n if (targetInfo.isProvisional) {\n log.debug(`Provisional target created for app '${app}', '${targetInfo.targetId}'. Ignoring until target update event`);\n return;\n }\n\n const [appIdKey, pageIdKey] = this.pendingTargetNotification;\n\n log.debug(`Target created for app '${appIdKey}' and page '${pageIdKey}': ${JSON.stringify(targetInfo)}`);\n if (_.has(this.targets[appIdKey], pageIdKey)) {\n log.debug(`There is already a target for this app and page ('${this.targets[appIdKey][pageIdKey]}'). This might cause problems`);\n }\n this.targets[app] = this.targets[app] || {};\n this.targets[appIdKey][pageIdKey] = targetInfo.targetId;\n }\n\n updateTarget (err, app, oldTargetId, newTargetId) {\n log.debug(`Target updated for app '${app}'. Old target: '${oldTargetId}', new target: '${newTargetId}'`);\n if (!this.targets[app]) {\n log.warn(`No existing target for app '${app}'. Not sure what to do`);\n return;\n }\n // save this, to be used if/when the existing target is destroyed\n this.targets[app].provisional = {\n oldTargetId,\n newTargetId,\n };\n }\n\n removeTarget (err, app, targetInfo) {\n if (_.isNil(targetInfo?.targetId)) {\n log.debug(`Received 'Target.targetDestroyed' event with no target. Skipping`);\n return;\n }\n\n log.debug(`Target destroyed for app '${app}': ${targetInfo.targetId}`);\n\n // go through the targets and find the one that has a waiting provisional target\n if (this.targets[app]?.provisional?.oldTargetId === targetInfo.targetId) {\n const {oldTargetId, newTargetId} = this.targets[app].provisional;\n delete this.targets[app].provisional;\n\n // we do not know the page, so go through and find the existing target\n const targets = this.targets[app];\n for (const [page, targetId] of _.toPairs(targets)) {\n if (targetId === oldTargetId) {\n log.debug(`Found provisional target for app '${app}'. Old target: '${oldTargetId}', new target: '${newTargetId}'. Updating`);\n targets[page] = newTargetId;\n return;\n }\n }\n log.warn(`Provisional target for app '${app}' found, but no suitable existing target found. This may cause problems`);\n log.warn(`Old target: '${oldTargetId}', new target: '${newTargetId}'. Existing targets: ${JSON.stringify(targets)}`);\n }\n\n // if there is no waiting provisional target, just get rid of the existing one\n const targets = this.targets[app];\n for (const [page, targetId] of _.toPairs(targets)) {\n if (targetId === targetInfo.targetId) {\n delete targets[page];\n return;\n }\n }\n log.debug(`Target '${targetInfo.targetId}' deleted for app '${app}', but no such target exists`);\n }\n\n getTarget (appIdKey, pageIdKey) {\n return (this.targets[appIdKey] || {})[pageIdKey];\n }\n\n async selectPage (appIdKey, pageIdKey) {\n this.pendingTargetNotification = [appIdKey, pageIdKey];\n this.shouldCheckForTarget = false;\n\n // go through the steps that the Desktop Safari system\n // goes through to initialize the Web Inspector session\n\n const sendOpts = {\n appIdKey,\n pageIdKey,\n };\n\n // highlight and then un-highlight the webview\n for (const enabled of [true, false]) {\n await this.send('indicateWebView', Object.assign({\n enabled,\n }, sendOpts), false);\n }\n\n await this.send('setSenderKey', sendOpts);\n log.debug('Sender key set');\n\n if (this.isTargetBased && util.compareVersions(this.platformVersion, '<', MIN_PLATFORM_NO_TARGET_EXISTS)) {\n await this.send('Target.exists', sendOpts, false);\n }\n\n this.shouldCheckForTarget = true;\n\n if (this.fullPageInitialization) {\n await this.initializePageFull(appIdKey, pageIdKey);\n } else {\n await this.initializePage(appIdKey, pageIdKey);\n }\n }\n\n /*\n * Perform the minimal initialization to get the Web Inspector working\n */\n async initializePage (appIdKey, pageIdKey) {\n const sendOpts = {\n appIdKey,\n pageIdKey,\n };\n\n await this.send('Inspector.enable', sendOpts, false);\n await this.send('Page.enable', sendOpts, false);\n\n // go through the tasks to initialize\n await this.send('Network.enable', sendOpts, false);\n await this.send('Runtime.enable', sendOpts, false);\n await this.send('Heap.enable', sendOpts, false);\n await this.send('Debugger.enable', sendOpts, false);\n await this.send('Console.enable', sendOpts, false);\n await this.send('Inspector.initialized', sendOpts, false);\n }\n\n /*\n * Mimic every step that Desktop Safari Develop tools uses to initialize a\n * Web Inspector session\n */\n async initializePageFull (appIdKey, pageIdKey) {\n const sendOpts = {\n appIdKey,\n pageIdKey,\n };\n\n await this.send('Inspector.enable', sendOpts, false);\n await this.send('Page.enable', sendOpts, false);\n\n // go through the tasks to initialize\n await this.send('Page.getResourceTree', sendOpts, false);\n await this.send('Network.enable', sendOpts, false);\n await this.send('Network.setResourceCachingDisabled', Object.assign({\n disabled: false,\n }, sendOpts), false);\n await this.send('DOMStorage.enable', sendOpts, false);\n await this.send('Database.enable', sendOpts, false);\n await this.send('IndexedDB.enable', sendOpts, false);\n await this.send('CSS.enable', sendOpts, false);\n await this.send('Runtime.enable', sendOpts, false);\n await this.send('Heap.enable', sendOpts, false);\n await this.send('Memory.enable', sendOpts, false);\n await this.send('ApplicationCache.enable', sendOpts, false);\n await this.send('ApplicationCache.getFramesWithManifests', sendOpts, false);\n await this.send('Timeline.setInstruments', Object.assign({\n instruments: ['Timeline', 'ScriptProfiler', 'CPU'],\n }, sendOpts), false);\n await this.send('Timeline.setAutoCaptureEnabled', Object.assign({\n enabled: false,\n }, sendOpts), false);\n await this.send('Debugger.enable', sendOpts, false);\n await this.send('Debugger.setBreakpointsActive', Object.assign({\n active: true,\n }, sendOpts), false);\n await this.send('Debugger.setPauseOnExceptions', Object.assign({\n state: 'none',\n }, sendOpts), false);\n await this.send('Debugger.setPauseOnAssertions', Object.assign({\n enabled: false,\n }, sendOpts), false);\n await this.send('Debugger.setAsyncStackTraceDepth', Object.assign({\n depth: 200,\n }, sendOpts), false);\n await this.send('Debugger.setPauseForInternalScripts', Object.assign({\n shouldPause: false,\n }, sendOpts), false);\n\n await this.send('LayerTree.enable', sendOpts, false);\n await this.send('Worker.enable', sendOpts, false);\n await this.send('Canvas.enable', sendOpts, false);\n await this.send('Console.enable', sendOpts, false);\n await this.send('DOM.getDocument', sendOpts, false);\n const loggingChannels = await this.send('Console.getLoggingChannels', sendOpts);\n for (const source of (loggingChannels.channels || []).map((entry) => entry.source)) {\n await this.send('Console.setLoggingChannelLevel', Object.assign({\n source,\n level: 'verbose',\n }, sendOpts), false);\n }\n\n await this.send('Inspector.initialized', sendOpts, false);\n }\n\n async selectApp (appIdKey) {\n return await new B((resolve, reject) => {\n // local callback, temporarily added as callback to\n // `_rpc_applicationConnected:` remote debugger response\n // to handle the initial connection\n const onAppChange = (err, dict) => {\n if (err) {\n return reject(err);\n }\n // from the dictionary returned, get the ids\n const oldAppIdKey = dict.WIRHostApplicationIdentifierKey;\n const correctAppIdKey = dict.WIRApplicationIdentifierKey;\n\n // if this is a report of a proxy redirect from the remote debugger\n // we want to update our dictionary and get a new app id\n if (oldAppIdKey && correctAppIdKey !== oldAppIdKey) {\n log.debug(`We were notified we might have connected to the wrong app. ` +\n `Using id ${correctAppIdKey} instead of ${oldAppIdKey}`);\n }\n\n reject(new Error('New application has connected'));\n };\n this.messageHandler.prependOnceListener('_rpc_applicationConnected:', onAppChange);\n\n // do the actual connecting to the app\n return (async () => {\n let pageDict, connectedAppIdKey;\n try {\n ([connectedAppIdKey, pageDict] = await this.send('connectToApp', {\n appIdKey\n }));\n } catch (err) {\n log.warn(`Unable to connect to app: ${err.message}`);\n reject(err);\n }\n\n // sometimes the connect logic happens, but with an empty dictionary\n // which leads to the remote debugger getting disconnected, and into a loop\n if (_.isEmpty(pageDict)) {\n let msg = 'Empty page dictionary received';\n log.debug(msg);\n reject(new Error(msg));\n } else {\n resolve([connectedAppIdKey, pageDict]);\n }\n })();\n });\n }\n\n onExecutionContextCreated (err, context) {\n // { id: 2, isPageContext: true, name: '', frameId: '0.1' }\n // right now we have no way to map contexts to apps/pages\n // so just store\n this.contexts.push(context.id);\n }\n\n onGarbageCollected () {\n // just want to log that this is happening, as it can affect opertion\n log.debug(`Web Inspector garbage collected`);\n }\n\n onScriptParsed (err, scriptInfo) {\n // { scriptId: '13', url: '', startLine: 0, startColumn: 0, endLine: 82, endColumn: 3 }\n log.debug(`Script parsed: ${JSON.stringify(scriptInfo)}`);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rpc-client.js","names":["DATA_LOG_LENGTH","length","WAIT_FOR_TARGET_TIMEOUT","WAIT_FOR_TARGET_INTERVAL","MIN_PLATFORM_FOR_TARGET_BASED","MIN_PLATFORM_NO_TARGET_EXISTS","isTargetBased","isSafari","platformVersion","isHighVersion","util","compareVersions","log","debug","RpcClient","constructor","opts","_targets","_shouldCheckForTarget","shouldCheckForTarget","bundleId","logAllCommunication","logAllCommunicationHexDump","webInspectorMaxFrameLength","socketChunkSize","fullPageInitialization","isConnected","connId","uuidV4","senderId","msgId","_contexts","contexts","needsTarget","targets","connected","on","event","listener","messageHandler","once","off","warn","_isTargetBased","remoteMessages","RemoteMessages","RpcMessageHandler","addTarget","bind","updateTarget","removeTarget","onExecutionContextCreated","onGarbageCollected","waitForTarget","appIdKey","pageIdKey","force","getTarget","waitForCondition","_","isEmpty","waitMs","intervalMs","error","err","message","includes","Error","send","command","waitForResponse","timer","timing","Timer","start","sendToDevice","toLowerCase","info","getDuration","asMilliSeconds","toFixed","B","resolve","reject","wrapperMsgId","toString","targetId","fullOpts","defaults","id","cmd","getRemoteCommand","__argument","WIRSocketDataKey","isNil","Buffer","from","JSON","stringify","messageHandled","truncate","listeners","__selector","prependOnceListener","args","value","code","msg","res","sendMessage","connect","disconnect","removeAllListeners","receive","app","targetInfo","pendingTargetNotification","isProvisional","has","oldTargetId","newTargetId","provisional","page","toPairs","selectPage","sendOpts","enabled","Object","assign","initializePageFull","initializePage","disabled","instruments","active","state","depth","shouldPause","loggingChannels","source","channels","map","entry","level","selectApp","onAppChange","dict","oldAppIdKey","WIRHostApplicationIdentifierKey","correctAppIdKey","WIRApplicationIdentifierKey","pageDict","connectedAppIdKey","context","push","onScriptParsed","scriptInfo"],"sources":["../../../lib/rpc/rpc-client.js"],"sourcesContent":["import RemoteMessages from './remote-messages';\nimport { waitForCondition } from 'asyncbox';\nimport log from '../logger';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport RpcMessageHandler from './rpc-message-handler';\nimport { util, timing } from '@appium/support';\n\n\nconst DATA_LOG_LENGTH = {length: 200};\n\nconst WAIT_FOR_TARGET_TIMEOUT = 10000;\nconst WAIT_FOR_TARGET_INTERVAL = 1000;\n\nconst MIN_PLATFORM_FOR_TARGET_BASED = '12.2';\n\n// `Target.exists` protocol method was removed from WebKitin 13.4\nconst MIN_PLATFORM_NO_TARGET_EXISTS = '13.4';\n\nfunction isTargetBased (isSafari, platformVersion) {\n // On iOS 12.2 the messages get sent through the Target domain\n // On iOS 13.0+, WKWebView also needs to follow the Target domain,\n // so here only check the target OS version as the default behaviour.\n const isHighVersion = util.compareVersions(platformVersion, '>=', MIN_PLATFORM_FOR_TARGET_BASED);\n log.debug(`Checking which communication style to use (${isSafari ? '' : 'non-'}Safari on platform version '${platformVersion}')`);\n log.debug(`Platform version equal or higher than '${MIN_PLATFORM_FOR_TARGET_BASED}': ${isHighVersion}`);\n return isHighVersion;\n}\n\nexport default class RpcClient {\n constructor (opts = {}) {\n this._targets = [];\n this._shouldCheckForTarget = !!opts.shouldCheckForTarget;\n\n const {\n bundleId,\n platformVersion = {},\n isSafari = true,\n logAllCommunication = false,\n logAllCommunicationHexDump = false,\n webInspectorMaxFrameLength,\n socketChunkSize,\n fullPageInitialization = false,\n } = opts;\n\n this.isSafari = isSafari;\n\n this.isConnected = false;\n this.connId = util.uuidV4();\n this.senderId = util.uuidV4();\n this.msgId = 0;\n\n this.logAllCommunication = logAllCommunication;\n this.logAllCommunicationHexDump = logAllCommunicationHexDump;\n this.socketChunkSize = socketChunkSize;\n this.webInspectorMaxFrameLength = webInspectorMaxFrameLength;\n\n this.fullPageInitialization = fullPageInitialization;\n\n this.bundleId = bundleId;\n this.platformVersion = platformVersion;\n\n this._contexts = [];\n this._targets = {};\n\n // start with a best guess for the protocol\n this.isTargetBased = isTargetBased(isSafari, this.platformVersion);\n }\n\n get contexts () {\n return this._contexts;\n }\n\n get needsTarget () {\n return this.shouldCheckForTarget && this.isTargetBased;\n }\n\n get targets () {\n return this._targets;\n }\n\n get shouldCheckForTarget () {\n return this._shouldCheckForTarget;\n }\n\n set shouldCheckForTarget (shouldCheckForTarget) {\n this._shouldCheckForTarget = !!shouldCheckForTarget;\n }\n\n get isConnected () {\n return this.connected;\n }\n\n set isConnected (connected) {\n this.connected = !!connected;\n }\n\n on (event, listener) {\n this.messageHandler.on(event, listener);\n return this;\n }\n\n once (event, listener) {\n this.messageHandler.once(event, listener);\n return this;\n }\n\n off (event, listener) {\n this.messageHandler.off(event, listener);\n return this;\n }\n\n set isTargetBased (isTargetBased) {\n log.warn(`Setting communication protocol: using ${isTargetBased ? 'Target-based' : 'full Web Inspector protocol'} communication`);\n this._isTargetBased = isTargetBased;\n\n if (!this.remoteMessages) {\n this.remoteMessages = new RemoteMessages(isTargetBased);\n } else {\n this.remoteMessages.isTargetBased = isTargetBased;\n }\n\n if (!this.messageHandler) {\n this.messageHandler = new RpcMessageHandler(isTargetBased);\n\n // add handlers for internal events\n this.messageHandler.on('Target.targetCreated', this.addTarget.bind(this));\n this.messageHandler.on('Target.didCommitProvisionalTarget', this.updateTarget.bind(this));\n this.messageHandler.on('Target.targetDestroyed', this.removeTarget.bind(this));\n this.messageHandler.on('Runtime.executionContextCreated', this.onExecutionContextCreated.bind(this));\n this.messageHandler.on('Heap.garbageCollected', this.onGarbageCollected.bind(this));\n } else {\n this.messageHandler.isTargetBased = isTargetBased;\n }\n }\n\n get isTargetBased () {\n return this._isTargetBased;\n }\n\n async waitForTarget (appIdKey, pageIdKey, force = false) {\n if (!force && !this.needsTarget) {\n return;\n }\n\n if (this.getTarget(appIdKey, pageIdKey)) {\n return;\n }\n\n // otherwise waiting is necessary to see what the target is\n try {\n await waitForCondition(() => !_.isEmpty(this.getTarget(appIdKey, pageIdKey)), {\n waitMs: WAIT_FOR_TARGET_TIMEOUT,\n intervalMs: WAIT_FOR_TARGET_INTERVAL,\n error: 'No targets found, unable to communicate with device',\n });\n } catch (err) {\n if (!err.message.includes('Condition unmet')) {\n throw err;\n }\n throw new Error('No targets found, unable to communicate with device');\n }\n }\n\n async send (command, opts = {}, waitForResponse = true) {\n const timer = new timing.Timer().start();\n const {\n appIdKey,\n pageIdKey\n } = opts;\n try {\n if (!_.isEmpty(appIdKey) && !_.isEmpty(pageIdKey)) {\n await this.waitForTarget(appIdKey, pageIdKey);\n }\n return await this.sendToDevice(command, opts, waitForResponse);\n } catch (err) {\n let { message = '' } = err;\n message = message.toLowerCase();\n if (message.includes(`'target' domain was not found`)) {\n log.info('The target device does not support Target based communication. ' +\n 'Will follow non-target based communication.');\n this.isTargetBased = false;\n return await this.sendToDevice(command, opts, waitForResponse);\n } else if (message.includes(`domain was not found`) ||\n message.includes(`some arguments of method`) ||\n message.includes(`missing target`)) {\n this.isTargetBased = true;\n await this.waitForTarget(appIdKey, pageIdKey);\n return await this.sendToDevice(command, opts, waitForResponse);\n }\n throw err;\n } finally {\n log.debug(`Sending to Web Inspector took ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n }\n }\n\n async sendToDevice (command, opts = {}, waitForResponse = true) {\n return await new B(async (resolve, reject) => {\n // promise to be resolved whenever remote debugger\n // replies to our request\n\n // keep track of the messages coming and going using a simple sequential id\n const msgId = this.msgId++;\n let wrapperMsgId = msgId;\n if (this.isTargetBased) {\n // for target-base communication, everything is wrapped up\n wrapperMsgId = this.msgId++;\n // acknowledge wrapper message\n this.messageHandler.on(wrapperMsgId.toString(), function (err) {\n if (err) {\n reject(err);\n }\n });\n }\n\n const appIdKey = opts.appIdKey;\n const pageIdKey = opts.pageIdKey;\n const targetId = this.getTarget(appIdKey, pageIdKey);\n\n // retrieve the correct command to send\n const fullOpts = _.defaults({\n connId: this.connId,\n senderId: this.senderId,\n targetId,\n id: msgId,\n }, opts);\n const cmd = this.remoteMessages.getRemoteCommand(command, fullOpts);\n\n if (cmd?.__argument?.WIRSocketDataKey) {\n // make sure the message being sent has all the information that is needed\n if (_.isNil(cmd.__argument.WIRSocketDataKey.id)) {\n cmd.__argument.WIRSocketDataKey.id = wrapperMsgId;\n }\n cmd.__argument.WIRSocketDataKey =\n Buffer.from(JSON.stringify(cmd.__argument.WIRSocketDataKey));\n }\n\n let messageHandled = true;\n if (!waitForResponse) {\n // the promise will be resolved as soon as the socket has been sent\n messageHandled = false;\n // do not log receipts\n this.messageHandler.once(msgId.toString(), function (err) {\n if (err) {\n // we are not waiting for this, and if it errors it is most likely\n // a protocol change. Log and check during testing\n log.error(`Received error from send that is not being waited for (id: ${msgId}): '${_.truncate(JSON.stringify(err), DATA_LOG_LENGTH)}'`);\n // reject, though it is very rare that this will be triggered, since\n // the promise is resolved directlty after send. On the off chance,\n // though, it will alert of a protocol change.\n reject(err);\n }\n });\n } else if (this.messageHandler.listeners(cmd.__selector).length) {\n this.messageHandler.prependOnceListener(cmd.__selector, function (err, ...args) {\n if (err) {\n return reject(err);\n }\n log.debug(`Received response from send (id: ${msgId}): '${_.truncate(JSON.stringify(args), DATA_LOG_LENGTH)}'`);\n resolve(args);\n });\n } else if (cmd?.__argument?.WIRSocketDataKey) {\n this.messageHandler.once(msgId.toString(), function (err, value) {\n if (err) {\n return reject(new Error(`Remote debugger error with code '${err.code}': ${err.message}`));\n }\n log.debug(`Received data response from send (id: ${msgId}): '${_.truncate(JSON.stringify(value), DATA_LOG_LENGTH)}'`);\n resolve(value);\n });\n } else {\n // nothing else is handling things, so just resolve when the message is sent\n messageHandled = false;\n }\n\n const msg = `Sending '${cmd.__selector}' message` +\n (fullOpts.appIdKey ? ` to app '${fullOpts.appIdKey}'` : '') +\n (fullOpts.pageIdKey ? `, page '${fullOpts.pageIdKey}'` : '') +\n (this.needsTarget && targetId ? `, target '${targetId}'` : '') +\n ` (id: ${msgId}): '${command}'`;\n log.debug(msg);\n try {\n const res = await this.sendMessage(cmd);\n if (!messageHandled) {\n // There are no handlers waiting for a response before resolving,\n // and no errors sending the message over the socket, so resolve\n resolve(res);\n }\n } catch (err) {\n return reject(err);\n }\n });\n }\n\n async connect () { // eslint-disable-line require-await\n throw new Error(`Sub-classes need to implement a 'connect' function`);\n }\n\n async disconnect () { // eslint-disable-line require-await\n this.messageHandler.removeAllListeners();\n }\n\n async sendMessage (/* command */) { // eslint-disable-line require-await\n throw new Error(`Sub-classes need to implement a 'sendMessage' function`);\n }\n\n async receive (/* data */) { // eslint-disable-line require-await\n throw new Error(`Sub-classes need to implement a 'receive' function`);\n }\n\n addTarget (err, app, targetInfo) {\n if (_.isNil(targetInfo?.targetId)) {\n log.warn(`Received 'Target.targetCreated' event for app '${app}' with no target. Skipping`);\n return;\n }\n if (_.isEmpty(this.pendingTargetNotification) && !targetInfo.isProvisional) {\n log.warn(`Received 'Target.targetCreated' event for app '${app}' with no pending request: ${JSON.stringify(targetInfo)}`);\n return;\n }\n\n if (targetInfo.isProvisional) {\n log.debug(`Provisional target created for app '${app}', '${targetInfo.targetId}'. Ignoring until target update event`);\n return;\n }\n\n const [appIdKey, pageIdKey] = this.pendingTargetNotification;\n\n log.debug(`Target created for app '${appIdKey}' and page '${pageIdKey}': ${JSON.stringify(targetInfo)}`);\n if (_.has(this.targets[appIdKey], pageIdKey)) {\n log.debug(`There is already a target for this app and page ('${this.targets[appIdKey][pageIdKey]}'). This might cause problems`);\n }\n this.targets[app] = this.targets[app] || {};\n this.targets[appIdKey][pageIdKey] = targetInfo.targetId;\n }\n\n updateTarget (err, app, oldTargetId, newTargetId) {\n log.debug(`Target updated for app '${app}'. Old target: '${oldTargetId}', new target: '${newTargetId}'`);\n if (!this.targets[app]) {\n log.warn(`No existing target for app '${app}'. Not sure what to do`);\n return;\n }\n // save this, to be used if/when the existing target is destroyed\n this.targets[app].provisional = {\n oldTargetId,\n newTargetId,\n };\n }\n\n removeTarget (err, app, targetInfo) {\n if (_.isNil(targetInfo?.targetId)) {\n log.debug(`Received 'Target.targetDestroyed' event with no target. Skipping`);\n return;\n }\n\n log.debug(`Target destroyed for app '${app}': ${targetInfo.targetId}`);\n\n // go through the targets and find the one that has a waiting provisional target\n if (this.targets[app]?.provisional?.oldTargetId === targetInfo.targetId) {\n const {oldTargetId, newTargetId} = this.targets[app].provisional;\n delete this.targets[app].provisional;\n\n // we do not know the page, so go through and find the existing target\n const targets = this.targets[app];\n for (const [page, targetId] of _.toPairs(targets)) {\n if (targetId === oldTargetId) {\n log.debug(`Found provisional target for app '${app}'. Old target: '${oldTargetId}', new target: '${newTargetId}'. Updating`);\n targets[page] = newTargetId;\n return;\n }\n }\n log.warn(`Provisional target for app '${app}' found, but no suitable existing target found. This may cause problems`);\n log.warn(`Old target: '${oldTargetId}', new target: '${newTargetId}'. Existing targets: ${JSON.stringify(targets)}`);\n }\n\n // if there is no waiting provisional target, just get rid of the existing one\n const targets = this.targets[app];\n for (const [page, targetId] of _.toPairs(targets)) {\n if (targetId === targetInfo.targetId) {\n delete targets[page];\n return;\n }\n }\n log.debug(`Target '${targetInfo.targetId}' deleted for app '${app}', but no such target exists`);\n }\n\n getTarget (appIdKey, pageIdKey) {\n return (this.targets[appIdKey] || {})[pageIdKey];\n }\n\n async selectPage (appIdKey, pageIdKey) {\n this.pendingTargetNotification = [appIdKey, pageIdKey];\n this.shouldCheckForTarget = false;\n\n // go through the steps that the Desktop Safari system\n // goes through to initialize the Web Inspector session\n\n const sendOpts = {\n appIdKey,\n pageIdKey,\n };\n\n // highlight and then un-highlight the webview\n for (const enabled of [true, false]) {\n await this.send('indicateWebView', Object.assign({\n enabled,\n }, sendOpts), false);\n }\n\n await this.send('setSenderKey', sendOpts);\n log.debug('Sender key set');\n\n if (this.isTargetBased && util.compareVersions(this.platformVersion, '<', MIN_PLATFORM_NO_TARGET_EXISTS)) {\n await this.send('Target.exists', sendOpts, false);\n }\n\n this.shouldCheckForTarget = true;\n\n if (this.fullPageInitialization) {\n await this.initializePageFull(appIdKey, pageIdKey);\n } else {\n await this.initializePage(appIdKey, pageIdKey);\n }\n }\n\n /*\n * Perform the minimal initialization to get the Web Inspector working\n */\n async initializePage (appIdKey, pageIdKey) {\n const sendOpts = {\n appIdKey,\n pageIdKey,\n };\n\n await this.send('Inspector.enable', sendOpts, false);\n await this.send('Page.enable', sendOpts, false);\n\n // go through the tasks to initialize\n await this.send('Network.enable', sendOpts, false);\n await this.send('Runtime.enable', sendOpts, false);\n await this.send('Heap.enable', sendOpts, false);\n await this.send('Debugger.enable', sendOpts, false);\n await this.send('Console.enable', sendOpts, false);\n await this.send('Inspector.initialized', sendOpts, false);\n }\n\n /*\n * Mimic every step that Desktop Safari Develop tools uses to initialize a\n * Web Inspector session\n */\n async initializePageFull (appIdKey, pageIdKey) {\n const sendOpts = {\n appIdKey,\n pageIdKey,\n };\n\n await this.send('Inspector.enable', sendOpts, false);\n await this.send('Page.enable', sendOpts, false);\n\n // go through the tasks to initialize\n await this.send('Page.getResourceTree', sendOpts, false);\n await this.send('Network.enable', sendOpts, false);\n await this.send('Network.setResourceCachingDisabled', Object.assign({\n disabled: false,\n }, sendOpts), false);\n await this.send('DOMStorage.enable', sendOpts, false);\n await this.send('Database.enable', sendOpts, false);\n await this.send('IndexedDB.enable', sendOpts, false);\n await this.send('CSS.enable', sendOpts, false);\n await this.send('Runtime.enable', sendOpts, false);\n await this.send('Heap.enable', sendOpts, false);\n await this.send('Memory.enable', sendOpts, false);\n await this.send('ApplicationCache.enable', sendOpts, false);\n await this.send('ApplicationCache.getFramesWithManifests', sendOpts, false);\n await this.send('Timeline.setInstruments', Object.assign({\n instruments: ['Timeline', 'ScriptProfiler', 'CPU'],\n }, sendOpts), false);\n await this.send('Timeline.setAutoCaptureEnabled', Object.assign({\n enabled: false,\n }, sendOpts), false);\n await this.send('Debugger.enable', sendOpts, false);\n await this.send('Debugger.setBreakpointsActive', Object.assign({\n active: true,\n }, sendOpts), false);\n await this.send('Debugger.setPauseOnExceptions', Object.assign({\n state: 'none',\n }, sendOpts), false);\n await this.send('Debugger.setPauseOnAssertions', Object.assign({\n enabled: false,\n }, sendOpts), false);\n await this.send('Debugger.setAsyncStackTraceDepth', Object.assign({\n depth: 200,\n }, sendOpts), false);\n await this.send('Debugger.setPauseForInternalScripts', Object.assign({\n shouldPause: false,\n }, sendOpts), false);\n\n await this.send('LayerTree.enable', sendOpts, false);\n await this.send('Worker.enable', sendOpts, false);\n await this.send('Canvas.enable', sendOpts, false);\n await this.send('Console.enable', sendOpts, false);\n await this.send('DOM.getDocument', sendOpts, false);\n const loggingChannels = await this.send('Console.getLoggingChannels', sendOpts);\n for (const source of (loggingChannels.channels || []).map((entry) => entry.source)) {\n await this.send('Console.setLoggingChannelLevel', Object.assign({\n source,\n level: 'verbose',\n }, sendOpts), false);\n }\n\n await this.send('Inspector.initialized', sendOpts, false);\n }\n\n async selectApp (appIdKey) {\n return await new B((resolve, reject) => {\n // local callback, temporarily added as callback to\n // `_rpc_applicationConnected:` remote debugger response\n // to handle the initial connection\n const onAppChange = (err, dict) => {\n if (err) {\n return reject(err);\n }\n // from the dictionary returned, get the ids\n const oldAppIdKey = dict.WIRHostApplicationIdentifierKey;\n const correctAppIdKey = dict.WIRApplicationIdentifierKey;\n\n // if this is a report of a proxy redirect from the remote debugger\n // we want to update our dictionary and get a new app id\n if (oldAppIdKey && correctAppIdKey !== oldAppIdKey) {\n log.debug(`We were notified we might have connected to the wrong app. ` +\n `Using id ${correctAppIdKey} instead of ${oldAppIdKey}`);\n }\n\n reject(new Error('New application has connected'));\n };\n this.messageHandler.prependOnceListener('_rpc_applicationConnected:', onAppChange);\n\n // do the actual connecting to the app\n return (async () => {\n let pageDict, connectedAppIdKey;\n try {\n ([connectedAppIdKey, pageDict] = await this.send('connectToApp', {\n appIdKey\n }));\n } catch (err) {\n log.warn(`Unable to connect to app: ${err.message}`);\n reject(err);\n }\n\n // sometimes the connect logic happens, but with an empty dictionary\n // which leads to the remote debugger getting disconnected, and into a loop\n if (_.isEmpty(pageDict)) {\n let msg = 'Empty page dictionary received';\n log.debug(msg);\n reject(new Error(msg));\n } else {\n resolve([connectedAppIdKey, pageDict]);\n }\n })();\n });\n }\n\n onExecutionContextCreated (err, context) {\n // { id: 2, isPageContext: true, name: '', frameId: '0.1' }\n // right now we have no way to map contexts to apps/pages\n // so just store\n this.contexts.push(context.id);\n }\n\n onGarbageCollected () {\n // just want to log that this is happening, as it can affect opertion\n log.debug(`Web Inspector garbage collected`);\n }\n\n onScriptParsed (err, scriptInfo) {\n // { scriptId: '13', url: '', startLine: 0, startColumn: 0, endLine: 82, endColumn: 3 }\n log.debug(`Script parsed: ${JSON.stringify(scriptInfo)}`);\n }\n}\n"],"mappings":"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"}
@@ -8,7 +8,7 @@ exports.default = void 0;
8
8
  require("source-map-support/register");
9
9
  var _logger = _interopRequireDefault(require("../logger"));
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
11
- var _support = require("appium/support");
11
+ var _support = require("@appium/support");
12
12
  var _events = _interopRequireDefault(require("events"));
13
13
  class RpcMessageHandler extends _events.default {
14
14
  constructor(isTargetBased = false) {
@@ -176,4 +176,4 @@ class RpcMessageHandler extends _events.default {
176
176
  }
177
177
  }
178
178
  exports.default = RpcMessageHandler;
179
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJScGNNZXNzYWdlSGFuZGxlciIsIkV2ZW50RW1pdHRlcnMiLCJjb25zdHJ1Y3RvciIsImlzVGFyZ2V0QmFzZWQiLCJfaXNUYXJnZXRCYXNlZCIsImhhbmRsZU1lc3NhZ2UiLCJwbGlzdCIsInNlbGVjdG9yIiwiX19zZWxlY3RvciIsImxvZyIsImRlYnVnIiwiYXJndW1lbnQiLCJfX2FyZ3VtZW50IiwiZW1pdCIsIldJUlNpbXVsYXRvck5hbWVLZXkiLCJXSVJTaW11bGF0b3JCdWlsZEtleSIsIldJUlNpbXVsYXRvclByb2R1Y3RWZXJzaW9uS2V5IiwiV0lSQXBwbGljYXRpb25EaWN0aW9uYXJ5S2V5IiwiV0lSQXBwbGljYXRpb25JZGVudGlmaWVyS2V5IiwiV0lSTGlzdGluZ0tleSIsImhhbmRsZURhdGFNZXNzYWdlIiwicGFyc2VEYXRhS2V5IiwiSlNPTiIsInBhcnNlIiwiV0lSTWVzc2FnZURhdGFLZXkiLCJ0b1N0cmluZyIsImVyciIsImVycm9yIiwiXyIsInRydW5jYXRlIiwic3RyaW5naWZ5IiwibGVuZ3RoIiwiRXJyb3IiLCJtZXNzYWdlIiwiZGlzcGF0Y2hEYXRhTWVzc2FnZSIsIm1zZ0lkIiwibWV0aG9kIiwicGFyYW1zIiwicmVzdWx0IiwiaXNFbXB0eSIsImxpc3RlbmVyQ291bnQiLCJoYXMiLCJ2YWx1ZSIsImV2ZW50TmFtZXMiLCJhcmdzIiwicHVzaCIsInJlY29yZCIsImNvbnRleHQiLCJzdGFydHNXaXRoIiwibmFtZSIsImRhdGFLZXkiLCJpZCIsImFwcCIsInRhcmdldEluZm8iLCJvbGRUYXJnZXRJZCIsIm5ld1RhcmdldElkIiwidGFyZ2V0SWQiLCJ3YXJuIiwidXRpbCIsImpzb25TdHJpbmdpZnkiLCJ3YXNUaHJvd24iLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9ycGMvcnBjLW1lc3NhZ2UtaGFuZGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBFdmVudEVtaXR0ZXJzIGZyb20gJ2V2ZW50cyc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUnBjTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXJzIHtcbiAgY29uc3RydWN0b3IgKGlzVGFyZ2V0QmFzZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmlzVGFyZ2V0QmFzZWQgPSBpc1RhcmdldEJhc2VkO1xuICB9XG5cbiAgZ2V0IGlzVGFyZ2V0QmFzZWQgKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1RhcmdldEJhc2VkO1xuICB9XG5cbiAgc2V0IGlzVGFyZ2V0QmFzZWQgKGlzVGFyZ2V0QmFzZWQpIHtcbiAgICB0aGlzLl9pc1RhcmdldEJhc2VkID0gISFpc1RhcmdldEJhc2VkO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTWVzc2FnZSAocGxpc3QpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IHBsaXN0Ll9fc2VsZWN0b3I7XG4gICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgbG9nLmRlYnVnKCdHb3QgYW4gaW52YWxpZCBwbGlzdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3VtZW50ID0gcGxpc3QuX19hcmd1bWVudDtcbiAgICBzd2l0Y2ggKHNlbGVjdG9yKSB7XG4gICAgICBjYXNlICdfcnBjX3JlcG9ydFNldHVwOic6XG4gICAgICAgIHRoaXMuZW1pdCgnX3JwY19yZXBvcnRTZXR1cDonLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgYXJndW1lbnQuV0lSU2ltdWxhdG9yTmFtZUtleSxcbiAgICAgICAgICBhcmd1bWVudC5XSVJTaW11bGF0b3JCdWlsZEtleSxcbiAgICAgICAgICBhcmd1bWVudC5XSVJTaW11bGF0b3JQcm9kdWN0VmVyc2lvbktleVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ19ycGNfcmVwb3J0Q29ubmVjdGVkQXBwbGljYXRpb25MaXN0Oic6XG4gICAgICAgIHRoaXMuZW1pdCgnX3JwY19yZXBvcnRDb25uZWN0ZWRBcHBsaWNhdGlvbkxpc3Q6JyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIGFyZ3VtZW50LldJUkFwcGxpY2F0aW9uRGljdGlvbmFyeUtleVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ19ycGNfYXBwbGljYXRpb25TZW50TGlzdGluZzonOlxuICAgICAgICB0aGlzLmVtaXQoJ19ycGNfZm9yd2FyZEdldExpc3Rpbmc6JyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIGFyZ3VtZW50LldJUkFwcGxpY2F0aW9uSWRlbnRpZmllcktleSxcbiAgICAgICAgICBhcmd1bWVudC5XSVJMaXN0aW5nS2V5XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnX3JwY19hcHBsaWNhdGlvbkNvbm5lY3RlZDonOlxuICAgICAgICB0aGlzLmVtaXQoJ19ycGNfYXBwbGljYXRpb25Db25uZWN0ZWQ6JywgbnVsbCwgYXJndW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ19ycGNfYXBwbGljYXRpb25EaXNjb25uZWN0ZWQ6JzpcbiAgICAgICAgdGhpcy5lbWl0KCdfcnBjX2FwcGxpY2F0aW9uRGlzY29ubmVjdGVkOicsIG51bGwsIGFyZ3VtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfcnBjX2FwcGxpY2F0aW9uVXBkYXRlZDonOlxuICAgICAgICB0aGlzLmVtaXQoJ19ycGNfYXBwbGljYXRpb25VcGRhdGVkOicsIG51bGwsIGFyZ3VtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfcnBjX3JlcG9ydENvbm5lY3RlZERyaXZlckxpc3Q6JzpcbiAgICAgICAgdGhpcy5lbWl0KCdfcnBjX3JlcG9ydENvbm5lY3RlZERyaXZlckxpc3Q6JywgbnVsbCwgYXJndW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ19ycGNfcmVwb3J0Q3VycmVudFN0YXRlOic6XG4gICAgICAgIHRoaXMuZW1pdCgnX3JwY19yZXBvcnRDdXJyZW50U3RhdGU6JywgbnVsbCwgYXJndW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ19ycGNfYXBwbGljYXRpb25TZW50RGF0YTonOlxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURhdGFNZXNzYWdlKHBsaXN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cuZGVidWcoYERlYnVnZ2VyIGdvdCBhIG1lc3NhZ2UgZm9yICcke3NlbGVjdG9yfScgYW5kIGhhdmUgbm8gYCArXG4gICAgICAgICAgYGhhbmRsZXIsIGRvaW5nIG5vdGhpbmcuYCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VEYXRhS2V5IChwbGlzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShwbGlzdC5fX2FyZ3VtZW50LldJUk1lc3NhZ2VEYXRhS2V5LnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yKGBVbnBhcnNlYWJsZSBtZXNzYWdlIGRhdGE6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShwbGlzdCksIHtsZW5ndGg6IDEwMH0pfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSBkYXRhOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRpc3BhdGNoRGF0YU1lc3NhZ2UgKG1zZ0lkLCBtZXRob2QsIHBhcmFtcywgcmVzdWx0LCBlcnJvcikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICBpZiAoIV8uaXNFbXB0eShtc2dJZCkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgSGFuZGxpbmcgbWVzc2FnZSAoaWQ6ICcke21zZ0lkfScpYCk7XG4gICAgfVxuXG4gICAgaWYgKG1zZ0lkKSB7XG4gICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KG1zZ0lkKSkge1xuICAgICAgICBpZiAoXy5oYXMocmVzdWx0Py5yZXN1bHQsICd2YWx1ZScpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlc3VsdC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQobXNnSWQsIGVycm9yLCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmVycm9yKGBXZWIgSW5zcGVjdG9yIHJldHVybmVkIGRhdGEgZm9yIG1lc3NhZ2UgJyR7bXNnSWR9JyBgICtcbiAgICAgICAgICBgYnV0IHdlIHdlcmUgbm90IHdhaXRpbmcgZm9yIHRoYXQgbWVzc2FnZSEgYCArXG4gICAgICAgICAgYHJlc3VsdDogJyR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX0nOyBgICtcbiAgICAgICAgICBgZXJyb3I6ICcke0pTT04uc3RyaW5naWZ5KGVycm9yKX0nYCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGV2ZW50TmFtZXMgPSBbbWV0aG9kXTtcbiAgICBsZXQgYXJncyA9IFtwYXJhbXNdO1xuXG4gICAgLy8gc29tZSBldmVudHMgaGF2ZSBkaWZmZXJlbnQgbmFtZXMsIG9yIHRoZSBhcmd1bWVudHMgYXJlIG1hcHBlZCBmcm9tIHRoZVxuICAgIC8vIHBhcmFtZXRlcnMgcmVjZWl2ZWRcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnUGFnZS5mcmFtZVN0b3BwZWRMb2FkaW5nJzpcbiAgICAgICAgZXZlbnROYW1lcy5wdXNoKCdQYWdlLmZyYW1lTmF2aWdhdGVkJyk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnOlxuICAgICAgICBhcmdzID0gW2AnJHttZXRob2R9JyBldmVudGBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RpbWVsaW5lLmV2ZW50UmVjb3JkZWQnOlxuICAgICAgICBhcmdzID0gW3BhcmFtcyB8fCBwYXJhbXMucmVjb3JkXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdDb25zb2xlLm1lc3NhZ2VBZGRlZCc6XG4gICAgICAgIGFyZ3MgPSBbcGFyYW1zLm1lc3NhZ2VdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1J1bnRpbWUuZXhlY3V0aW9uQ29udGV4dENyZWF0ZWQnOlxuICAgICAgICBhcmdzID0gW3BhcmFtcy5jb250ZXh0XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBwYXNzXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChfLnN0YXJ0c1dpdGgobWV0aG9kLCAnTmV0d29yay4nKSkge1xuICAgICAgLy8gYWdncmVnYXRlIE5ldHdvcmsgZXZlbnRzLCBhbmQgYWRkIG9yaWdpbmFsIG1ldGhvZCBuYW1lIHRvIHRoZSBhcmd1bWVudHNcbiAgICAgIGV2ZW50TmFtZXMucHVzaCgnTmV0d29ya0V2ZW50Jyk7XG4gICAgICBhcmdzLnB1c2gobWV0aG9kKTtcbiAgICB9XG4gICAgaWYgKF8uc3RhcnRzV2l0aChtZXRob2QsICdDb25zb2xlLicpKSB7XG4gICAgICAvLyBhZ2dyZWdhdGUgTmV0d29yayBldmVudHMsIGFuZCBhZGQgb3JpZ2luYWwgbWV0aG9kIG5hbWUgdG8gdGhlIGFyZ3VtZW50c1xuICAgICAgZXZlbnROYW1lcy5wdXNoKCdDb25zb2xlRXZlbnQnKTtcbiAgICAgIGFyZ3MucHVzaChtZXRob2QpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmFtZSBvZiBldmVudE5hbWVzKSB7XG4gICAgICB0aGlzLmVtaXQobmFtZSwgZXJyb3IsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZURhdGFNZXNzYWdlIChwbGlzdCkge1xuICAgIGNvbnN0IGRhdGFLZXkgPSB0aGlzLnBhcnNlRGF0YUtleShwbGlzdCk7XG4gICAgbGV0IG1zZ0lkID0gKGRhdGFLZXkuaWQgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgbGV0IHJlc3VsdCA9IGRhdGFLZXkucmVzdWx0O1xuXG4gICAgbGV0IG1ldGhvZCA9IGRhdGFLZXkubWV0aG9kO1xuICAgIGxldCBwYXJhbXM7XG5cbiAgICBpZiAobWV0aG9kID09PSAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnKSB7XG4gICAgICAvLyB0aGlzIGlzIGluIHJlc3BvbnNlIHRvIGEgYF9ycGNfZm9yd2FyZFNvY2tldFNldHVwOmAgY2FsbFxuICAgICAgLy8gdGFyZ2V0SW5mbzogeyB0YXJnZXRJZDogJ3BhZ2UtMScsIHR5cGU6ICdwYWdlJyB9XG4gICAgICBjb25zdCBhcHAgPSBwbGlzdC5fX2FyZ3VtZW50LldJUkFwcGxpY2F0aW9uSWRlbnRpZmllcktleTtcbiAgICAgIGNvbnN0IHRhcmdldEluZm8gPSBkYXRhS2V5LnBhcmFtcy50YXJnZXRJbmZvO1xuICAgICAgdGhpcy5lbWl0KCdUYXJnZXQudGFyZ2V0Q3JlYXRlZCcsIG51bGwsIGFwcCwgdGFyZ2V0SW5mbyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdUYXJnZXQuZGlkQ29tbWl0UHJvdmlzaW9uYWxUYXJnZXQnKSB7XG4gICAgICBjb25zdCBhcHAgPSBwbGlzdC5fX2FyZ3VtZW50LldJUkFwcGxpY2F0aW9uSWRlbnRpZmllcktleTtcbiAgICAgIGNvbnN0IG9sZFRhcmdldElkID0gZGF0YUtleS5wYXJhbXMub2xkVGFyZ2V0SWQ7XG4gICAgICBjb25zdCBuZXdUYXJnZXRJZCA9IGRhdGFLZXkucGFyYW1zLm5ld1RhcmdldElkO1xuICAgICAgdGhpcy5lbWl0KCdUYXJnZXQuZGlkQ29tbWl0UHJvdmlzaW9uYWxUYXJnZXQnLCBudWxsLCBhcHAsIG9sZFRhcmdldElkLCBuZXdUYXJnZXRJZCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJykge1xuICAgICAgY29uc3QgYXBwID0gcGxpc3QuX19hcmd1bWVudC5XSVJBcHBsaWNhdGlvbklkZW50aWZpZXJLZXk7XG4gICAgICBjb25zdCB0YXJnZXRJbmZvID0gZGF0YUtleS5wYXJhbXMudGFyZ2V0SW5mbyB8fCB7dGFyZ2V0SWQ6IGRhdGFLZXkucGFyYW1zLnRhcmdldElkfTtcbiAgICAgIHRoaXMuZW1pdCgnVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIG51bGwsIGFwcCwgdGFyZ2V0SW5mbyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhS2V5LmVycm9yICYmIHRoaXMuaXNUYXJnZXRCYXNlZCkge1xuICAgICAgaWYgKGRhdGFLZXkubWV0aG9kICE9PSAnVGFyZ2V0LmRpc3BhdGNoTWVzc2FnZUZyb21UYXJnZXQnKSB7XG4gICAgICAgIC8vIHRoaXMgc29ydCBvZiBtZXNzYWdlLCBhdCB0aGlzIHBvaW50LCBpcyBqdXN0IGFuIGFja25vd2xlZGdlbWVudFxuICAgICAgICAvLyB0aGF0IHRoZSBvcmlnaW5hbCBtZXNzYWdlIHdhcyByZWNlaXZlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBUYXJnZXQtYmFzZWQgbWVzc2FnZSB3cmFwcGluZyBhIHByb3RvY29sIG1lc3NhZ2VcbiAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04ucGFyc2UoZGF0YUtleS5wYXJhbXMubWVzc2FnZSk7XG4gICAgICAgIG1zZ0lkID0gbWVzc2FnZS5pZDtcbiAgICAgICAgbWV0aG9kID0gbWVzc2FnZS5tZXRob2Q7XG4gICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVzdWx0IHx8IG1lc3NhZ2U7XG4gICAgICAgIHBhcmFtcyA9IHJlc3VsdC5wYXJhbXM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRoZW4gc29tZSBhc3BlY3Qgb2YgdGhlIHByb3RvY29sIGlzIG1pc3NpbmcgdG8gdXNcbiAgICAgICAgLy8gc28gcHJpbnQgdGhlIGVudGlyZSBtZXNzYWdlIHRvIGdldCB2aXNpYmlpdHkgaW50byB3aGF0IGlzIGdvaW5nIG9uXG4gICAgICAgIGxvZy5lcnJvcihgVW5leHBlY3RlZCBtZXNzYWdlIGZvcm1hdCBmcm9tIFdlYiBJbnNwZWN0b3I6YCk7XG4gICAgICAgIHRoaXMud2Fybih1dGlsLmpzb25TdHJpbmdpZnkocGxpc3QpKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMgPSBkYXRhS2V5LnBhcmFtcztcbiAgICB9XG5cbiAgICAvLyB3ZSBjYW4gZ2V0IGFuIGVycm9yLCBvciB3ZSBjYW4gZ2V0IGEgcmVzcG9uc2UgdGhhdCBpcyBhbiBlcnJvclxuICAgIGxldCBlcnJvciA9IGRhdGFLZXkuZXJyb3IgfHwgbnVsbDtcbiAgICBpZiAocmVzdWx0Py53YXNUaHJvd24pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAocmVzdWx0Py5yZXN1bHQ/LnZhbHVlIHx8IHJlc3VsdD8ucmVzdWx0Py5kZXNjcmlwdGlvbilcbiAgICAgICAgPyAocmVzdWx0Py5yZXN1bHQ/LnZhbHVlIHx8IHJlc3VsdD8ucmVzdWx0Py5kZXNjcmlwdGlvbilcbiAgICAgICAgOiAnRXJyb3Igb2NjdXJyZWQgaW4gaGFuZGxpbmcgZGF0YSBtZXNzYWdlJztcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hEYXRhTWVzc2FnZShtc2dJZCwgbWV0aG9kLCBwYXJhbXMsIHJlc3VsdCwgZXJyb3IpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHZSxNQUFNQSxpQkFBaUIsU0FBU0MsZUFB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
179
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJScGNNZXNzYWdlSGFuZGxlciIsIkV2ZW50RW1pdHRlcnMiLCJjb25zdHJ1Y3RvciIsImlzVGFyZ2V0QmFzZWQiLCJfaXNUYXJnZXRCYXNlZCIsImhhbmRsZU1lc3NhZ2UiLCJwbGlzdCIsInNlbGVjdG9yIiwiX19zZWxlY3RvciIsImxvZyIsImRlYnVnIiwiYXJndW1lbnQiLCJfX2FyZ3VtZW50IiwiZW1pdCIsIldJUlNpbXVsYXRvck5hbWVLZXkiLCJXSVJTaW11bGF0b3JCdWlsZEtleSIsIldJUlNpbXVsYXRvclByb2R1Y3RWZXJzaW9uS2V5IiwiV0lSQXBwbGljYXRpb25EaWN0aW9uYXJ5S2V5IiwiV0lSQXBwbGljYXRpb25JZGVudGlmaWVyS2V5IiwiV0lSTGlzdGluZ0tleSIsImhhbmRsZURhdGFNZXNzYWdlIiwicGFyc2VEYXRhS2V5IiwiSlNPTiIsInBhcnNlIiwiV0lSTWVzc2FnZURhdGFLZXkiLCJ0b1N0cmluZyIsImVyciIsImVycm9yIiwiXyIsInRydW5jYXRlIiwic3RyaW5naWZ5IiwibGVuZ3RoIiwiRXJyb3IiLCJtZXNzYWdlIiwiZGlzcGF0Y2hEYXRhTWVzc2FnZSIsIm1zZ0lkIiwibWV0aG9kIiwicGFyYW1zIiwicmVzdWx0IiwiaXNFbXB0eSIsImxpc3RlbmVyQ291bnQiLCJoYXMiLCJ2YWx1ZSIsImV2ZW50TmFtZXMiLCJhcmdzIiwicHVzaCIsInJlY29yZCIsImNvbnRleHQiLCJzdGFydHNXaXRoIiwibmFtZSIsImRhdGFLZXkiLCJpZCIsImFwcCIsInRhcmdldEluZm8iLCJvbGRUYXJnZXRJZCIsIm5ld1RhcmdldElkIiwidGFyZ2V0SWQiLCJ3YXJuIiwidXRpbCIsImpzb25TdHJpbmdpZnkiLCJ3YXNUaHJvd24iLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9ycGMvcnBjLW1lc3NhZ2UtaGFuZGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgRXZlbnRFbWl0dGVycyBmcm9tICdldmVudHMnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJwY01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVycyB7XG4gIGNvbnN0cnVjdG9yIChpc1RhcmdldEJhc2VkID0gZmFsc2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5pc1RhcmdldEJhc2VkID0gaXNUYXJnZXRCYXNlZDtcbiAgfVxuXG4gIGdldCBpc1RhcmdldEJhc2VkICgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNUYXJnZXRCYXNlZDtcbiAgfVxuXG4gIHNldCBpc1RhcmdldEJhc2VkIChpc1RhcmdldEJhc2VkKSB7XG4gICAgdGhpcy5faXNUYXJnZXRCYXNlZCA9ICEhaXNUYXJnZXRCYXNlZDtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1lc3NhZ2UgKHBsaXN0KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBwbGlzdC5fX3NlbGVjdG9yO1xuICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgIGxvZy5kZWJ1ZygnR290IGFuIGludmFsaWQgcGxpc3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhcmd1bWVudCA9IHBsaXN0Ll9fYXJndW1lbnQ7XG4gICAgc3dpdGNoIChzZWxlY3Rvcikge1xuICAgICAgY2FzZSAnX3JwY19yZXBvcnRTZXR1cDonOlxuICAgICAgICB0aGlzLmVtaXQoJ19ycGNfcmVwb3J0U2V0dXA6JyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIGFyZ3VtZW50LldJUlNpbXVsYXRvck5hbWVLZXksXG4gICAgICAgICAgYXJndW1lbnQuV0lSU2ltdWxhdG9yQnVpbGRLZXksXG4gICAgICAgICAgYXJndW1lbnQuV0lSU2ltdWxhdG9yUHJvZHVjdFZlcnNpb25LZXlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfcnBjX3JlcG9ydENvbm5lY3RlZEFwcGxpY2F0aW9uTGlzdDonOlxuICAgICAgICB0aGlzLmVtaXQoJ19ycGNfcmVwb3J0Q29ubmVjdGVkQXBwbGljYXRpb25MaXN0OicsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBhcmd1bWVudC5XSVJBcHBsaWNhdGlvbkRpY3Rpb25hcnlLZXlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfcnBjX2FwcGxpY2F0aW9uU2VudExpc3Rpbmc6JzpcbiAgICAgICAgdGhpcy5lbWl0KCdfcnBjX2ZvcndhcmRHZXRMaXN0aW5nOicsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBhcmd1bWVudC5XSVJBcHBsaWNhdGlvbklkZW50aWZpZXJLZXksXG4gICAgICAgICAgYXJndW1lbnQuV0lSTGlzdGluZ0tleVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ19ycGNfYXBwbGljYXRpb25Db25uZWN0ZWQ6JzpcbiAgICAgICAgdGhpcy5lbWl0KCdfcnBjX2FwcGxpY2F0aW9uQ29ubmVjdGVkOicsIG51bGwsIGFyZ3VtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfcnBjX2FwcGxpY2F0aW9uRGlzY29ubmVjdGVkOic6XG4gICAgICAgIHRoaXMuZW1pdCgnX3JwY19hcHBsaWNhdGlvbkRpc2Nvbm5lY3RlZDonLCBudWxsLCBhcmd1bWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnX3JwY19hcHBsaWNhdGlvblVwZGF0ZWQ6JzpcbiAgICAgICAgdGhpcy5lbWl0KCdfcnBjX2FwcGxpY2F0aW9uVXBkYXRlZDonLCBudWxsLCBhcmd1bWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnX3JwY19yZXBvcnRDb25uZWN0ZWREcml2ZXJMaXN0Oic6XG4gICAgICAgIHRoaXMuZW1pdCgnX3JwY19yZXBvcnRDb25uZWN0ZWREcml2ZXJMaXN0OicsIG51bGwsIGFyZ3VtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfcnBjX3JlcG9ydEN1cnJlbnRTdGF0ZTonOlxuICAgICAgICB0aGlzLmVtaXQoJ19ycGNfcmVwb3J0Q3VycmVudFN0YXRlOicsIG51bGwsIGFyZ3VtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdfcnBjX2FwcGxpY2F0aW9uU2VudERhdGE6JzpcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEYXRhTWVzc2FnZShwbGlzdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLmRlYnVnKGBEZWJ1Z2dlciBnb3QgYSBtZXNzYWdlIGZvciAnJHtzZWxlY3Rvcn0nIGFuZCBoYXZlIG5vIGAgK1xuICAgICAgICAgIGBoYW5kbGVyLCBkb2luZyBub3RoaW5nLmApO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlRGF0YUtleSAocGxpc3QpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UocGxpc3QuX19hcmd1bWVudC5XSVJNZXNzYWdlRGF0YUtleS50b1N0cmluZygndXRmOCcpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvcihgVW5wYXJzZWFibGUgbWVzc2FnZSBkYXRhOiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkocGxpc3QpLCB7bGVuZ3RoOiAxMDB9KX1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG1lc3NhZ2UgZGF0YTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkaXNwYXRjaERhdGFNZXNzYWdlIChtc2dJZCwgbWV0aG9kLCBwYXJhbXMsIHJlc3VsdCwgZXJyb3IpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgaWYgKCFfLmlzRW1wdHkobXNnSWQpKSB7XG4gICAgICBsb2cuZGVidWcoYEhhbmRsaW5nIG1lc3NhZ2UgKGlkOiAnJHttc2dJZH0nKWApO1xuICAgIH1cblxuICAgIGlmIChtc2dJZCkge1xuICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudChtc2dJZCkpIHtcbiAgICAgICAgaWYgKF8uaGFzKHJlc3VsdD8ucmVzdWx0LCAndmFsdWUnKSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KG1zZ0lkLCBlcnJvciwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5lcnJvcihgV2ViIEluc3BlY3RvciByZXR1cm5lZCBkYXRhIGZvciBtZXNzYWdlICcke21zZ0lkfScgYCArXG4gICAgICAgICAgYGJ1dCB3ZSB3ZXJlIG5vdCB3YWl0aW5nIGZvciB0aGF0IG1lc3NhZ2UhIGAgK1xuICAgICAgICAgIGByZXN1bHQ6ICcke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9JzsgYCArXG4gICAgICAgICAgYGVycm9yOiAnJHtKU09OLnN0cmluZ2lmeShlcnJvcil9J2ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBldmVudE5hbWVzID0gW21ldGhvZF07XG4gICAgbGV0IGFyZ3MgPSBbcGFyYW1zXTtcblxuICAgIC8vIHNvbWUgZXZlbnRzIGhhdmUgZGlmZmVyZW50IG5hbWVzLCBvciB0aGUgYXJndW1lbnRzIGFyZSBtYXBwZWQgZnJvbSB0aGVcbiAgICAvLyBwYXJhbWV0ZXJzIHJlY2VpdmVkXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZyc6XG4gICAgICAgIGV2ZW50TmFtZXMucHVzaCgnUGFnZS5mcmFtZU5hdmlnYXRlZCcpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICBjYXNlICdQYWdlLmZyYW1lTmF2aWdhdGVkJzpcbiAgICAgICAgYXJncyA9IFtgJyR7bWV0aG9kfScgZXZlbnRgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUaW1lbGluZS5ldmVudFJlY29yZGVkJzpcbiAgICAgICAgYXJncyA9IFtwYXJhbXMgfHwgcGFyYW1zLnJlY29yZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQ29uc29sZS5tZXNzYWdlQWRkZWQnOlxuICAgICAgICBhcmdzID0gW3BhcmFtcy5tZXNzYWdlXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkJzpcbiAgICAgICAgYXJncyA9IFtwYXJhbXMuY29udGV4dF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gcGFzc1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoXy5zdGFydHNXaXRoKG1ldGhvZCwgJ05ldHdvcmsuJykpIHtcbiAgICAgIC8vIGFnZ3JlZ2F0ZSBOZXR3b3JrIGV2ZW50cywgYW5kIGFkZCBvcmlnaW5hbCBtZXRob2QgbmFtZSB0byB0aGUgYXJndW1lbnRzXG4gICAgICBldmVudE5hbWVzLnB1c2goJ05ldHdvcmtFdmVudCcpO1xuICAgICAgYXJncy5wdXNoKG1ldGhvZCk7XG4gICAgfVxuICAgIGlmIChfLnN0YXJ0c1dpdGgobWV0aG9kLCAnQ29uc29sZS4nKSkge1xuICAgICAgLy8gYWdncmVnYXRlIE5ldHdvcmsgZXZlbnRzLCBhbmQgYWRkIG9yaWdpbmFsIG1ldGhvZCBuYW1lIHRvIHRoZSBhcmd1bWVudHNcbiAgICAgIGV2ZW50TmFtZXMucHVzaCgnQ29uc29sZUV2ZW50Jyk7XG4gICAgICBhcmdzLnB1c2gobWV0aG9kKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgZXZlbnROYW1lcykge1xuICAgICAgdGhpcy5lbWl0KG5hbWUsIGVycm9yLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVEYXRhTWVzc2FnZSAocGxpc3QpIHtcbiAgICBjb25zdCBkYXRhS2V5ID0gdGhpcy5wYXJzZURhdGFLZXkocGxpc3QpO1xuICAgIGxldCBtc2dJZCA9IChkYXRhS2V5LmlkIHx8ICcnKS50b1N0cmluZygpO1xuICAgIGxldCByZXN1bHQgPSBkYXRhS2V5LnJlc3VsdDtcblxuICAgIGxldCBtZXRob2QgPSBkYXRhS2V5Lm1ldGhvZDtcbiAgICBsZXQgcGFyYW1zO1xuXG4gICAgaWYgKG1ldGhvZCA9PT0gJ1RhcmdldC50YXJnZXRDcmVhdGVkJykge1xuICAgICAgLy8gdGhpcyBpcyBpbiByZXNwb25zZSB0byBhIGBfcnBjX2ZvcndhcmRTb2NrZXRTZXR1cDpgIGNhbGxcbiAgICAgIC8vIHRhcmdldEluZm86IHsgdGFyZ2V0SWQ6ICdwYWdlLTEnLCB0eXBlOiAncGFnZScgfVxuICAgICAgY29uc3QgYXBwID0gcGxpc3QuX19hcmd1bWVudC5XSVJBcHBsaWNhdGlvbklkZW50aWZpZXJLZXk7XG4gICAgICBjb25zdCB0YXJnZXRJbmZvID0gZGF0YUtleS5wYXJhbXMudGFyZ2V0SW5mbztcbiAgICAgIHRoaXMuZW1pdCgnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCBudWxsLCBhcHAsIHRhcmdldEluZm8pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnVGFyZ2V0LmRpZENvbW1pdFByb3Zpc2lvbmFsVGFyZ2V0Jykge1xuICAgICAgY29uc3QgYXBwID0gcGxpc3QuX19hcmd1bWVudC5XSVJBcHBsaWNhdGlvbklkZW50aWZpZXJLZXk7XG4gICAgICBjb25zdCBvbGRUYXJnZXRJZCA9IGRhdGFLZXkucGFyYW1zLm9sZFRhcmdldElkO1xuICAgICAgY29uc3QgbmV3VGFyZ2V0SWQgPSBkYXRhS2V5LnBhcmFtcy5uZXdUYXJnZXRJZDtcbiAgICAgIHRoaXMuZW1pdCgnVGFyZ2V0LmRpZENvbW1pdFByb3Zpc2lvbmFsVGFyZ2V0JywgbnVsbCwgYXBwLCBvbGRUYXJnZXRJZCwgbmV3VGFyZ2V0SWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcpIHtcbiAgICAgIGNvbnN0IGFwcCA9IHBsaXN0Ll9fYXJndW1lbnQuV0lSQXBwbGljYXRpb25JZGVudGlmaWVyS2V5O1xuICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IGRhdGFLZXkucGFyYW1zLnRhcmdldEluZm8gfHwge3RhcmdldElkOiBkYXRhS2V5LnBhcmFtcy50YXJnZXRJZH07XG4gICAgICB0aGlzLmVtaXQoJ1RhcmdldC50YXJnZXREZXN0cm95ZWQnLCBudWxsLCBhcHAsIHRhcmdldEluZm8pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGF0YUtleS5lcnJvciAmJiB0aGlzLmlzVGFyZ2V0QmFzZWQpIHtcbiAgICAgIGlmIChkYXRhS2V5Lm1ldGhvZCAhPT0gJ1RhcmdldC5kaXNwYXRjaE1lc3NhZ2VGcm9tVGFyZ2V0Jykge1xuICAgICAgICAvLyB0aGlzIHNvcnQgb2YgbWVzc2FnZSwgYXQgdGhpcyBwb2ludCwgaXMganVzdCBhbiBhY2tub3dsZWRnZW1lbnRcbiAgICAgICAgLy8gdGhhdCB0aGUgb3JpZ2luYWwgbWVzc2FnZSB3YXMgcmVjZWl2ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBhdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGEgVGFyZ2V0LWJhc2VkIG1lc3NhZ2Ugd3JhcHBpbmcgYSBwcm90b2NvbCBtZXNzYWdlXG4gICAgICBsZXQgbWVzc2FnZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKGRhdGFLZXkucGFyYW1zLm1lc3NhZ2UpO1xuICAgICAgICBtc2dJZCA9IG1lc3NhZ2UuaWQ7XG4gICAgICAgIG1ldGhvZCA9IG1lc3NhZ2UubWV0aG9kO1xuICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlc3VsdCB8fCBtZXNzYWdlO1xuICAgICAgICBwYXJhbXMgPSByZXN1bHQucGFyYW1zO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGlmIHRoaXMgaGFwcGVucyB0aGVuIHNvbWUgYXNwZWN0IG9mIHRoZSBwcm90b2NvbCBpcyBtaXNzaW5nIHRvIHVzXG4gICAgICAgIC8vIHNvIHByaW50IHRoZSBlbnRpcmUgbWVzc2FnZSB0byBnZXQgdmlzaWJpaXR5IGludG8gd2hhdCBpcyBnb2luZyBvblxuICAgICAgICBsb2cuZXJyb3IoYFVuZXhwZWN0ZWQgbWVzc2FnZSBmb3JtYXQgZnJvbSBXZWIgSW5zcGVjdG9yOmApO1xuICAgICAgICB0aGlzLndhcm4odXRpbC5qc29uU3RyaW5naWZ5KHBsaXN0KSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zID0gZGF0YUtleS5wYXJhbXM7XG4gICAgfVxuXG4gICAgLy8gd2UgY2FuIGdldCBhbiBlcnJvciwgb3Igd2UgY2FuIGdldCBhIHJlc3BvbnNlIHRoYXQgaXMgYW4gZXJyb3JcbiAgICBsZXQgZXJyb3IgPSBkYXRhS2V5LmVycm9yIHx8IG51bGw7XG4gICAgaWYgKHJlc3VsdD8ud2FzVGhyb3duKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gKHJlc3VsdD8ucmVzdWx0Py52YWx1ZSB8fCByZXN1bHQ/LnJlc3VsdD8uZGVzY3JpcHRpb24pXG4gICAgICAgID8gKHJlc3VsdD8ucmVzdWx0Py52YWx1ZSB8fCByZXN1bHQ/LnJlc3VsdD8uZGVzY3JpcHRpb24pXG4gICAgICAgIDogJ0Vycm9yIG9jY3VycmVkIGluIGhhbmRsaW5nIGRhdGEgbWVzc2FnZSc7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoRGF0YU1lc3NhZ2UobXNnSWQsIG1ldGhvZCwgcGFyYW1zLCByZXN1bHQsIGVycm9yKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR2UsTUFBTUEsaUJBQWlCLFNBQVNDLGVB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
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-message-handler.js","names":["RpcMessageHandler","EventEmitters","constructor","isTargetBased","_isTargetBased","handleMessage","plist","selector","__selector","log","debug","argument","__argument","emit","WIRSimulatorNameKey","WIRSimulatorBuildKey","WIRSimulatorProductVersionKey","WIRApplicationDictionaryKey","WIRApplicationIdentifierKey","WIRListingKey","handleDataMessage","parseDataKey","JSON","parse","WIRMessageDataKey","toString","err","error","_","truncate","stringify","length","Error","message","dispatchDataMessage","msgId","method","params","result","isEmpty","listenerCount","has","value","eventNames","args","push","record","context","startsWith","name","dataKey","id","app","targetInfo","oldTargetId","newTargetId","targetId","warn","util","jsonStringify","wasThrown","description"],"sources":["../../../lib/rpc/rpc-message-handler.js"],"sourcesContent":["import log from '../logger';\nimport _ from 'lodash';\nimport { util } from 'appium/support';\nimport EventEmitters from 'events';\n\n\nexport default class RpcMessageHandler extends EventEmitters {\n constructor (isTargetBased = false) {\n super();\n\n this.isTargetBased = isTargetBased;\n }\n\n get isTargetBased () {\n return this._isTargetBased;\n }\n\n set isTargetBased (isTargetBased) {\n this._isTargetBased = !!isTargetBased;\n }\n\n async handleMessage (plist) {\n const selector = plist.__selector;\n if (!selector) {\n log.debug('Got an invalid plist');\n return;\n }\n\n const argument = plist.__argument;\n switch (selector) {\n case '_rpc_reportSetup:':\n this.emit('_rpc_reportSetup:',\n null,\n argument.WIRSimulatorNameKey,\n argument.WIRSimulatorBuildKey,\n argument.WIRSimulatorProductVersionKey\n );\n break;\n case '_rpc_reportConnectedApplicationList:':\n this.emit('_rpc_reportConnectedApplicationList:',\n null,\n argument.WIRApplicationDictionaryKey\n );\n break;\n case '_rpc_applicationSentListing:':\n this.emit('_rpc_forwardGetListing:',\n null,\n argument.WIRApplicationIdentifierKey,\n argument.WIRListingKey\n );\n break;\n case '_rpc_applicationConnected:':\n this.emit('_rpc_applicationConnected:', null, argument);\n break;\n case '_rpc_applicationDisconnected:':\n this.emit('_rpc_applicationDisconnected:', null, argument);\n break;\n case '_rpc_applicationUpdated:':\n this.emit('_rpc_applicationUpdated:', null, argument);\n break;\n case '_rpc_reportConnectedDriverList:':\n this.emit('_rpc_reportConnectedDriverList:', null, argument);\n break;\n case '_rpc_reportCurrentState:':\n this.emit('_rpc_reportCurrentState:', null, argument);\n break;\n case '_rpc_applicationSentData:':\n await this.handleDataMessage(plist);\n break;\n default:\n log.debug(`Debugger got a message for '${selector}' and have no ` +\n `handler, doing nothing.`);\n }\n }\n\n parseDataKey (plist) {\n try {\n return JSON.parse(plist.__argument.WIRMessageDataKey.toString('utf8'));\n } catch (err) {\n log.error(`Unparseable message data: ${_.truncate(JSON.stringify(plist), {length: 100})}`);\n throw new Error(`Unable to parse message data: ${err.message}`);\n }\n }\n\n async dispatchDataMessage (msgId, method, params, result, error) { // eslint-disable-line require-await\n if (!_.isEmpty(msgId)) {\n log.debug(`Handling message (id: '${msgId}')`);\n }\n\n if (msgId) {\n if (this.listenerCount(msgId)) {\n if (_.has(result?.result, 'value')) {\n result = result.result.value;\n }\n this.emit(msgId, error, result);\n } else {\n log.error(`Web Inspector returned data for message '${msgId}' ` +\n `but we were not waiting for that message! ` +\n `result: '${JSON.stringify(result)}'; ` +\n `error: '${JSON.stringify(error)}'`);\n }\n return;\n }\n\n let eventNames = [method];\n let args = [params];\n\n // some events have different names, or the arguments are mapped from the\n // parameters received\n switch (method) {\n case 'Page.frameStoppedLoading':\n eventNames.push('Page.frameNavigated');\n // eslint-disable-line no-fallthrough\n case 'Page.frameNavigated':\n args = [`'${method}' event`];\n break;\n case 'Timeline.eventRecorded':\n args = [params || params.record];\n break;\n case 'Console.messageAdded':\n args = [params.message];\n break;\n case 'Runtime.executionContextCreated':\n args = [params.context];\n break;\n default:\n // pass\n break;\n }\n\n if (_.startsWith(method, 'Network.')) {\n // aggregate Network events, and add original method name to the arguments\n eventNames.push('NetworkEvent');\n args.push(method);\n }\n if (_.startsWith(method, 'Console.')) {\n // aggregate Network events, and add original method name to the arguments\n eventNames.push('ConsoleEvent');\n args.push(method);\n }\n\n for (const name of eventNames) {\n this.emit(name, error, ...args);\n }\n }\n\n async handleDataMessage (plist) {\n const dataKey = this.parseDataKey(plist);\n let msgId = (dataKey.id || '').toString();\n let result = dataKey.result;\n\n let method = dataKey.method;\n let params;\n\n if (method === 'Target.targetCreated') {\n // this is in response to a `_rpc_forwardSocketSetup:` call\n // targetInfo: { targetId: 'page-1', type: 'page' }\n const app = plist.__argument.WIRApplicationIdentifierKey;\n const targetInfo = dataKey.params.targetInfo;\n this.emit('Target.targetCreated', null, app, targetInfo);\n return;\n } else if (method === 'Target.didCommitProvisionalTarget') {\n const app = plist.__argument.WIRApplicationIdentifierKey;\n const oldTargetId = dataKey.params.oldTargetId;\n const newTargetId = dataKey.params.newTargetId;\n this.emit('Target.didCommitProvisionalTarget', null, app, oldTargetId, newTargetId);\n return;\n } else if (method === 'Target.targetDestroyed') {\n const app = plist.__argument.WIRApplicationIdentifierKey;\n const targetInfo = dataKey.params.targetInfo || {targetId: dataKey.params.targetId};\n this.emit('Target.targetDestroyed', null, app, targetInfo);\n return;\n }\n\n if (!dataKey.error && this.isTargetBased) {\n if (dataKey.method !== 'Target.dispatchMessageFromTarget') {\n // this sort of message, at this point, is just an acknowledgement\n // that the original message was received\n return;\n }\n\n // at this point, we have a Target-based message wrapping a protocol message\n let message;\n try {\n message = JSON.parse(dataKey.params.message);\n msgId = message.id;\n method = message.method;\n result = message.result || message;\n params = result.params;\n } catch (err) {\n // if this happens then some aspect of the protocol is missing to us\n // so print the entire message to get visibiity into what is going on\n log.error(`Unexpected message format from Web Inspector:`);\n this.warn(util.jsonStringify(plist));\n throw err;\n }\n } else {\n params = dataKey.params;\n }\n\n // we can get an error, or we can get a response that is an error\n let error = dataKey.error || null;\n if (result?.wasThrown) {\n const message = (result?.result?.value || result?.result?.description)\n ? (result?.result?.value || result?.result?.description)\n : 'Error occurred in handling data message';\n error = new Error(message);\n }\n\n await this.dispatchDataMessage(msgId, method, params, result, error);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rpc-message-handler.js","names":["RpcMessageHandler","EventEmitters","constructor","isTargetBased","_isTargetBased","handleMessage","plist","selector","__selector","log","debug","argument","__argument","emit","WIRSimulatorNameKey","WIRSimulatorBuildKey","WIRSimulatorProductVersionKey","WIRApplicationDictionaryKey","WIRApplicationIdentifierKey","WIRListingKey","handleDataMessage","parseDataKey","JSON","parse","WIRMessageDataKey","toString","err","error","_","truncate","stringify","length","Error","message","dispatchDataMessage","msgId","method","params","result","isEmpty","listenerCount","has","value","eventNames","args","push","record","context","startsWith","name","dataKey","id","app","targetInfo","oldTargetId","newTargetId","targetId","warn","util","jsonStringify","wasThrown","description"],"sources":["../../../lib/rpc/rpc-message-handler.js"],"sourcesContent":["import log from '../logger';\nimport _ from 'lodash';\nimport { util } from '@appium/support';\nimport EventEmitters from 'events';\n\n\nexport default class RpcMessageHandler extends EventEmitters {\n constructor (isTargetBased = false) {\n super();\n\n this.isTargetBased = isTargetBased;\n }\n\n get isTargetBased () {\n return this._isTargetBased;\n }\n\n set isTargetBased (isTargetBased) {\n this._isTargetBased = !!isTargetBased;\n }\n\n async handleMessage (plist) {\n const selector = plist.__selector;\n if (!selector) {\n log.debug('Got an invalid plist');\n return;\n }\n\n const argument = plist.__argument;\n switch (selector) {\n case '_rpc_reportSetup:':\n this.emit('_rpc_reportSetup:',\n null,\n argument.WIRSimulatorNameKey,\n argument.WIRSimulatorBuildKey,\n argument.WIRSimulatorProductVersionKey\n );\n break;\n case '_rpc_reportConnectedApplicationList:':\n this.emit('_rpc_reportConnectedApplicationList:',\n null,\n argument.WIRApplicationDictionaryKey\n );\n break;\n case '_rpc_applicationSentListing:':\n this.emit('_rpc_forwardGetListing:',\n null,\n argument.WIRApplicationIdentifierKey,\n argument.WIRListingKey\n );\n break;\n case '_rpc_applicationConnected:':\n this.emit('_rpc_applicationConnected:', null, argument);\n break;\n case '_rpc_applicationDisconnected:':\n this.emit('_rpc_applicationDisconnected:', null, argument);\n break;\n case '_rpc_applicationUpdated:':\n this.emit('_rpc_applicationUpdated:', null, argument);\n break;\n case '_rpc_reportConnectedDriverList:':\n this.emit('_rpc_reportConnectedDriverList:', null, argument);\n break;\n case '_rpc_reportCurrentState:':\n this.emit('_rpc_reportCurrentState:', null, argument);\n break;\n case '_rpc_applicationSentData:':\n await this.handleDataMessage(plist);\n break;\n default:\n log.debug(`Debugger got a message for '${selector}' and have no ` +\n `handler, doing nothing.`);\n }\n }\n\n parseDataKey (plist) {\n try {\n return JSON.parse(plist.__argument.WIRMessageDataKey.toString('utf8'));\n } catch (err) {\n log.error(`Unparseable message data: ${_.truncate(JSON.stringify(plist), {length: 100})}`);\n throw new Error(`Unable to parse message data: ${err.message}`);\n }\n }\n\n async dispatchDataMessage (msgId, method, params, result, error) { // eslint-disable-line require-await\n if (!_.isEmpty(msgId)) {\n log.debug(`Handling message (id: '${msgId}')`);\n }\n\n if (msgId) {\n if (this.listenerCount(msgId)) {\n if (_.has(result?.result, 'value')) {\n result = result.result.value;\n }\n this.emit(msgId, error, result);\n } else {\n log.error(`Web Inspector returned data for message '${msgId}' ` +\n `but we were not waiting for that message! ` +\n `result: '${JSON.stringify(result)}'; ` +\n `error: '${JSON.stringify(error)}'`);\n }\n return;\n }\n\n let eventNames = [method];\n let args = [params];\n\n // some events have different names, or the arguments are mapped from the\n // parameters received\n switch (method) {\n case 'Page.frameStoppedLoading':\n eventNames.push('Page.frameNavigated');\n // eslint-disable-line no-fallthrough\n case 'Page.frameNavigated':\n args = [`'${method}' event`];\n break;\n case 'Timeline.eventRecorded':\n args = [params || params.record];\n break;\n case 'Console.messageAdded':\n args = [params.message];\n break;\n case 'Runtime.executionContextCreated':\n args = [params.context];\n break;\n default:\n // pass\n break;\n }\n\n if (_.startsWith(method, 'Network.')) {\n // aggregate Network events, and add original method name to the arguments\n eventNames.push('NetworkEvent');\n args.push(method);\n }\n if (_.startsWith(method, 'Console.')) {\n // aggregate Network events, and add original method name to the arguments\n eventNames.push('ConsoleEvent');\n args.push(method);\n }\n\n for (const name of eventNames) {\n this.emit(name, error, ...args);\n }\n }\n\n async handleDataMessage (plist) {\n const dataKey = this.parseDataKey(plist);\n let msgId = (dataKey.id || '').toString();\n let result = dataKey.result;\n\n let method = dataKey.method;\n let params;\n\n if (method === 'Target.targetCreated') {\n // this is in response to a `_rpc_forwardSocketSetup:` call\n // targetInfo: { targetId: 'page-1', type: 'page' }\n const app = plist.__argument.WIRApplicationIdentifierKey;\n const targetInfo = dataKey.params.targetInfo;\n this.emit('Target.targetCreated', null, app, targetInfo);\n return;\n } else if (method === 'Target.didCommitProvisionalTarget') {\n const app = plist.__argument.WIRApplicationIdentifierKey;\n const oldTargetId = dataKey.params.oldTargetId;\n const newTargetId = dataKey.params.newTargetId;\n this.emit('Target.didCommitProvisionalTarget', null, app, oldTargetId, newTargetId);\n return;\n } else if (method === 'Target.targetDestroyed') {\n const app = plist.__argument.WIRApplicationIdentifierKey;\n const targetInfo = dataKey.params.targetInfo || {targetId: dataKey.params.targetId};\n this.emit('Target.targetDestroyed', null, app, targetInfo);\n return;\n }\n\n if (!dataKey.error && this.isTargetBased) {\n if (dataKey.method !== 'Target.dispatchMessageFromTarget') {\n // this sort of message, at this point, is just an acknowledgement\n // that the original message was received\n return;\n }\n\n // at this point, we have a Target-based message wrapping a protocol message\n let message;\n try {\n message = JSON.parse(dataKey.params.message);\n msgId = message.id;\n method = message.method;\n result = message.result || message;\n params = result.params;\n } catch (err) {\n // if this happens then some aspect of the protocol is missing to us\n // so print the entire message to get visibiity into what is going on\n log.error(`Unexpected message format from Web Inspector:`);\n this.warn(util.jsonStringify(plist));\n throw err;\n }\n } else {\n params = dataKey.params;\n }\n\n // we can get an error, or we can get a response that is an error\n let error = dataKey.error || null;\n if (result?.wasThrown) {\n const message = (result?.result?.value || result?.result?.description)\n ? (result?.result?.value || result?.result?.description)\n : 'Error occurred in handling data message';\n error = new Error(message);\n }\n\n await this.dispatchDataMessage(msgId, method, params, result, error);\n }\n}\n"],"mappings":"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"}
@@ -10,6 +10,7 @@ exports.checkParams = checkParams;
10
10
  exports.convertResult = convertResult;
11
11
  exports.deferredPromise = deferredPromise;
12
12
  exports.getDebuggerAppKey = getDebuggerAppKey;
13
+ exports.getModuleRoot = void 0;
13
14
  exports.getPossibleDebuggerAppKeys = getPossibleDebuggerAppKeys;
14
15
  exports.pageArrayFromDict = pageArrayFromDict;
15
16
  exports.simpleStringify = simpleStringify;
@@ -17,8 +18,9 @@ require("source-map-support/register");
17
18
  var _logger = _interopRequireDefault(require("./logger"));
18
19
  var _lodash = _interopRequireDefault(require("lodash"));
19
20
  var _bluebird = _interopRequireDefault(require("bluebird"));
20
- var _driver = require("appium/driver");
21
- var _support = require("appium/support");
21
+ var _baseDriver = require("@appium/base-driver");
22
+ var _support = require("@appium/support");
23
+ const MODULE_NAME = 'appium-remote-debugger';
22
24
  const WEB_CONTENT_BUNDLE_ID = 'com.apple.WebKit.WebContent';
23
25
  const WEB_CONTENT_PROCESS_BUNDLE_ID = 'process-com.apple.WebKit.WebContent';
24
26
  const SAFARI_VIEW_PROCESS_BUNDLE_ID = 'process-SafariViewService';
@@ -177,7 +179,7 @@ function convertResult(res) {
177
179
  throw new Error(`Result has unexpected type: (${typeof res}).`);
178
180
  }
179
181
  if (res.status && res.status !== 0) {
180
- throw (0, _driver.errorFromMJSONWPStatusCode)(res.status, res.value.message || res.value);
182
+ throw (0, _baseDriver.errorFromMJSONWPStatusCode)(res.status, res.value.message || res.value);
181
183
  }
182
184
 
183
185
  const value = _lodash.default.has(res, 'value') ? res.value : res;
@@ -189,4 +191,13 @@ function convertResult(res) {
189
191
  }
190
192
  return value;
191
193
  }
192
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXRUJfQ09OVEVOVF9CVU5ETEVfSUQiLCJXRUJfQ09OVEVOVF9QUk9DRVNTX0JVTkRMRV9JRCIsIlNBRkFSSV9WSUVXX1BST0NFU1NfQlVORExFX0lEIiwiU0FGQVJJX1ZJRVdfQlVORExFX0lEIiwiV0lMRENBUkRfQlVORExFX0lEIiwiSU5BQ1RJVkVfQVBQX0NPREUiLCJBQ0NFUFRFRF9QQUdFX1RZUEVTIiwiUkVTUE9OU0VfTE9HX0xFTkdUSCIsImFwcEluZm9Gcm9tRGljdCIsImRpY3QiLCJpZCIsIldJUkFwcGxpY2F0aW9uSWRlbnRpZmllcktleSIsImlzUHJveHkiLCJfIiwiaXNTdHJpbmciLCJXSVJJc0FwcGxpY2F0aW9uUHJveHlLZXkiLCJ0b0xvd2VyQ2FzZSIsImlzQXV0b21hdGlvbkVuYWJsZWQiLCJXSVJSZW1vdGVBdXRvbWF0aW9uRW5hYmxlZEtleSIsImhhcyIsIldJUkF1dG9tYXRpb25BdmFpbGFiaWxpdHlLZXkiLCJlbnRyeSIsIm5hbWUiLCJXSVJBcHBsaWNhdGlvbk5hbWVLZXkiLCJidW5kbGVJZCIsIldJUkFwcGxpY2F0aW9uQnVuZGxlSWRlbnRpZmllcktleSIsImhvc3RJZCIsIldJUkhvc3RBcHBsaWNhdGlvbklkZW50aWZpZXJLZXkiLCJpc0FjdGl2ZSIsIldJUklzQXBwbGljYXRpb25BY3RpdmVLZXkiLCJwYWdlQXJyYXlGcm9tRGljdCIsInBhZ2VEaWN0IiwibmV3UGFnZUFycmF5IiwidmFsdWVzIiwiaXNVbmRlZmluZWQiLCJXSVJUeXBlS2V5IiwiaW5jbHVkZXMiLCJwdXNoIiwiV0lSUGFnZUlkZW50aWZpZXJLZXkiLCJ0aXRsZSIsIldJUlRpdGxlS2V5IiwidXJsIiwiV0lSVVJMS2V5IiwiaXNLZXkiLCJXSVJDb25uZWN0aW9uSWRlbnRpZmllcktleSIsImdldERlYnVnZ2VyQXBwS2V5IiwiYXBwRGljdCIsImFwcElkIiwia2V5IiwiZGF0YSIsInRvUGFpcnMiLCJsb2ciLCJkZWJ1ZyIsInByb3h5QXBwSWQiLCJhcHBJZEZvckJ1bmRsZSIsImVuZHNXaXRoIiwiZ2V0UG9zc2libGVEZWJ1Z2dlckFwcEtleXMiLCJidW5kbGVJZHMiLCJwcm94aWVkQXBwSWRzIiwicG9zc2libGVCdW5kbGVJZHMiLCJ1bmlxIiwiam9pbiIsImNoZWNrUGFyYW1zIiwicGFyYW1zIiwiZXJyb3JzIiwiZmlsdGVyIiwidmFsdWUiLCJpc05pbCIsIm1hcCIsInBhcmFtIiwibGVuZ3RoIiwiRXJyb3IiLCJ1dGlsIiwicGx1cmFsaXplIiwic2ltcGxlU3RyaW5naWZ5IiwibXVsdGlsaW5lIiwiSlNPTiIsInN0cmluZ2lmeSIsImNsZWFuVmFsdWUiLCJjbG9uZSIsInByb3BlcnR5IiwiZGVmZXJyZWRQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInByb21pc2UiLCJCIiwicmVzIiwicmVqIiwiY29udmVydFJlc3VsdCIsInRydW5jYXRlIiwicGFyc2UiLCJlcnIiLCJpc09iamVjdCIsInN0YXR1cyIsImVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlIiwibWVzc2FnZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcblxuXG5jb25zdCBXRUJfQ09OVEVOVF9CVU5ETEVfSUQgPSAnY29tLmFwcGxlLldlYktpdC5XZWJDb250ZW50JztcbmNvbnN0IFdFQl9DT05URU5UX1BST0NFU1NfQlVORExFX0lEID0gJ3Byb2Nlc3MtY29tLmFwcGxlLldlYktpdC5XZWJDb250ZW50JztcbmNvbnN0IFNBRkFSSV9WSUVXX1BST0NFU1NfQlVORExFX0lEID0gJ3Byb2Nlc3MtU2FmYXJpVmlld1NlcnZpY2UnO1xuY29uc3QgU0FGQVJJX1ZJRVdfQlVORExFX0lEID0gJ2NvbS5hcHBsZS5TYWZhcmlWaWV3U2VydmljZSc7XG5jb25zdCBXSUxEQ0FSRF9CVU5ETEVfSUQgPSAnKic7XG5cbmNvbnN0IElOQUNUSVZFX0FQUF9DT0RFID0gMDtcblxuLy8gdmFsdWVzIGZvciB0aGUgcGFnZSBgV0lSVHlwZUtleWAgZW50cnlcbmNvbnN0IEFDQ0VQVEVEX1BBR0VfVFlQRVMgPSBbXG4gICdXSVJUeXBlV2ViJywgLy8gdXAgdG8gaU9TIDExLjNcbiAgJ1dJUlR5cGVXZWJQYWdlJywgLy8gaU9TIDExLjRcbiAgJ1dJUlR5cGVQYWdlJywgLy8gaU9TIDExLjQgd2Vidmlld1xuXTtcblxuY29uc3QgUkVTUE9OU0VfTE9HX0xFTkdUSCA9IDEwMDtcblxuLypcbiAqIFRha2VzIGEgZGljdGlvbmFyeSBmcm9tIHRoZSByZW1vdGUgZGVidWdnZXIgYW5kIG1ha2VzIGEgbW9yZSBtYW5hZ2VhYmxlXG4gKiBkaWN0aW9uYXJ5IHdob3NlIGtleXMgYXJlIHVuZGVyc3RhbmRhYmxlXG4gKi9cbmZ1bmN0aW9uIGFwcEluZm9Gcm9tRGljdCAoZGljdCkge1xuICBjb25zdCBpZCA9IGRpY3QuV0lSQXBwbGljYXRpb25JZGVudGlmaWVyS2V5O1xuICBjb25zdCBpc1Byb3h5ID0gXy5pc1N0cmluZyhkaWN0LldJUklzQXBwbGljYXRpb25Qcm94eUtleSlcbiAgICA/IGRpY3QuV0lSSXNBcHBsaWNhdGlvblByb3h5S2V5LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJ1xuICAgIDogZGljdC5XSVJJc0FwcGxpY2F0aW9uUHJveHlLZXk7XG4gIC8vIGF1dG9tYXRpb24gZW5hYmxlZCBjYW4gYmUgZWl0aGVyIGZyb20gdGhlIGtleXNcbiAgLy8gICAtIFdJUlJlbW90ZUF1dG9tYXRpb25FbmFibGVkS2V5IChib29sZWFuKVxuICAvLyAgIC0gV0lSQXV0b21hdGlvbkF2YWlsYWJpbGl0eUtleSAoc3RyaW5nIG9yIGJvb2xlYW4pXG4gIGxldCBpc0F1dG9tYXRpb25FbmFibGVkID0gISFkaWN0LldJUlJlbW90ZUF1dG9tYXRpb25FbmFibGVkS2V5O1xuICBpZiAoXy5oYXMoZGljdCwgJ1dJUkF1dG9tYXRpb25BdmFpbGFiaWxpdHlLZXknKSkge1xuICAgIGlmIChfLmlzU3RyaW5nKGRpY3QuV0lSQXV0b21hdGlvbkF2YWlsYWJpbGl0eUtleSkpIHtcbiAgICAgIGlzQXV0b21hdGlvbkVuYWJsZWQgPSBkaWN0LldJUkF1dG9tYXRpb25BdmFpbGFiaWxpdHlLZXkgPT09ICdXSVJBdXRvbWF0aW9uQXZhaWxhYmlsaXR5VW5rbm93bidcbiAgICAgICAgPyAnVW5rbm93bidcbiAgICAgICAgOiBkaWN0LldJUkF1dG9tYXRpb25BdmFpbGFiaWxpdHlLZXkgPT09ICdXSVJBdXRvbWF0aW9uQXZhaWxhYmlsaXR5QXZhaWxhYmxlJztcbiAgICB9IGVsc2Uge1xuICAgICAgaXNBdXRvbWF0aW9uRW5hYmxlZCA9ICEhZGljdC5XSVJBdXRvbWF0aW9uQXZhaWxhYmlsaXR5S2V5O1xuICAgIH1cbiAgfVxuICBjb25zdCBlbnRyeSA9IHtcbiAgICBpZCxcbiAgICBpc1Byb3h5LFxuICAgIG5hbWU6IGRpY3QuV0lSQXBwbGljYXRpb25OYW1lS2V5LFxuICAgIGJ1bmRsZUlkOiBkaWN0LldJUkFwcGxpY2F0aW9uQnVuZGxlSWRlbnRpZmllcktleSxcbiAgICBob3N0SWQ6IGRpY3QuV0lSSG9zdEFwcGxpY2F0aW9uSWRlbnRpZmllcktleSxcbiAgICBpc0FjdGl2ZTogZGljdC5XSVJJc0FwcGxpY2F0aW9uQWN0aXZlS2V5ICE9PSBJTkFDVElWRV9BUFBfQ09ERSxcbiAgICBpc0F1dG9tYXRpb25FbmFibGVkLFxuICB9O1xuXG4gIHJldHVybiBbaWQsIGVudHJ5XTtcbn1cblxuLypcbiAqIFRha2UgYSBkaWN0aW9uYXJ5IGZyb20gdGhlIHJlbW90ZSBkZWJ1Z2dlciBhbmQgbWFrZXMgYSBtb3JlIG1hbmFnZWFibGVcbiAqIGRpY3Rpb25hcnkgb2YgcGFnZXMgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBwYWdlQXJyYXlGcm9tRGljdCAocGFnZURpY3QpIHtcbiAgaWYgKHBhZ2VEaWN0LmlkKSB7XG4gICAgLy8gdGhlIHBhZ2UgaXMgYWxyZWFkeSB0cmFuc2xhdGVkLCBzbyB3cmFwIGluIGFuIGFycmF5IGFuZCBwYXNzIGJhY2tcbiAgICByZXR1cm4gW3BhZ2VEaWN0XTtcbiAgfVxuICBsZXQgbmV3UGFnZUFycmF5ID0gW107XG4gIGZvciAoY29uc3QgZGljdCBvZiBfLnZhbHVlcyhwYWdlRGljdCkpIHtcbiAgICAvLyBjb3VudCBvbmx5IFdJUlR5cGVXZWIgcGFnZXMgYW5kIGlnbm9yZSBhbGwgb3RoZXJzIChXSVJUeXBlSmF2YVNjcmlwdCBldGMpXG4gICAgaWYgKF8uaXNVbmRlZmluZWQoZGljdC5XSVJUeXBlS2V5KSB8fCBBQ0NFUFRFRF9QQUdFX1RZUEVTLmluY2x1ZGVzKGRpY3QuV0lSVHlwZUtleSkpIHtcbiAgICAgIG5ld1BhZ2VBcnJheS5wdXNoKHtcbiAgICAgICAgaWQ6IGRpY3QuV0lSUGFnZUlkZW50aWZpZXJLZXksXG4gICAgICAgIHRpdGxlOiBkaWN0LldJUlRpdGxlS2V5LFxuICAgICAgICB1cmw6IGRpY3QuV0lSVVJMS2V5LFxuICAgICAgICBpc0tleTogIV8uaXNVbmRlZmluZWQoZGljdC5XSVJDb25uZWN0aW9uSWRlbnRpZmllcktleSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld1BhZ2VBcnJheTtcbn1cblxuLypcbiAqIEdpdmVuIGEgYnVuZGxlIGlkLCBmaW5kcyB0aGUgY29ycmVjdCByZW1vdGUgZGVidWdnZXIgYXBwIHRoYXQgaXNcbiAqIGNvbm5lY3RlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RGVidWdnZXJBcHBLZXkgKGJ1bmRsZUlkLCBhcHBEaWN0KSB7XG4gIGxldCBhcHBJZDtcbiAgZm9yIChjb25zdCBba2V5LCBkYXRhXSBvZiBfLnRvUGFpcnMoYXBwRGljdCkpIHtcbiAgICBpZiAoZGF0YS5idW5kbGVJZCA9PT0gYnVuZGxlSWQpIHtcbiAgICAgIGFwcElkID0ga2V5O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8vIG5vdyB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgcGljayBhIHByb3h5IGZvciB0aGlzIGluc3RlYWRcbiAgaWYgKGFwcElkKSB7XG4gICAgbG9nLmRlYnVnKGBGb3VuZCBhcHAgaWQga2V5ICcke2FwcElkfScgZm9yIGJ1bmRsZSAnJHtidW5kbGVJZH0nYCk7XG4gICAgbGV0IHByb3h5QXBwSWQ7XG4gICAgZm9yIChjb25zdCBba2V5LCBkYXRhXSBvZiBfLnRvUGFpcnMoYXBwRGljdCkpIHtcbiAgICAgIGlmIChkYXRhLmlzUHJveHkgJiYgZGF0YS5ob3N0SWQgPT09IGFwcElkKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgc2VwYXJhdGUgYnVuZGxlSWQgJyR7ZGF0YS5idW5kbGVJZH0nIGAgK1xuICAgICAgICAgICAgICAgICAgYGFjdGluZyBhcyBwcm94eSBmb3IgJyR7YnVuZGxlSWR9Jywgd2l0aCBhcHAgaWQgJyR7a2V5fSdgKTtcbiAgICAgICAgLy8gc2V0IHRoZSBhcHAgaWQuLi4gdGhlIGxhc3Qgb25lIHdpbGwgYmUgdXNlZCwgc28ganVzdCBrZWVwIHJlLWFzc2lnbmluZ1xuICAgICAgICBwcm94eUFwcElkID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJveHlBcHBJZCkge1xuICAgICAgYXBwSWQgPSBwcm94eUFwcElkO1xuICAgICAgbG9nLmRlYnVnKGBVc2luZyBwcm94aWVkIGFwcCBpZCAnJHthcHBJZH0nYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFwcElkO1xufVxuXG5mdW5jdGlvbiBhcHBJZEZvckJ1bmRsZSAoYnVuZGxlSWQsIGFwcERpY3QpIHtcbiAgbGV0IGFwcElkO1xuICBmb3IgKGNvbnN0IFtrZXksIGRhdGFdIG9mIF8udG9QYWlycyhhcHBEaWN0KSkge1xuICAgIGlmIChkYXRhLmJ1bmRsZUlkLmVuZHNXaXRoKGJ1bmRsZUlkKSkge1xuICAgICAgYXBwSWQgPSBrZXk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBpZiBub3RoaW5nIGlzIGZvdW5kLCB0cnkgdG8gZ2V0IHRoZSBnZW5lcmljIGFwcFxuICBpZiAoIWFwcElkICYmIGJ1bmRsZUlkICE9PSBXRUJfQ09OVEVOVF9CVU5ETEVfSUQpIHtcbiAgICByZXR1cm4gYXBwSWRGb3JCdW5kbGUoV0VCX0NPTlRFTlRfQlVORExFX0lELCBhcHBEaWN0KTtcbiAgfVxuXG4gIHJldHVybiBhcHBJZDtcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVEZWJ1Z2dlckFwcEtleXMgKGJ1bmRsZUlkcywgYXBwRGljdCkge1xuICBsZXQgcHJveGllZEFwcElkcyA9IFtdO1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIHBvc3NpYmxlIGJ1bmRsZSBpZGVudGlmaWVyc1xuICBjb25zdCBwb3NzaWJsZUJ1bmRsZUlkcyA9IF8udW5pcShbXG4gICAgV0VCX0NPTlRFTlRfQlVORExFX0lELFxuICAgIFdFQl9DT05URU5UX1BST0NFU1NfQlVORExFX0lELFxuICAgIFNBRkFSSV9WSUVXX1BST0NFU1NfQlVORExFX0lELFxuICAgIFNBRkFSSV9WSUVXX0JVTkRMRV9JRCxcbiAgICBXSUxEQ0FSRF9CVU5ETEVfSUQsXG4gICAgLi4uYnVuZGxlSWRzLFxuICBdKTtcbiAgbG9nLmRlYnVnKGBDaGVja2luZyBmb3IgYnVuZGxlIGlkZW50aWZpZXJzOiAke3Bvc3NpYmxlQnVuZGxlSWRzLmpvaW4oJywgJyl9YCk7XG4gIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgcG9zc2libGVCdW5kbGVJZHMpIHtcbiAgICBjb25zdCBhcHBJZCA9IGFwcElkRm9yQnVuZGxlKGJ1bmRsZUlkLCBhcHBEaWN0KTtcblxuICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgcGljayBhIHByb3h5IGZvciB0aGlzIGluc3RlYWRcbiAgICBpZiAoYXBwSWQpIHtcbiAgICAgIHByb3hpZWRBcHBJZHMucHVzaChhcHBJZCk7XG4gICAgICBsb2cuZGVidWcoYEZvdW5kIGFwcCBpZCBrZXkgJyR7YXBwSWR9JyBmb3IgYnVuZGxlICcke2J1bmRsZUlkfSdgKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGF0YV0gb2YgXy50b1BhaXJzKGFwcERpY3QpKSB7XG4gICAgICAgIGlmIChkYXRhLmlzUHJveHkgJiYgZGF0YS5ob3N0SWQgPT09IGFwcElkKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBGb3VuZCBzZXBhcmF0ZSBidW5kbGVJZCAnJHtkYXRhLmJ1bmRsZUlkfScgYCArXG4gICAgICAgICAgICAgICAgICAgIGBhY3RpbmcgYXMgcHJveHkgZm9yICcke2J1bmRsZUlkfScsIHdpdGggYXBwIGlkICcke2tleX0nYCk7XG4gICAgICAgICAgcHJveGllZEFwcElkcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gXy51bmlxKHByb3hpZWRBcHBJZHMpO1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtcyAocGFyYW1zKSB7XG4gIC8vIGNoZWNrIGlmIGFsbCBwYXJhbWV0ZXJzIGhhdmUgYSB2YWx1ZVxuICBjb25zdCBlcnJvcnMgPSBfLnRvUGFpcnMocGFyYW1zKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gXy5pc05pbCh2YWx1ZSkpXG4gICAgLm1hcCgoW3BhcmFtXSkgPT4gcGFyYW0pO1xuICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAke3V0aWwucGx1cmFsaXplKCdwYXJhbWV0ZXInLCBlcnJvcnMubGVuZ3RoKX06ICR7ZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2ltcGxlU3RyaW5naWZ5ICh2YWx1ZSwgbXVsdGlsaW5lID0gZmFsc2UpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cblxuICAvLyB3ZSBnZXQgYmFjayBvYmplY3RzIHNvbWV0aW1lcyB3aXRoIHN0cmluZyB2ZXJzaW9ucyBvZiBmdW5jdGlvbnNcbiAgLy8gd2hpY2ggbXVkZHkgdGhlIGxvZ3NcbiAgbGV0IGNsZWFuVmFsdWUgPSBfLmNsb25lKHZhbHVlKTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBbJ2NlaWwnLCAnY2xvbmUnLCAnZmxvb3InLCAncm91bmQnLCAnc2NhbGUnLCAndG9TdHJpbmcnXSkge1xuICAgIGRlbGV0ZSBjbGVhblZhbHVlW3Byb3BlcnR5XTtcbiAgfVxuICByZXR1cm4gbXVsdGlsaW5lID8gSlNPTi5zdHJpbmdpZnkoY2xlYW5WYWx1ZSwgbnVsbCwgMikgOiBKU09OLnN0cmluZ2lmeShjbGVhblZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZGVmZXJyZWRQcm9taXNlICgpIHtcbiAgLy8gaHR0cDovL2JsdWViaXJkanMuY29tL2RvY3MvYXBpL2RlZmVycmVkLW1pZ3JhdGlvbi5odG1sXG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuICBjb25zdCBwcm9taXNlID0gbmV3IEIoKHJlcywgcmVqKSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wYXJhbS1uYW1lc1xuICAgIHJlc29sdmUgPSByZXM7XG4gICAgcmVqZWN0ID0gcmVqO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBwcm9taXNlLFxuICAgIHJlc29sdmUsXG4gICAgcmVqZWN0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRSZXN1bHQgKHJlcykge1xuICBpZiAoXy5pc1VuZGVmaW5lZChyZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGdldCBPSyByZXN1bHQgZnJvbSByZW1vdGUgZGVidWdnZXIuIFJlc3VsdCB3YXM6ICR7Xy50cnVuY2F0ZShzaW1wbGVTdHJpbmdpZnkocmVzKSwge2xlbmd0aDogUkVTUE9OU0VfTE9HX0xFTkdUSH0pfWApO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcocmVzKSkge1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHJlcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyB3ZSBtaWdodCBnZXQgYSBzZXJpYWxpemVkIG9iamVjdCwgYnV0IHdlIG1pZ2h0IG5vdFxuICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUsIGl0IGlzIGp1c3QgYSB2YWx1ZVxuICAgIH1cbiAgfSBlbHNlIGlmICghXy5pc09iamVjdChyZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXN1bHQgaGFzIHVuZXhwZWN0ZWQgdHlwZTogKCR7dHlwZW9mIHJlc30pLmApO1xuICB9XG5cbiAgaWYgKHJlcy5zdGF0dXMgJiYgcmVzLnN0YXR1cyAhPT0gMCkge1xuICAgIC8vIHdlIGdvdCBzb21lIGZvcm0gb2YgZXJyb3IuXG4gICAgdGhyb3cgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUocmVzLnN0YXR1cywgcmVzLnZhbHVlLm1lc3NhZ2UgfHwgcmVzLnZhbHVlKTtcbiAgfVxuXG4gIC8vIHdpdGggZWl0aGVyIGhhdmUgYW4gb2JqZWN0IHdpdGggYSBgdmFsdWVgIHByb3BlcnR5IChldmVuIGlmIGBudWxsYCksXG4gIC8vIG9yIGEgcGxhaW4gb2JqZWN0XG4gIGNvbnN0IHZhbHVlID0gXy5oYXMocmVzLCAndmFsdWUnKSA/IHJlcy52YWx1ZSA6IHJlcztcblxuICAvLyBnZXQgcmlkIG9mIG5vaXN5IGZ1bmN0aW9ucyBvbiBvYmplY3RzXG4gIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgWydjZWlsJywgJ2Nsb25lJywgJ2Zsb29yJywgJ3JvdW5kJywgJ3NjYWxlJywgJ3RvU3RyaW5nJ10pIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHtcbiAgYXBwSW5mb0Zyb21EaWN0LCBwYWdlQXJyYXlGcm9tRGljdCwgZ2V0RGVidWdnZXJBcHBLZXksXG4gIGdldFBvc3NpYmxlRGVidWdnZXJBcHBLZXlzLCBjaGVja1BhcmFtcywgc2ltcGxlU3RyaW5naWZ5LCBkZWZlcnJlZFByb21pc2UsXG4gIGNvbnZlcnRSZXN1bHQsIFJFU1BPTlNFX0xPR19MRU5HVEgsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLHFCQUFxQixHQUFHLDZCQUE2QjtBQUMzRCxNQUFNQyw2QkFBNkIsR0FBRyxxQ0FBcUM7QUFDM0UsTUFBTUMsNkJBQTZCLEdBQUcsMkJBQTJCO0FBQ2pFLE1BQU1DLHFCQUFxQixHQUFHLDZCQUE2QjtBQUMzRCxNQUFNQyxrQkFBa0IsR0FBRyxHQUFHO0FBRTlCLE1BQU1DLGlCQUFpQixHQUFHLENBQUM7O0FBRzNCLE1BQU1DLG1CQUFtQixHQUFHLENBQzFCLFlBQVk7QUFDWixnQkFBZ0I7QUFDaEIsYUFBYSxDQUNkOztBQUVELE1BQU1DLG1CQUFtQixHQUFHLEdBQUc7O0FBQUM7QUFNaEMsU0FBU0MsZUFBZSxDQUFFQyxJQUFJLEVBQUU7RUFDOUIsTUFBTUMsRUFBRSxHQUFHRCxJQUFJLENBQUNFLDJCQUEyQjtFQUMzQyxNQUFNQyxPQUFPLEdBQUdDLGVBQUMsQ0FBQ0MsUUFBUSxDQUFDTCxJQUFJLENBQUNNLHdCQUF3QixDQUFDLEdBQ3JETixJQUFJLENBQUNNLHdCQUF3QixDQUFDQyxXQUFXLEVBQUUsS0FBSyxNQUFNLEdBQ3REUCxJQUFJLENBQUNNLHdCQUF3QjtFQUlqQyxJQUFJRSxtQkFBbUIsR0FBRyxDQUFDLENBQUNSLElBQUksQ0FBQ1MsNkJBQTZCO0VBQzlELElBQUlMLGVBQUMsQ0FBQ00sR0FBRyxDQUFDVixJQUFJLEVBQUUsOEJBQThCLENBQUMsRUFBRTtJQUMvQyxJQUFJSSxlQUFDLENBQUNDLFFBQVEsQ0FBQ0wsSUFBSSxDQUFDVyw0QkFBNEIsQ0FBQyxFQUFFO01BQ2pESCxtQkFBbUIsR0FBR1IsSUFBSSxD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
194
+
195
+ const getModuleRoot = _lodash.default.memoize(function getModuleRoot() {
196
+ const root = _support.node.getModuleRootSync(MODULE_NAME, __filename);
197
+ if (!root) {
198
+ throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);
199
+ }
200
+ return root;
201
+ });
202
+ exports.getModuleRoot = getModuleRoot;
203
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIldFQl9DT05URU5UX0JVTkRMRV9JRCIsIldFQl9DT05URU5UX1BST0NFU1NfQlVORExFX0lEIiwiU0FGQVJJX1ZJRVdfUFJPQ0VTU19CVU5ETEVfSUQiLCJTQUZBUklfVklFV19CVU5ETEVfSUQiLCJXSUxEQ0FSRF9CVU5ETEVfSUQiLCJJTkFDVElWRV9BUFBfQ09ERSIsIkFDQ0VQVEVEX1BBR0VfVFlQRVMiLCJSRVNQT05TRV9MT0dfTEVOR1RIIiwiYXBwSW5mb0Zyb21EaWN0IiwiZGljdCIsImlkIiwiV0lSQXBwbGljYXRpb25JZGVudGlmaWVyS2V5IiwiaXNQcm94eSIsIl8iLCJpc1N0cmluZyIsIldJUklzQXBwbGljYXRpb25Qcm94eUtleSIsInRvTG93ZXJDYXNlIiwiaXNBdXRvbWF0aW9uRW5hYmxlZCIsIldJUlJlbW90ZUF1dG9tYXRpb25FbmFibGVkS2V5IiwiaGFzIiwiV0lSQXV0b21hdGlvbkF2YWlsYWJpbGl0eUtleSIsImVudHJ5IiwibmFtZSIsIldJUkFwcGxpY2F0aW9uTmFtZUtleSIsImJ1bmRsZUlkIiwiV0lSQXBwbGljYXRpb25CdW5kbGVJZGVudGlmaWVyS2V5IiwiaG9zdElkIiwiV0lSSG9zdEFwcGxpY2F0aW9uSWRlbnRpZmllcktleSIsImlzQWN0aXZlIiwiV0lSSXNBcHBsaWNhdGlvbkFjdGl2ZUtleSIsInBhZ2VBcnJheUZyb21EaWN0IiwicGFnZURpY3QiLCJuZXdQYWdlQXJyYXkiLCJ2YWx1ZXMiLCJpc1VuZGVmaW5lZCIsIldJUlR5cGVLZXkiLCJpbmNsdWRlcyIsInB1c2giLCJXSVJQYWdlSWRlbnRpZmllcktleSIsInRpdGxlIiwiV0lSVGl0bGVLZXkiLCJ1cmwiLCJXSVJVUkxLZXkiLCJpc0tleSIsIldJUkNvbm5lY3Rpb25JZGVudGlmaWVyS2V5IiwiZ2V0RGVidWdnZXJBcHBLZXkiLCJhcHBEaWN0IiwiYXBwSWQiLCJrZXkiLCJkYXRhIiwidG9QYWlycyIsImxvZyIsImRlYnVnIiwicHJveHlBcHBJZCIsImFwcElkRm9yQnVuZGxlIiwiZW5kc1dpdGgiLCJnZXRQb3NzaWJsZURlYnVnZ2VyQXBwS2V5cyIsImJ1bmRsZUlkcyIsInByb3hpZWRBcHBJZHMiLCJwb3NzaWJsZUJ1bmRsZUlkcyIsInVuaXEiLCJqb2luIiwiY2hlY2tQYXJhbXMiLCJwYXJhbXMiLCJlcnJvcnMiLCJmaWx0ZXIiLCJ2YWx1ZSIsImlzTmlsIiwibWFwIiwicGFyYW0iLCJsZW5ndGgiLCJFcnJvciIsInV0aWwiLCJwbHVyYWxpemUiLCJzaW1wbGVTdHJpbmdpZnkiLCJtdWx0aWxpbmUiLCJKU09OIiwic3RyaW5naWZ5IiwiY2xlYW5WYWx1ZSIsImNsb25lIiwicHJvcGVydHkiLCJkZWZlcnJlZFByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicHJvbWlzZSIsIkIiLCJyZXMiLCJyZWoiLCJjb252ZXJ0UmVzdWx0IiwidHJ1bmNhdGUiLCJwYXJzZSIsImVyciIsImlzT2JqZWN0Iiwic3RhdHVzIiwiZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUiLCJtZXNzYWdlIiwiZ2V0TW9kdWxlUm9vdCIsIm1lbW9pemUiLCJyb290Iiwibm9kZSIsImdldE1vZHVsZVJvb3RTeW5jIiwiX19maWxlbmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgdXRpbCwgbm9kZSB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IE1PRFVMRV9OQU1FID0gJ2FwcGl1bS1yZW1vdGUtZGVidWdnZXInO1xuXG5jb25zdCBXRUJfQ09OVEVOVF9CVU5ETEVfSUQgPSAnY29tLmFwcGxlLldlYktpdC5XZWJDb250ZW50JztcbmNvbnN0IFdFQl9DT05URU5UX1BST0NFU1NfQlVORExFX0lEID0gJ3Byb2Nlc3MtY29tLmFwcGxlLldlYktpdC5XZWJDb250ZW50JztcbmNvbnN0IFNBRkFSSV9WSUVXX1BST0NFU1NfQlVORExFX0lEID0gJ3Byb2Nlc3MtU2FmYXJpVmlld1NlcnZpY2UnO1xuY29uc3QgU0FGQVJJX1ZJRVdfQlVORExFX0lEID0gJ2NvbS5hcHBsZS5TYWZhcmlWaWV3U2VydmljZSc7XG5jb25zdCBXSUxEQ0FSRF9CVU5ETEVfSUQgPSAnKic7XG5cbmNvbnN0IElOQUNUSVZFX0FQUF9DT0RFID0gMDtcblxuLy8gdmFsdWVzIGZvciB0aGUgcGFnZSBgV0lSVHlwZUtleWAgZW50cnlcbmNvbnN0IEFDQ0VQVEVEX1BBR0VfVFlQRVMgPSBbXG4gICdXSVJUeXBlV2ViJywgLy8gdXAgdG8gaU9TIDExLjNcbiAgJ1dJUlR5cGVXZWJQYWdlJywgLy8gaU9TIDExLjRcbiAgJ1dJUlR5cGVQYWdlJywgLy8gaU9TIDExLjQgd2Vidmlld1xuXTtcblxuY29uc3QgUkVTUE9OU0VfTE9HX0xFTkdUSCA9IDEwMDtcblxuLypcbiAqIFRha2VzIGEgZGljdGlvbmFyeSBmcm9tIHRoZSByZW1vdGUgZGVidWdnZXIgYW5kIG1ha2VzIGEgbW9yZSBtYW5hZ2VhYmxlXG4gKiBkaWN0aW9uYXJ5IHdob3NlIGtleXMgYXJlIHVuZGVyc3RhbmRhYmxlXG4gKi9cbmZ1bmN0aW9uIGFwcEluZm9Gcm9tRGljdCAoZGljdCkge1xuICBjb25zdCBpZCA9IGRpY3QuV0lSQXBwbGljYXRpb25JZGVudGlmaWVyS2V5O1xuICBjb25zdCBpc1Byb3h5ID0gXy5pc1N0cmluZyhkaWN0LldJUklzQXBwbGljYXRpb25Qcm94eUtleSlcbiAgICA/IGRpY3QuV0lSSXNBcHBsaWNhdGlvblByb3h5S2V5LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJ1xuICAgIDogZGljdC5XSVJJc0FwcGxpY2F0aW9uUHJveHlLZXk7XG4gIC8vIGF1dG9tYXRpb24gZW5hYmxlZCBjYW4gYmUgZWl0aGVyIGZyb20gdGhlIGtleXNcbiAgLy8gICAtIFdJUlJlbW90ZUF1dG9tYXRpb25FbmFibGVkS2V5IChib29sZWFuKVxuICAvLyAgIC0gV0lSQXV0b21hdGlvbkF2YWlsYWJpbGl0eUtleSAoc3RyaW5nIG9yIGJvb2xlYW4pXG4gIGxldCBpc0F1dG9tYXRpb25FbmFibGVkID0gISFkaWN0LldJUlJlbW90ZUF1dG9tYXRpb25FbmFibGVkS2V5O1xuICBpZiAoXy5oYXMoZGljdCwgJ1dJUkF1dG9tYXRpb25BdmFpbGFiaWxpdHlLZXknKSkge1xuICAgIGlmIChfLmlzU3RyaW5nKGRpY3QuV0lSQXV0b21hdGlvbkF2YWlsYWJpbGl0eUtleSkpIHtcbiAgICAgIGlzQXV0b21hdGlvbkVuYWJsZWQgPSBkaWN0LldJUkF1dG9tYXRpb25BdmFpbGFiaWxpdHlLZXkgPT09ICdXSVJBdXRvbWF0aW9uQXZhaWxhYmlsaXR5VW5rbm93bidcbiAgICAgICAgPyAnVW5rbm93bidcbiAgICAgICAgOiBkaWN0LldJUkF1dG9tYXRpb25BdmFpbGFiaWxpdHlLZXkgPT09ICdXSVJBdXRvbWF0aW9uQXZhaWxhYmlsaXR5QXZhaWxhYmxlJztcbiAgICB9IGVsc2Uge1xuICAgICAgaXNBdXRvbWF0aW9uRW5hYmxlZCA9ICEhZGljdC5XSVJBdXRvbWF0aW9uQXZhaWxhYmlsaXR5S2V5O1xuICAgIH1cbiAgfVxuICBjb25zdCBlbnRyeSA9IHtcbiAgICBpZCxcbiAgICBpc1Byb3h5LFxuICAgIG5hbWU6IGRpY3QuV0lSQXBwbGljYXRpb25OYW1lS2V5LFxuICAgIGJ1bmRsZUlkOiBkaWN0LldJUkFwcGxpY2F0aW9uQnVuZGxlSWRlbnRpZmllcktleSxcbiAgICBob3N0SWQ6IGRpY3QuV0lSSG9zdEFwcGxpY2F0aW9uSWRlbnRpZmllcktleSxcbiAgICBpc0FjdGl2ZTogZGljdC5XSVJJc0FwcGxpY2F0aW9uQWN0aXZlS2V5ICE9PSBJTkFDVElWRV9BUFBfQ09ERSxcbiAgICBpc0F1dG9tYXRpb25FbmFibGVkLFxuICB9O1xuXG4gIHJldHVybiBbaWQsIGVudHJ5XTtcbn1cblxuLypcbiAqIFRha2UgYSBkaWN0aW9uYXJ5IGZyb20gdGhlIHJlbW90ZSBkZWJ1Z2dlciBhbmQgbWFrZXMgYSBtb3JlIG1hbmFnZWFibGVcbiAqIGRpY3Rpb25hcnkgb2YgcGFnZXMgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBwYWdlQXJyYXlGcm9tRGljdCAocGFnZURpY3QpIHtcbiAgaWYgKHBhZ2VEaWN0LmlkKSB7XG4gICAgLy8gdGhlIHBhZ2UgaXMgYWxyZWFkeSB0cmFuc2xhdGVkLCBzbyB3cmFwIGluIGFuIGFycmF5IGFuZCBwYXNzIGJhY2tcbiAgICByZXR1cm4gW3BhZ2VEaWN0XTtcbiAgfVxuICBsZXQgbmV3UGFnZUFycmF5ID0gW107XG4gIGZvciAoY29uc3QgZGljdCBvZiBfLnZhbHVlcyhwYWdlRGljdCkpIHtcbiAgICAvLyBjb3VudCBvbmx5IFdJUlR5cGVXZWIgcGFnZXMgYW5kIGlnbm9yZSBhbGwgb3RoZXJzIChXSVJUeXBlSmF2YVNjcmlwdCBldGMpXG4gICAgaWYgKF8uaXNVbmRlZmluZWQoZGljdC5XSVJUeXBlS2V5KSB8fCBBQ0NFUFRFRF9QQUdFX1RZUEVTLmluY2x1ZGVzKGRpY3QuV0lSVHlwZUtleSkpIHtcbiAgICAgIG5ld1BhZ2VBcnJheS5wdXNoKHtcbiAgICAgICAgaWQ6IGRpY3QuV0lSUGFnZUlkZW50aWZpZXJLZXksXG4gICAgICAgIHRpdGxlOiBkaWN0LldJUlRpdGxlS2V5LFxuICAgICAgICB1cmw6IGRpY3QuV0lSVVJMS2V5LFxuICAgICAgICBpc0tleTogIV8uaXNVbmRlZmluZWQoZGljdC5XSVJDb25uZWN0aW9uSWRlbnRpZmllcktleSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld1BhZ2VBcnJheTtcbn1cblxuLypcbiAqIEdpdmVuIGEgYnVuZGxlIGlkLCBmaW5kcyB0aGUgY29ycmVjdCByZW1vdGUgZGVidWdnZXIgYXBwIHRoYXQgaXNcbiAqIGNvbm5lY3RlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RGVidWdnZXJBcHBLZXkgKGJ1bmRsZUlkLCBhcHBEaWN0KSB7XG4gIGxldCBhcHBJZDtcbiAgZm9yIChjb25zdCBba2V5LCBkYXRhXSBvZiBfLnRvUGFpcnMoYXBwRGljdCkpIHtcbiAgICBpZiAoZGF0YS5idW5kbGVJZCA9PT0gYnVuZGxlSWQpIHtcbiAgICAgIGFwcElkID0ga2V5O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8vIG5vdyB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgcGljayBhIHByb3h5IGZvciB0aGlzIGluc3RlYWRcbiAgaWYgKGFwcElkKSB7XG4gICAgbG9nLmRlYnVnKGBGb3VuZCBhcHAgaWQga2V5ICcke2FwcElkfScgZm9yIGJ1bmRsZSAnJHtidW5kbGVJZH0nYCk7XG4gICAgbGV0IHByb3h5QXBwSWQ7XG4gICAgZm9yIChjb25zdCBba2V5LCBkYXRhXSBvZiBfLnRvUGFpcnMoYXBwRGljdCkpIHtcbiAgICAgIGlmIChkYXRhLmlzUHJveHkgJiYgZGF0YS5ob3N0SWQgPT09IGFwcElkKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgRm91bmQgc2VwYXJhdGUgYnVuZGxlSWQgJyR7ZGF0YS5idW5kbGVJZH0nIGAgK1xuICAgICAgICAgICAgICAgICAgYGFjdGluZyBhcyBwcm94eSBmb3IgJyR7YnVuZGxlSWR9Jywgd2l0aCBhcHAgaWQgJyR7a2V5fSdgKTtcbiAgICAgICAgLy8gc2V0IHRoZSBhcHAgaWQuLi4gdGhlIGxhc3Qgb25lIHdpbGwgYmUgdXNlZCwgc28ganVzdCBrZWVwIHJlLWFzc2lnbmluZ1xuICAgICAgICBwcm94eUFwcElkID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJveHlBcHBJZCkge1xuICAgICAgYXBwSWQgPSBwcm94eUFwcElkO1xuICAgICAgbG9nLmRlYnVnKGBVc2luZyBwcm94aWVkIGFwcCBpZCAnJHthcHBJZH0nYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFwcElkO1xufVxuXG5mdW5jdGlvbiBhcHBJZEZvckJ1bmRsZSAoYnVuZGxlSWQsIGFwcERpY3QpIHtcbiAgbGV0IGFwcElkO1xuICBmb3IgKGNvbnN0IFtrZXksIGRhdGFdIG9mIF8udG9QYWlycyhhcHBEaWN0KSkge1xuICAgIGlmIChkYXRhLmJ1bmRsZUlkLmVuZHNXaXRoKGJ1bmRsZUlkKSkge1xuICAgICAgYXBwSWQgPSBrZXk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBpZiBub3RoaW5nIGlzIGZvdW5kLCB0cnkgdG8gZ2V0IHRoZSBnZW5lcmljIGFwcFxuICBpZiAoIWFwcElkICYmIGJ1bmRsZUlkICE9PSBXRUJfQ09OVEVOVF9CVU5ETEVfSUQpIHtcbiAgICByZXR1cm4gYXBwSWRGb3JCdW5kbGUoV0VCX0NPTlRFTlRfQlVORExFX0lELCBhcHBEaWN0KTtcbiAgfVxuXG4gIHJldHVybiBhcHBJZDtcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVEZWJ1Z2dlckFwcEtleXMgKGJ1bmRsZUlkcywgYXBwRGljdCkge1xuICBsZXQgcHJveGllZEFwcElkcyA9IFtdO1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIHBvc3NpYmxlIGJ1bmRsZSBpZGVudGlmaWVyc1xuICBjb25zdCBwb3NzaWJsZUJ1bmRsZUlkcyA9IF8udW5pcShbXG4gICAgV0VCX0NPTlRFTlRfQlVORExFX0lELFxuICAgIFdFQl9DT05URU5UX1BST0NFU1NfQlVORExFX0lELFxuICAgIFNBRkFSSV9WSUVXX1BST0NFU1NfQlVORExFX0lELFxuICAgIFNBRkFSSV9WSUVXX0JVTkRMRV9JRCxcbiAgICBXSUxEQ0FSRF9CVU5ETEVfSUQsXG4gICAgLi4uYnVuZGxlSWRzLFxuICBdKTtcbiAgbG9nLmRlYnVnKGBDaGVja2luZyBmb3IgYnVuZGxlIGlkZW50aWZpZXJzOiAke3Bvc3NpYmxlQnVuZGxlSWRzLmpvaW4oJywgJyl9YCk7XG4gIGZvciAoY29uc3QgYnVuZGxlSWQgb2YgcG9zc2libGVCdW5kbGVJZHMpIHtcbiAgICBjb25zdCBhcHBJZCA9IGFwcElkRm9yQnVuZGxlKGJ1bmRsZUlkLCBhcHBEaWN0KTtcblxuICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgcGljayBhIHByb3h5IGZvciB0aGlzIGluc3RlYWRcbiAgICBpZiAoYXBwSWQpIHtcbiAgICAgIHByb3hpZWRBcHBJZHMucHVzaChhcHBJZCk7XG4gICAgICBsb2cuZGVidWcoYEZvdW5kIGFwcCBpZCBrZXkgJyR7YXBwSWR9JyBmb3IgYnVuZGxlICcke2J1bmRsZUlkfSdgKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGF0YV0gb2YgXy50b1BhaXJzKGFwcERpY3QpKSB7XG4gICAgICAgIGlmIChkYXRhLmlzUHJveHkgJiYgZGF0YS5ob3N0SWQgPT09IGFwcElkKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBGb3VuZCBzZXBhcmF0ZSBidW5kbGVJZCAnJHtkYXRhLmJ1bmRsZUlkfScgYCArXG4gICAgICAgICAgICAgICAgICAgIGBhY3RpbmcgYXMgcHJveHkgZm9yICcke2J1bmRsZUlkfScsIHdpdGggYXBwIGlkICcke2tleX0nYCk7XG4gICAgICAgICAgcHJveGllZEFwcElkcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gXy51bmlxKHByb3hpZWRBcHBJZHMpO1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtcyAocGFyYW1zKSB7XG4gIC8vIGNoZWNrIGlmIGFsbCBwYXJhbWV0ZXJzIGhhdmUgYSB2YWx1ZVxuICBjb25zdCBlcnJvcnMgPSBfLnRvUGFpcnMocGFyYW1zKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gXy5pc05pbCh2YWx1ZSkpXG4gICAgLm1hcCgoW3BhcmFtXSkgPT4gcGFyYW0pO1xuICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAke3V0aWwucGx1cmFsaXplKCdwYXJhbWV0ZXInLCBlcnJvcnMubGVuZ3RoKX06ICR7ZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2ltcGxlU3RyaW5naWZ5ICh2YWx1ZSwgbXVsdGlsaW5lID0gZmFsc2UpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cblxuICAvLyB3ZSBnZXQgYmFjayBvYmplY3RzIHNvbWV0aW1lcyB3aXRoIHN0cmluZyB2ZXJzaW9ucyBvZiBmdW5jdGlvbnNcbiAgLy8gd2hpY2ggbXVkZHkgdGhlIGxvZ3NcbiAgbGV0IGNsZWFuVmFsdWUgPSBfLmNsb25lKHZhbHVlKTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBbJ2NlaWwnLCAnY2xvbmUnLCAnZmxvb3InLCAncm91bmQnLCAnc2NhbGUnLCAndG9TdHJpbmcnXSkge1xuICAgIGRlbGV0ZSBjbGVhblZhbHVlW3Byb3BlcnR5XTtcbiAgfVxuICByZXR1cm4gbXVsdGlsaW5lID8gSlNPTi5zdHJpbmdpZnkoY2xlYW5WYWx1ZSwgbnVsbCwgMikgOiBKU09OLnN0cmluZ2lmeShjbGVhblZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZGVmZXJyZWRQcm9taXNlICgpIHtcbiAgLy8gaHR0cDovL2JsdWViaXJkanMuY29tL2RvY3MvYXBpL2RlZmVycmVkLW1pZ3JhdGlvbi5odG1sXG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuICBjb25zdCBwcm9taXNlID0gbmV3IEIoKHJlcywgcmVqKSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wYXJhbS1uYW1lc1xuICAgIHJlc29sdmUgPSByZXM7XG4gICAgcmVqZWN0ID0gcmVqO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBwcm9taXNlLFxuICAgIHJlc29sdmUsXG4gICAgcmVqZWN0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRSZXN1bHQgKHJlcykge1xuICBpZiAoXy5pc1VuZGVmaW5lZChyZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGdldCBPSyByZXN1bHQgZnJvbSByZW1vdGUgZGVidWdnZXIuIFJlc3VsdCB3YXM6ICR7Xy50cnVuY2F0ZShzaW1wbGVTdHJpbmdpZnkocmVzKSwge2xlbmd0aDogUkVTUE9OU0VfTE9HX0xFTkdUSH0pfWApO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcocmVzKSkge1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHJlcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyB3ZSBtaWdodCBnZXQgYSBzZXJpYWxpemVkIG9iamVjdCwgYnV0IHdlIG1pZ2h0IG5vdFxuICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUsIGl0IGlzIGp1c3QgYSB2YWx1ZVxuICAgIH1cbiAgfSBlbHNlIGlmICghXy5pc09iamVjdChyZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXN1bHQgaGFzIHVuZXhwZWN0ZWQgdHlwZTogKCR7dHlwZW9mIHJlc30pLmApO1xuICB9XG5cbiAgaWYgKHJlcy5zdGF0dXMgJiYgcmVzLnN0YXR1cyAhPT0gMCkge1xuICAgIC8vIHdlIGdvdCBzb21lIGZvcm0gb2YgZXJyb3IuXG4gICAgdGhyb3cgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUocmVzLnN0YXR1cywgcmVzLnZhbHVlLm1lc3NhZ2UgfHwgcmVzLnZhbHVlKTtcbiAgfVxuXG4gIC8vIHdpdGggZWl0aGVyIGhhdmUgYW4gb2JqZWN0IHdpdGggYSBgdmFsdWVgIHByb3BlcnR5IChldmVuIGlmIGBudWxsYCksXG4gIC8vIG9yIGEgcGxhaW4gb2JqZWN0XG4gIGNvbnN0IHZhbHVlID0gXy5oYXMocmVzLCAndmFsdWUnKSA/IHJlcy52YWx1ZSA6IHJlcztcblxuICAvLyBnZXQgcmlkIG9mIG5vaXN5IGZ1bmN0aW9ucyBvbiBvYmplY3RzXG4gIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgWydjZWlsJywgJ2Nsb25lJywgJ2Zsb29yJywgJ3JvdW5kJywgJ3NjYWxlJywgJ3RvU3RyaW5nJ10pIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byBtb2R1bGUgcm9vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IG1vZHVsZSByb290IGZvbGRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNb2R1bGVSb290ID0gXy5tZW1vaXplKGZ1bmN0aW9uIGdldE1vZHVsZVJvb3QgKCkge1xuICBjb25zdCByb290ID0gbm9kZS5nZXRNb2R1bGVSb290U3luYyhNT0RVTEVfTkFNRSwgX19maWxlbmFtZSk7XG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSAke01PRFVMRV9OQU1FfSBOb2RlLmpzIG1vZHVsZWApO1xuICB9XG4gIHJldHVybiByb290O1xufSk7XG5cbmV4cG9ydCB7XG4gIGFwcEluZm9Gcm9tRGljdCwgcGFnZUFycmF5RnJvbURpY3QsIGdldERlYnVnZ2VyQXBwS2V5LFxuICBnZXRQb3NzaWJsZURlYnVnZ2VyQXBwS2V5cywgY2hlY2tQYXJhbXMsIHNpbXBsZVN0cmluZ2lmeSwgZGVmZXJyZWRQcm9taXNlLFxuICBjb252ZXJ0UmVzdWx0LCBSRVNQT05TRV9MT0dfTEVOR1RILCBnZXRNb2R1bGVSb290LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsV0FBVyxHQUFHLHdCQUF3QjtBQUU1QyxNQUFNQyxxQkFBcUIsR0FBRyw2QkFBNkI7QUFDM0QsTUFBTUMsNkJBQTZC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
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["WEB_CONTENT_BUNDLE_ID","WEB_CONTENT_PROCESS_BUNDLE_ID","SAFARI_VIEW_PROCESS_BUNDLE_ID","SAFARI_VIEW_BUNDLE_ID","WILDCARD_BUNDLE_ID","INACTIVE_APP_CODE","ACCEPTED_PAGE_TYPES","RESPONSE_LOG_LENGTH","appInfoFromDict","dict","id","WIRApplicationIdentifierKey","isProxy","_","isString","WIRIsApplicationProxyKey","toLowerCase","isAutomationEnabled","WIRRemoteAutomationEnabledKey","has","WIRAutomationAvailabilityKey","entry","name","WIRApplicationNameKey","bundleId","WIRApplicationBundleIdentifierKey","hostId","WIRHostApplicationIdentifierKey","isActive","WIRIsApplicationActiveKey","pageArrayFromDict","pageDict","newPageArray","values","isUndefined","WIRTypeKey","includes","push","WIRPageIdentifierKey","title","WIRTitleKey","url","WIRURLKey","isKey","WIRConnectionIdentifierKey","getDebuggerAppKey","appDict","appId","key","data","toPairs","log","debug","proxyAppId","appIdForBundle","endsWith","getPossibleDebuggerAppKeys","bundleIds","proxiedAppIds","possibleBundleIds","uniq","join","checkParams","params","errors","filter","value","isNil","map","param","length","Error","util","pluralize","simpleStringify","multiline","JSON","stringify","cleanValue","clone","property","deferredPromise","resolve","reject","promise","B","res","rej","convertResult","truncate","parse","err","isObject","status","errorFromMJSONWPStatusCode","message"],"sources":["../../lib/utils.js"],"sourcesContent":["import log from './logger';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport { errorFromMJSONWPStatusCode } from 'appium/driver';\nimport { util } from 'appium/support';\n\n\nconst WEB_CONTENT_BUNDLE_ID = 'com.apple.WebKit.WebContent';\nconst WEB_CONTENT_PROCESS_BUNDLE_ID = 'process-com.apple.WebKit.WebContent';\nconst SAFARI_VIEW_PROCESS_BUNDLE_ID = 'process-SafariViewService';\nconst SAFARI_VIEW_BUNDLE_ID = 'com.apple.SafariViewService';\nconst WILDCARD_BUNDLE_ID = '*';\n\nconst INACTIVE_APP_CODE = 0;\n\n// values for the page `WIRTypeKey` entry\nconst ACCEPTED_PAGE_TYPES = [\n 'WIRTypeWeb', // up to iOS 11.3\n 'WIRTypeWebPage', // iOS 11.4\n 'WIRTypePage', // iOS 11.4 webview\n];\n\nconst RESPONSE_LOG_LENGTH = 100;\n\n/*\n * Takes a dictionary from the remote debugger and makes a more manageable\n * dictionary whose keys are understandable\n */\nfunction appInfoFromDict (dict) {\n const id = dict.WIRApplicationIdentifierKey;\n const isProxy = _.isString(dict.WIRIsApplicationProxyKey)\n ? dict.WIRIsApplicationProxyKey.toLowerCase() === 'true'\n : dict.WIRIsApplicationProxyKey;\n // automation enabled can be either from the keys\n // - WIRRemoteAutomationEnabledKey (boolean)\n // - WIRAutomationAvailabilityKey (string or boolean)\n let isAutomationEnabled = !!dict.WIRRemoteAutomationEnabledKey;\n if (_.has(dict, 'WIRAutomationAvailabilityKey')) {\n if (_.isString(dict.WIRAutomationAvailabilityKey)) {\n isAutomationEnabled = dict.WIRAutomationAvailabilityKey === 'WIRAutomationAvailabilityUnknown'\n ? 'Unknown'\n : dict.WIRAutomationAvailabilityKey === 'WIRAutomationAvailabilityAvailable';\n } else {\n isAutomationEnabled = !!dict.WIRAutomationAvailabilityKey;\n }\n }\n const entry = {\n id,\n isProxy,\n name: dict.WIRApplicationNameKey,\n bundleId: dict.WIRApplicationBundleIdentifierKey,\n hostId: dict.WIRHostApplicationIdentifierKey,\n isActive: dict.WIRIsApplicationActiveKey !== INACTIVE_APP_CODE,\n isAutomationEnabled,\n };\n\n return [id, entry];\n}\n\n/*\n * Take a dictionary from the remote debugger and makes a more manageable\n * dictionary of pages available.\n */\nfunction pageArrayFromDict (pageDict) {\n if (pageDict.id) {\n // the page is already translated, so wrap in an array and pass back\n return [pageDict];\n }\n let newPageArray = [];\n for (const dict of _.values(pageDict)) {\n // count only WIRTypeWeb pages and ignore all others (WIRTypeJavaScript etc)\n if (_.isUndefined(dict.WIRTypeKey) || ACCEPTED_PAGE_TYPES.includes(dict.WIRTypeKey)) {\n newPageArray.push({\n id: dict.WIRPageIdentifierKey,\n title: dict.WIRTitleKey,\n url: dict.WIRURLKey,\n isKey: !_.isUndefined(dict.WIRConnectionIdentifierKey),\n });\n }\n }\n return newPageArray;\n}\n\n/*\n * Given a bundle id, finds the correct remote debugger app that is\n * connected.\n */\nfunction getDebuggerAppKey (bundleId, appDict) {\n let appId;\n for (const [key, data] of _.toPairs(appDict)) {\n if (data.bundleId === bundleId) {\n appId = key;\n break;\n }\n }\n // now we need to determine if we should pick a proxy for this instead\n if (appId) {\n log.debug(`Found app id key '${appId}' for bundle '${bundleId}'`);\n let proxyAppId;\n for (const [key, data] of _.toPairs(appDict)) {\n if (data.isProxy && data.hostId === appId) {\n log.debug(`Found separate bundleId '${data.bundleId}' ` +\n `acting as proxy for '${bundleId}', with app id '${key}'`);\n // set the app id... the last one will be used, so just keep re-assigning\n proxyAppId = key;\n }\n }\n if (proxyAppId) {\n appId = proxyAppId;\n log.debug(`Using proxied app id '${appId}'`);\n }\n }\n\n return appId;\n}\n\nfunction appIdForBundle (bundleId, appDict) {\n let appId;\n for (const [key, data] of _.toPairs(appDict)) {\n if (data.bundleId.endsWith(bundleId)) {\n appId = key;\n break;\n }\n }\n\n // if nothing is found, try to get the generic app\n if (!appId && bundleId !== WEB_CONTENT_BUNDLE_ID) {\n return appIdForBundle(WEB_CONTENT_BUNDLE_ID, appDict);\n }\n\n return appId;\n}\n\nfunction getPossibleDebuggerAppKeys (bundleIds, appDict) {\n let proxiedAppIds = [];\n\n // go through the possible bundle identifiers\n const possibleBundleIds = _.uniq([\n WEB_CONTENT_BUNDLE_ID,\n WEB_CONTENT_PROCESS_BUNDLE_ID,\n SAFARI_VIEW_PROCESS_BUNDLE_ID,\n SAFARI_VIEW_BUNDLE_ID,\n WILDCARD_BUNDLE_ID,\n ...bundleIds,\n ]);\n log.debug(`Checking for bundle identifiers: ${possibleBundleIds.join(', ')}`);\n for (const bundleId of possibleBundleIds) {\n const appId = appIdForBundle(bundleId, appDict);\n\n // now we need to determine if we should pick a proxy for this instead\n if (appId) {\n proxiedAppIds.push(appId);\n log.debug(`Found app id key '${appId}' for bundle '${bundleId}'`);\n for (const [key, data] of _.toPairs(appDict)) {\n if (data.isProxy && data.hostId === appId) {\n log.debug(`Found separate bundleId '${data.bundleId}' ` +\n `acting as proxy for '${bundleId}', with app id '${key}'`);\n proxiedAppIds.push(key);\n }\n }\n }\n }\n\n return _.uniq(proxiedAppIds);\n}\n\nfunction checkParams (params) {\n // check if all parameters have a value\n const errors = _.toPairs(params)\n .filter(([, value]) => _.isNil(value))\n .map(([param]) => param);\n if (errors.length) {\n throw new Error(`Missing ${util.pluralize('parameter', errors.length)}: ${errors.join(', ')}`);\n }\n}\n\nfunction simpleStringify (value, multiline = false) {\n if (!value) {\n return JSON.stringify(value);\n }\n\n // we get back objects sometimes with string versions of functions\n // which muddy the logs\n let cleanValue = _.clone(value);\n for (const property of ['ceil', 'clone', 'floor', 'round', 'scale', 'toString']) {\n delete cleanValue[property];\n }\n return multiline ? JSON.stringify(cleanValue, null, 2) : JSON.stringify(cleanValue);\n}\n\nfunction deferredPromise () {\n // http://bluebirdjs.com/docs/api/deferred-migration.html\n let resolve;\n let reject;\n const promise = new B((res, rej) => { // eslint-disable-line promise/param-names\n resolve = res;\n reject = rej;\n });\n return {\n promise,\n resolve,\n reject\n };\n}\n\nfunction convertResult (res) {\n if (_.isUndefined(res)) {\n throw new Error(`Did not get OK result from remote debugger. Result was: ${_.truncate(simpleStringify(res), {length: RESPONSE_LOG_LENGTH})}`);\n } else if (_.isString(res)) {\n try {\n res = JSON.parse(res);\n } catch (err) {\n // we might get a serialized object, but we might not\n // if we get here, it is just a value\n }\n } else if (!_.isObject(res)) {\n throw new Error(`Result has unexpected type: (${typeof res}).`);\n }\n\n if (res.status && res.status !== 0) {\n // we got some form of error.\n throw errorFromMJSONWPStatusCode(res.status, res.value.message || res.value);\n }\n\n // with either have an object with a `value` property (even if `null`),\n // or a plain object\n const value = _.has(res, 'value') ? res.value : res;\n\n // get rid of noisy functions on objects\n if (_.isObject(value)) {\n for (const property of ['ceil', 'clone', 'floor', 'round', 'scale', 'toString']) {\n delete value[property];\n }\n }\n return value;\n}\n\nexport {\n appInfoFromDict, pageArrayFromDict, getDebuggerAppKey,\n getPossibleDebuggerAppKeys, checkParams, simpleStringify, deferredPromise,\n convertResult, RESPONSE_LOG_LENGTH,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["MODULE_NAME","WEB_CONTENT_BUNDLE_ID","WEB_CONTENT_PROCESS_BUNDLE_ID","SAFARI_VIEW_PROCESS_BUNDLE_ID","SAFARI_VIEW_BUNDLE_ID","WILDCARD_BUNDLE_ID","INACTIVE_APP_CODE","ACCEPTED_PAGE_TYPES","RESPONSE_LOG_LENGTH","appInfoFromDict","dict","id","WIRApplicationIdentifierKey","isProxy","_","isString","WIRIsApplicationProxyKey","toLowerCase","isAutomationEnabled","WIRRemoteAutomationEnabledKey","has","WIRAutomationAvailabilityKey","entry","name","WIRApplicationNameKey","bundleId","WIRApplicationBundleIdentifierKey","hostId","WIRHostApplicationIdentifierKey","isActive","WIRIsApplicationActiveKey","pageArrayFromDict","pageDict","newPageArray","values","isUndefined","WIRTypeKey","includes","push","WIRPageIdentifierKey","title","WIRTitleKey","url","WIRURLKey","isKey","WIRConnectionIdentifierKey","getDebuggerAppKey","appDict","appId","key","data","toPairs","log","debug","proxyAppId","appIdForBundle","endsWith","getPossibleDebuggerAppKeys","bundleIds","proxiedAppIds","possibleBundleIds","uniq","join","checkParams","params","errors","filter","value","isNil","map","param","length","Error","util","pluralize","simpleStringify","multiline","JSON","stringify","cleanValue","clone","property","deferredPromise","resolve","reject","promise","B","res","rej","convertResult","truncate","parse","err","isObject","status","errorFromMJSONWPStatusCode","message","getModuleRoot","memoize","root","node","getModuleRootSync","__filename"],"sources":["../../lib/utils.js"],"sourcesContent":["import log from './logger';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport { errorFromMJSONWPStatusCode } from '@appium/base-driver';\nimport { util, node } from '@appium/support';\n\nconst MODULE_NAME = 'appium-remote-debugger';\n\nconst WEB_CONTENT_BUNDLE_ID = 'com.apple.WebKit.WebContent';\nconst WEB_CONTENT_PROCESS_BUNDLE_ID = 'process-com.apple.WebKit.WebContent';\nconst SAFARI_VIEW_PROCESS_BUNDLE_ID = 'process-SafariViewService';\nconst SAFARI_VIEW_BUNDLE_ID = 'com.apple.SafariViewService';\nconst WILDCARD_BUNDLE_ID = '*';\n\nconst INACTIVE_APP_CODE = 0;\n\n// values for the page `WIRTypeKey` entry\nconst ACCEPTED_PAGE_TYPES = [\n 'WIRTypeWeb', // up to iOS 11.3\n 'WIRTypeWebPage', // iOS 11.4\n 'WIRTypePage', // iOS 11.4 webview\n];\n\nconst RESPONSE_LOG_LENGTH = 100;\n\n/*\n * Takes a dictionary from the remote debugger and makes a more manageable\n * dictionary whose keys are understandable\n */\nfunction appInfoFromDict (dict) {\n const id = dict.WIRApplicationIdentifierKey;\n const isProxy = _.isString(dict.WIRIsApplicationProxyKey)\n ? dict.WIRIsApplicationProxyKey.toLowerCase() === 'true'\n : dict.WIRIsApplicationProxyKey;\n // automation enabled can be either from the keys\n // - WIRRemoteAutomationEnabledKey (boolean)\n // - WIRAutomationAvailabilityKey (string or boolean)\n let isAutomationEnabled = !!dict.WIRRemoteAutomationEnabledKey;\n if (_.has(dict, 'WIRAutomationAvailabilityKey')) {\n if (_.isString(dict.WIRAutomationAvailabilityKey)) {\n isAutomationEnabled = dict.WIRAutomationAvailabilityKey === 'WIRAutomationAvailabilityUnknown'\n ? 'Unknown'\n : dict.WIRAutomationAvailabilityKey === 'WIRAutomationAvailabilityAvailable';\n } else {\n isAutomationEnabled = !!dict.WIRAutomationAvailabilityKey;\n }\n }\n const entry = {\n id,\n isProxy,\n name: dict.WIRApplicationNameKey,\n bundleId: dict.WIRApplicationBundleIdentifierKey,\n hostId: dict.WIRHostApplicationIdentifierKey,\n isActive: dict.WIRIsApplicationActiveKey !== INACTIVE_APP_CODE,\n isAutomationEnabled,\n };\n\n return [id, entry];\n}\n\n/*\n * Take a dictionary from the remote debugger and makes a more manageable\n * dictionary of pages available.\n */\nfunction pageArrayFromDict (pageDict) {\n if (pageDict.id) {\n // the page is already translated, so wrap in an array and pass back\n return [pageDict];\n }\n let newPageArray = [];\n for (const dict of _.values(pageDict)) {\n // count only WIRTypeWeb pages and ignore all others (WIRTypeJavaScript etc)\n if (_.isUndefined(dict.WIRTypeKey) || ACCEPTED_PAGE_TYPES.includes(dict.WIRTypeKey)) {\n newPageArray.push({\n id: dict.WIRPageIdentifierKey,\n title: dict.WIRTitleKey,\n url: dict.WIRURLKey,\n isKey: !_.isUndefined(dict.WIRConnectionIdentifierKey),\n });\n }\n }\n return newPageArray;\n}\n\n/*\n * Given a bundle id, finds the correct remote debugger app that is\n * connected.\n */\nfunction getDebuggerAppKey (bundleId, appDict) {\n let appId;\n for (const [key, data] of _.toPairs(appDict)) {\n if (data.bundleId === bundleId) {\n appId = key;\n break;\n }\n }\n // now we need to determine if we should pick a proxy for this instead\n if (appId) {\n log.debug(`Found app id key '${appId}' for bundle '${bundleId}'`);\n let proxyAppId;\n for (const [key, data] of _.toPairs(appDict)) {\n if (data.isProxy && data.hostId === appId) {\n log.debug(`Found separate bundleId '${data.bundleId}' ` +\n `acting as proxy for '${bundleId}', with app id '${key}'`);\n // set the app id... the last one will be used, so just keep re-assigning\n proxyAppId = key;\n }\n }\n if (proxyAppId) {\n appId = proxyAppId;\n log.debug(`Using proxied app id '${appId}'`);\n }\n }\n\n return appId;\n}\n\nfunction appIdForBundle (bundleId, appDict) {\n let appId;\n for (const [key, data] of _.toPairs(appDict)) {\n if (data.bundleId.endsWith(bundleId)) {\n appId = key;\n break;\n }\n }\n\n // if nothing is found, try to get the generic app\n if (!appId && bundleId !== WEB_CONTENT_BUNDLE_ID) {\n return appIdForBundle(WEB_CONTENT_BUNDLE_ID, appDict);\n }\n\n return appId;\n}\n\nfunction getPossibleDebuggerAppKeys (bundleIds, appDict) {\n let proxiedAppIds = [];\n\n // go through the possible bundle identifiers\n const possibleBundleIds = _.uniq([\n WEB_CONTENT_BUNDLE_ID,\n WEB_CONTENT_PROCESS_BUNDLE_ID,\n SAFARI_VIEW_PROCESS_BUNDLE_ID,\n SAFARI_VIEW_BUNDLE_ID,\n WILDCARD_BUNDLE_ID,\n ...bundleIds,\n ]);\n log.debug(`Checking for bundle identifiers: ${possibleBundleIds.join(', ')}`);\n for (const bundleId of possibleBundleIds) {\n const appId = appIdForBundle(bundleId, appDict);\n\n // now we need to determine if we should pick a proxy for this instead\n if (appId) {\n proxiedAppIds.push(appId);\n log.debug(`Found app id key '${appId}' for bundle '${bundleId}'`);\n for (const [key, data] of _.toPairs(appDict)) {\n if (data.isProxy && data.hostId === appId) {\n log.debug(`Found separate bundleId '${data.bundleId}' ` +\n `acting as proxy for '${bundleId}', with app id '${key}'`);\n proxiedAppIds.push(key);\n }\n }\n }\n }\n\n return _.uniq(proxiedAppIds);\n}\n\nfunction checkParams (params) {\n // check if all parameters have a value\n const errors = _.toPairs(params)\n .filter(([, value]) => _.isNil(value))\n .map(([param]) => param);\n if (errors.length) {\n throw new Error(`Missing ${util.pluralize('parameter', errors.length)}: ${errors.join(', ')}`);\n }\n}\n\nfunction simpleStringify (value, multiline = false) {\n if (!value) {\n return JSON.stringify(value);\n }\n\n // we get back objects sometimes with string versions of functions\n // which muddy the logs\n let cleanValue = _.clone(value);\n for (const property of ['ceil', 'clone', 'floor', 'round', 'scale', 'toString']) {\n delete cleanValue[property];\n }\n return multiline ? JSON.stringify(cleanValue, null, 2) : JSON.stringify(cleanValue);\n}\n\nfunction deferredPromise () {\n // http://bluebirdjs.com/docs/api/deferred-migration.html\n let resolve;\n let reject;\n const promise = new B((res, rej) => { // eslint-disable-line promise/param-names\n resolve = res;\n reject = rej;\n });\n return {\n promise,\n resolve,\n reject\n };\n}\n\nfunction convertResult (res) {\n if (_.isUndefined(res)) {\n throw new Error(`Did not get OK result from remote debugger. Result was: ${_.truncate(simpleStringify(res), {length: RESPONSE_LOG_LENGTH})}`);\n } else if (_.isString(res)) {\n try {\n res = JSON.parse(res);\n } catch (err) {\n // we might get a serialized object, but we might not\n // if we get here, it is just a value\n }\n } else if (!_.isObject(res)) {\n throw new Error(`Result has unexpected type: (${typeof res}).`);\n }\n\n if (res.status && res.status !== 0) {\n // we got some form of error.\n throw errorFromMJSONWPStatusCode(res.status, res.value.message || res.value);\n }\n\n // with either have an object with a `value` property (even if `null`),\n // or a plain object\n const value = _.has(res, 'value') ? res.value : res;\n\n // get rid of noisy functions on objects\n if (_.isObject(value)) {\n for (const property of ['ceil', 'clone', 'floor', 'round', 'scale', 'toString']) {\n delete value[property];\n }\n }\n return value;\n}\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n const root = node.getModuleRootSync(MODULE_NAME, __filename);\n if (!root) {\n throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);\n }\n return root;\n});\n\nexport {\n appInfoFromDict, pageArrayFromDict, getDebuggerAppKey,\n getPossibleDebuggerAppKeys, checkParams, simpleStringify, deferredPromise,\n convertResult, RESPONSE_LOG_LENGTH, getModuleRoot,\n};\n"],"mappings":"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"}