├── .DS_Store ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── question.md ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── _config.yml ├── build-production.js ├── config.json ├── icons ├── large.png ├── mac │ └── icon.icns ├── tray.png └── win │ └── icon.ico ├── main.js ├── package.json ├── static ├── configure.html ├── css │ ├── configure.css │ ├── libraryConfiguration.css │ └── theming.css ├── js │ ├── configure.js │ ├── libraryConfiguration.js │ └── themes.js └── libraryConfiguration.html ├── utils ├── MBClient.js ├── connectAPI.js ├── helpers.js ├── logger.js ├── serverDiscoveryClient.js ├── startupHandler.js └── updateChecker.js └── yarn.lock /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oonqt/MBCord/c7bf4bccfd55abb00a5ea1a35af66f3f21a82d07/.DS_Store -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. Explain the steps that you took leading up to the bug to help aid in recreating it. 12 | 13 | **Expected behavior** 14 | A clear and concise description of what you expected to happen. 15 | 16 | **Screenshots** 17 | If applicable, add screenshots to help explain your problem. 18 | 19 | **Error** 20 | * Attach the most recent log. Logs can be found by right clicking the tray application and clicking "Show Logs". Although it does its best to remove any, it's a good idea to give the logs a quick scrub to ensure there aren't any credentials/addresses 21 | 22 | **Desktop (please complete the following information):** 23 | - OS: [e.g. Windows] 24 | - Server Type: [e.g. Jellyfin] 25 | - Version [e.g. 1.0.9] 26 | 27 | **Additional context** 28 | Add any other context about the problem here. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: feature 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the feature/change you'd like** 11 | A clear and concise description of what you want to see. 12 | 13 | **Additional context** 14 | Add any other context or screenshots about the feature request here. 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Ask anything that you have concerns about 4 | title: '' 5 | labels: question 6 | assignees: '' 7 | 8 | --- 9 | ** Replace [] with [x] to signify you've completed the following 10 | 11 | ** [] I have read over the setup guide (https://github.com/oonqt/MBCord/wiki/Initial-Setup) 12 | 13 | ** [] I have read over the commonly asked questions (https://github.com/oonqt/MBCord/wiki/Commonly-Asked-Issues-Questions) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | build/ 3 | todos.txt 4 | .DS_STORE -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "bracketSpacing": true, 5 | "jsxSingleQuote": true, 6 | "arrowParens": "always", 7 | "trailingComma": "none" 8 | } 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2020 Luke C 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MBCord 2 | 3 | ![License](https://badgen.net/github/license/oonqt/MBCord) ![Version](https://badgen.net/github/release/oonqt/MBCord) ![Stars](https://badgen.net/github/stars/oonqt/MBCord) ![Closed Issues](https://badgen.net/github/closed-issues/oonqt/mbcord) ![Issues](https://badgen.net/github/open-issues/oonqt/MBCord) ![Download count](https://badgen.net/github/assets-dl/oonqt/MBCord) 4 | 5 | MBCord project has been abandoned. If anyone would like to maintain, please create an issue or contact me. 6 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /build-production.js: -------------------------------------------------------------------------------- 1 | const zip = require("electron-installer-zip"); 2 | const rimraf = require("rimraf"); 3 | const path = require("path"); 4 | const fs = require("fs"); 5 | const { promisify } = require("util"); 6 | const { execSync } = require("child_process"); 7 | const { prodBuilds } = require("./package.json"); 8 | 9 | const zipAsync = promisify(zip); 10 | 11 | (async () => { 12 | console.log("\nPackaging all platforms... \n"); 13 | 14 | for(const build of prodBuilds) { 15 | console.log(`Packaging ${build}`) 16 | execSync(`npm run build:${build}`, { stdio: "ignore" }); 17 | } 18 | 19 | console.log("\nCompressing... \n"); 20 | 21 | let packedBuilds = fs.readdirSync(path.join(__dirname, "build")); 22 | 23 | for(const build of packedBuilds) { 24 | console.log(`Compressing ${build}`); 25 | 26 | const buildPath = path.join("build", build); 27 | 28 | // problem code 29 | await zipAsync({ 30 | dir: buildPath, 31 | out: `${buildPath}.zip` 32 | }); 33 | 34 | rimraf.sync(buildPath); 35 | } 36 | })(); -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "clientIds": { 3 | "emby": "843293609960275968", 4 | "jellyfin": "843294504420769823" 5 | }, 6 | "updateCheckInterval": 900000, 7 | "maxLogFileSizeMB": 50, 8 | "discordConnectRetryMS": 30000, 9 | "MBConnectRetryMS": 30000, 10 | "presenceUpdateIntervalMS": 15000, 11 | "maximumSessionInactivity": 300, 12 | "iconUrl": "https://user-images.githubusercontent.com/36819562/73629369-c0b4a100-4607-11ea-84c8-ff6c73d5deba.png", 13 | "logRetentionCount": 10 14 | } -------------------------------------------------------------------------------- /icons/large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oonqt/MBCord/c7bf4bccfd55abb00a5ea1a35af66f3f21a82d07/icons/large.png -------------------------------------------------------------------------------- /icons/mac/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oonqt/MBCord/c7bf4bccfd55abb00a5ea1a35af66f3f21a82d07/icons/mac/icon.icns -------------------------------------------------------------------------------- /icons/tray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oonqt/MBCord/c7bf4bccfd55abb00a5ea1a35af66f3f21a82d07/icons/tray.png -------------------------------------------------------------------------------- /icons/win/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oonqt/MBCord/c7bf4bccfd55abb00a5ea1a35af66f3f21a82d07/icons/win/icon.ico -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const { 2 | app, 3 | BrowserWindow, 4 | ipcMain, 5 | Tray, 6 | Menu, 7 | shell, 8 | dialog, 9 | Notification 10 | } = require('electron'); 11 | const crypto = require('crypto'); 12 | const dedent = require('dedent-js'); 13 | const fs = require('fs'); 14 | const os = require('os'); 15 | const unhandled = require('electron-unhandled'); 16 | const contextMenu = require('electron-context-menu'); 17 | const { is, chromeVersion, electronVersion, openNewGitHubIssue } = require('electron-util'); 18 | const path = require('path'); 19 | const { v4 } = require('uuid'); 20 | const Store = require('electron-store'); 21 | const keytar = require('keytar'); 22 | const StartupHandler = require('./utils/startupHandler'); 23 | const MBClient = require('./utils/MBClient'); 24 | const DiscordRPC = require('discord-rpc'); 25 | const UpdateChecker = require('./utils/updateChecker'); 26 | const Logger = require('./utils/logger'); 27 | const serverDiscoveryClient = require('./utils/serverDiscoveryClient'); 28 | const { scrubObject, booleanToYN } = require('./utils/helpers'); 29 | const { version, name, author, homepage } = require('./package.json'); 30 | const { 31 | clientIds, 32 | iconUrl, 33 | updateCheckInterval, 34 | logRetentionCount, 35 | discordConnectRetryMS, 36 | MBConnectRetryMS, 37 | presenceUpdateIntervalMS, 38 | maximumSessionInactivity, 39 | maxLogFileSizeMB 40 | } = require('./config.json'); 41 | 42 | /** 43 | * @type {BrowserWindow} 44 | */ 45 | let mainWindow; 46 | 47 | /** 48 | * @type {Tray} 49 | */ 50 | let tray; 51 | 52 | /** 53 | * @type {MBClient} 54 | */ 55 | let mbc; 56 | 57 | /** 58 | * @type {DiscordRPC.Client} 59 | */ 60 | let rpc; 61 | 62 | let presenceUpdate; 63 | let connectRPCTimeout; 64 | let updateChecker; 65 | 66 | (async () => { 67 | const oldConfigFile = path.join(app.getPath('userData'), 'config.json'); 68 | if (fs.existsSync(oldConfigFile)) fs.unlinkSync(oldConfigFile); // For security reasons we will delete the old config file as the new one will be encrypted, this one may contain sensitive information 69 | 70 | let encryptionKey = await keytar.getPassword(name, 'dpkey'); 71 | if (!encryptionKey) { 72 | encryptionKey = crypto.randomBytes(32).toString('hex'); 73 | await keytar.setPassword(name, 'dpkey', encryptionKey); 74 | } 75 | 76 | const store = new Store({ 77 | encryptionKey, 78 | name: 'settings', 79 | schema: { 80 | enableDebugLogging: { 81 | type: 'boolean', 82 | default: false 83 | }, 84 | isConfigured: { 85 | type: 'boolean', 86 | default: false 87 | }, 88 | useTimeElapsed: { 89 | type: 'boolean', 90 | default: false 91 | }, 92 | UUID: { 93 | type: 'string', 94 | default: v4() 95 | }, 96 | doDisplayStatus: { 97 | type: 'boolean', 98 | default: true 99 | }, 100 | servers: { 101 | type: 'array', 102 | default: [] 103 | } 104 | } 105 | }); 106 | const logger = new Logger( 107 | is.development ? 'console' : 'file', 108 | path.join(app.getPath('userData'), 'logs'), 109 | logRetentionCount, 110 | name, 111 | maxLogFileSizeMB, 112 | store.get('enableDebugLogging') 113 | ); 114 | const startupHandler = new StartupHandler(app, name); 115 | const checker = new UpdateChecker(author, name, version); 116 | 117 | const debugInfo = () => { 118 | return dedent`DEBUG INFO: 119 | Development Mode: ${is.development} 120 | Platform: ${process.platform} (Version ${os.release()}) 121 | Architecture: ${process.arch} 122 | MBCord version: ${version} 123 | Node version: ${process.versions.node} 124 | Electron version: ${electronVersion} 125 | Chrome version: ${chromeVersion} 126 | `; 127 | } 128 | 129 | logger.info('Starting app...'); 130 | logger.info(debugInfo()); 131 | 132 | contextMenu({ 133 | showLookUpSelection: false, 134 | showSearchWithGoogle: false 135 | }); 136 | 137 | unhandled({ 138 | logger: error => logger.error(error), 139 | showDialog: true, 140 | reportButton: error => { 141 | openNewGitHubIssue({ 142 | user: author, 143 | repo: name, 144 | labels: ['bug'], 145 | body: `\`\`\`\n${error.stack}\n\`\`\`\n\n---\n\n${debugInfo()}` 146 | }) 147 | } 148 | }); 149 | 150 | const startApp = () => { 151 | mainWindow = new BrowserWindow({ 152 | width: 480, 153 | height: 310, 154 | minimizable: false, 155 | maximizable: false, 156 | webPreferences: { 157 | nodeIntegration: true, 158 | contextIsolation: false, 159 | enableRemoteModule: true 160 | }, 161 | resizable: false, 162 | title: name, 163 | show: false 164 | }); 165 | 166 | // only allow one instance 167 | const lockedInstance = app.requestSingleInstanceLock(); 168 | if (!lockedInstance) return app.quit(); 169 | 170 | // in development mode we allow resizing 171 | if (is.development) { 172 | mainWindow.resizable = true; 173 | mainWindow.maximizable = true; 174 | mainWindow.minimizable = true; 175 | } else { 176 | mainWindow.setMenu(null); 177 | } 178 | 179 | app.setAppUserModelId(name); 180 | 181 | if (store.get('isConfigured')) { 182 | startPresenceUpdater(); 183 | moveToTray(); 184 | } else { 185 | loadWindow('configure', { x: 600, y: 300 }, false); 186 | } 187 | 188 | checkForUpdates(); 189 | updateChecker = setInterval(checkForUpdates, updateCheckInterval); 190 | }; 191 | 192 | const getSelectedServer = () => store.get('servers').find((server) => server.isSelected); 193 | 194 | const resetApp = () => { 195 | store.clear(); 196 | 197 | stopPresenceUpdater(); 198 | 199 | tray.destroy(); 200 | 201 | loadWindow('configure', { x: 600, y: 300 }, false); 202 | }; 203 | 204 | const toggleDisplay = async () => { 205 | store.set('doDisplayStatus', !store.get('doDisplayStatus')); 206 | 207 | const doDisplay = store.get('doDisplayStatus'); 208 | 209 | logger.debug(`doDisplayStatus: ${doDisplay}`); 210 | if (!doDisplay && rpc) await rpc.clearActivity(); 211 | }; 212 | 213 | const appBarHide = (doHide) => { 214 | if (doHide) { 215 | mainWindow.hide(); 216 | if (process.platform === 'darwin') app.dock.hide(); 217 | } else { 218 | mainWindow.show(); 219 | if (process.platform === 'darwin') app.dock.show(); 220 | } 221 | 222 | mainWindow.setSkipTaskbar(doHide); 223 | }; 224 | 225 | const loadWindow = (pageName, size, preventAppQuitOnClose = true) => { 226 | mainWindow.setSize(size.x, size.y); 227 | mainWindow.loadFile(path.join(__dirname, 'static', `${pageName}.html`)); 228 | 229 | if(preventAppQuitOnClose) { 230 | mainWindow.addListener('close', (closeNoExit = (e) => { 231 | e.preventDefault(); // prevent app close 232 | mainWindow.hide(); // hide window 233 | appBarHide(true); 234 | mainWindow.removeListener('close', closeNoExit); // remove listener 235 | })); 236 | } 237 | 238 | appBarHide(false); 239 | } 240 | 241 | const stopPresenceUpdater = async () => { 242 | if (mbc) { 243 | await mbc.logout(); 244 | mbc = null; 245 | } 246 | clearInterval(presenceUpdate); 247 | presenceUpdate = null; 248 | }; 249 | 250 | const addServer = (server) => { 251 | if (!tray) return logger.warn('Attempted to add server without tray'); 252 | 253 | const servers = store.get('servers'); 254 | servers.push(server); 255 | 256 | store.set('servers', servers); 257 | 258 | tray.setContextMenu(buildTrayMenu(servers)); 259 | }; 260 | 261 | const selectServer = async (server) => { 262 | if (!tray) return logger.warn('Attempted to select server without tray'); 263 | 264 | const savedServers = store.get('servers'); 265 | const savedServer = savedServers.find(server => server.isSelected); 266 | if (savedServer && (server.serverId === savedServer.serverId)) return logger.debug('Tried to select server that\'s already selected'); 267 | 268 | const servers = savedServers.map((savedServer) => { 269 | return savedServer.serverId === server.serverId 270 | ? { ...savedServer, isSelected: true } 271 | : { ...savedServer, isSelected: false }; 272 | }); 273 | 274 | store.set('servers', servers); 275 | 276 | tray.setContextMenu(buildTrayMenu(servers)); 277 | 278 | mainWindow.webContents.send('RECEIVE_TYPE', server.serverType); 279 | 280 | await stopPresenceUpdater(); 281 | startPresenceUpdater(); 282 | }; 283 | 284 | const removeServer = (serverToRemove) => { 285 | if (!tray) return logger.warn('Attempted to remove server without tray'); 286 | 287 | let wasSelected = false; 288 | const servers = store 289 | .get('servers') 290 | .filter((server) => { 291 | if (server.serverId !== serverToRemove.serverId) { 292 | return true; 293 | } else { 294 | if (server.isSelected) wasSelected = true; 295 | return false; 296 | } 297 | }); 298 | 299 | store.set('servers', servers); 300 | 301 | tray.setContextMenu(buildTrayMenu(servers)); 302 | 303 | dialog.showMessageBox({ 304 | title: name, 305 | type: 'info', 306 | detail: `Successfully removed server from the server list. ${wasSelected ? 'Since this was the currently selected server, your presence will no longer be displayed.' : ''}` 307 | }); 308 | }; 309 | 310 | const buildTrayMenu = (servers) => { 311 | const serverSelectionSubmenu = []; 312 | 313 | for (const server of servers) { 314 | serverSelectionSubmenu.push({ 315 | label: `${server.address} (${server.serverName})`, 316 | submenu: [ 317 | { 318 | type: 'normal', 319 | label: `Selected Server: ${booleanToYN(server.isSelected)}`, 320 | enabled: false 321 | }, 322 | { 323 | label: 'Remove Server', 324 | click: () => removeServer(server) 325 | }, 326 | { 327 | label: 'Select Server', 328 | click: () => selectServer(server) 329 | } 330 | ] 331 | }); 332 | } 333 | 334 | const contextMenu = Menu.buildFromTemplate([ 335 | { 336 | type: 'checkbox', 337 | label: 'Run at Startup', 338 | click: () => startupHandler.toggle(), 339 | checked: startupHandler.isEnabled 340 | }, 341 | { 342 | type: 'checkbox', 343 | label: 'Display as Status', 344 | click: () => toggleDisplay(), 345 | checked: store.get('doDisplayStatus') 346 | }, 347 | { 348 | label: 'Use Time Elapsed', 349 | type: 'checkbox', 350 | checked: store.get('useTimeElapsed'), 351 | click: () => { 352 | const isUsing = store.get('useTimeElapsed'); 353 | 354 | store.set({ useTimeElapsed: !isUsing }); 355 | } 356 | }, 357 | { 358 | type: 'separator' 359 | }, 360 | { 361 | label: 'Add Server', 362 | click: () => loadWindow('configure', { x: 600, y: 300 }) 363 | }, 364 | { 365 | label: 'Select Server', 366 | submenu: serverSelectionSubmenu 367 | }, 368 | { 369 | label: 'Set Ignored Libraries', 370 | click: () => loadWindow('libraryConfiguration', { x: 450, y: 500 }) 371 | }, 372 | { 373 | type: 'separator' 374 | }, 375 | { 376 | label: 'Check for Updates', 377 | click: () => checkForUpdates(true) 378 | }, 379 | { 380 | label: 'Enable Debug Logging', 381 | type: 'checkbox', 382 | checked: store.get('enableDebugLogging'), 383 | click: () => { 384 | const isEnabled = store.get('enableDebugLogging'); 385 | 386 | logger.enableDebugLogging = !isEnabled; 387 | store.set({ enableDebugLogging: !isEnabled }); 388 | } 389 | }, 390 | { 391 | label: 'Show Logs', 392 | click: () => shell.openPath(logger.logPath) 393 | }, 394 | { 395 | label: 'Reset App', 396 | click: () => resetApp() 397 | }, 398 | { 399 | type: 'separator' 400 | }, 401 | { 402 | label: 'Restart App', 403 | click: () => { 404 | app.quit(); 405 | app.relaunch(); 406 | } 407 | }, 408 | { 409 | label: 'Quit', 410 | role: 'quit' 411 | }, 412 | { 413 | type: 'separator' 414 | }, 415 | { 416 | type: 'normal', 417 | label: `${name} v${version}`, 418 | enabled: false 419 | } 420 | ]); 421 | 422 | return contextMenu; 423 | }; 424 | 425 | const moveToTray = () => { 426 | tray = new Tray(path.join(__dirname, 'icons', 'tray.png')); 427 | 428 | const servers = store.get('servers'); 429 | const contextMenu = buildTrayMenu(servers); 430 | 431 | tray.setToolTip(name); 432 | tray.setContextMenu(contextMenu); 433 | 434 | if (!is.development) new Notification({ 435 | title: `${name} ${version}`, 436 | icon: path.join(__dirname, 'icons', 'large.png'), 437 | body: `${name} has been minimized to the tray` 438 | }).show(); 439 | 440 | appBarHide(true); 441 | }; 442 | 443 | const checkForUpdates = (calledFromTray) => { 444 | checker.checkForUpdate((err, data) => { 445 | if (err) { 446 | if (calledFromTray) { 447 | dialog.showErrorBox(name, 'Failed to check for updates'); 448 | } 449 | logger.error(err); 450 | return; 451 | } 452 | 453 | if (data.pending) { 454 | if (!calledFromTray) clearInterval(updateChecker); 455 | 456 | dialog.showMessageBox( 457 | { 458 | type: 'info', 459 | buttons: ['Okay', 'Get Latest Version'], 460 | message: 'A new version is available!', 461 | detail: `Your version is ${version}. The latest version currently available is ${data.version}` 462 | }, 463 | (index) => { 464 | if (index === 1) { 465 | shell.openExternal(`${homepage}/releases/latest`); 466 | } 467 | } 468 | ); 469 | } else if (calledFromTray) { 470 | dialog.showMessageBox({ 471 | title: name, 472 | type: 'info', 473 | message: 'There are no new versions available to download' 474 | }); 475 | } 476 | }); 477 | }; 478 | 479 | const disconnectRPC = async () => { 480 | if (rpc) { 481 | logger.info('Disconnecting from Discord'); 482 | clearTimeout(connectRPCTimeout); 483 | rpc.transport.removeAllListeners('close'); 484 | await rpc.clearActivity(); 485 | await rpc.destroy(); 486 | rpc = null; 487 | } 488 | }; 489 | 490 | const connectRPC = () => { 491 | return new Promise((resolve) => { 492 | if (rpc) return logger.warn('Attempted to connect to RPC pipe while already connected'); 493 | 494 | const server = getSelectedServer(); 495 | if (!server) return logger.warn('No selected server'); 496 | 497 | rpc = new DiscordRPC.Client({ transport: 'ipc' }); 498 | rpc 499 | .login({ clientId: clientIds[server.serverType] }) 500 | .then(resolve) 501 | .catch(() => { 502 | logger.error( 503 | `Failed to connect to Discord. Attempting to reconnect in ${ 504 | discordConnectRetryMS / 1000 505 | } seconds` 506 | ); 507 | }); 508 | 509 | rpc.transport.once('close', () => { 510 | disconnectRPC(); 511 | 512 | logger.warn( 513 | `Discord RPC connection closed. Attempting to reconnect in ${ 514 | discordConnectRetryMS / 1000 515 | } seconds` 516 | ); 517 | 518 | connectRPCTimeout = setTimeout(connectRPC, discordConnectRetryMS); 519 | }); 520 | 521 | rpc.transport.once('open', () => { 522 | logger.info(`Connected to Discord (Server type: ${server.serverType})`); 523 | }); 524 | }); 525 | }; 526 | 527 | const startPresenceUpdater = async () => { 528 | const data = getSelectedServer(); 529 | if (!data) return logger.warn('No selected server'); 530 | 531 | mbc = new MBClient(data, { 532 | deviceName: name, 533 | deviceId: store.get('UUID'), 534 | deviceVersion: version, 535 | iconUrl: iconUrl 536 | }); 537 | 538 | logger.debug('Attempting to log into server'); 539 | logger.debug(scrubObject(data, 'username', 'password', 'address')); 540 | 541 | await disconnectRPC(); 542 | await connectRPC(); 543 | 544 | try { 545 | await mbc.login(); 546 | } catch (err) { 547 | logger.error('Failed to authenticate. Retrying in 30 seconds.'); 548 | logger.error(err); 549 | setTimeout(startPresenceUpdater, MBConnectRetryMS); 550 | return; 551 | } 552 | 553 | setPresence(); 554 | if(!presenceUpdate) presenceUpdate = setInterval(setPresence, presenceUpdateIntervalMS); 555 | }; 556 | 557 | const setPresence = async () => { 558 | if (!store.get('doDisplayStatus')) return logger.debug('doDisplayStatus disabled, not setting status'); 559 | 560 | const data = store.get(); 561 | const server = getSelectedServer(); 562 | if (!server) return logger.warn('No selected server'); 563 | 564 | try { 565 | let sessions; 566 | 567 | try { 568 | sessions = await mbc.getSessions(maximumSessionInactivity); 569 | } catch (err) { 570 | return logger.error(`Failed to get sessions: ${err}`); 571 | } 572 | 573 | const session = sessions.find( 574 | (session) => 575 | session.NowPlayingItem !== undefined && 576 | session.UserName && 577 | session.UserName.toLowerCase() === server.username.toLowerCase() 578 | ); 579 | 580 | if (session) { 581 | const NPItem = session.NowPlayingItem; 582 | 583 | const NPItemLibraryID = await mbc.getItemInternalLibraryId(NPItem.Id); 584 | // convert 585 | if (server.ignoredViews.includes(NPItemLibraryID)) { 586 | // prettier-ignore 587 | logger.debug(`${NPItem.Name} is in library with ID ${NPItemLibraryID} which is on the ignored library list, will not set status`); 588 | if (rpc) await rpc.clearActivity(); 589 | return; 590 | } 591 | 592 | // remove client IP addresses (hopefully this takes care of all of them) 593 | logger.debug(scrubObject(session, 'RemoteEndPoint')); 594 | 595 | const currentEpochSeconds = new Date().getTime() / 1000; 596 | const startTimestamp = Math.round( 597 | currentEpochSeconds - 598 | Math.round(session.PlayState.PositionTicks / 10000 / 1000) 599 | ); 600 | const endTimestamp = Math.round( 601 | currentEpochSeconds + 602 | Math.round( 603 | (session.NowPlayingItem.RunTimeTicks - 604 | session.PlayState.PositionTicks) / 605 | 10000 / 606 | 1000 607 | ) 608 | ); 609 | 610 | logger.debug( 611 | `Time until media end: ${ 612 | endTimestamp - currentEpochSeconds 613 | }, been playing since: ${startTimestamp}` 614 | ); 615 | 616 | setTimeout( 617 | setPresence, 618 | (endTimestamp - currentEpochSeconds) * 1000 + 1500 619 | ); 620 | 621 | const defaultProperties = { 622 | largeImageKey: 'large', 623 | largeImageText: `${ 624 | NPItem.Type === 'Audio' ? 'Listening' : 'Watching' 625 | } on ${session.Client}`, 626 | smallImageKey: session.PlayState.IsPaused ? 'pause' : 'play', 627 | smallImageText: session.PlayState.IsPaused ? 'Paused' : 'Playing', 628 | instance: false 629 | }; 630 | 631 | if (!session.PlayState.IsPaused) { 632 | data.useTimeElapsed 633 | ? (defaultProperties.startTimestamp = startTimestamp) 634 | : (defaultProperties.endTimestamp = endTimestamp); 635 | } 636 | 637 | switch (NPItem.Type) { 638 | case 'Episode': { 639 | // prettier-ignore 640 | const seasonNum = NPItem.ParentIndexNumber 641 | // prettier-ignore 642 | const episodeNum = NPItem.IndexNumber; 643 | 644 | rpc.setActivity({ 645 | details: `Watching ${NPItem.SeriesName} ${ 646 | NPItem.ProductionYear ? `(${NPItem.ProductionYear})` : '' 647 | }`, 648 | state: `${ 649 | seasonNum ? `S${seasonNum.toString().padStart(2, '0')}` : '' 650 | }${ 651 | episodeNum ? `E${episodeNum.toString().padStart(2, '0')}: ` : '' 652 | }${NPItem.Name}`, 653 | ...defaultProperties 654 | }); 655 | break; 656 | } 657 | case 'Movie': { 658 | rpc.setActivity({ 659 | details: 'Watching a Movie', 660 | state: `${NPItem.Name} ${ 661 | NPItem.ProductionYear ? `(${NPItem.ProductionYear})` : '' 662 | }`, 663 | ...defaultProperties 664 | }); 665 | break; 666 | } 667 | case 'MusicVideo': { 668 | const artists = NPItem.Artists.splice(0, 3); // we only want 3 artists 669 | 670 | rpc.setActivity({ 671 | details: `Watching ${NPItem.Name} ${ 672 | NPItem.ProductionYear ? `(${NPItem.ProductionYear})` : '' 673 | }`, 674 | state: `By ${ 675 | artists.length ? artists.join(', ') : 'Unknown Artist' 676 | }`, 677 | ...defaultProperties 678 | }); 679 | break; 680 | } 681 | case 'Audio': { 682 | const artists = NPItem.Artists.splice(0, 3); 683 | const albumArtists = NPItem.AlbumArtists.map( 684 | (ArtistInfo) => ArtistInfo.Name 685 | ).splice(0, 3); 686 | 687 | rpc.setActivity({ 688 | details: `Listening to ${NPItem.Name} ${ 689 | NPItem.ProductionYear ? `(${NPItem.ProductionYear})` : '' 690 | }`, 691 | state: `By ${ 692 | artists.length 693 | ? artists.join(', ') 694 | : albumArtists.length 695 | ? albumArtists.join(', ') 696 | : 'Unknown Artist' 697 | }`, 698 | ...defaultProperties 699 | }); 700 | break; 701 | } 702 | default: 703 | rpc.setActivity({ 704 | details: 'Watching Other Content', 705 | state: NPItem.Name, 706 | ...defaultProperties 707 | }); 708 | } 709 | } else { 710 | logger.debug('No session, clearing activity'); 711 | if (rpc) await rpc.clearActivity(); 712 | } 713 | } catch (error) { 714 | logger.error(`Failed to set activity: ${error}`); 715 | } 716 | }; 717 | 718 | ipcMain.on('RECEIVE_INFO', async (event) => { 719 | let jellyfinServers = []; 720 | let embyServers = []; 721 | 722 | try { 723 | jellyfinServers = await serverDiscoveryClient.find(1750, 'jellyfin'); 724 | } catch (err) { 725 | jellyfinServers = []; 726 | logger.error('Failed to get Jellyfin servers'); 727 | logger.error(err); 728 | } 729 | 730 | try { 731 | embyServers = await serverDiscoveryClient.find(1750, 'emby'); 732 | } catch (err) { 733 | embyServers = []; 734 | logger.error('Failed to get Emby servers'); 735 | logger.error(err); 736 | } 737 | 738 | // TODO: filter out servers that are already saved from showing in autodetect 739 | const servers = [ 740 | // prettier-ignore 741 | ...embyServers, 742 | ...jellyfinServers 743 | ]; 744 | 745 | logger.debug(`Server discovery result: ${JSON.stringify(servers)}`); 746 | 747 | event.reply('RECEIVE_INFO', servers); 748 | }); 749 | 750 | ipcMain.on('VIEW_SAVE', (_, data) => { 751 | // CONVERT 752 | const servers = store.get('servers'); 753 | const selectedServer = getSelectedServer(); 754 | const ignoredViews = selectedServer.ignoredViews; 755 | 756 | if (ignoredViews.includes(data)) { 757 | ignoredViews.splice(ignoredViews.indexOf(data), 1); 758 | } else { 759 | ignoredViews.push(data); 760 | } 761 | 762 | store.set({ 763 | servers: servers.map((server) => 764 | server.isSelected ? { ...server, ignoredViews } : server 765 | ) 766 | }); 767 | }); 768 | 769 | ipcMain.on('TYPE_CHANGE', (_, data) => { 770 | // CONVERT 771 | switch (data) { 772 | case 'jellyfin': 773 | store.set({ serverType: 'jellyfin' }); 774 | break; 775 | case 'emby': 776 | store.set({ serverType: 'emby' }); 777 | break; 778 | } 779 | }); 780 | 781 | ipcMain.on('RECEIVE_VIEWS', async (event) => { 782 | let userViews; 783 | 784 | if (!mbc.isAuthenticated) { 785 | // Not authed yet 786 | logger.info('Attempting to authenticate'); 787 | try { 788 | await mbc.login(); 789 | } catch (err) { 790 | event.reply('FETCH_FAILED'); 791 | dialog.showErrorBox( 792 | name, 793 | 'Failed to fetch libraries for your user. Please try the reload button.' 794 | ); 795 | 796 | logger.error('Failed to authenticate'); 797 | logger.error(err); 798 | } 799 | } 800 | 801 | try { 802 | userViews = await mbc.getUserViews(); 803 | } catch (err) { 804 | event.reply('FETCH_FAILED'); 805 | dialog.showErrorBox( 806 | name, 807 | 'Failed to fetch libraries for your user. Please try the reload button.' 808 | ); 809 | logger.error(err); 810 | 811 | return; 812 | } 813 | 814 | // convert 815 | const viewData = { 816 | availableViews: userViews, 817 | ignoredViews: getSelectedServer().ignoredViews 818 | }; 819 | 820 | logger.debug('Sending view data to renderer'); 821 | logger.debug(viewData); 822 | 823 | event.reply('RECEIVE_VIEWS', viewData); 824 | }); 825 | 826 | 827 | // FUTURE RELEASE, UNDECIDED.. 828 | // ipcMain.on('RECEIVE_CONNECT_SERVERS', async (event, data) => { 829 | // logger.debug(`Receive connect servers data: ${JSON.stringify(data)}`); 830 | 831 | // let connectUser; 832 | // try { 833 | // connectUser = await connectAPI.getConnectUser(data.nameOrEmail, data.password); 834 | // } catch (err) { 835 | // logger.error(err); 836 | 837 | // let errorMessage; 838 | 839 | // if (err.status && err.status === 401) { 840 | // errorMessage = 'Failed to authenticate with connect, no user with that email/name exists'; 841 | // } else if (err.status && err.status === 401) { 842 | // errorMessage = 'Failed to authenticate with connect, invalid password provided'; 843 | // } else { 844 | // errorMessage = 'Failed to authenticate with connect, an unknown error occured.'; 845 | // } 846 | 847 | // dialog.showMessageBox(mainWindow, { 848 | // type: 'error', 849 | // title: name, 850 | // detail: errorMessage 851 | // }); 852 | 853 | // return event.reply('CONNECT_ERROR'); 854 | // } 855 | 856 | // let connectServers; 857 | // try { 858 | // connectServers = await connectAPI.getConnectServers(connectUser.AccessToken, connectUser.User.Id); 859 | // } catch (err) { 860 | // logger.error(err); 861 | 862 | // dialog.showMessageBox(mainWindow, { 863 | // type: 'error', 864 | // title: name, 865 | // detail: 'An error occured and we failed to fetch the connect servers linked to your account, please try again later.' 866 | // }); 867 | 868 | // return event.reply('CONNECT_ERROR'); 869 | // } 870 | 871 | // event.reply('RECEIVE_CONNECT_SERVERS', connectServers); 872 | // }); 873 | 874 | ipcMain.on('ADD_SERVER', async (event, data) => { 875 | logger.debug('Is first setup: ' + !store.get('isConfigured')); 876 | 877 | const emptyFields = Object.entries(data) 878 | .filter((entry) => !entry[1] && entry[0] !== 'password') // where entry[1] is the value, and if the field password is ignore it (emby and jelly dont require you to have a pw, even though you should even on local network) 879 | .map((field) => field[0]); // we map empty fields by their names 880 | 881 | if (emptyFields.length) { 882 | mainWindow.webContents.send('VALIDATION_ERROR', emptyFields); 883 | dialog.showMessageBox(mainWindow, { 884 | title: name, 885 | type: 'error', 886 | detail: 'Please make sure that all the fields are filled in!' 887 | }); 888 | return; 889 | } 890 | 891 | let client = new MBClient(data, { 892 | deviceName: name, 893 | deviceId: store.get('UUID'), 894 | deviceVersion: version, 895 | iconUrl: iconUrl 896 | }); 897 | 898 | logger.debug('Attempting to log into server'); 899 | logger.debug(scrubObject(data, 'username', 'password', 'address')); 900 | 901 | let serverInfo; 902 | try { 903 | await client.login(); 904 | serverInfo = await client.getSystemInfo(); 905 | } catch (error) { 906 | logger.error(error); 907 | dialog.showMessageBox(mainWindow, { 908 | type: 'error', 909 | title: name, 910 | detail: 'Invalid server address or login credentials' 911 | }); 912 | event.reply('RESET'); 913 | return; 914 | } 915 | 916 | if (!store.get('isConfigured')) { 917 | // convert 918 | store.set({ 919 | servers: [ 920 | { 921 | ...data, 922 | isSelected: true, 923 | ignoredViews: [], 924 | serverId: serverInfo.Id, 925 | serverName: serverInfo.ServerName 926 | } 927 | ], 928 | isConfigured: true, 929 | doDisplayStatus: true 930 | }); 931 | 932 | moveToTray(); 933 | startPresenceUpdater(); 934 | } else { 935 | logger.debug(store.get('servers')); 936 | 937 | const configuredServers = store.get('servers'); 938 | 939 | if ( 940 | configuredServers.some( 941 | (configuredServer) => 942 | configuredServer.serverId === serverInfo.Id 943 | ) 944 | ) { 945 | dialog.showMessageBox(mainWindow, { 946 | type: 'error', 947 | title: name, 948 | detail: 949 | 'You already configured this server, you can enable it from the tray.' 950 | }); 951 | 952 | event.reply('RESET', true); 953 | } else { 954 | const newServer = { 955 | ...data, 956 | isSelected: false, 957 | ignoredViews: [], 958 | serverId: serverInfo.Id, 959 | serverName: serverInfo.ServerName 960 | }; 961 | 962 | mainWindow.hide(); 963 | 964 | addServer(newServer); 965 | 966 | if (getSelectedServer()) { 967 | const res = await dialog.showMessageBox({ 968 | type: 'info', 969 | title: name, 970 | message: 971 | 'Your server has been successfully added. Would you like to select it automatically?', 972 | buttons: ['Yes', 'No'] 973 | }); 974 | 975 | if (res.response === 0) { 976 | selectServer(newServer); 977 | } 978 | } else { 979 | dialog.showMessageBox({ 980 | type: 'info', 981 | title: name, 982 | message: 983 | 'Your server has been successfully added and has been automatically selected.' 984 | }); 985 | 986 | selectServer(newServer); 987 | } 988 | 989 | appBarHide(true); 990 | } 991 | } 992 | }); 993 | 994 | ipcMain.on('RECEIVE_TYPE', (event) => { 995 | const selectedServer = getSelectedServer(); 996 | event.reply( 997 | 'RECEIVE_TYPE', 998 | selectedServer ? selectedServer.serverType : 'emby' 999 | ); 1000 | }); 1001 | 1002 | if (app.isReady()) { 1003 | startApp(); 1004 | } else { 1005 | app.once('ready', startApp); 1006 | } 1007 | })(); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MBCord", 3 | "version": "3.0.0", 4 | "description": "An Emby/Jellyfin rich presence client for Discord", 5 | "main": "main.js", 6 | "scripts": { 7 | "start": "electron .", 8 | "build": "node build-production.js", 9 | "build:mac": "electron-packager . MBCord --out=build --overwrite --asar --icon=icons/mac/icon.icns --platform=darwin --arch=x64", 10 | "build:win64": "electron-packager . MBCord --out=build --overwrite --asar --icon=icons/win/icon.ico --platform=win32 --arch=x64", 11 | "build:linux64": "electron-packager . MBCord --out=build --overwrite --asar --icon=icons/win/icon.ico --platform=linux --arch=x64", 12 | "build:linux32": "electron-packager . MBCord --out=build --overwrite --asar --icon=icons/win/icon.ico --platform=linux --arch=ia32", 13 | "build:win32": "electron-packager . MBCord --out=build --overwrite --asar --icon=icons/win/icon.ico --platform=win32 --arch=ia32", 14 | "build:armv7l": "electron-packager . MBCord --out=build --overwrite --asar --icon=icons/win/icon.ico --platform=linux --arch=armv7l", 15 | "build:arm64": "electron-packager . MBCord --out=build --overwrite --asar --icon=icons/win/icon.ico --platform=linux --arch=arm64" 16 | }, 17 | "prodBuilds": [ 18 | "mac", 19 | "win64", 20 | "win32", 21 | "linux64", 22 | "linux32" 23 | ], 24 | "author": "oonqt", 25 | "license": "MIT", 26 | "devDependencies": { 27 | "electron": "^13.3.0", 28 | "electron-installer-zip": "^0.1.2", 29 | "electron-packager": "^15.2.0", 30 | "rimraf": "^3.0.2", 31 | "yarn-upgrade-all": "^0.5.4" 32 | }, 33 | "dependencies": { 34 | "colors": "^1.4.0", 35 | "dedent-js": "^1.0.1", 36 | "deep-cleaner": "^1.2.1", 37 | "discord-rpc": "^3.2.0", 38 | "electron-context-menu": "^3.1.1", 39 | "electron-store": "^8.0.0", 40 | "electron-unhandled": "^3.0.2", 41 | "electron-util": "^0.16.0", 42 | "json-stringify-safe": "^5.0.1", 43 | "keytar": "^7.7.0", 44 | "material-icons": "^0.7.2", 45 | "materialize-css": "^1.0.0", 46 | "mkdirp": "^1.0.4", 47 | "request": "^2.88.2", 48 | "semver": "^7.3.5", 49 | "untildify": "^4.0.0", 50 | "uuid": "^8.3.2" 51 | }, 52 | "homepage": "https://github.com/oonqt/MBCord" 53 | } 54 | -------------------------------------------------------------------------------- /static/configure.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 |
Attempting to autodetect servers...
29 |
30 |
31 | 32 |
33 | 51 | 52 |
53 |
Let's get you set up
54 | 55 |
56 |
57 |
58 | 62 | 63 |
64 |
65 | 66 | 67 |
68 |
69 | 70 | 71 |
72 |
73 | 77 | 78 |
79 |
80 |
81 |
82 | 83 | 84 |
85 |
86 | 87 | 88 |
89 |
90 |
91 |
92 | 95 |
96 |
97 |
98 |
99 |
100 | 101 | 102 | 103 | 104 | 105 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /static/css/configure.css: -------------------------------------------------------------------------------- 1 | * { 2 | user-select: none; 3 | } 4 | 5 | .container { 6 | text-align: center; 7 | } 8 | 9 | .content { 10 | display: none; 11 | } 12 | 13 | .splashScreen { 14 | margin-top: 25px; 15 | } 16 | 17 | .row { 18 | margin: 0; 19 | } 20 | 21 | .btn { 22 | width: 100%; 23 | } 24 | 25 | .modal-title { 26 | margin-top: 0 !important; 27 | font-weight: 500; 28 | } 29 | 30 | .modal { 31 | height: 100%; 32 | width: 90%; 33 | } 34 | 35 | .button-row { 36 | margin-top: 14px; 37 | } 38 | 39 | .left-button { 40 | padding-left: 0 !important; 41 | } 42 | 43 | .right-button { 44 | padding-right: 0 !important; 45 | } 46 | 47 | .modal-content { 48 | text-align: center; 49 | } 50 | 51 | #closeModal:hover { 52 | text-decoration: underline; 53 | } 54 | 55 | #msg { 56 | color: red; 57 | display: block; 58 | margin-top: 5px; 59 | } -------------------------------------------------------------------------------- /static/css/libraryConfiguration.css: -------------------------------------------------------------------------------- 1 | * { 2 | user-select: none; 3 | } 4 | 5 | .lever { 6 | margin-bottom: 5px; 7 | } 8 | 9 | #retry { 10 | display: none; 11 | width: 100%; 12 | margin-top: 15px; 13 | } 14 | 15 | .viewsContainer { 16 | display: none; 17 | } 18 | 19 | .switch { 20 | float: right; 21 | } 22 | 23 | .container { 24 | text-align: center; 25 | } 26 | 27 | .title { 28 | margin-bottom: 15px; 29 | } 30 | 31 | span.viewName { 32 | white-space: nowrap; 33 | overflow: hidden; 34 | text-overflow: ellipsis; 35 | display: inline-block; 36 | width: calc(60%); 37 | } 38 | 39 | #reload:hover { 40 | background-color: transparent !important; 41 | } -------------------------------------------------------------------------------- /static/css/theming.css: -------------------------------------------------------------------------------- 1 | .switch label input[type='checkbox']:checked + .lever:after { 2 | background-color: var(--color); 3 | } 4 | 5 | .switch label input[type='checkbox']:checked + .lever { 6 | background-color: var(--color-accent); 7 | } 8 | 9 | .switch label .lever:before { 10 | background-color: var(--color-accent); 11 | } 12 | 13 | .btn, 14 | .btn:hover, 15 | .btn:focus { 16 | background-color: var(--color); 17 | } 18 | 19 | .progress .indeterminate { 20 | background-color: var(--color) !important; 21 | } 22 | 23 | .progress { 24 | background-color: var(--color-accent); 25 | } 26 | 27 | #reload > i { 28 | color: var(--color); 29 | } 30 | 31 | .input-field input:focus + label { 32 | color: var(--color) !important; 33 | } 34 | 35 | input:focus { 36 | border-bottom: 1px solid var(--color) !important; 37 | box-shadow: 0 1px 0 0 var(--color) !important; 38 | } 39 | 40 | li > span { 41 | color: var(--color) !important; 42 | } 43 | 44 | .tabs .tab a:hover, .tabs .tab a.active { 45 | color: var(--color) !important; 46 | } 47 | 48 | .tabs .indicator { 49 | background-color: var(--color) !important; 50 | } 51 | 52 | .tabs .tab a:focus, .tabs .tab a:focus.active { 53 | background-color: var(--color-accent) !important; 54 | } 55 | 56 | .tabs .tab a { 57 | color: var(--color) !important; 58 | } 59 | 60 | [type="checkbox"].filled-in:checked+span:not(.lever):after { 61 | border: 2px solid var(--color) !important; 62 | background-color: var(--color) !important; 63 | } -------------------------------------------------------------------------------- /static/js/configure.js: -------------------------------------------------------------------------------- 1 | const { ipcRenderer } = require('electron'); 2 | 3 | const submitButton = document.getElementById('submitButton'); 4 | 5 | document.getElementById('configuration').addEventListener('submit', (e) => { 6 | submitButton.disabled = true; 7 | 8 | e.preventDefault(); 9 | 10 | const invalidFields = document.querySelectorAll('.invalid'); 11 | invalidFields.forEach((field) => field.classList.remove('invalid')); 12 | 13 | let address = document.getElementById('serverAddress').value; 14 | let username = document.getElementById('username').value; 15 | let password = document.getElementById('password').value; 16 | let protocol = document.getElementById('protocol').value; 17 | let port = document.getElementById('port').value; 18 | let serverType = document.getElementById('serverType').value; 19 | 20 | ipcRenderer.send( 21 | 'ADD_SERVER', 22 | { 23 | address, 24 | username, 25 | password, 26 | port, 27 | protocol, 28 | serverType 29 | } 30 | ); 31 | }); 32 | 33 | document.getElementById('serverType').addEventListener('change', function () { 34 | const root = document.documentElement; 35 | const current = getComputedStyle(root).getPropertyValue('--color'); 36 | 37 | setTheme(current === colors.embyTheme.solid ? 'jellyfin' : 'emby'); 38 | }); 39 | 40 | ipcRenderer.on('CONNECT_ERROR', () => { 41 | 42 | }); 43 | 44 | ipcRenderer.on('RESET', (_, resetFields) => { 45 | submitButton.disabled = false; 46 | 47 | if (resetFields) { 48 | document.getElementById('serverAddress').value = ''; 49 | document.getElementById('username').value = ''; 50 | document.getElementById('password').value = ''; 51 | document.getElementById('port').value = ''; 52 | } 53 | }); 54 | 55 | ipcRenderer.on('VALIDATION_ERROR', (_, data) => { 56 | submitButton.disabled = false; 57 | 58 | data.forEach((fieldName) => { 59 | const field = document.getElementById(fieldName); 60 | 61 | field.classList.add('invalid'); 62 | }); 63 | }); 64 | 65 | ipcRenderer.on('RECEIVE_INFO', (_, data) => { 66 | document.querySelector('.splashScreen').style.display = 'none'; 67 | document.querySelector('.content').style.display = 'block'; 68 | 69 | if (data.length) { 70 | // prettier-ignore 71 | const serverDiscoveryModal = document.getElementById('serverDiscoveryModal'); 72 | 73 | const modalInstance = M.Modal.getInstance(serverDiscoveryModal); 74 | modalInstance.open(); 75 | 76 | // set the theme to the default selected item server type 77 | setTheme(data[0].type); 78 | 79 | const serverList = serverDiscoveryModal.querySelector('#servers'); 80 | serverList.innerHTML = data 81 | .map( 82 | (server) => 83 | `` 89 | ) 90 | .join(''); 91 | M.FormSelect.init(serverList); 92 | 93 | serverList.addEventListener('change', function () { 94 | const server = data.find((server) => server.id === this.value); 95 | 96 | setTheme(server.type); 97 | }); 98 | 99 | serverDiscoveryModal 100 | .querySelector('#notFound') 101 | .addEventListener('click', () => { 102 | modalInstance.close(); 103 | }); 104 | 105 | serverDiscoveryModal 106 | .querySelector('form') 107 | .addEventListener('submit', (e) => { 108 | e.preventDefault(); 109 | 110 | const serverId = serverDiscoveryModal 111 | .querySelector('#servers') 112 | .value.split(':')[0]; 113 | const server = data.find((server) => server.id === serverId); 114 | 115 | document.getElementById('serverAddress').value = server.address; 116 | document.getElementById('port').value = server.port; 117 | 118 | modalInstance.close(); 119 | }); 120 | } 121 | }); 122 | 123 | function setTheme(themeName) { 124 | const serverType = document.getElementById('serverType'); 125 | 126 | switch (themeName) { 127 | case 'emby': 128 | document.documentElement.style.setProperty( 129 | '--color', 130 | colors.embyTheme.solid 131 | ); 132 | serverType.value = themeName; 133 | break; 134 | case 'jellyfin': 135 | document.documentElement.style.setProperty( 136 | '--color', 137 | colors.jellyfinTheme.solid 138 | ); 139 | serverType.value = themeName; 140 | break; 141 | } 142 | } 143 | 144 | setTheme('emby'); 145 | ipcRenderer.send('RECEIVE_INFO'); 146 | -------------------------------------------------------------------------------- /static/js/libraryConfiguration.js: -------------------------------------------------------------------------------- 1 | const { ipcRenderer } = require('electron'); 2 | 3 | ipcRenderer.on('FETCH_FAILED', () => { 4 | document.querySelector('progress').style.display = 'none'; 5 | 6 | const retry = document.getElementById('retry'); 7 | 8 | retry.style.display = 'block'; 9 | }); 10 | 11 | retry.addEventListener('click', () => { 12 | document.querySelector('.progress').style.display = 'block'; 13 | retry.style.display = 'none'; 14 | ipcRenderer.send('RECEIVE_VIEWS'); 15 | }); 16 | 17 | const reload = document.getElementById('reload'); 18 | 19 | reload.addEventListener('click', () => { 20 | document.querySelector('.progress').style.display = 'block'; 21 | document.querySelector('.viewsContainer').style.display = 'none'; 22 | ipcRenderer.send('RECEIVE_VIEWS'); 23 | }); 24 | 25 | ipcRenderer.on('RECEIVE_VIEWS', (_, views) => { 26 | document.querySelector('.progress').style.display = 'none'; 27 | document.querySelector('.viewsContainer').style.display = 'block'; 28 | 29 | document.getElementById('userViewsList').innerHTML = views.availableViews 30 | .map( 31 | // prettier-ignore 32 | (view) => `
  • 33 | 34 | ${view.name} 35 | 36 |
    37 | 51 |
    52 |
  • ` 53 | ) 54 | .join(''); 55 | 56 | document.querySelectorAll('.viewDisableToggle').forEach((view) => { 57 | view.addEventListener('change', function () { 58 | if (this.checked) { 59 | view.parentElement.querySelector('span').textContent = 'Ignored'; 60 | } else { 61 | view.parentElement.querySelector('span').textContent = 'Watching'; 62 | } 63 | 64 | ipcRenderer.send('VIEW_SAVE', this.id); 65 | }); 66 | }); 67 | }); 68 | 69 | ipcRenderer.send('RECEIVE_VIEWS'); 70 | -------------------------------------------------------------------------------- /static/js/themes.js: -------------------------------------------------------------------------------- 1 | const ipc = require('electron').ipcRenderer; 2 | 3 | const colors = { 4 | embyTheme: { 5 | solid: "#4caf50", 6 | accent: "rgba(76, 175, 80, 0.15)" 7 | }, 8 | jellyfinTheme: { 9 | solid: "#7289da", 10 | accent: "rgba(114, 137, 218, 0.15)" 11 | } 12 | } 13 | 14 | ipc.on('RECEIVE_TYPE', (_, data) => { 15 | switch (data) { 16 | case 'emby': 17 | document.documentElement.style.setProperty( 18 | '--color', 19 | colors.embyTheme.solid 20 | ); 21 | document.documentElement.style.setProperty( 22 | '--color-accent', 23 | colors.embyTheme.accent 24 | ); 25 | break; 26 | case 'jellyfin': 27 | document.documentElement.style.setProperty( 28 | '--color', 29 | colors.jellyfinTheme.solid 30 | ); 31 | document.documentElement.style.setProperty( 32 | '--color-accent', 33 | colors.jellyfinTheme.accent 34 | ); 35 | break; 36 | } 37 | }); 38 | 39 | ipc.send('RECEIVE_TYPE'); -------------------------------------------------------------------------------- /static/libraryConfiguration.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
    14 |
    15 |
    16 |
    17 | 18 | 22 | 23 |
    24 |
    25 | Ignored Libraries 26 | 29 |
    30 | 31 | 32 |
    33 |
    34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /utils/MBClient.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | 3 | class MBClient { 4 | /** 5 | * @param {Object} serverCredentials 6 | * @param {string} serverCredentials.address 7 | * @param {number} serverCredentials.port 8 | * @param {string} serverCredentials.protocol HTTP or HTTPS 9 | * @param {string} serverCredentials.username 10 | * @param {string} serverCredentials.password 11 | * 12 | * @param {Object} deviceInfo 13 | * @param {string} deviceInfo.deviceName 14 | * @param {string} deviceInfo.deviceId 15 | * @param {string} deviceInfo.deviceVersion, 16 | * @param {string|undefined} deviceInfo.iconUrl URL to the icon displayed under the devices page 17 | */ 18 | constructor(serverCredentials, deviceInfo, cacheExpSecs = 900) { 19 | Object.assign(this, serverCredentials); 20 | Object.assign(this, deviceInfo); 21 | 22 | this.userId; 23 | this.accessToken; 24 | this.cacheExpSecs = cacheExpSecs; 25 | this.libraryIDCache = {}; 26 | this.itemLibraryIDCache = {}; 27 | } 28 | 29 | get serverAddress() { 30 | const url = new URL(`${this.protocol}://${this.address}`); 31 | url.port = this.port; 32 | return url.toString().replace(/\/+$/, ''); 33 | } 34 | 35 | get isAuthenticated() { 36 | return this.accessToken !== undefined; 37 | } 38 | 39 | get headers() { 40 | const headers = {}; 41 | 42 | headers['User-Agent'] = `${this.deviceName}/${this.deviceVersion}`; 43 | if(this.accessToken) headers['X-Emby-Token'] = this.accessToken; 44 | 45 | return headers; 46 | } 47 | 48 | static exchangeConnectToken(url, connectUserToken, connectUserId) { 49 | return new Promise((resolve, reject) => { 50 | request({ 51 | url: url + `?format=json&ConnectUserId=${connectUserId}`, 52 | headers: { 53 | 'x-emby-token': connectUserToken 54 | }, 55 | json: true 56 | }, (err, res, body) => { 57 | if (err) return reject(err); 58 | if (res.statusCode !== 200) 59 | return reject(`Status: ${res.statusCode} Response: ${JSON.stringify(body)}`); 60 | 61 | resolve(body); 62 | }); 63 | }); 64 | } 65 | 66 | /** 67 | * @returns {Promise>} the sessions 68 | */ 69 | getSessions(activeWithinSeconds) { 70 | return new Promise((resolve, reject) => { 71 | request( 72 | `${this.serverAddress}/Sessions${activeWithinSeconds ? `?ActiveWithinSeconds=${activeWithinSeconds}` : ''}`, 73 | { 74 | headers: this.headers, 75 | json: true 76 | }, 77 | (err, res, body) => { 78 | if (err) return reject(err); 79 | if (res.statusCode !== 200) 80 | return reject(`Status: ${res.statusCode} Response: ${JSON.stringify(body)}`); 81 | 82 | resolve(body); 83 | } 84 | ); 85 | }); 86 | } 87 | 88 | /** 89 | * @returns {Promise} 90 | */ 91 | assignDeviceCapabilities() { 92 | return new Promise((resolve, reject) => { 93 | request.post( 94 | `${this.serverAddress}/Sessions/Capabilities/Full`, 95 | { 96 | headers: this.headers, 97 | body: { 98 | IconUrl: this.iconUrl 99 | }, 100 | json: true 101 | }, 102 | (err, res) => { 103 | if (err) return reject(err); 104 | if (res.statusCode !== 204) 105 | return reject(`Status: ${res.statusCode} Reason: ${JSON.stringify(body)}`); 106 | 107 | resolve(); 108 | } 109 | ); 110 | }); 111 | } 112 | 113 | /** 114 | * @param {string} libraryId Library GUID 115 | * @returns {Promise} Internal ID 116 | */ 117 | getLibraryInternalId(libraryId) { 118 | // we have to do all this fucking bullshit just to get the library ID 119 | return new Promise((resolve, reject) => { 120 | const cacheResult = this.libraryIDCache[libraryId]; 121 | if (cacheResult && cacheResult.expires > new Date().getTime()) { 122 | resolve(cacheResult.value); 123 | } 124 | 125 | request( 126 | `${this.serverAddress}/Users/${this.userId}/Items?Limit=1&ParentId=${libraryId}&Fields=ParentId`, 127 | { 128 | headers: this.headers, 129 | json: true 130 | }, 131 | async (err, res, body) => { 132 | if (err) return reject(err); 133 | if (res.statusCode !== 200) 134 | return reject(`Status: ${res.statusCode} Response: ${JSON.stringify(body)}`); 135 | 136 | // some libraries might have no items 137 | if (!body.Items[0]) return resolve(null); 138 | 139 | try { 140 | // prettier-ignore 141 | const LibraryInternalID = await this.getItemInternalLibraryId(body.Items[0].Id); 142 | this.libraryIDCache[libraryId] = { value: LibraryInternalID, expires: new Date().getTime() + this.cacheExpSecs * 1000 }; 143 | resolve(LibraryInternalID); 144 | } catch (error) { 145 | reject(`Failed to get library ID: ${error}`); 146 | } 147 | } 148 | ); 149 | }); 150 | } 151 | 152 | getSystemInfo() { 153 | return new Promise((resolve, reject) => { 154 | request( 155 | `${this.serverAddress}/System/Info`, 156 | { 157 | headers: this.headers, 158 | json: true 159 | }, 160 | (err, res, body) => { 161 | if (err) return reject(err); 162 | if (res.statusCode !== 200) 163 | return reject(`Status: ${res.statusCode} Response: ${JSON.stringify(body)}`); 164 | 165 | resolve(body); 166 | } 167 | ); 168 | }); 169 | } 170 | 171 | /** 172 | * @param {string} itemId ID of the item 173 | * @returns {Promise} 174 | */ 175 | getItemInternalLibraryId(itemId) { 176 | return new Promise((resolve, reject) => { 177 | const cacheResult = this.itemLibraryIDCache[itemId]; 178 | if (cacheResult && cacheResult.expires > new Date().getTime()) { 179 | resolve(cacheResult.value); 180 | } 181 | 182 | request( 183 | `${this.serverAddress}/Items/${itemId}/Ancestors`, 184 | { 185 | headers: this.headers, 186 | json: true 187 | }, 188 | (err, res, body) => { 189 | if (err) return reject(err); 190 | if (res.statusCode !== 200) 191 | return reject(`Status: ${res.statusCode} Response: ${JSON.stringify(body)}`); 192 | 193 | // second ancestor is always the library 194 | const libraryID = body.splice(body.length - 2, 1)[0].Id; 195 | this.itemLibraryIDCache[itemId] = { value: libraryID, expires: new Date().getTime() + this.cacheExpSecs * 1000 }; 196 | resolve(libraryID); 197 | } 198 | ); 199 | }); 200 | } 201 | 202 | /** 203 | * @returns {Promise>} 204 | */ 205 | getUserViews() { 206 | return new Promise((resolve, reject) => { 207 | request( 208 | `${this.serverAddress}/Users/${this.userId}/views`, 209 | { 210 | headers: this.headers, 211 | json: true 212 | }, 213 | async (err, res, body) => { 214 | if (err) return reject(err); 215 | if (res.statusCode !== 200) 216 | return reject(`Status: ${res.statusCode} Response: ${JSON.stringify(body)}`); 217 | 218 | // undefined is for mixedcontent libraries (which dont have a collection type property for some reason?) 219 | // we dont want people to select libraries like playlist and collections since those are virtual libraries and not actual libraries 220 | const allowedLibraries = body.Items.filter( 221 | (view) => 222 | view.CollectionType === undefined || 223 | [ 224 | 'tvshows', 225 | 'movies', 226 | 'homevideos', 227 | 'music', 228 | 'musicvideos', 229 | 'audiobooks' 230 | ].includes(view.CollectionType) 231 | ); 232 | 233 | const mappedLibraries = []; 234 | 235 | for (const library of allowedLibraries) { 236 | try { 237 | const internalId = await this.getLibraryInternalId(library.Id); 238 | 239 | // incase the library had no items and we couldnt figure out the ID 240 | if (internalId) { 241 | mappedLibraries.push({ 242 | name: library.Name, 243 | id: internalId 244 | }); 245 | } 246 | } catch (error) { 247 | reject( 248 | `Interal ID fetch failure: ${error} at library ${library.Name}` 249 | ); 250 | } 251 | } 252 | 253 | resolve(mappedLibraries); 254 | } 255 | ); 256 | }); 257 | } 258 | 259 | /** 260 | * @returns {Promise} 261 | */ 262 | login() { 263 | return new Promise((resolve, reject) => { 264 | if (this.accessToken) resolve(); 265 | 266 | request.post( 267 | `${this.serverAddress}/Users/AuthenticateByName`, 268 | { 269 | headers: { 270 | Authorization: `Emby Client=Other, Device=${this.deviceName}, DeviceId=${this.deviceId}, Version=${this.deviceVersion}` 271 | }, 272 | body: { 273 | Username: this.username, 274 | Pw: this.password 275 | }, 276 | json: true 277 | }, 278 | async (err, res, body) => { 279 | if (err) return reject(err); 280 | if (res.statusCode !== 200) 281 | return reject(`Status: ${res.statusCode} Response: ${JSON.stringify(body)}`); 282 | 283 | this.accessToken = body.AccessToken; 284 | this.userId = body.User.Id; 285 | 286 | if (this.iconUrl) { 287 | try { 288 | await this.assignDeviceCapabilities(); 289 | } catch (error) { 290 | return reject(`Failed to set device icon: ${error}`); 291 | } 292 | } 293 | 294 | resolve(body); 295 | } 296 | ); 297 | }); 298 | } 299 | 300 | /** 301 | * @returns {Promise} 302 | */ 303 | logout() { 304 | return new Promise((resolve) => { 305 | this.userId = null; 306 | this.itemLibraryIDCache = {}; 307 | this.libraryIDCache = {}; 308 | 309 | if (this.accessToken) { 310 | request.post( 311 | `${this.serverAddress}/Sessions/Logout`, 312 | { 313 | headers: this.headers 314 | }, 315 | () => { 316 | // i dont give a FUCK if it doesnt succeed, if it does, it does, if not, fuck it 317 | 318 | this.accessToken = null; 319 | resolve(); 320 | } 321 | ); 322 | } else { 323 | resolve(); 324 | } 325 | }); 326 | } 327 | } 328 | 329 | module.exports = MBClient; 330 | -------------------------------------------------------------------------------- /utils/connectAPI.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | 3 | class ConnectAPI { 4 | constructor(appName, appVersion) { 5 | this.appName = appName; 6 | this.appVersion = appVersion; 7 | } 8 | 9 | getConnectUser(nameOrEmail, password) { 10 | return new Promise((resolve, reject) => { 11 | request({ 12 | url: 'https://connect.emby.media/service/user/authenticate', 13 | method: 'POST', 14 | headers: { 15 | 'X-Application': `${name}/${version}` 16 | }, 17 | body: { 18 | nameOrEmail, 19 | rawpw: password 20 | }, 21 | json: true 22 | }, (err, res, body) => { 23 | if (err) return reject(err); 24 | if (res.statusCode !== 200) return reject({ status: res.statusCode, data: body }); 25 | 26 | resolve(body); 27 | }); 28 | }); 29 | } 30 | 31 | getConnectServers(connectUserToken, connectUserId) { 32 | return new Promise((resolve, reject) => { 33 | request({ 34 | url: `https://connect.emby.media/service/servers?userId=${connectUserId}`, 35 | headers: { 36 | 'X-Application': `${this.appName}/${this.appVersion}`, 37 | 'X-Connect-UserToken': connectUserToken 38 | }, 39 | json: true 40 | }, (err, res, body) => { 41 | if (err) return reject(err); 42 | if (res.statusCode !== 200) return reject({ status: res.statusCode, data: body }); 43 | 44 | resolve(body); 45 | }); 46 | }); 47 | } 48 | } 49 | 50 | module.exports = ConnectAPI; -------------------------------------------------------------------------------- /utils/helpers.js: -------------------------------------------------------------------------------- 1 | const clean = require('deep-cleaner'); 2 | 3 | /** 4 | * 5 | * @param {Object} object the object to scrum 6 | * @param {string} keys the keys to filter from the object 7 | */ 8 | exports.scrubObject = (object, ...keys) => { 9 | const scrubbedObject = {}; 10 | 11 | Object.assign(scrubbedObject, object); 12 | 13 | clean(scrubbedObject, keys) 14 | 15 | return scrubbedObject; 16 | } 17 | 18 | exports.booleanToYN = (bool) => bool ? 'Yes' : 'No'; -------------------------------------------------------------------------------- /utils/logger.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const stringify = require('json-stringify-safe'); 4 | 5 | require('colors'); 6 | 7 | class Logger { 8 | /** 9 | * 10 | * @param {string} logType Type of log, DB or FILE 11 | * @param {string} logPath Path to log directory 12 | * @param {number} logRetentionCount Amount of logs to keep before removing old logs 13 | * @param {string} loggerName Name of the log file & entries 14 | */ 15 | constructor(logType, logPath, logRetentionCount, loggerName, maxLogFileSizeMB, enableDebugLogging = false) { 16 | this.logType = logType; 17 | this.path = logPath; 18 | this.loggerName = loggerName; 19 | this.logRetentionCount = logRetentionCount; 20 | this.maxLogFileSizeMB = maxLogFileSizeMB; 21 | this.timestamp = new Date(); 22 | 23 | /** 24 | * @private 25 | */ 26 | this.enableDebugLogging = enableDebugLogging; 27 | 28 | this.file = this.getLogFilePath(); 29 | } 30 | 31 | /** 32 | * @returns {string} Log path 33 | */ 34 | get logPath() { 35 | this.createDirIfDoesntExist(); 36 | return this.path; 37 | } 38 | 39 | info(msg) { 40 | this.write(msg, 'info'); 41 | } 42 | 43 | error(msg) { 44 | this.write(msg, 'error'); 45 | } 46 | 47 | debug(msg) { 48 | this.write(msg, 'debug'); 49 | } 50 | 51 | warn(msg) { 52 | this.write(msg, 'warn'); 53 | } 54 | 55 | /** 56 | * Create the log dir if it is not presence 57 | * @private 58 | * @returns {void} 59 | */ 60 | createDirIfDoesntExist() { 61 | if (!fs.existsSync(path.join(this.path))) { 62 | fs.mkdirSync(path.join(this.path)); 63 | } 64 | } 65 | 66 | getLogFilePath() { 67 | return path.join( 68 | this.path, 69 | `${this.loggerName}-${(this.timestamp.getTime() / 1000) | 0}.txt` 70 | ); 71 | } 72 | 73 | static formatMessage(message, level) { 74 | return `[${Date().toLocaleString()}] ${level}: ${message}\n`; 75 | } 76 | 77 | /** 78 | * 79 | * @private 80 | * @param {string} message Message to log 81 | * @param {string} level Level of the log 82 | * @returns {void} 83 | */ 84 | write(messageContent, level) { 85 | if (level === 'debug' && !this.enableDebugLogging) return; 86 | 87 | const message = typeof messageContent === 'object' || Array.isArray(messageContent) ? messageContent.message ? messageContent.message : stringify(messageContent, null, ' ') : String(messageContent); 88 | 89 | if (this.logType === 'console') { 90 | switch (level) { 91 | case 'info': 92 | console.log('Info: '.blue + message); 93 | break; 94 | case 'warn': 95 | console.warn('Warn: '.yellow + message); 96 | break; 97 | case 'error': 98 | console.error('Error: '.red + message); 99 | break; 100 | case 'debug': 101 | console.debug('Debug: '.green + message); 102 | } 103 | } else if (this.logType === 'file') { 104 | this.createDirIfDoesntExist(); 105 | 106 | if (!fs.existsSync(this.file)) { 107 | fs.writeFileSync(this.file, this.constructor.formatMessage(message, level)); 108 | } else { 109 | const fileSize = fs.statSync(this.file).size / (1024 * 1024); 110 | 111 | if (fileSize > this.maxLogFileSizeMB) { 112 | this.file = this.getLogFilePath(); 113 | 114 | fs.writeFileSync(this.file, this.constructor.formatMessage(message, level)); 115 | } else { 116 | fs.appendFileSync(this.file, this.constructor.formatMessage(message, level)); 117 | } 118 | } 119 | 120 | let files = fs.readdirSync(this.path); 121 | 122 | if (files.length > this.logRetentionCount) { 123 | fs.unlinkSync(path.join(this.path, files[0])); 124 | } 125 | } 126 | } 127 | } 128 | 129 | module.exports = Logger; 130 | -------------------------------------------------------------------------------- /utils/serverDiscoveryClient.js: -------------------------------------------------------------------------------- 1 | const dgram = require('dgram'); 2 | const crypto = require('crypto'); 3 | const { rejects } = require('assert'); 4 | 5 | /** 6 | * @returns {Object} the servers found 7 | */ 8 | exports.find = (timeoutMs, serverType) => 9 | new Promise((resolve, reject) => { 10 | const servers = []; 11 | const client = dgram.createSocket({ type: 'udp4', reuseAddr: true }); 12 | 13 | client.bind(); // not to be confused with function.bind(this, etcetcsfuck) 14 | 15 | client.on('listening', () => { 16 | const message = Buffer.from(`who is ${serverType}Server?`); 17 | 18 | client.setBroadcast(true); 19 | client.send( 20 | message, 21 | 0, 22 | message.length, 23 | 7359, 24 | '255.255.255.255', 25 | (err) => { 26 | if (err) reject(err); 27 | } 28 | ); 29 | }); 30 | 31 | client.on('message', (message, info) => { 32 | if (info) { 33 | // message is a buffer 34 | const response = JSON.parse(message.toString()); 35 | const addressData = response.Address.split(':'); 36 | 37 | const server = { 38 | fullAddress: response.Address, 39 | address: addressData[1].slice(2, addressData[1].length), 40 | port: addressData[2], 41 | protocol: addressData[0], 42 | name: response.Name, 43 | id: crypto.randomBytes(15).toString("hex"), 44 | type: serverType 45 | } 46 | 47 | servers.push(server); 48 | } 49 | }); 50 | 51 | setTimeout(() => { 52 | resolve(servers); 53 | client.close(); 54 | }, timeoutMs); 55 | }); -------------------------------------------------------------------------------- /utils/startupHandler.js: -------------------------------------------------------------------------------- 1 | const mkdirp = require('mkdirp'); 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | const untildify = require('untildify'); 5 | 6 | // Electron provides a wonderful startup API for windows and mac. Linux? Not so much. 7 | 8 | class startupHandler { 9 | /** 10 | * 11 | * @param {import("electron").App} app 12 | */ 13 | constructor(app, name) { 14 | this.app = app; 15 | this.name = name; 16 | } 17 | 18 | /** 19 | * @private 20 | */ 21 | get directory() { 22 | return untildify(`~/.config/autostart/`); 23 | } 24 | 25 | /** 26 | * @private 27 | */ 28 | get filePath() { 29 | return path.join(this.directory, `${this.name}.desktop`); 30 | } 31 | 32 | /** 33 | * @returns {boolean} Is the app configured to open at login 34 | */ 35 | get isEnabled() { 36 | if (process.platform === 'linux') { 37 | return fs.existsSync(this.filePath); 38 | } else { 39 | return this.app.getLoginItemSettings().openAtLogin; 40 | } 41 | } 42 | 43 | /** 44 | * @returns {void} 45 | */ 46 | enable() { 47 | if(process.platform === 'linux') { 48 | const data = ` 49 | [Desktop Entry] 50 | Type=Application 51 | Version=1.0 52 | Name=${this.name} 53 | Exec=${process.execPath} 54 | StartupNotify=false 55 | Terminal=false 56 | ` 57 | 58 | mkdirp.sync(this.directory); 59 | fs.writeFileSync(this.filePath, data); 60 | } else { 61 | this.app.setLoginItemSettings({ 62 | openAtLogin: true 63 | }); 64 | } 65 | } 66 | 67 | /** 68 | * @returns {void} 69 | */ 70 | disable() { 71 | if(process.platform === 'linux') { 72 | const exists = fs.existsSync(this.filePath); 73 | 74 | if(exists) { 75 | fs.unlinkSync(this.filePath); 76 | } 77 | } else { 78 | this.app.setLoginItemSettings({ 79 | openAtLogin: false 80 | }); 81 | } 82 | } 83 | 84 | /** 85 | * @returns {void} 86 | */ 87 | toggle() { 88 | if (this.isEnabled) { 89 | this.disable(); 90 | } else { 91 | this.enable(); 92 | } 93 | } 94 | } 95 | 96 | module.exports = startupHandler; 97 | -------------------------------------------------------------------------------- /utils/updateChecker.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | const semver = require('semver'); 3 | 4 | class GithubClient { 5 | /** 6 | * 7 | * @param {string} author Name of the author or organization of the repo 8 | * @param {string} repoName Name of the repo 9 | * @param {string} version Version as a string (EX: 4.2.0) 10 | */ 11 | constructor(author, repoName, version) { 12 | this.author = author; 13 | this.repoName = repoName; 14 | this.version = version; 15 | } 16 | 17 | /** 18 | * @typedef UpdateResponse 19 | * @property {boolean} pending - is an update pending 20 | * @property {string} version - the latest available version on GitHub 21 | */ 22 | 23 | /** 24 | * @callback checkFullfilled 25 | * @param {Error} Error 26 | * @param {UpdateResponse} response Response object 27 | */ 28 | 29 | /** 30 | * 31 | * @param {checkFullfilled} cb callback 32 | */ 33 | 34 | checkForUpdate(cb) { 35 | request( 36 | `https://api.github.com/repos/${this.author}/${this.repoName}/releases/latest`, 37 | { 38 | headers: { 39 | 'User-Agent': `${this.repoName}/${this.version}` 40 | }, 41 | json: true 42 | }, 43 | (err, res, body) => { 44 | if (err) return cb(err, null); 45 | if (res.statusCode !== 200) 46 | return cb(`Status: ${res.statusCode} Body: ${body}`); 47 | 48 | // prettier-ignore 49 | // const currentVersion = this.constructor.extractVersionAsInt(this.version); 50 | // // prettier-ignore 51 | // const latestVersion = this.constructor.extractVersionAsInt(body.tag_name); 52 | 53 | if (semver.lte(this.version, body.tag_name)) { 54 | cb(null, { 55 | pending: true, 56 | version: body.tag_name 57 | }); 58 | } else { 59 | cb(null, { 60 | pending: false, 61 | version: body.tag_name 62 | }); 63 | } 64 | } 65 | ); 66 | } 67 | } 68 | 69 | module.exports = GithubClient; 70 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@electron/get@^1.0.1", "@electron/get@^1.6.0": 6 | version "1.12.4" 7 | resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.4.tgz#a5971113fc1bf8fa12a8789dc20152a7359f06ab" 8 | integrity sha512-6nr9DbJPUR9Xujw6zD3y+rS95TyItEVM0NVjt1EehY2vUWfIgPiIPVHxCvaTS0xr2B+DRxovYVKbuOWqC35kjg== 9 | dependencies: 10 | debug "^4.1.1" 11 | env-paths "^2.2.0" 12 | fs-extra "^8.1.0" 13 | got "^9.6.0" 14 | progress "^2.0.3" 15 | semver "^6.2.0" 16 | sumchecker "^3.0.1" 17 | optionalDependencies: 18 | global-agent "^2.0.2" 19 | global-tunnel-ng "^2.7.1" 20 | 21 | "@sindresorhus/is@^0.14.0": 22 | version "0.14.0" 23 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 24 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 25 | 26 | "@szmarczak/http-timer@^1.1.2": 27 | version "1.1.2" 28 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 29 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 30 | dependencies: 31 | defer-to-connect "^1.0.1" 32 | 33 | "@types/glob@^7.1.1": 34 | version "7.1.3" 35 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" 36 | integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== 37 | dependencies: 38 | "@types/minimatch" "*" 39 | "@types/node" "*" 40 | 41 | "@types/minimatch@*": 42 | version "3.0.4" 43 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" 44 | integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== 45 | 46 | "@types/node@*": 47 | version "15.6.1" 48 | resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08" 49 | integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA== 50 | 51 | "@types/node@^14.6.2": 52 | version "14.17.1" 53 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.1.tgz#5e07e0cb2ff793aa7a1b41deae76221e6166049f" 54 | integrity sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw== 55 | 56 | "@types/yauzl@^2.9.1": 57 | version "2.9.1" 58 | resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" 59 | integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== 60 | dependencies: 61 | "@types/node" "*" 62 | 63 | ajv-formats@^2.0.2: 64 | version "2.1.0" 65 | resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.0.tgz#96eaf83e38d32108b66d82a9cb0cfa24886cdfeb" 66 | integrity sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q== 67 | dependencies: 68 | ajv "^8.0.0" 69 | 70 | ajv@^6.12.3: 71 | version "6.12.6" 72 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 73 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 74 | dependencies: 75 | fast-deep-equal "^3.1.1" 76 | fast-json-stable-stringify "^2.0.0" 77 | json-schema-traverse "^0.4.1" 78 | uri-js "^4.2.2" 79 | 80 | ajv@^8.0.0, ajv@^8.1.0: 81 | version "8.5.0" 82 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" 83 | integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== 84 | dependencies: 85 | fast-deep-equal "^3.1.1" 86 | json-schema-traverse "^1.0.0" 87 | require-from-string "^2.0.2" 88 | uri-js "^4.2.2" 89 | 90 | ansi-regex@^2.0.0: 91 | version "2.1.1" 92 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 93 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 94 | 95 | ansi-regex@^3.0.0: 96 | version "3.0.0" 97 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 98 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 99 | 100 | ansi-regex@^5.0.0: 101 | version "5.0.0" 102 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 103 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 104 | 105 | ansi-styles@^2.2.1: 106 | version "2.2.1" 107 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 108 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 109 | 110 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 111 | version "4.3.0" 112 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 113 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 114 | dependencies: 115 | color-convert "^2.0.1" 116 | 117 | aproba@^1.0.3: 118 | version "1.2.0" 119 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 120 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 121 | 122 | archiver-utils@~0.3.0: 123 | version "0.3.0" 124 | resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-0.3.0.tgz#9d85340892fe9e7c6c1b1b6af3c33692cf595b70" 125 | integrity sha1-nYU0CJL+nnxsGxtq88M2ks9ZW3A= 126 | dependencies: 127 | glob "~6.0.0" 128 | lazystream "~0.1.0" 129 | lodash "~3.10.0" 130 | normalize-path "~2.0.0" 131 | readable-stream "~2.0.0" 132 | 133 | archiver@^0.11.0: 134 | version "0.11.0" 135 | resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.11.0.tgz#98177da7a6c0192b7f2798f30cd6eab8abd76690" 136 | integrity sha1-mBd9p6bAGSt/J5jzDNbquKvXZpA= 137 | dependencies: 138 | async "~0.9.0" 139 | buffer-crc32 "~0.2.1" 140 | glob "~3.2.6" 141 | lazystream "~0.1.0" 142 | lodash "~2.4.1" 143 | readable-stream "~1.0.26" 144 | tar-stream "~0.4.0" 145 | zip-stream "~0.4.0" 146 | 147 | archiver@^0.21.0: 148 | version "0.21.0" 149 | resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.21.0.tgz#129da0c8eae1a9bf08a012d8a4e2043a1e2909ce" 150 | integrity sha1-Ep2gyOrhqb8IoBLYpOIEOh4pCc4= 151 | dependencies: 152 | archiver-utils "~0.3.0" 153 | async "~1.5.0" 154 | buffer-crc32 "~0.2.1" 155 | glob "~6.0.0" 156 | lodash "~3.10.0" 157 | readable-stream "~2.0.0" 158 | tar-stream "~1.3.1" 159 | zip-stream "~0.8.0" 160 | 161 | are-we-there-yet@~1.1.2: 162 | version "1.1.5" 163 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 164 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 165 | dependencies: 166 | delegates "^1.0.0" 167 | readable-stream "^2.0.6" 168 | 169 | asar@^3.0.0: 170 | version "3.0.3" 171 | resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" 172 | integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw== 173 | dependencies: 174 | chromium-pickle-js "^0.2.0" 175 | commander "^5.0.0" 176 | glob "^7.1.6" 177 | minimatch "^3.0.4" 178 | optionalDependencies: 179 | "@types/glob" "^7.1.1" 180 | 181 | asn1@~0.2.3: 182 | version "0.2.4" 183 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 184 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 185 | dependencies: 186 | safer-buffer "~2.1.0" 187 | 188 | assert-plus@1.0.0, assert-plus@^1.0.0: 189 | version "1.0.0" 190 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 191 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 192 | 193 | astral-regex@^2.0.0: 194 | version "2.0.0" 195 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 196 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 197 | 198 | async@^1.5.2, async@~1.5.0: 199 | version "1.5.2" 200 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 201 | integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= 202 | 203 | async@~0.9.0: 204 | version "0.9.2" 205 | resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" 206 | integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= 207 | 208 | asynckit@^0.4.0: 209 | version "0.4.0" 210 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 211 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 212 | 213 | at-least-node@^1.0.0: 214 | version "1.0.0" 215 | resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 216 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 217 | 218 | atomically@^1.7.0: 219 | version "1.7.0" 220 | resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" 221 | integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== 222 | 223 | author-regex@^1.0.0: 224 | version "1.0.0" 225 | resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" 226 | integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA= 227 | 228 | aws-sign2@~0.7.0: 229 | version "0.7.0" 230 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 231 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 232 | 233 | aws4@^1.8.0: 234 | version "1.11.0" 235 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" 236 | integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== 237 | 238 | balanced-match@^1.0.0: 239 | version "1.0.0" 240 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 241 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 242 | 243 | base64-js@^1.3.1, base64-js@^1.5.1: 244 | version "1.5.1" 245 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 246 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 247 | 248 | bcrypt-pbkdf@^1.0.0: 249 | version "1.0.2" 250 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 251 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 252 | dependencies: 253 | tweetnacl "^0.14.3" 254 | 255 | bl@^0.9.0: 256 | version "0.9.5" 257 | resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" 258 | integrity sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ= 259 | dependencies: 260 | readable-stream "~1.0.26" 261 | 262 | bl@^1.0.0: 263 | version "1.2.3" 264 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" 265 | integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== 266 | dependencies: 267 | readable-stream "^2.3.5" 268 | safe-buffer "^5.1.1" 269 | 270 | bl@^4.0.3: 271 | version "4.1.0" 272 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 273 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 274 | dependencies: 275 | buffer "^5.5.0" 276 | inherits "^2.0.4" 277 | readable-stream "^3.4.0" 278 | 279 | bluebird@^3.1.1, bluebird@^3.5.0: 280 | version "3.7.2" 281 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 282 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 283 | 284 | boolean@^3.0.1: 285 | version "3.0.2" 286 | resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.2.tgz#df1baa18b6a2b0e70840475e1d93ec8fe75b2570" 287 | integrity sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g== 288 | 289 | brace-expansion@^1.1.7: 290 | version "1.1.11" 291 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 292 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 293 | dependencies: 294 | balanced-match "^1.0.0" 295 | concat-map "0.0.1" 296 | 297 | buffer-alloc-unsafe@^1.1.0: 298 | version "1.1.0" 299 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 300 | integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== 301 | 302 | buffer-alloc@^1.2.0: 303 | version "1.2.0" 304 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 305 | integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== 306 | dependencies: 307 | buffer-alloc-unsafe "^1.1.0" 308 | buffer-fill "^1.0.0" 309 | 310 | buffer-crc32@~0.2.1, buffer-crc32@~0.2.3: 311 | version "0.2.13" 312 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 313 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 314 | 315 | buffer-fill@^1.0.0: 316 | version "1.0.0" 317 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 318 | integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= 319 | 320 | buffer-from@^1.0.0: 321 | version "1.1.1" 322 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 323 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 324 | 325 | buffer@^5.5.0: 326 | version "5.7.1" 327 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 328 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 329 | dependencies: 330 | base64-js "^1.3.1" 331 | ieee754 "^1.1.13" 332 | 333 | cacheable-request@^6.0.0: 334 | version "6.1.0" 335 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 336 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 337 | dependencies: 338 | clone-response "^1.0.2" 339 | get-stream "^5.1.0" 340 | http-cache-semantics "^4.0.0" 341 | keyv "^3.0.0" 342 | lowercase-keys "^2.0.0" 343 | normalize-url "^4.1.0" 344 | responselike "^1.0.2" 345 | 346 | camelcase@^3.0.0: 347 | version "3.0.0" 348 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 349 | integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= 350 | 351 | caseless@~0.12.0: 352 | version "0.12.0" 353 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 354 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 355 | 356 | chalk@^1.1.1: 357 | version "1.1.3" 358 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 359 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 360 | dependencies: 361 | ansi-styles "^2.2.1" 362 | escape-string-regexp "^1.0.2" 363 | has-ansi "^2.0.0" 364 | strip-ansi "^3.0.0" 365 | supports-color "^2.0.0" 366 | 367 | chalk@^4.1.0: 368 | version "4.1.1" 369 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" 370 | integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== 371 | dependencies: 372 | ansi-styles "^4.1.0" 373 | supports-color "^7.1.0" 374 | 375 | chownr@^1.1.1: 376 | version "1.1.4" 377 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 378 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 379 | 380 | chromium-pickle-js@^0.2.0: 381 | version "0.2.0" 382 | resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" 383 | integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= 384 | 385 | clean-stack@^2.1.0: 386 | version "2.2.0" 387 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 388 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 389 | 390 | cli-color@0.3.2: 391 | version "0.3.2" 392 | resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-0.3.2.tgz#75fa5f728c308cc4ac594b05e06cc5d80daccd86" 393 | integrity sha1-dfpfcowwjMSsWUsF4GzF2A2szYY= 394 | dependencies: 395 | d "~0.1.1" 396 | es5-ext "~0.10.2" 397 | memoizee "0.3.x" 398 | timers-ext "0.1.x" 399 | 400 | cli-truncate@^2.1.0: 401 | version "2.1.0" 402 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" 403 | integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== 404 | dependencies: 405 | slice-ansi "^3.0.0" 406 | string-width "^4.2.0" 407 | 408 | cliui@^3.2.0: 409 | version "3.2.0" 410 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 411 | integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= 412 | dependencies: 413 | string-width "^1.0.1" 414 | strip-ansi "^3.0.1" 415 | wrap-ansi "^2.0.0" 416 | 417 | clone-response@^1.0.2: 418 | version "1.0.2" 419 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 420 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 421 | dependencies: 422 | mimic-response "^1.0.0" 423 | 424 | clui@^0.3.1: 425 | version "0.3.6" 426 | resolved "https://registry.yarnpkg.com/clui/-/clui-0.3.6.tgz#8e1e5cea7332a6e54083f59da0ccbe1d6f2fa787" 427 | integrity sha512-Z4UbgZILlIAjkEkZiDOa2aoYjohKx7fa6DxIh6cE9A6WNWZ61iXfQc6CmdC9SKdS5nO0P0UyQ+WfoXfB65e3HQ== 428 | dependencies: 429 | cli-color "0.3.2" 430 | 431 | code-point-at@^1.0.0: 432 | version "1.1.0" 433 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 434 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 435 | 436 | color-convert@^2.0.1: 437 | version "2.0.1" 438 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 439 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 440 | dependencies: 441 | color-name "~1.1.4" 442 | 443 | color-name@~1.1.4: 444 | version "1.1.4" 445 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 446 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 447 | 448 | colors@^1.4.0: 449 | version "1.4.0" 450 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" 451 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 452 | 453 | combined-stream@^1.0.6, combined-stream@~1.0.6: 454 | version "1.0.8" 455 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 456 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 457 | dependencies: 458 | delayed-stream "~1.0.0" 459 | 460 | commander@^5.0.0, commander@^5.1.0: 461 | version "5.1.0" 462 | resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" 463 | integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== 464 | 465 | compare-version@^0.1.2: 466 | version "0.1.2" 467 | resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" 468 | integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= 469 | 470 | compress-commons@~0.1.0: 471 | version "0.1.6" 472 | resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.1.6.tgz#0c740870fde58cba516f0ac0c822e33a0b85dfa3" 473 | integrity sha1-DHQIcP3ljLpRbwrAyCLjOguF36M= 474 | dependencies: 475 | buffer-crc32 "~0.2.1" 476 | crc32-stream "~0.3.1" 477 | readable-stream "~1.0.26" 478 | 479 | compress-commons@~0.4.0: 480 | version "0.4.2" 481 | resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.4.2.tgz#1a0847489f0d713d0dd76343c0c2d055dc9cd892" 482 | integrity sha1-GghHSJ8NcT0N12NDwMLQVdyc2JI= 483 | dependencies: 484 | buffer-crc32 "~0.2.1" 485 | crc32-stream "~0.4.0" 486 | node-int64 "~0.4.0" 487 | normalize-path "~2.0.0" 488 | readable-stream "~2.0.0" 489 | 490 | concat-map@0.0.1: 491 | version "0.0.1" 492 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 493 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 494 | 495 | concat-stream@^1.6.2: 496 | version "1.6.2" 497 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 498 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 499 | dependencies: 500 | buffer-from "^1.0.0" 501 | inherits "^2.0.3" 502 | readable-stream "^2.2.2" 503 | typedarray "^0.0.6" 504 | 505 | conf@^10.0.0: 506 | version "10.0.1" 507 | resolved "https://registry.yarnpkg.com/conf/-/conf-10.0.1.tgz#038093e5cbddc0e59bc14f63382c4ce732a4781d" 508 | integrity sha512-QClEoNcruwBL84QgMEPHibL3ERxWIrRKhbjJKG1VsFBadm5QpS0jsu4QjY/maxUvhyAKXeyrs+ws+lC6PajnEg== 509 | dependencies: 510 | ajv "^8.1.0" 511 | ajv-formats "^2.0.2" 512 | atomically "^1.7.0" 513 | debounce-fn "^4.0.0" 514 | dot-prop "^6.0.1" 515 | env-paths "^2.2.1" 516 | json-schema-typed "^7.0.3" 517 | onetime "^5.1.2" 518 | pkg-up "^3.1.0" 519 | semver "^7.3.5" 520 | 521 | config-chain@^1.1.11: 522 | version "1.1.12" 523 | resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" 524 | integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== 525 | dependencies: 526 | ini "^1.3.4" 527 | proto-list "~1.2.1" 528 | 529 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 530 | version "1.1.0" 531 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 532 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 533 | 534 | core-js@^3.6.5: 535 | version "3.8.3" 536 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" 537 | integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== 538 | 539 | core-util-is@1.0.2, core-util-is@~1.0.0: 540 | version "1.0.2" 541 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 542 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 543 | 544 | crc32-stream@~0.3.1: 545 | version "0.3.4" 546 | resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.3.4.tgz#73bc25b45fac1db6632231a7bfce8927e9f06552" 547 | integrity sha1-c7wltF+sHbZjIjGnv86JJ+nwZVI= 548 | dependencies: 549 | buffer-crc32 "~0.2.1" 550 | readable-stream "~1.0.24" 551 | 552 | crc32-stream@~0.4.0: 553 | version "0.4.0" 554 | resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.4.0.tgz#b54d4c6eefd35b53e653d062b306edc6316ae26d" 555 | integrity sha1-tU1Mbu/TW1PmU9BiswbtxjFq4m0= 556 | dependencies: 557 | buffer-crc32 "~0.2.1" 558 | readable-stream "~2.0.0" 559 | 560 | d@1, d@^1.0.1: 561 | version "1.0.1" 562 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" 563 | integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== 564 | dependencies: 565 | es5-ext "^0.10.50" 566 | type "^1.0.1" 567 | 568 | d@~0.1.1: 569 | version "0.1.1" 570 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 571 | integrity sha1-2hhMU10Y2O57oqoim5FACfrhEwk= 572 | dependencies: 573 | es5-ext "~0.10.2" 574 | 575 | dashdash@^1.12.0: 576 | version "1.14.1" 577 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 578 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 579 | dependencies: 580 | assert-plus "^1.0.0" 581 | 582 | debounce-fn@^4.0.0: 583 | version "4.0.0" 584 | resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7" 585 | integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ== 586 | dependencies: 587 | mimic-fn "^3.0.0" 588 | 589 | debug@^2.2.0, debug@^2.6.8, debug@^2.6.9: 590 | version "2.6.9" 591 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 592 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 593 | dependencies: 594 | ms "2.0.0" 595 | 596 | debug@^3.1.0: 597 | version "3.2.7" 598 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 599 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 600 | dependencies: 601 | ms "^2.1.1" 602 | 603 | debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: 604 | version "4.3.1" 605 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 606 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 607 | dependencies: 608 | ms "2.1.2" 609 | 610 | decamelize@^1.1.1: 611 | version "1.2.0" 612 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 613 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 614 | 615 | decompress-response@^3.3.0: 616 | version "3.3.0" 617 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 618 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 619 | dependencies: 620 | mimic-response "^1.0.0" 621 | 622 | decompress-response@^4.2.0: 623 | version "4.2.1" 624 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 625 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 626 | dependencies: 627 | mimic-response "^2.0.0" 628 | 629 | dedent-js@^1.0.1: 630 | version "1.0.1" 631 | resolved "https://registry.yarnpkg.com/dedent-js/-/dedent-js-1.0.1.tgz#bee5fb7c9e727d85dffa24590d10ec1ab1255305" 632 | integrity sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU= 633 | 634 | deep-cleaner@^1.2.1: 635 | version "1.2.1" 636 | resolved "https://registry.yarnpkg.com/deep-cleaner/-/deep-cleaner-1.2.1.tgz#abc30c05bbf79a43abaf449da50e41d89ba47890" 637 | integrity sha512-/WLL2O+GnNA/t9DRagOBT7ckJnfz5wV/8TqLo5bHykcBlXPH0+PeUzd0/s2MzOQ3IiRRIFpcWVe016rCqQIhMA== 638 | 639 | deep-extend@^0.6.0: 640 | version "0.6.0" 641 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 642 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 643 | 644 | defer-to-connect@^1.0.1: 645 | version "1.1.3" 646 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 647 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 648 | 649 | define-properties@^1.1.3: 650 | version "1.1.3" 651 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 652 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 653 | dependencies: 654 | object-keys "^1.0.12" 655 | 656 | delayed-stream@~1.0.0: 657 | version "1.0.0" 658 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 659 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 660 | 661 | delegates@^1.0.0: 662 | version "1.0.0" 663 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 664 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 665 | 666 | detect-libc@^1.0.3: 667 | version "1.0.3" 668 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 669 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 670 | 671 | detect-node@^2.0.4: 672 | version "2.0.4" 673 | resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" 674 | integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== 675 | 676 | discord-rpc@^3.2.0: 677 | version "3.2.0" 678 | resolved "https://registry.yarnpkg.com/discord-rpc/-/discord-rpc-3.2.0.tgz#8da4e01654fce38e959d70b58708c46ae1d6c8fa" 679 | integrity sha512-KJv0EVbGMlr04HoG6f5b3wD7X9kSHzQ2Ed2qfHSDvYJ1MkE8RbCQmMcQQrSvAxpfsqZgUjB/bsfi/mjyicCH+A== 680 | dependencies: 681 | node-fetch "^2.6.1" 682 | ws "^7.3.1" 683 | 684 | dot-prop@^6.0.1: 685 | version "6.0.1" 686 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" 687 | integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== 688 | dependencies: 689 | is-obj "^2.0.0" 690 | 691 | duplexer3@^0.1.4: 692 | version "0.1.4" 693 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 694 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 695 | 696 | ecc-jsbn@~0.1.1: 697 | version "0.1.2" 698 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 699 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 700 | dependencies: 701 | jsbn "~0.1.0" 702 | safer-buffer "^2.1.0" 703 | 704 | electron-context-menu@^3.1.1: 705 | version "3.1.1" 706 | resolved "https://registry.yarnpkg.com/electron-context-menu/-/electron-context-menu-3.1.1.tgz#109884e79df293f7e85effcbdbbe45d362987d94" 707 | integrity sha512-LJhwaKf6XHwk2LQ5SdwoGNODoA8lRwks9bbEeAqqMf4e3hsrT7pZtX6MaHKYNFZKxF14JjI/VR+VRjGvxmaQoA== 708 | dependencies: 709 | cli-truncate "^2.1.0" 710 | electron-dl "^3.2.1" 711 | electron-is-dev "^2.0.0" 712 | 713 | electron-dl@^3.2.1: 714 | version "3.2.1" 715 | resolved "https://registry.yarnpkg.com/electron-dl/-/electron-dl-3.2.1.tgz#244a1316c663691f70e8aa4515cd1a401b4b5690" 716 | integrity sha512-k5DFjocJlXbrjshO1zeWe/Gz7HkGwCgnehHPemiyzN2B/LfLlnbIX7sCj5F+huTwZ2l+nQehTI4IR37xvCn6FQ== 717 | dependencies: 718 | ext-name "^5.0.0" 719 | pupa "^2.0.1" 720 | unused-filename "^2.1.0" 721 | 722 | electron-installer-run@^0.1.2: 723 | version "0.1.2" 724 | resolved "https://registry.yarnpkg.com/electron-installer-run/-/electron-installer-run-0.1.2.tgz#9993d351f5fb711bd4c867e0da087cbbd22d446f" 725 | integrity sha1-mZPTUfX7cRvUyGfg2gh8u9ItRG8= 726 | dependencies: 727 | debug "^2.2.0" 728 | which "^1.2.0" 729 | 730 | electron-installer-zip@^0.1.2: 731 | version "0.1.2" 732 | resolved "https://registry.yarnpkg.com/electron-installer-zip/-/electron-installer-zip-0.1.2.tgz#e529b70ad26107a1211cfb93d6951d50cb52f096" 733 | integrity sha1-5Sm3CtJhB6EhHPuT1pUdUMtS8JY= 734 | dependencies: 735 | archiver "^0.21.0" 736 | async "^1.5.2" 737 | debug "^2.2.0" 738 | electron-installer-run "^0.1.2" 739 | fs-extra "^0.26.7" 740 | mongodb-js-cli "0.0.2" 741 | zip-folder "^1.0.0" 742 | 743 | electron-is-dev@^1.0.1, electron-is-dev@^1.1.0: 744 | version "1.2.0" 745 | resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" 746 | integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== 747 | 748 | electron-is-dev@^2.0.0: 749 | version "2.0.0" 750 | resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-2.0.0.tgz#833487a069b8dad21425c67a19847d9064ab19bd" 751 | integrity sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA== 752 | 753 | electron-notarize@^1.0.0: 754 | version "1.0.0" 755 | resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.0.0.tgz#bc925b1ccc3f79e58e029e8c4706572b01a9fd8f" 756 | integrity sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og== 757 | dependencies: 758 | debug "^4.1.1" 759 | fs-extra "^9.0.1" 760 | 761 | electron-osx-sign@^0.5.0: 762 | version "0.5.0" 763 | resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" 764 | integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== 765 | dependencies: 766 | bluebird "^3.5.0" 767 | compare-version "^0.1.2" 768 | debug "^2.6.8" 769 | isbinaryfile "^3.0.2" 770 | minimist "^1.2.0" 771 | plist "^3.0.1" 772 | 773 | electron-packager@^15.2.0: 774 | version "15.2.0" 775 | resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-15.2.0.tgz#c93de19d75e7c03d159a56295384d371cb625ad4" 776 | integrity sha512-BaklTBRQy1JTijR3hi8XxHf/uo76rHbDCNM/eQHSblzE9C0NoNfOe86nPxB7y1u2jwlqoEJ4zFiHpTFioKGGRA== 777 | dependencies: 778 | "@electron/get" "^1.6.0" 779 | asar "^3.0.0" 780 | debug "^4.0.1" 781 | electron-notarize "^1.0.0" 782 | electron-osx-sign "^0.5.0" 783 | extract-zip "^2.0.0" 784 | filenamify "^4.1.0" 785 | fs-extra "^9.0.0" 786 | galactus "^0.2.1" 787 | get-package-info "^1.0.0" 788 | junk "^3.1.0" 789 | parse-author "^2.0.0" 790 | plist "^3.0.0" 791 | rcedit "^2.0.0" 792 | resolve "^1.1.6" 793 | semver "^7.1.3" 794 | yargs-parser "^20.0.0" 795 | 796 | electron-store@^8.0.0: 797 | version "8.0.0" 798 | resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.0.0.tgz#81a4e687958e2dae1c5c84cc099a8148be776337" 799 | integrity sha512-ZgRPUZkfrrjWSqxZeaxu7lEvmYf6tgl49dLMqxXGnEmliSiwv3u4rJPG+mH3fBQP9PBqgSh4TCuxHZImMMUgWg== 800 | dependencies: 801 | conf "^10.0.0" 802 | type-fest "^1.0.2" 803 | 804 | electron-unhandled@^3.0.2: 805 | version "3.0.2" 806 | resolved "https://registry.yarnpkg.com/electron-unhandled/-/electron-unhandled-3.0.2.tgz#e14a19c830ccf7b6e755191c8e78d23094d25112" 807 | integrity sha512-IIqXnM5eNgV7k5sDA/GZ39ygJbpfF3WTArNGQ1TB4AI6ajQuuVztA0M6Mq9uEpmTh5gz4nR+YsTNWYsHLoM5rw== 808 | dependencies: 809 | clean-stack "^2.1.0" 810 | electron-is-dev "^1.0.1" 811 | ensure-error "^2.0.0" 812 | lodash.debounce "^4.0.8" 813 | 814 | electron-util@^0.16.0: 815 | version "0.16.0" 816 | resolved "https://registry.yarnpkg.com/electron-util/-/electron-util-0.16.0.tgz#00ef60b23aa5a47b454c07fb353bc4d203d3ceb1" 817 | integrity sha512-r13cauuQ8p8d++ZVdeMDtQ2VlpblJBcpKnK7sf2tGnN8CCWyRGYerS2K5f3FiblFIQkyS0rE4tFVG0IOEc2F3A== 818 | dependencies: 819 | electron-is-dev "^1.1.0" 820 | new-github-issue-url "^0.2.1" 821 | 822 | electron@^13.3.0: 823 | version "13.3.0" 824 | resolved "https://registry.yarnpkg.com/electron/-/electron-13.3.0.tgz#5f4f245723dd50fcd2c3d386a1d66fe748af404f" 825 | integrity sha512-d/BvOLDjI4i7yf9tqCuLL2fFGA2TrM/D9PyRpua+rJolG0qrwp/FohP02L0m+44kmPpofIo4l3NPwLmzyKKimA== 826 | dependencies: 827 | "@electron/get" "^1.0.1" 828 | "@types/node" "^14.6.2" 829 | extract-zip "^1.0.3" 830 | 831 | emoji-regex@^8.0.0: 832 | version "8.0.0" 833 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 834 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 835 | 836 | encodeurl@^1.0.2: 837 | version "1.0.2" 838 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 839 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 840 | 841 | end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: 842 | version "1.4.4" 843 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 844 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 845 | dependencies: 846 | once "^1.4.0" 847 | 848 | ensure-error@^2.0.0: 849 | version "2.1.0" 850 | resolved "https://registry.yarnpkg.com/ensure-error/-/ensure-error-2.1.0.tgz#f11fbe383c0cf4a54850ac77acceb7bc06e0f99d" 851 | integrity sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A== 852 | 853 | env-paths@^2.2.0: 854 | version "2.2.0" 855 | resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" 856 | integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== 857 | 858 | env-paths@^2.2.1: 859 | version "2.2.1" 860 | resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" 861 | integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== 862 | 863 | error-ex@^1.2.0: 864 | version "1.3.2" 865 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 866 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 867 | dependencies: 868 | is-arrayish "^0.2.1" 869 | 870 | es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.11, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46, es5-ext@~0.10.5, es5-ext@~0.10.6: 871 | version "0.10.53" 872 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" 873 | integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== 874 | dependencies: 875 | es6-iterator "~2.0.3" 876 | es6-symbol "~3.1.3" 877 | next-tick "~1.0.0" 878 | 879 | es6-error@^4.1.1: 880 | version "4.1.1" 881 | resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" 882 | integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== 883 | 884 | es6-iterator@~0.1.3: 885 | version "0.1.3" 886 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz#d6f58b8c4fc413c249b4baa19768f8e4d7c8944e" 887 | integrity sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4= 888 | dependencies: 889 | d "~0.1.1" 890 | es5-ext "~0.10.5" 891 | es6-symbol "~2.0.1" 892 | 893 | es6-iterator@~2.0.3: 894 | version "2.0.3" 895 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 896 | integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= 897 | dependencies: 898 | d "1" 899 | es5-ext "^0.10.35" 900 | es6-symbol "^3.1.1" 901 | 902 | es6-symbol@^3.1.1, es6-symbol@~3.1.3: 903 | version "3.1.3" 904 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" 905 | integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== 906 | dependencies: 907 | d "^1.0.1" 908 | ext "^1.1.2" 909 | 910 | es6-symbol@~2.0.1: 911 | version "2.0.1" 912 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz#761b5c67cfd4f1d18afb234f691d678682cb3bf3" 913 | integrity sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M= 914 | dependencies: 915 | d "~0.1.1" 916 | es5-ext "~0.10.5" 917 | 918 | es6-weak-map@~0.1.4: 919 | version "0.1.4" 920 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228" 921 | integrity sha1-cGzvnpmqI2undmwjnIueKG6n0ig= 922 | dependencies: 923 | d "~0.1.1" 924 | es5-ext "~0.10.6" 925 | es6-iterator "~0.1.3" 926 | es6-symbol "~2.0.1" 927 | 928 | escape-goat@^2.0.0: 929 | version "2.1.1" 930 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 931 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 932 | 933 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 934 | version "1.0.5" 935 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 936 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 937 | 938 | escape-string-regexp@^4.0.0: 939 | version "4.0.0" 940 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 941 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 942 | 943 | event-emitter@~0.3.4: 944 | version "0.3.5" 945 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" 946 | integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= 947 | dependencies: 948 | d "1" 949 | es5-ext "~0.10.14" 950 | 951 | expand-template@^2.0.3: 952 | version "2.0.3" 953 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" 954 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== 955 | 956 | ext-list@^2.0.0: 957 | version "2.2.2" 958 | resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" 959 | integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== 960 | dependencies: 961 | mime-db "^1.28.0" 962 | 963 | ext-name@^5.0.0: 964 | version "5.0.0" 965 | resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" 966 | integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== 967 | dependencies: 968 | ext-list "^2.0.0" 969 | sort-keys-length "^1.0.0" 970 | 971 | ext@^1.1.2: 972 | version "1.4.0" 973 | resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" 974 | integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== 975 | dependencies: 976 | type "^2.0.0" 977 | 978 | extend@~3.0.2: 979 | version "3.0.2" 980 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 981 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 982 | 983 | extract-zip@^1.0.3: 984 | version "1.7.0" 985 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" 986 | integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== 987 | dependencies: 988 | concat-stream "^1.6.2" 989 | debug "^2.6.9" 990 | mkdirp "^0.5.4" 991 | yauzl "^2.10.0" 992 | 993 | extract-zip@^2.0.0: 994 | version "2.0.1" 995 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" 996 | integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== 997 | dependencies: 998 | debug "^4.1.1" 999 | get-stream "^5.1.0" 1000 | yauzl "^2.10.0" 1001 | optionalDependencies: 1002 | "@types/yauzl" "^2.9.1" 1003 | 1004 | extsprintf@1.3.0: 1005 | version "1.3.0" 1006 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 1007 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 1008 | 1009 | extsprintf@^1.2.0: 1010 | version "1.4.0" 1011 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 1012 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 1013 | 1014 | fast-deep-equal@^3.1.1: 1015 | version "3.1.3" 1016 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1017 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1018 | 1019 | fast-json-stable-stringify@^2.0.0: 1020 | version "2.1.0" 1021 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1022 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1023 | 1024 | fd-slicer@~1.1.0: 1025 | version "1.1.0" 1026 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 1027 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 1028 | dependencies: 1029 | pend "~1.2.0" 1030 | 1031 | figures@^1.4.0: 1032 | version "1.7.0" 1033 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 1034 | integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= 1035 | dependencies: 1036 | escape-string-regexp "^1.0.5" 1037 | object-assign "^4.1.0" 1038 | 1039 | filename-reserved-regex@^2.0.0: 1040 | version "2.0.0" 1041 | resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" 1042 | integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= 1043 | 1044 | filenamify@^4.1.0: 1045 | version "4.3.0" 1046 | resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" 1047 | integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== 1048 | dependencies: 1049 | filename-reserved-regex "^2.0.0" 1050 | strip-outer "^1.0.1" 1051 | trim-repeated "^1.0.0" 1052 | 1053 | find-up@^1.0.0: 1054 | version "1.1.2" 1055 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 1056 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 1057 | dependencies: 1058 | path-exists "^2.0.0" 1059 | pinkie-promise "^2.0.0" 1060 | 1061 | find-up@^2.0.0: 1062 | version "2.1.0" 1063 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 1064 | integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 1065 | dependencies: 1066 | locate-path "^2.0.0" 1067 | 1068 | find-up@^3.0.0: 1069 | version "3.0.0" 1070 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 1071 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 1072 | dependencies: 1073 | locate-path "^3.0.0" 1074 | 1075 | flora-colossus@^1.0.0: 1076 | version "1.0.1" 1077 | resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-1.0.1.tgz#aba198425a8185341e64f9d2a6a96fd9a3cbdb93" 1078 | integrity sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA== 1079 | dependencies: 1080 | debug "^4.1.1" 1081 | fs-extra "^7.0.0" 1082 | 1083 | forever-agent@~0.6.1: 1084 | version "0.6.1" 1085 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 1086 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 1087 | 1088 | form-data@~2.3.2: 1089 | version "2.3.3" 1090 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 1091 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 1092 | dependencies: 1093 | asynckit "^0.4.0" 1094 | combined-stream "^1.0.6" 1095 | mime-types "^2.1.12" 1096 | 1097 | fs-constants@^1.0.0: 1098 | version "1.0.0" 1099 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 1100 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 1101 | 1102 | fs-extra@^0.26.7: 1103 | version "0.26.7" 1104 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" 1105 | integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= 1106 | dependencies: 1107 | graceful-fs "^4.1.2" 1108 | jsonfile "^2.1.0" 1109 | klaw "^1.0.0" 1110 | path-is-absolute "^1.0.0" 1111 | rimraf "^2.2.8" 1112 | 1113 | fs-extra@^4.0.0: 1114 | version "4.0.3" 1115 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" 1116 | integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== 1117 | dependencies: 1118 | graceful-fs "^4.1.2" 1119 | jsonfile "^4.0.0" 1120 | universalify "^0.1.0" 1121 | 1122 | fs-extra@^7.0.0: 1123 | version "7.0.1" 1124 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 1125 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 1126 | dependencies: 1127 | graceful-fs "^4.1.2" 1128 | jsonfile "^4.0.0" 1129 | universalify "^0.1.0" 1130 | 1131 | fs-extra@^8.1.0: 1132 | version "8.1.0" 1133 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 1134 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 1135 | dependencies: 1136 | graceful-fs "^4.2.0" 1137 | jsonfile "^4.0.0" 1138 | universalify "^0.1.0" 1139 | 1140 | fs-extra@^9.0.0, fs-extra@^9.0.1: 1141 | version "9.1.0" 1142 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" 1143 | integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== 1144 | dependencies: 1145 | at-least-node "^1.0.0" 1146 | graceful-fs "^4.2.0" 1147 | jsonfile "^6.0.1" 1148 | universalify "^2.0.0" 1149 | 1150 | fs.realpath@^1.0.0: 1151 | version "1.0.0" 1152 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1153 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1154 | 1155 | function-bind@^1.1.1: 1156 | version "1.1.1" 1157 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1158 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1159 | 1160 | galactus@^0.2.1: 1161 | version "0.2.1" 1162 | resolved "https://registry.yarnpkg.com/galactus/-/galactus-0.2.1.tgz#cbed2d20a40c1f5679a35908e2b9415733e78db9" 1163 | integrity sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk= 1164 | dependencies: 1165 | debug "^3.1.0" 1166 | flora-colossus "^1.0.0" 1167 | fs-extra "^4.0.0" 1168 | 1169 | gauge@~2.7.3: 1170 | version "2.7.4" 1171 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 1172 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 1173 | dependencies: 1174 | aproba "^1.0.3" 1175 | console-control-strings "^1.0.0" 1176 | has-unicode "^2.0.0" 1177 | object-assign "^4.1.0" 1178 | signal-exit "^3.0.0" 1179 | string-width "^1.0.1" 1180 | strip-ansi "^3.0.1" 1181 | wide-align "^1.1.0" 1182 | 1183 | get-caller-file@^1.0.1: 1184 | version "1.0.3" 1185 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 1186 | integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== 1187 | 1188 | get-package-info@^1.0.0: 1189 | version "1.0.0" 1190 | resolved "https://registry.yarnpkg.com/get-package-info/-/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c" 1191 | integrity sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw= 1192 | dependencies: 1193 | bluebird "^3.1.1" 1194 | debug "^2.2.0" 1195 | lodash.get "^4.0.0" 1196 | read-pkg-up "^2.0.0" 1197 | 1198 | get-stream@^4.1.0: 1199 | version "4.1.0" 1200 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 1201 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 1202 | dependencies: 1203 | pump "^3.0.0" 1204 | 1205 | get-stream@^5.1.0: 1206 | version "5.2.0" 1207 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 1208 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 1209 | dependencies: 1210 | pump "^3.0.0" 1211 | 1212 | getpass@^0.1.1: 1213 | version "0.1.7" 1214 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 1215 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 1216 | dependencies: 1217 | assert-plus "^1.0.0" 1218 | 1219 | github-from-package@0.0.0: 1220 | version "0.0.0" 1221 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 1222 | integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= 1223 | 1224 | glob@^7.1.3: 1225 | version "7.1.6" 1226 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 1227 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 1228 | dependencies: 1229 | fs.realpath "^1.0.0" 1230 | inflight "^1.0.4" 1231 | inherits "2" 1232 | minimatch "^3.0.4" 1233 | once "^1.3.0" 1234 | path-is-absolute "^1.0.0" 1235 | 1236 | glob@^7.1.6: 1237 | version "7.1.7" 1238 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 1239 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 1240 | dependencies: 1241 | fs.realpath "^1.0.0" 1242 | inflight "^1.0.4" 1243 | inherits "2" 1244 | minimatch "^3.0.4" 1245 | once "^1.3.0" 1246 | path-is-absolute "^1.0.0" 1247 | 1248 | glob@~3.2.6: 1249 | version "3.2.11" 1250 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" 1251 | integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= 1252 | dependencies: 1253 | inherits "2" 1254 | minimatch "0.3" 1255 | 1256 | glob@~6.0.0: 1257 | version "6.0.4" 1258 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 1259 | integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= 1260 | dependencies: 1261 | inflight "^1.0.4" 1262 | inherits "2" 1263 | minimatch "2 || 3" 1264 | once "^1.3.0" 1265 | path-is-absolute "^1.0.0" 1266 | 1267 | global-agent@^2.0.2: 1268 | version "2.1.12" 1269 | resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195" 1270 | integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg== 1271 | dependencies: 1272 | boolean "^3.0.1" 1273 | core-js "^3.6.5" 1274 | es6-error "^4.1.1" 1275 | matcher "^3.0.0" 1276 | roarr "^2.15.3" 1277 | semver "^7.3.2" 1278 | serialize-error "^7.0.1" 1279 | 1280 | global-tunnel-ng@^2.7.1: 1281 | version "2.7.1" 1282 | resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" 1283 | integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== 1284 | dependencies: 1285 | encodeurl "^1.0.2" 1286 | lodash "^4.17.10" 1287 | npm-conf "^1.1.3" 1288 | tunnel "^0.0.6" 1289 | 1290 | globalthis@^1.0.1: 1291 | version "1.0.1" 1292 | resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" 1293 | integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== 1294 | dependencies: 1295 | define-properties "^1.1.3" 1296 | 1297 | got@^9.6.0: 1298 | version "9.6.0" 1299 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 1300 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 1301 | dependencies: 1302 | "@sindresorhus/is" "^0.14.0" 1303 | "@szmarczak/http-timer" "^1.1.2" 1304 | cacheable-request "^6.0.0" 1305 | decompress-response "^3.3.0" 1306 | duplexer3 "^0.1.4" 1307 | get-stream "^4.1.0" 1308 | lowercase-keys "^1.0.1" 1309 | mimic-response "^1.0.1" 1310 | p-cancelable "^1.0.0" 1311 | to-readable-stream "^1.0.0" 1312 | url-parse-lax "^3.0.0" 1313 | 1314 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 1315 | version "4.2.4" 1316 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 1317 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 1318 | 1319 | graceful-fs@^4.1.9: 1320 | version "4.2.6" 1321 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" 1322 | integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== 1323 | 1324 | har-schema@^2.0.0: 1325 | version "2.0.0" 1326 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 1327 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 1328 | 1329 | har-validator@~5.1.3: 1330 | version "5.1.5" 1331 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" 1332 | integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== 1333 | dependencies: 1334 | ajv "^6.12.3" 1335 | har-schema "^2.0.0" 1336 | 1337 | has-ansi@^2.0.0: 1338 | version "2.0.0" 1339 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1340 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 1341 | dependencies: 1342 | ansi-regex "^2.0.0" 1343 | 1344 | has-flag@^4.0.0: 1345 | version "4.0.0" 1346 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1347 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1348 | 1349 | has-unicode@^2.0.0: 1350 | version "2.0.1" 1351 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1352 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 1353 | 1354 | has@^1.0.3: 1355 | version "1.0.3" 1356 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1357 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1358 | dependencies: 1359 | function-bind "^1.1.1" 1360 | 1361 | hosted-git-info@^2.1.4: 1362 | version "2.8.8" 1363 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 1364 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 1365 | 1366 | http-cache-semantics@^4.0.0: 1367 | version "4.1.0" 1368 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 1369 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 1370 | 1371 | http-signature@~1.2.0: 1372 | version "1.2.0" 1373 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 1374 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 1375 | dependencies: 1376 | assert-plus "^1.0.0" 1377 | jsprim "^1.2.2" 1378 | sshpk "^1.7.0" 1379 | 1380 | ieee754@^1.1.13: 1381 | version "1.2.1" 1382 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1383 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1384 | 1385 | inflight@^1.0.4: 1386 | version "1.0.6" 1387 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1388 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1389 | dependencies: 1390 | once "^1.3.0" 1391 | wrappy "1" 1392 | 1393 | inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: 1394 | version "2.0.4" 1395 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1396 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1397 | 1398 | ini@^1.3.4, ini@~1.3.0: 1399 | version "1.3.8" 1400 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 1401 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 1402 | 1403 | invert-kv@^1.0.0: 1404 | version "1.0.0" 1405 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1406 | integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= 1407 | 1408 | is-arrayish@^0.2.1: 1409 | version "0.2.1" 1410 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1411 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 1412 | 1413 | is-core-module@^2.1.0: 1414 | version "2.2.0" 1415 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" 1416 | integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== 1417 | dependencies: 1418 | has "^1.0.3" 1419 | 1420 | is-core-module@^2.2.0: 1421 | version "2.4.0" 1422 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" 1423 | integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== 1424 | dependencies: 1425 | has "^1.0.3" 1426 | 1427 | is-fullwidth-code-point@^1.0.0: 1428 | version "1.0.0" 1429 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1430 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1431 | dependencies: 1432 | number-is-nan "^1.0.0" 1433 | 1434 | is-fullwidth-code-point@^2.0.0: 1435 | version "2.0.0" 1436 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1437 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1438 | 1439 | is-fullwidth-code-point@^3.0.0: 1440 | version "3.0.0" 1441 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1442 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1443 | 1444 | is-obj@^2.0.0: 1445 | version "2.0.0" 1446 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 1447 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 1448 | 1449 | is-plain-obj@^1.0.0: 1450 | version "1.1.0" 1451 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 1452 | integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= 1453 | 1454 | is-typedarray@~1.0.0: 1455 | version "1.0.0" 1456 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1457 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1458 | 1459 | is-utf8@^0.2.0: 1460 | version "0.2.1" 1461 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1462 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 1463 | 1464 | isarray@0.0.1: 1465 | version "0.0.1" 1466 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1467 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 1468 | 1469 | isarray@~1.0.0: 1470 | version "1.0.0" 1471 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1472 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1473 | 1474 | isbinaryfile@^3.0.2: 1475 | version "3.0.3" 1476 | resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" 1477 | integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== 1478 | dependencies: 1479 | buffer-alloc "^1.2.0" 1480 | 1481 | isexe@^2.0.0: 1482 | version "2.0.0" 1483 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1484 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1485 | 1486 | isstream@~0.1.2: 1487 | version "0.1.2" 1488 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1489 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 1490 | 1491 | jsbn@~0.1.0: 1492 | version "0.1.1" 1493 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1494 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 1495 | 1496 | json-buffer@3.0.0: 1497 | version "3.0.0" 1498 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 1499 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 1500 | 1501 | json-schema-traverse@^0.4.1: 1502 | version "0.4.1" 1503 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1504 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1505 | 1506 | json-schema-traverse@^1.0.0: 1507 | version "1.0.0" 1508 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1509 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 1510 | 1511 | json-schema-typed@^7.0.3: 1512 | version "7.0.3" 1513 | resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" 1514 | integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== 1515 | 1516 | json-schema@0.2.3: 1517 | version "0.2.3" 1518 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1519 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 1520 | 1521 | json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: 1522 | version "5.0.1" 1523 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1524 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 1525 | 1526 | jsonfile@^2.1.0: 1527 | version "2.4.0" 1528 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 1529 | integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= 1530 | optionalDependencies: 1531 | graceful-fs "^4.1.6" 1532 | 1533 | jsonfile@^4.0.0: 1534 | version "4.0.0" 1535 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1536 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 1537 | optionalDependencies: 1538 | graceful-fs "^4.1.6" 1539 | 1540 | jsonfile@^6.0.1: 1541 | version "6.1.0" 1542 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 1543 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 1544 | dependencies: 1545 | universalify "^2.0.0" 1546 | optionalDependencies: 1547 | graceful-fs "^4.1.6" 1548 | 1549 | jsprim@^1.2.2: 1550 | version "1.4.1" 1551 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1552 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 1553 | dependencies: 1554 | assert-plus "1.0.0" 1555 | extsprintf "1.3.0" 1556 | json-schema "0.2.3" 1557 | verror "1.10.0" 1558 | 1559 | junk@^3.1.0: 1560 | version "3.1.0" 1561 | resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" 1562 | integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== 1563 | 1564 | keytar@^7.7.0: 1565 | version "7.7.0" 1566 | resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.7.0.tgz#3002b106c01631aa79b1aa9ee0493b94179bbbd2" 1567 | integrity sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A== 1568 | dependencies: 1569 | node-addon-api "^3.0.0" 1570 | prebuild-install "^6.0.0" 1571 | 1572 | keyv@^3.0.0: 1573 | version "3.1.0" 1574 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 1575 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 1576 | dependencies: 1577 | json-buffer "3.0.0" 1578 | 1579 | klaw@^1.0.0: 1580 | version "1.3.1" 1581 | resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 1582 | integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= 1583 | optionalDependencies: 1584 | graceful-fs "^4.1.9" 1585 | 1586 | lazystream@~0.1.0: 1587 | version "0.1.0" 1588 | resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920" 1589 | integrity sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA= 1590 | dependencies: 1591 | readable-stream "~1.0.2" 1592 | 1593 | lcid@^1.0.0: 1594 | version "1.0.0" 1595 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1596 | integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= 1597 | dependencies: 1598 | invert-kv "^1.0.0" 1599 | 1600 | load-json-file@^1.0.0: 1601 | version "1.1.0" 1602 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1603 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 1604 | dependencies: 1605 | graceful-fs "^4.1.2" 1606 | parse-json "^2.2.0" 1607 | pify "^2.0.0" 1608 | pinkie-promise "^2.0.0" 1609 | strip-bom "^2.0.0" 1610 | 1611 | load-json-file@^2.0.0: 1612 | version "2.0.0" 1613 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1614 | integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= 1615 | dependencies: 1616 | graceful-fs "^4.1.2" 1617 | parse-json "^2.2.0" 1618 | pify "^2.0.0" 1619 | strip-bom "^3.0.0" 1620 | 1621 | locate-path@^2.0.0: 1622 | version "2.0.0" 1623 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1624 | integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 1625 | dependencies: 1626 | p-locate "^2.0.0" 1627 | path-exists "^3.0.0" 1628 | 1629 | locate-path@^3.0.0: 1630 | version "3.0.0" 1631 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1632 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1633 | dependencies: 1634 | p-locate "^3.0.0" 1635 | path-exists "^3.0.0" 1636 | 1637 | lodash.assign@^4.0.3, lodash.assign@^4.0.6: 1638 | version "4.2.0" 1639 | resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" 1640 | integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= 1641 | 1642 | lodash.debounce@^4.0.8: 1643 | version "4.0.8" 1644 | resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 1645 | integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= 1646 | 1647 | lodash.get@^4.0.0: 1648 | version "4.4.2" 1649 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 1650 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 1651 | 1652 | lodash@^4.17.10: 1653 | version "4.17.20" 1654 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 1655 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 1656 | 1657 | lodash@~2.4.1: 1658 | version "2.4.2" 1659 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" 1660 | integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= 1661 | 1662 | lodash@~3.10.0, lodash@~3.10.1: 1663 | version "3.10.1" 1664 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 1665 | integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= 1666 | 1667 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 1668 | version "1.0.1" 1669 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1670 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1671 | 1672 | lowercase-keys@^2.0.0: 1673 | version "2.0.0" 1674 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 1675 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 1676 | 1677 | lru-cache@2: 1678 | version "2.7.3" 1679 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 1680 | integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= 1681 | 1682 | lru-cache@^6.0.0: 1683 | version "6.0.0" 1684 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1685 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1686 | dependencies: 1687 | yallist "^4.0.0" 1688 | 1689 | lru-queue@0.1: 1690 | version "0.1.0" 1691 | resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" 1692 | integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= 1693 | dependencies: 1694 | es5-ext "~0.10.2" 1695 | 1696 | matcher@^3.0.0: 1697 | version "3.0.0" 1698 | resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" 1699 | integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== 1700 | dependencies: 1701 | escape-string-regexp "^4.0.0" 1702 | 1703 | material-icons@^0.7.2: 1704 | version "0.7.2" 1705 | resolved "https://registry.yarnpkg.com/material-icons/-/material-icons-0.7.2.tgz#cfcb9b8247c624df4fca59661e914b81ad4deceb" 1706 | integrity sha512-IrMBh/aFr2YRDHmM/gUoGB9Kq0DzmEkn/qcKcc/B4lG1FGQzG1Zs+kQyR5b5EXjAVEnTsi0fs+s7iDsiX3Indg== 1707 | 1708 | materialize-css@^1.0.0: 1709 | version "1.0.0" 1710 | resolved "https://registry.yarnpkg.com/materialize-css/-/materialize-css-1.0.0.tgz#8d5db1c4a81c6d65f3b2e2ca83a8e08daa24d1be" 1711 | integrity sha512-4/oecXl8y/1i8RDZvyvwAICyqwNoKU4or5uf8uoAd74k76KzZ0Llym4zhJ5lLNUskcqjO0AuMcvNyDkpz8Z6zw== 1712 | 1713 | memoizee@0.3.x: 1714 | version "0.3.10" 1715 | resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz#4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f" 1716 | integrity sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8= 1717 | dependencies: 1718 | d "~0.1.1" 1719 | es5-ext "~0.10.11" 1720 | es6-weak-map "~0.1.4" 1721 | event-emitter "~0.3.4" 1722 | lru-queue "0.1" 1723 | next-tick "~0.2.2" 1724 | timers-ext "0.1" 1725 | 1726 | mime-db@1.47.0: 1727 | version "1.47.0" 1728 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" 1729 | integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== 1730 | 1731 | mime-db@^1.28.0: 1732 | version "1.48.0" 1733 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" 1734 | integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== 1735 | 1736 | mime-types@^2.1.12, mime-types@~2.1.19: 1737 | version "2.1.30" 1738 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" 1739 | integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== 1740 | dependencies: 1741 | mime-db "1.47.0" 1742 | 1743 | mimic-fn@^2.1.0: 1744 | version "2.1.0" 1745 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1746 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1747 | 1748 | mimic-fn@^3.0.0: 1749 | version "3.1.0" 1750 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" 1751 | integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== 1752 | 1753 | mimic-response@^1.0.0, mimic-response@^1.0.1: 1754 | version "1.0.1" 1755 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1756 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1757 | 1758 | mimic-response@^2.0.0: 1759 | version "2.1.0" 1760 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 1761 | integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== 1762 | 1763 | minimatch@0.3: 1764 | version "0.3.0" 1765 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" 1766 | integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= 1767 | dependencies: 1768 | lru-cache "2" 1769 | sigmund "~1.0.0" 1770 | 1771 | "minimatch@2 || 3", minimatch@^3.0.4: 1772 | version "3.0.4" 1773 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1774 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1775 | dependencies: 1776 | brace-expansion "^1.1.7" 1777 | 1778 | minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: 1779 | version "1.2.5" 1780 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1781 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1782 | 1783 | mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: 1784 | version "0.5.3" 1785 | resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" 1786 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== 1787 | 1788 | mkdirp@^0.5.4: 1789 | version "0.5.5" 1790 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1791 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1792 | dependencies: 1793 | minimist "^1.2.5" 1794 | 1795 | mkdirp@^1.0.4: 1796 | version "1.0.4" 1797 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1798 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1799 | 1800 | modify-filename@^1.1.0: 1801 | version "1.1.0" 1802 | resolved "https://registry.yarnpkg.com/modify-filename/-/modify-filename-1.1.0.tgz#9a2dec83806fbb2d975f22beec859ca26b393aa1" 1803 | integrity sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE= 1804 | 1805 | mongodb-js-cli@0.0.2: 1806 | version "0.0.2" 1807 | resolved "https://registry.yarnpkg.com/mongodb-js-cli/-/mongodb-js-cli-0.0.2.tgz#97e474eb8cb2d2061a7f9b44b638d4d58397427d" 1808 | integrity sha1-l+R064yy0gYaf5tEtjjU1YOXQn0= 1809 | dependencies: 1810 | chalk "^1.1.1" 1811 | clui "^0.3.1" 1812 | debug "^2.2.0" 1813 | figures "^1.4.0" 1814 | yargs "^4.2.0" 1815 | 1816 | ms@2.0.0: 1817 | version "2.0.0" 1818 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1819 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1820 | 1821 | ms@2.1.2: 1822 | version "2.1.2" 1823 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1824 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1825 | 1826 | ms@^2.1.1: 1827 | version "2.1.3" 1828 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1829 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1830 | 1831 | napi-build-utils@^1.0.1: 1832 | version "1.0.2" 1833 | resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" 1834 | integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== 1835 | 1836 | new-github-issue-url@^0.2.1: 1837 | version "0.2.1" 1838 | resolved "https://registry.yarnpkg.com/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz#e17be1f665a92de465926603e44b9f8685630c1d" 1839 | integrity sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA== 1840 | 1841 | next-tick@1: 1842 | version "1.1.0" 1843 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" 1844 | integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== 1845 | 1846 | next-tick@~0.2.2: 1847 | version "0.2.2" 1848 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d" 1849 | integrity sha1-ddpKkn7liH45BliABltzNkE7MQ0= 1850 | 1851 | next-tick@~1.0.0: 1852 | version "1.0.0" 1853 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 1854 | integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= 1855 | 1856 | node-abi@^2.21.0: 1857 | version "2.30.0" 1858 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz#8be53bf3e7945a34eea10e0fc9a5982776cf550b" 1859 | integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg== 1860 | dependencies: 1861 | semver "^5.4.1" 1862 | 1863 | node-addon-api@^3.0.0: 1864 | version "3.2.0" 1865 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.0.tgz#7028b56a7eb572b73873aed731a7f9c9365f5ee4" 1866 | integrity sha512-kcwSAWhPi4+QzAtsL2+2s/awvDo2GKLsvMCwNRxb5BUshteXU8U97NCyvQDsGKs/m0He9WcG4YWew/BnuLx++w== 1867 | 1868 | node-fetch@^2.6.1: 1869 | version "2.6.1" 1870 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 1871 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 1872 | 1873 | node-int64@~0.4.0: 1874 | version "0.4.0" 1875 | resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" 1876 | integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= 1877 | 1878 | noop-logger@^0.1.1: 1879 | version "0.1.1" 1880 | resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" 1881 | integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= 1882 | 1883 | normalize-package-data@^2.3.2: 1884 | version "2.5.0" 1885 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1886 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1887 | dependencies: 1888 | hosted-git-info "^2.1.4" 1889 | resolve "^1.10.0" 1890 | semver "2 || 3 || 4 || 5" 1891 | validate-npm-package-license "^3.0.1" 1892 | 1893 | normalize-path@~2.0.0: 1894 | version "2.0.1" 1895 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 1896 | integrity sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o= 1897 | 1898 | normalize-url@^4.1.0: 1899 | version "4.5.0" 1900 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" 1901 | integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== 1902 | 1903 | npm-conf@^1.1.3: 1904 | version "1.1.3" 1905 | resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" 1906 | integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== 1907 | dependencies: 1908 | config-chain "^1.1.11" 1909 | pify "^3.0.0" 1910 | 1911 | npmlog@^4.0.1: 1912 | version "4.1.2" 1913 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1914 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1915 | dependencies: 1916 | are-we-there-yet "~1.1.2" 1917 | console-control-strings "~1.1.0" 1918 | gauge "~2.7.3" 1919 | set-blocking "~2.0.0" 1920 | 1921 | number-is-nan@^1.0.0: 1922 | version "1.0.1" 1923 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1924 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1925 | 1926 | oauth-sign@~0.9.0: 1927 | version "0.9.0" 1928 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1929 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 1930 | 1931 | object-assign@^4.1.0: 1932 | version "4.1.1" 1933 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1934 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1935 | 1936 | object-keys@^1.0.12: 1937 | version "1.1.1" 1938 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1939 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1940 | 1941 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1942 | version "1.4.0" 1943 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1944 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1945 | dependencies: 1946 | wrappy "1" 1947 | 1948 | onetime@^5.1.2: 1949 | version "5.1.2" 1950 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1951 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1952 | dependencies: 1953 | mimic-fn "^2.1.0" 1954 | 1955 | os-locale@^1.4.0: 1956 | version "1.4.0" 1957 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1958 | integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= 1959 | dependencies: 1960 | lcid "^1.0.0" 1961 | 1962 | p-cancelable@^1.0.0: 1963 | version "1.1.0" 1964 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1965 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1966 | 1967 | p-limit@^1.1.0: 1968 | version "1.3.0" 1969 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1970 | integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== 1971 | dependencies: 1972 | p-try "^1.0.0" 1973 | 1974 | p-limit@^2.0.0: 1975 | version "2.3.0" 1976 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1977 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1978 | dependencies: 1979 | p-try "^2.0.0" 1980 | 1981 | p-locate@^2.0.0: 1982 | version "2.0.0" 1983 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1984 | integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 1985 | dependencies: 1986 | p-limit "^1.1.0" 1987 | 1988 | p-locate@^3.0.0: 1989 | version "3.0.0" 1990 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1991 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1992 | dependencies: 1993 | p-limit "^2.0.0" 1994 | 1995 | p-try@^1.0.0: 1996 | version "1.0.0" 1997 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1998 | integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 1999 | 2000 | p-try@^2.0.0: 2001 | version "2.2.0" 2002 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 2003 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 2004 | 2005 | parse-author@^2.0.0: 2006 | version "2.0.0" 2007 | resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" 2008 | integrity sha1-00YL8d3Q367tQtp1QkLmX7aEqB8= 2009 | dependencies: 2010 | author-regex "^1.0.0" 2011 | 2012 | parse-json@^2.2.0: 2013 | version "2.2.0" 2014 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 2015 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 2016 | dependencies: 2017 | error-ex "^1.2.0" 2018 | 2019 | path-exists@^2.0.0: 2020 | version "2.1.0" 2021 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 2022 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 2023 | dependencies: 2024 | pinkie-promise "^2.0.0" 2025 | 2026 | path-exists@^3.0.0: 2027 | version "3.0.0" 2028 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 2029 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 2030 | 2031 | path-exists@^4.0.0: 2032 | version "4.0.0" 2033 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 2034 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 2035 | 2036 | path-is-absolute@^1.0.0: 2037 | version "1.0.1" 2038 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2039 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 2040 | 2041 | path-parse@^1.0.6: 2042 | version "1.0.6" 2043 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 2044 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 2045 | 2046 | path-type@^1.0.0: 2047 | version "1.1.0" 2048 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 2049 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 2050 | dependencies: 2051 | graceful-fs "^4.1.2" 2052 | pify "^2.0.0" 2053 | pinkie-promise "^2.0.0" 2054 | 2055 | path-type@^2.0.0: 2056 | version "2.0.0" 2057 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 2058 | integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= 2059 | dependencies: 2060 | pify "^2.0.0" 2061 | 2062 | pend@~1.2.0: 2063 | version "1.2.0" 2064 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 2065 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 2066 | 2067 | performance-now@^2.1.0: 2068 | version "2.1.0" 2069 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 2070 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 2071 | 2072 | pify@^2.0.0: 2073 | version "2.3.0" 2074 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 2075 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 2076 | 2077 | pify@^3.0.0: 2078 | version "3.0.0" 2079 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 2080 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 2081 | 2082 | pinkie-promise@^2.0.0: 2083 | version "2.0.1" 2084 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 2085 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 2086 | dependencies: 2087 | pinkie "^2.0.0" 2088 | 2089 | pinkie@^2.0.0: 2090 | version "2.0.4" 2091 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 2092 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 2093 | 2094 | pkg-up@^3.1.0: 2095 | version "3.1.0" 2096 | resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" 2097 | integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== 2098 | dependencies: 2099 | find-up "^3.0.0" 2100 | 2101 | plist@^3.0.0, plist@^3.0.1: 2102 | version "3.0.2" 2103 | resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.2.tgz#74bbf011124b90421c22d15779cee60060ba95bc" 2104 | integrity sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ== 2105 | dependencies: 2106 | base64-js "^1.5.1" 2107 | xmlbuilder "^9.0.7" 2108 | xmldom "^0.5.0" 2109 | 2110 | prebuild-install@^6.0.0: 2111 | version "6.1.2" 2112 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.2.tgz#6ce5fc5978feba5d3cbffedca0682b136a0b5bff" 2113 | integrity sha512-PzYWIKZeP+967WuKYXlTOhYBgGOvTRSfaKI89XnfJ0ansRAH7hDU45X+K+FZeI1Wb/7p/NnuctPH3g0IqKUuSQ== 2114 | dependencies: 2115 | detect-libc "^1.0.3" 2116 | expand-template "^2.0.3" 2117 | github-from-package "0.0.0" 2118 | minimist "^1.2.3" 2119 | mkdirp-classic "^0.5.3" 2120 | napi-build-utils "^1.0.1" 2121 | node-abi "^2.21.0" 2122 | noop-logger "^0.1.1" 2123 | npmlog "^4.0.1" 2124 | pump "^3.0.0" 2125 | rc "^1.2.7" 2126 | simple-get "^3.0.3" 2127 | tar-fs "^2.0.0" 2128 | tunnel-agent "^0.6.0" 2129 | 2130 | prepend-http@^2.0.0: 2131 | version "2.0.0" 2132 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 2133 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 2134 | 2135 | process-nextick-args@~1.0.6: 2136 | version "1.0.7" 2137 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 2138 | integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= 2139 | 2140 | process-nextick-args@~2.0.0: 2141 | version "2.0.1" 2142 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 2143 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 2144 | 2145 | progress@^2.0.3: 2146 | version "2.0.3" 2147 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 2148 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 2149 | 2150 | proto-list@~1.2.1: 2151 | version "1.2.4" 2152 | resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" 2153 | integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= 2154 | 2155 | psl@^1.1.28: 2156 | version "1.8.0" 2157 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 2158 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 2159 | 2160 | pump@^3.0.0: 2161 | version "3.0.0" 2162 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 2163 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 2164 | dependencies: 2165 | end-of-stream "^1.1.0" 2166 | once "^1.3.1" 2167 | 2168 | punycode@^2.1.0, punycode@^2.1.1: 2169 | version "2.1.1" 2170 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 2171 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 2172 | 2173 | pupa@^2.0.1: 2174 | version "2.1.1" 2175 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" 2176 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 2177 | dependencies: 2178 | escape-goat "^2.0.0" 2179 | 2180 | qs@~6.5.2: 2181 | version "6.5.2" 2182 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 2183 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 2184 | 2185 | rc@^1.2.7: 2186 | version "1.2.8" 2187 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 2188 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 2189 | dependencies: 2190 | deep-extend "^0.6.0" 2191 | ini "~1.3.0" 2192 | minimist "^1.2.0" 2193 | strip-json-comments "~2.0.1" 2194 | 2195 | rcedit@^2.0.0: 2196 | version "2.3.0" 2197 | resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.3.0.tgz#951685a079db98a4cc8c21ebab75e374d5a0b108" 2198 | integrity sha512-h1gNEl9Oai1oijwyJ1WYqYSXTStHnOcv1KYljg/8WM4NAg3H1KBK3azIaKkQ1WQl+d7PoJpcBMscPfLXVKgCLQ== 2199 | 2200 | read-pkg-up@^1.0.1: 2201 | version "1.0.1" 2202 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 2203 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 2204 | dependencies: 2205 | find-up "^1.0.0" 2206 | read-pkg "^1.0.0" 2207 | 2208 | read-pkg-up@^2.0.0: 2209 | version "2.0.0" 2210 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 2211 | integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= 2212 | dependencies: 2213 | find-up "^2.0.0" 2214 | read-pkg "^2.0.0" 2215 | 2216 | read-pkg@^1.0.0: 2217 | version "1.1.0" 2218 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 2219 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 2220 | dependencies: 2221 | load-json-file "^1.0.0" 2222 | normalize-package-data "^2.3.2" 2223 | path-type "^1.0.0" 2224 | 2225 | read-pkg@^2.0.0: 2226 | version "2.0.0" 2227 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 2228 | integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= 2229 | dependencies: 2230 | load-json-file "^2.0.0" 2231 | normalize-package-data "^2.3.2" 2232 | path-type "^2.0.0" 2233 | 2234 | readable-stream@^1.0.27-1: 2235 | version "1.1.14" 2236 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 2237 | integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= 2238 | dependencies: 2239 | core-util-is "~1.0.0" 2240 | inherits "~2.0.1" 2241 | isarray "0.0.1" 2242 | string_decoder "~0.10.x" 2243 | 2244 | readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5: 2245 | version "2.3.7" 2246 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 2247 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 2248 | dependencies: 2249 | core-util-is "~1.0.0" 2250 | inherits "~2.0.3" 2251 | isarray "~1.0.0" 2252 | process-nextick-args "~2.0.0" 2253 | safe-buffer "~5.1.1" 2254 | string_decoder "~1.1.1" 2255 | util-deprecate "~1.0.1" 2256 | 2257 | readable-stream@^3.1.1, readable-stream@^3.4.0: 2258 | version "3.6.0" 2259 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 2260 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 2261 | dependencies: 2262 | inherits "^2.0.3" 2263 | string_decoder "^1.1.1" 2264 | util-deprecate "^1.0.1" 2265 | 2266 | readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26: 2267 | version "1.0.34" 2268 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 2269 | integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= 2270 | dependencies: 2271 | core-util-is "~1.0.0" 2272 | inherits "~2.0.1" 2273 | isarray "0.0.1" 2274 | string_decoder "~0.10.x" 2275 | 2276 | readable-stream@~2.0.0: 2277 | version "2.0.6" 2278 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 2279 | integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= 2280 | dependencies: 2281 | core-util-is "~1.0.0" 2282 | inherits "~2.0.1" 2283 | isarray "~1.0.0" 2284 | process-nextick-args "~1.0.6" 2285 | string_decoder "~0.10.x" 2286 | util-deprecate "~1.0.1" 2287 | 2288 | request@^2.88.2: 2289 | version "2.88.2" 2290 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 2291 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 2292 | dependencies: 2293 | aws-sign2 "~0.7.0" 2294 | aws4 "^1.8.0" 2295 | caseless "~0.12.0" 2296 | combined-stream "~1.0.6" 2297 | extend "~3.0.2" 2298 | forever-agent "~0.6.1" 2299 | form-data "~2.3.2" 2300 | har-validator "~5.1.3" 2301 | http-signature "~1.2.0" 2302 | is-typedarray "~1.0.0" 2303 | isstream "~0.1.2" 2304 | json-stringify-safe "~5.0.1" 2305 | mime-types "~2.1.19" 2306 | oauth-sign "~0.9.0" 2307 | performance-now "^2.1.0" 2308 | qs "~6.5.2" 2309 | safe-buffer "^5.1.2" 2310 | tough-cookie "~2.5.0" 2311 | tunnel-agent "^0.6.0" 2312 | uuid "^3.3.2" 2313 | 2314 | require-directory@^2.1.1: 2315 | version "2.1.1" 2316 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2317 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 2318 | 2319 | require-from-string@^2.0.2: 2320 | version "2.0.2" 2321 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 2322 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 2323 | 2324 | require-main-filename@^1.0.1: 2325 | version "1.0.1" 2326 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 2327 | integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 2328 | 2329 | resolve@^1.1.6: 2330 | version "1.20.0" 2331 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 2332 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 2333 | dependencies: 2334 | is-core-module "^2.2.0" 2335 | path-parse "^1.0.6" 2336 | 2337 | resolve@^1.10.0: 2338 | version "1.19.0" 2339 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" 2340 | integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== 2341 | dependencies: 2342 | is-core-module "^2.1.0" 2343 | path-parse "^1.0.6" 2344 | 2345 | responselike@^1.0.2: 2346 | version "1.0.2" 2347 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 2348 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 2349 | dependencies: 2350 | lowercase-keys "^1.0.0" 2351 | 2352 | rimraf@^2.2.8: 2353 | version "2.7.1" 2354 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 2355 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 2356 | dependencies: 2357 | glob "^7.1.3" 2358 | 2359 | rimraf@^3.0.2: 2360 | version "3.0.2" 2361 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 2362 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 2363 | dependencies: 2364 | glob "^7.1.3" 2365 | 2366 | roarr@^2.15.3: 2367 | version "2.15.4" 2368 | resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" 2369 | integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== 2370 | dependencies: 2371 | boolean "^3.0.1" 2372 | detect-node "^2.0.4" 2373 | globalthis "^1.0.1" 2374 | json-stringify-safe "^5.0.1" 2375 | semver-compare "^1.0.0" 2376 | sprintf-js "^1.1.2" 2377 | 2378 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: 2379 | version "5.2.1" 2380 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2381 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2382 | 2383 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2384 | version "5.1.2" 2385 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 2386 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2387 | 2388 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 2389 | version "2.1.2" 2390 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2391 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2392 | 2393 | semver-compare@^1.0.0: 2394 | version "1.0.0" 2395 | resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 2396 | integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= 2397 | 2398 | "semver@2 || 3 || 4 || 5", semver@^5.4.1: 2399 | version "5.7.1" 2400 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 2401 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 2402 | 2403 | semver@^6.2.0: 2404 | version "6.3.0" 2405 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 2406 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 2407 | 2408 | semver@^7.1.3, semver@^7.3.5: 2409 | version "7.3.5" 2410 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 2411 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 2412 | dependencies: 2413 | lru-cache "^6.0.0" 2414 | 2415 | semver@^7.3.2: 2416 | version "7.3.4" 2417 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" 2418 | integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== 2419 | dependencies: 2420 | lru-cache "^6.0.0" 2421 | 2422 | serialize-error@^7.0.1: 2423 | version "7.0.1" 2424 | resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" 2425 | integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== 2426 | dependencies: 2427 | type-fest "^0.13.1" 2428 | 2429 | set-blocking@^2.0.0, set-blocking@~2.0.0: 2430 | version "2.0.0" 2431 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2432 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 2433 | 2434 | sigmund@~1.0.0: 2435 | version "1.0.1" 2436 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 2437 | integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= 2438 | 2439 | signal-exit@^3.0.0: 2440 | version "3.0.3" 2441 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 2442 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 2443 | 2444 | simple-concat@^1.0.0: 2445 | version "1.0.1" 2446 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" 2447 | integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== 2448 | 2449 | simple-get@^3.0.3: 2450 | version "3.1.0" 2451 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" 2452 | integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== 2453 | dependencies: 2454 | decompress-response "^4.2.0" 2455 | once "^1.3.1" 2456 | simple-concat "^1.0.0" 2457 | 2458 | slice-ansi@^3.0.0: 2459 | version "3.0.0" 2460 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" 2461 | integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== 2462 | dependencies: 2463 | ansi-styles "^4.0.0" 2464 | astral-regex "^2.0.0" 2465 | is-fullwidth-code-point "^3.0.0" 2466 | 2467 | sort-keys-length@^1.0.0: 2468 | version "1.0.1" 2469 | resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" 2470 | integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= 2471 | dependencies: 2472 | sort-keys "^1.0.0" 2473 | 2474 | sort-keys@^1.0.0: 2475 | version "1.1.2" 2476 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" 2477 | integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= 2478 | dependencies: 2479 | is-plain-obj "^1.0.0" 2480 | 2481 | spdx-correct@^3.0.0: 2482 | version "3.1.1" 2483 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 2484 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 2485 | dependencies: 2486 | spdx-expression-parse "^3.0.0" 2487 | spdx-license-ids "^3.0.0" 2488 | 2489 | spdx-exceptions@^2.1.0: 2490 | version "2.3.0" 2491 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 2492 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 2493 | 2494 | spdx-expression-parse@^3.0.0: 2495 | version "3.0.1" 2496 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 2497 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 2498 | dependencies: 2499 | spdx-exceptions "^2.1.0" 2500 | spdx-license-ids "^3.0.0" 2501 | 2502 | spdx-license-ids@^3.0.0: 2503 | version "3.0.7" 2504 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" 2505 | integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== 2506 | 2507 | sprintf-js@^1.1.2: 2508 | version "1.1.2" 2509 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" 2510 | integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== 2511 | 2512 | sshpk@^1.7.0: 2513 | version "1.16.1" 2514 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 2515 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 2516 | dependencies: 2517 | asn1 "~0.2.3" 2518 | assert-plus "^1.0.0" 2519 | bcrypt-pbkdf "^1.0.0" 2520 | dashdash "^1.12.0" 2521 | ecc-jsbn "~0.1.1" 2522 | getpass "^0.1.1" 2523 | jsbn "~0.1.0" 2524 | safer-buffer "^2.0.2" 2525 | tweetnacl "~0.14.0" 2526 | 2527 | string-width@^1.0.1: 2528 | version "1.0.2" 2529 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2530 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 2531 | dependencies: 2532 | code-point-at "^1.0.0" 2533 | is-fullwidth-code-point "^1.0.0" 2534 | strip-ansi "^3.0.0" 2535 | 2536 | "string-width@^1.0.2 || 2": 2537 | version "2.1.1" 2538 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2539 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 2540 | dependencies: 2541 | is-fullwidth-code-point "^2.0.0" 2542 | strip-ansi "^4.0.0" 2543 | 2544 | string-width@^4.2.0: 2545 | version "4.2.2" 2546 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 2547 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 2548 | dependencies: 2549 | emoji-regex "^8.0.0" 2550 | is-fullwidth-code-point "^3.0.0" 2551 | strip-ansi "^6.0.0" 2552 | 2553 | string_decoder@^1.1.1: 2554 | version "1.3.0" 2555 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2556 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2557 | dependencies: 2558 | safe-buffer "~5.2.0" 2559 | 2560 | string_decoder@~0.10.x: 2561 | version "0.10.31" 2562 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2563 | integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= 2564 | 2565 | string_decoder@~1.1.1: 2566 | version "1.1.1" 2567 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2568 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2569 | dependencies: 2570 | safe-buffer "~5.1.0" 2571 | 2572 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2573 | version "3.0.1" 2574 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2575 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2576 | dependencies: 2577 | ansi-regex "^2.0.0" 2578 | 2579 | strip-ansi@^4.0.0: 2580 | version "4.0.0" 2581 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2582 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2583 | dependencies: 2584 | ansi-regex "^3.0.0" 2585 | 2586 | strip-ansi@^6.0.0: 2587 | version "6.0.0" 2588 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 2589 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 2590 | dependencies: 2591 | ansi-regex "^5.0.0" 2592 | 2593 | strip-bom@^2.0.0: 2594 | version "2.0.0" 2595 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2596 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 2597 | dependencies: 2598 | is-utf8 "^0.2.0" 2599 | 2600 | strip-bom@^3.0.0: 2601 | version "3.0.0" 2602 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2603 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 2604 | 2605 | strip-json-comments@~2.0.1: 2606 | version "2.0.1" 2607 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2608 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2609 | 2610 | strip-outer@^1.0.1: 2611 | version "1.0.1" 2612 | resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" 2613 | integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== 2614 | dependencies: 2615 | escape-string-regexp "^1.0.2" 2616 | 2617 | sumchecker@^3.0.1: 2618 | version "3.0.1" 2619 | resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" 2620 | integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== 2621 | dependencies: 2622 | debug "^4.1.0" 2623 | 2624 | supports-color@^2.0.0: 2625 | version "2.0.0" 2626 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2627 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 2628 | 2629 | supports-color@^7.1.0: 2630 | version "7.2.0" 2631 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2632 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2633 | dependencies: 2634 | has-flag "^4.0.0" 2635 | 2636 | tar-fs@^2.0.0: 2637 | version "2.1.1" 2638 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" 2639 | integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== 2640 | dependencies: 2641 | chownr "^1.1.1" 2642 | mkdirp-classic "^0.5.2" 2643 | pump "^3.0.0" 2644 | tar-stream "^2.1.4" 2645 | 2646 | tar-stream@^2.1.4: 2647 | version "2.2.0" 2648 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" 2649 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== 2650 | dependencies: 2651 | bl "^4.0.3" 2652 | end-of-stream "^1.4.1" 2653 | fs-constants "^1.0.0" 2654 | inherits "^2.0.3" 2655 | readable-stream "^3.1.1" 2656 | 2657 | tar-stream@~0.4.0: 2658 | version "0.4.7" 2659 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-0.4.7.tgz#1f1d2ce9ebc7b42765243ca0e8f1b7bfda0aadcd" 2660 | integrity sha1-Hx0s6evHtCdlJDyg6PG3v9oKrc0= 2661 | dependencies: 2662 | bl "^0.9.0" 2663 | end-of-stream "^1.0.0" 2664 | readable-stream "^1.0.27-1" 2665 | xtend "^4.0.0" 2666 | 2667 | tar-stream@~1.3.1: 2668 | version "1.3.2" 2669 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.3.2.tgz#724d1ab4801c9b3149cdea765fe8c90ea71f6606" 2670 | integrity sha1-ck0atIAcmzFJzep2X+jJDqcfZgY= 2671 | dependencies: 2672 | bl "^1.0.0" 2673 | end-of-stream "^1.0.0" 2674 | readable-stream "^2.0.0" 2675 | xtend "^4.0.0" 2676 | 2677 | timers-ext@0.1, timers-ext@0.1.x: 2678 | version "0.1.7" 2679 | resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" 2680 | integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== 2681 | dependencies: 2682 | es5-ext "~0.10.46" 2683 | next-tick "1" 2684 | 2685 | to-readable-stream@^1.0.0: 2686 | version "1.0.0" 2687 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 2688 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 2689 | 2690 | tough-cookie@~2.5.0: 2691 | version "2.5.0" 2692 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 2693 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 2694 | dependencies: 2695 | psl "^1.1.28" 2696 | punycode "^2.1.1" 2697 | 2698 | trim-repeated@^1.0.0: 2699 | version "1.0.0" 2700 | resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" 2701 | integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= 2702 | dependencies: 2703 | escape-string-regexp "^1.0.2" 2704 | 2705 | tunnel-agent@^0.6.0: 2706 | version "0.6.0" 2707 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2708 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2709 | dependencies: 2710 | safe-buffer "^5.0.1" 2711 | 2712 | tunnel@^0.0.6: 2713 | version "0.0.6" 2714 | resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" 2715 | integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== 2716 | 2717 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2718 | version "0.14.5" 2719 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2720 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 2721 | 2722 | type-fest@^0.13.1: 2723 | version "0.13.1" 2724 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" 2725 | integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== 2726 | 2727 | type-fest@^1.0.2: 2728 | version "1.1.3" 2729 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.1.3.tgz#ea1a602e98e5a968a56a289886a52f04c686fc81" 2730 | integrity sha512-CsiQeFMR1jZEq8R+H59qe+bBevnjoV5N2WZTTdlyqxeoODQOOepN2+msQOywcieDq5sBjabKzTn3U+sfHZlMdw== 2731 | 2732 | type@^1.0.1: 2733 | version "1.2.0" 2734 | resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" 2735 | integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== 2736 | 2737 | type@^2.0.0: 2738 | version "2.5.0" 2739 | resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" 2740 | integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== 2741 | 2742 | typedarray@^0.0.6: 2743 | version "0.0.6" 2744 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2745 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2746 | 2747 | universalify@^0.1.0: 2748 | version "0.1.2" 2749 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 2750 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 2751 | 2752 | universalify@^2.0.0: 2753 | version "2.0.0" 2754 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 2755 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 2756 | 2757 | untildify@^4.0.0: 2758 | version "4.0.0" 2759 | resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" 2760 | integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== 2761 | 2762 | unused-filename@^2.1.0: 2763 | version "2.1.0" 2764 | resolved "https://registry.yarnpkg.com/unused-filename/-/unused-filename-2.1.0.tgz#33719c4e8d9644f32d2dec1bc8525c6aaeb4ba51" 2765 | integrity sha512-BMiNwJbuWmqCpAM1FqxCTD7lXF97AvfQC8Kr/DIeA6VtvhJaMDupZ82+inbjl5yVP44PcxOuCSxye1QMS0wZyg== 2766 | dependencies: 2767 | modify-filename "^1.1.0" 2768 | path-exists "^4.0.0" 2769 | 2770 | uri-js@^4.2.2: 2771 | version "4.4.1" 2772 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2773 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2774 | dependencies: 2775 | punycode "^2.1.0" 2776 | 2777 | url-parse-lax@^3.0.0: 2778 | version "3.0.0" 2779 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 2780 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 2781 | dependencies: 2782 | prepend-http "^2.0.0" 2783 | 2784 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 2785 | version "1.0.2" 2786 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2787 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2788 | 2789 | uuid@^3.3.2: 2790 | version "3.4.0" 2791 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 2792 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 2793 | 2794 | uuid@^8.3.2: 2795 | version "8.3.2" 2796 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 2797 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 2798 | 2799 | validate-npm-package-license@^3.0.1: 2800 | version "3.0.4" 2801 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2802 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2803 | dependencies: 2804 | spdx-correct "^3.0.0" 2805 | spdx-expression-parse "^3.0.0" 2806 | 2807 | verror@1.10.0: 2808 | version "1.10.0" 2809 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2810 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 2811 | dependencies: 2812 | assert-plus "^1.0.0" 2813 | core-util-is "1.0.2" 2814 | extsprintf "^1.2.0" 2815 | 2816 | which-module@^1.0.0: 2817 | version "1.0.0" 2818 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 2819 | integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= 2820 | 2821 | which@^1.2.0: 2822 | version "1.3.1" 2823 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2824 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2825 | dependencies: 2826 | isexe "^2.0.0" 2827 | 2828 | wide-align@^1.1.0: 2829 | version "1.1.3" 2830 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2831 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2832 | dependencies: 2833 | string-width "^1.0.2 || 2" 2834 | 2835 | window-size@^0.2.0: 2836 | version "0.2.0" 2837 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" 2838 | integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= 2839 | 2840 | wrap-ansi@^2.0.0: 2841 | version "2.1.0" 2842 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2843 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 2844 | dependencies: 2845 | string-width "^1.0.1" 2846 | strip-ansi "^3.0.1" 2847 | 2848 | wrappy@1: 2849 | version "1.0.2" 2850 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2851 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2852 | 2853 | ws@^7.3.1: 2854 | version "7.4.6" 2855 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" 2856 | integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== 2857 | 2858 | xmlbuilder@^9.0.7: 2859 | version "9.0.7" 2860 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 2861 | integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= 2862 | 2863 | xmldom@^0.5.0: 2864 | version "0.5.0" 2865 | resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.5.0.tgz#193cb96b84aa3486127ea6272c4596354cb4962e" 2866 | integrity sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA== 2867 | 2868 | xtend@^4.0.0: 2869 | version "4.0.2" 2870 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2871 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2872 | 2873 | y18n@^3.2.1: 2874 | version "3.2.2" 2875 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" 2876 | integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== 2877 | 2878 | yallist@^4.0.0: 2879 | version "4.0.0" 2880 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2881 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2882 | 2883 | yargs-parser@^2.4.1: 2884 | version "2.4.1" 2885 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" 2886 | integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= 2887 | dependencies: 2888 | camelcase "^3.0.0" 2889 | lodash.assign "^4.0.6" 2890 | 2891 | yargs-parser@^20.0.0: 2892 | version "20.2.7" 2893 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" 2894 | integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== 2895 | 2896 | yargs@^4.2.0: 2897 | version "4.8.1" 2898 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" 2899 | integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= 2900 | dependencies: 2901 | cliui "^3.2.0" 2902 | decamelize "^1.1.1" 2903 | get-caller-file "^1.0.1" 2904 | lodash.assign "^4.0.3" 2905 | os-locale "^1.4.0" 2906 | read-pkg-up "^1.0.1" 2907 | require-directory "^2.1.1" 2908 | require-main-filename "^1.0.1" 2909 | set-blocking "^2.0.0" 2910 | string-width "^1.0.1" 2911 | which-module "^1.0.0" 2912 | window-size "^0.2.0" 2913 | y18n "^3.2.1" 2914 | yargs-parser "^2.4.1" 2915 | 2916 | yarn-upgrade-all@^0.5.4: 2917 | version "0.5.4" 2918 | resolved "https://registry.yarnpkg.com/yarn-upgrade-all/-/yarn-upgrade-all-0.5.4.tgz#3c00677957739187a30a4ee4824c46f43996c173" 2919 | integrity sha512-XaFO3Yv6cXEBizancbRxJT3fdgHfiESNJoV/czWzXRXN2CZBk61IQIFbmeMRE6HhXcBGd+rVmnUg5Csw4axdDA== 2920 | dependencies: 2921 | chalk "^4.1.0" 2922 | commander "^5.1.0" 2923 | 2924 | yauzl@^2.10.0: 2925 | version "2.10.0" 2926 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 2927 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 2928 | dependencies: 2929 | buffer-crc32 "~0.2.3" 2930 | fd-slicer "~1.1.0" 2931 | 2932 | zip-folder@^1.0.0: 2933 | version "1.0.0" 2934 | resolved "https://registry.yarnpkg.com/zip-folder/-/zip-folder-1.0.0.tgz#70a7744fd1789a2feb41ad3419b32e9fd87957b2" 2935 | integrity sha1-cKd0T9F4mi/rQa00GbMun9h5V7I= 2936 | dependencies: 2937 | archiver "^0.11.0" 2938 | 2939 | zip-stream@~0.4.0: 2940 | version "0.4.1" 2941 | resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.4.1.tgz#4ea795a8ce19e9fab49a31d1d0877214159f03a3" 2942 | integrity sha1-TqeVqM4Z6fq0mjHR0IdyFBWfA6M= 2943 | dependencies: 2944 | compress-commons "~0.1.0" 2945 | lodash "~2.4.1" 2946 | readable-stream "~1.0.26" 2947 | 2948 | zip-stream@~0.8.0: 2949 | version "0.8.0" 2950 | resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.8.0.tgz#236b2fe25823cb4f48e8336f5bfa743aa5ae9dbd" 2951 | integrity sha1-I2sv4lgjy09I6DNvW/p0OqWunb0= 2952 | dependencies: 2953 | archiver-utils "~0.3.0" 2954 | compress-commons "~0.4.0" 2955 | lodash "~3.10.1" 2956 | readable-stream "~2.0.0" 2957 | --------------------------------------------------------------------------------