diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1dcef2d..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -.env \ No newline at end of file diff --git a/README.md b/README.md index 276bc98..32db262 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,27 @@ -# Setup process: + +# Jukebox Redux +#### By Alex Wohlbruck +##### Maintained by: LaganYT + +### Desctiption: + +Jukebox: Elevate Your Music Experience with Seamless Listening and Downloading + +Welcome to Jukebox, the ultimate destination for music lovers. Discover, stream, and download your favorite tunes effortlessly. Our intuitive interface immerses you in a world of melodious bliss, whether you're a casual listener or an audiophile. + +Discover: Explore a vast music library, curated playlists, and hidden gems. Our passionate curators bring you the best of the best. + +Listen: Enjoy crystal-clear audio quality with uninterrupted playback. Create playlists, save favorites, and rediscover beloved tracks. + +Download: Take your music offline hassle-free. Enjoy your tunes wherever you go. + +User-Friendly Experience: Find what you want easily with our streamlined design and intuitive navigation. + +Join Jukebox today and unlock a world of musical wonders. Discover, rediscover, and build the perfect playlist. Let the melodies resonate, the rhythm flow, and the beats transport you to new heights of musical euphoria. Get ready for a unique musical journey with Jukebox. + +*Jukebox is made for desktop devices, not supported by mobile. + +# Paid Setup process: Step 1: Go to [heroku](https://dashboard.heroku.com/apps) and create a new app. @@ -19,7 +42,43 @@ Step 4: Go back to the settings and install the nodejs buildpack. Step 5: Deploy the webapp. +# Free Setup process: + +Step 1: Go to [Glitch]([https://dashboard.heroku.com/apps](https://glitch.com/dashboard)) and click 'import from github' + +Step 2: There should be a popup asking what github repo to import from, insert this: `https://github.com/alexwohlbruck/jukebox` + +Step 3: Go to the .env file, and fill out the following variables. + +``` +SPOTIFY_CLIENT_ID = xxxxxxxxxxxxxxxxxxxxx +SPOTIFY_CLIENT_SECRET = xxxxxxxxxxxxxxxxxxxxx +GOOGLE_SERVER_KEY = xxxxxxxxxxxxxxxxxxxxx +``` +To get the Google server key, head to the [Google Cloud Platform website](https://console.cloud.google.com/), create a project and go to the APIs and Services page. Then Enable the `Youtube Data API V3`. You should be able to generate a server API key, which will be the value to put in your .env file. + +Then, log in to the [Spotify Developer Console](https://developer.spotify.com/dashboard), and create a new app. Once created, you should get Client ID and Client Secret keys, which are the other two values for your `.env` file. + +Step 4: Make sure everything installs and you should have a working version of the site. + Make an [issue](https://github.com/alexwohlbruck/jukebox/issues) if you have problems with anything. -This is a README.md file made by LaganYT for the self hosting of the Jukebox Redux project. +This is a README.md file made by LaganYT for the self hosting of the Jukebox project. + +## Authors + +- [@LaganYT](https://www.github.com/laganyt) +- [@alexwohlbruck](https://www.github.com/alexwohlbruck) + + +## License + +[MIT](https://choosealicense.com/licenses/mit/) + + +## Used By + +This project is used by/maintained the following companies: + +- [LTunes](https://ltunes.gq/) diff --git a/app/routes/album.routes.js b/app/routes/album.routes.js index 30eccc8..61e0922 100644 --- a/app/routes/album.routes.js +++ b/app/routes/album.routes.js @@ -6,18 +6,20 @@ router.get('/:albumId', (req, res) => { spotify.getAlbum(req.params.albumId) .then(data => { res.status(data.statusCode).json(data.body); - }, err => { + }) + .catch(err => { res.status(err.statusCode).json(err); }); }); router.get('/:albumId/tracks', (req, res) => { - spotify.getAlbumTracks(req.params.albumId) + spotify.getAlbumTracks(req.params.albumId) .then(data => { res.status(data.statusCode).json(data.body); - }, err => { + }) + .catch(err => { res.status(err.statusCode).json(err); }); }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/app/routes/artist.profile.routes.js b/app/routes/artist.profile.routes.js new file mode 100644 index 0000000..c06c7a8 --- /dev/null +++ b/app/routes/artist.profile.routes.js @@ -0,0 +1,185 @@ +const express = require("express"); +const router = express.Router(); +const Spotify = require.main.require("./app/services/spotify"); + +router.get("/:artistId", (req, res) => { + Spotify.getArtist(req.params.artistId) + .then((data) => { + const html = ` + + + Artist Profile + + + +
+

${data.body.name}

