├── .env.example ├── .eslintrc.js ├── .gitignore ├── README.md ├── media-player.js ├── package-lock.json ├── package.json ├── public ├── css │ └── style.css ├── js │ ├── controls.js │ ├── socket-app.js │ └── vue-app.js ├── media │ └── .gitkeep └── views │ └── index.html └── server.js /.env.example: -------------------------------------------------------------------------------- 1 | PORT=3000 2 | # Set URL to something appropriate for your website's domain, e.g. 3 | # URL=http://fun.example.org:3000 4 | # Don't forget to add the DNS records, and add the subdomain to your cert. 5 | URL=http://localhost:3000 6 | 7 | ##for repeat use true, false, or a number 8 | REPEAT=false 9 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "extends": "eslint:recommended", 3 | "env": { 4 | "es6": true, 5 | "amd": true, 6 | "browser": true, 7 | "node": true 8 | }, 9 | "rules": { 10 | "semi": "error", 11 | "no-console": "off" 12 | }, 13 | "globals": { 14 | "io": "readonly", 15 | "Vue": "readonly" 16 | } 17 | }; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Misc 5 | .DS_Store 6 | .env 7 | .env.local 8 | .env.development.local 9 | .env.test.local 10 | .env.production.local 11 | 12 | 13 | public/media/* 14 | 15 | !public/media/.gitkeep 16 | 17 | .vscode/* 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Wetfish Sync v0.2 2 | 3 | Synchronize HTML5 audio and video between friends! 4 | 5 | ### Prerequisite Packages 6 | - ffmpeg and ffprobe, Sync uses shell commands in order to determine the length 7 | of audio and video files 8 | 9 | ### How to use 10 | 11 | - clone the repository 12 | - cd sync 13 | - npm install 14 | - copy .env.example to .env and edit it to suit your needs 15 | - place mp4,ogv,mp3,flac,oga,wav,webm, or ogg files within /public/media. Files 16 | will be played in lexicographic order. A simple way to ensure they are played 17 | in the desired order is to prefix the name with a number, e.g. to play 18 | `foo.mp4` before `bar.webm`, you would name them `01_foo.mp4` and 19 | `02_bar.webm`. 20 | - npm start 21 | 22 | ### M3U support 23 | 24 | -in order to use an m3u file feature simply start sync like this 'npm run start -- --m3u=/path/to/playlist.m3u' 25 | or node server.js --m3u="path/to/playlist.m3u8" where root is the public folder. 26 | 27 | 28 | -the m3u file can be located anywhere on the system, however the files it refrences must be in the public directory. otherwise you'll have a black screen, and a file name that says it's playing on the server backend. 29 | 30 | -.webm and .ogg are unsupported filetypes if using the m3u option. 31 | 32 | 33 | -------------------------------------------------------------------------------- /media-player.js: -------------------------------------------------------------------------------- 1 | const playlistUrl = process.env.URL || 'http://localhost:3000'; 2 | const argv = require('yargs-parser')(process.argv); 3 | const path = require('path'); 4 | const fs = require('fs'); 5 | const m3uParser = require('m3u8-parser'); 6 | const videoTypes = new Set(['.ogv', '.mp4']); 7 | const audioTypes = new Set(['.mp3', '.flac', '.oga', '.wav']); 8 | const ambiguousTypes = new Set(['.webm', '.ogg']); // These can be either audio or video 9 | 10 | let count = 0; 11 | 12 | //import m3u files into sync. atm files will need to be located in the project directory. 13 | function importM3U(file) { 14 | 15 | const parser = new m3uParser.Parser(); 16 | 17 | let parsedFile = fs.readFileSync(file).toString(); 18 | 19 | parser.push(parsedFile); 20 | parser.end(); 21 | return parser.manifest.segments; 22 | } 23 | 24 | 25 | 26 | class MediaPlayer { 27 | 28 | constructor(io) { 29 | this.io = io; 30 | this.mediaIndex = 0; 31 | this.mediaTypes = []; 32 | this.startTime = null; 33 | this.filesProcessed = 0; 34 | this.playlistCount = 0; 35 | 36 | if (argv.m3u) { 37 | this.playlist = importM3U(argv.m3u).map(this.processM3U).filter(this.isValidMediaFile); 38 | } 39 | else { 40 | this.playlist = fs.readdirSync('./public/media').filter(this.isValidMediaFile).map(function(file){ 41 | return '/media/'+file; 42 | }); 43 | } 44 | console.log("Loaded playlist:", this.playlist); 45 | 46 | this.breakpoints = new Array(this.playlist.length); 47 | this.mediaLengths = new Array(this.playlist.length); 48 | } 49 | 50 | processM3U(file) { 51 | //check file duration 52 | if (file.duration) { 53 | //check for a file uri 54 | if (file.uri) { 55 | //get the name of the file which will be the title of the media 56 | let name = path.parse(file.uri).name; 57 | //return an object with relevant information 58 | return { 59 | duration:file.duration, 60 | url: file.uri, 61 | name: name, 62 | }; 63 | } 64 | console.warn(`Weird. Somehow one of your files in your playlist is missing a path`); 65 | } 66 | else { 67 | console.warn(`one of your files in your playlist ${file.uri} is missing a duration`); 68 | } 69 | } 70 | 71 | isValidMediaFile(file) { 72 | let validExtensions = new Set([...videoTypes, ...audioTypes, ...ambiguousTypes]); 73 | let extension = path.parse('./'+ file).ext.toLowerCase(); 74 | 75 | //if file happens to be an object and has the property url, parse it differently. 76 | if (file.hasOwnProperty('url')) { 77 | validExtensions = new Set([...videoTypes, ...audioTypes]); 78 | extension = path.parse('./'+ file.url).ext.toLowerCase(); 79 | if(validExtensions.has(extension)) { 80 | return file; 81 | } 82 | else { 83 | console.warn(`file ${file.url} has an unsupported file extension. skipping...`); 84 | } 85 | } 86 | return (validExtensions.has(extension)); 87 | } 88 | 89 | // Determine whether files are audio, video, or unsupported 90 | getMediaTypes() { 91 | this.playlist.forEach((url) => { 92 | let relativeUrl = './public' + url; 93 | let extension = path.parse(relativeUrl).ext.toLowerCase(); 94 | if (audioTypes.has(extension)) this.mediaTypes.push('audio'); 95 | else if (videoTypes.has(extension)) this.mediaTypes.push('video'); 96 | else if (ambiguousTypes.has(extension)) { 97 | const shellCommand = `ffmpeg -i "${relativeUrl}" -hide_banner 2>&1 | grep `; 98 | const executeSync = require('child_process').execSync; 99 | try { 100 | executeSync(shellCommand + 'Video:'); // Check if ogg or webm file is video 101 | this.mediaTypes.push('video'); 102 | } 103 | catch (videoError) { 104 | try { 105 | executeSync(shellCommand + 'Audio:'); // Check if ogg or webm file is audio 106 | this.mediaTypes.push('audio'); 107 | } 108 | catch (audioError) { 109 | throw Error(`${url} has no video or audio content`); 110 | } 111 | } 112 | } 113 | else throw Error(`${url} is an unsuported file type`); 114 | }); 115 | } 116 | getPlaylistMediaTypes() { 117 | //m3u playlists will not support ambiguous file types for the moment. 118 | this.playlist.forEach((file)=>{ 119 | let extension = path.parse(file.url).ext.toLowerCase(); 120 | if (audioTypes.has(extension)) this.mediaTypes.push('audio'); 121 | else if (videoTypes.has(extension)) this.mediaTypes.push('video'); 122 | }); 123 | } 124 | 125 | // Compute video end times 126 | setBreakpoints() { 127 | let totalTime = 0; 128 | this.breakpoints = this.mediaLengths.map((currentVal) => { 129 | return totalTime += currentVal; 130 | }); 131 | } 132 | 133 | 134 | startTimers() { 135 | this.startTime = new Date(); // Start main timer 136 | 137 | for (let index = 0; index < this.breakpoints.length; index++) { 138 | let breakpointMillisecs = this.breakpoints[index] * 1000; 139 | 140 | // Set timers to update mediaIndex and notify users of next URL in playlist 141 | if (index === (this.breakpoints.length - 1)) { 142 | setTimeout(() => { 143 | // Emit socket event here 144 | this.mediaIndex = 0; 145 | emitNewMediaEvent(); 146 | this.restartTimers(); 147 | }, breakpointMillisecs); 148 | } else { 149 | setTimeout(() => { 150 | // Emit socket event here 151 | this.mediaIndex++; 152 | emitNewMediaEvent(); 153 | }, breakpointMillisecs); 154 | } 155 | } 156 | 157 | const emitNewMediaEvent = () => { 158 | 159 | let url = `${playlistUrl}${this.playlist[this.mediaIndex]}`; 160 | //if were in m3u mode were passing an object so we have to fetch the url from the object 161 | if (argv.m3u) { 162 | //check the url for a remote http string 163 | if (this.playlist[this.mediaIndex]['url'].startsWith('http')) { 164 | url = `${this.playlist[this.mediaIndex]['url']}`; 165 | } 166 | else { 167 | //else its a local file 168 | url = `${playlistUrl}${this.playlist[this.mediaIndex]['url']}`; 169 | } 170 | 171 | } 172 | const mediaType = this.mediaTypes[this.mediaIndex]; 173 | const duration = this.mediaLengths[this.mediaIndex]; 174 | const data = { 175 | url: url, 176 | duration: duration, 177 | mediaType: mediaType 178 | }; 179 | 180 | //on new media event, count each time the index is at zero. 181 | if (this.mediaIndex == 0) { 182 | this.playlistCount++; 183 | } 184 | this.io.sockets.emit('newMedia', data); 185 | }; 186 | } 187 | 188 | restartTimers() { 189 | this.startTimers(); 190 | } 191 | 192 | // Extract media duration. Documentation: https://ffmpeg.org/ffprobe.html 193 | getMediaLength(url, index) { 194 | const shellCommand = 'ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1'; 195 | const execute = require('child_process').exec; 196 | 197 | execute(`${shellCommand} "./public${url}"`, (err, stdout) => { 198 | let duration = stdout.split('\n')[0]; // Remove \n 199 | this.mediaLengths[index] = parseFloat(duration); 200 | this.filesProcessed++; 201 | if (this.filesProcessed === this.mediaLengths.length) { 202 | this.setBreakpoints(); 203 | this.startTimers(); 204 | } 205 | }); 206 | } 207 | //register media lengths from M3U playlist 208 | registerMediaLength(file, index) { 209 | this.mediaLengths[index] = file.duration; 210 | this.filesProcessed++; 211 | if (this.filesProcessed === this.mediaLengths.length) { 212 | this.setBreakpoints(); 213 | this.startTimers(); 214 | } 215 | } 216 | 217 | // Initialize by parsing media 218 | init() { 219 | if (argv.m3u) { 220 | this.getPlaylistMediaTypes(); 221 | this.playlist.forEach((file, index)=>{ 222 | this.registerMediaLength(file,index); 223 | }); 224 | } 225 | else { 226 | this.getMediaTypes(); 227 | this.playlist.forEach((fileUrl, index) => { 228 | this.getMediaLength(fileUrl, index); 229 | }); 230 | } 231 | } 232 | 233 | getTimestamp() { 234 | let timePassed = (new Date() - this.startTime)/1000; 235 | for (let index = 0; index < this.breakpoints.length; index++) { 236 | if (timePassed <= this.breakpoints[index]) { 237 | let videoStartTime = this.breakpoints[index - 1] || 0; 238 | let timestamp = timePassed - videoStartTime; 239 | //if were in m3u mode were passing an object so we have to fetch the url from the object 240 | if (argv.m3u) { 241 | //check if the url is remote 242 | if (this.playlist[index]['url'].startsWith('http')) { 243 | console.log(`watching file ${this.playlist[index]['url']}; ${timestamp}s`); 244 | } 245 | //else include localhost for the person watching the backend of this app. 246 | else console.log(`watching file ${playlistUrl}${this.playlist[index]['url']}; ${timestamp}s`); 247 | } 248 | else { 249 | console.log(`watching file ${playlistUrl}${this.playlist[index]}; ${timestamp}s`); 250 | } 251 | 252 | return timestamp; 253 | } 254 | } 255 | } 256 | 257 | 258 | } 259 | 260 | module.exports = MediaPlayer; 261 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sync", 3 | "version": "0.2.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "sync", 9 | "version": "0.2.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "dotenv": "^8.2.0", 13 | "express": "^4.16.4", 14 | "fscreen": "^1.0.2", 15 | "ip": "^1.1.5", 16 | "socket.io": "^2.4.0", 17 | "vue": "^2.6.4", 18 | "yargs-parser": "^18.1.3" 19 | }, 20 | "devDependencies": { 21 | "@fortawesome/fontawesome-free": "^5.9.0", 22 | "eslint": "^5.12.1", 23 | "m3u8-parser": "^4.4.0" 24 | } 25 | }, 26 | "node_modules/@babel/code-frame": { 27 | "version": "7.16.7", 28 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 29 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 30 | "dev": true, 31 | "dependencies": { 32 | "@babel/highlight": "^7.16.7" 33 | }, 34 | "engines": { 35 | "node": ">=6.9.0" 36 | } 37 | }, 38 | "node_modules/@babel/helper-validator-identifier": { 39 | "version": "7.16.7", 40 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 41 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 42 | "dev": true, 43 | "engines": { 44 | "node": ">=6.9.0" 45 | } 46 | }, 47 | "node_modules/@babel/highlight": { 48 | "version": "7.16.7", 49 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", 50 | "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", 51 | "dev": true, 52 | "dependencies": { 53 | "@babel/helper-validator-identifier": "^7.16.7", 54 | "chalk": "^2.0.0", 55 | "js-tokens": "^4.0.0" 56 | }, 57 | "engines": { 58 | "node": ">=6.9.0" 59 | } 60 | }, 61 | "node_modules/@babel/runtime": { 62 | "version": "7.16.7", 63 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", 64 | "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", 65 | "dev": true, 66 | "dependencies": { 67 | "regenerator-runtime": "^0.13.4" 68 | }, 69 | "engines": { 70 | "node": ">=6.9.0" 71 | } 72 | }, 73 | "node_modules/@fortawesome/fontawesome-free": { 74 | "version": "5.15.4", 75 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", 76 | "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", 77 | "dev": true, 78 | "hasInstallScript": true, 79 | "engines": { 80 | "node": ">=6" 81 | } 82 | }, 83 | "node_modules/@videojs/vhs-utils": { 84 | "version": "3.0.4", 85 | "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.4.tgz", 86 | "integrity": "sha512-hui4zOj2I1kLzDgf8QDVxD3IzrwjS/43KiS8IHQO0OeeSsb4pB/lgNt1NG7Dv0wMQfCccUpMVLGcK618s890Yg==", 87 | "dev": true, 88 | "dependencies": { 89 | "@babel/runtime": "^7.12.5", 90 | "global": "^4.4.0", 91 | "url-toolkit": "^2.2.1" 92 | }, 93 | "engines": { 94 | "node": ">=8", 95 | "npm": ">=5" 96 | } 97 | }, 98 | "node_modules/accepts": { 99 | "version": "1.3.7", 100 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 101 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 102 | "dependencies": { 103 | "mime-types": "~2.1.24", 104 | "negotiator": "0.6.2" 105 | }, 106 | "engines": { 107 | "node": ">= 0.6" 108 | } 109 | }, 110 | "node_modules/acorn": { 111 | "version": "6.4.2", 112 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 113 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", 114 | "dev": true, 115 | "bin": { 116 | "acorn": "bin/acorn" 117 | }, 118 | "engines": { 119 | "node": ">=0.4.0" 120 | } 121 | }, 122 | "node_modules/acorn-jsx": { 123 | "version": "5.3.2", 124 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 125 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 126 | "dev": true, 127 | "peerDependencies": { 128 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 129 | } 130 | }, 131 | "node_modules/after": { 132 | "version": "0.8.2", 133 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 134 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" 135 | }, 136 | "node_modules/ajv": { 137 | "version": "6.12.6", 138 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 139 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 140 | "dev": true, 141 | "dependencies": { 142 | "fast-deep-equal": "^3.1.1", 143 | "fast-json-stable-stringify": "^2.0.0", 144 | "json-schema-traverse": "^0.4.1", 145 | "uri-js": "^4.2.2" 146 | }, 147 | "funding": { 148 | "type": "github", 149 | "url": "https://github.com/sponsors/epoberezkin" 150 | } 151 | }, 152 | "node_modules/ansi-escapes": { 153 | "version": "3.2.0", 154 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 155 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 156 | "dev": true, 157 | "engines": { 158 | "node": ">=4" 159 | } 160 | }, 161 | "node_modules/ansi-regex": { 162 | "version": "3.0.0", 163 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 164 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 165 | "dev": true, 166 | "engines": { 167 | "node": ">=4" 168 | } 169 | }, 170 | "node_modules/ansi-styles": { 171 | "version": "3.2.1", 172 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 173 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 174 | "dev": true, 175 | "dependencies": { 176 | "color-convert": "^1.9.0" 177 | }, 178 | "engines": { 179 | "node": ">=4" 180 | } 181 | }, 182 | "node_modules/argparse": { 183 | "version": "1.0.10", 184 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 185 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 186 | "dev": true, 187 | "dependencies": { 188 | "sprintf-js": "~1.0.2" 189 | } 190 | }, 191 | "node_modules/array-flatten": { 192 | "version": "1.1.1", 193 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 194 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 195 | }, 196 | "node_modules/arraybuffer.slice": { 197 | "version": "0.0.7", 198 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 199 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 200 | }, 201 | "node_modules/astral-regex": { 202 | "version": "1.0.0", 203 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 204 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 205 | "dev": true, 206 | "engines": { 207 | "node": ">=4" 208 | } 209 | }, 210 | "node_modules/backo2": { 211 | "version": "1.0.2", 212 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 213 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 214 | }, 215 | "node_modules/balanced-match": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 218 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 219 | "dev": true 220 | }, 221 | "node_modules/base64-arraybuffer": { 222 | "version": "0.1.4", 223 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", 224 | "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", 225 | "engines": { 226 | "node": ">= 0.6.0" 227 | } 228 | }, 229 | "node_modules/base64id": { 230 | "version": "2.0.0", 231 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 232 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", 233 | "engines": { 234 | "node": "^4.5.0 || >= 5.9" 235 | } 236 | }, 237 | "node_modules/blob": { 238 | "version": "0.0.5", 239 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", 240 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" 241 | }, 242 | "node_modules/body-parser": { 243 | "version": "1.19.1", 244 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 245 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 246 | "dependencies": { 247 | "bytes": "3.1.1", 248 | "content-type": "~1.0.4", 249 | "debug": "2.6.9", 250 | "depd": "~1.1.2", 251 | "http-errors": "1.8.1", 252 | "iconv-lite": "0.4.24", 253 | "on-finished": "~2.3.0", 254 | "qs": "6.9.6", 255 | "raw-body": "2.4.2", 256 | "type-is": "~1.6.18" 257 | }, 258 | "engines": { 259 | "node": ">= 0.8" 260 | } 261 | }, 262 | "node_modules/body-parser/node_modules/debug": { 263 | "version": "2.6.9", 264 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 265 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 266 | "dependencies": { 267 | "ms": "2.0.0" 268 | } 269 | }, 270 | "node_modules/body-parser/node_modules/ms": { 271 | "version": "2.0.0", 272 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 273 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 274 | }, 275 | "node_modules/brace-expansion": { 276 | "version": "1.1.11", 277 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 278 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 279 | "dev": true, 280 | "dependencies": { 281 | "balanced-match": "^1.0.0", 282 | "concat-map": "0.0.1" 283 | } 284 | }, 285 | "node_modules/bytes": { 286 | "version": "3.1.1", 287 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 288 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", 289 | "engines": { 290 | "node": ">= 0.8" 291 | } 292 | }, 293 | "node_modules/callsites": { 294 | "version": "3.1.0", 295 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 296 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 297 | "dev": true, 298 | "engines": { 299 | "node": ">=6" 300 | } 301 | }, 302 | "node_modules/camelcase": { 303 | "version": "5.3.1", 304 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 305 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 306 | "engines": { 307 | "node": ">=6" 308 | } 309 | }, 310 | "node_modules/chalk": { 311 | "version": "2.4.2", 312 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 313 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 314 | "dev": true, 315 | "dependencies": { 316 | "ansi-styles": "^3.2.1", 317 | "escape-string-regexp": "^1.0.5", 318 | "supports-color": "^5.3.0" 319 | }, 320 | "engines": { 321 | "node": ">=4" 322 | } 323 | }, 324 | "node_modules/chardet": { 325 | "version": "0.7.0", 326 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 327 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 328 | "dev": true 329 | }, 330 | "node_modules/cli-cursor": { 331 | "version": "2.1.0", 332 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 333 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 334 | "dev": true, 335 | "dependencies": { 336 | "restore-cursor": "^2.0.0" 337 | }, 338 | "engines": { 339 | "node": ">=4" 340 | } 341 | }, 342 | "node_modules/cli-width": { 343 | "version": "2.2.1", 344 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 345 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 346 | "dev": true 347 | }, 348 | "node_modules/color-convert": { 349 | "version": "1.9.3", 350 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 351 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 352 | "dev": true, 353 | "dependencies": { 354 | "color-name": "1.1.3" 355 | } 356 | }, 357 | "node_modules/color-name": { 358 | "version": "1.1.3", 359 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 360 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 361 | "dev": true 362 | }, 363 | "node_modules/component-bind": { 364 | "version": "1.0.0", 365 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 366 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" 367 | }, 368 | "node_modules/component-emitter": { 369 | "version": "1.3.0", 370 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 371 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 372 | }, 373 | "node_modules/component-inherit": { 374 | "version": "0.0.3", 375 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 376 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" 377 | }, 378 | "node_modules/concat-map": { 379 | "version": "0.0.1", 380 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 381 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 382 | "dev": true 383 | }, 384 | "node_modules/content-disposition": { 385 | "version": "0.5.4", 386 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 387 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 388 | "dependencies": { 389 | "safe-buffer": "5.2.1" 390 | }, 391 | "engines": { 392 | "node": ">= 0.6" 393 | } 394 | }, 395 | "node_modules/content-type": { 396 | "version": "1.0.4", 397 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 398 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 399 | "engines": { 400 | "node": ">= 0.6" 401 | } 402 | }, 403 | "node_modules/cookie": { 404 | "version": "0.4.1", 405 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 406 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 407 | "engines": { 408 | "node": ">= 0.6" 409 | } 410 | }, 411 | "node_modules/cookie-signature": { 412 | "version": "1.0.6", 413 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 414 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 415 | }, 416 | "node_modules/cross-spawn": { 417 | "version": "6.0.5", 418 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 419 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 420 | "dev": true, 421 | "dependencies": { 422 | "nice-try": "^1.0.4", 423 | "path-key": "^2.0.1", 424 | "semver": "^5.5.0", 425 | "shebang-command": "^1.2.0", 426 | "which": "^1.2.9" 427 | }, 428 | "engines": { 429 | "node": ">=4.8" 430 | } 431 | }, 432 | "node_modules/debug": { 433 | "version": "4.3.3", 434 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 435 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 436 | "dev": true, 437 | "dependencies": { 438 | "ms": "2.1.2" 439 | }, 440 | "engines": { 441 | "node": ">=6.0" 442 | }, 443 | "peerDependenciesMeta": { 444 | "supports-color": { 445 | "optional": true 446 | } 447 | } 448 | }, 449 | "node_modules/decamelize": { 450 | "version": "1.2.0", 451 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 452 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 453 | "engines": { 454 | "node": ">=0.10.0" 455 | } 456 | }, 457 | "node_modules/deep-is": { 458 | "version": "0.1.4", 459 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 460 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 461 | "dev": true 462 | }, 463 | "node_modules/depd": { 464 | "version": "1.1.2", 465 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 466 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 467 | "engines": { 468 | "node": ">= 0.6" 469 | } 470 | }, 471 | "node_modules/destroy": { 472 | "version": "1.0.4", 473 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 474 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 475 | }, 476 | "node_modules/doctrine": { 477 | "version": "3.0.0", 478 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 479 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 480 | "dev": true, 481 | "dependencies": { 482 | "esutils": "^2.0.2" 483 | }, 484 | "engines": { 485 | "node": ">=6.0.0" 486 | } 487 | }, 488 | "node_modules/dom-walk": { 489 | "version": "0.1.2", 490 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", 491 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", 492 | "dev": true 493 | }, 494 | "node_modules/dotenv": { 495 | "version": "8.6.0", 496 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", 497 | "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", 498 | "engines": { 499 | "node": ">=10" 500 | } 501 | }, 502 | "node_modules/ee-first": { 503 | "version": "1.1.1", 504 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 505 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 506 | }, 507 | "node_modules/emoji-regex": { 508 | "version": "7.0.3", 509 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 510 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 511 | "dev": true 512 | }, 513 | "node_modules/encodeurl": { 514 | "version": "1.0.2", 515 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 516 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 517 | "engines": { 518 | "node": ">= 0.8" 519 | } 520 | }, 521 | "node_modules/engine.io": { 522 | "version": "3.5.0", 523 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", 524 | "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", 525 | "dependencies": { 526 | "accepts": "~1.3.4", 527 | "base64id": "2.0.0", 528 | "cookie": "~0.4.1", 529 | "debug": "~4.1.0", 530 | "engine.io-parser": "~2.2.0", 531 | "ws": "~7.4.2" 532 | }, 533 | "engines": { 534 | "node": ">=8.0.0" 535 | } 536 | }, 537 | "node_modules/engine.io-client": { 538 | "version": "3.5.2", 539 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", 540 | "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", 541 | "dependencies": { 542 | "component-emitter": "~1.3.0", 543 | "component-inherit": "0.0.3", 544 | "debug": "~3.1.0", 545 | "engine.io-parser": "~2.2.0", 546 | "has-cors": "1.1.0", 547 | "indexof": "0.0.1", 548 | "parseqs": "0.0.6", 549 | "parseuri": "0.0.6", 550 | "ws": "~7.4.2", 551 | "xmlhttprequest-ssl": "~1.6.2", 552 | "yeast": "0.1.2" 553 | } 554 | }, 555 | "node_modules/engine.io-client/node_modules/debug": { 556 | "version": "3.1.0", 557 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 558 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 559 | "dependencies": { 560 | "ms": "2.0.0" 561 | } 562 | }, 563 | "node_modules/engine.io-client/node_modules/ms": { 564 | "version": "2.0.0", 565 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 566 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 567 | }, 568 | "node_modules/engine.io-parser": { 569 | "version": "2.2.1", 570 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", 571 | "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", 572 | "dependencies": { 573 | "after": "0.8.2", 574 | "arraybuffer.slice": "~0.0.7", 575 | "base64-arraybuffer": "0.1.4", 576 | "blob": "0.0.5", 577 | "has-binary2": "~1.0.2" 578 | } 579 | }, 580 | "node_modules/engine.io/node_modules/debug": { 581 | "version": "4.1.1", 582 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 583 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 584 | "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", 585 | "dependencies": { 586 | "ms": "^2.1.1" 587 | } 588 | }, 589 | "node_modules/escape-html": { 590 | "version": "1.0.3", 591 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 592 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 593 | }, 594 | "node_modules/escape-string-regexp": { 595 | "version": "1.0.5", 596 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 597 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 598 | "dev": true, 599 | "engines": { 600 | "node": ">=0.8.0" 601 | } 602 | }, 603 | "node_modules/eslint": { 604 | "version": "5.16.0", 605 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 606 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 607 | "dev": true, 608 | "dependencies": { 609 | "@babel/code-frame": "^7.0.0", 610 | "ajv": "^6.9.1", 611 | "chalk": "^2.1.0", 612 | "cross-spawn": "^6.0.5", 613 | "debug": "^4.0.1", 614 | "doctrine": "^3.0.0", 615 | "eslint-scope": "^4.0.3", 616 | "eslint-utils": "^1.3.1", 617 | "eslint-visitor-keys": "^1.0.0", 618 | "espree": "^5.0.1", 619 | "esquery": "^1.0.1", 620 | "esutils": "^2.0.2", 621 | "file-entry-cache": "^5.0.1", 622 | "functional-red-black-tree": "^1.0.1", 623 | "glob": "^7.1.2", 624 | "globals": "^11.7.0", 625 | "ignore": "^4.0.6", 626 | "import-fresh": "^3.0.0", 627 | "imurmurhash": "^0.1.4", 628 | "inquirer": "^6.2.2", 629 | "js-yaml": "^3.13.0", 630 | "json-stable-stringify-without-jsonify": "^1.0.1", 631 | "levn": "^0.3.0", 632 | "lodash": "^4.17.11", 633 | "minimatch": "^3.0.4", 634 | "mkdirp": "^0.5.1", 635 | "natural-compare": "^1.4.0", 636 | "optionator": "^0.8.2", 637 | "path-is-inside": "^1.0.2", 638 | "progress": "^2.0.0", 639 | "regexpp": "^2.0.1", 640 | "semver": "^5.5.1", 641 | "strip-ansi": "^4.0.0", 642 | "strip-json-comments": "^2.0.1", 643 | "table": "^5.2.3", 644 | "text-table": "^0.2.0" 645 | }, 646 | "bin": { 647 | "eslint": "bin/eslint.js" 648 | }, 649 | "engines": { 650 | "node": "^6.14.0 || ^8.10.0 || >=9.10.0" 651 | } 652 | }, 653 | "node_modules/eslint-scope": { 654 | "version": "4.0.3", 655 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 656 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 657 | "dev": true, 658 | "dependencies": { 659 | "esrecurse": "^4.1.0", 660 | "estraverse": "^4.1.1" 661 | }, 662 | "engines": { 663 | "node": ">=4.0.0" 664 | } 665 | }, 666 | "node_modules/eslint-utils": { 667 | "version": "1.4.3", 668 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 669 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 670 | "dev": true, 671 | "dependencies": { 672 | "eslint-visitor-keys": "^1.1.0" 673 | }, 674 | "engines": { 675 | "node": ">=6" 676 | } 677 | }, 678 | "node_modules/eslint-visitor-keys": { 679 | "version": "1.3.0", 680 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 681 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 682 | "dev": true, 683 | "engines": { 684 | "node": ">=4" 685 | } 686 | }, 687 | "node_modules/espree": { 688 | "version": "5.0.1", 689 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 690 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 691 | "dev": true, 692 | "dependencies": { 693 | "acorn": "^6.0.7", 694 | "acorn-jsx": "^5.0.0", 695 | "eslint-visitor-keys": "^1.0.0" 696 | }, 697 | "engines": { 698 | "node": ">=6.0.0" 699 | } 700 | }, 701 | "node_modules/esprima": { 702 | "version": "4.0.1", 703 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 704 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 705 | "dev": true, 706 | "bin": { 707 | "esparse": "bin/esparse.js", 708 | "esvalidate": "bin/esvalidate.js" 709 | }, 710 | "engines": { 711 | "node": ">=4" 712 | } 713 | }, 714 | "node_modules/esquery": { 715 | "version": "1.4.0", 716 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 717 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 718 | "dev": true, 719 | "dependencies": { 720 | "estraverse": "^5.1.0" 721 | }, 722 | "engines": { 723 | "node": ">=0.10" 724 | } 725 | }, 726 | "node_modules/esquery/node_modules/estraverse": { 727 | "version": "5.3.0", 728 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 729 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 730 | "dev": true, 731 | "engines": { 732 | "node": ">=4.0" 733 | } 734 | }, 735 | "node_modules/esrecurse": { 736 | "version": "4.3.0", 737 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 738 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 739 | "dev": true, 740 | "dependencies": { 741 | "estraverse": "^5.2.0" 742 | }, 743 | "engines": { 744 | "node": ">=4.0" 745 | } 746 | }, 747 | "node_modules/esrecurse/node_modules/estraverse": { 748 | "version": "5.3.0", 749 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 750 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 751 | "dev": true, 752 | "engines": { 753 | "node": ">=4.0" 754 | } 755 | }, 756 | "node_modules/estraverse": { 757 | "version": "4.3.0", 758 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 759 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 760 | "dev": true, 761 | "engines": { 762 | "node": ">=4.0" 763 | } 764 | }, 765 | "node_modules/esutils": { 766 | "version": "2.0.3", 767 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 768 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 769 | "dev": true, 770 | "engines": { 771 | "node": ">=0.10.0" 772 | } 773 | }, 774 | "node_modules/etag": { 775 | "version": "1.8.1", 776 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 777 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 778 | "engines": { 779 | "node": ">= 0.6" 780 | } 781 | }, 782 | "node_modules/express": { 783 | "version": "4.17.2", 784 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 785 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 786 | "dependencies": { 787 | "accepts": "~1.3.7", 788 | "array-flatten": "1.1.1", 789 | "body-parser": "1.19.1", 790 | "content-disposition": "0.5.4", 791 | "content-type": "~1.0.4", 792 | "cookie": "0.4.1", 793 | "cookie-signature": "1.0.6", 794 | "debug": "2.6.9", 795 | "depd": "~1.1.2", 796 | "encodeurl": "~1.0.2", 797 | "escape-html": "~1.0.3", 798 | "etag": "~1.8.1", 799 | "finalhandler": "~1.1.2", 800 | "fresh": "0.5.2", 801 | "merge-descriptors": "1.0.1", 802 | "methods": "~1.1.2", 803 | "on-finished": "~2.3.0", 804 | "parseurl": "~1.3.3", 805 | "path-to-regexp": "0.1.7", 806 | "proxy-addr": "~2.0.7", 807 | "qs": "6.9.6", 808 | "range-parser": "~1.2.1", 809 | "safe-buffer": "5.2.1", 810 | "send": "0.17.2", 811 | "serve-static": "1.14.2", 812 | "setprototypeof": "1.2.0", 813 | "statuses": "~1.5.0", 814 | "type-is": "~1.6.18", 815 | "utils-merge": "1.0.1", 816 | "vary": "~1.1.2" 817 | }, 818 | "engines": { 819 | "node": ">= 0.10.0" 820 | } 821 | }, 822 | "node_modules/express/node_modules/debug": { 823 | "version": "2.6.9", 824 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 825 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 826 | "dependencies": { 827 | "ms": "2.0.0" 828 | } 829 | }, 830 | "node_modules/express/node_modules/ms": { 831 | "version": "2.0.0", 832 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 833 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 834 | }, 835 | "node_modules/external-editor": { 836 | "version": "3.1.0", 837 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 838 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 839 | "dev": true, 840 | "dependencies": { 841 | "chardet": "^0.7.0", 842 | "iconv-lite": "^0.4.24", 843 | "tmp": "^0.0.33" 844 | }, 845 | "engines": { 846 | "node": ">=4" 847 | } 848 | }, 849 | "node_modules/fast-deep-equal": { 850 | "version": "3.1.3", 851 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 852 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 853 | "dev": true 854 | }, 855 | "node_modules/fast-json-stable-stringify": { 856 | "version": "2.1.0", 857 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 858 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 859 | "dev": true 860 | }, 861 | "node_modules/fast-levenshtein": { 862 | "version": "2.0.6", 863 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 864 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 865 | "dev": true 866 | }, 867 | "node_modules/figures": { 868 | "version": "2.0.0", 869 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 870 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 871 | "dev": true, 872 | "dependencies": { 873 | "escape-string-regexp": "^1.0.5" 874 | }, 875 | "engines": { 876 | "node": ">=4" 877 | } 878 | }, 879 | "node_modules/file-entry-cache": { 880 | "version": "5.0.1", 881 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 882 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 883 | "dev": true, 884 | "dependencies": { 885 | "flat-cache": "^2.0.1" 886 | }, 887 | "engines": { 888 | "node": ">=4" 889 | } 890 | }, 891 | "node_modules/finalhandler": { 892 | "version": "1.1.2", 893 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 894 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 895 | "dependencies": { 896 | "debug": "2.6.9", 897 | "encodeurl": "~1.0.2", 898 | "escape-html": "~1.0.3", 899 | "on-finished": "~2.3.0", 900 | "parseurl": "~1.3.3", 901 | "statuses": "~1.5.0", 902 | "unpipe": "~1.0.0" 903 | }, 904 | "engines": { 905 | "node": ">= 0.8" 906 | } 907 | }, 908 | "node_modules/finalhandler/node_modules/debug": { 909 | "version": "2.6.9", 910 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 911 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 912 | "dependencies": { 913 | "ms": "2.0.0" 914 | } 915 | }, 916 | "node_modules/finalhandler/node_modules/ms": { 917 | "version": "2.0.0", 918 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 919 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 920 | }, 921 | "node_modules/flat-cache": { 922 | "version": "2.0.1", 923 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 924 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 925 | "dev": true, 926 | "dependencies": { 927 | "flatted": "^2.0.0", 928 | "rimraf": "2.6.3", 929 | "write": "1.0.3" 930 | }, 931 | "engines": { 932 | "node": ">=4" 933 | } 934 | }, 935 | "node_modules/flatted": { 936 | "version": "2.0.2", 937 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 938 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 939 | "dev": true 940 | }, 941 | "node_modules/forwarded": { 942 | "version": "0.2.0", 943 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 944 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 945 | "engines": { 946 | "node": ">= 0.6" 947 | } 948 | }, 949 | "node_modules/fresh": { 950 | "version": "0.5.2", 951 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 952 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 953 | "engines": { 954 | "node": ">= 0.6" 955 | } 956 | }, 957 | "node_modules/fs.realpath": { 958 | "version": "1.0.0", 959 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 960 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 961 | "dev": true 962 | }, 963 | "node_modules/fscreen": { 964 | "version": "1.2.0", 965 | "resolved": "https://registry.npmjs.org/fscreen/-/fscreen-1.2.0.tgz", 966 | "integrity": "sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg==" 967 | }, 968 | "node_modules/functional-red-black-tree": { 969 | "version": "1.0.1", 970 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 971 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 972 | "dev": true 973 | }, 974 | "node_modules/glob": { 975 | "version": "7.2.0", 976 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 977 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 978 | "dev": true, 979 | "dependencies": { 980 | "fs.realpath": "^1.0.0", 981 | "inflight": "^1.0.4", 982 | "inherits": "2", 983 | "minimatch": "^3.0.4", 984 | "once": "^1.3.0", 985 | "path-is-absolute": "^1.0.0" 986 | }, 987 | "engines": { 988 | "node": "*" 989 | }, 990 | "funding": { 991 | "url": "https://github.com/sponsors/isaacs" 992 | } 993 | }, 994 | "node_modules/global": { 995 | "version": "4.4.0", 996 | "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", 997 | "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", 998 | "dev": true, 999 | "dependencies": { 1000 | "min-document": "^2.19.0", 1001 | "process": "^0.11.10" 1002 | } 1003 | }, 1004 | "node_modules/globals": { 1005 | "version": "11.12.0", 1006 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1007 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1008 | "dev": true, 1009 | "engines": { 1010 | "node": ">=4" 1011 | } 1012 | }, 1013 | "node_modules/has-binary2": { 1014 | "version": "1.0.3", 1015 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 1016 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 1017 | "dependencies": { 1018 | "isarray": "2.0.1" 1019 | } 1020 | }, 1021 | "node_modules/has-cors": { 1022 | "version": "1.1.0", 1023 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 1024 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 1025 | }, 1026 | "node_modules/has-flag": { 1027 | "version": "3.0.0", 1028 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1029 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1030 | "dev": true, 1031 | "engines": { 1032 | "node": ">=4" 1033 | } 1034 | }, 1035 | "node_modules/http-errors": { 1036 | "version": "1.8.1", 1037 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 1038 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 1039 | "dependencies": { 1040 | "depd": "~1.1.2", 1041 | "inherits": "2.0.4", 1042 | "setprototypeof": "1.2.0", 1043 | "statuses": ">= 1.5.0 < 2", 1044 | "toidentifier": "1.0.1" 1045 | }, 1046 | "engines": { 1047 | "node": ">= 0.6" 1048 | } 1049 | }, 1050 | "node_modules/iconv-lite": { 1051 | "version": "0.4.24", 1052 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1053 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1054 | "dependencies": { 1055 | "safer-buffer": ">= 2.1.2 < 3" 1056 | }, 1057 | "engines": { 1058 | "node": ">=0.10.0" 1059 | } 1060 | }, 1061 | "node_modules/ignore": { 1062 | "version": "4.0.6", 1063 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1064 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1065 | "dev": true, 1066 | "engines": { 1067 | "node": ">= 4" 1068 | } 1069 | }, 1070 | "node_modules/import-fresh": { 1071 | "version": "3.3.0", 1072 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1073 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1074 | "dev": true, 1075 | "dependencies": { 1076 | "parent-module": "^1.0.0", 1077 | "resolve-from": "^4.0.0" 1078 | }, 1079 | "engines": { 1080 | "node": ">=6" 1081 | }, 1082 | "funding": { 1083 | "url": "https://github.com/sponsors/sindresorhus" 1084 | } 1085 | }, 1086 | "node_modules/imurmurhash": { 1087 | "version": "0.1.4", 1088 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1089 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1090 | "dev": true, 1091 | "engines": { 1092 | "node": ">=0.8.19" 1093 | } 1094 | }, 1095 | "node_modules/indexof": { 1096 | "version": "0.0.1", 1097 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 1098 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" 1099 | }, 1100 | "node_modules/inflight": { 1101 | "version": "1.0.6", 1102 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1103 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1104 | "dev": true, 1105 | "dependencies": { 1106 | "once": "^1.3.0", 1107 | "wrappy": "1" 1108 | } 1109 | }, 1110 | "node_modules/inherits": { 1111 | "version": "2.0.4", 1112 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1113 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1114 | }, 1115 | "node_modules/inquirer": { 1116 | "version": "6.5.2", 1117 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 1118 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 1119 | "dev": true, 1120 | "dependencies": { 1121 | "ansi-escapes": "^3.2.0", 1122 | "chalk": "^2.4.2", 1123 | "cli-cursor": "^2.1.0", 1124 | "cli-width": "^2.0.0", 1125 | "external-editor": "^3.0.3", 1126 | "figures": "^2.0.0", 1127 | "lodash": "^4.17.12", 1128 | "mute-stream": "0.0.7", 1129 | "run-async": "^2.2.0", 1130 | "rxjs": "^6.4.0", 1131 | "string-width": "^2.1.0", 1132 | "strip-ansi": "^5.1.0", 1133 | "through": "^2.3.6" 1134 | }, 1135 | "engines": { 1136 | "node": ">=6.0.0" 1137 | } 1138 | }, 1139 | "node_modules/inquirer/node_modules/ansi-regex": { 1140 | "version": "4.1.0", 1141 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1142 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1143 | "dev": true, 1144 | "engines": { 1145 | "node": ">=6" 1146 | } 1147 | }, 1148 | "node_modules/inquirer/node_modules/strip-ansi": { 1149 | "version": "5.2.0", 1150 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1151 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1152 | "dev": true, 1153 | "dependencies": { 1154 | "ansi-regex": "^4.1.0" 1155 | }, 1156 | "engines": { 1157 | "node": ">=6" 1158 | } 1159 | }, 1160 | "node_modules/ip": { 1161 | "version": "1.1.5", 1162 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 1163 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 1164 | }, 1165 | "node_modules/ipaddr.js": { 1166 | "version": "1.9.1", 1167 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1168 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1169 | "engines": { 1170 | "node": ">= 0.10" 1171 | } 1172 | }, 1173 | "node_modules/is-fullwidth-code-point": { 1174 | "version": "2.0.0", 1175 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1176 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1177 | "dev": true, 1178 | "engines": { 1179 | "node": ">=4" 1180 | } 1181 | }, 1182 | "node_modules/isarray": { 1183 | "version": "2.0.1", 1184 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 1185 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 1186 | }, 1187 | "node_modules/isexe": { 1188 | "version": "2.0.0", 1189 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1190 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1191 | "dev": true 1192 | }, 1193 | "node_modules/js-tokens": { 1194 | "version": "4.0.0", 1195 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1196 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1197 | "dev": true 1198 | }, 1199 | "node_modules/js-yaml": { 1200 | "version": "3.14.1", 1201 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1202 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1203 | "dev": true, 1204 | "dependencies": { 1205 | "argparse": "^1.0.7", 1206 | "esprima": "^4.0.0" 1207 | }, 1208 | "bin": { 1209 | "js-yaml": "bin/js-yaml.js" 1210 | } 1211 | }, 1212 | "node_modules/json-schema-traverse": { 1213 | "version": "0.4.1", 1214 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1215 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1216 | "dev": true 1217 | }, 1218 | "node_modules/json-stable-stringify-without-jsonify": { 1219 | "version": "1.0.1", 1220 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1221 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1222 | "dev": true 1223 | }, 1224 | "node_modules/levn": { 1225 | "version": "0.3.0", 1226 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1227 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1228 | "dev": true, 1229 | "dependencies": { 1230 | "prelude-ls": "~1.1.2", 1231 | "type-check": "~0.3.2" 1232 | }, 1233 | "engines": { 1234 | "node": ">= 0.8.0" 1235 | } 1236 | }, 1237 | "node_modules/lodash": { 1238 | "version": "4.17.21", 1239 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1240 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1241 | "dev": true 1242 | }, 1243 | "node_modules/m3u8-parser": { 1244 | "version": "4.7.0", 1245 | "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-4.7.0.tgz", 1246 | "integrity": "sha512-48l/OwRyjBm+QhNNigEEcRcgbRvnUjL7rxs597HmW9QSNbyNvt+RcZ9T/d9vxi9A9z7EZrB1POtZYhdRlwYQkQ==", 1247 | "dev": true, 1248 | "dependencies": { 1249 | "@babel/runtime": "^7.12.5", 1250 | "@videojs/vhs-utils": "^3.0.0", 1251 | "global": "^4.4.0" 1252 | } 1253 | }, 1254 | "node_modules/media-typer": { 1255 | "version": "0.3.0", 1256 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1257 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 1258 | "engines": { 1259 | "node": ">= 0.6" 1260 | } 1261 | }, 1262 | "node_modules/merge-descriptors": { 1263 | "version": "1.0.1", 1264 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1265 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1266 | }, 1267 | "node_modules/methods": { 1268 | "version": "1.1.2", 1269 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1270 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 1271 | "engines": { 1272 | "node": ">= 0.6" 1273 | } 1274 | }, 1275 | "node_modules/mime": { 1276 | "version": "1.6.0", 1277 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1278 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1279 | "bin": { 1280 | "mime": "cli.js" 1281 | }, 1282 | "engines": { 1283 | "node": ">=4" 1284 | } 1285 | }, 1286 | "node_modules/mime-db": { 1287 | "version": "1.51.0", 1288 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 1289 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 1290 | "engines": { 1291 | "node": ">= 0.6" 1292 | } 1293 | }, 1294 | "node_modules/mime-types": { 1295 | "version": "2.1.34", 1296 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 1297 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 1298 | "dependencies": { 1299 | "mime-db": "1.51.0" 1300 | }, 1301 | "engines": { 1302 | "node": ">= 0.6" 1303 | } 1304 | }, 1305 | "node_modules/mimic-fn": { 1306 | "version": "1.2.0", 1307 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1308 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1309 | "dev": true, 1310 | "engines": { 1311 | "node": ">=4" 1312 | } 1313 | }, 1314 | "node_modules/min-document": { 1315 | "version": "2.19.0", 1316 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 1317 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 1318 | "dev": true, 1319 | "dependencies": { 1320 | "dom-walk": "^0.1.0" 1321 | } 1322 | }, 1323 | "node_modules/minimatch": { 1324 | "version": "3.0.4", 1325 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1326 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1327 | "dev": true, 1328 | "dependencies": { 1329 | "brace-expansion": "^1.1.7" 1330 | }, 1331 | "engines": { 1332 | "node": "*" 1333 | } 1334 | }, 1335 | "node_modules/minimist": { 1336 | "version": "1.2.5", 1337 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1338 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1339 | "dev": true 1340 | }, 1341 | "node_modules/mkdirp": { 1342 | "version": "0.5.5", 1343 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1344 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1345 | "dev": true, 1346 | "dependencies": { 1347 | "minimist": "^1.2.5" 1348 | }, 1349 | "bin": { 1350 | "mkdirp": "bin/cmd.js" 1351 | } 1352 | }, 1353 | "node_modules/ms": { 1354 | "version": "2.1.2", 1355 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1356 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1357 | }, 1358 | "node_modules/mute-stream": { 1359 | "version": "0.0.7", 1360 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1361 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1362 | "dev": true 1363 | }, 1364 | "node_modules/natural-compare": { 1365 | "version": "1.4.0", 1366 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1367 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1368 | "dev": true 1369 | }, 1370 | "node_modules/negotiator": { 1371 | "version": "0.6.2", 1372 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1373 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 1374 | "engines": { 1375 | "node": ">= 0.6" 1376 | } 1377 | }, 1378 | "node_modules/nice-try": { 1379 | "version": "1.0.5", 1380 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1381 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1382 | "dev": true 1383 | }, 1384 | "node_modules/on-finished": { 1385 | "version": "2.3.0", 1386 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1387 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1388 | "dependencies": { 1389 | "ee-first": "1.1.1" 1390 | }, 1391 | "engines": { 1392 | "node": ">= 0.8" 1393 | } 1394 | }, 1395 | "node_modules/once": { 1396 | "version": "1.4.0", 1397 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1398 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1399 | "dev": true, 1400 | "dependencies": { 1401 | "wrappy": "1" 1402 | } 1403 | }, 1404 | "node_modules/onetime": { 1405 | "version": "2.0.1", 1406 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1407 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1408 | "dev": true, 1409 | "dependencies": { 1410 | "mimic-fn": "^1.0.0" 1411 | }, 1412 | "engines": { 1413 | "node": ">=4" 1414 | } 1415 | }, 1416 | "node_modules/optionator": { 1417 | "version": "0.8.3", 1418 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1419 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1420 | "dev": true, 1421 | "dependencies": { 1422 | "deep-is": "~0.1.3", 1423 | "fast-levenshtein": "~2.0.6", 1424 | "levn": "~0.3.0", 1425 | "prelude-ls": "~1.1.2", 1426 | "type-check": "~0.3.2", 1427 | "word-wrap": "~1.2.3" 1428 | }, 1429 | "engines": { 1430 | "node": ">= 0.8.0" 1431 | } 1432 | }, 1433 | "node_modules/os-tmpdir": { 1434 | "version": "1.0.2", 1435 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1436 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1437 | "dev": true, 1438 | "engines": { 1439 | "node": ">=0.10.0" 1440 | } 1441 | }, 1442 | "node_modules/parent-module": { 1443 | "version": "1.0.1", 1444 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1445 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1446 | "dev": true, 1447 | "dependencies": { 1448 | "callsites": "^3.0.0" 1449 | }, 1450 | "engines": { 1451 | "node": ">=6" 1452 | } 1453 | }, 1454 | "node_modules/parseqs": { 1455 | "version": "0.0.6", 1456 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", 1457 | "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" 1458 | }, 1459 | "node_modules/parseuri": { 1460 | "version": "0.0.6", 1461 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", 1462 | "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" 1463 | }, 1464 | "node_modules/parseurl": { 1465 | "version": "1.3.3", 1466 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1467 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1468 | "engines": { 1469 | "node": ">= 0.8" 1470 | } 1471 | }, 1472 | "node_modules/path-is-absolute": { 1473 | "version": "1.0.1", 1474 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1475 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1476 | "dev": true, 1477 | "engines": { 1478 | "node": ">=0.10.0" 1479 | } 1480 | }, 1481 | "node_modules/path-is-inside": { 1482 | "version": "1.0.2", 1483 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1484 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1485 | "dev": true 1486 | }, 1487 | "node_modules/path-key": { 1488 | "version": "2.0.1", 1489 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1490 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1491 | "dev": true, 1492 | "engines": { 1493 | "node": ">=4" 1494 | } 1495 | }, 1496 | "node_modules/path-to-regexp": { 1497 | "version": "0.1.7", 1498 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1499 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1500 | }, 1501 | "node_modules/prelude-ls": { 1502 | "version": "1.1.2", 1503 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1504 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1505 | "dev": true, 1506 | "engines": { 1507 | "node": ">= 0.8.0" 1508 | } 1509 | }, 1510 | "node_modules/process": { 1511 | "version": "0.11.10", 1512 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1513 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 1514 | "dev": true, 1515 | "engines": { 1516 | "node": ">= 0.6.0" 1517 | } 1518 | }, 1519 | "node_modules/progress": { 1520 | "version": "2.0.3", 1521 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1522 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1523 | "dev": true, 1524 | "engines": { 1525 | "node": ">=0.4.0" 1526 | } 1527 | }, 1528 | "node_modules/proxy-addr": { 1529 | "version": "2.0.7", 1530 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1531 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1532 | "dependencies": { 1533 | "forwarded": "0.2.0", 1534 | "ipaddr.js": "1.9.1" 1535 | }, 1536 | "engines": { 1537 | "node": ">= 0.10" 1538 | } 1539 | }, 1540 | "node_modules/punycode": { 1541 | "version": "2.1.1", 1542 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1543 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1544 | "dev": true, 1545 | "engines": { 1546 | "node": ">=6" 1547 | } 1548 | }, 1549 | "node_modules/qs": { 1550 | "version": "6.9.6", 1551 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 1552 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", 1553 | "engines": { 1554 | "node": ">=0.6" 1555 | }, 1556 | "funding": { 1557 | "url": "https://github.com/sponsors/ljharb" 1558 | } 1559 | }, 1560 | "node_modules/range-parser": { 1561 | "version": "1.2.1", 1562 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1563 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1564 | "engines": { 1565 | "node": ">= 0.6" 1566 | } 1567 | }, 1568 | "node_modules/raw-body": { 1569 | "version": "2.4.2", 1570 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 1571 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 1572 | "dependencies": { 1573 | "bytes": "3.1.1", 1574 | "http-errors": "1.8.1", 1575 | "iconv-lite": "0.4.24", 1576 | "unpipe": "1.0.0" 1577 | }, 1578 | "engines": { 1579 | "node": ">= 0.8" 1580 | } 1581 | }, 1582 | "node_modules/regenerator-runtime": { 1583 | "version": "0.13.9", 1584 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 1585 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", 1586 | "dev": true 1587 | }, 1588 | "node_modules/regexpp": { 1589 | "version": "2.0.1", 1590 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1591 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1592 | "dev": true, 1593 | "engines": { 1594 | "node": ">=6.5.0" 1595 | } 1596 | }, 1597 | "node_modules/resolve-from": { 1598 | "version": "4.0.0", 1599 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1600 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1601 | "dev": true, 1602 | "engines": { 1603 | "node": ">=4" 1604 | } 1605 | }, 1606 | "node_modules/restore-cursor": { 1607 | "version": "2.0.0", 1608 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1609 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1610 | "dev": true, 1611 | "dependencies": { 1612 | "onetime": "^2.0.0", 1613 | "signal-exit": "^3.0.2" 1614 | }, 1615 | "engines": { 1616 | "node": ">=4" 1617 | } 1618 | }, 1619 | "node_modules/rimraf": { 1620 | "version": "2.6.3", 1621 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1622 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1623 | "dev": true, 1624 | "dependencies": { 1625 | "glob": "^7.1.3" 1626 | }, 1627 | "bin": { 1628 | "rimraf": "bin.js" 1629 | } 1630 | }, 1631 | "node_modules/run-async": { 1632 | "version": "2.4.1", 1633 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1634 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1635 | "dev": true, 1636 | "engines": { 1637 | "node": ">=0.12.0" 1638 | } 1639 | }, 1640 | "node_modules/rxjs": { 1641 | "version": "6.6.7", 1642 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 1643 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 1644 | "dev": true, 1645 | "dependencies": { 1646 | "tslib": "^1.9.0" 1647 | }, 1648 | "engines": { 1649 | "npm": ">=2.0.0" 1650 | } 1651 | }, 1652 | "node_modules/safe-buffer": { 1653 | "version": "5.2.1", 1654 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1655 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1656 | "funding": [ 1657 | { 1658 | "type": "github", 1659 | "url": "https://github.com/sponsors/feross" 1660 | }, 1661 | { 1662 | "type": "patreon", 1663 | "url": "https://www.patreon.com/feross" 1664 | }, 1665 | { 1666 | "type": "consulting", 1667 | "url": "https://feross.org/support" 1668 | } 1669 | ] 1670 | }, 1671 | "node_modules/safer-buffer": { 1672 | "version": "2.1.2", 1673 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1674 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1675 | }, 1676 | "node_modules/semver": { 1677 | "version": "5.7.1", 1678 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1679 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1680 | "dev": true, 1681 | "bin": { 1682 | "semver": "bin/semver" 1683 | } 1684 | }, 1685 | "node_modules/send": { 1686 | "version": "0.17.2", 1687 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 1688 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 1689 | "dependencies": { 1690 | "debug": "2.6.9", 1691 | "depd": "~1.1.2", 1692 | "destroy": "~1.0.4", 1693 | "encodeurl": "~1.0.2", 1694 | "escape-html": "~1.0.3", 1695 | "etag": "~1.8.1", 1696 | "fresh": "0.5.2", 1697 | "http-errors": "1.8.1", 1698 | "mime": "1.6.0", 1699 | "ms": "2.1.3", 1700 | "on-finished": "~2.3.0", 1701 | "range-parser": "~1.2.1", 1702 | "statuses": "~1.5.0" 1703 | }, 1704 | "engines": { 1705 | "node": ">= 0.8.0" 1706 | } 1707 | }, 1708 | "node_modules/send/node_modules/debug": { 1709 | "version": "2.6.9", 1710 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1711 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1712 | "dependencies": { 1713 | "ms": "2.0.0" 1714 | } 1715 | }, 1716 | "node_modules/send/node_modules/debug/node_modules/ms": { 1717 | "version": "2.0.0", 1718 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1719 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1720 | }, 1721 | "node_modules/send/node_modules/ms": { 1722 | "version": "2.1.3", 1723 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1724 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1725 | }, 1726 | "node_modules/serve-static": { 1727 | "version": "1.14.2", 1728 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 1729 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 1730 | "dependencies": { 1731 | "encodeurl": "~1.0.2", 1732 | "escape-html": "~1.0.3", 1733 | "parseurl": "~1.3.3", 1734 | "send": "0.17.2" 1735 | }, 1736 | "engines": { 1737 | "node": ">= 0.8.0" 1738 | } 1739 | }, 1740 | "node_modules/setprototypeof": { 1741 | "version": "1.2.0", 1742 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1743 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1744 | }, 1745 | "node_modules/shebang-command": { 1746 | "version": "1.2.0", 1747 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1748 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1749 | "dev": true, 1750 | "dependencies": { 1751 | "shebang-regex": "^1.0.0" 1752 | }, 1753 | "engines": { 1754 | "node": ">=0.10.0" 1755 | } 1756 | }, 1757 | "node_modules/shebang-regex": { 1758 | "version": "1.0.0", 1759 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1760 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1761 | "dev": true, 1762 | "engines": { 1763 | "node": ">=0.10.0" 1764 | } 1765 | }, 1766 | "node_modules/signal-exit": { 1767 | "version": "3.0.6", 1768 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", 1769 | "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", 1770 | "dev": true 1771 | }, 1772 | "node_modules/slice-ansi": { 1773 | "version": "2.1.0", 1774 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1775 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1776 | "dev": true, 1777 | "dependencies": { 1778 | "ansi-styles": "^3.2.0", 1779 | "astral-regex": "^1.0.0", 1780 | "is-fullwidth-code-point": "^2.0.0" 1781 | }, 1782 | "engines": { 1783 | "node": ">=6" 1784 | } 1785 | }, 1786 | "node_modules/socket.io": { 1787 | "version": "2.4.1", 1788 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", 1789 | "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", 1790 | "dependencies": { 1791 | "debug": "~4.1.0", 1792 | "engine.io": "~3.5.0", 1793 | "has-binary2": "~1.0.2", 1794 | "socket.io-adapter": "~1.1.0", 1795 | "socket.io-client": "2.4.0", 1796 | "socket.io-parser": "~3.4.0" 1797 | } 1798 | }, 1799 | "node_modules/socket.io-adapter": { 1800 | "version": "1.1.2", 1801 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", 1802 | "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" 1803 | }, 1804 | "node_modules/socket.io-client": { 1805 | "version": "2.4.0", 1806 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", 1807 | "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", 1808 | "dependencies": { 1809 | "backo2": "1.0.2", 1810 | "component-bind": "1.0.0", 1811 | "component-emitter": "~1.3.0", 1812 | "debug": "~3.1.0", 1813 | "engine.io-client": "~3.5.0", 1814 | "has-binary2": "~1.0.2", 1815 | "indexof": "0.0.1", 1816 | "parseqs": "0.0.6", 1817 | "parseuri": "0.0.6", 1818 | "socket.io-parser": "~3.3.0", 1819 | "to-array": "0.1.4" 1820 | } 1821 | }, 1822 | "node_modules/socket.io-client/node_modules/debug": { 1823 | "version": "3.1.0", 1824 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1825 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1826 | "dependencies": { 1827 | "ms": "2.0.0" 1828 | } 1829 | }, 1830 | "node_modules/socket.io-client/node_modules/ms": { 1831 | "version": "2.0.0", 1832 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1833 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1834 | }, 1835 | "node_modules/socket.io-client/node_modules/socket.io-parser": { 1836 | "version": "3.3.2", 1837 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", 1838 | "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", 1839 | "dependencies": { 1840 | "component-emitter": "~1.3.0", 1841 | "debug": "~3.1.0", 1842 | "isarray": "2.0.1" 1843 | } 1844 | }, 1845 | "node_modules/socket.io-parser": { 1846 | "version": "3.4.1", 1847 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", 1848 | "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", 1849 | "dependencies": { 1850 | "component-emitter": "1.2.1", 1851 | "debug": "~4.1.0", 1852 | "isarray": "2.0.1" 1853 | } 1854 | }, 1855 | "node_modules/socket.io-parser/node_modules/component-emitter": { 1856 | "version": "1.2.1", 1857 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 1858 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 1859 | }, 1860 | "node_modules/socket.io-parser/node_modules/debug": { 1861 | "version": "4.1.1", 1862 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1863 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1864 | "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", 1865 | "dependencies": { 1866 | "ms": "^2.1.1" 1867 | } 1868 | }, 1869 | "node_modules/socket.io/node_modules/debug": { 1870 | "version": "4.1.1", 1871 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1872 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1873 | "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", 1874 | "dependencies": { 1875 | "ms": "^2.1.1" 1876 | } 1877 | }, 1878 | "node_modules/sprintf-js": { 1879 | "version": "1.0.3", 1880 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1881 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1882 | "dev": true 1883 | }, 1884 | "node_modules/statuses": { 1885 | "version": "1.5.0", 1886 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1887 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 1888 | "engines": { 1889 | "node": ">= 0.6" 1890 | } 1891 | }, 1892 | "node_modules/string-width": { 1893 | "version": "2.1.1", 1894 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1895 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1896 | "dev": true, 1897 | "dependencies": { 1898 | "is-fullwidth-code-point": "^2.0.0", 1899 | "strip-ansi": "^4.0.0" 1900 | }, 1901 | "engines": { 1902 | "node": ">=4" 1903 | } 1904 | }, 1905 | "node_modules/strip-ansi": { 1906 | "version": "4.0.0", 1907 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1908 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1909 | "dev": true, 1910 | "dependencies": { 1911 | "ansi-regex": "^3.0.0" 1912 | }, 1913 | "engines": { 1914 | "node": ">=4" 1915 | } 1916 | }, 1917 | "node_modules/strip-json-comments": { 1918 | "version": "2.0.1", 1919 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1920 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1921 | "dev": true, 1922 | "engines": { 1923 | "node": ">=0.10.0" 1924 | } 1925 | }, 1926 | "node_modules/supports-color": { 1927 | "version": "5.5.0", 1928 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1929 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1930 | "dev": true, 1931 | "dependencies": { 1932 | "has-flag": "^3.0.0" 1933 | }, 1934 | "engines": { 1935 | "node": ">=4" 1936 | } 1937 | }, 1938 | "node_modules/table": { 1939 | "version": "5.4.6", 1940 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1941 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1942 | "dev": true, 1943 | "dependencies": { 1944 | "ajv": "^6.10.2", 1945 | "lodash": "^4.17.14", 1946 | "slice-ansi": "^2.1.0", 1947 | "string-width": "^3.0.0" 1948 | }, 1949 | "engines": { 1950 | "node": ">=6.0.0" 1951 | } 1952 | }, 1953 | "node_modules/table/node_modules/ansi-regex": { 1954 | "version": "4.1.0", 1955 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1956 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1957 | "dev": true, 1958 | "engines": { 1959 | "node": ">=6" 1960 | } 1961 | }, 1962 | "node_modules/table/node_modules/string-width": { 1963 | "version": "3.1.0", 1964 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1965 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1966 | "dev": true, 1967 | "dependencies": { 1968 | "emoji-regex": "^7.0.1", 1969 | "is-fullwidth-code-point": "^2.0.0", 1970 | "strip-ansi": "^5.1.0" 1971 | }, 1972 | "engines": { 1973 | "node": ">=6" 1974 | } 1975 | }, 1976 | "node_modules/table/node_modules/strip-ansi": { 1977 | "version": "5.2.0", 1978 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1979 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1980 | "dev": true, 1981 | "dependencies": { 1982 | "ansi-regex": "^4.1.0" 1983 | }, 1984 | "engines": { 1985 | "node": ">=6" 1986 | } 1987 | }, 1988 | "node_modules/text-table": { 1989 | "version": "0.2.0", 1990 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1991 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1992 | "dev": true 1993 | }, 1994 | "node_modules/through": { 1995 | "version": "2.3.8", 1996 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1997 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1998 | "dev": true 1999 | }, 2000 | "node_modules/tmp": { 2001 | "version": "0.0.33", 2002 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2003 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2004 | "dev": true, 2005 | "dependencies": { 2006 | "os-tmpdir": "~1.0.2" 2007 | }, 2008 | "engines": { 2009 | "node": ">=0.6.0" 2010 | } 2011 | }, 2012 | "node_modules/to-array": { 2013 | "version": "0.1.4", 2014 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 2015 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" 2016 | }, 2017 | "node_modules/toidentifier": { 2018 | "version": "1.0.1", 2019 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2020 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2021 | "engines": { 2022 | "node": ">=0.6" 2023 | } 2024 | }, 2025 | "node_modules/tslib": { 2026 | "version": "1.14.1", 2027 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2028 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 2029 | "dev": true 2030 | }, 2031 | "node_modules/type-check": { 2032 | "version": "0.3.2", 2033 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2034 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2035 | "dev": true, 2036 | "dependencies": { 2037 | "prelude-ls": "~1.1.2" 2038 | }, 2039 | "engines": { 2040 | "node": ">= 0.8.0" 2041 | } 2042 | }, 2043 | "node_modules/type-is": { 2044 | "version": "1.6.18", 2045 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2046 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2047 | "dependencies": { 2048 | "media-typer": "0.3.0", 2049 | "mime-types": "~2.1.24" 2050 | }, 2051 | "engines": { 2052 | "node": ">= 0.6" 2053 | } 2054 | }, 2055 | "node_modules/unpipe": { 2056 | "version": "1.0.0", 2057 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2058 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 2059 | "engines": { 2060 | "node": ">= 0.8" 2061 | } 2062 | }, 2063 | "node_modules/uri-js": { 2064 | "version": "4.4.1", 2065 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2066 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2067 | "dev": true, 2068 | "dependencies": { 2069 | "punycode": "^2.1.0" 2070 | } 2071 | }, 2072 | "node_modules/url-toolkit": { 2073 | "version": "2.2.3", 2074 | "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.3.tgz", 2075 | "integrity": "sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ==", 2076 | "dev": true 2077 | }, 2078 | "node_modules/utils-merge": { 2079 | "version": "1.0.1", 2080 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2081 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 2082 | "engines": { 2083 | "node": ">= 0.4.0" 2084 | } 2085 | }, 2086 | "node_modules/vary": { 2087 | "version": "1.1.2", 2088 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2089 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 2090 | "engines": { 2091 | "node": ">= 0.8" 2092 | } 2093 | }, 2094 | "node_modules/vue": { 2095 | "version": "2.6.14", 2096 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz", 2097 | "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==" 2098 | }, 2099 | "node_modules/which": { 2100 | "version": "1.3.1", 2101 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2102 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2103 | "dev": true, 2104 | "dependencies": { 2105 | "isexe": "^2.0.0" 2106 | }, 2107 | "bin": { 2108 | "which": "bin/which" 2109 | } 2110 | }, 2111 | "node_modules/word-wrap": { 2112 | "version": "1.2.3", 2113 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2114 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2115 | "dev": true, 2116 | "engines": { 2117 | "node": ">=0.10.0" 2118 | } 2119 | }, 2120 | "node_modules/wrappy": { 2121 | "version": "1.0.2", 2122 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2123 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2124 | "dev": true 2125 | }, 2126 | "node_modules/write": { 2127 | "version": "1.0.3", 2128 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 2129 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 2130 | "dev": true, 2131 | "dependencies": { 2132 | "mkdirp": "^0.5.1" 2133 | }, 2134 | "engines": { 2135 | "node": ">=4" 2136 | } 2137 | }, 2138 | "node_modules/ws": { 2139 | "version": "7.4.6", 2140 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 2141 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", 2142 | "engines": { 2143 | "node": ">=8.3.0" 2144 | }, 2145 | "peerDependencies": { 2146 | "bufferutil": "^4.0.1", 2147 | "utf-8-validate": "^5.0.2" 2148 | }, 2149 | "peerDependenciesMeta": { 2150 | "bufferutil": { 2151 | "optional": true 2152 | }, 2153 | "utf-8-validate": { 2154 | "optional": true 2155 | } 2156 | } 2157 | }, 2158 | "node_modules/xmlhttprequest-ssl": { 2159 | "version": "1.6.3", 2160 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", 2161 | "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", 2162 | "engines": { 2163 | "node": ">=0.4.0" 2164 | } 2165 | }, 2166 | "node_modules/yargs-parser": { 2167 | "version": "18.1.3", 2168 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 2169 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 2170 | "dependencies": { 2171 | "camelcase": "^5.0.0", 2172 | "decamelize": "^1.2.0" 2173 | }, 2174 | "engines": { 2175 | "node": ">=6" 2176 | } 2177 | }, 2178 | "node_modules/yeast": { 2179 | "version": "0.1.2", 2180 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 2181 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" 2182 | } 2183 | }, 2184 | "dependencies": { 2185 | "@babel/code-frame": { 2186 | "version": "7.16.7", 2187 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 2188 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 2189 | "dev": true, 2190 | "requires": { 2191 | "@babel/highlight": "^7.16.7" 2192 | } 2193 | }, 2194 | "@babel/helper-validator-identifier": { 2195 | "version": "7.16.7", 2196 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 2197 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 2198 | "dev": true 2199 | }, 2200 | "@babel/highlight": { 2201 | "version": "7.16.7", 2202 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", 2203 | "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", 2204 | "dev": true, 2205 | "requires": { 2206 | "@babel/helper-validator-identifier": "^7.16.7", 2207 | "chalk": "^2.0.0", 2208 | "js-tokens": "^4.0.0" 2209 | } 2210 | }, 2211 | "@babel/runtime": { 2212 | "version": "7.16.7", 2213 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", 2214 | "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", 2215 | "dev": true, 2216 | "requires": { 2217 | "regenerator-runtime": "^0.13.4" 2218 | } 2219 | }, 2220 | "@fortawesome/fontawesome-free": { 2221 | "version": "5.15.4", 2222 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", 2223 | "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", 2224 | "dev": true 2225 | }, 2226 | "@videojs/vhs-utils": { 2227 | "version": "3.0.4", 2228 | "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.4.tgz", 2229 | "integrity": "sha512-hui4zOj2I1kLzDgf8QDVxD3IzrwjS/43KiS8IHQO0OeeSsb4pB/lgNt1NG7Dv0wMQfCccUpMVLGcK618s890Yg==", 2230 | "dev": true, 2231 | "requires": { 2232 | "@babel/runtime": "^7.12.5", 2233 | "global": "^4.4.0", 2234 | "url-toolkit": "^2.2.1" 2235 | } 2236 | }, 2237 | "accepts": { 2238 | "version": "1.3.7", 2239 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 2240 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 2241 | "requires": { 2242 | "mime-types": "~2.1.24", 2243 | "negotiator": "0.6.2" 2244 | } 2245 | }, 2246 | "acorn": { 2247 | "version": "6.4.2", 2248 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 2249 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", 2250 | "dev": true 2251 | }, 2252 | "acorn-jsx": { 2253 | "version": "5.3.2", 2254 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 2255 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 2256 | "dev": true, 2257 | "requires": {} 2258 | }, 2259 | "after": { 2260 | "version": "0.8.2", 2261 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 2262 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" 2263 | }, 2264 | "ajv": { 2265 | "version": "6.12.6", 2266 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 2267 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 2268 | "dev": true, 2269 | "requires": { 2270 | "fast-deep-equal": "^3.1.1", 2271 | "fast-json-stable-stringify": "^2.0.0", 2272 | "json-schema-traverse": "^0.4.1", 2273 | "uri-js": "^4.2.2" 2274 | } 2275 | }, 2276 | "ansi-escapes": { 2277 | "version": "3.2.0", 2278 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 2279 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 2280 | "dev": true 2281 | }, 2282 | "ansi-regex": { 2283 | "version": "3.0.0", 2284 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2285 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2286 | "dev": true 2287 | }, 2288 | "ansi-styles": { 2289 | "version": "3.2.1", 2290 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2291 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2292 | "dev": true, 2293 | "requires": { 2294 | "color-convert": "^1.9.0" 2295 | } 2296 | }, 2297 | "argparse": { 2298 | "version": "1.0.10", 2299 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 2300 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 2301 | "dev": true, 2302 | "requires": { 2303 | "sprintf-js": "~1.0.2" 2304 | } 2305 | }, 2306 | "array-flatten": { 2307 | "version": "1.1.1", 2308 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 2309 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 2310 | }, 2311 | "arraybuffer.slice": { 2312 | "version": "0.0.7", 2313 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 2314 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 2315 | }, 2316 | "astral-regex": { 2317 | "version": "1.0.0", 2318 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 2319 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 2320 | "dev": true 2321 | }, 2322 | "backo2": { 2323 | "version": "1.0.2", 2324 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 2325 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 2326 | }, 2327 | "balanced-match": { 2328 | "version": "1.0.2", 2329 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2330 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2331 | "dev": true 2332 | }, 2333 | "base64-arraybuffer": { 2334 | "version": "0.1.4", 2335 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", 2336 | "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" 2337 | }, 2338 | "base64id": { 2339 | "version": "2.0.0", 2340 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 2341 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" 2342 | }, 2343 | "blob": { 2344 | "version": "0.0.5", 2345 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", 2346 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" 2347 | }, 2348 | "body-parser": { 2349 | "version": "1.19.1", 2350 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 2351 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 2352 | "requires": { 2353 | "bytes": "3.1.1", 2354 | "content-type": "~1.0.4", 2355 | "debug": "2.6.9", 2356 | "depd": "~1.1.2", 2357 | "http-errors": "1.8.1", 2358 | "iconv-lite": "0.4.24", 2359 | "on-finished": "~2.3.0", 2360 | "qs": "6.9.6", 2361 | "raw-body": "2.4.2", 2362 | "type-is": "~1.6.18" 2363 | }, 2364 | "dependencies": { 2365 | "debug": { 2366 | "version": "2.6.9", 2367 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2368 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2369 | "requires": { 2370 | "ms": "2.0.0" 2371 | } 2372 | }, 2373 | "ms": { 2374 | "version": "2.0.0", 2375 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2376 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2377 | } 2378 | } 2379 | }, 2380 | "brace-expansion": { 2381 | "version": "1.1.11", 2382 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2383 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2384 | "dev": true, 2385 | "requires": { 2386 | "balanced-match": "^1.0.0", 2387 | "concat-map": "0.0.1" 2388 | } 2389 | }, 2390 | "bytes": { 2391 | "version": "3.1.1", 2392 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 2393 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" 2394 | }, 2395 | "callsites": { 2396 | "version": "3.1.0", 2397 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 2398 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 2399 | "dev": true 2400 | }, 2401 | "camelcase": { 2402 | "version": "5.3.1", 2403 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 2404 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 2405 | }, 2406 | "chalk": { 2407 | "version": "2.4.2", 2408 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2409 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2410 | "dev": true, 2411 | "requires": { 2412 | "ansi-styles": "^3.2.1", 2413 | "escape-string-regexp": "^1.0.5", 2414 | "supports-color": "^5.3.0" 2415 | } 2416 | }, 2417 | "chardet": { 2418 | "version": "0.7.0", 2419 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 2420 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 2421 | "dev": true 2422 | }, 2423 | "cli-cursor": { 2424 | "version": "2.1.0", 2425 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 2426 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 2427 | "dev": true, 2428 | "requires": { 2429 | "restore-cursor": "^2.0.0" 2430 | } 2431 | }, 2432 | "cli-width": { 2433 | "version": "2.2.1", 2434 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 2435 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 2436 | "dev": true 2437 | }, 2438 | "color-convert": { 2439 | "version": "1.9.3", 2440 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2441 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2442 | "dev": true, 2443 | "requires": { 2444 | "color-name": "1.1.3" 2445 | } 2446 | }, 2447 | "color-name": { 2448 | "version": "1.1.3", 2449 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2450 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 2451 | "dev": true 2452 | }, 2453 | "component-bind": { 2454 | "version": "1.0.0", 2455 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 2456 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" 2457 | }, 2458 | "component-emitter": { 2459 | "version": "1.3.0", 2460 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 2461 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 2462 | }, 2463 | "component-inherit": { 2464 | "version": "0.0.3", 2465 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 2466 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" 2467 | }, 2468 | "concat-map": { 2469 | "version": "0.0.1", 2470 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2471 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 2472 | "dev": true 2473 | }, 2474 | "content-disposition": { 2475 | "version": "0.5.4", 2476 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 2477 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 2478 | "requires": { 2479 | "safe-buffer": "5.2.1" 2480 | } 2481 | }, 2482 | "content-type": { 2483 | "version": "1.0.4", 2484 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 2485 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 2486 | }, 2487 | "cookie": { 2488 | "version": "0.4.1", 2489 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 2490 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 2491 | }, 2492 | "cookie-signature": { 2493 | "version": "1.0.6", 2494 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 2495 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 2496 | }, 2497 | "cross-spawn": { 2498 | "version": "6.0.5", 2499 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 2500 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 2501 | "dev": true, 2502 | "requires": { 2503 | "nice-try": "^1.0.4", 2504 | "path-key": "^2.0.1", 2505 | "semver": "^5.5.0", 2506 | "shebang-command": "^1.2.0", 2507 | "which": "^1.2.9" 2508 | } 2509 | }, 2510 | "debug": { 2511 | "version": "4.3.3", 2512 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 2513 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 2514 | "dev": true, 2515 | "requires": { 2516 | "ms": "2.1.2" 2517 | } 2518 | }, 2519 | "decamelize": { 2520 | "version": "1.2.0", 2521 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 2522 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 2523 | }, 2524 | "deep-is": { 2525 | "version": "0.1.4", 2526 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 2527 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 2528 | "dev": true 2529 | }, 2530 | "depd": { 2531 | "version": "1.1.2", 2532 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 2533 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 2534 | }, 2535 | "destroy": { 2536 | "version": "1.0.4", 2537 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 2538 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 2539 | }, 2540 | "doctrine": { 2541 | "version": "3.0.0", 2542 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 2543 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 2544 | "dev": true, 2545 | "requires": { 2546 | "esutils": "^2.0.2" 2547 | } 2548 | }, 2549 | "dom-walk": { 2550 | "version": "0.1.2", 2551 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", 2552 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", 2553 | "dev": true 2554 | }, 2555 | "dotenv": { 2556 | "version": "8.6.0", 2557 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", 2558 | "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" 2559 | }, 2560 | "ee-first": { 2561 | "version": "1.1.1", 2562 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 2563 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 2564 | }, 2565 | "emoji-regex": { 2566 | "version": "7.0.3", 2567 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2568 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2569 | "dev": true 2570 | }, 2571 | "encodeurl": { 2572 | "version": "1.0.2", 2573 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 2574 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 2575 | }, 2576 | "engine.io": { 2577 | "version": "3.5.0", 2578 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", 2579 | "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", 2580 | "requires": { 2581 | "accepts": "~1.3.4", 2582 | "base64id": "2.0.0", 2583 | "cookie": "~0.4.1", 2584 | "debug": "~4.1.0", 2585 | "engine.io-parser": "~2.2.0", 2586 | "ws": "~7.4.2" 2587 | }, 2588 | "dependencies": { 2589 | "debug": { 2590 | "version": "4.1.1", 2591 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 2592 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 2593 | "requires": { 2594 | "ms": "^2.1.1" 2595 | } 2596 | } 2597 | } 2598 | }, 2599 | "engine.io-client": { 2600 | "version": "3.5.2", 2601 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", 2602 | "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", 2603 | "requires": { 2604 | "component-emitter": "~1.3.0", 2605 | "component-inherit": "0.0.3", 2606 | "debug": "~3.1.0", 2607 | "engine.io-parser": "~2.2.0", 2608 | "has-cors": "1.1.0", 2609 | "indexof": "0.0.1", 2610 | "parseqs": "0.0.6", 2611 | "parseuri": "0.0.6", 2612 | "ws": "~7.4.2", 2613 | "xmlhttprequest-ssl": "~1.6.2", 2614 | "yeast": "0.1.2" 2615 | }, 2616 | "dependencies": { 2617 | "debug": { 2618 | "version": "3.1.0", 2619 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 2620 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2621 | "requires": { 2622 | "ms": "2.0.0" 2623 | } 2624 | }, 2625 | "ms": { 2626 | "version": "2.0.0", 2627 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2628 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2629 | } 2630 | } 2631 | }, 2632 | "engine.io-parser": { 2633 | "version": "2.2.1", 2634 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", 2635 | "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", 2636 | "requires": { 2637 | "after": "0.8.2", 2638 | "arraybuffer.slice": "~0.0.7", 2639 | "base64-arraybuffer": "0.1.4", 2640 | "blob": "0.0.5", 2641 | "has-binary2": "~1.0.2" 2642 | } 2643 | }, 2644 | "escape-html": { 2645 | "version": "1.0.3", 2646 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 2647 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 2648 | }, 2649 | "escape-string-regexp": { 2650 | "version": "1.0.5", 2651 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2652 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 2653 | "dev": true 2654 | }, 2655 | "eslint": { 2656 | "version": "5.16.0", 2657 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 2658 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 2659 | "dev": true, 2660 | "requires": { 2661 | "@babel/code-frame": "^7.0.0", 2662 | "ajv": "^6.9.1", 2663 | "chalk": "^2.1.0", 2664 | "cross-spawn": "^6.0.5", 2665 | "debug": "^4.0.1", 2666 | "doctrine": "^3.0.0", 2667 | "eslint-scope": "^4.0.3", 2668 | "eslint-utils": "^1.3.1", 2669 | "eslint-visitor-keys": "^1.0.0", 2670 | "espree": "^5.0.1", 2671 | "esquery": "^1.0.1", 2672 | "esutils": "^2.0.2", 2673 | "file-entry-cache": "^5.0.1", 2674 | "functional-red-black-tree": "^1.0.1", 2675 | "glob": "^7.1.2", 2676 | "globals": "^11.7.0", 2677 | "ignore": "^4.0.6", 2678 | "import-fresh": "^3.0.0", 2679 | "imurmurhash": "^0.1.4", 2680 | "inquirer": "^6.2.2", 2681 | "js-yaml": "^3.13.0", 2682 | "json-stable-stringify-without-jsonify": "^1.0.1", 2683 | "levn": "^0.3.0", 2684 | "lodash": "^4.17.11", 2685 | "minimatch": "^3.0.4", 2686 | "mkdirp": "^0.5.1", 2687 | "natural-compare": "^1.4.0", 2688 | "optionator": "^0.8.2", 2689 | "path-is-inside": "^1.0.2", 2690 | "progress": "^2.0.0", 2691 | "regexpp": "^2.0.1", 2692 | "semver": "^5.5.1", 2693 | "strip-ansi": "^4.0.0", 2694 | "strip-json-comments": "^2.0.1", 2695 | "table": "^5.2.3", 2696 | "text-table": "^0.2.0" 2697 | } 2698 | }, 2699 | "eslint-scope": { 2700 | "version": "4.0.3", 2701 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 2702 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 2703 | "dev": true, 2704 | "requires": { 2705 | "esrecurse": "^4.1.0", 2706 | "estraverse": "^4.1.1" 2707 | } 2708 | }, 2709 | "eslint-utils": { 2710 | "version": "1.4.3", 2711 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 2712 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 2713 | "dev": true, 2714 | "requires": { 2715 | "eslint-visitor-keys": "^1.1.0" 2716 | } 2717 | }, 2718 | "eslint-visitor-keys": { 2719 | "version": "1.3.0", 2720 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 2721 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 2722 | "dev": true 2723 | }, 2724 | "espree": { 2725 | "version": "5.0.1", 2726 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 2727 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 2728 | "dev": true, 2729 | "requires": { 2730 | "acorn": "^6.0.7", 2731 | "acorn-jsx": "^5.0.0", 2732 | "eslint-visitor-keys": "^1.0.0" 2733 | } 2734 | }, 2735 | "esprima": { 2736 | "version": "4.0.1", 2737 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 2738 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 2739 | "dev": true 2740 | }, 2741 | "esquery": { 2742 | "version": "1.4.0", 2743 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 2744 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 2745 | "dev": true, 2746 | "requires": { 2747 | "estraverse": "^5.1.0" 2748 | }, 2749 | "dependencies": { 2750 | "estraverse": { 2751 | "version": "5.3.0", 2752 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2753 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2754 | "dev": true 2755 | } 2756 | } 2757 | }, 2758 | "esrecurse": { 2759 | "version": "4.3.0", 2760 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2761 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2762 | "dev": true, 2763 | "requires": { 2764 | "estraverse": "^5.2.0" 2765 | }, 2766 | "dependencies": { 2767 | "estraverse": { 2768 | "version": "5.3.0", 2769 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2770 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2771 | "dev": true 2772 | } 2773 | } 2774 | }, 2775 | "estraverse": { 2776 | "version": "4.3.0", 2777 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 2778 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 2779 | "dev": true 2780 | }, 2781 | "esutils": { 2782 | "version": "2.0.3", 2783 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2784 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2785 | "dev": true 2786 | }, 2787 | "etag": { 2788 | "version": "1.8.1", 2789 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 2790 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 2791 | }, 2792 | "express": { 2793 | "version": "4.17.2", 2794 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 2795 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 2796 | "requires": { 2797 | "accepts": "~1.3.7", 2798 | "array-flatten": "1.1.1", 2799 | "body-parser": "1.19.1", 2800 | "content-disposition": "0.5.4", 2801 | "content-type": "~1.0.4", 2802 | "cookie": "0.4.1", 2803 | "cookie-signature": "1.0.6", 2804 | "debug": "2.6.9", 2805 | "depd": "~1.1.2", 2806 | "encodeurl": "~1.0.2", 2807 | "escape-html": "~1.0.3", 2808 | "etag": "~1.8.1", 2809 | "finalhandler": "~1.1.2", 2810 | "fresh": "0.5.2", 2811 | "merge-descriptors": "1.0.1", 2812 | "methods": "~1.1.2", 2813 | "on-finished": "~2.3.0", 2814 | "parseurl": "~1.3.3", 2815 | "path-to-regexp": "0.1.7", 2816 | "proxy-addr": "~2.0.7", 2817 | "qs": "6.9.6", 2818 | "range-parser": "~1.2.1", 2819 | "safe-buffer": "5.2.1", 2820 | "send": "0.17.2", 2821 | "serve-static": "1.14.2", 2822 | "setprototypeof": "1.2.0", 2823 | "statuses": "~1.5.0", 2824 | "type-is": "~1.6.18", 2825 | "utils-merge": "1.0.1", 2826 | "vary": "~1.1.2" 2827 | }, 2828 | "dependencies": { 2829 | "debug": { 2830 | "version": "2.6.9", 2831 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2832 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2833 | "requires": { 2834 | "ms": "2.0.0" 2835 | } 2836 | }, 2837 | "ms": { 2838 | "version": "2.0.0", 2839 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2840 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2841 | } 2842 | } 2843 | }, 2844 | "external-editor": { 2845 | "version": "3.1.0", 2846 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 2847 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 2848 | "dev": true, 2849 | "requires": { 2850 | "chardet": "^0.7.0", 2851 | "iconv-lite": "^0.4.24", 2852 | "tmp": "^0.0.33" 2853 | } 2854 | }, 2855 | "fast-deep-equal": { 2856 | "version": "3.1.3", 2857 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2858 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2859 | "dev": true 2860 | }, 2861 | "fast-json-stable-stringify": { 2862 | "version": "2.1.0", 2863 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2864 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2865 | "dev": true 2866 | }, 2867 | "fast-levenshtein": { 2868 | "version": "2.0.6", 2869 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2870 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 2871 | "dev": true 2872 | }, 2873 | "figures": { 2874 | "version": "2.0.0", 2875 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 2876 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 2877 | "dev": true, 2878 | "requires": { 2879 | "escape-string-regexp": "^1.0.5" 2880 | } 2881 | }, 2882 | "file-entry-cache": { 2883 | "version": "5.0.1", 2884 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 2885 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 2886 | "dev": true, 2887 | "requires": { 2888 | "flat-cache": "^2.0.1" 2889 | } 2890 | }, 2891 | "finalhandler": { 2892 | "version": "1.1.2", 2893 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 2894 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 2895 | "requires": { 2896 | "debug": "2.6.9", 2897 | "encodeurl": "~1.0.2", 2898 | "escape-html": "~1.0.3", 2899 | "on-finished": "~2.3.0", 2900 | "parseurl": "~1.3.3", 2901 | "statuses": "~1.5.0", 2902 | "unpipe": "~1.0.0" 2903 | }, 2904 | "dependencies": { 2905 | "debug": { 2906 | "version": "2.6.9", 2907 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2908 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2909 | "requires": { 2910 | "ms": "2.0.0" 2911 | } 2912 | }, 2913 | "ms": { 2914 | "version": "2.0.0", 2915 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2916 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2917 | } 2918 | } 2919 | }, 2920 | "flat-cache": { 2921 | "version": "2.0.1", 2922 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 2923 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 2924 | "dev": true, 2925 | "requires": { 2926 | "flatted": "^2.0.0", 2927 | "rimraf": "2.6.3", 2928 | "write": "1.0.3" 2929 | } 2930 | }, 2931 | "flatted": { 2932 | "version": "2.0.2", 2933 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 2934 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 2935 | "dev": true 2936 | }, 2937 | "forwarded": { 2938 | "version": "0.2.0", 2939 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 2940 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 2941 | }, 2942 | "fresh": { 2943 | "version": "0.5.2", 2944 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 2945 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 2946 | }, 2947 | "fs.realpath": { 2948 | "version": "1.0.0", 2949 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2950 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 2951 | "dev": true 2952 | }, 2953 | "fscreen": { 2954 | "version": "1.2.0", 2955 | "resolved": "https://registry.npmjs.org/fscreen/-/fscreen-1.2.0.tgz", 2956 | "integrity": "sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg==" 2957 | }, 2958 | "functional-red-black-tree": { 2959 | "version": "1.0.1", 2960 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 2961 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 2962 | "dev": true 2963 | }, 2964 | "glob": { 2965 | "version": "7.2.0", 2966 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2967 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2968 | "dev": true, 2969 | "requires": { 2970 | "fs.realpath": "^1.0.0", 2971 | "inflight": "^1.0.4", 2972 | "inherits": "2", 2973 | "minimatch": "^3.0.4", 2974 | "once": "^1.3.0", 2975 | "path-is-absolute": "^1.0.0" 2976 | } 2977 | }, 2978 | "global": { 2979 | "version": "4.4.0", 2980 | "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", 2981 | "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", 2982 | "dev": true, 2983 | "requires": { 2984 | "min-document": "^2.19.0", 2985 | "process": "^0.11.10" 2986 | } 2987 | }, 2988 | "globals": { 2989 | "version": "11.12.0", 2990 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2991 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2992 | "dev": true 2993 | }, 2994 | "has-binary2": { 2995 | "version": "1.0.3", 2996 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 2997 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 2998 | "requires": { 2999 | "isarray": "2.0.1" 3000 | } 3001 | }, 3002 | "has-cors": { 3003 | "version": "1.1.0", 3004 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 3005 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 3006 | }, 3007 | "has-flag": { 3008 | "version": "3.0.0", 3009 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 3010 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 3011 | "dev": true 3012 | }, 3013 | "http-errors": { 3014 | "version": "1.8.1", 3015 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 3016 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 3017 | "requires": { 3018 | "depd": "~1.1.2", 3019 | "inherits": "2.0.4", 3020 | "setprototypeof": "1.2.0", 3021 | "statuses": ">= 1.5.0 < 2", 3022 | "toidentifier": "1.0.1" 3023 | } 3024 | }, 3025 | "iconv-lite": { 3026 | "version": "0.4.24", 3027 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 3028 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 3029 | "requires": { 3030 | "safer-buffer": ">= 2.1.2 < 3" 3031 | } 3032 | }, 3033 | "ignore": { 3034 | "version": "4.0.6", 3035 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 3036 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 3037 | "dev": true 3038 | }, 3039 | "import-fresh": { 3040 | "version": "3.3.0", 3041 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 3042 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 3043 | "dev": true, 3044 | "requires": { 3045 | "parent-module": "^1.0.0", 3046 | "resolve-from": "^4.0.0" 3047 | } 3048 | }, 3049 | "imurmurhash": { 3050 | "version": "0.1.4", 3051 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 3052 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 3053 | "dev": true 3054 | }, 3055 | "indexof": { 3056 | "version": "0.0.1", 3057 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 3058 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" 3059 | }, 3060 | "inflight": { 3061 | "version": "1.0.6", 3062 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 3063 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 3064 | "dev": true, 3065 | "requires": { 3066 | "once": "^1.3.0", 3067 | "wrappy": "1" 3068 | } 3069 | }, 3070 | "inherits": { 3071 | "version": "2.0.4", 3072 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 3073 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 3074 | }, 3075 | "inquirer": { 3076 | "version": "6.5.2", 3077 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 3078 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 3079 | "dev": true, 3080 | "requires": { 3081 | "ansi-escapes": "^3.2.0", 3082 | "chalk": "^2.4.2", 3083 | "cli-cursor": "^2.1.0", 3084 | "cli-width": "^2.0.0", 3085 | "external-editor": "^3.0.3", 3086 | "figures": "^2.0.0", 3087 | "lodash": "^4.17.12", 3088 | "mute-stream": "0.0.7", 3089 | "run-async": "^2.2.0", 3090 | "rxjs": "^6.4.0", 3091 | "string-width": "^2.1.0", 3092 | "strip-ansi": "^5.1.0", 3093 | "through": "^2.3.6" 3094 | }, 3095 | "dependencies": { 3096 | "ansi-regex": { 3097 | "version": "4.1.0", 3098 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 3099 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 3100 | "dev": true 3101 | }, 3102 | "strip-ansi": { 3103 | "version": "5.2.0", 3104 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 3105 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 3106 | "dev": true, 3107 | "requires": { 3108 | "ansi-regex": "^4.1.0" 3109 | } 3110 | } 3111 | } 3112 | }, 3113 | "ip": { 3114 | "version": "1.1.5", 3115 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 3116 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 3117 | }, 3118 | "ipaddr.js": { 3119 | "version": "1.9.1", 3120 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 3121 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 3122 | }, 3123 | "is-fullwidth-code-point": { 3124 | "version": "2.0.0", 3125 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 3126 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 3127 | "dev": true 3128 | }, 3129 | "isarray": { 3130 | "version": "2.0.1", 3131 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 3132 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 3133 | }, 3134 | "isexe": { 3135 | "version": "2.0.0", 3136 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 3137 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 3138 | "dev": true 3139 | }, 3140 | "js-tokens": { 3141 | "version": "4.0.0", 3142 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 3143 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 3144 | "dev": true 3145 | }, 3146 | "js-yaml": { 3147 | "version": "3.14.1", 3148 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 3149 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 3150 | "dev": true, 3151 | "requires": { 3152 | "argparse": "^1.0.7", 3153 | "esprima": "^4.0.0" 3154 | } 3155 | }, 3156 | "json-schema-traverse": { 3157 | "version": "0.4.1", 3158 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3159 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 3160 | "dev": true 3161 | }, 3162 | "json-stable-stringify-without-jsonify": { 3163 | "version": "1.0.1", 3164 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 3165 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 3166 | "dev": true 3167 | }, 3168 | "levn": { 3169 | "version": "0.3.0", 3170 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 3171 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 3172 | "dev": true, 3173 | "requires": { 3174 | "prelude-ls": "~1.1.2", 3175 | "type-check": "~0.3.2" 3176 | } 3177 | }, 3178 | "lodash": { 3179 | "version": "4.17.21", 3180 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 3181 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 3182 | "dev": true 3183 | }, 3184 | "m3u8-parser": { 3185 | "version": "4.7.0", 3186 | "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-4.7.0.tgz", 3187 | "integrity": "sha512-48l/OwRyjBm+QhNNigEEcRcgbRvnUjL7rxs597HmW9QSNbyNvt+RcZ9T/d9vxi9A9z7EZrB1POtZYhdRlwYQkQ==", 3188 | "dev": true, 3189 | "requires": { 3190 | "@babel/runtime": "^7.12.5", 3191 | "@videojs/vhs-utils": "^3.0.0", 3192 | "global": "^4.4.0" 3193 | } 3194 | }, 3195 | "media-typer": { 3196 | "version": "0.3.0", 3197 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 3198 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 3199 | }, 3200 | "merge-descriptors": { 3201 | "version": "1.0.1", 3202 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 3203 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 3204 | }, 3205 | "methods": { 3206 | "version": "1.1.2", 3207 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 3208 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 3209 | }, 3210 | "mime": { 3211 | "version": "1.6.0", 3212 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 3213 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 3214 | }, 3215 | "mime-db": { 3216 | "version": "1.51.0", 3217 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 3218 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" 3219 | }, 3220 | "mime-types": { 3221 | "version": "2.1.34", 3222 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 3223 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 3224 | "requires": { 3225 | "mime-db": "1.51.0" 3226 | } 3227 | }, 3228 | "mimic-fn": { 3229 | "version": "1.2.0", 3230 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 3231 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 3232 | "dev": true 3233 | }, 3234 | "min-document": { 3235 | "version": "2.19.0", 3236 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 3237 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 3238 | "dev": true, 3239 | "requires": { 3240 | "dom-walk": "^0.1.0" 3241 | } 3242 | }, 3243 | "minimatch": { 3244 | "version": "3.0.4", 3245 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 3246 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 3247 | "dev": true, 3248 | "requires": { 3249 | "brace-expansion": "^1.1.7" 3250 | } 3251 | }, 3252 | "minimist": { 3253 | "version": "1.2.5", 3254 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 3255 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 3256 | "dev": true 3257 | }, 3258 | "mkdirp": { 3259 | "version": "0.5.5", 3260 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 3261 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 3262 | "dev": true, 3263 | "requires": { 3264 | "minimist": "^1.2.5" 3265 | } 3266 | }, 3267 | "ms": { 3268 | "version": "2.1.2", 3269 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 3270 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 3271 | }, 3272 | "mute-stream": { 3273 | "version": "0.0.7", 3274 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 3275 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 3276 | "dev": true 3277 | }, 3278 | "natural-compare": { 3279 | "version": "1.4.0", 3280 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3281 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 3282 | "dev": true 3283 | }, 3284 | "negotiator": { 3285 | "version": "0.6.2", 3286 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 3287 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 3288 | }, 3289 | "nice-try": { 3290 | "version": "1.0.5", 3291 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 3292 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 3293 | "dev": true 3294 | }, 3295 | "on-finished": { 3296 | "version": "2.3.0", 3297 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 3298 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 3299 | "requires": { 3300 | "ee-first": "1.1.1" 3301 | } 3302 | }, 3303 | "once": { 3304 | "version": "1.4.0", 3305 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3306 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 3307 | "dev": true, 3308 | "requires": { 3309 | "wrappy": "1" 3310 | } 3311 | }, 3312 | "onetime": { 3313 | "version": "2.0.1", 3314 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 3315 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 3316 | "dev": true, 3317 | "requires": { 3318 | "mimic-fn": "^1.0.0" 3319 | } 3320 | }, 3321 | "optionator": { 3322 | "version": "0.8.3", 3323 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 3324 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 3325 | "dev": true, 3326 | "requires": { 3327 | "deep-is": "~0.1.3", 3328 | "fast-levenshtein": "~2.0.6", 3329 | "levn": "~0.3.0", 3330 | "prelude-ls": "~1.1.2", 3331 | "type-check": "~0.3.2", 3332 | "word-wrap": "~1.2.3" 3333 | } 3334 | }, 3335 | "os-tmpdir": { 3336 | "version": "1.0.2", 3337 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 3338 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 3339 | "dev": true 3340 | }, 3341 | "parent-module": { 3342 | "version": "1.0.1", 3343 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 3344 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 3345 | "dev": true, 3346 | "requires": { 3347 | "callsites": "^3.0.0" 3348 | } 3349 | }, 3350 | "parseqs": { 3351 | "version": "0.0.6", 3352 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", 3353 | "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" 3354 | }, 3355 | "parseuri": { 3356 | "version": "0.0.6", 3357 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", 3358 | "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" 3359 | }, 3360 | "parseurl": { 3361 | "version": "1.3.3", 3362 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 3363 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 3364 | }, 3365 | "path-is-absolute": { 3366 | "version": "1.0.1", 3367 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3368 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 3369 | "dev": true 3370 | }, 3371 | "path-is-inside": { 3372 | "version": "1.0.2", 3373 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 3374 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 3375 | "dev": true 3376 | }, 3377 | "path-key": { 3378 | "version": "2.0.1", 3379 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 3380 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 3381 | "dev": true 3382 | }, 3383 | "path-to-regexp": { 3384 | "version": "0.1.7", 3385 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 3386 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 3387 | }, 3388 | "prelude-ls": { 3389 | "version": "1.1.2", 3390 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 3391 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 3392 | "dev": true 3393 | }, 3394 | "process": { 3395 | "version": "0.11.10", 3396 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 3397 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 3398 | "dev": true 3399 | }, 3400 | "progress": { 3401 | "version": "2.0.3", 3402 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 3403 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 3404 | "dev": true 3405 | }, 3406 | "proxy-addr": { 3407 | "version": "2.0.7", 3408 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 3409 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 3410 | "requires": { 3411 | "forwarded": "0.2.0", 3412 | "ipaddr.js": "1.9.1" 3413 | } 3414 | }, 3415 | "punycode": { 3416 | "version": "2.1.1", 3417 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 3418 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 3419 | "dev": true 3420 | }, 3421 | "qs": { 3422 | "version": "6.9.6", 3423 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 3424 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" 3425 | }, 3426 | "range-parser": { 3427 | "version": "1.2.1", 3428 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 3429 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 3430 | }, 3431 | "raw-body": { 3432 | "version": "2.4.2", 3433 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 3434 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 3435 | "requires": { 3436 | "bytes": "3.1.1", 3437 | "http-errors": "1.8.1", 3438 | "iconv-lite": "0.4.24", 3439 | "unpipe": "1.0.0" 3440 | } 3441 | }, 3442 | "regenerator-runtime": { 3443 | "version": "0.13.9", 3444 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 3445 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", 3446 | "dev": true 3447 | }, 3448 | "regexpp": { 3449 | "version": "2.0.1", 3450 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 3451 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 3452 | "dev": true 3453 | }, 3454 | "resolve-from": { 3455 | "version": "4.0.0", 3456 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 3457 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 3458 | "dev": true 3459 | }, 3460 | "restore-cursor": { 3461 | "version": "2.0.0", 3462 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 3463 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 3464 | "dev": true, 3465 | "requires": { 3466 | "onetime": "^2.0.0", 3467 | "signal-exit": "^3.0.2" 3468 | } 3469 | }, 3470 | "rimraf": { 3471 | "version": "2.6.3", 3472 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 3473 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 3474 | "dev": true, 3475 | "requires": { 3476 | "glob": "^7.1.3" 3477 | } 3478 | }, 3479 | "run-async": { 3480 | "version": "2.4.1", 3481 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 3482 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 3483 | "dev": true 3484 | }, 3485 | "rxjs": { 3486 | "version": "6.6.7", 3487 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 3488 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 3489 | "dev": true, 3490 | "requires": { 3491 | "tslib": "^1.9.0" 3492 | } 3493 | }, 3494 | "safe-buffer": { 3495 | "version": "5.2.1", 3496 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 3497 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 3498 | }, 3499 | "safer-buffer": { 3500 | "version": "2.1.2", 3501 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3502 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 3503 | }, 3504 | "semver": { 3505 | "version": "5.7.1", 3506 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 3507 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 3508 | "dev": true 3509 | }, 3510 | "send": { 3511 | "version": "0.17.2", 3512 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 3513 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 3514 | "requires": { 3515 | "debug": "2.6.9", 3516 | "depd": "~1.1.2", 3517 | "destroy": "~1.0.4", 3518 | "encodeurl": "~1.0.2", 3519 | "escape-html": "~1.0.3", 3520 | "etag": "~1.8.1", 3521 | "fresh": "0.5.2", 3522 | "http-errors": "1.8.1", 3523 | "mime": "1.6.0", 3524 | "ms": "2.1.3", 3525 | "on-finished": "~2.3.0", 3526 | "range-parser": "~1.2.1", 3527 | "statuses": "~1.5.0" 3528 | }, 3529 | "dependencies": { 3530 | "debug": { 3531 | "version": "2.6.9", 3532 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 3533 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 3534 | "requires": { 3535 | "ms": "2.0.0" 3536 | }, 3537 | "dependencies": { 3538 | "ms": { 3539 | "version": "2.0.0", 3540 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 3541 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 3542 | } 3543 | } 3544 | }, 3545 | "ms": { 3546 | "version": "2.1.3", 3547 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3548 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 3549 | } 3550 | } 3551 | }, 3552 | "serve-static": { 3553 | "version": "1.14.2", 3554 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 3555 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 3556 | "requires": { 3557 | "encodeurl": "~1.0.2", 3558 | "escape-html": "~1.0.3", 3559 | "parseurl": "~1.3.3", 3560 | "send": "0.17.2" 3561 | } 3562 | }, 3563 | "setprototypeof": { 3564 | "version": "1.2.0", 3565 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 3566 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 3567 | }, 3568 | "shebang-command": { 3569 | "version": "1.2.0", 3570 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 3571 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 3572 | "dev": true, 3573 | "requires": { 3574 | "shebang-regex": "^1.0.0" 3575 | } 3576 | }, 3577 | "shebang-regex": { 3578 | "version": "1.0.0", 3579 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 3580 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 3581 | "dev": true 3582 | }, 3583 | "signal-exit": { 3584 | "version": "3.0.6", 3585 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", 3586 | "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", 3587 | "dev": true 3588 | }, 3589 | "slice-ansi": { 3590 | "version": "2.1.0", 3591 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 3592 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 3593 | "dev": true, 3594 | "requires": { 3595 | "ansi-styles": "^3.2.0", 3596 | "astral-regex": "^1.0.0", 3597 | "is-fullwidth-code-point": "^2.0.0" 3598 | } 3599 | }, 3600 | "socket.io": { 3601 | "version": "2.4.1", 3602 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", 3603 | "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", 3604 | "requires": { 3605 | "debug": "~4.1.0", 3606 | "engine.io": "~3.5.0", 3607 | "has-binary2": "~1.0.2", 3608 | "socket.io-adapter": "~1.1.0", 3609 | "socket.io-client": "2.4.0", 3610 | "socket.io-parser": "~3.4.0" 3611 | }, 3612 | "dependencies": { 3613 | "debug": { 3614 | "version": "4.1.1", 3615 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 3616 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 3617 | "requires": { 3618 | "ms": "^2.1.1" 3619 | } 3620 | } 3621 | } 3622 | }, 3623 | "socket.io-adapter": { 3624 | "version": "1.1.2", 3625 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", 3626 | "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" 3627 | }, 3628 | "socket.io-client": { 3629 | "version": "2.4.0", 3630 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", 3631 | "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", 3632 | "requires": { 3633 | "backo2": "1.0.2", 3634 | "component-bind": "1.0.0", 3635 | "component-emitter": "~1.3.0", 3636 | "debug": "~3.1.0", 3637 | "engine.io-client": "~3.5.0", 3638 | "has-binary2": "~1.0.2", 3639 | "indexof": "0.0.1", 3640 | "parseqs": "0.0.6", 3641 | "parseuri": "0.0.6", 3642 | "socket.io-parser": "~3.3.0", 3643 | "to-array": "0.1.4" 3644 | }, 3645 | "dependencies": { 3646 | "debug": { 3647 | "version": "3.1.0", 3648 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 3649 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 3650 | "requires": { 3651 | "ms": "2.0.0" 3652 | } 3653 | }, 3654 | "ms": { 3655 | "version": "2.0.0", 3656 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 3657 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 3658 | }, 3659 | "socket.io-parser": { 3660 | "version": "3.3.2", 3661 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", 3662 | "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", 3663 | "requires": { 3664 | "component-emitter": "~1.3.0", 3665 | "debug": "~3.1.0", 3666 | "isarray": "2.0.1" 3667 | } 3668 | } 3669 | } 3670 | }, 3671 | "socket.io-parser": { 3672 | "version": "3.4.1", 3673 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", 3674 | "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", 3675 | "requires": { 3676 | "component-emitter": "1.2.1", 3677 | "debug": "~4.1.0", 3678 | "isarray": "2.0.1" 3679 | }, 3680 | "dependencies": { 3681 | "component-emitter": { 3682 | "version": "1.2.1", 3683 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 3684 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 3685 | }, 3686 | "debug": { 3687 | "version": "4.1.1", 3688 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 3689 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 3690 | "requires": { 3691 | "ms": "^2.1.1" 3692 | } 3693 | } 3694 | } 3695 | }, 3696 | "sprintf-js": { 3697 | "version": "1.0.3", 3698 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3699 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3700 | "dev": true 3701 | }, 3702 | "statuses": { 3703 | "version": "1.5.0", 3704 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 3705 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 3706 | }, 3707 | "string-width": { 3708 | "version": "2.1.1", 3709 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 3710 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 3711 | "dev": true, 3712 | "requires": { 3713 | "is-fullwidth-code-point": "^2.0.0", 3714 | "strip-ansi": "^4.0.0" 3715 | } 3716 | }, 3717 | "strip-ansi": { 3718 | "version": "4.0.0", 3719 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 3720 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 3721 | "dev": true, 3722 | "requires": { 3723 | "ansi-regex": "^3.0.0" 3724 | } 3725 | }, 3726 | "strip-json-comments": { 3727 | "version": "2.0.1", 3728 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 3729 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 3730 | "dev": true 3731 | }, 3732 | "supports-color": { 3733 | "version": "5.5.0", 3734 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3735 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3736 | "dev": true, 3737 | "requires": { 3738 | "has-flag": "^3.0.0" 3739 | } 3740 | }, 3741 | "table": { 3742 | "version": "5.4.6", 3743 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 3744 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 3745 | "dev": true, 3746 | "requires": { 3747 | "ajv": "^6.10.2", 3748 | "lodash": "^4.17.14", 3749 | "slice-ansi": "^2.1.0", 3750 | "string-width": "^3.0.0" 3751 | }, 3752 | "dependencies": { 3753 | "ansi-regex": { 3754 | "version": "4.1.0", 3755 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 3756 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 3757 | "dev": true 3758 | }, 3759 | "string-width": { 3760 | "version": "3.1.0", 3761 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 3762 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 3763 | "dev": true, 3764 | "requires": { 3765 | "emoji-regex": "^7.0.1", 3766 | "is-fullwidth-code-point": "^2.0.0", 3767 | "strip-ansi": "^5.1.0" 3768 | } 3769 | }, 3770 | "strip-ansi": { 3771 | "version": "5.2.0", 3772 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 3773 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 3774 | "dev": true, 3775 | "requires": { 3776 | "ansi-regex": "^4.1.0" 3777 | } 3778 | } 3779 | } 3780 | }, 3781 | "text-table": { 3782 | "version": "0.2.0", 3783 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3784 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 3785 | "dev": true 3786 | }, 3787 | "through": { 3788 | "version": "2.3.8", 3789 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3790 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3791 | "dev": true 3792 | }, 3793 | "tmp": { 3794 | "version": "0.0.33", 3795 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 3796 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 3797 | "dev": true, 3798 | "requires": { 3799 | "os-tmpdir": "~1.0.2" 3800 | } 3801 | }, 3802 | "to-array": { 3803 | "version": "0.1.4", 3804 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 3805 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" 3806 | }, 3807 | "toidentifier": { 3808 | "version": "1.0.1", 3809 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 3810 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 3811 | }, 3812 | "tslib": { 3813 | "version": "1.14.1", 3814 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 3815 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 3816 | "dev": true 3817 | }, 3818 | "type-check": { 3819 | "version": "0.3.2", 3820 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3821 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 3822 | "dev": true, 3823 | "requires": { 3824 | "prelude-ls": "~1.1.2" 3825 | } 3826 | }, 3827 | "type-is": { 3828 | "version": "1.6.18", 3829 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3830 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3831 | "requires": { 3832 | "media-typer": "0.3.0", 3833 | "mime-types": "~2.1.24" 3834 | } 3835 | }, 3836 | "unpipe": { 3837 | "version": "1.0.0", 3838 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3839 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3840 | }, 3841 | "uri-js": { 3842 | "version": "4.4.1", 3843 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3844 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3845 | "dev": true, 3846 | "requires": { 3847 | "punycode": "^2.1.0" 3848 | } 3849 | }, 3850 | "url-toolkit": { 3851 | "version": "2.2.3", 3852 | "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.3.tgz", 3853 | "integrity": "sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ==", 3854 | "dev": true 3855 | }, 3856 | "utils-merge": { 3857 | "version": "1.0.1", 3858 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3859 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3860 | }, 3861 | "vary": { 3862 | "version": "1.1.2", 3863 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3864 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3865 | }, 3866 | "vue": { 3867 | "version": "2.6.14", 3868 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz", 3869 | "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==" 3870 | }, 3871 | "which": { 3872 | "version": "1.3.1", 3873 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 3874 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 3875 | "dev": true, 3876 | "requires": { 3877 | "isexe": "^2.0.0" 3878 | } 3879 | }, 3880 | "word-wrap": { 3881 | "version": "1.2.3", 3882 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 3883 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 3884 | "dev": true 3885 | }, 3886 | "wrappy": { 3887 | "version": "1.0.2", 3888 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3889 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3890 | "dev": true 3891 | }, 3892 | "write": { 3893 | "version": "1.0.3", 3894 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 3895 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 3896 | "dev": true, 3897 | "requires": { 3898 | "mkdirp": "^0.5.1" 3899 | } 3900 | }, 3901 | "ws": { 3902 | "version": "7.4.6", 3903 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 3904 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", 3905 | "requires": {} 3906 | }, 3907 | "xmlhttprequest-ssl": { 3908 | "version": "1.6.3", 3909 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", 3910 | "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==" 3911 | }, 3912 | "yargs-parser": { 3913 | "version": "18.1.3", 3914 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 3915 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 3916 | "requires": { 3917 | "camelcase": "^5.0.0", 3918 | "decamelize": "^1.2.0" 3919 | } 3920 | }, 3921 | "yeast": { 3922 | "version": "0.1.2", 3923 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 3924 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" 3925 | } 3926 | } 3927 | } 3928 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sync", 3 | "version": "0.2.0", 4 | "description": "Synchronize audio and video between friends! Supports HTML5 video, YouTube, and Vimeo", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node server.js", 8 | "test": "mocha || true" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/wetfish/sync.git" 13 | }, 14 | "author": "Rachel ", 15 | "contributors": [ 16 | "Tyrell (https://tyrell.me)" 17 | ], 18 | "license": "ISC", 19 | "bugs": { 20 | "url": "https://github.com/wetfish/sync/issues" 21 | }, 22 | "homepage": "https://github.com/wetfish/sync#readme", 23 | "dependencies": { 24 | "dotenv": "^8.2.0", 25 | "express": "^4.16.4", 26 | "fscreen": "^1.0.2", 27 | "ip": "^1.1.5", 28 | "socket.io": "^2.4.0", 29 | "vue": "^2.6.4", 30 | "yargs-parser": "^18.1.3" 31 | }, 32 | "devDependencies": { 33 | "@fortawesome/fontawesome-free": "^5.9.0", 34 | "eslint": "^5.12.1", 35 | "m3u8-parser": "^4.4.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /public/css/style.css: -------------------------------------------------------------------------------- 1 | #socket-success { 2 | color: green; 3 | visibility: hidden; 4 | } 5 | 6 | #socket-fail { 7 | color: red; 8 | visibility: visible; 9 | } 10 | 11 | 12 | body { 13 | margin: 0; 14 | height: 100vh; 15 | width: 100vw; 16 | background-color: black; 17 | } 18 | 19 | #vue-app { 20 | height: 100%; 21 | width: 100%; 22 | overflow: hidden; 23 | } 24 | 25 | #media-player { 26 | height: 100vh; 27 | width: 100vw; 28 | object-fit: contain; 29 | } 30 | 31 | #controls-container { 32 | width: 100%; 33 | height: 100px; 34 | background-color: rgba(0,0,0,0.2); 35 | position: fixed; 36 | top: 0; 37 | transition: opacity 0.5s; 38 | opacity: 0; 39 | } 40 | 41 | #resync { 42 | margin-right: 1em; 43 | } 44 | 45 | #vol { 46 | margin-left: 1em; 47 | } 48 | #vol input { 49 | width: 100px; 50 | } 51 | 52 | @media screen and (max-width: 400px) { 53 | #vol input { 54 | width: 50px; 55 | } 56 | } 57 | 58 | #mute { 59 | margin-left: 1em; 60 | } 61 | 62 | progress { 63 | width: 100%; 64 | } 65 | 66 | .active { 67 | opacity: 1 !important; 68 | } 69 | 70 | .icon { 71 | fill:white; 72 | width: 3rem; 73 | height: 3rem; 74 | } 75 | 76 | .icon:hover { 77 | fill:#ccc; 78 | } 79 | 80 | .icon-large { 81 | fill:white; 82 | width: 12rem; 83 | height: 12rem; 84 | } 85 | 86 | .icon-large:hover { 87 | fill:#ccc; 88 | } 89 | 90 | .right-side-buttons { 91 | display: flex; 92 | align-items: center; 93 | } 94 | .left-side-buttons { 95 | display: flex; 96 | align-items: center; 97 | } 98 | .button-container { 99 | display: flex; 100 | align-items: center; 101 | justify-content: space-between; 102 | flex-wrap: wrap; 103 | } 104 | 105 | .hidden { 106 | display: none; 107 | visibility: none; 108 | } 109 | 110 | .slider-active{ 111 | pointer-events: auto!important; 112 | } 113 | 114 | .slider { 115 | pointer-events: none; 116 | } 117 | 118 | .start-modal { 119 | position: fixed; 120 | top: 50%; 121 | left: 50%; 122 | transform: translate(-50%, -50%); 123 | } -------------------------------------------------------------------------------- /public/js/controls.js: -------------------------------------------------------------------------------- 1 | window.addEventListener('DOMContentLoaded', () => { 2 | // Implement controls for shwing and hiding the progress bar 3 | // Inspired by https://blog.videojs.com/hiding-and-showing-video-player-controls/ 4 | 5 | const controls = document.getElementById('controls-container'); 6 | const cursor = document.querySelector('body'); 7 | const volume = document.querySelector('.slider'); 8 | let startTimer; 9 | 10 | document.addEventListener('mousemove', function(){ 11 | clearTimeout(startTimer); 12 | controls.classList.add('active'); 13 | cursor.style.cursor = 'default'; 14 | //we need to turn off pointer events for the slider so it disappears when the mouse is hovered on it 15 | volume.classList.add('slider-active'); 16 | startTimer = setTimeout(() => { 17 | console.log("removing"); 18 | controls.classList.remove('active'); 19 | volume.classList.remove('slider-active'); 20 | cursor.style.cursor = 'none'; 21 | }, 4000); 22 | }); 23 | 24 | document.addEventListener('keydown', function(event) { 25 | if (event.keyCode === 77) { 26 | vueApp.$refs.mediaControls.mute(); 27 | } 28 | }); 29 | }); -------------------------------------------------------------------------------- /public/js/socket-app.js: -------------------------------------------------------------------------------- 1 | /*globals vueApp */ 2 | 3 | // Make connection 4 | const socket = io.connect(location.origin.replace(/^http/, 'ws')); 5 | 6 | socket.on('connect', () => { 7 | //document.getElementById('socket-fail').style.visibility = "hidden"; 8 | //document.getElementById('socket-success').style.visibility = "visible"; 9 | }); 10 | 11 | socket.on('disconnect', () => { 12 | //document.getElementById('socket-success').style.visibility = "hidden"; 13 | //document.getElementById('socket-fail').style.visibility = "visible"; 14 | }); 15 | 16 | // Server emits event when media ends 17 | socket.on('newMedia', (data) => { 18 | const mediaControls = vueApp.$refs.mediaControls; 19 | const mediaPlayer = document.getElementById('media-player'); 20 | 21 | vueApp.duration = data.duration; 22 | vueApp.url = data.url; 23 | vueApp.timestamp = 0; 24 | vueApp.latency = 0; 25 | 26 | // Automatically the next item if the player is not paused 27 | if (!mediaControls.isPlaying) { 28 | // Check before updating the type of media player 29 | if (vueApp.mediaElement != data.mediaType + "-player"){ 30 | vueApp.mediaElement = data.mediaType + "-player"; 31 | } else { 32 | // If you only change the src attribute, you must load the video 33 | // vueapp will handle playing of the video 34 | mediaPlayer.load(); 35 | } 36 | } else { 37 | // Keep track of the media element that should be rendered 38 | vueApp.serverMediaType = data.mediaType; 39 | // And raise a flag 40 | vueApp.newMediaReceivedDuringPause = true; 41 | mediaPlayer.load(); 42 | } 43 | }); 44 | 45 | // Server sends timestamp every three seconds 46 | // Calculate latency and update Vue component 47 | socket.on('timestamp', (data) => { 48 | const mediaPlayer = document.getElementById('media-player'); 49 | const mediaPlayerTime = mediaPlayer.currentTime; 50 | const serverTime = data.timestamp; 51 | const latency = vueApp.newMediaReceivedDuringPause ? 0 : serverTime - mediaPlayerTime; 52 | let msg = `Watching ${data.mediaType} file ${data.humanReadableIndex} of ${data.totalFiles}. Timestamp: ${data.timestamp}s. Latency: ${latency}`; 53 | vueApp.serverMsg = msg; 54 | vueApp.latency = latency; 55 | vueApp.serverTime = data.timestamp; 56 | //create a new date object for caculating time since last server message 57 | vueApp.heartBeat = new Date().getTime(); 58 | //if the latency is over the threshold, then sync it back up 59 | if(Math.abs(vueApp.latency) >= vueApp.latencyThresholdSeconds) { 60 | vueApp.timestamp = data.timestamp; 61 | } 62 | }); 63 | 64 | // Server emits event when client connects 65 | socket.on('updateClient', (data) => { 66 | vueApp.mediaElement = data.mediaType + "-player"; 67 | vueApp.serverMediaType = data.mediaType; 68 | vueApp.timestamp = data.timestamp; 69 | vueApp.duration = data.duration; 70 | vueApp.url = data.url; 71 | }); 72 | 73 | -------------------------------------------------------------------------------- /public/js/vue-app.js: -------------------------------------------------------------------------------- 1 | 2 | // Video Vue Component 3 | const videoPlayer = Vue.component('video-player', { 4 | template: ` 5 | 8 | `, 9 | props: ["url", "timestamp", "muted"], 10 | mounted() { 11 | mountNewPlayer(this); 12 | } 13 | }); 14 | 15 | // Vue Audio Component 16 | const audioPlayer = Vue.component('audio-player', { 17 | template: ` 18 | 21 | `, 22 | props: ["url", "timestamp", "muted"], 23 | mounted() { 24 | mountNewPlayer(this); 25 | } 26 | }); 27 | 28 | const mediaPlayerControls = Vue.component('media-player-controls', { 29 | template: ` 30 | 78 | `, 79 | props: ["timestamp", "duration"], 80 | data:function() { 81 | return { 82 | volume:0, 83 | muted:true, 84 | isPlaying:false 85 | }; 86 | }, 87 | methods: { 88 | fullscreen: function() { 89 | if (!fscreen.fullscreenElement) { 90 | let video = document.querySelector("#vue-app"); 91 | fscreen.requestFullscreen(video); 92 | } else { 93 | fscreen.exitFullscreen(); 94 | } 95 | }, 96 | play: function() { 97 | 98 | let mediaPlayer = document.getElementById("media-player"); 99 | let startbutton = document.querySelector(".start-modal"); 100 | 101 | if (mediaPlayer.paused) { 102 | startbutton.classList.add("hidden"); 103 | mediaPlayer.play(); 104 | mediaPlayer.muted = false; 105 | this.isPlaying = true; 106 | //set the volume when the user actually hits play 107 | mediaPlayer.volume = this.volume*.01; 108 | } 109 | else if(!mediaPlayer.paused) { 110 | mediaPlayer.pause(); 111 | this.isPlaying = false; 112 | } 113 | //make sure our icon reflects the unmuted behavior on play. 114 | this.muted = false; 115 | }, 116 | resync: function () { 117 | let mediaPlayer = document.getElementById("media-player"); 118 | 119 | // get the difference of the last server heart beat in seconds 120 | let lastHeartBeatOffset = ((new Date().getTime() - vueApp.heartBeat )/1000); 121 | mediaPlayer.currentTime = vueApp.serverTime+lastHeartBeatOffset; 122 | }, 123 | changeVolume: function (){ 124 | // get the media player element and set it's volume to whatever the slider value is 125 | let mediaPlayer = document.querySelector("#media-player"); 126 | mediaPlayer.volume = this.volume*.01; 127 | //save the volum in local storage 128 | localStorage.setItem('volume',this.volume); 129 | }, 130 | mute: function () { 131 | //get the media element and make mute/unmute toggle 132 | let mediaPlayer = document.querySelector("#media-player"); 133 | 134 | if (mediaPlayer.muted != true) { 135 | this.muted = true; 136 | mediaPlayer.muted = true; 137 | } 138 | else { 139 | //else mute the element and update the mediaplayer.muted 140 | mediaPlayer.muted = false; 141 | this.muted = false; 142 | } 143 | } 144 | }, 145 | mounted() { 146 | //get the mediaPlayer element set up default volume 147 | if (localStorage.getItem('volume')) { 148 | this.volume = localStorage.getItem('volume'); 149 | } 150 | else { 151 | this.volume = this.$attrs.appvolume; 152 | } 153 | } 154 | }); 155 | 156 | let vueApp = new Vue ({ 157 | el: "#vue-app", 158 | data: { 159 | greeting: "Welcome to Sync", 160 | serverMsg: 'Waiting for server...', 161 | url: null, 162 | appVolume:75, 163 | serverTime:null, 164 | mediaElement: null, 165 | timestamp: null, 166 | duration: null, 167 | muted: true, 168 | heartBeat:null, 169 | latencyThresholdSeconds: 5 170 | }, 171 | components: { 172 | "video-player": videoPlayer, 173 | "audio-player": audioPlayer, 174 | }, 175 | }); 176 | 177 | function mountNewPlayer(mediaComponent) { 178 | const mediaElement = document.getElementById('media-player'); 179 | const mediaControls = vueApp.$refs.mediaControls; 180 | mediaElement.muted = mediaComponent.muted; 181 | mediaElement.currentTime = mediaComponent.timestamp; 182 | mediaElement.addEventListener('volumechange', () => { 183 | // Update the muted property of the parent element 184 | vueApp.muted = document.getElementById('media-player').muted; 185 | }); 186 | 187 | mediaElement.addEventListener('timeupdate', (event) => { 188 | vueApp.timestamp = mediaElement.currentTime; 189 | }); 190 | 191 | if(!mediaControls.isPlaying) { 192 | mediaElement.pause(); 193 | } 194 | 195 | mediaElement.addEventListener('play', () => { 196 | const mediaPlayer = document.getElementById('media-player'); 197 | const mediaControls = vueApp.$refs.mediaControls; 198 | // If the flag was raised, load and play the newest content. Reset flag. 199 | // Else if the latency is too large (ex: user pause or lag), syncronize 200 | 201 | if (!mediaControls.isPlaying) { 202 | mediaPlayer.pause(); 203 | mediaPlayer.currentTime = vueApp.timestamp; 204 | //tell our media player controls that the media is playing 205 | mediaControls.isPlaying = false; 206 | } else if (vueApp.latency > vueApp.latencyThresholdSeconds) { 207 | // In order to catch latency issues, make sure that the latency 208 | // threshold is greater than the websocket timestamp interval 209 | mediaPlayer.currentTime = vueApp.timestamp; 210 | } 211 | }); 212 | } 213 | -------------------------------------------------------------------------------- /public/media/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wetfish/sync/33a067972fdeb5a1213956eb4fbbc8993adea480/public/media/.gitkeep -------------------------------------------------------------------------------- /public/views/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Wetfish Sync 7 | 8 | 9 | 10 | 11 |
12 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const socket = require('socket.io'); 3 | 4 | require('dotenv').config(); 5 | 6 | const MediaPlayer = require('./media-player'); 7 | 8 | const app = express(); 9 | const playlistUrl = process.env.URL || 'http://localhost:3000'; 10 | const port = process.env.PORT || 3000; 11 | const repeat = process.env.REPEAT; 12 | const argv = require('yargs-parser')(process.argv); 13 | 14 | /* 15 | Actually... all of this stuff should be served by a real webserver, so uploading files to clients doesn't block the websocket thread 16 | */ 17 | 18 | // Basic Middleware 19 | app.use(express.static(__dirname + '/public')); 20 | // svg Sprites from Font Awesome 21 | app.use(express.static(__dirname + '/node_modules/@fortawesome/fontawesome-free/sprites')); 22 | // Basic Routes 23 | app.get('/', (req, res) => { 24 | res.sendFile(__dirname + '/public/views/index.html'); 25 | }); 26 | 27 | // Hosted frameworks and libraries 28 | app.get('/vue.js', (req, res) => res.sendFile(__dirname + '/node_modules/vue/dist/vue.js')); 29 | app.get('/socket.io.js', (req, res) => res.sendFile(__dirname + '/node_modules/socket.io-client/dist/socket.io.js')); 30 | app.get('/fscreen.js', (req, res) => res.sendFile(__dirname + '/node_modules/fscreen/dist/fscreen.esm.js')); 31 | 32 | // Start server 33 | const server = app.listen(port, () => { 34 | console.log(`Server listening on port: ${port}`); 35 | }); 36 | 37 | // Socket setup 38 | let io = socket(server); 39 | io.on('connection', (client) => { 40 | let index = mediaPlayer.mediaIndex; 41 | let url = `${playlistUrl}${mediaPlayer.playlist[index]}`; 42 | if (argv.m3u) { 43 | //if the url is remote, don't append the project root url 44 | if (url.startsWith('http')) { 45 | url = `${mediaPlayer.playlist[index]['url']}`; 46 | } 47 | else { 48 | url = `${playlistUrl}${mediaPlayer.playlist[index]['url']}`; 49 | } 50 | } 51 | else url = `${playlistUrl}${mediaPlayer.playlist[index]}`; 52 | const timestamp = mediaPlayer.getTimestamp(); 53 | const mediaType = mediaPlayer.mediaTypes[index]; 54 | const duration = mediaPlayer.mediaLengths[index]; 55 | console.log(`Client connected! Now playing ${mediaType} file ${url}. Timestamp: ${timestamp}`); 56 | client.emit('updateClient', { 57 | mediaType: mediaType, 58 | timestamp: timestamp, 59 | duration: duration, 60 | url: url 61 | }); 62 | }); 63 | 64 | // Start mediaPlayer 65 | let mediaPlayer = new MediaPlayer(io); 66 | mediaPlayer.init(); 67 | 68 | // Stop server depending on value given from REPEAT constant 69 | function checkRepeat(repeat, count) { 70 | if (repeat == count) { 71 | console.log('we have played through the list '+count+' times'); 72 | process.exit('bye bye!'); 73 | } 74 | else if (repeat==='false'&& count == 1) { 75 | console.log('we have played through the list'); 76 | process.exit('bye bye!'); 77 | } 78 | //if there's no repeat count or repeat is anything other than false, repeat ad infinitum 79 | } 80 | setInterval(() => { 81 | let index = mediaPlayer.mediaIndex; 82 | let total = mediaPlayer.playlist.length; 83 | let timestamp = mediaPlayer.getTimestamp(); 84 | let mediaType = mediaPlayer.mediaTypes[index]; 85 | let playlistCount = mediaPlayer.playlistCount; 86 | let data = { 87 | humanReadableIndex: index + 1, 88 | mediaType: mediaType, 89 | timestamp: timestamp, 90 | totalFiles: total 91 | }; 92 | checkRepeat(repeat,playlistCount); 93 | io.sockets.emit('timestamp', data); 94 | }, 3000); 95 | --------------------------------------------------------------------------------