├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── commands └── cdb │ ├── index.js │ └── sub │ ├── cookies │ └── index.js │ ├── launch │ └── index.js │ ├── navigate │ └── index.js │ ├── network │ ├── handlers │ │ ├── blessed │ │ │ ├── index.js │ │ │ └── interceptor.js │ │ ├── log │ │ │ └── index.js │ │ └── output │ │ │ └── index.js │ ├── index.js │ └── lib │ │ ├── consts.js │ │ └── http.js │ └── screenshot │ └── index.js ├── lib ├── index.js ├── launch.js └── network.js ├── package-lock.json ├── package.json ├── screenshots ├── 01.png ├── 02.png └── 03.png └── scripts └── generate-usage-docs.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | *.png filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 PownJS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Follow on Twitter](https://img.shields.io/twitter/follow/pownjs.svg?logo=twitter)](https://twitter.com/pownjs) 2 | [![NPM](https://img.shields.io/npm/v/@pown/cdb.svg)](https://www.npmjs.com/package/@pown/cdb) 3 | [![Fury](https://img.shields.io/badge/version-2x%20Fury-red.svg)](https://github.com/pownjs/lobby) 4 | [![SecApps](https://img.shields.io/badge/credits-SecApps-black.svg)](https://secapps.com) 5 | 6 | # Pown CDB 7 | 8 | Pown CDB is a Chrome Debug Protocol utility. The main goal of the tool is to automate common tasks to help debug web applications from the command-line and actively monitor and intercept HTTP requests and responses. This is particularly useful during penetration tests and other types of security assessments and investigations. 9 | 10 | | ![screenshot](https://media.githubusercontent.com/media/pownjs/pown-cdb/master/screenshots/01.png) | 11 | |-| 12 | 13 | ## Credits 14 | 15 | This tool is part of [secapps.com](https://secapps.com) open-source initiative. 16 | 17 | ``` 18 | ___ ___ ___ _ ___ ___ ___ 19 | / __| __/ __| /_\ | _ \ _ \/ __| 20 | \__ \ _| (__ / _ \| _/ _/\__ \ 21 | |___/___\___/_/ \_\_| |_| |___/ 22 | https://secapps.com 23 | ``` 24 | 25 | ### Authors 26 | 27 | * [@pdp](https://twitter.com/pdp) - https://pdparchitect.github.io/www/ 28 | 29 | ## Quickstart 30 | 31 | This tool is meant to be used as part of [Pown.js](https://github.com/pownjs/pown) but it can be invoked separately as an independent tool. 32 | 33 | Install Pown first as usual: 34 | 35 | ```sh 36 | $ npm install -g pown@latest 37 | ``` 38 | 39 | Invoke directly from Pown: 40 | 41 | ```sh 42 | $ pown cdb 43 | ``` 44 | 45 | ### Library Use 46 | 47 | Install this module locally from the root of your project: 48 | 49 | ```sh 50 | $ npm install @pown/cdb --save 51 | ``` 52 | 53 | Once done, invoke pown cli: 54 | 55 | ```sh 56 | $ POWN_ROOT=. ./node_modules/.bin/pown-cli cdb 57 | ``` 58 | 59 | You can also use the global pown to invoke the tool locally: 60 | 61 | ```sh 62 | $ POWN_ROOT=. pown cdb 63 | ``` 64 | 65 | ## Usage 66 | 67 | > **WARNING**: This pown command is currently under development and as a result will be subject to breaking changes. 68 | 69 | ``` 70 | pown cdb 71 | 72 | Chrome Debug Protocol Tool 73 | 74 | Commands: 75 | pown cdb launch Launch server application such as chrome, firefox, opera and edge [aliases: start] 76 | pown cdb navigate Go to the specified url [aliases: goto, go] 77 | pown cdb network Chrome Debug Protocol Network Monitor [aliases: net, sniff, proxy, mon, monitor] 78 | pown cdb cookies Dump current page cookies [aliases: cookie] 79 | pown cdb screenshot Screenshot the current page [aliases: capture, shoot, shot] 80 | 81 | Options: 82 | --version Show version number [boolean] 83 | --help Show help [boolean] 84 | ``` 85 | 86 | ### `pown cdb launch` 87 | 88 | ``` 89 | pown cdb launch 90 | 91 | Launch server application such as chrome, firefox, opera and edge 92 | 93 | Options: 94 | --version Show version number [boolean] 95 | --help Show help [boolean] 96 | --port, -p Remote debugging port [number] [default: 9222] 97 | --xss-auditor, -x Turn on/off XSS auditor [boolean] [default: true] 98 | --certificate-errors, -c Turn on/off certificate errors [boolean] [default: true] 99 | --pentest, -t Start with prefered settings for pentesting [boolean] [default: false] 100 | ``` 101 | 102 | ### `pown cdb navigate` 103 | 104 | ``` 105 | pown cdb navigate 106 | 107 | Go to the specified url 108 | 109 | Options: 110 | --version Show version number [boolean] 111 | --help Show help [boolean] 112 | --host, -H Remote debugging host [string] [default: "localhost"] 113 | --port, -p Remote debugging port [number] [default: 9222] 114 | --secure, -s HTTPS/WSS frontend [boolean] [default: false] 115 | ``` 116 | 117 | ### `pown cdb network` 118 | 119 | ``` 120 | pown cdb network 121 | 122 | Chrome Debug Protocol Network Monitor 123 | 124 | Options: 125 | --version Show version number [boolean] 126 | --help Show help [boolean] 127 | --host, -H Remote debugging host [string] [default: "localhost"] 128 | --port, -p Remote debugging port [number] [default: 9222] 129 | --secure, -s HTTPS/WSS frontend [boolean] [default: false] 130 | --output, -o Output directory/file [array] [default: []] 131 | --blessed, -b Start with blessed ui [boolean] [default: false] 132 | ``` 133 | 134 | ### `pown cdb cookies` 135 | 136 | ``` 137 | pown cdb cookies 138 | 139 | Dump current page cookies 140 | 141 | Options: 142 | --version Show version number [boolean] 143 | --help Show help [boolean] 144 | --host, -H Remote debugging host [string] [default: "localhost"] 145 | --port, -p Remote debugging port [number] [default: 9222] 146 | --secure, -s HTTPS/WSS frontend [boolean] [default: false] 147 | ``` 148 | 149 | ### `pown cdb screenshot` 150 | 151 | ``` 152 | pown cdb screenshot 153 | 154 | Screenshot the current page 155 | 156 | Options: 157 | --version Show version number [boolean] 158 | --help Show help [boolean] 159 | --host, -H Remote debugging host [string] [default: "localhost"] 160 | --port, -p Remote debugging port [number] [default: 9222] 161 | --secure, -s HTTPS/WSS frontend [boolean] [default: false] 162 | ``` 163 | 164 | ## Tutorials 165 | 166 | ### Web Application Security Assessment 167 | 168 | Let's explore how to use Pown CDB during a typical web app security engagments. 169 | 170 | First, ensure that you have the latest pown installed: 171 | 172 | ```sh 173 | $ npm install -g pown 174 | ``` 175 | 176 | If you have pown installed, make sure you have the latest version: 177 | 178 | ```sh 179 | $ pown update 180 | ``` 181 | 182 | To get started with Pown CDB we need a Chrome browser instance (other browsers are also supported) with chrome debug remote interface enabled and listening on localhost: 183 | 184 | ```sh 185 | $ pown cdb launch --port 9333 186 | ``` 187 | 188 | Once the chrome browser instance is running, hook it with pown cdb network utility: 189 | 190 | ```sh 191 | $ pown cdb network --port 9333 -b 192 | ``` 193 | 194 | The `-b` flag is used to start Pown CDB with a curses-based user interface: 195 | 196 | ![screenshot](https://media.githubusercontent.com/media/pownjs/pown-cdb/master/screenshots/01.png) 197 | 198 | Use key-combo `shift + ?` to get a list of available shortcuts: 199 | 200 | ![screenshot](https://media.githubusercontent.com/media/pownjs/pown-cdb/master/screenshots/02.png) 201 | 202 | As soon as you start using the browser, Pown CDB will record and display the traffic in the user interface. To intercept requests use key-combo `ctrl + t`. 203 | 204 | ![screenshot](https://media.githubusercontent.com/media/pownjs/pown-cdb/master/screenshots/03.png) 205 | 206 | Requests are captured and opened in your default shell editor (`$EDITOR`). Make the desired changes, save and quit. The original request will be replaced with your changes. 207 | -------------------------------------------------------------------------------- /commands/cdb/index.js: -------------------------------------------------------------------------------- 1 | exports.yargs = { 2 | command: 'cdb ', 3 | describe: 'Chrome Debug Protocol Tool', 4 | aliases: ['cdp', 'chrome'], 5 | 6 | builder: (yargs) => { 7 | yargs.command(require('./sub/launch').yargs) 8 | yargs.command(require('./sub/navigate').yargs) 9 | yargs.command(require('./sub/network').yargs) 10 | yargs.command(require('./sub/cookies').yargs) 11 | yargs.command(require('./sub/screenshot').yargs) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /commands/cdb/sub/cookies/index.js: -------------------------------------------------------------------------------- 1 | exports.yargs = { 2 | command: 'cookies', 3 | describe: 'Dump current page cookies', 4 | aliases: ['cookie'], 5 | 6 | builder: (yargs) => { 7 | yargs.option('host', { 8 | describe: 'Remote debugging host', 9 | type: 'string', 10 | alias: 'H', 11 | default: 'localhost', 12 | }) 13 | 14 | yargs.option('port', { 15 | describe: 'Remote debugging port', 16 | type: 'number', 17 | alias: 'p', 18 | default: 9222, 19 | }) 20 | 21 | yargs.option('secure', { 22 | describe: 'HTTPS/WSS frontend', 23 | type: 'boolean', 24 | alias: 's', 25 | default: false, 26 | }) 27 | }, 28 | 29 | handler: async(argv) => { 30 | const { host, port, secure } = argv 31 | 32 | const cri = require('chrome-remote-interface') 33 | 34 | const client = await cri({ host, port, secure }) 35 | 36 | const { Network } = client 37 | 38 | await Network.enable() 39 | 40 | const { cookies } = await Network.getCookies() 41 | 42 | await client.close() 43 | 44 | console.table(cookies) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /commands/cdb/sub/launch/index.js: -------------------------------------------------------------------------------- 1 | exports.yargs = { 2 | command: 'launch [url]', 3 | describe: 'Launch server application such as chrome, firefox, opera and edge', 4 | aliases: ['start'], 5 | 6 | builder: (yargs) => { 7 | yargs.option('debugging-port', { 8 | describe: 'Remote debugging port', 9 | type: 'number', 10 | alias: 'p', 11 | default: 9222, 12 | }) 13 | 14 | yargs.option('xss-auditor', { 15 | describe: 'Turn on/off XSS auditor', 16 | type: 'boolean', 17 | alias: 'x', 18 | default: true 19 | }) 20 | 21 | yargs.option('certificate-errors', { 22 | describe: 'Turn on/off certificate errors', 23 | type: 'boolean', 24 | alias: 'c', 25 | default: true 26 | }) 27 | 28 | yargs.option('proxy', { 29 | describe: 'Set proxy settings', 30 | type: 'string', 31 | alias: 'P', 32 | default: '' 33 | }) 34 | 35 | yargs.option('pentest', { 36 | describe: 'Start with prefered settings for pentesting', 37 | type: 'boolean', 38 | alias: 't', 39 | default: false 40 | }) 41 | }, 42 | 43 | handler: async(argv) => { 44 | const { launch } = require('../../../../lib/launch') 45 | 46 | const { debuggingPort, xssAuditor, certificateErrors, proxy, pentest, url } = argv || {} 47 | 48 | await launch({ debuggingPort, xssAuditor, certificateErrors, proxy, pentest, url }) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /commands/cdb/sub/navigate/index.js: -------------------------------------------------------------------------------- 1 | exports.yargs = { 2 | command: 'navigate ', 3 | describe: 'Go to the specified url', 4 | aliases: ['goto', 'go'], 5 | 6 | builder: (yargs) => { 7 | yargs.option('host', { 8 | describe: 'Remote debugging host', 9 | type: 'string', 10 | alias: 'H', 11 | default: 'localhost', 12 | }) 13 | 14 | yargs.option('port', { 15 | describe: 'Remote debugging port', 16 | type: 'number', 17 | alias: 'p', 18 | default: 9222, 19 | }) 20 | 21 | yargs.option('secure', { 22 | describe: 'HTTPS/WSS frontend', 23 | type: 'boolean', 24 | alias: 's', 25 | default: false, 26 | }) 27 | }, 28 | 29 | handler: async(argv) => { 30 | const { host, port, secure, url } = argv 31 | 32 | const cri = require('chrome-remote-interface') 33 | 34 | const client = await cri({ host, port, secure }) 35 | 36 | const { Page } = client 37 | 38 | await Page.enable() 39 | await Page.navigate({ url }) 40 | 41 | await client.close() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /commands/cdb/sub/network/handlers/blessed/index.js: -------------------------------------------------------------------------------- 1 | const colors = require('@pown/cli/lib/colors') 2 | const blessed = require('@pown/blessed/lib/blessed') 3 | const Quit = require('@pown/blessed/lib/auxiliary/quit') 4 | const Help = require('@pown/blessed/lib/auxiliary/help') 5 | const { Semaphore } = require('@pown/async/lib/semaphore') 6 | const Console = require('@pown/blessed/lib/auxiliary/console') 7 | const HTTPView = require('@pown/blessed/lib/auxiliary/httpview') 8 | 9 | const Interceptor = require('./interceptor') 10 | const { EMPTY_BUFFER } = require('../../lib/consts') 11 | const { buildHttpTransaction } = require('../../lib/http') 12 | 13 | module.exports = (argv, sink, tool) => { 14 | const s = blessed.screen({ name: 'Network' }) 15 | 16 | const v = new HTTPView() 17 | const i = new Interceptor() 18 | const c = new Console() 19 | const h = new Help() 20 | const q = new Quit() 21 | 22 | q.bindKeys() 23 | c.bindKeys() 24 | h.bindKeys() 25 | c.hijackConsole() 26 | 27 | s.append(v) 28 | s.append(i) 29 | s.append(c) 30 | s.append(h) 31 | s.append(q) 32 | 33 | h.setContent(`\n 34 | \t88888b. .d88b. 888 888 888 88888b. 35 | \t888 "88b d88""88b 888 888 888 888 "88b 36 | \t888 888 888 888 888 888 888 888 888 37 | \t888 d88P Y88..88P Y88b 888 d88P 888 888 38 | \t88888P" "Y88P" "Y8888888P" 888 888 39 | \t888 40 | \t888 JS (cdb) 41 | \t888 42 | 43 | \t{bold}C-l{/bold} - Toggle message log 44 | \t{bold}C-t{/bold} - Toggle interception 45 | \t{bold}Tab{/bold} - Change focus 46 | \t{bold}C-c, C-x, q{/bold} - Exit 47 | \n`) 48 | 49 | s.render() 50 | 51 | let intercepting = true 52 | 53 | const toggleInterception = () => { 54 | if (intercepting) { 55 | tool.requestInterceptionOFF() 56 | v.setMessage(`INTERCEPTION: ${colors.bold('OFF')}`) 57 | } 58 | else { 59 | tool.requestInterceptionON() 60 | v.setMessage(`INTERCEPTION: ${colors.bold.red('ON')}`) 61 | } 62 | 63 | s.render() 64 | 65 | intercepting = !intercepting 66 | } 67 | 68 | toggleInterception() 69 | 70 | s.key(['C-t'], () => { 71 | toggleInterception() 72 | }) 73 | 74 | sink.on('transaction', (chromeTransaction) => { 75 | v.addTransaction(buildHttpTransaction(chromeTransaction)) 76 | }) 77 | 78 | const sem = new Semaphore(1) 79 | 80 | sink.on('intercept-request', (pipeline) => { 81 | const { request } = pipeline 82 | 83 | pipeline.request = new Promise(async(resolve) => { 84 | const promissedRequest = await request 85 | 86 | const release = await sem.acquire() 87 | 88 | const newRequest = await i.display({ 89 | method: promissedRequest.method, 90 | uri: promissedRequest.url, 91 | headers: promissedRequest.headers, 92 | body: promissedRequest.postData ? Buffer.from(promissedRequest.postData) : EMPTY_BUFFER 93 | }) 94 | 95 | resolve({ 96 | method: newRequest.method, 97 | url: newRequest.uri, 98 | headers: newRequest.headers, 99 | postData: newRequest.body.toString() 100 | }) 101 | 102 | await release() 103 | }) 104 | }) 105 | } 106 | -------------------------------------------------------------------------------- /commands/cdb/sub/network/handlers/blessed/interceptor.js: -------------------------------------------------------------------------------- 1 | const { Box } = require('@pown/blessed') 2 | const { parseRequest, buildRequest } = require('@pown/http') 3 | 4 | class RequestInterceptor extends Box { 5 | constructor(options) { 6 | options = { 7 | label: 'Request Interceptor', 8 | 9 | keys: true, 10 | mouse: true, 11 | 12 | scrollable: true, 13 | alwaysScroll: true, 14 | scrollbar: { 15 | ch: ' ', 16 | inverse: true 17 | }, 18 | 19 | top: 'center', 20 | left: 'center', 21 | 22 | width: '100%-2', 23 | height: '50%', 24 | 25 | border: { 26 | type: 'line' 27 | }, 28 | 29 | style: { 30 | border: { 31 | fg: 'grey' 32 | }, 33 | focus: { 34 | border: { 35 | fg: 'white' 36 | } 37 | }, 38 | }, 39 | 40 | hidden: true, 41 | 42 | ...options, 43 | 44 | tags: true 45 | } 46 | 47 | super(options) 48 | } 49 | 50 | serializeRequest(request) { 51 | return buildRequest(request) 52 | } 53 | 54 | deserializeRequest(request) { 55 | return parseRequest(request) 56 | } 57 | 58 | exchangeRequest(request) { 59 | return new Promise(async(resolve, reject) => { 60 | this.screen.readEditor({ value: await this.serializeRequest(request) }, async(err, value) => { 61 | if (err) { 62 | reject(err) 63 | } 64 | else { 65 | resolve(await this.deserializeRequest(value)) 66 | } 67 | }) 68 | }) 69 | } 70 | 71 | async display(request) { 72 | this.show() 73 | this.focus() 74 | this.setFront() 75 | this.screen.render() 76 | 77 | try { 78 | request = await this.exchangeRequest(request) 79 | } 80 | catch (e) {} 81 | 82 | this.hide() 83 | this.screen.render() 84 | 85 | return request 86 | } 87 | } 88 | 89 | module.exports = RequestInterceptor 90 | -------------------------------------------------------------------------------- /commands/cdb/sub/network/handlers/log/index.js: -------------------------------------------------------------------------------- 1 | module.exports = (argv, sink, tool) => { 2 | const colors = require('@pown/cli/lib/colors') 3 | 4 | const responseCodeColorFuncs = [colors.gray, colors.blue, colors.green, colors.yellow, colors.magenta, colors.red, colors.gray, colors.gray, colors.gray, colors.gray] 5 | 6 | const getHeader = (headers, header) => { 7 | header = header.toLowerCase() 8 | 9 | for (const [name, value] of Object.entries(headers)) { 10 | if (name.toLowerCase() === header) { 11 | return value 12 | } 13 | } 14 | } 15 | 16 | const buildLogLine = (request, response) => { 17 | const headers = response.headers 18 | const method = request.method 19 | const url = request.url 20 | const responseCode = responseCodeColorFuncs[~~(response.status / 100) % 10](response.status) 21 | const contentType = colors.cyan(getHeader(headers, 'Content-Type') || '-') 22 | const server = colors.blue(getHeader(headers, 'Server') || '-') 23 | const contentLength = ((getHeader(headers, 'Content-Length') ? `${getHeader(headers, 'Content-Length')}b` : '-')) 24 | const time = '-' 25 | const location = getHeader(headers, 'Location') ? `-> ${getHeader(headers, 'Location')}` : '' 26 | 27 | return `${method} ${url} -> ${responseCode} ${contentType} ${server} ${contentLength} ${time} ${location}` 28 | } 29 | 30 | sink.on('transaction', ({ request, response }) => { 31 | console.info(buildLogLine(request, response)) 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /commands/cdb/sub/network/handlers/output/index.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const { lstatSync, mkdir, writeFile } = require('fs') 3 | const { buildRequest, buildResponse } = require('@pown/http') 4 | 5 | const { buildHttpTransaction } = require('../../lib/http') 6 | 7 | const writeHandler = (err) => { 8 | if (err) { 9 | console.error(err) 10 | } 11 | } 12 | 13 | const outputToFlatDir = (argv, sink, output) => { 14 | sink.on('transaction', (chromeTransaction) => { 15 | const id = chromeTransaction.requestContext.requestId 16 | const transaction = buildHttpTransaction(chromeTransaction) 17 | 18 | const pathname = output 19 | 20 | writeFile(path.join(pathname, `${id}.request`), buildRequest(transaction), writeHandler) 21 | writeFile(path.join(pathname, `${id}.response`), buildResponse(transaction), writeHandler) 22 | }) 23 | } 24 | 25 | const outputToTreeDir = (argv, sink, output) => { 26 | const url = require('url') 27 | 28 | sink.on('transaction', (chromeTransaction) => { 29 | const id = chromeTransaction.requestContext.requestId 30 | const transaction = buildHttpTransaction(chromeTransaction) 31 | 32 | const uri = url.parse(transaction.uri) 33 | const pathname = path.join(output, uri.protocol.slice(0, -1), uri.host, uri.pathname) 34 | 35 | mkdir(pathname, { recursive: true }, (err) => { 36 | if (err) { 37 | console.error(err) 38 | } 39 | else { 40 | writeFile(path.join(pathname, `${id}.request`), buildRequest(transaction), writeHandler) 41 | writeFile(path.join(pathname, `${id}.response`), buildResponse(transaction), writeHandler) 42 | } 43 | }) 44 | }) 45 | } 46 | 47 | module.exports = (argv, sink, output) => { 48 | if (lstatSync(output).isDirectory()) { 49 | if (path.basename(output).endsWith('.tree')) { 50 | outputToTreeDir(argv, sink, output) 51 | } 52 | else { 53 | outputToFlatDir(argv, sink, output) 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /commands/cdb/sub/network/index.js: -------------------------------------------------------------------------------- 1 | exports.yargs = { 2 | command: 'network', 3 | describe: 'Chrome Debug Protocol Network Monitor', 4 | aliases: ['net', 'sniff', 'proxy', 'mon', 'monitor'], 5 | 6 | builder: (yargs) => { 7 | const { hasNodeModule } = require('@pown/modules') 8 | 9 | yargs.option('host', { 10 | describe: 'Remote debugging host', 11 | type: 'string', 12 | alias: 'H', 13 | default: 'localhost', 14 | }) 15 | 16 | yargs.option('port', { 17 | describe: 'Remote debugging port', 18 | type: 'number', 19 | alias: 'p', 20 | default: 9222, 21 | }) 22 | 23 | yargs.option('secure', { 24 | describe: 'HTTPS/WSS frontend', 25 | type: 'boolean', 26 | alias: 's', 27 | default: false, 28 | }) 29 | 30 | yargs.option('output', { 31 | describe: 'Output directory/file', 32 | type: 'array', 33 | alias: 'o', 34 | default: [] 35 | }) 36 | 37 | if (hasNodeModule('@pown/blessed')) { 38 | yargs.options('blessed', { 39 | type: 'boolean', 40 | describe: 'Start with blessed ui', 41 | alias: 'b', 42 | default: false 43 | }) 44 | } 45 | }, 46 | 47 | handler: async(argv) => { 48 | const { host, port, secure, output, blessed } = argv 49 | 50 | const { EventEmitter } = require('events') 51 | 52 | const { NetworkTransactionTool } = require('../../../../lib/network') 53 | 54 | const sink = new EventEmitter() 55 | 56 | const tool = new class extends NetworkTransactionTool { 57 | async interceptRequest(request) { 58 | const pipeline = { 59 | request: Promise.resolve(request) 60 | } 61 | 62 | sink.emit('intercept-request', pipeline) 63 | 64 | request = await pipeline.request 65 | 66 | return request 67 | } 68 | 69 | async interceptResponse(response) { 70 | const pipeline = { 71 | response: Promise.resolve(response) 72 | } 73 | 74 | sink.emit('intercept-response', pipeline) 75 | 76 | response = await pipeline.request 77 | 78 | return response 79 | } 80 | 81 | onTransaction(transaction) { 82 | sink.emit('transaction', transaction) 83 | } 84 | } 85 | 86 | await tool.connect({ host, port, secure }) 87 | 88 | if (blessed) { 89 | require('./handlers/blessed')(argv, sink, tool) 90 | } 91 | else { 92 | require('./handlers/log')(argv, sink, tool) 93 | } 94 | 95 | if (output.length) { 96 | output.map((output) => { 97 | require('./handlers/output')(argv, sink, output) 98 | }) 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /commands/cdb/sub/network/lib/consts.js: -------------------------------------------------------------------------------- 1 | const EMPTY_BUFFER = Buffer.alloc(0) 2 | 3 | module.exports = { 4 | EMPTY_BUFFER 5 | } 6 | -------------------------------------------------------------------------------- /commands/cdb/sub/network/lib/http.js: -------------------------------------------------------------------------------- 1 | const { EMPTY_BUFFER } = require('./consts') 2 | 3 | const buildHttpTransaction = (chromeTransaction) => { 4 | const { requestContext, request, response } = chromeTransaction 5 | 6 | return { 7 | id: requestContext.requestId, 8 | 9 | method: request.method, 10 | uri: request.url, 11 | headers: request.headers, 12 | body: request.postData ? Buffer.from(request.postData) : EMPTY_BUFFER, 13 | 14 | responseCode: response.status, 15 | responseMessage: response.statusText, 16 | responseHeaders: response.headers, 17 | responseBody: response.body ? Buffer.from(response.body) : EMPTY_BUFFER 18 | } 19 | } 20 | 21 | module.exports = { 22 | buildHttpTransaction 23 | } 24 | -------------------------------------------------------------------------------- /commands/cdb/sub/screenshot/index.js: -------------------------------------------------------------------------------- 1 | exports.yargs = { 2 | command: 'screenshot ', 3 | describe: 'Screenshot the current page', 4 | aliases: ['capture', 'shoot', 'shot'], 5 | 6 | builder: (yargs) => { 7 | yargs.option('host', { 8 | describe: 'Remote debugging host', 9 | type: 'string', 10 | alias: 'H', 11 | default: 'localhost', 12 | }) 13 | 14 | yargs.option('port', { 15 | describe: 'Remote debugging port', 16 | type: 'number', 17 | alias: 'p', 18 | default: 9222, 19 | }) 20 | 21 | yargs.option('secure', { 22 | describe: 'HTTPS/WSS frontend', 23 | type: 'boolean', 24 | alias: 's', 25 | default: false, 26 | }) 27 | }, 28 | 29 | handler: async(argv) => { 30 | const { host, port, secure, file } = argv 31 | 32 | const fs = require('fs') 33 | const util = require('util') 34 | const cri = require('chrome-remote-interface') 35 | 36 | const writeFile = util.promisify(fs.writeFile.bind(fs)) 37 | 38 | const client = await cri({ host, port, secure }) 39 | 40 | const { Page } = client 41 | 42 | await Page.enable() 43 | 44 | const { data } = await Page.captureScreenshot() 45 | 46 | await writeFile(file, Buffer.from(data, 'base64')) 47 | 48 | await client.close() 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pownjs/cdb/842fea795292de0ce851ec688e7652a2999f44f5/lib/index.js -------------------------------------------------------------------------------- /lib/launch.js: -------------------------------------------------------------------------------- 1 | const os = require('os') 2 | const path = require('path') 3 | 4 | const launch = (options) => { 5 | const { debuggingPort, xssAuditor, certificateErrors, proxy, pentest, url, launcher } = options || {} 6 | 7 | const commonArgs = [`--user-data-dir=${path.join(os.tmpdir(), `chrome-${Math.random().toString(32).slice(2)}`)}`, '--no-first-run'] 8 | 9 | const commonEnv = {} 10 | 11 | if (debuggingPort) { 12 | commonArgs.push(`--remote-debugging-port=${debuggingPort}`) 13 | } 14 | 15 | if (!xssAuditor || pentest) { 16 | commonArgs.push('--disable-xss-auditor') 17 | } 18 | 19 | if (!certificateErrors || pentest) { 20 | commonArgs.push('--ignore-certificate-errors') 21 | } 22 | 23 | if (proxy) { 24 | if (proxy === 'auto') { 25 | if (pentest) { 26 | commonArgs.push('--proxy-server=localhost:8080') 27 | } 28 | } 29 | else { 30 | commonArgs.push(`--proxy-server=${proxy}`) 31 | } 32 | } 33 | 34 | if (url) { 35 | commonArgs.push(url) 36 | } 37 | 38 | const { spawn } = require('child_process') 39 | 40 | if (launcher) { 41 | launcher.launch({ chromeFlags: [...commonArgs] }) 42 | } 43 | else { 44 | let args 45 | 46 | switch (process.platform) { 47 | case 'darwin': 48 | args = [...commonArgs] 49 | 50 | spawn('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', args, { detached: true, stdio: 'ignore', env: commonEnv }).unref() 51 | 52 | break 53 | 54 | case 'linux': 55 | args = [...commonArgs] 56 | 57 | spawn('google-chrome', args, { detached: true, stdio: 'ignore', env: commonEnv }).unref() 58 | 59 | break 60 | 61 | case 'win32': 62 | args = [...commonArgs] 63 | 64 | spawn('C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', args, { detached: true, stdio: 'ignore', env: commonEnv }).unref() 65 | 66 | break 67 | } 68 | } 69 | } 70 | 71 | module.exports = { 72 | launch 73 | } 74 | -------------------------------------------------------------------------------- /lib/network.js: -------------------------------------------------------------------------------- 1 | const cri = require('chrome-remote-interface') 2 | 3 | class NetworkTool { 4 | constructor() { 5 | this.clients = {} 6 | this.interval = null 7 | this.hookedClients = {} 8 | this.interceptionOptions = null 9 | } 10 | 11 | onRequest() {} 12 | 13 | onResponse() {} 14 | 15 | async interceptRequest(request) { 16 | return request 17 | } 18 | 19 | async interceptResponse(response) { 20 | return response 21 | } 22 | 23 | async onRequestWillBeSent(Network, params) { 24 | const { request, ...context } = params 25 | 26 | try { 27 | // TODO: only trigger if we know data is available 28 | 29 | const { postData } = await Network.getRequestPostData({ requestId: context.requestId }) 30 | 31 | request.postData = postData 32 | } 33 | catch (e) {} 34 | 35 | await this.onRequest(request, context) 36 | } 37 | 38 | async onResponseReceived(Network, params) { 39 | const { response, ...context } = params 40 | 41 | try { 42 | // TODO: only trigger if we know data is available 43 | 44 | const { body } = await Network.getResponseBody({ requestId: context.requestId }) 45 | 46 | response.body = body 47 | } 48 | catch (e) {} 49 | 50 | await this.onResponse(response, context) 51 | } 52 | 53 | async onRequestIntercepted(Network, params) { 54 | const { interceptionId, request, ...context } = params 55 | 56 | let interceptionError 57 | let interceptionRequest 58 | 59 | try { 60 | interceptionRequest = await this.interceptRequest(request, context) 61 | } 62 | catch (e) { 63 | interceptionError = e 64 | } 65 | 66 | if (interceptionError) { 67 | interceptionRequest = { 68 | errorReason: interceptionError.message 69 | } 70 | } 71 | 72 | Network.continueInterceptedRequest({ interceptionId, ...interceptionRequest }) 73 | } 74 | 75 | hookClient(client) { 76 | if (this.hookedClients[client.id]) { 77 | return 78 | } 79 | 80 | const { types = ['Document', 'XHR', 'Fetch'], patterns = ['*'] } = this.interceptionOptions || {} 81 | 82 | client.Network.setRequestInterception({ 83 | patterns: [].concat(...types.map((resourceType) => { 84 | return patterns.map((urlPattern) => { 85 | return { resourceType, urlPattern } 86 | }) 87 | })) 88 | }) 89 | } 90 | 91 | unhookClient(client) { 92 | delete this.hookedClients[client.id] 93 | 94 | client.Network.setRequestInterception({ 95 | patterns: [] 96 | }) 97 | } 98 | 99 | requestInterceptionON(options) { 100 | this.interceptionOptions = options 101 | 102 | for (const client of Object.values(this.clients)) { 103 | this.hookClient(client) 104 | } 105 | } 106 | 107 | requestInterceptionOFF() { 108 | this.interceptionOptions = null 109 | 110 | for (const client of Object.values(this.clients)) { 111 | this.unhookClient(client) 112 | } 113 | } 114 | 115 | intercept(options) { 116 | this.requestInterceptionON(options) 117 | } 118 | 119 | async onConnect(client) { 120 | if (this.interceptionOptions) { 121 | this.hookClient(client) 122 | } 123 | 124 | const { Network } = client 125 | 126 | Network.requestWillBeSent(this.onRequestWillBeSent.bind(this, Network)) 127 | Network.responseReceived(this.onResponseReceived.bind(this, Network)) 128 | Network.requestIntercepted(this.onRequestIntercepted.bind(this, Network)) 129 | 130 | const k = 1024 * 1024 * 1045 131 | 132 | Network.enable({ 133 | maxTotalBufferSize: k, 134 | maxResourceBufferSize: k, 135 | 136 | maxPostDataSize: k 137 | }) 138 | } 139 | 140 | async doConnect(options) { 141 | const targets = await cri.List(options) 142 | 143 | targets.forEach(async(target) => { 144 | if (target.type !== 'page') { 145 | return 146 | } 147 | 148 | if (this.clients[target.id]) { 149 | return 150 | } 151 | 152 | const client = await cri({ ...options, target: target.id }) 153 | 154 | await this.onConnect(client) 155 | 156 | client.on('disconnect', () => { 157 | delete this.clients[target.id] 158 | }) 159 | 160 | this.clients[target.id] = client 161 | }) 162 | } 163 | 164 | async connect(options) { 165 | const { pollInterval = 1000 } = options || {} 166 | 167 | setInterval(this.doConnect.bind(this, options), pollInterval) 168 | 169 | await this.doConnect(options) 170 | } 171 | 172 | async disconnect() { 173 | clearInterval(this.interval) 174 | 175 | await Promise.all(Object.entries(this.clients).map(async([name, client]) => { 176 | delete this.clients[name] 177 | 178 | await client.removeAllListeners() 179 | await client.close() 180 | })) 181 | } 182 | } 183 | 184 | class NetworkTransactionTool extends NetworkTool { 185 | constructor(options) { 186 | super(options) 187 | 188 | this.transactions = {} 189 | } 190 | 191 | onTransaction() {} 192 | 193 | onRequest(request, context) { 194 | const transaction = this.ensureTransaction(context.requestId) 195 | 196 | transaction.request = request 197 | transaction.requestContext = context 198 | 199 | this.completeTransaction(context.requestId) 200 | } 201 | 202 | onResponse(response, context) { 203 | const transaction = this.ensureTransaction(context.requestId) 204 | 205 | transaction.response = response 206 | transaction.responseContext = context 207 | 208 | this.completeTransaction(context.requestId) 209 | } 210 | 211 | ensureTransaction(requestId) { 212 | if (!this.transactions[requestId]) { 213 | this.transactions[requestId] = {} 214 | } 215 | 216 | return this.transactions[requestId] 217 | } 218 | 219 | completeTransaction(requestId) { 220 | if (!this.transactions[requestId]) { 221 | return 222 | } 223 | 224 | const transaction = this.transactions[requestId] 225 | 226 | const { request, response } = transaction 227 | 228 | if (!request || !response) { 229 | return 230 | } 231 | 232 | delete this.transactions[requestId] 233 | 234 | this.onTransaction(transaction) 235 | } 236 | } 237 | 238 | module.exports = { 239 | NetworkTool, 240 | NetworkTransactionTool 241 | } 242 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@pown/cdb", 3 | "version": "2.6.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@pown/async": { 8 | "version": "2.11.0", 9 | "resolved": "https://registry.npmjs.org/@pown/async/-/async-2.11.0.tgz", 10 | "integrity": "sha512-ATBdr60FFlXGnvMg/hPOw7dzasgTnKOGzuvXaV2y3PLQxPyfe4bbh+d1UTzj2urr/DLXsPafe1q++4WtOcsjcw==" 11 | }, 12 | "@pown/blessed": { 13 | "version": "2.3.2", 14 | "resolved": "https://registry.npmjs.org/@pown/blessed/-/blessed-2.3.2.tgz", 15 | "integrity": "sha512-XWzGdH38Fuj1+ZUpT1FQ3sQyJuuz9KlKW+wNZdRdFD2BnYk/AP0PSt+VVALqhv7eJbohv7h6cY6UVx5RHm3CUw==", 16 | "requires": { 17 | "debounce": "^1.2.0", 18 | "neo-blessed": "^0.2.0", 19 | "strip-ansi": "^5.2.0" 20 | } 21 | }, 22 | "@pown/cli": { 23 | "version": "2.25.3", 24 | "resolved": "https://registry.npmjs.org/@pown/cli/-/cli-2.25.3.tgz", 25 | "integrity": "sha512-CqtEJBuXSvcYcf+l8c4KniDapV1hsYdCBKDKYvj0Je6k0Xf3A0gq6wrODVxacTQtSv9UsSXjAkvgpsSIbX9eNw==", 26 | "requires": { 27 | "@pown/modules": "^2.6.0", 28 | "are-we-there-yet": "^1.1.5", 29 | "chalk": "^2.4.2", 30 | "cli-progress": "^2.1.1", 31 | "cli-table3": "^0.5.1", 32 | "inquirer": "^6.5.2", 33 | "wordwrap": "^1.0.0", 34 | "yargs": "^13.3.2" 35 | } 36 | }, 37 | "@pown/http": { 38 | "version": "2.1.0", 39 | "resolved": "https://registry.npmjs.org/@pown/http/-/http-2.1.0.tgz", 40 | "integrity": "sha512-c0OVKI70dUxVJYGTVEls64fuEZOmQtFxi/J0sLtNjm3duwwmteqdWsmFURGd/z1FMDhFyAtKKfGHJXgD8RViFg==" 41 | }, 42 | "@pown/modules": { 43 | "version": "2.7.0", 44 | "resolved": "https://registry.npmjs.org/@pown/modules/-/modules-2.7.0.tgz", 45 | "integrity": "sha512-YcwN1jjUkTfGKekjO919ugMnfX8GSidHA9E+AlnNHLo1TGqC2UOhdzTnZVpPtw2SSATfySi6ZUMOun6cRBnQCA==", 46 | "requires": { 47 | "@pown/preferences": "^2.3.0", 48 | "read-package-tree": "^5.2.1" 49 | } 50 | }, 51 | "@pown/preferences": { 52 | "version": "2.3.0", 53 | "resolved": "https://registry.npmjs.org/@pown/preferences/-/preferences-2.3.0.tgz", 54 | "integrity": "sha512-4eKqVrmDYf7N1dvQMcf8dVxi8iIelB8rMIlpCR+9Adglm6AQqNUtvKMCn2lrvf2dtnne6k/9zZx5N8or0rhjbA==" 55 | }, 56 | "@pown/toolchain": { 57 | "version": "2.0.0", 58 | "resolved": "https://registry.npmjs.org/@pown/toolchain/-/toolchain-2.0.0.tgz", 59 | "integrity": "sha512-SqF0+P7TE7O1KIn77gv6343/lxNeJqV0wWK2Asju2UQHJJrpieJUE60GrgRW80hdUXt16sZ4Txx8+sRKo57MIw==" 60 | }, 61 | "ansi-escapes": { 62 | "version": "3.2.0", 63 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 64 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 65 | }, 66 | "ansi-regex": { 67 | "version": "4.1.0", 68 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 69 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 70 | }, 71 | "ansi-styles": { 72 | "version": "3.2.1", 73 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 74 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 75 | "requires": { 76 | "color-convert": "^1.9.0" 77 | } 78 | }, 79 | "are-we-there-yet": { 80 | "version": "1.1.5", 81 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 82 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 83 | "requires": { 84 | "delegates": "^1.0.0", 85 | "readable-stream": "^2.0.6" 86 | } 87 | }, 88 | "asap": { 89 | "version": "2.0.6", 90 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 91 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 92 | }, 93 | "balanced-match": { 94 | "version": "1.0.0", 95 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 96 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 97 | }, 98 | "brace-expansion": { 99 | "version": "1.1.11", 100 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 101 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 102 | "requires": { 103 | "balanced-match": "^1.0.0", 104 | "concat-map": "0.0.1" 105 | } 106 | }, 107 | "call-bind": { 108 | "version": "1.0.2", 109 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 110 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 111 | "requires": { 112 | "function-bind": "^1.1.1", 113 | "get-intrinsic": "^1.0.2" 114 | } 115 | }, 116 | "camelcase": { 117 | "version": "5.3.1", 118 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 119 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 120 | }, 121 | "chalk": { 122 | "version": "2.4.2", 123 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 124 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 125 | "requires": { 126 | "ansi-styles": "^3.2.1", 127 | "escape-string-regexp": "^1.0.5", 128 | "supports-color": "^5.3.0" 129 | } 130 | }, 131 | "chardet": { 132 | "version": "0.7.0", 133 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 134 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 135 | }, 136 | "chrome-remote-interface": { 137 | "version": "0.28.2", 138 | "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.28.2.tgz", 139 | "integrity": "sha512-F7mjof7rWvRNsJqhVXuiFU/HWySCxTA9tzpLxUJxVfdLkljwFJ1aMp08AnwXRmmP7r12/doTDOMwaNhFCJsacw==", 140 | "requires": { 141 | "commander": "2.11.x", 142 | "ws": "^7.2.0" 143 | } 144 | }, 145 | "cli-cursor": { 146 | "version": "2.1.0", 147 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 148 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 149 | "requires": { 150 | "restore-cursor": "^2.0.0" 151 | } 152 | }, 153 | "cli-progress": { 154 | "version": "2.1.1", 155 | "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-2.1.1.tgz", 156 | "integrity": "sha512-TSJw3LY9ZRSis7yYzQ7flIdtQMbacd9oYoiFphJhI4SzgmqF0zErO+uNv0lbUjk1L4AGfHQJ4OVYYzW+JV66KA==", 157 | "requires": { 158 | "colors": "^1.1.2", 159 | "string-width": "^2.1.1" 160 | } 161 | }, 162 | "cli-table3": { 163 | "version": "0.5.1", 164 | "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", 165 | "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", 166 | "requires": { 167 | "colors": "^1.1.2", 168 | "object-assign": "^4.1.0", 169 | "string-width": "^2.1.1" 170 | } 171 | }, 172 | "cli-width": { 173 | "version": "2.2.1", 174 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 175 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" 176 | }, 177 | "cliui": { 178 | "version": "5.0.0", 179 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 180 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 181 | "requires": { 182 | "string-width": "^3.1.0", 183 | "strip-ansi": "^5.2.0", 184 | "wrap-ansi": "^5.1.0" 185 | }, 186 | "dependencies": { 187 | "string-width": { 188 | "version": "3.1.0", 189 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 190 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 191 | "requires": { 192 | "emoji-regex": "^7.0.1", 193 | "is-fullwidth-code-point": "^2.0.0", 194 | "strip-ansi": "^5.1.0" 195 | } 196 | } 197 | } 198 | }, 199 | "color-convert": { 200 | "version": "1.9.3", 201 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 202 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 203 | "requires": { 204 | "color-name": "1.1.3" 205 | } 206 | }, 207 | "color-name": { 208 | "version": "1.1.3", 209 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 210 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 211 | }, 212 | "colors": { 213 | "version": "1.4.0", 214 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 215 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 216 | }, 217 | "commander": { 218 | "version": "2.11.0", 219 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 220 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" 221 | }, 222 | "concat-map": { 223 | "version": "0.0.1", 224 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 225 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 226 | }, 227 | "core-util-is": { 228 | "version": "1.0.2", 229 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 230 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 231 | }, 232 | "debounce": { 233 | "version": "1.2.0", 234 | "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", 235 | "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" 236 | }, 237 | "debuglog": { 238 | "version": "1.0.1", 239 | "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", 240 | "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" 241 | }, 242 | "decamelize": { 243 | "version": "1.2.0", 244 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 245 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 246 | }, 247 | "define-properties": { 248 | "version": "1.1.3", 249 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 250 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 251 | "requires": { 252 | "object-keys": "^1.0.12" 253 | } 254 | }, 255 | "delegates": { 256 | "version": "1.0.0", 257 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 258 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 259 | }, 260 | "dezalgo": { 261 | "version": "1.0.3", 262 | "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", 263 | "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", 264 | "requires": { 265 | "asap": "^2.0.0", 266 | "wrappy": "1" 267 | } 268 | }, 269 | "emoji-regex": { 270 | "version": "7.0.3", 271 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 272 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 273 | }, 274 | "es-abstract": { 275 | "version": "1.18.0-next.2", 276 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", 277 | "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", 278 | "requires": { 279 | "call-bind": "^1.0.2", 280 | "es-to-primitive": "^1.2.1", 281 | "function-bind": "^1.1.1", 282 | "get-intrinsic": "^1.0.2", 283 | "has": "^1.0.3", 284 | "has-symbols": "^1.0.1", 285 | "is-callable": "^1.2.2", 286 | "is-negative-zero": "^2.0.1", 287 | "is-regex": "^1.1.1", 288 | "object-inspect": "^1.9.0", 289 | "object-keys": "^1.1.1", 290 | "object.assign": "^4.1.2", 291 | "string.prototype.trimend": "^1.0.3", 292 | "string.prototype.trimstart": "^1.0.3" 293 | } 294 | }, 295 | "es-to-primitive": { 296 | "version": "1.2.1", 297 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 298 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 299 | "requires": { 300 | "is-callable": "^1.1.4", 301 | "is-date-object": "^1.0.1", 302 | "is-symbol": "^1.0.2" 303 | } 304 | }, 305 | "escape-string-regexp": { 306 | "version": "1.0.5", 307 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 308 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 309 | }, 310 | "external-editor": { 311 | "version": "3.1.0", 312 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 313 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 314 | "requires": { 315 | "chardet": "^0.7.0", 316 | "iconv-lite": "^0.4.24", 317 | "tmp": "^0.0.33" 318 | } 319 | }, 320 | "figures": { 321 | "version": "2.0.0", 322 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 323 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 324 | "requires": { 325 | "escape-string-regexp": "^1.0.5" 326 | } 327 | }, 328 | "find-up": { 329 | "version": "3.0.0", 330 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 331 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 332 | "requires": { 333 | "locate-path": "^3.0.0" 334 | } 335 | }, 336 | "fs.realpath": { 337 | "version": "1.0.0", 338 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 339 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 340 | }, 341 | "function-bind": { 342 | "version": "1.1.1", 343 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 344 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 345 | }, 346 | "get-caller-file": { 347 | "version": "2.0.5", 348 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 349 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 350 | }, 351 | "get-intrinsic": { 352 | "version": "1.1.1", 353 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 354 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 355 | "requires": { 356 | "function-bind": "^1.1.1", 357 | "has": "^1.0.3", 358 | "has-symbols": "^1.0.1" 359 | } 360 | }, 361 | "glob": { 362 | "version": "7.1.6", 363 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 364 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 365 | "requires": { 366 | "fs.realpath": "^1.0.0", 367 | "inflight": "^1.0.4", 368 | "inherits": "2", 369 | "minimatch": "^3.0.4", 370 | "once": "^1.3.0", 371 | "path-is-absolute": "^1.0.0" 372 | } 373 | }, 374 | "graceful-fs": { 375 | "version": "4.2.6", 376 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 377 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" 378 | }, 379 | "has": { 380 | "version": "1.0.3", 381 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 382 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 383 | "requires": { 384 | "function-bind": "^1.1.1" 385 | } 386 | }, 387 | "has-flag": { 388 | "version": "3.0.0", 389 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 390 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 391 | }, 392 | "has-symbols": { 393 | "version": "1.0.1", 394 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 395 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 396 | }, 397 | "hosted-git-info": { 398 | "version": "2.8.8", 399 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", 400 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" 401 | }, 402 | "iconv-lite": { 403 | "version": "0.4.24", 404 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 405 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 406 | "requires": { 407 | "safer-buffer": ">= 2.1.2 < 3" 408 | } 409 | }, 410 | "inflight": { 411 | "version": "1.0.6", 412 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 413 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 414 | "requires": { 415 | "once": "^1.3.0", 416 | "wrappy": "1" 417 | } 418 | }, 419 | "inherits": { 420 | "version": "2.0.4", 421 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 422 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 423 | }, 424 | "inquirer": { 425 | "version": "6.5.2", 426 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 427 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 428 | "requires": { 429 | "ansi-escapes": "^3.2.0", 430 | "chalk": "^2.4.2", 431 | "cli-cursor": "^2.1.0", 432 | "cli-width": "^2.0.0", 433 | "external-editor": "^3.0.3", 434 | "figures": "^2.0.0", 435 | "lodash": "^4.17.12", 436 | "mute-stream": "0.0.7", 437 | "run-async": "^2.2.0", 438 | "rxjs": "^6.4.0", 439 | "string-width": "^2.1.0", 440 | "strip-ansi": "^5.1.0", 441 | "through": "^2.3.6" 442 | } 443 | }, 444 | "is-callable": { 445 | "version": "1.2.3", 446 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", 447 | "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" 448 | }, 449 | "is-core-module": { 450 | "version": "2.2.0", 451 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", 452 | "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", 453 | "requires": { 454 | "has": "^1.0.3" 455 | } 456 | }, 457 | "is-date-object": { 458 | "version": "1.0.2", 459 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 460 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 461 | }, 462 | "is-fullwidth-code-point": { 463 | "version": "2.0.0", 464 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 465 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 466 | }, 467 | "is-negative-zero": { 468 | "version": "2.0.1", 469 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 470 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" 471 | }, 472 | "is-regex": { 473 | "version": "1.1.2", 474 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", 475 | "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", 476 | "requires": { 477 | "call-bind": "^1.0.2", 478 | "has-symbols": "^1.0.1" 479 | } 480 | }, 481 | "is-symbol": { 482 | "version": "1.0.3", 483 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 484 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 485 | "requires": { 486 | "has-symbols": "^1.0.1" 487 | } 488 | }, 489 | "isarray": { 490 | "version": "1.0.0", 491 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 492 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 493 | }, 494 | "json-parse-even-better-errors": { 495 | "version": "2.3.1", 496 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 497 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 498 | }, 499 | "locate-path": { 500 | "version": "3.0.0", 501 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 502 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 503 | "requires": { 504 | "p-locate": "^3.0.0", 505 | "path-exists": "^3.0.0" 506 | } 507 | }, 508 | "lodash": { 509 | "version": "4.17.20", 510 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 511 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 512 | }, 513 | "mimic-fn": { 514 | "version": "1.2.0", 515 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 516 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 517 | }, 518 | "minimatch": { 519 | "version": "3.0.4", 520 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 521 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 522 | "requires": { 523 | "brace-expansion": "^1.1.7" 524 | } 525 | }, 526 | "mute-stream": { 527 | "version": "0.0.7", 528 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 529 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" 530 | }, 531 | "neo-blessed": { 532 | "version": "0.2.0", 533 | "resolved": "https://registry.npmjs.org/neo-blessed/-/neo-blessed-0.2.0.tgz", 534 | "integrity": "sha512-C2kC4K+G2QnNQFXUIxTQvqmrdSIzGTX1ZRKeDW6ChmvPRw8rTkTEJzbEQHiHy06d36PCl/yMOCjquCRV8SpSQw==" 535 | }, 536 | "normalize-package-data": { 537 | "version": "2.5.0", 538 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 539 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 540 | "requires": { 541 | "hosted-git-info": "^2.1.4", 542 | "resolve": "^1.10.0", 543 | "semver": "2 || 3 || 4 || 5", 544 | "validate-npm-package-license": "^3.0.1" 545 | } 546 | }, 547 | "npm-normalize-package-bin": { 548 | "version": "1.0.1", 549 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 550 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" 551 | }, 552 | "object-assign": { 553 | "version": "4.1.1", 554 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 555 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 556 | }, 557 | "object-inspect": { 558 | "version": "1.9.0", 559 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", 560 | "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" 561 | }, 562 | "object-keys": { 563 | "version": "1.1.1", 564 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 565 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 566 | }, 567 | "object.assign": { 568 | "version": "4.1.2", 569 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 570 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 571 | "requires": { 572 | "call-bind": "^1.0.0", 573 | "define-properties": "^1.1.3", 574 | "has-symbols": "^1.0.1", 575 | "object-keys": "^1.1.1" 576 | } 577 | }, 578 | "object.getownpropertydescriptors": { 579 | "version": "2.1.1", 580 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", 581 | "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", 582 | "requires": { 583 | "call-bind": "^1.0.0", 584 | "define-properties": "^1.1.3", 585 | "es-abstract": "^1.18.0-next.1" 586 | } 587 | }, 588 | "once": { 589 | "version": "1.4.0", 590 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 591 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 592 | "requires": { 593 | "wrappy": "1" 594 | } 595 | }, 596 | "onetime": { 597 | "version": "2.0.1", 598 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 599 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 600 | "requires": { 601 | "mimic-fn": "^1.0.0" 602 | } 603 | }, 604 | "os-tmpdir": { 605 | "version": "1.0.2", 606 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 607 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 608 | }, 609 | "p-limit": { 610 | "version": "2.3.0", 611 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 612 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 613 | "requires": { 614 | "p-try": "^2.0.0" 615 | } 616 | }, 617 | "p-locate": { 618 | "version": "3.0.0", 619 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 620 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 621 | "requires": { 622 | "p-limit": "^2.0.0" 623 | } 624 | }, 625 | "p-try": { 626 | "version": "2.2.0", 627 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 628 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 629 | }, 630 | "path-exists": { 631 | "version": "3.0.0", 632 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 633 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 634 | }, 635 | "path-is-absolute": { 636 | "version": "1.0.1", 637 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 638 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 639 | }, 640 | "path-parse": { 641 | "version": "1.0.6", 642 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 643 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 644 | }, 645 | "process-nextick-args": { 646 | "version": "2.0.1", 647 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 648 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 649 | }, 650 | "read-package-json": { 651 | "version": "2.1.2", 652 | "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", 653 | "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", 654 | "requires": { 655 | "glob": "^7.1.1", 656 | "json-parse-even-better-errors": "^2.3.0", 657 | "normalize-package-data": "^2.0.0", 658 | "npm-normalize-package-bin": "^1.0.0" 659 | } 660 | }, 661 | "read-package-tree": { 662 | "version": "5.3.1", 663 | "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", 664 | "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", 665 | "requires": { 666 | "read-package-json": "^2.0.0", 667 | "readdir-scoped-modules": "^1.0.0", 668 | "util-promisify": "^2.1.0" 669 | } 670 | }, 671 | "readable-stream": { 672 | "version": "2.3.7", 673 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 674 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 675 | "requires": { 676 | "core-util-is": "~1.0.0", 677 | "inherits": "~2.0.3", 678 | "isarray": "~1.0.0", 679 | "process-nextick-args": "~2.0.0", 680 | "safe-buffer": "~5.1.1", 681 | "string_decoder": "~1.1.1", 682 | "util-deprecate": "~1.0.1" 683 | } 684 | }, 685 | "readdir-scoped-modules": { 686 | "version": "1.1.0", 687 | "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", 688 | "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", 689 | "requires": { 690 | "debuglog": "^1.0.1", 691 | "dezalgo": "^1.0.0", 692 | "graceful-fs": "^4.1.2", 693 | "once": "^1.3.0" 694 | } 695 | }, 696 | "require-directory": { 697 | "version": "2.1.1", 698 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 699 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 700 | }, 701 | "require-main-filename": { 702 | "version": "2.0.0", 703 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 704 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 705 | }, 706 | "resolve": { 707 | "version": "1.20.0", 708 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 709 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 710 | "requires": { 711 | "is-core-module": "^2.2.0", 712 | "path-parse": "^1.0.6" 713 | } 714 | }, 715 | "restore-cursor": { 716 | "version": "2.0.0", 717 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 718 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 719 | "requires": { 720 | "onetime": "^2.0.0", 721 | "signal-exit": "^3.0.2" 722 | } 723 | }, 724 | "run-async": { 725 | "version": "2.4.1", 726 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 727 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" 728 | }, 729 | "rxjs": { 730 | "version": "6.6.3", 731 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", 732 | "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", 733 | "requires": { 734 | "tslib": "^1.9.0" 735 | } 736 | }, 737 | "safe-buffer": { 738 | "version": "5.1.2", 739 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 740 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 741 | }, 742 | "safer-buffer": { 743 | "version": "2.1.2", 744 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 745 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 746 | }, 747 | "semver": { 748 | "version": "5.7.1", 749 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 750 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 751 | }, 752 | "set-blocking": { 753 | "version": "2.0.0", 754 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 755 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 756 | }, 757 | "signal-exit": { 758 | "version": "3.0.3", 759 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 760 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 761 | }, 762 | "spdx-correct": { 763 | "version": "3.1.1", 764 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 765 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 766 | "requires": { 767 | "spdx-expression-parse": "^3.0.0", 768 | "spdx-license-ids": "^3.0.0" 769 | } 770 | }, 771 | "spdx-exceptions": { 772 | "version": "2.3.0", 773 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 774 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" 775 | }, 776 | "spdx-expression-parse": { 777 | "version": "3.0.1", 778 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 779 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 780 | "requires": { 781 | "spdx-exceptions": "^2.1.0", 782 | "spdx-license-ids": "^3.0.0" 783 | } 784 | }, 785 | "spdx-license-ids": { 786 | "version": "3.0.7", 787 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", 788 | "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" 789 | }, 790 | "string-width": { 791 | "version": "2.1.1", 792 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 793 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 794 | "requires": { 795 | "is-fullwidth-code-point": "^2.0.0", 796 | "strip-ansi": "^4.0.0" 797 | }, 798 | "dependencies": { 799 | "ansi-regex": { 800 | "version": "3.0.0", 801 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 802 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 803 | }, 804 | "strip-ansi": { 805 | "version": "4.0.0", 806 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 807 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 808 | "requires": { 809 | "ansi-regex": "^3.0.0" 810 | } 811 | } 812 | } 813 | }, 814 | "string.prototype.trimend": { 815 | "version": "1.0.3", 816 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", 817 | "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", 818 | "requires": { 819 | "call-bind": "^1.0.0", 820 | "define-properties": "^1.1.3" 821 | } 822 | }, 823 | "string.prototype.trimstart": { 824 | "version": "1.0.3", 825 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", 826 | "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", 827 | "requires": { 828 | "call-bind": "^1.0.0", 829 | "define-properties": "^1.1.3" 830 | } 831 | }, 832 | "string_decoder": { 833 | "version": "1.1.1", 834 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 835 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 836 | "requires": { 837 | "safe-buffer": "~5.1.0" 838 | } 839 | }, 840 | "strip-ansi": { 841 | "version": "5.2.0", 842 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 843 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 844 | "requires": { 845 | "ansi-regex": "^4.1.0" 846 | } 847 | }, 848 | "supports-color": { 849 | "version": "5.5.0", 850 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 851 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 852 | "requires": { 853 | "has-flag": "^3.0.0" 854 | } 855 | }, 856 | "through": { 857 | "version": "2.3.8", 858 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 859 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 860 | }, 861 | "tmp": { 862 | "version": "0.0.33", 863 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 864 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 865 | "requires": { 866 | "os-tmpdir": "~1.0.2" 867 | } 868 | }, 869 | "tslib": { 870 | "version": "1.14.1", 871 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 872 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 873 | }, 874 | "util-deprecate": { 875 | "version": "1.0.2", 876 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 877 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 878 | }, 879 | "util-promisify": { 880 | "version": "2.1.0", 881 | "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", 882 | "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", 883 | "requires": { 884 | "object.getownpropertydescriptors": "^2.0.3" 885 | } 886 | }, 887 | "validate-npm-package-license": { 888 | "version": "3.0.4", 889 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 890 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 891 | "requires": { 892 | "spdx-correct": "^3.0.0", 893 | "spdx-expression-parse": "^3.0.0" 894 | } 895 | }, 896 | "which-module": { 897 | "version": "2.0.0", 898 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 899 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 900 | }, 901 | "wordwrap": { 902 | "version": "1.0.0", 903 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 904 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 905 | }, 906 | "wrap-ansi": { 907 | "version": "5.1.0", 908 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 909 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 910 | "requires": { 911 | "ansi-styles": "^3.2.0", 912 | "string-width": "^3.0.0", 913 | "strip-ansi": "^5.0.0" 914 | }, 915 | "dependencies": { 916 | "string-width": { 917 | "version": "3.1.0", 918 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 919 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 920 | "requires": { 921 | "emoji-regex": "^7.0.1", 922 | "is-fullwidth-code-point": "^2.0.0", 923 | "strip-ansi": "^5.1.0" 924 | } 925 | } 926 | } 927 | }, 928 | "wrappy": { 929 | "version": "1.0.2", 930 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 931 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 932 | }, 933 | "ws": { 934 | "version": "7.3.1", 935 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", 936 | "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" 937 | }, 938 | "y18n": { 939 | "version": "4.0.1", 940 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", 941 | "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" 942 | }, 943 | "yargs": { 944 | "version": "13.3.2", 945 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 946 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 947 | "requires": { 948 | "cliui": "^5.0.0", 949 | "find-up": "^3.0.0", 950 | "get-caller-file": "^2.0.1", 951 | "require-directory": "^2.1.1", 952 | "require-main-filename": "^2.0.0", 953 | "set-blocking": "^2.0.0", 954 | "string-width": "^3.0.0", 955 | "which-module": "^2.0.0", 956 | "y18n": "^4.0.0", 957 | "yargs-parser": "^13.1.2" 958 | }, 959 | "dependencies": { 960 | "string-width": { 961 | "version": "3.1.0", 962 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 963 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 964 | "requires": { 965 | "emoji-regex": "^7.0.1", 966 | "is-fullwidth-code-point": "^2.0.0", 967 | "strip-ansi": "^5.1.0" 968 | } 969 | } 970 | } 971 | }, 972 | "yargs-parser": { 973 | "version": "13.1.2", 974 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 975 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 976 | "requires": { 977 | "camelcase": "^5.0.0", 978 | "decamelize": "^1.2.0" 979 | } 980 | } 981 | } 982 | } 983 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@pown/cdb", 3 | "version": "2.6.1", 4 | "description": "Pownage guaranteed", 5 | "main": "lib/index.js", 6 | "scripts": { 7 | "cdb": "POWN_ROOT=. pown-cli cdb", 8 | "test": "mocha" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/pownjs/pown-cdb.git" 13 | }, 14 | "keywords": [ 15 | "exploit", 16 | "framework" 17 | ], 18 | "author": "pdp ", 19 | "contributors": [], 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/pownjs/pown-cdb/issues" 23 | }, 24 | "homepage": "https://github.com/pownjs/pown-cdb#readme", 25 | "devDependencies": {}, 26 | "dependencies": { 27 | "@pown/async": "^2.11.0", 28 | "@pown/blessed": "^2.3.2", 29 | "@pown/cli": "^2.25.3", 30 | "@pown/http": "^2.1.0", 31 | "@pown/preferences": "^2.3.0", 32 | "@pown/toolchain": "^2.0.0", 33 | "chrome-remote-interface": "^0.28.2" 34 | }, 35 | "pown": { 36 | "commands": [ 37 | "commands/cdb" 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /screenshots/01.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f5002a5c815ad36cc9e7eaf3e5edecbf9e86bddf96eb8983b3ad0a7b5d844af4 3 | size 546531 4 | -------------------------------------------------------------------------------- /screenshots/02.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:efba5e1eef37f788e37c2d9869d01d202cb2885f617c1abe418b3cc0345e6929 3 | size 221707 4 | -------------------------------------------------------------------------------- /screenshots/03.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:16300f9a82276487f34932041e269bf6f453384d4dd052cd53083e5e0078a069 3 | size 260689 4 | -------------------------------------------------------------------------------- /scripts/generate-usage-docs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | COMMANDS="pown" 4 | SUBCOMMANDS="cdb" 5 | SUBSUBCOMMANDS="launch navigate network cookies screenshot" 6 | 7 | export POWN_ROOT=. 8 | 9 | for C in $COMMANDS 10 | do 11 | for SC in $SUBCOMMANDS 12 | do 13 | echo '## Usage' 14 | echo 15 | echo '> **WARNING**: This pown command is currently under development and as a result will be subject to breaking changes.' 16 | echo 17 | echo '```' 18 | $C $SC --help 19 | echo '```' 20 | echo 21 | 22 | for SSC in $SUBSUBCOMMANDS 23 | do 24 | echo "### \`$C $SC $SSC\`" 25 | echo 26 | echo '```' 27 | $C $SC $SSC --help 28 | echo '```' 29 | echo 30 | done 31 | done 32 | done 33 | --------------------------------------------------------------------------------