+ Artist Image + +
+ +
+
+ +
+
+ + + + `; + res.send(html); + }) + .catch((err) => { + res.status(err.statusCode).json(err); + }); +}); + +module.exports = router; diff --git a/app/routes/index.js b/app/routes/index.js index 3a31c78..2528fc8 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -5,6 +5,7 @@ var path = require('path'); router.use('/users', require('./user.routes')); router.use('/search', require('./search.routes')); router.use('/albums', require('./album.routes')); +router.use('/artist', require('./artist.profile.routes')); router.use('/artists', require('./artist.routes')); router.use('/tracks', require('./track.routes')); router.use('/radio', require('./radio.routes')); diff --git a/app/routes/radio.routes.js b/app/routes/radio.routes.js index 633c234..c1e4211 100644 --- a/app/routes/radio.routes.js +++ b/app/routes/radio.routes.js @@ -3,13 +3,21 @@ var router = express.Router(); var spotify = require.main.require('./app/services/spotify'); router.get('/', function(req, res) { - spotify.getRecommendations({ - seed_artists: req.params.seed_artists || null, - seed_genres: req.params.seed_genres || null, - seed_tracks: req.params.seed_tracks || null - }).then(function(data) { - return res.status(200).json(data); - }) + var seedArtists = req.query.seed_artists || null; + var seedGenres = req.query.seed_genres || null; + var seedTracks = req.query.seed_tracks || null; + + spotify.getRecommendations({ + seed_artists: seedArtists, + seed_genres: seedGenres, + seed_tracks: seedTracks + }) + .then(function(data) { + return res.status(200).json(data); + }) + .catch(function(err) { + return res.status(err.statusCode || 500).json(err); + }); }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/app/routes/search.routes.js b/app/routes/search.routes.js index 2852d6e..c0b652d 100644 --- a/app/routes/search.routes.js +++ b/app/routes/search.routes.js @@ -3,19 +3,20 @@ var router = express.Router(); var spotify = require.main.require('./app/services/spotify'); router.get('/', function(req, res) { - spotify.search( - req.query.q, - ['track', 'album', 'artist', 'playlist'], - { - limit: req.query.limit || 30, - offset: req.query.offset || 0 - } - ) - .then(function(data) { - res.status(200).json(data.body); - }, function(err) { - res.status(400).json(err); - }); + var searchQuery = req.query.q; + var searchTypes = ['track', 'album', 'artist', 'playlist']; + var searchOptions = { + limit: req.query.limit || 30, + offset: req.query.offset || 0 + }; + + spotify.search(searchQuery, searchTypes, searchOptions) + .then(function(data) { + res.status(200).json(data.body); + }) + .catch(function(err) { + res.status(400).json(err); + }); }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/app/routes/track.routes.js b/app/routes/track.routes.js index 5b134ab..de0d195 100644 --- a/app/routes/track.routes.js +++ b/app/routes/track.routes.js @@ -4,124 +4,147 @@ var keys = require.main.require('./config/keys'); var spotify = require.main.require('./app/services/spotify'); var google = require('googleapis'); var youtube = google.youtube('v3'); -var ytdl = require('ytdl-core'); +var ytdl = require('node-ytdl-core-v2'); var request = require('request-promise'); var cheerio = require('cheerio'); router.get('/search', function(req, res) { - - spotify.searchTracks(req.query.q).then(function(data) { - return res.status(200).json(data); - }).catch(function(err) { - console.log(err); - return res.status(400).json(err); - }); - + spotify + .searchTracks(req.query.q) + .then(function(data) { + return res.status(200).json(data); + }) + .catch(function(err) { + console.log(err); + return res.status(400).json(err); + }); }); router.get('/mp3', function(req, res) { - - if (!req.query.artist || !req.query.track) return res.json({message: "Provide an artist and a track name"}); - - youtube.search.list({ - part: 'snippet', - q: req.query.artist + ' - ' + req.query.track, - auth: keys.google.apiKey, - maxResults: 1, - type: 'video' - }, function(err, data) { - if (err) return res.status(err.statusCode).json(err); - if (data.items.length == 0) return res.status(404).json({message: "Couldn't find track"}); - - var videoId = data.items[0].id.videoId; - var url = 'https://www.youtube.com/watch?v='+videoId; - - var range = '0-'; - - if (req.headers.range) { - range = req.headers.range.replace(/bytes=/, ""); - } - - var audio = ytdl(url, { - filter: 'audioonly', - range: range - }); - - audio.on('response', function(data) { - var totalSize = data.headers['content-length']; - - var parts = range.split("-"); - var partialstart = parts[0]; - var partialend = parts[1]; - - var start = parseInt(partialstart, 10); - var end = partialend ? parseInt(partialend, 10) : totalSize - 1; - - var chunkSize = (end - start) + 1; - - res.writeHead(200, { - 'Content-Type': 'audio/webm', - 'Content-Range': 'bytes ' + start + '-' + end + '/' + totalSize, - 'Content-Length': chunkSize, - 'Content-Disposition': 'inline; filename="'+req.query.track.replace(/[^a-zA-Z0-9 ]/g, "")+'.mp3"', - 'Accept-Ranges': 'bytes' - }); - }); - - audio.pipe(res); - }); + if (!req.query.artist || !req.query.track) + return res.json({ message: 'Provide an artist and a track name' }); + + youtube.search.list( + { + part: 'snippet', + q: req.query.artist + ' - ' + req.query.track, + auth: keys.google.apiKey, + maxResults: 1, + type: 'video' + }, + function(err, data) { + if (err) return res.status(500).json({ message: 'Internal Server Error' }); + if (data.items.length == 0) + return res.status(404).json({ message: "Couldn't find track" }); + + var videoId = data.items[0].id.videoId; + var url = 'https://www.youtube.com/watch?v=' + videoId; + + var range = '0-'; + + if (req.headers.range) { + range = req.headers.range.replace(/bytes=/, ''); + } + + var audio = ytdl(url, { + filter: 'audioonly', + range: range + }); + + audio.on('response', function(data) { + var totalSize = data.headers['content-length']; + + var parts = range.split('-'); + var partialstart = parts[0]; + var partialend = parts[1]; + + var start = parseInt(partialstart, 10); + var end = partialend ? parseInt(partialend, 10) : totalSize - 1; + + var chunkSize = (end - start) + 1; + + res.writeHead(200, { + 'Content-Type': 'audio/webm', + 'Content-Range': 'bytes ' + start + '-' + end + '/' + totalSize, + 'Content-Length': chunkSize, + 'Content-Disposition': + 'inline; filename="' + + req.query.track.replace(/[^a-zA-Z0-9 ]/g, '') + + '.mp3"', + 'Accept-Ranges': 'bytes' + }); + }); + + audio.pipe(res); + } + ); }); -// Get lyics for a song +// Get lyrics for a song var metrolyrics = { - base: 'http://www.metrolyrics.com/', - formatString: function(string) { - return string - .split(" - feat.")[0].split(" - ft.")[0] // Remove artist feature tag*/ - .replace(/ *\([^)]*\) */g, "") // Remove text in parenthesis - .replace(/[^a-zA-Z0-9 ]/g, "") // Remove non alpha chars - .toLowerCase() - .split(' ') - .join('-'); - }, - getUrl: function(track) { - return this.base + this.formatString(track.name) + '-lyrics-' + this.formatString(track.artists[0].name) + '.html'; - }, - messages: { - notFound: "No lyrics available" - } + base: 'http://www.metrolyrics.com/', + formatString: function(string) { + return string + .split(' - feat.')[0] + .split(' - ft.')[0] // Remove artist feature tag*/ + .replace(/ *\([^)]*\) */g, '') // Remove text in parenthesis + .replace(/[^a-zA-Z0-9 ]/g, '') // Remove non alpha chars + .toLowerCase() + .split(' ') + .join('-'); + }, + getUrl: function(track) { + return ( + this.base + + this.formatString(track.name) + + '-lyrics-' + + this.formatString(track.artists[0].name) + + '.html' + ); + }, + messages: { + notFound: 'No lyrics available' + } }; + router.get('/lyrics', function(req, res) { - if (!req.query.track_id) return res.status(404).json({message: "No track id given"}); - - var response = {}; - - spotify.getTrack(req.query.track_id).then(function(data) { - var url = response.url = metrolyrics.getUrl(data.body); - - return request(url); + if (!req.query.track_id) + return res.status(400).json({ message: 'No track id given' }); + + var response = {}; + + spotify + .getTrack(req.query.track_id) + .then(function(data) { + var url = (response.url = metrolyrics.getUrl(data.body)); + + return request(url); }) .then(function(html) { - var $ = cheerio.load(html); - - var lyrics = response.lyrics = $('#lyrics-body-text .verse').map(function(i, el) { - return $(this).text(); - }).get().join('\n\n').trim(); - - if (lyrics == '') - return res.status(404).json({message: metrolyrics.messages.notFound}); - - return res.status(200).json(response); + var $ = cheerio.load(html); + + var lyrics = (response.lyrics = $('#lyrics-body-text .verse') + .map(function(i, el) { + return $(this).text(); + }) + .get() + .join('\n\n') + .trim()); + + if (lyrics == '') + return res.status(404).json({ message: metrolyrics.messages.notFound }); + + return res.status(200).json(response); }) .catch(function(err) { - if (err.statusCode == 404) { - // These results are a big mess (It's html for the 404 page) - err.error = undefined; - err.message = metrolyrics.messages.notFound; - err.response.body = undefined; - } - return res.status(err.statusCode || 400).json(err); + if (err.statusCode == 404) { + // These results are a big mess (It's html for the 404 page) + err.error = undefined; + err.message = metrolyrics.messages.notFound; + err.response.body = undefined; + } + return res.status(err.statusCode || 400).json(err); }); }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/app/sockets/index.js b/app/sockets/index.js index 303ce06..708e192 100644 --- a/app/sockets/index.js +++ b/app/sockets/index.js @@ -1,3 +1,3 @@ module.exports = function(io) { require('./player.socket')(io); -}; \ No newline at end of file +}; diff --git a/app/sockets/player.socket.js b/app/sockets/player.socket.js index 0c9bac1..5f0e5ec 100644 --- a/app/sockets/player.socket.js +++ b/app/sockets/player.socket.js @@ -5,7 +5,7 @@ module.exports = function(io) { id: null, type: null, tracks: [], - /* other spotify data */ + /* other Spotify data */ }, nowPlaying: { index: 0, @@ -14,101 +14,153 @@ module.exports = function(io) { progress: 0 }, }, - + setQueue(source) { + this.clearQueue(); // Clear the queue + this.queue.source = source; + this.queue.nowPlaying.index = 0; + this.queue.nowPlaying.paused = true; + this.queue.nowPlaying.track = null; + this.queue.nowPlaying.progress = 0; + io.emit('queue:set', source); }, + +toggleShuffle(state) { + // Implement your logic for toggling shuffle + this.queue.nowPlaying.shuffle = state ? 'shuffle' : 'shuffle_disabled'; + io.emit('playback:shuffle', state); +}, + +toggleRepeat(state) { + // Implement your logic for toggling repeat + this.queue.nowPlaying.loop = state ? 'repeat' : 'repeat_one'; + io.emit('playback:repeat', state); +}, + + + + clearQueue() { + this.queue.source = { + id: null, + type: null, + tracks: [], + /* other Spotify data */ + }; + this.queue.nowPlaying.index = 0; + this.queue.nowPlaying.paused = true; + this.queue.nowPlaying.track = null; + this.queue.nowPlaying.progress = 0; + }, - updateQueue(newQueue) { + updateQueue(newQueue) { this.queue = Object.assign(this.queue, newQueue); }, - plause() { - io.emit(this.queue.nowPlaying ? 'playback:play' : 'playback:pause'); - this.queue.nowPlaying = !this.queue.nowPlaying; + play() { + this.queue.nowPlaying.paused = false; + io.emit('playback:play'); + }, + + pause() { + this.queue.nowPlaying.paused = true; + io.emit('playback:pause'); }, skip(direction) { if (!this.queue.source.tracks || !this.queue.source.tracks.items) return false; - if (direction == 'next' && this.queue.nowPlaying.index < this.queue.source.tracks.items.length - 1) { + if (direction === 'next' && this.queue.nowPlaying.index < this.queue.source.tracks.items.length - 1) { this.queue.nowPlaying.index++; io.emit('playback:skip.next'); - } else if (direction == 'prev' && this.queue.nowPlaying.index > 0) { + } else if (direction === 'prev' && this.queue.nowPlaying.index > 0) { this.queue.nowPlaying.index--; io.emit('playback:skip.prev'); } }, - setVolume() { - + setVolume(volume) { + // Implement your logic for setting the volume + // For example, using the 'volume' parameter to control the volume level + this.queue.nowPlaying.volume = volume; + io.emit('playback:volume', volume); }, toggleShuffle(state) { - + // Implement your logic for toggling shuffle + this.queue.nowPlaying.shuffle = state; + io.emit('playback:shuffle', state); }, toggleRepeat(state) { - + // Implement your logic for toggling repeat + this.queue.nowPlaying.repeat = state; + io.emit('playback:repeat', state); }, seek(to) { - - }, - - // canPlay + // Implement your logic for seeking + // For example, using the 'to' parameter to seek to a specific time in the track + this.queue.nowPlaying.progress = to; + io.emit('playback:seek', to); + } }; - + + Player.downloadTrack = function() { + var track = this.queue.source.tracks.items[this.queue.nowPlaying.index]; + var artist = track.artists[0].name; + var trackName = track.name; + var trackUrl = '/api/tracks/download?artist=' + encodeURIComponent(artist) + '&track=' + encodeURIComponent(trackName); + + // Open the track URL in a new browser tab + window.open(trackUrl, '_blank'); +}; + + io.on('connection', client => { - - var clientsThatCanPlay = 0, canPlayTimeout; - - client.on('connection:ping', () => client.emit('connection:pong')); - - // TODO: Inefficient and verbose -- needs refactoring - client.on('playback:canplay', data => { - io.clients((error, clients) => { - - var totalClients = clients.length; - - if (clientsThatCanPlay == 0) { - canPlayTimeout = setTimeout(function() { - // TODO: Boot slow loading devices - console.log((totalClients - clientsThatCanPlay) + ' are taking too long, playing now'); - client.emit('playback:play'); - }, 3000); - } - - clientsThatCanPlay++; - - console.log(clientsThatCanPlay + '/' + totalClients + ' can play'); - - if (clientsThatCanPlay >= totalClients) { - clientsThatCanPlay = 0; - clearTimeout(canPlayTimeout); - - client.emit('playback:play', data); - } - }); - }); - client.on('queue:update', newQueue => { Player.updateQueue(newQueue); - io.emit('queue:update', Player.queue); }); - + client.on('queue:set', source => { Player.setQueue(source); }); - - client.on('playback:plause', () => Player.plause()); - - client.on('playback:skip.next', () => Player.skip('next')); - client.on('playback:skip.prev', () => Player.skip('prev')); - - client.on('track:play.index', data => client.broadcast.emit('track:play.index', data)); - - client.on('track:ended', () => client.broadcast.emit('track:ended')); + + client.on('playback:play', () => { + Player.play(); + }); + + client.on('playback:pause', () => { + Player.pause(); + }); + + client.on('playback:skip.next', () => { + Player.skip('next'); + }); + + client.on('playback:skip.prev', () => { + Player.skip('prev'); + }); + + client.on('playback:volume', volume => { + Player.setVolume(volume); + }); + + client.on('playback:shuffle', state => { + Player.toggleShuffle(state); + }); + + client.on('playback:repeat', state => { + Player.toggleRepeat(state); + }); + + client.on('playback:seek', position => { + Player.seek(position); + }); + + client.on('track:download', () => { + Player.downloadTrack(); + }); }); -}; \ No newline at end of file +}; diff --git a/package.json b/package.json index f846053..ae1b5d8 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "request-promise": "^4.2.1", "socket.io": "^2.0.1", "spotify-web-api-node": "^2.3.6", - "ytdl-core": "^4.9.1" + "ytdl-core": "^4.11.5" }, "devDependencies": { "grunt": "^1.0.1", diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..e85f498 --- /dev/null +++ b/public/404.html @@ -0,0 +1,41 @@ + + + + + + 404 - Page Not Found + + + +

Oops! We couldn't find that page.

+

Sorry, but the page you are looking for doesn't exist.

+

Go back to homepage

+ + diff --git a/public/apis/spotify.service.js b/public/apis/spotify.service.js index d46d98d..35af5a3 100644 --- a/public/apis/spotify.service.js +++ b/public/apis/spotify.service.js @@ -1,244 +1,360 @@ /* global angular */ -var app = angular.module('jukebox'); +var app = angular.module("jukebox"); -app.service('Spotify', ['$http', function($http) { - this.getTrack = function() { - // TODO +app.service("Spotify", [ + "$http", + function ($http) { + this.getTrack = function (trackId) { + return $http.get("/api/tracks/" + trackId); }; - - this.getTracks = function() { - // TODO - }; - - this.getAlbum = function(albumId) { - return $http.get('/api/albums/' + albumId); + + this.getTracks = function (trackIds) { + return $http.get("/api/tracks?ids=" + trackIds.join(",")); }; - - this.getAlbums = function() { - // TODO + + this.getAlbum = function (albumId) { + return $http.get("/api/albums/" + albumId); }; - - this.getArtist = function() { - // TODO + + this.getAlbums = function (albumIds) { + return $http.get("/api/albums?ids=" + albumIds.join(",")); }; - - this.getArtists = function() { - // TODO + + this.getArtist = function (artistId) { + return $http.get("/api/artists/" + artistId); }; - - this.search = function() { - // TODO + + this.getArtists = function (artistIds) { + return $http.get("/api/artists?ids=" + artistIds.join(",")); }; - - this.searchAlbums = function() { - // TODO + + this.search = function (query) { + return $http.get("/api/search?q=" + query); }; - - this.searchArtists = function() { - // TODO + + this.searchAlbums = function (query) { + return $http.get("/api/search?type=album&q=" + query); }; - - this.searchTracks = function() { - // TODO + + this.searchArtists = function (query) { + return $http.get("/api/search?type=artist&q=" + query); }; - - this.searchPlaylists = function() { - // TODO + + this.searchTracks = function (query) { + return $http.get("/api/search?type=track&q=" + query); }; - - this.getArtistAlbums = function() { - // TODO + + this.searchPlaylists = function (query) { + return $http.get("/api/search?type=playlist&q=" + query); }; - - this.getAlbumTracks = function(albumId) { - return $http.get('/api/albums/' + albumId + '/tracks'); + + this.getAlbumTracks = function (albumId) { + return $http.get("/api/albums/" + albumId + "/tracks"); }; - - this.getArtistTopTracks = function() { - // TODO + + this.getArtistTopTracks = function (artistId) { + return $http.get("/api/artists/" + artistId + "/top-tracks"); }; - - this.getArtistRelatedArtists = function() { - // TODO + + this.getArtistRelatedArtists = function (artistId) { + return $http.get("/api/artists/" + artistId + "/related-artists"); }; - - this.getUser = function() { - // TODO + + this.getUser = function (userId) { + return $http.get("/api/users/" + userId); }; - - this.getMe = function() { - // TODO + + this.getMe = function () { + return $http.get("/api/me"); }; - - this.getUserPlaylists = function() { - // TODO + + this.getUserPlaylists = function (userId) { + return $http.get("/api/users/" + userId + "/playlists"); }; - - this.getPlaylist = function() { - // TODO + + this.getPlaylist = function (playlistId) { + return $http.get("/api/playlists/" + playlistId); }; - - this.getPlaylistTracks = function() { - // TODO + + this.getPlaylistTracks = function (playlistId) { + return $http.get("/api/playlists/" + playlistId + "/tracks"); }; - - this.createPlaylist = function() { - // TODO + + this.createPlaylist = function (userId, playlistData) { + return $http.post("/api/users/" + userId + "/playlists", playlistData); }; - - this.followPlaylist = function() { - // TODO + + this.followPlaylist = function (playlistId) { + return $http.put("/api/playlists/" + playlistId + "/follow"); }; - - this.unfollowPlaylist = function() { - // TODO + + this.unfollowPlaylist = function (playlistId) { + return $http.delete("/api/playlists/" + playlistId + "/follow"); }; - - this.changePlaylistDetails = function() { - // TODO + + this.changePlaylistDetails = function (playlistId, updatedData) { + return $http.put("/api/playlists/" + playlistId, updatedData); }; - - this.addTracksToPlaylist = function() { - // TODO + + this.addTracksToPlaylist = function (playlistId, trackUris) { + return $http.post("/api/playlists/" + playlistId + "/tracks", trackUris); }; - - this.removeTracksFromPlaylist = function() { - // TODO + + this.removeTracksFromPlaylist = function (playlistId, trackUris) { + var config = { + data: { tracks: trackUris }, + headers: { "Content-Type": "application/json;charset=utf-8" }, + }; + return $http.delete("/api/playlists/" + playlistId + "/tracks", config); }; - - this.removeTracksFromPlaylistByPosition = function() { - // TODO + + this.removeTracksFromPlaylistByPosition = function (playlistId, positions) { + var config = { + data: { positions: positions }, + headers: { "Content-Type": "application/json;charset=utf-8" }, + }; + return $http.delete( + "/api/playlists/" + playlistId + "/tracks/positions", + config + ); }; - - this.replaceTracksInPlaylist = function() { - // TODO + + this.replaceTracksInPlaylist = function (playlistId, trackUris) { + return $http.put("/api/playlists/" + playlistId + "/tracks", trackUris); }; - - this.reorderTracksInPlaylist = function() { - // TODO + + this.reorderTracksInPlaylist = function ( + playlistId, + rangeStart, + insertBefore + ) { + return $http.put("/api/playlists/" + playlistId + "/tracks/reorder", { + range_start: rangeStart, + insert_before: insertBefore, + }); }; - - this.getAudioFeaturesForTrack = function() { - // TODO + + this.getAudioFeaturesForTrack = function (trackId) { + return $http.get("/api/audio-features/" + trackId); }; - - this.getAudioFeaturesForTracks = function() { - // TODO + + this.getAudioFeaturesForTracks = function (trackIds) { + return $http.get("/api/audio-features?ids=" + trackIds.join(",")); }; - - this.getRecommendations = function() { - // TODO + + this.getRecommendations = function (options) { + var queryParams = buildRecommendationQueryParams(options); + return $http.get("/api/recommendations" + queryParams); }; - - this.getAvailableGenreSeeds = function() { - // TODO + + this.getAvailableGenreSeeds = function () { + return $http.get("/api/recommendations/available-genre-seeds"); }; - - this.clientCredentialsGrant = function() { - // TODO + + this.clientCredentialsGrant = function () { + // TODO: Implement client credentials grant }; - - this.authorizationCodeGrant = function() { - // TODO + + this.authorizationCodeGrant = function () { + // TODO: Implement authorization code grant }; - - this.refreshAccessToken = function() { - // TODO + + this.refreshAccessToken = function () { + // TODO: Implement access token refresh }; - - this.createAuthorizeURL = function() { - // TODO + + this.createAuthorizeURL = function () { + // TODO: Implement create authorize URL }; - - this.getMySavedTracks = function() { - // TODO + + this.getMySavedTracks = function () { + return $http.get("/api/me/tracks"); }; - - this.containsMySavedTracks = function() { - // TODO + + this.containsMySavedTracks = function (trackIds) { + return $http.get("/api/me/tracks/contains?ids=" + trackIds.join(",")); }; - - this.removeFromMySavedTracks = function() { - // TODO + + this.removeFromMySavedTracks = function (trackIds) { + return $http.delete("/api/me/tracks", { data: { ids: trackIds } }); }; - - this.addToMySavedTracks = function() { - // TODO + + this.addToMySavedTracks = function (trackIds) { + return $http.put("/api/me/tracks", { ids: trackIds }); }; - - this.removeFromMySavedAlbums = function() { - // TODO + + this.removeFromMySavedAlbums = function (albumIds) { + return $http.delete("/api/me/albums", { data: { ids: albumIds } }); }; - - this.addToMySavedAlbums = function() { - // TODO + + this.addToMySavedAlbums = function (albumIds) { + return $http.put("/api/me/albums", { ids: albumIds }); }; - - this.getMySavedAlbums = function() { - // TODO + + this.getMySavedAlbums = function () { + return $http.get("/api/me/albums"); }; - - this.containsMySavedAlbums = function() { - // TODO + + this.containsMySavedAlbums = function (albumIds) { + return $http.get("/api/me/albums/contains?ids=" + albumIds.join(",")); }; - - this.getMyTopArtists = function() { - // TODO + + this.getMyTopArtists = function () { + return $http.get("/api/me/top-artists"); }; - - this.getMyTopTracks = function() { - // TODO + + this.getMyTopTracks = function () { + return $http.get("/api/me/top-tracks"); }; - - this.followUsers = function() { - // TODO + + this.followUsers = function (userIds) { + return $http.put("/api/me/following", { ids: userIds }); }; - - this.followArtists = function() { - // TODO + + this.followArtists = function (artistIds) { + return $http.put("/api/me/following?type=artist", { ids: artistIds }); }; - - this.unfollowUsers = function() { - // TODO + + this.unfollowUsers = function (userIds) { + return $http.delete("/api/me/following", { data: { ids: userIds } }); }; - - this.unfollowArtists = function() { - // TODO + + this.unfollowArtists = function (artistIds) { + return $http.delete("/api/me/following?type=artist", { + data: { ids: artistIds }, + }); }; - - this.isFollowingUsers = function() { - // TODO + + this.isFollowingUsers = function (userIds) { + return $http.get( + "/api/me/following/contains?type=user&ids=" + userIds.join(",") + ); }; - - this.getFollowedArtists = function() { - // TODO + + this.getFollowedArtists = function () { + return $http.get("/api/me/following?type=artist"); }; - - this.areFollowingPlaylist = function() { - // TODO + + this.areFollowingPlaylist = function (playlistId, userIds) { + return $http.get( + "/api/playlists/" + + playlistId + + "/followers/contains?ids=" + + userIds.join(",") + ); }; - - this.isFollowingArtists = function() { - // TODO + + this.isFollowingArtists = function (artistIds) { + return $http.get( + "/api/me/following/contains?type=artist&ids=" + artistIds.join(",") + ); }; - - this.getNewReleases = function() { - // TODO + + this.getNewReleases = function (options) { + var queryParams = buildNewReleasesQueryParams(options); + return $http.get("/api/browse/new-releases" + queryParams); }; - - this.getFeaturedPlaylists = function() { - // TODO + + this.getFeaturedPlaylists = function (options) { + var queryParams = buildFeaturedPlaylistsQueryParams(options); + return $http.get("/api/browse/featured-playlists" + queryParams); }; - - this.getCategories = function() { - // TODO + + this.getCategories = function (options) { + var queryParams = buildCategoriesQueryParams(options); + return $http.get("/api/browse/categories" + queryParams); }; - - this.getCategory = function() { - // TODO + + this.getCategory = function (categoryId, options) { + var queryParams = buildCategoryQueryParams(options); + return $http.get("/api/browse/categories/" + categoryId + queryParams); }; - - this.getPlaylistsForCategory = function() { - // TODO + + this.getPlaylistsForCategory = function (categoryId, options) { + var queryParams = buildCategoryPlaylistsQueryParams(options); + return $http.get( + "/api/browse/categories/" + categoryId + "/playlists" + queryParams + ); }; -}]); \ No newline at end of file + + // Helper functions for building query parameters + + function buildRecommendationQueryParams(options) { + var params = []; + if (options.seed_artists) { + params.push("seed_artists=" + options.seed_artists.join(",")); + } + if (options.seed_genres) { + params.push("seed_genres=" + options.seed_genres.join(",")); + } + if (options.seed_tracks) { + params.push("seed_tracks=" + options.seed_tracks.join(",")); + } + if (options.limit) { + params.push("limit=" + options.limit); + } + return "?" + params.join("&"); + } + + function buildNewReleasesQueryParams(options) { + var params = []; + if (options.country) { + params.push("country=" + options.country); + } + if (options.limit) { + params.push("limit=" + options.limit); + } + return "?" + params.join("&"); + } + + function buildFeaturedPlaylistsQueryParams(options) { + var params = []; + if (options.country) { + params.push("country=" + options.country); + } + if (options.limit) { + params.push("limit=" + options.limit); + } + return "?" + params.join("&"); + } + + function buildCategoriesQueryParams(options) { + var params = []; + if (options.country) { + params.push("country=" + options.country); + } + if (options.locale) { + params.push("locale=" + options.locale); + } + if (options.limit) { + params.push("limit=" + options.limit); + } + return "?" + params.join("&"); + } + + function buildCategoryQueryParams(options) { + var params = []; + if (options.country) { + params.push("country=" + options.country); + } + if (options.locale) { + params.push("locale=" + options.locale); + } + return "?" + params.join("&"); + } + + function buildCategoryPlaylistsQueryParams(options) { + var params = []; + if (options.country) { + params.push("country=" + options.country); + } + if (options.limit) { + params.push("limit=" + options.limit); + } + if (options.offset) { + params.push("offset=" + options.offset); + } + return "?" + params.join("&"); + } + }, +]); \ No newline at end of file diff --git a/public/components/lists/artists/artists.directive.html b/public/components/lists/artists/artists.directive.html index ee01088..7af54d6 100644 --- a/public/components/lists/artists/artists.directive.html +++ b/public/components/lists/artists/artists.directive.html @@ -1,3 +1,5 @@
- + + +
\ No newline at end of file diff --git a/public/components/lists/playlists/playlist.directive.html b/public/components/lists/playlists/playlist.directive.html index e69de29..3294a08 100644 --- a/public/components/lists/playlists/playlist.directive.html +++ b/public/components/lists/playlists/playlist.directive.html @@ -0,0 +1,6 @@ +
+

{{ data.title }}

+ +
\ No newline at end of file diff --git a/public/components/lists/tracks/tracks.directive.html b/public/components/lists/tracks/tracks.directive.html index e69de29..58c61c8 100644 --- a/public/components/lists/tracks/tracks.directive.html +++ b/public/components/lists/tracks/tracks.directive.html @@ -0,0 +1,5 @@ +
+ +
diff --git a/public/components/player/playbar/playbar.directive.html b/public/components/player/playbar/playbar.directive.html index 8632f2c..a53e9fc 100644 --- a/public/components/player/playbar/playbar.directive.html +++ b/public/components/player/playbar/playbar.directive.html @@ -1,57 +1,58 @@ - - - - -
- - -
-
-

{{Player.queue.source.tracks.items[Player.queue.nowPlaying.index].name}}

- -

- {{Player.queue.source.tracks.items[0].artists[0].name}} - - - {{Player.queue.source.name}} -

-
- -
- - loop - - - - skip_previous - - - - {{Player.el.paused ? 'play_arrow' : 'pause'}} - - - - skip_next - - - - shuffle - -
- -
- - music_note - -
-
-
-
\ No newline at end of file + + + + +
+ + +
+
+

{{Player.queue.source.tracks.items[Player.queue.nowPlaying.index].name}}

+ +

+ {{Player.queue.source.tracks.items[0].artists[0].name}} + - + {{Player.queue.source.name}} +

+
+ +
+ + + + skip_previous + + + + {{Player.el.paused ? 'play_arrow' : 'pause'}} + + + + skip_next + + + + + + + file_download + +
+ + + + + + + + +
+
+
diff --git a/public/components/player/player.service.js b/public/components/player/player.service.js index bd8d851..9c529bb 100644 --- a/public/components/player/player.service.js +++ b/public/components/player/player.service.js @@ -2,119 +2,123 @@ var app = angular.module('jukebox'); app.service('Player', ['$rootScope', 'Socket', '$http', '$mdToast', function($rootScope, Socket, $http, $mdToast) { - var Player = this; - - this.el = document.getElementById('song'); - - this.pinnedQueue = true; - - this.queue = { + var Player = this; + + this.el = new Audio(); + + this.pinnedQueue = true; + + this.queue = { source: { id: null, type: null, tracks: [], - /* other spotify data */ + /* other Spotify data */ }, nowPlaying: { index: 0, paused: true, track: null, - progress: 0 + progress: 0, + loop: 'loop_off', + shuffle: false + } + }; + + this.toggleLoop = function() { + var loopModes = ['loop_queue', 'loop_song', 'loop_off']; + var currentIndex = loopModes.indexOf(Player.queue.nowPlaying.loop); + var newIndex = (currentIndex + 1) % loopModes.length; + Player.queue.nowPlaying.loop = loopModes[newIndex]; + }; + + this.toggleShuffle = function() { + Player.queue.nowPlaying.shuffle = !Player.queue.nowPlaying.shuffle; + }; + +this.play = function(source) { + if (Player.queue.source.id === source.id && !source.tracks[source.index].isEmpty) { + // Same album, switch to the new song within the album + Player.queue.nowPlaying.index = source.index; + Player.updateStreamUrl(); + Player.el.play(); + } else { + // Different album or the selected song is empty, clear the queue and set the new source + this.queue.source = { + id: null, + type: null, + tracks: [], + /* other Spotify data */ + }; + this.queue.nowPlaying.index = 0; + this.queue.nowPlaying.paused = true; + this.queue.nowPlaying.track = null; + this.queue.nowPlaying.progress = 0; + Player.queue.source = source; + Player.updateStreamUrl(); + Player.el.play(); + } +}; + + + + Player.downloadTrack = function() { + var track = this.queue.source.tracks.items[this.queue.nowPlaying.index]; + var artist = track.artists[0].name; + var trackName = track.name; + var trackUrl = '/api/tracks/mp3?artist=' + encodeURIComponent(artist) + '&track=' + encodeURIComponent(trackName); + + // Open the track URL in a new browser tab + window.open(trackUrl, '_blank'); +}; + + + this.plause = function() { + Player.queue.nowPlaying.paused = !Player.queue.nowPlaying.paused; + if (Player.queue.nowPlaying.paused) { + Player.el.pause(); + } else { + Player.el.play(); } }; - - this.latency = 100; - this.maxLatency = 250; - - var pingTime, pongTime, latency, showedSlowConnectionToast = false; - - // Ping each client to test connection speed - setInterval(function() { - pingTime = new Date(); - Socket.emit('connection:ping'); - }, (5 * 1000)); - - // Recieve pong and save response time - Socket.on('connection:pong', function() { - pongTime = new Date(); - Player.latency = latency = (pongTime - pingTime) / 2; - - if (latency > 1000 && !showedSlowConnectionToast) { - $mdToast.show($mdToast.simple().textContent('Connection too slow for synced music')); - showedSlowConnectionToast = true; + + this.skipTo = function(track) { + var trackIndex = Player.queue.source.tracks.items.indexOf(track); + if (trackIndex > -1) { + Player.queue.nowPlaying.index = trackIndex; + Player.updateStreamUrl(); + Player.el.play(); } + }; + + this.skip = function(direction) { + if (direction === 'next') { + Player.queue.nowPlaying.index++; + } else if (direction === 'prev') { + Player.queue.nowPlaying.index--; + } + Player.updateStreamUrl(); + Player.el.play(); + }; + +this.updateStreamUrl = function() { + var track = Player.queue.source.tracks.items[Player.queue.nowPlaying.index]; + if (track) { + Player.queue.nowPlaying.track = track; + var artist = track.artists[0].name; + var trackName = track.name; + Player.el.src = '/api/tracks/mp3?artist=' + encodeURIComponent(artist) + '&track=' + encodeURIComponent(trackName); + } else { + Player.queue.nowPlaying.track = null; + Player.el.src = ''; + Player.el.pause(); + } +}; + + + Player.el.addEventListener('ended', function() { + $rootScope.$apply(function() { + Player.skip('next'); + }); }); - - - Socket.on('queue:update', function(newQueue) { - Player.udpateQueue(newQueue); - Player.updateStreamUrl(); - Player.updateVibrantSwatches(); - }); - - this.play = function(source) { - Socket.emit('queue:set', source); - }; - - Socket.on('queue:set', function(source) { - Player.queue.source = source; - Player.updateStreamUrl(); - Player.updateVibrantSwatches(); - }); - - - this.plause = function() { - Socket.emit('playback:plause'); - }; - - Socket.on('playback:play', function() { - setTimeout(function() { - Player.el.play(); - }, (Player.maxLatency - Player.latency)); - }); - - Socket.on('playback:pause', function() { - setTimeout(function() { - Player.el.pause(); - }, (Player.maxLatency - Player.latency)); - }); - - this.skip = function(direction) { - Socket.emit('playback:skip.' + direction); - }; - - Socket.on('playback:skip.next', function() { - Player.queue.nowPlaying.index++; - Player.updateStreamUrl(); - Player.updateVibrantSwatches(); - }); - - Socket.on('playback:skip.prev', function() { - Player.queue.nowPlaying.index--; - Player.updateStreamUrl(); - Player.updateVibrantSwatches(); - }); - - this.updateVibrantSwatches = function() { - // Nested RAF to wait for Vibrant to load - window.requestAnimationFrame(function() { - window.requestAnimationFrame(function() { - Player.queue.nowPlaying.theme = Player.queue.nowPlaying.swatches.Vibrant.getBodyTextColor() == '#000' ? 'light' : 'dark'; - }); - }); - }; - - this.updateStreamUrl = function() { - var track = Player.queue.source.tracks.items[Player.queue.nowPlaying.index]; - Player.queue.nowPlaying.streamUrl = '/api/tracks/mp3?artist='+track.artists[0].name+'&track='+track.name; - }; - - Player.el.addEventListener('canplay', function() { - console.log('canplay'); - Socket.emit('playback:canplay'); - }); - - Socket.on('playback:ended', function() { - Player.el.skip('next'); - }); -}]); \ No newline at end of file +}]); diff --git a/public/components/player/seekbar/seekbar.directive.js b/public/components/player/seekbar/seekbar.directive.js index 1339b3b..dec0ce5 100644 --- a/public/components/player/seekbar/seekbar.directive.js +++ b/public/components/player/seekbar/seekbar.directive.js @@ -1,34 +1,37 @@ /* global angular */ var app = angular.module('jukebox'); -app.directive('seekbar', ['$document', 'Player', function($document) { - return { - restrict: 'E', - scope: { - audio: '=' - }, - link: function(scope, element, attrs) { - scope.audio.addEventListener('timeupdate', function() { - scope.$apply(); - }); - - scope.audio.addEventListener('progress', function() { - if (!scope.audio.buffers) scope.audio.buffers = []; - - if (scope.audio.duration > 0) { - for (var i = 0; i < scope.audio.buffered.length; i++) { - scope.audio.buffers[i] = { - length: Math.round( - (scope.audio.buffered.end(i) - scope.audio.buffered.start(i)) / scope.audio.duration * 100 - ), - offset: Math.round( - scope.audio.buffered.start(i) / scope.audio.duration * 100 - ) - }; - } - } - }); - }, - templateUrl: 'components/player/seekbar/seekbar.directive.html' - }; -}]); \ No newline at end of file +app.directive('seekbar', ['$document', function($document) { + return { + restrict: 'E', + scope: { + audio: '=' + }, + controller: ['$scope', function($scope) { + // Download track function + $scope.downloadTrack = function() { + var track = $scope.audio.source.tracks.items[$scope.audio.nowPlaying.index]; + var trackUrl = track.preview_url; + var trackName = track.name + '.mp3'; + + if (trackUrl) { + // Create an invisible anchor element + var anchor = document.createElement('a'); + anchor.style.display = 'none'; + anchor.href = trackUrl; + anchor.download = trackName; + + // Append the anchor element to the document body + document.body.appendChild(anchor); + + // Trigger a click event on the anchor element to start the download + anchor.click(); + + // Remove the anchor element from the document body + document.body.removeChild(anchor); + } + }; + }], + templateUrl: 'components/player/seekbar/seekbar.directive.html' + }; +}]); diff --git a/public/components/queue/queue.directive.html b/public/components/queue/queue.directive.html index ff20ea7..69ef116 100644 --- a/public/components/queue/queue.directive.html +++ b/public/components/queue/queue.directive.html @@ -2,7 +2,7 @@

Up next

- +
-
+ + +
diff --git a/public/css/style.css b/public/css/style.css index 905f7ed..857c745 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1 +1 @@ -@font-face {font-family: Circular;src: url(https://sp-bootstrap.global.ssl.fastly.net/8.0.0/fonts/circular-book.woff2);font-weight: 300;}@font-face {font-family: Circular;src: url(https://sp-bootstrap.global.ssl.fastly.net/8.0.0/fonts/circular-bold.woff2);font-weight: 500;}@font-face {font-family: Circular;src: url(https://sp-bootstrap.global.ssl.fastly.net/8.0.0/fonts/circular-black.woff2);font-weight: 700;}.md-display-1, .md-display-2, .md-display-3, .md-headline, .md-display-4 {font-weight: 500;font-family: Circular, Robot, Sans-Serif !important;}.md-display-4 {font-weight: 700 !important;}queue .tracks {padding: 18px 0px;}queue .tracks .track .index {margin-right: 16px;color: white;font-weight: 500;}queue .people {position: absolute;width: 100%;transform: translateY(-50%);z-index: 2;}queue .people .person {margin: 0px 3px;}albums .container, artists .container {perspective: 2000px;}album .container {position: relative;cursor: pointer;transition: ease-in-out transform 200ms;}album .container:focus {outline: 0;}album .container:hover {transform: translateZ(-20px) rotate3d(1, 0, 0, 3deg);}album .md-fab {position: absolute;right: 0;top: 95px;background: rgba(255, 255, 255, 0.8) !important;transition: cubic-bezier(0.34, 0, 0.09, 1) transform 300ms !important;transform: scale(1);}album .md-fab:hover {background: rgba(255, 255, 255, 0.8);}album .md-fab.ng-hide {transform: scale(0);}album .md-fab md-icon {color: rgba(0, 0, 0, 0.6) !important;}artist .container {position: relative;cursor: pointer;width: 100px;margin: 0px 5px;transition: ease-in-out transform 200ms;}artist .container:focus {outline: 0;}artist .container:hover {transform: translateZ(-20px) rotate3d(1, 0, 0, 3deg);}artist .name {text-align: center;margin-bottom: 5px;line-height: 17px;}artist .followers {margin-top: 0px;text-align: center;}.md-avatar {border-radius: 50%;object-fit: cover;}.md-avatar.square {border-radius: 0px !important;}.md-avatar.small {width: 25px;height: 25px;}.md-avatar.large {width: 40px;height: 40px;}.md-avatar.x-large {width: 80px;height: 80px;}.md-avatar.ring {border: 5px solid #3a3a3a;}md-input-container.no-error .md-errors-spacer {display: none;}playbar md-card {margin: 0;height: 100px;transition: ease-in-out background 500ms;}playbar .cover {width: 100px;}playbar .controls {position: relative;}playbar .controls p, playbar .controls span, playbar .controls a {transition: ease-in-out color 500ms;}playbar .controls .left {margin-right: auto;}playbar .controls .left .title, playbar .controls .left .detail {margin: 0;}playbar .controls .center {position: absolute;left: 50%;transform: translateX(-50%);}playbar .controls .right {margin-left: auto;}seekbar {position: relative;}seekbar .buffer {position: absolute;height: 23px;background: rgba(255, 255, 255, 0.08);}seekbar .container {background: rgba(0, 0, 0, 0.5);}seekbar .container .time {color: rgba(255, 255, 255, 0.8);font-weight: 500;font-size: 9pt;padding: 0px 10px;position: relative;}seekbar .container body {background: #18d;margin: 0;}seekbar .container input[type=range] {z-index: 1;-webkit-appearance: none;width: 100%;margin: 0px 0;background: none;}seekbar .container input[type=range]:focus {outline: none;}seekbar .container input[type=range]::-webkit-slider-runnable-track {width: 100%;height: 23px;cursor: pointer;box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;background: transparent;border-radius: 0px;border: 0px solid #000000;}seekbar .container input[type=range]::-webkit-slider-thumb {box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;border: 0px solid #000000;height: 23px;width: 10px;border-radius: 0px;background: rgba(255, 255, 255, 0.8);cursor: pointer;-webkit-appearance: none;margin-top: 0px;}seekbar .container input[type=range]::-moz-range-track {width: 100%;height: 23px;cursor: pointer;box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;background: transparent;border-radius: 0px;border: 0px solid #000000;}seekbar .container input[type=range]::-moz-range-thumb {box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;border: 0px solid #000000;height: 23px;width: 10px;border-radius: 0px;background: rgba(255, 255, 255, 0.8);cursor: pointer;}seekbar .container input[type=range]::-ms-track {width: 100%;height: 23px;cursor: pointer;background: transparent;border-color: transparent;color: transparent;}seekbar .container input[type=range]::-ms-fill-lower, seekbar .container input[type=range]::-ms-fill-upper {background: transparent;border: 0px solid #000000;border-radius: 0px;box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;}seekbar .container input[type=range]::-ms-thumb {box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;border: 0px solid #000000;width: 10px;border-radius: 0px;background: rgba(255, 255, 255, 0.8);cursor: pointer;height: 23px;} \ No newline at end of file +@font-face {font-family: Circular;src: url(https://sp-bootstrap.global.ssl.fastly.net/8.0.0/fonts/circular-book.woff2);font-weight: 300;}@font-face {font-family: Circular;src: url(https://sp-bootstrap.global.ssl.fastly.net/8.0.0/fonts/circular-bold.woff2);font-weight: 500;}@font-face {font-family: Circular;src: url(https://sp-bootstrap.global.ssl.fastly.net/8.0.0/fonts/circular-black.woff2);font-weight: 700;}.md-display-1, .md-display-2, .md-display-3, .md-headline, .md-display-4 {font-weight: 500;font-family: Circular, Robot, Sans-Serif !important;}.md-display-4 {font-weight: 700 !important;}queue .tracks {padding: 18px 0px;}queue .tracks .track .index {margin-right: 16px;color: white;font-weight: 500;}queue .people {position: absolute;width: 100%;transform: translateY(-50%);z-index: 2;}queue .people .person {margin: 0px 3px;}albums .container, artists .container {perspective: 2000px;}album .container {position: relative;cursor: pointer;transition: ease-in-out transform 200ms;}album .container:focus {outline: 0;}album .container:hover {transform: translateZ(-20px) rotate3 d(1, 0, 0, 3deg);}album .md-fab {position: absolute;right: 0;top: 95px;background: rgba(255, 255, 255, 0.8) !important;transition: cubic-bezier(0.34, 0, 0.09, 1) transform 300ms !important;transform: scale(1);}album .md-fab:hover {background: rgba(255, 255, 255, 0.8);}album .md-fab.ng-hide {transform: scale(0);}album .md-fab md-icon {color: rgba(0, 0, 0, 0.6) !important;}artist .container {position: relative;cursor: pointer;width: 100px;margin: 0px 5px;transition: ease-in-out transform 200ms;}artist .container:focus {outline: 0;}artist .container:hover {transform: translateZ(-20px) rotate3d(1, 0, 0, 3deg);}artist .name {text-align: center;margin-bottom: 5px;line-height: 17px;}artist .followers {margin-top: 0px;text-align: center;}.md-avatar {border-radius: 50%;object-fit: cover;}.md-avatar.square {border-radius: 0px !important;}.md-avatar.small {width: 25px;height: 25px;}.md-avatar.large {width: 40px;height: 40px;}.md-avatar.x-large {width: 80px;height: 80px;}.md-avatar.ring {border: 5px solid #3a3a3a;}md-input-container.no-error .md-errors-spacer {display: none;}playbar md-card {margin: 0;height: 100px;transition: ease-in-out background 500ms;}playbar .cover {width: 100px;}playbar .controls {position: relative;}playbar .controls p, playbar .controls span, playbar .controls a {transition: ease-in-out color 500ms;}playbar .controls .left {margin-right: auto;}playbar .controls .left .title, playbar .controls .left .detail {margin: 0;}playbar .controls .center {position: absolute;left: 50%;transform: translateX(-50%);}playbar .controls .right {margin-left: auto;}seekbar {position: relative;}seekbar .buffer {position: absolute;height: 23px;background: rgba(255, 255, 255, 0.08);}seekbar .container {background: rgba(0, 0, 0, 0.5);}seekbar .container .time {color: rgba(255, 255, 255, 0.8);font-weight: 500;font-size: 9pt;padding: 0px 10px;position: relative;}seekbar .container body {background: #18d;margin: 0;}seekbar .container input[type=range] {z-index: 1;-webkit-appearance: none;width: 100%;margin: 0px 0;background: none;}seekbar .container input[type=range]:focus {outline: none;}seekbar .container input[type=range]::-webkit-slider-runnable-track {width: 100%;height: 23px;cursor: pointer;box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;background: transparent;border-radius: 0px;border: 0px solid #000000;}seekbar .container input[type=range]::-webkit-slider-thumb {box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;border: 0px solid #000000;height: 23px;width: 10px;border-radius: 0px;background: rgba(255, 255, 255, 0.8);cursor: pointer;-webkit-appearance: none;margin-top: 0px;}seekbar .container input[type=range]::-moz-range-track {width: 100%;height: 23px;cursor: pointer;box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;background: transparent;border-radius: 0px;border: 0px solid #000000;}seekbar .container input[type=range]::-moz-range-thumb {box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;border: 0px solid #000000;height: 23px;width: 10px;border-radius: 0px;background: rgba(255, 255, 255, 0.8);cursor: pointer;}seekbar .container input[type=range]::-ms-track {width: 100%;height: 23px;cursor: pointer;background: transparent;border-color: transparent;color: transparent;}seekbar .container input[type=range]::-ms-fill-lower, seekbar .container input[type=range]::-ms-fill-upper {background: transparent;border: 0px solid #000000;border-radius: 0px;box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;}seekbar .container input[type=range]::-ms-thumb {box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;border: 0px solid #000000;width: 10px;border-radius: 0px;background: rgba(255, 255, 255, 0.8);cursor: pointer;height: 23px;} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 5558580..b870b11 100644 --- a/public/index.html +++ b/public/index.html @@ -1,191 +1,328 @@ - - - - Jukebox Redux - - - - - - - - - - - - -
- - -
-

Jukebox

- -

Latency: {{Player.latency}}

- -
-
- - - - -
- - - search - - - - - queue_music - -
-
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + Jukebox Redux + + + + + + + + + + + + +
+ +
+

+ +

+ +
+
+ + + + +
+
+
+
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/res/img/empty/artist.svg b/public/res/img/empty/artist.svg index abd2f88..9e26526 100644 --- a/public/res/img/empty/artist.svg +++ b/public/res/img/empty/artist.svg @@ -1,16 +1,16 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/public/views/browse/browse.html b/public/views/browse/browse.html index ef5b90a..184038f 100644 --- a/public/views/browse/browse.html +++ b/public/views/browse/browse.html @@ -1 +1,92 @@ -

Browse

\ No newline at end of file + diff --git a/public/views/lyrics/lyrics.controller.js b/public/views/lyrics/lyrics.controller.js new file mode 100644 index 0000000..1b93abf --- /dev/null +++ b/public/views/lyrics/lyrics.controller.js @@ -0,0 +1,10 @@ +/* global angular */ +var app = angular.module('jukebox'); + +app.controller('LyricsCtrl', ['$scope', '$mdDialog', 'track', function($scope, $mdDialog, track) { + $scope.track = track; + + $scope.closeDialog = function() { + $mdDialog.hide(); + }; +}]); diff --git a/public/views/lyrics/lyrics.html b/public/views/lyrics/lyrics.html index 3bcf656..4896a8d 100644 --- a/public/views/lyrics/lyrics.html +++ b/public/views/lyrics/lyrics.html @@ -1,14 +1,18 @@ - -

Lyrics:

- -

{{track.lyrics}}

- - - -

- Sourced from - MetroLyrics -

-
-
\ No newline at end of file + +

Lyrics:

+ +

{{track.lyrics}}

+ + + +

+ Sourced from + MetroLyrics +

+
+ + + Close + + diff --git a/public/views/search/search.controller.js b/public/views/search/search.controller.js index 5a53eaa..83ce10d 100644 --- a/public/views/search/search.controller.js +++ b/public/views/search/search.controller.js @@ -1,16 +1,16 @@ /* global angular */ var app = angular.module('jukebox'); -app.controller('SearchCtrl', ['$scope', '$stateParams', '$http', function($scope, $stateParams, $http) { +app.controller('SearchCtrl', ['$scope', '$stateParams', '$http', '$mdDialog', function($scope, $stateParams, $http, $mdDialog) { $http({ - url: '/api/search', - method: 'GET', - params: { - q: $stateParams.q, - limit: 8 - } - }).then(function(response) { - $scope.results = response.data; - console.log(response.data); - }); -}]); \ No newline at end of file + url: '/api/search', + method: 'GET', + params: { + q: $stateParams.q, + limit: 19 + } + }).then(function(response) { + $scope.results = response.data; + console.log(response.data); + }); +}]); diff --git a/public/views/search/search.html b/public/views/search/search.html index 275caaa..e1cdebc 100644 --- a/public/views/search/search.html +++ b/public/views/search/search.html @@ -1,9 +1,27 @@

Artists

- +
+ +

Albums

- -
\ No newline at end of file +
+ + +
+
+ \ No newline at end of file diff --git a/server.js b/server.js index 3a67d7d..380d69d 100644 --- a/server.js +++ b/server.js @@ -1,37 +1,43 @@ -require('dotenv').config(); -var express = require('express'); -var app = express(); -var server = require('http').createServer(app); -var io = require('socket.io')(server); - -var env = process.env.NODE_ENV; -var cookieParser = require('cookie-parser'); -var bodyParser = require('body-parser'); -var methodOverride = require('method-override'); -var expressGeoIP = require('express-geoip'); - -global.Promise = require('bluebird'); - -require('dotenv').config() - -if (env === 'development') { - var morgan = require('morgan'); - app.use(morgan('dev')); -} - -app.use(cookieParser()); -app.use(bodyParser.json()); -app.use(bodyParser.json({ type: 'application/vnd.api+json' })); -app.use(bodyParser.urlencoded({ extended: true })); -app.use(methodOverride('X-HTTP-Method-Override')); -app.use(expressGeoIP('US').getCountryCodeMiddleware); - -app.use('/api', require('./app/routes')); -app.use('/', express.static('public')); - -require('./app/sockets')(io); - -var port = process.env.PORT || 8080; -server.listen(port, function () { - console.log('App listening on port '+port+'!'); -}); \ No newline at end of file +require('dotenv').config(); +const express = require('express'); +const app = express(); +const server = require('http').createServer(app); +const io = require('socket.io')(server); +const cookieParser = require('cookie-parser'); +const bodyParser = require('body-parser'); +const methodOverride = require('method-override'); +const expressGeoIP = require('express-geoip'); +const Promise = require('bluebird'); +const artistRoutes = require('./app/routes/artist.profile.routes.js'); + +const env = process.env.NODE_ENV; + +if (env === 'development') { + const morgan = require('morgan'); + app.use(morgan('dev')); +} + +app.use(cookieParser()); +app.use(bodyParser.json()); +app.use(bodyParser.json({ type: 'application/vnd.api+json' })); +app.use(bodyParser.urlencoded({ extended: true })); +app.use(methodOverride('X-HTTP-Method-Override')); +app.use(expressGeoIP('US').getCountryCodeMiddleware); +app.use('/artist', artistRoutes); + +app.use('/api', require('./app/routes')); +app.use('/', express.static('public')); + +require('./app/sockets')(io); + + +// Custom 404 Page +app.use((req, res, next) => { + res.status(404).sendFile(__dirname + '/public/404.html'); +}); + + +const port = process.env.PORT || 8080; +server.listen(port, () => { + console.log('App listening on port ' + port + '!'); +}); diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml new file mode 100644 index 0000000..1701f7b --- /dev/null +++ b/shrinkwrap.yaml @@ -0,0 +1,3661 @@ +dependencies: + bluebird: 3.7.2 + body-parser: 1.20.2 + cheerio: 1.0.0-rc.12 + combined-stream: 1.0.8 + cookie-parser: 1.4.6 + country-data: 0.0.31 + dotenv: 10.0.0 + express: 4.18.2 + express-geoip: 2.4.0 + googleapis: 16.1.0 + method-override: 2.3.10 + request: 2.88.2 + request-promise: 4.2.6 + socket.io: 2.5.0 + spotify-web-api-node: 2.5.0 + ytdl-core: 4.11.4 +devDependencies: + grunt: 1.6.1 + grunt-cli: 1.4.3 + grunt-contrib-sass: 1.0.0 + grunt-contrib-uglify: 3.4.0 + morgan: 1.10.0 + nodemon: 1.19.4 +packages: + /abbrev/1.1.1: + dev: true + resolution: + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + /accepts/1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + /after/0.8.2: + dev: false + resolution: + integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA== + /ajv/6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: false + resolution: + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + /ansi-align/2.0.0: + dependencies: + string-width: 2.1.1 + dev: true + resolution: + integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA== + /ansi-regex/2.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + /ansi-regex/3.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + /ansi-styles/2.2.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + /ansi-styles/3.2.1: + dependencies: + color-convert: 1.9.3 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + /ansi-styles/4.3.0: + dependencies: + color-convert: 2.0.1 + engines: + node: '>=8' + resolution: + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + /anymatch/2.0.0: + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + dev: true + resolution: + integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + /argparse/1.0.10: + dependencies: + sprintf-js: 1.0.3 + dev: true + resolution: + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + /arr-diff/4.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + /arr-flatten/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + /arr-union/3.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + /array-each/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA== + /array-flatten/1.1.1: + dev: false + resolution: + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + /array-slice/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + /array-unique/0.3.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + /arraybuffer.slice/0.0.7: + dev: false + resolution: + integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + /asn1/0.2.6: + dependencies: + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + /assert-plus/1.0.0: + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + /assign-symbols/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + /async-each/1.0.6: + dev: true + resolution: + integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== + /async/0.9.2: + dev: true + resolution: + integrity: sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw== + /async/1.5.2: + dev: false + resolution: + integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + /async/2.1.5: + dependencies: + lodash: 4.17.21 + dev: false + resolution: + integrity: sha512-+g/Ncjbx0JSq2Mk03WQkyKvNh5q9Qvyo/RIqIqnmC5feJY70PNl2ESwZU2BhAB+AZPkHNzzyC2Dq2AS5VnTKhQ== + /async/2.6.4: + dependencies: + lodash: 4.17.21 + dev: false + resolution: + integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + /async/3.2.4: + dev: true + resolution: + integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + /asynckit/0.4.0: + dev: false + resolution: + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + /atob/2.1.2: + dev: true + engines: + node: '>= 4.5.0' + hasBin: true + resolution: + integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + /aws-sign2/0.7.0: + dev: false + resolution: + integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + /aws4/1.12.0: + dev: false + resolution: + integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + /backo2/1.0.2: + dev: false + resolution: + integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== + /balanced-match/1.0.2: + resolution: + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + /base/0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + /base64-arraybuffer/0.1.4: + dev: false + engines: + node: '>= 0.6.0' + resolution: + integrity: sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg== + /base64id/2.0.0: + dev: false + engines: + node: ^4.5.0 || >= 5.9 + resolution: + integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + /basic-auth/2.0.1: + dependencies: + safe-buffer: 5.1.2 + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + /bcrypt-pbkdf/1.0.2: + dependencies: + tweetnacl: 0.14.5 + dev: false + resolution: + integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + /binary-extensions/1.13.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + /bindings/1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + dev: true + optional: true + resolution: + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + /blob/0.0.5: + dev: false + resolution: + integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + /bluebird/3.7.2: + dev: false + resolution: + integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + /body-parser/1.20.1: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + npm: 1.2.8000 || >= 1.4.16 + resolution: + integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + /body-parser/1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + npm: 1.2.8000 || >= 1.4.16 + resolution: + integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + /boolbase/1.0.0: + dev: false + resolution: + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + /boxen/1.3.0: + dependencies: + ansi-align: 2.0.0 + camelcase: 4.1.0 + chalk: 2.4.2 + cli-boxes: 1.0.0 + string-width: 2.1.1 + term-size: 1.2.0 + widest-line: 2.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + /brace-expansion/1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + resolution: + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /braces/2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + /braces/3.0.2: + dependencies: + fill-range: 7.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + /buffer-crc32/0.2.13: + dev: false + resolution: + integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + /buffer-equal-constant-time/1.0.1: + dev: false + resolution: + integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + /bytes/3.1.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + /cache-base/1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + /call-bind/1.0.2: + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + resolution: + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + /camelcase/4.1.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== + /capture-stack-trace/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w== + /caseless/0.12.0: + dev: false + resolution: + integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + /chalk/1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + /chalk/2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + /chalk/4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + engines: + node: '>=10' + resolution: + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + /cheerio-select/2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + dev: false + resolution: + integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + /cheerio/1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + /chokidar/2.1.8: + dependencies: + anymatch: 2.0.0 + async-each: 1.0.6 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + dev: true + optionalDependencies: + fsevents: 1.2.13 + resolution: + integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + /ci-info/1.6.0: + dev: true + resolution: + integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + /class-utils/0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + /cli-boxes/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg== + /collection-visit/1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + /color-convert/1.9.3: + dependencies: + color-name: 1.1.3 + dev: true + resolution: + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + /color-convert/2.0.1: + dependencies: + color-name: 1.1.4 + engines: + node: '>=7.0.0' + resolution: + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + /color-name/1.1.3: + dev: true + resolution: + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + /color-name/1.1.4: + resolution: + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + /colors/1.1.2: + dev: true + engines: + node: '>=0.1.90' + resolution: + integrity: sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w== + /combined-stream/1.0.8: + dependencies: + delayed-stream: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + /commander/2.19.0: + dev: true + resolution: + integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + /component-bind/1.0.0: + dev: false + resolution: + integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw== + /component-emitter/1.2.1: + dev: false + resolution: + integrity: sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA== + /component-emitter/1.3.0: + resolution: + integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + /component-inherit/0.0.3: + dev: false + resolution: + integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA== + /concat-map/0.0.1: + resolution: + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + /configstore/3.1.5: + dependencies: + dot-prop: 4.2.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + unique-string: 1.0.0 + write-file-atomic: 2.4.3 + xdg-basedir: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA== + /content-disposition/0.5.4: + dependencies: + safe-buffer: 5.2.1 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + /content-type/1.0.5: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + /cookie-parser/1.4.6: + dependencies: + cookie: 0.4.1 + cookie-signature: 1.0.6 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== + /cookie-signature/1.0.6: + dev: false + resolution: + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + /cookie/0.4.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + /cookie/0.4.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + /cookie/0.5.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + /cookiejar/2.1.4: + dev: false + resolution: + integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== + /copy-descriptor/0.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + /core-util-is/1.0.2: + dev: false + resolution: + integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + /core-util-is/1.0.3: + resolution: + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + /country-data/0.0.31: + dependencies: + currency-symbol-map: 2.2.0 + underscore: 1.13.6 + dev: false + resolution: + integrity: sha512-YqlY/i6ikZwoBFfdjK+hJTGaBdTgDpXLI15MCj2UsXZ2cPBb+Kx86AXmDH7PRGt0LUleck0cCgNdWeIhfbcxkQ== + /create-error-class/3.0.2: + dependencies: + capture-stack-trace: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw== + /cross-spawn/0.2.9: + dependencies: + lru-cache: 2.7.3 + dev: true + resolution: + integrity: sha512-jUNffe+x93R0/940d+JrdIl8SROZdUuvlw0HxjR/0GUKGvJEWiTK5rxtKNtP1lgMnoR8383q0orSA6k3eJ+y4A== + /cross-spawn/5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + resolution: + integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + /crypto-random-string/1.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== + /css-select/5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: false + resolution: + integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + /css-what/6.1.0: + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + /currency-symbol-map/2.2.0: + dev: false + resolution: + integrity: sha512-fPZJ3jqM68+AAgqQ7UaGbgHL/39rp6l7GyqS2k1HJPu/kpS8D07x/+Uup6a9tCUKIlOFcRrDCf1qxSt8jnI5BA== + /dargs/4.1.0: + dependencies: + number-is-nan: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-jyweV/k0rbv2WK4r9KLayuBrSh2Py0tNmV7LBoSMH4hMQyrG8OPyIOWB2VEx4DJKXWmK4lopYMVvORlDt2S8Aw== + /dashdash/1.14.1: + dependencies: + assert-plus: 1.0.0 + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + /dateformat/4.6.3: + dev: true + resolution: + integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + /debug/2.6.9: + dependencies: + ms: 2.0.0 + resolution: + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + /debug/3.1.0: + dependencies: + ms: 2.0.0 + dev: false + resolution: + integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + /debug/3.2.7: + dependencies: + ms: 2.1.3 + dev: true + resolution: + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + /debug/4.1.1: + dependencies: + ms: 2.1.3 + deprecated: 'Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)' + dev: false + resolution: + integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + /decode-uri-component/0.2.2: + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + /deep-extend/0.6.0: + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + /define-property/0.2.5: + dependencies: + is-descriptor: 0.1.6 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + /define-property/1.0.0: + dependencies: + is-descriptor: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + /define-property/2.0.2: + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + /delayed-stream/1.0.0: + dev: false + engines: + node: '>=0.4.0' + resolution: + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + /depd/2.0.0: + engines: + node: '>= 0.8' + resolution: + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + /destroy/1.2.0: + dev: false + engines: + node: '>= 0.8' + npm: 1.2.8000 || >= 1.4.16 + resolution: + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + /detect-file/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + /dom-serializer/2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + resolution: + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + /domelementtype/2.3.0: + dev: false + resolution: + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + /domhandler/5.0.3: + dependencies: + domelementtype: 2.3.0 + dev: false + engines: + node: '>= 4' + resolution: + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + /domutils/3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + resolution: + integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + /dot-prop/4.2.1: + dependencies: + is-obj: 1.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== + /dotenv/10.0.0: + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + /duplexer/0.1.2: + dev: true + resolution: + integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + /duplexer3/0.1.5: + dev: true + resolution: + integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + /ecc-jsbn/0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + /ecdsa-sig-formatter/1.0.11: + dependencies: + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + /ee-first/1.1.1: + resolution: + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + /encodeurl/1.0.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + /engine.io-client/3.5.3: + dependencies: + component-emitter: 1.3.0 + component-inherit: 0.0.3 + debug: 3.1.0 + engine.io-parser: 2.2.1 + has-cors: 1.1.0 + indexof: 0.0.1 + parseqs: 0.0.6 + parseuri: 0.0.6 + ws: 7.4.6 + xmlhttprequest-ssl: 1.6.3 + yeast: 0.1.2 + dev: false + resolution: + integrity: sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw== + /engine.io-parser/2.2.1: + dependencies: + after: 0.8.2 + arraybuffer.slice: 0.0.7 + base64-arraybuffer: 0.1.4 + blob: 0.0.5 + has-binary2: 1.0.3 + dev: false + resolution: + integrity: sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== + /engine.io/3.6.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + debug: 4.1.1 + engine.io-parser: 2.2.1 + ws: 7.4.6 + dev: false + engines: + node: '>=8.0.0' + resolution: + integrity: sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg== + /entities/4.5.0: + dev: false + engines: + node: '>=0.12' + resolution: + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + /escape-html/1.0.3: + dev: false + resolution: + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + /escape-string-regexp/1.0.5: + dev: true + engines: + node: '>=0.8.0' + resolution: + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + /esprima/4.0.1: + dev: true + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + /etag/1.8.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + /eventemitter2/0.4.14: + dev: true + resolution: + integrity: sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ== + /execa/0.7.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== + /exit/0.1.2: + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + /expand-brackets/2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + /expand-tilde/2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + /express-geoip/2.4.0: + dependencies: + geoip-lite: 1.4.7 + dev: false + resolution: + integrity: sha512-gXKJjBtXc3e3JfUK8vU+GSbVcASFLNxho0lp0kZlQph3Lz1O3HQfxsmXc1jkSqi+mkMlXfi0lMEF/+ZbQi+yrA== + /express/4.18.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: false + engines: + node: '>= 0.10.0' + resolution: + integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + /extend-shallow/2.0.1: + dependencies: + is-extendable: 0.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + /extend-shallow/3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + /extend/3.0.2: + resolution: + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + /extglob/2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + /extsprintf/1.3.0: + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + /extsprintf/1.4.1: + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + /fast-deep-equal/3.1.3: + dev: false + resolution: + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + /fast-json-stable-stringify/2.1.0: + dev: false + resolution: + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + /fd-slicer/1.1.0: + dependencies: + pend: 1.2.0 + dev: false + resolution: + integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + /figures/1.7.0: + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== + /file-uri-to-path/1.0.0: + dev: true + optional: true + resolution: + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + /fill-range/4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + /fill-range/7.0.1: + dependencies: + to-regex-range: 5.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + /finalhandler/1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + /findup-sync/4.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + /findup-sync/5.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + dev: true + engines: + node: '>= 10.13.0' + resolution: + integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ== + /fined/1.2.0: + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + dev: true + engines: + node: '>= 0.10' + resolution: + integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + /flagged-respawn/1.0.1: + dev: true + engines: + node: '>= 0.10' + resolution: + integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + /for-in/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + /for-own/1.0.0: + dependencies: + for-in: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg== + /forever-agent/0.6.1: + dev: false + resolution: + integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + /form-data/1.0.0-rc4: + dependencies: + async: 1.5.2 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-HSbGQ2uxT2+Mi1E0KP5lM5lv/r88xkGCpiLdq546q/3vXz94egfIIBpY45NTWMjMzb4nLopsfkG1A3suNa5qUg== + /form-data/2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + engines: + node: '>= 0.12' + resolution: + integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + /formidable/1.2.6: + deprecated: 'Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau' + dev: false + resolution: + integrity: sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== + /forwarded/0.2.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + /fragment-cache/0.2.1: + dependencies: + map-cache: 0.2.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + /fresh/0.5.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + /fs.realpath/1.0.0: + resolution: + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + /fsevents/1.2.13: + dependencies: + bindings: 1.5.0 + nan: 2.17.0 + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + dev: true + engines: + node: '>= 4.0' + optional: true + os: + - darwin + requiresBuild: true + resolution: + integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + /function-bind/1.1.1: + resolution: + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + /geoip-lite/1.4.7: + dependencies: + async: 2.6.4 + chalk: 4.1.2 + iconv-lite: 0.6.3 + ip-address: 5.9.4 + lazy: 1.0.11 + rimraf: 2.7.1 + yauzl: 2.10.0 + dev: false + engines: + node: '>=5.10.0' + resolution: + integrity: sha512-JQHntlH7B/nR6Ec8ZJTuKsSdRNrR+snrfBNy0y0wVYWyVVi/MoDlXyv7P3wmozdlyshta6rXfbtK7qu/9lvEog== + /get-intrinsic/1.2.1: + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + resolution: + integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + /get-stream/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + /get-value/2.0.6: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + /getobject/1.0.2: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg== + /getpass/0.1.7: + dependencies: + assert-plus: 1.0.0 + dev: false + resolution: + integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + /glob-parent/3.1.0: + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: true + resolution: + integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== + /glob/7.1.7: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + resolution: + integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + /glob/7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + resolution: + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + /global-dirs/0.1.1: + dependencies: + ini: 1.3.8 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + /global-modules/1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + /global-prefix/1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + /google-auth-library/0.10.0: + dependencies: + gtoken: 1.2.3 + jws: 3.2.2 + lodash.noop: 3.0.1 + request: 2.88.2 + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha512-KM54Y9GhdAzfXUHmWEoYmaOykSLuMG7W4HvVLYqyogxOyE6px8oSS8W13ngqW0oDGZ915GFW3V6OM6+qcdvPOA== + /google-p12-pem/0.1.2: + dependencies: + node-forge: 0.7.6 + dev: false + hasBin: true + resolution: + integrity: sha512-puhMlJ2+E/rgvxWaqgN/nC7x623OAE8MR9vBUqxF0inCE7HoVfCHvTeQ9+BR+rj9KM0fIg6XV6tmbt7XHHssoQ== + /googleapis/16.1.0: + dependencies: + async: 2.1.5 + google-auth-library: 0.10.0 + string-template: 1.0.0 + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha512-5czmF7xkIlJKc1+/+5tltrI1skoR3HKtkDOld9rk+DOucTpZRjOhCoJzoSjxB3M8rP2tEb1VIr1TPyzR3V2PUQ== + /got/6.7.1: + dependencies: + create-error-class: 3.0.2 + duplexer3: 0.1.5 + get-stream: 3.0.0 + is-redirect: 1.0.0 + is-retry-allowed: 1.2.0 + is-stream: 1.1.0 + lowercase-keys: 1.0.1 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + unzip-response: 2.0.1 + url-parse-lax: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg== + /graceful-fs/4.2.11: + dev: true + resolution: + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + /grunt-cli/1.4.3: + dependencies: + grunt-known-options: 2.0.0 + interpret: 1.1.0 + liftup: 3.0.1 + nopt: 4.0.3 + v8flags: 3.2.0 + dev: true + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ== + /grunt-contrib-sass/1.0.0: + dependencies: + async: 0.9.2 + chalk: 1.1.3 + cross-spawn: 0.2.9 + dargs: 4.1.0 + which: 1.3.1 + dev: true + engines: + node: '>=0.10.0' + peerDependencies: + grunt: '>=0.4.0' + resolution: + integrity: sha512-nYQW+vRDQi90//owyCi/9riDjx/lnNAKEhZu3i+i200jSk67U+RmdilGLWUJsYEwsohOCsvKOuFPtdOJGvEI4w== + /grunt-contrib-uglify/3.4.0: + dependencies: + chalk: 1.1.3 + maxmin: 2.1.0 + uglify-js: 3.4.10 + uri-path: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UXsTpeP0pytpTYlmll3RDndsRXfdwmrf1tI/AtD/PrArQAzGmKMvj83aVt3D8egWlE6KqPjsJBLCCvfC52LI/A== + /grunt-known-options/2.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA== + /grunt-legacy-log-utils/2.1.0: + dependencies: + chalk: 4.1.2 + lodash: 4.17.21 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw== + /grunt-legacy-log/3.0.0: + dependencies: + colors: 1.1.2 + grunt-legacy-log-utils: 2.1.0 + hooker: 0.2.3 + lodash: 4.17.21 + dev: true + engines: + node: '>= 0.10.0' + resolution: + integrity: sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA== + /grunt-legacy-util/2.0.1: + dependencies: + async: 3.2.4 + exit: 0.1.2 + getobject: 1.0.2 + hooker: 0.2.3 + lodash: 4.17.21 + underscore.string: 3.3.6 + which: 2.0.2 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w== + /grunt/1.6.1: + dependencies: + dateformat: 4.6.3 + eventemitter2: 0.4.14 + exit: 0.1.2 + findup-sync: 5.0.0 + glob: 7.1.7 + grunt-cli: 1.4.3 + grunt-known-options: 2.0.0 + grunt-legacy-log: 3.0.0 + grunt-legacy-util: 2.0.1 + iconv-lite: 0.6.3 + js-yaml: 3.14.1 + minimatch: 3.0.8 + nopt: 3.0.6 + dev: true + engines: + node: '>=16' + hasBin: true + resolution: + integrity: sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA== + /gtoken/1.2.3: + dependencies: + google-p12-pem: 0.1.2 + jws: 3.2.2 + mime: 1.6.0 + request: 2.88.2 + dev: false + resolution: + integrity: sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w== + /gzip-size/3.0.0: + dependencies: + duplexer: 0.1.2 + dev: true + engines: + node: '>=0.12.0' + resolution: + integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w== + /har-schema/2.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + /har-validator/5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + deprecated: this library is no longer supported + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + /has-ansi/2.0.0: + dependencies: + ansi-regex: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + /has-binary2/1.0.3: + dependencies: + isarray: 2.0.1 + dev: false + resolution: + integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + /has-cors/1.1.0: + dev: false + resolution: + integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA== + /has-flag/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + /has-flag/4.0.0: + engines: + node: '>=8' + resolution: + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + /has-proto/1.0.1: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + /has-symbols/1.0.3: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + /has-value/0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + /has-value/1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + /has-values/0.1.4: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + /has-values/1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + /has/1.0.3: + dependencies: + function-bind: 1.1.1 + engines: + node: '>= 0.4.0' + resolution: + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + /homedir-polyfill/1.0.3: + dependencies: + parse-passwd: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + /hooker/0.2.3: + dev: true + resolution: + integrity: sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA== + /htmlparser2/8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: false + resolution: + integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + /http-errors/2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + /http-signature/1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.17.0 + dev: false + engines: + node: '>=0.8' + npm: '>=1.3.7' + resolution: + integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + /iconv-lite/0.4.24: + dependencies: + safer-buffer: 2.1.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + /iconv-lite/0.6.3: + dependencies: + safer-buffer: 2.1.2 + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + /ignore-by-default/1.0.1: + dev: true + resolution: + integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + /import-lazy/2.1.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + /imurmurhash/0.1.4: + dev: true + engines: + node: '>=0.8.19' + resolution: + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + /indexof/0.0.1: + dev: false + resolution: + integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg== + /inflight/1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + resolution: + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + /inherits/2.0.4: + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /ini/1.3.8: + dev: true + resolution: + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + /interpret/1.1.0: + dev: true + resolution: + integrity: sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA== + /ip-address/5.9.4: + dependencies: + jsbn: 1.1.0 + lodash: 4.17.21 + sprintf-js: 1.1.2 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-dHkI3/YNJq4b/qQaz+c8LuarD3pY24JqZWfjB8aZx1gtpc2MDILu9L9jpZe1sHpzo/yWFweQVn+U//FhazUxmw== + /ipaddr.js/1.9.1: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + /is-absolute/1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + /is-accessor-descriptor/0.1.6: + dependencies: + kind-of: 3.2.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + /is-accessor-descriptor/1.0.0: + dependencies: + kind-of: 6.0.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + /is-binary-path/1.0.1: + dependencies: + binary-extensions: 1.13.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== + /is-buffer/1.1.6: + dev: true + resolution: + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + /is-ci/1.2.1: + dependencies: + ci-info: 1.6.0 + dev: true + hasBin: true + resolution: + integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + /is-core-module/2.12.1: + dependencies: + has: 1.0.3 + dev: true + resolution: + integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + /is-data-descriptor/0.1.4: + dependencies: + kind-of: 3.2.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + /is-data-descriptor/1.0.0: + dependencies: + kind-of: 6.0.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + /is-descriptor/0.1.6: + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + /is-descriptor/1.0.2: + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + /is-extendable/0.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + /is-extendable/1.0.1: + dependencies: + is-plain-object: 2.0.4 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + /is-extglob/2.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + /is-fullwidth-code-point/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + /is-glob/3.1.0: + dependencies: + is-extglob: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== + /is-glob/4.0.3: + dependencies: + is-extglob: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + /is-installed-globally/0.1.0: + dependencies: + global-dirs: 0.1.1 + is-path-inside: 1.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw== + /is-npm/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg== + /is-number/3.0.0: + dependencies: + kind-of: 3.2.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + /is-number/7.0.0: + dev: true + engines: + node: '>=0.12.0' + resolution: + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + /is-obj/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + /is-path-inside/1.0.1: + dependencies: + path-is-inside: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== + /is-plain-object/2.0.4: + dependencies: + isobject: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + /is-redirect/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== + /is-relative/1.0.0: + dependencies: + is-unc-path: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + /is-retry-allowed/1.2.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + /is-stream/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + /is-typedarray/1.0.0: + dev: false + resolution: + integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + /is-unc-path/1.0.0: + dependencies: + unc-path-regex: 0.1.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + /is-windows/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + /isarray/1.0.0: + resolution: + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + /isarray/2.0.1: + dev: false + resolution: + integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ== + /isexe/2.0.0: + dev: true + resolution: + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + /isobject/2.1.0: + dependencies: + isarray: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + /isobject/3.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + /isstream/0.1.2: + dev: false + resolution: + integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + /js-yaml/3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + hasBin: true + resolution: + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + /jsbn/0.1.1: + dev: false + resolution: + integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + /jsbn/1.1.0: + dev: false + resolution: + integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + /json-schema-traverse/0.4.1: + dev: false + resolution: + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /json-schema/0.4.0: + dev: false + resolution: + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + /json-stringify-safe/5.0.1: + dev: false + resolution: + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + /jsprim/1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: false + engines: + node: '>=0.6.0' + resolution: + integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + /jwa/1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + /jws/3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + /kind-of/3.2.2: + dependencies: + is-buffer: 1.1.6 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + /kind-of/4.0.0: + dependencies: + is-buffer: 1.1.6 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + /kind-of/5.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + /kind-of/6.0.3: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + /latest-version/3.1.0: + dependencies: + package-json: 4.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w== + /lazy/1.0.11: + dev: false + engines: + node: '>=0.2.0' + resolution: + integrity: sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA== + /liftup/3.0.1: + dependencies: + extend: 3.0.2 + findup-sync: 4.0.0 + fined: 1.2.0 + flagged-respawn: 1.0.1 + is-plain-object: 2.0.4 + object.map: 1.0.1 + rechoir: 0.7.1 + resolve: 1.22.2 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw== + /lodash.noop/3.0.1: + dev: false + resolution: + integrity: sha512-TmYdmu/pebrdTIBDK/FDx9Bmfzs9x0sZG6QIJuMDTqEPfeciLcN13ij+cOd0i9vwJfBtbG9UQ+C7MkXgYxrIJg== + /lodash/4.17.21: + resolution: + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + /lowercase-keys/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + /lru-cache/2.7.3: + dev: true + resolution: + integrity: sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ== + /lru-cache/4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + resolution: + integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + /m3u8stream/0.8.6: + dependencies: + miniget: 4.2.2 + sax: 1.2.4 + dev: false + engines: + node: '>=12' + resolution: + integrity: sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA== + /make-dir/1.3.0: + dependencies: + pify: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + /make-iterator/1.0.1: + dependencies: + kind-of: 6.0.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + /map-cache/0.2.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + /map-visit/1.0.0: + dependencies: + object-visit: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + /maxmin/2.1.0: + dependencies: + chalk: 1.1.3 + figures: 1.7.0 + gzip-size: 3.0.0 + pretty-bytes: 3.0.1 + dev: true + engines: + node: '>=0.12' + resolution: + integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw== + /media-typer/0.3.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + /merge-descriptors/1.0.1: + dev: false + resolution: + integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + /method-override/2.3.10: + dependencies: + debug: 2.6.9 + methods: 1.1.2 + parseurl: 1.3.3 + vary: 1.1.2 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-Ks2/7e+3JuwQcpLybc6wTHyqg13HDjOhLcE+YaAEub9DbSxF+ieMvxUlybmWW9luRMh9Cd0rO9aNtzUT51xfNQ== + /methods/1.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + /micromatch/3.1.10: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + /micromatch/4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + /mime-db/1.52.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + /mime-types/2.1.35: + dependencies: + mime-db: 1.52.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + /mime/1.6.0: + dev: false + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + /miniget/4.2.2: + dev: false + engines: + node: '>=12' + resolution: + integrity: sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA== + /minimatch/3.0.8: + dependencies: + brace-expansion: 1.1.11 + dev: true + resolution: + integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== + /minimatch/3.1.2: + dependencies: + brace-expansion: 1.1.11 + resolution: + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + /minimist/1.2.8: + dev: true + resolution: + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + /mixin-deep/1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + /morgan/1.10.0: + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + /ms/2.0.0: + resolution: + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + /ms/2.1.3: + resolution: + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + /nan/2.17.0: + dev: true + optional: true + resolution: + integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + /nanomatch/1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + /negotiator/0.6.3: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + /node-forge/0.7.6: + dev: false + resolution: + integrity: sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== + /nodemon/1.19.4: + dependencies: + chokidar: 2.1.8 + debug: 3.2.7 + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + update-notifier: 2.5.0 + dev: true + engines: + node: '>=4' + hasBin: true + requiresBuild: true + resolution: + integrity: sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ== + /nopt/1.0.10: + dependencies: + abbrev: 1.1.1 + dev: true + hasBin: true + resolution: + integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + /nopt/3.0.6: + dependencies: + abbrev: 1.1.1 + dev: true + hasBin: true + resolution: + integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + /nopt/4.0.3: + dependencies: + abbrev: 1.1.1 + osenv: 0.1.5 + dev: true + hasBin: true + resolution: + integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + /normalize-path/2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + /normalize-path/3.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + /npm-run-path/2.0.2: + dependencies: + path-key: 2.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + /nth-check/2.1.1: + dependencies: + boolbase: 1.0.0 + dev: false + resolution: + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + /number-is-nan/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + /oauth-sign/0.9.0: + dev: false + resolution: + integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + /object-assign/4.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + /object-copy/0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + /object-inspect/1.12.3: + dev: false + resolution: + integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + /object-visit/1.0.1: + dependencies: + isobject: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + /object.defaults/1.1.0: + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA== + /object.map/1.0.1: + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w== + /object.pick/1.3.0: + dependencies: + isobject: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + /on-finished/2.3.0: + dependencies: + ee-first: 1.1.1 + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + /on-finished/2.4.1: + dependencies: + ee-first: 1.1.1 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + /on-headers/1.0.2: + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + /once/1.4.0: + dependencies: + wrappy: 1.0.2 + resolution: + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + /os-homedir/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + /os-tmpdir/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + /osenv/0.1.5: + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: true + resolution: + integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + /p-finally/1.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + /package-json/4.0.1: + dependencies: + got: 6.7.1 + registry-auth-token: 3.4.0 + registry-url: 3.1.0 + semver: 5.7.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA== + /parse-filepath/1.0.2: + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + dev: true + engines: + node: '>=0.8' + resolution: + integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== + /parse-passwd/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + /parse5-htmlparser2-tree-adapter/7.0.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: false + resolution: + integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + /parse5/7.1.2: + dependencies: + entities: 4.5.0 + dev: false + resolution: + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + /parseqs/0.0.6: + dev: false + resolution: + integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + /parseuri/0.0.6: + dev: false + resolution: + integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + /parseurl/1.3.3: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + /pascalcase/0.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + /path-dirname/1.0.2: + dev: true + resolution: + integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== + /path-is-absolute/1.0.1: + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + /path-is-inside/1.0.2: + dev: true + resolution: + integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + /path-key/2.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + /path-parse/1.0.7: + dev: true + resolution: + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + /path-root-regex/0.1.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== + /path-root/0.1.1: + dependencies: + path-root-regex: 0.1.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== + /path-to-regexp/0.1.7: + dev: false + resolution: + integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + /pend/1.2.0: + dev: false + resolution: + integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + /performance-now/2.1.0: + dev: false + resolution: + integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + /picomatch/2.3.1: + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + /pify/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + /posix-character-classes/0.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + /prepend-http/1.0.4: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== + /pretty-bytes/3.0.1: + dependencies: + number-is-nan: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow== + /process-nextick-args/2.0.1: + resolution: + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + /proxy-addr/2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + /pseudomap/1.0.2: + dev: true + resolution: + integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + /psl/1.9.0: + dev: false + resolution: + integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + /pstree.remy/1.1.8: + dev: true + resolution: + integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + /punycode/2.3.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + /qs/6.11.0: + dependencies: + side-channel: 1.0.4 + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + /qs/6.11.2: + dependencies: + side-channel: 1.0.4 + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + /qs/6.5.3: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + /range-parser/1.2.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + /raw-body/2.5.1: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + /raw-body/2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + /rc/1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + hasBin: true + resolution: + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + /readable-stream/2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + resolution: + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + /readdirp/2.2.1: + dependencies: + graceful-fs: 4.2.11 + micromatch: 3.1.10 + readable-stream: 2.3.8 + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + /rechoir/0.7.1: + dependencies: + resolve: 1.22.2 + dev: true + engines: + node: '>= 0.10' + resolution: + integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + /regex-not/1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + /registry-auth-token/3.4.0: + dependencies: + rc: 1.2.8 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + /registry-url/3.1.0: + dependencies: + rc: 1.2.8 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== + /remove-trailing-separator/1.1.0: + dev: true + resolution: + integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + /repeat-element/1.1.4: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + /repeat-string/1.6.1: + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + /request-promise-core/1.1.4: + dependencies: + lodash: 4.17.21 + dev: false + engines: + node: '>=0.10.0' + peerDependencies: + request: ^2.34 + resolution: + integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + /request-promise/4.2.6: + dependencies: + bluebird: 3.7.2 + request-promise-core: 1.1.4 + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + deprecated: 'request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142' + dev: false + engines: + node: '>=0.10.0' + peerDependencies: + request: ^2.34 + resolution: + integrity: sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ== + /request/2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + deprecated: 'request has been deprecated, see https://github.com/request/request/issues/3142' + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + /resolve-dir/1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + /resolve-url/0.2.1: + deprecated: 'https://github.com/lydell/resolve-url#deprecated' + dev: true + resolution: + integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + /resolve/1.22.2: + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + hasBin: true + resolution: + integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + /ret/0.1.15: + dev: true + engines: + node: '>=0.12' + resolution: + integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + /rimraf/2.7.1: + dependencies: + glob: 7.2.3 + dev: false + hasBin: true + resolution: + integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + /safe-buffer/5.1.2: + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safe-buffer/5.2.1: + resolution: + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + /safe-regex/1.1.0: + dependencies: + ret: 0.1.15 + dev: true + resolution: + integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + /safer-buffer/2.1.2: + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /sax/1.2.4: + dev: false + resolution: + integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + /semver-diff/2.1.0: + dependencies: + semver: 5.7.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw== + /semver/5.7.1: + dev: true + hasBin: true + resolution: + integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + /send/0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + /serve-static/1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + /set-value/2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + /setprototypeof/1.2.0: + dev: false + resolution: + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + /shebang-command/1.2.0: + dependencies: + shebang-regex: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + /shebang-regex/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + /side-channel/1.0.4: + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + resolution: + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + /signal-exit/3.0.7: + dev: true + resolution: + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + /snapdragon-node/2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + /snapdragon-util/3.0.1: + dependencies: + kind-of: 3.2.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + /snapdragon/0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + /socket.io-adapter/1.1.2: + dev: false + resolution: + integrity: sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + /socket.io-client/2.5.0: + dependencies: + backo2: 1.0.2 + component-bind: 1.0.0 + component-emitter: 1.3.0 + debug: 3.1.0 + engine.io-client: 3.5.3 + has-binary2: 1.0.3 + indexof: 0.0.1 + parseqs: 0.0.6 + parseuri: 0.0.6 + socket.io-parser: 3.3.3 + to-array: 0.1.4 + dev: false + resolution: + integrity: sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw== + /socket.io-parser/3.3.3: + dependencies: + component-emitter: 1.3.0 + debug: 3.1.0 + isarray: 2.0.1 + dev: false + resolution: + integrity: sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg== + /socket.io-parser/3.4.3: + dependencies: + component-emitter: 1.2.1 + debug: 4.1.1 + isarray: 2.0.1 + dev: false + engines: + node: '>=10.0.0' + resolution: + integrity: sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ== + /socket.io/2.5.0: + dependencies: + debug: 4.1.1 + engine.io: 3.6.1 + has-binary2: 1.0.3 + socket.io-adapter: 1.1.2 + socket.io-client: 2.5.0 + socket.io-parser: 3.4.3 + dev: false + resolution: + integrity: sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w== + /source-map-resolve/0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + deprecated: 'See https://github.com/lydell/source-map-resolve#deprecated' + dev: true + resolution: + integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + /source-map-url/0.4.1: + deprecated: 'See https://github.com/lydell/source-map-url#deprecated' + dev: true + resolution: + integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + /source-map/0.5.7: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + /source-map/0.6.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + /split-string/3.1.0: + dependencies: + extend-shallow: 3.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + /spotify-web-api-node/2.5.0: + dependencies: + superagent: 2.3.0 + dev: false + resolution: + integrity: sha512-SoTYlIjFPE8zj/cH+eBDKfj7oKuM8tfxclGhN6tw8zGn4tNP2Ej1UutStdRFtMmYYBb7VccvD3gXJjabfcZhag== + /sprintf-js/1.0.3: + dev: true + resolution: + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + /sprintf-js/1.1.2: + resolution: + integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + /sshpk/1.17.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + engines: + node: '>=0.10.0' + hasBin: true + resolution: + integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + /static-extend/0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + /statuses/2.0.1: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + /stealthy-require/1.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== + /string-template/1.0.0: + dev: false + resolution: + integrity: sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg== + /string-width/2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + /string_decoder/1.1.1: + dependencies: + safe-buffer: 5.1.2 + resolution: + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /strip-ansi/3.0.1: + dependencies: + ansi-regex: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + /strip-ansi/4.0.0: + dependencies: + ansi-regex: 3.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + /strip-eof/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + /strip-json-comments/2.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + /superagent/2.3.0: + dependencies: + component-emitter: 1.3.0 + cookiejar: 2.1.4 + debug: 2.6.9 + extend: 3.0.2 + form-data: 1.0.0-rc4 + formidable: 1.2.6 + methods: 1.1.2 + mime: 1.6.0 + qs: 6.11.2 + readable-stream: 2.3.8 + deprecated: 'Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .' + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-N69X9pPoRaWV4cOOrARHE7khxLz1F53GvZmRHf+J6TlI+wWiJwi7BVYIdwmWQCeoXdsqHDzFXuGh23kWRx5V7g== + /supports-color/2.0.0: + dev: true + engines: + node: '>=0.8.0' + resolution: + integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + /supports-color/5.5.0: + dependencies: + has-flag: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + /supports-color/7.2.0: + dependencies: + has-flag: 4.0.0 + engines: + node: '>=8' + resolution: + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + /supports-preserve-symlinks-flag/1.0.0: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + /term-size/1.2.0: + dependencies: + execa: 0.7.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ== + /timed-out/4.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== + /to-array/0.1.4: + dev: false + resolution: + integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A== + /to-object-path/0.3.0: + dependencies: + kind-of: 3.2.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + /to-regex-range/2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + /to-regex-range/5.0.1: + dependencies: + is-number: 7.0.0 + dev: true + engines: + node: '>=8.0' + resolution: + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + /to-regex/3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + /toidentifier/1.0.1: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + /touch/3.1.0: + dependencies: + nopt: 1.0.10 + dev: true + hasBin: true + resolution: + integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + /tough-cookie/2.5.0: + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + /tunnel-agent/0.6.0: + dependencies: + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + /tweetnacl/0.14.5: + dev: false + resolution: + integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + /type-is/1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + /uglify-js/3.4.10: + dependencies: + commander: 2.19.0 + source-map: 0.6.1 + dev: true + engines: + node: '>=0.8.0' + hasBin: true + resolution: + integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + /unc-path-regex/0.1.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== + /undefsafe/2.0.5: + dev: true + resolution: + integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + /underscore.string/3.3.6: + dependencies: + sprintf-js: 1.1.2 + util-deprecate: 1.0.2 + dev: true + resolution: + integrity: sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ== + /underscore/1.13.6: + dev: false + resolution: + integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== + /union-value/1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + /unique-string/1.0.0: + dependencies: + crypto-random-string: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== + /unpipe/1.0.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + /unset-value/1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + /unzip-response/2.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw== + /upath/1.2.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + /update-notifier/2.5.0: + dependencies: + boxen: 1.3.0 + chalk: 2.4.2 + configstore: 3.1.5 + import-lazy: 2.1.0 + is-ci: 1.2.1 + is-installed-globally: 0.1.0 + is-npm: 1.0.0 + latest-version: 3.1.0 + semver-diff: 2.1.0 + xdg-basedir: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + /uri-js/4.4.1: + dependencies: + punycode: 2.3.0 + dev: false + resolution: + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + /uri-path/1.0.0: + dev: true + engines: + node: '>= 0.10' + resolution: + integrity: sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg== + /urix/0.1.0: + deprecated: 'Please see https://github.com/lydell/urix#deprecated' + dev: true + resolution: + integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + /url-parse-lax/1.0.0: + dependencies: + prepend-http: 1.0.4 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA== + /use/3.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + /util-deprecate/1.0.2: + resolution: + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + /utils-merge/1.0.1: + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + /uuid/3.4.0: + deprecated: 'Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.' + dev: false + hasBin: true + resolution: + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + /v8flags/3.2.0: + dependencies: + homedir-polyfill: 1.0.3 + dev: true + engines: + node: '>= 0.10' + resolution: + integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== + /vary/1.1.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + /verror/1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + /which/1.3.1: + dependencies: + isexe: 2.0.0 + dev: true + hasBin: true + resolution: + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + /which/2.0.2: + dependencies: + isexe: 2.0.0 + dev: true + engines: + node: '>= 8' + hasBin: true + resolution: + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + /widest-line/2.0.1: + dependencies: + string-width: 2.1.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + /wrappy/1.0.2: + resolution: + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + /write-file-atomic/2.4.3: + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + resolution: + integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + /ws/7.4.6: + dev: false + engines: + node: '>=8.3.0' + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + resolution: + integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + /xdg-basedir/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ== + /xmlhttprequest-ssl/1.6.3: + dev: false + engines: + node: '>=0.4.0' + resolution: + integrity: sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== + /yallist/2.1.2: + dev: true + resolution: + integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + /yauzl/2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false + resolution: + integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + /yeast/0.1.2: + dev: false + resolution: + integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg== + /ytdl-core/4.11.4: + dependencies: + m3u8stream: 0.8.6 + miniget: 4.2.2 + sax: 1.2.4 + dev: false + engines: + node: '>=12' + resolution: + integrity: sha512-tsVvqt++B5LSTMnCKQb4H/PFBewKj7gGPJ6KIM5gOFGMKNZj4qglGAl4QGFG8cNPP6wY54P80FDID5eN2di0GQ== +registry: 'https://registry.npmjs.org/' +shrinkwrapMinorVersion: 9 +shrinkwrapVersion: 3 +specifiers: + bluebird: ^3.5.0 + body-parser: ^1.16.1 + cheerio: ^1.0.0-rc.2 + combined-stream: ^1.0.5 + cookie-parser: ^1.4.3 + country-data: 0.0.31 + dotenv: ^10.0.0 + express: ^4.14.1 + express-geoip: ^2.2.0 + googleapis: ^16.1.0 + grunt: ^1.0.1 + grunt-cli: ^1.2.0 + grunt-contrib-sass: ^1.0.0 + grunt-contrib-uglify: ^3.0.1 + method-override: ^2.3.7 + morgan: ^1.8.0 + nodemon: ^1.11.0 + request: ^2.81.0 + request-promise: ^4.2.1 + socket.io: ^2.0.1 + spotify-web-api-node: ^2.3.6 + ytdl-core: ^4.9.1