├── .nvmrc ├── bookmarklet ├── bookmarklet_src.dev.js ├── bookmarklet_src.js ├── bookmarklet.dev.js └── bookmarklet.js ├── public ├── stylesheets │ └── style.css └── index.html ├── routes ├── index.mjs ├── api.mjs ├── obsidian.mjs └── download.mjs ├── package.json ├── .gitignore ├── app.mjs ├── bin └── www.mjs ├── app └── utils.mjs ├── README.md └── yarn.lock /.nvmrc: -------------------------------------------------------------------------------- 1 | 16.13 2 | -------------------------------------------------------------------------------- /bookmarklet/bookmarklet_src.dev.js: -------------------------------------------------------------------------------- 1 | document.location.href = 'http://localhost:3000/obsidian?u=' + encodeURIComponent(document.location) 2 | -------------------------------------------------------------------------------- /bookmarklet/bookmarklet_src.js: -------------------------------------------------------------------------------- 1 | document.location.href = 'https://downmark.herokuapp.com/obsidian?u=' + encodeURIComponent(document.location) 2 | -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /bookmarklet/bookmarklet.dev.js: -------------------------------------------------------------------------------- 1 | javascript:(function()%7Bdocument.location.href%3D%22http%3A%2F%2Flocalhost%3A3000%2Fobsidian%3Fu%3D%22%2BencodeURIComponent(document.location)%3B%7D)() -------------------------------------------------------------------------------- /bookmarklet/bookmarklet.js: -------------------------------------------------------------------------------- 1 | javascript:(function()%7Bdocument.location.href%3D%22https%3A%2F%2Fdownmark.herokuapp.com%2Fobsidian%3Fu%3D%22%2BencodeURIComponent(document.location)%3B%7D)() -------------------------------------------------------------------------------- /routes/index.mjs: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | var router = express.Router() 3 | 4 | /* GET home page. */ 5 | router.get('/', function(req, res, next) { 6 | res.render('index', { title: 'Express' }); 7 | }); 8 | 9 | export default router 10 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |https://github.com/pioneerskies/downmark
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /routes/api.mjs: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | let router = express.Router() 3 | 4 | import { 5 | getHTMLFromURL, 6 | parseHTML, 7 | convertToMarkdown 8 | } from '../app/utils.mjs' 9 | 10 | router.get('/', function(req, res, next) { 11 | (async (url) => { 12 | var htmlContent = '' 13 | 14 | try { 15 | htmlContent = await getHTMLFromURL(url) 16 | } catch (error) { 17 | console.error(error) 18 | res.status(422).end() 19 | return 20 | } 21 | 22 | let { title, content, excerpt, byline } = parseHTML(htmlContent, url) 23 | 24 | let markdown = convertToMarkdown(content) 25 | 26 | res.json({ title, content: markdown, excerpt, byline }); 27 | })(req.query.u); 28 | }); 29 | 30 | export default router 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "downmark", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www.mjs", 7 | "build:bookmarklet": "npx bookmarklet bookmarklet/bookmarklet_src.js bookmarklet/bookmarklet.js && npx bookmarklet bookmarklet/bookmarklet_src.dev.js bookmarklet/bookmarklet.dev.js" 8 | }, 9 | "dependencies": { 10 | "@mozilla/readability": "^0.4.2", 11 | "cookie-parser": "~1.4.4", 12 | "debug": "~2.6.9", 13 | "dompurify": "^2.3.5", 14 | "express": "~4.16.1", 15 | "jsdom": "^19.0.0", 16 | "morgan": "~1.9.1", 17 | "readability-from-string": "^2.0.0", 18 | "slugify": "^1.6.5", 19 | "turndown": "^7.1.1", 20 | "turndown-plugin-gfm": "^1.0.2" 21 | }, 22 | "devDependencies": { 23 | "bookmarklet": "^3.0.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /routes/obsidian.mjs: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | let router = express.Router() 3 | 4 | import { 5 | getHTMLFromURL, 6 | getFileName, 7 | parseHTML, 8 | convertToMarkdown, 9 | buildMarkdownWithFrontmatter, 10 | buildObsidianURL 11 | } from '../app/utils.mjs' 12 | 13 | router.get('/', function(req, res, next) { 14 | (async (url, download, tags = []) => { 15 | var htmlContent = '' 16 | 17 | try { 18 | htmlContent = await getHTMLFromURL(url) 19 | } catch (error) { 20 | console.error(error) 21 | res.status(422).end() 22 | return 23 | } 24 | 25 | let { title, content, byline } = parseHTML(htmlContent, url) 26 | 27 | const fileName = getFileName(title) 28 | 29 | let markdown = convertToMarkdown(content) 30 | 31 | const fileContent = buildMarkdownWithFrontmatter({markdown, tags, url, byline}) 32 | 33 | let redirectToURL = buildObsidianURL({ fileName, fileContent }) 34 | res.set('Location', redirectToURL) 35 | res.redirect(302, redirectToURL) 36 | })(req.query.u, req.query.tags); 37 | }); 38 | 39 | export default router 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /app.mjs: -------------------------------------------------------------------------------- 1 | import express, { json, urlencoded, static as _static } from 'express' 2 | import { join } from 'path' 3 | import cookieParser from 'cookie-parser' 4 | import logger from 'morgan' 5 | import { __dirname, __filename } from './app/utils.mjs' 6 | 7 | import indexRouter from './routes/index.mjs' 8 | import apiRouter from './routes/api.mjs' 9 | import obsidianRouter from './routes/obsidian.mjs' 10 | import downloadRouter from './routes/download.mjs' 11 | 12 | var app = express(); 13 | 14 | app.use(logger('dev')); 15 | app.use(json()); 16 | app.use(urlencoded({ extended: false })); 17 | app.use(cookieParser()); 18 | app.use(_static(join(__dirname, 'public'))); 19 | 20 | app.use(function (req, res, next) { 21 | res.header("Access-Control-Allow-Origin", "*"); 22 | next(); 23 | }); 24 | 25 | const timeout = 20 * 1000; 26 | app.use((req, res, next) => { 27 | // Set the timeout for all HTTP requests 28 | req.setTimeout(timeout, () => { 29 | let err = new Error('Request Timeout'); 30 | err.status = 408; 31 | next(err); 32 | }); 33 | // Set the server response timeout for all HTTP requests 34 | res.setTimeout(timeout, () => { 35 | let err = new Error('Service Unavailable'); 36 | err.status = 503; 37 | next(err); 38 | }); 39 | next(); 40 | }); 41 | 42 | app.use('/', indexRouter); 43 | app.use('/api/v1/', apiRouter); 44 | app.use('/obsidian/', obsidianRouter); 45 | app.use('/download/', downloadRouter); 46 | 47 | export default app; 48 | -------------------------------------------------------------------------------- /routes/download.mjs: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import path from 'path' 3 | import express from 'express' 4 | let router = express.Router() 5 | 6 | import { 7 | getHTMLFromURL, 8 | getFileName, 9 | parseHTML, 10 | convertToMarkdown, 11 | buildMarkdownWithFrontmatter, 12 | __filename 13 | } from '../app/utils.mjs' 14 | 15 | router.get('/', function(req, res, next) { 16 | if (req.query.download == 'local' && req.hostname != 'localhost') { 17 | let error = new Error('Local download supported only running the webservice locally.'); 18 | console.error(error) 19 | res.status(422).end() 20 | next(error) 21 | } 22 | 23 | (async (url, download, tags = []) => { 24 | var htmlContent = '' 25 | 26 | try { 27 | htmlContent = await getHTMLFromURL(url) 28 | } catch (error) { 29 | console.error(error) 30 | res.status(422).end() 31 | return 32 | } 33 | 34 | let { title, content, byline } = parseHTML(htmlContent, url) 35 | 36 | const fileName = getFileName(title) 37 | 38 | let markdown = convertToMarkdown(content) 39 | 40 | const fileContent = buildMarkdownWithFrontmatter({markdown, tags, url, byline}) 41 | debugger 42 | if (download == 'local') { 43 | fs.writeFileSync(path.join('.', 'Clippings', fileName), fileContent) 44 | console.log('File saved: ' + 'Clippings/' + fileName) 45 | res.status(201).end() 46 | } else { 47 | // Send file to the client as inline attachment 48 | } 49 | })(req.query.u, req.query.download, req.query.tags); 50 | }); 51 | 52 | export default router 53 | -------------------------------------------------------------------------------- /bin/www.mjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | import app from '../app.mjs' 8 | import debug from 'debug' 9 | import http from 'http' 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /app/utils.mjs: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { fileURLToPath } from 'url'; 3 | import http from 'http' 4 | import https from 'https' 5 | import { JSDOM } from 'jsdom' 6 | import { Readability } from '@mozilla/readability' 7 | import createDOMPurify from 'dompurify' 8 | let window = new JSDOM('').window; 9 | let DOMPurify = createDOMPurify(window); 10 | import slugify from 'slugify' 11 | import TurndownService from 'turndown' 12 | import turndownPluginGfm from 'turndown-plugin-gfm' 13 | import crypto from 'crypto' 14 | 15 | const defaultTags = ['clippings'] 16 | 17 | const getHTMLFromURL = (url) => { 18 | return new Promise((resolve, reject) => { 19 | 20 | let client = http; 21 | 22 | if (url.toString().indexOf("https") === 0) { 23 | client = https; 24 | } 25 | 26 | client.get(url, (resp) => { 27 | // if ([301, 302, 307, 308].includes(resp.statusCode)) { 28 | // console.log('redirected to ' + resp.headers.location) 29 | // return getHTMLFromURL(resp.headers.location) 30 | // } 31 | let data = ''; 32 | 33 | // A chunk of data has been recieved. 34 | resp.on('data', (chunk) => { 35 | data += chunk; 36 | }); 37 | 38 | // The whole response has been received. Print out the result. 39 | resp.on('end', () => { 40 | resolve(data); 41 | }); 42 | 43 | }).on("error", (err) => { 44 | reject(err); 45 | }); 46 | }); 47 | }; 48 | 49 | const getFileName = (fileName) => { 50 | return slugify(fileName.slice(0, 100) + '.md', { remove: /[*+~.()'"!:@\/\\]/g }) 51 | } 52 | 53 | const convertDate = (date) => { 54 | var yyyy = date.getFullYear().toString(); 55 | var mm = (date.getMonth() + 1).toString(); 56 | var dd = date.getDate().toString(); 57 | var mmChars = mm.split(''); 58 | var ddChars = dd.split(''); 59 | return yyyy + '-' + (mmChars[1] ? mm : "0" + mmChars[0]) + '-' + (ddChars[1] ? dd : "0" + ddChars[0]); 60 | } 61 | 62 | const parseHTML = (htmlContent, url) => { 63 | let doc = new JSDOM(htmlContent, { url }) 64 | let reader = new Readability(doc.window.document, { 65 | keepClasses: true 66 | }) 67 | let result = reader.parse() 68 | 69 | let title = result?.title || 'no title ' + crypto.randomBytes(8).toString('hex') 70 | let content = result?.content || result?.excerpt || 'Cannot parse content...' 71 | let byline = result?.byline || '' 72 | 73 | const sanitizedContent = DOMPurify.sanitize(content, { USE_PROFILES: { html: true } }) 74 | 75 | return { title, content: sanitizedContent, byline, excerpt: result.excerpt } 76 | } 77 | 78 | const convertToMarkdown = (content) => { 79 | const turndownService = new TurndownService({ 80 | preformattedCode: true, 81 | codeBlockStyle: 'fenced', 82 | bulletListMarker: '-' 83 | }).use(turndownPluginGfm.gfm) 84 | 85 | return turndownService.turndown(content) 86 | } 87 | 88 | const buildMarkdownWithFrontmatter = ({markdown, tags, url, byline}) => { 89 | const markdownWithFrontmatter = "---\n" 90 | + "date: " + convertDate(new Date()) + "\n" 91 | + "tags: [" + [...defaultTags, ...tags].join(' ') + "]\n" 92 | + "source: " + url + "\n" 93 | + "author: " + byline + "\n" 94 | + "---\n\n" 95 | + markdown 96 | 97 | return markdownWithFrontmatter 98 | } 99 | 100 | const buildObsidianURL = ({vault = null, folder = 'Clippings/', fileName, fileContent}) => { 101 | let vaultName 102 | 103 | if (vault) { 104 | vaultName = '&vault=' + encodeURIComponent(`${vault}`) 105 | } else { 106 | vaultName = '' 107 | } 108 | 109 | return "obsidian://new?" 110 | + "name=" + encodeURIComponent(folder + fileName) 111 | + "&content=" + encodeURIComponent(fileContent) 112 | + vaultName 113 | } 114 | 115 | 116 | const __filename = fileURLToPath(import.meta.url); 117 | const __dirname = path.dirname(__filename); 118 | 119 | export { 120 | getHTMLFromURL, 121 | getFileName, 122 | convertDate, 123 | __filename, 124 | __dirname, 125 | parseHTML, 126 | convertToMarkdown, 127 | buildMarkdownWithFrontmatter, 128 | buildObsidianURL 129 | }; 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⬇️✅ downMARK 2 | 3 | A webservice to translate a webpage into Markdown. 4 | 5 | ## Disclaimer 6 | 7 | This is a POC. 8 | 9 | - [x] Copypasted code from the web 10 | - [x] Ignored a lot of security concerns 11 | - [x] Zero automatic tests 12 | - [x] Poor documentation 13 | - [x] Born unmaintained 14 | - [x] From 0 to web in 3 hours of a lazy weekend 15 | - [x] https://downmark.herokuapp.com is not assured to be online 16 | 17 | Using my experimental webservice while it's publicly available is [unsecure and done at your own risk](#isitsecure) 18 | 19 | If you're ok and conscious about these facts, let's read an insufficient 20 | documentation. 21 | 22 | ## Running the webservice 23 | 24 | This is a little web service written in node which runs over expressjs. You can deploy it wherever you want. Deploying on Heroku free tier is as easy as 25 | 26 | ``` 27 | git clone https://github.com/pioneerskies/downmark.git 28 | cd downmark 29 | heroku create 30 | git push heroku main 31 | ``` 32 | 33 | > NOTE: need to have [heroku cli](https://devcenter.heroku.com/articles/getting-started-with-nodejs#set-up) installed 34 | 35 | It will work also by running it locally on your machine at `https://localhost:3000` 36 | 37 | ``` 38 | git clone https://github.com/pioneerskies/downmark.git 39 | cd downmark 40 | yarn install 41 | yarn start 42 | ``` 43 | 44 | > NOTE: you need node and yarn (no engines restriction yet. YOLO) 45 | 46 | ## Using the webservice - JSON 47 | 48 | Given the webservice running at some URL, do a GET request to `URL/api/v1` passing a URL in query string's `u` parameter, e.g.: 49 | 50 | https://downmark.herokuapp.com/api/v1?u=https://example.com 51 | 52 | In the JSON response you'll get 53 | 54 | - `title`: the page title 55 | - `content`: the main content of the webpage in markdown format 56 | - `excerpt`: an excerpt of the content in plain text 57 | - `byline`: maybe the author (if heuristically found in page) 58 | 59 | ```json 60 | 61 | { 62 | 63 | "title": "Example Domain", 64 | "content": "This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.\n\n[More information...](https://www.iana.org/domains/example)", 65 | "excerpt": "This domain is for use in illustrative examples in documents. You may use this\n domain in literature without prior coordination or asking for permission.", 66 | "byline": null 67 | 68 | } 69 | ``` 70 | 71 | > NOTE: "main content" I mean the content as parsed by https://github.com/mozilla/readability 72 | 73 | ## Using the webservice - Obsidian 74 | 75 | Directly save the resulting document into Obsidian. File will be saved in default vault under `Clippings/` folder. 76 | 77 | Endpoint: 78 | 79 | https://downmark.herokuapp.com/obsidian 80 | 81 | Params: 82 | 83 | - `u`: _String_ (possibly encoded) URL to download 84 | - `tags`: \[optional\] _Array(String)_ One or more tags. They will appended to the default `clippings` tag. 85 | 86 | Example: 87 | 88 | `https://downmark.herokuapp.com/?u=https%3A%2F%2Fwww.ilpost.it%2F2022%2F02%2F23%2Feuropa-debolezza-ucraina%2F&tags[]=foo&tags[]=bar` 89 | 90 | ### Bookmarklet 91 | 92 | Make a bookmarklet into your browser with the following code: https://raw.githubusercontent.com/pioneerskies/downmark/main/bookmarklet/bookmarklet.js 93 | 94 | > NOTE: knowing how to create a bookmarklet is up to you and and your [search engine](https://duckduckgo.com/?q=how+to+create+a+bookmarklet&ia=web) 95 | 96 | > NOTE: If you're running the webservice locally you can copy the development bookmarklet: https://raw.githubusercontent.com/pioneerskies/downmark/main/bookmarklet/bookmarklet.dev.js 97 | 98 | Currently features are very limited: 99 | 100 | - the clipping will be created under the `Clippings/` folder. Customization not implemented 101 | - vault customization is not implemented 102 | - the clipping will be created using Frontmatter for metadata 103 | 104 | All these limitations would be easy to remove, but do remind the discaimer: this is a POC and a private experiment. 105 | 106 | ## Using the webservice - Download 107 | 108 | ### Save on server 109 | 110 | TODO 111 | 112 | ### Download from browser 113 | 114 | TODO 115 | 116 | ## Backstory and credits 117 | 118 | All the credits you could imagine goes to **@kepano** who wrote [this really smart version](https://gist.github.com/kepano/90c05f162c37cf730abb8ff027987ca3) of the bookmarklet and to **@Moonbase59** for his frontmatter version. 119 | 120 | I, as a user of that bookmarklet, experimented with this toy trying to overcome to its main (and for me the only) limitation: it doesn't work on sites with `connect-src` SCP restriction implemented. GitHub is just one example. 121 | 122 | > NOTE: kudos to all the websites implementing such strict SCP; they're doing such for our security. 123 | 124 | This version of the bookmarklet delegates all the work to the webservice, working around SCP restrictions (hopefully). 125 | 126 | ## Customising the bookmarklet to connect to your webservice's instance 127 | 128 | - clone the repo 129 | - yarn install 130 | - edit `bookmarklet/bookmarklet_src.js` updating the domain from `downmark.herokuapp.com` to your 131 | - `yarn build:bookmarklet` 132 | - copy the resulting code from `bookmarklet/bookmarklet.js` 133 | 134 | > NOTE: you can to this also if you're running the webservice locally 135 | 136 | ## NAQ - Never Asked Questions 137 | 138 | **Q**: Does it work on iOS Safari? 139 | 140 | A: Yep, it does 141 | 142 | **Q**: Does it work on the X browser? 143 | 144 | A: It works on FireFox for macOS and for Safari for iOS. Other combination not tested. Let's try! 145 | 146 | 147 | **Q**: **Is it secure for me to test this soltion using `https://downmark.herokuapp.com` webservice?** 148 | 149 | A: I opensourced this repo (winning against shame) in order to make you able to read what the code does, but I cannot and do not want to demostrate the code party between the repo and the deployed webservice. You have to take my word for it and I don't mind if you can't. From the intrinsic code perspective this code should be at least as secure as the original bookmarklet, but the code on `https://downmark.herokuapp.com` is running away from you and I could be able to inject malicious code into the resulting markdown or redirect you to unwanted URLs and even register the sites you're clipping. I'm not doing any of these things, but you should not care a lot about what I'm saying I'm doing or not :) Just read the code, fork it, get the good ideas, share them and give me a feedback if you mind to. No more nor less. 150 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@mozilla/readability@^0.4.2": 6 | version "0.4.2" 7 | resolved "https://registry.yarnpkg.com/@mozilla/readability/-/readability-0.4.2.tgz#a425f3dccdbe777d45a4e791bd703ebe633ebb87" 8 | integrity sha512-48MJXzi4Dhy2fJ3lGjmwdEJKoMmn3oiYew9n/1OW6cZy78hAzRIyDJDBCGrg4PBFDyY4xos+H4LCFn5QVRDcfw== 9 | 10 | "@tootallnate/once@2": 11 | version "2.0.0" 12 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" 13 | integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== 14 | 15 | abab@^2.0.3, abab@^2.0.5: 16 | version "2.0.5" 17 | resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" 18 | integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== 19 | 20 | accepts@~1.3.5: 21 | version "1.3.8" 22 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 23 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 24 | dependencies: 25 | mime-types "~2.1.34" 26 | negotiator "0.6.3" 27 | 28 | acorn-globals@^6.0.0: 29 | version "6.0.0" 30 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" 31 | integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== 32 | dependencies: 33 | acorn "^7.1.1" 34 | acorn-walk "^7.1.1" 35 | 36 | acorn-walk@^7.1.1: 37 | version "7.2.0" 38 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" 39 | integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== 40 | 41 | acorn@^7.1.1: 42 | version "7.4.1" 43 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 44 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 45 | 46 | acorn@^8.5.0: 47 | version "8.7.0" 48 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" 49 | integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== 50 | 51 | agent-base@6: 52 | version "6.0.2" 53 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 54 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 55 | dependencies: 56 | debug "4" 57 | 58 | array-flatten@1.1.1: 59 | version "1.1.1" 60 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 61 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 62 | 63 | asynckit@^0.4.0: 64 | version "0.4.0" 65 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 66 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 67 | 68 | basic-auth@~2.0.0: 69 | version "2.0.1" 70 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 71 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 72 | dependencies: 73 | safe-buffer "5.1.2" 74 | 75 | body-parser@1.18.3: 76 | version "1.18.3" 77 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 78 | integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= 79 | dependencies: 80 | bytes "3.0.0" 81 | content-type "~1.0.4" 82 | debug "2.6.9" 83 | depd "~1.1.2" 84 | http-errors "~1.6.3" 85 | iconv-lite "0.4.23" 86 | on-finished "~2.3.0" 87 | qs "6.5.2" 88 | raw-body "2.3.3" 89 | type-is "~1.6.16" 90 | 91 | bookmarklet@^3.0.0: 92 | version "3.0.0" 93 | resolved "https://registry.yarnpkg.com/bookmarklet/-/bookmarklet-3.0.0.tgz#5a8a1c7ff0ee3786dd67ea0e35fc0157cc70e36e" 94 | integrity sha512-xrE+D7Au9OMTjaA+wUSSFwRRwG48051UsHHOP7ugajVkNjvfsPFe+o/LV/QkTcP7GLb9ivd3gwc7KzaOfrae7w== 95 | dependencies: 96 | md5 "^2.2.1" 97 | terser "^5.6.1" 98 | 99 | browser-process-hrtime@^1.0.0: 100 | version "1.0.0" 101 | resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" 102 | integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== 103 | 104 | buffer-from@^1.0.0: 105 | version "1.1.2" 106 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 107 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 108 | 109 | bytes@3.0.0: 110 | version "3.0.0" 111 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 112 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 113 | 114 | charenc@0.0.2: 115 | version "0.0.2" 116 | resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" 117 | integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= 118 | 119 | combined-stream@^1.0.8: 120 | version "1.0.8" 121 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 122 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 123 | dependencies: 124 | delayed-stream "~1.0.0" 125 | 126 | commander@^2.20.0: 127 | version "2.20.3" 128 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 129 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 130 | 131 | content-disposition@0.5.2: 132 | version "0.5.2" 133 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 134 | integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= 135 | 136 | content-type@~1.0.4: 137 | version "1.0.4" 138 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 139 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 140 | 141 | cookie-parser@~1.4.4: 142 | version "1.4.6" 143 | resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" 144 | integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== 145 | dependencies: 146 | cookie "0.4.1" 147 | cookie-signature "1.0.6" 148 | 149 | cookie-signature@1.0.6: 150 | version "1.0.6" 151 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 152 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 153 | 154 | cookie@0.3.1: 155 | version "0.3.1" 156 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 157 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 158 | 159 | cookie@0.4.1: 160 | version "0.4.1" 161 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" 162 | integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== 163 | 164 | crypt@0.0.2: 165 | version "0.0.2" 166 | resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" 167 | integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= 168 | 169 | cssom@^0.5.0: 170 | version "0.5.0" 171 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" 172 | integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== 173 | 174 | cssom@~0.3.6: 175 | version "0.3.8" 176 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" 177 | integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== 178 | 179 | cssstyle@^2.3.0: 180 | version "2.3.0" 181 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" 182 | integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== 183 | dependencies: 184 | cssom "~0.3.6" 185 | 186 | data-urls@^3.0.1: 187 | version "3.0.1" 188 | resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.1.tgz#597fc2ae30f8bc4dbcf731fcd1b1954353afc6f8" 189 | integrity sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw== 190 | dependencies: 191 | abab "^2.0.3" 192 | whatwg-mimetype "^3.0.0" 193 | whatwg-url "^10.0.0" 194 | 195 | debug@2.6.9, debug@~2.6.9: 196 | version "2.6.9" 197 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 198 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 199 | dependencies: 200 | ms "2.0.0" 201 | 202 | debug@4: 203 | version "4.3.3" 204 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 205 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 206 | dependencies: 207 | ms "2.1.2" 208 | 209 | decimal.js@^10.3.1: 210 | version "10.3.1" 211 | resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" 212 | integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== 213 | 214 | deep-is@~0.1.3: 215 | version "0.1.4" 216 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 217 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 218 | 219 | delayed-stream@~1.0.0: 220 | version "1.0.0" 221 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 222 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 223 | 224 | depd@~1.1.2: 225 | version "1.1.2" 226 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 227 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 228 | 229 | destroy@~1.0.4: 230 | version "1.0.4" 231 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 232 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 233 | 234 | domexception@^4.0.0: 235 | version "4.0.0" 236 | resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" 237 | integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== 238 | dependencies: 239 | webidl-conversions "^7.0.0" 240 | 241 | domino@^2.1.6: 242 | version "2.1.6" 243 | resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" 244 | integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== 245 | 246 | dompurify@^2.3.5: 247 | version "2.3.5" 248 | resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.5.tgz#c83ed5a3ae5ce23e52efe654ea052ffb358dd7e3" 249 | integrity sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ== 250 | 251 | ee-first@1.1.1: 252 | version "1.1.1" 253 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 254 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 255 | 256 | encodeurl@~1.0.2: 257 | version "1.0.2" 258 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 259 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 260 | 261 | escape-html@~1.0.3: 262 | version "1.0.3" 263 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 264 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 265 | 266 | escodegen@^2.0.0: 267 | version "2.0.0" 268 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" 269 | integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== 270 | dependencies: 271 | esprima "^4.0.1" 272 | estraverse "^5.2.0" 273 | esutils "^2.0.2" 274 | optionator "^0.8.1" 275 | optionalDependencies: 276 | source-map "~0.6.1" 277 | 278 | esprima@^4.0.1: 279 | version "4.0.1" 280 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 281 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 282 | 283 | estraverse@^5.2.0: 284 | version "5.3.0" 285 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 286 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 287 | 288 | esutils@^2.0.2: 289 | version "2.0.3" 290 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 291 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 292 | 293 | etag@~1.8.1: 294 | version "1.8.1" 295 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 296 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 297 | 298 | express@~4.16.1: 299 | version "4.16.4" 300 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" 301 | integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== 302 | dependencies: 303 | accepts "~1.3.5" 304 | array-flatten "1.1.1" 305 | body-parser "1.18.3" 306 | content-disposition "0.5.2" 307 | content-type "~1.0.4" 308 | cookie "0.3.1" 309 | cookie-signature "1.0.6" 310 | debug "2.6.9" 311 | depd "~1.1.2" 312 | encodeurl "~1.0.2" 313 | escape-html "~1.0.3" 314 | etag "~1.8.1" 315 | finalhandler "1.1.1" 316 | fresh "0.5.2" 317 | merge-descriptors "1.0.1" 318 | methods "~1.1.2" 319 | on-finished "~2.3.0" 320 | parseurl "~1.3.2" 321 | path-to-regexp "0.1.7" 322 | proxy-addr "~2.0.4" 323 | qs "6.5.2" 324 | range-parser "~1.2.0" 325 | safe-buffer "5.1.2" 326 | send "0.16.2" 327 | serve-static "1.13.2" 328 | setprototypeof "1.1.0" 329 | statuses "~1.4.0" 330 | type-is "~1.6.16" 331 | utils-merge "1.0.1" 332 | vary "~1.1.2" 333 | 334 | fast-levenshtein@~2.0.6: 335 | version "2.0.6" 336 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 337 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 338 | 339 | finalhandler@1.1.1: 340 | version "1.1.1" 341 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 342 | integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== 343 | dependencies: 344 | debug "2.6.9" 345 | encodeurl "~1.0.2" 346 | escape-html "~1.0.3" 347 | on-finished "~2.3.0" 348 | parseurl "~1.3.2" 349 | statuses "~1.4.0" 350 | unpipe "~1.0.0" 351 | 352 | form-data@^4.0.0: 353 | version "4.0.0" 354 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 355 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 356 | dependencies: 357 | asynckit "^0.4.0" 358 | combined-stream "^1.0.8" 359 | mime-types "^2.1.12" 360 | 361 | forwarded@0.2.0: 362 | version "0.2.0" 363 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 364 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 365 | 366 | fresh@0.5.2: 367 | version "0.5.2" 368 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 369 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 370 | 371 | html-encoding-sniffer@^3.0.0: 372 | version "3.0.0" 373 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" 374 | integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== 375 | dependencies: 376 | whatwg-encoding "^2.0.0" 377 | 378 | http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: 379 | version "1.6.3" 380 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 381 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 382 | dependencies: 383 | depd "~1.1.2" 384 | inherits "2.0.3" 385 | setprototypeof "1.1.0" 386 | statuses ">= 1.4.0 < 2" 387 | 388 | http-proxy-agent@^5.0.0: 389 | version "5.0.0" 390 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" 391 | integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== 392 | dependencies: 393 | "@tootallnate/once" "2" 394 | agent-base "6" 395 | debug "4" 396 | 397 | https-proxy-agent@^5.0.0: 398 | version "5.0.0" 399 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 400 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 401 | dependencies: 402 | agent-base "6" 403 | debug "4" 404 | 405 | iconv-lite@0.4.23: 406 | version "0.4.23" 407 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 408 | integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== 409 | dependencies: 410 | safer-buffer ">= 2.1.2 < 3" 411 | 412 | iconv-lite@0.6.3: 413 | version "0.6.3" 414 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 415 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 416 | dependencies: 417 | safer-buffer ">= 2.1.2 < 3.0.0" 418 | 419 | inherits@2.0.3: 420 | version "2.0.3" 421 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 422 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 423 | 424 | ipaddr.js@1.9.1: 425 | version "1.9.1" 426 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 427 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 428 | 429 | is-buffer@~1.1.6: 430 | version "1.1.6" 431 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 432 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 433 | 434 | is-potential-custom-element-name@^1.0.1: 435 | version "1.0.1" 436 | resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" 437 | integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== 438 | 439 | jsdom@^19.0.0: 440 | version "19.0.0" 441 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" 442 | integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== 443 | dependencies: 444 | abab "^2.0.5" 445 | acorn "^8.5.0" 446 | acorn-globals "^6.0.0" 447 | cssom "^0.5.0" 448 | cssstyle "^2.3.0" 449 | data-urls "^3.0.1" 450 | decimal.js "^10.3.1" 451 | domexception "^4.0.0" 452 | escodegen "^2.0.0" 453 | form-data "^4.0.0" 454 | html-encoding-sniffer "^3.0.0" 455 | http-proxy-agent "^5.0.0" 456 | https-proxy-agent "^5.0.0" 457 | is-potential-custom-element-name "^1.0.1" 458 | nwsapi "^2.2.0" 459 | parse5 "6.0.1" 460 | saxes "^5.0.1" 461 | symbol-tree "^3.2.4" 462 | tough-cookie "^4.0.0" 463 | w3c-hr-time "^1.0.2" 464 | w3c-xmlserializer "^3.0.0" 465 | webidl-conversions "^7.0.0" 466 | whatwg-encoding "^2.0.0" 467 | whatwg-mimetype "^3.0.0" 468 | whatwg-url "^10.0.0" 469 | ws "^8.2.3" 470 | xml-name-validator "^4.0.0" 471 | 472 | levn@~0.3.0: 473 | version "0.3.0" 474 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 475 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 476 | dependencies: 477 | prelude-ls "~1.1.2" 478 | type-check "~0.3.2" 479 | 480 | md5@^2.2.1: 481 | version "2.3.0" 482 | resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" 483 | integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== 484 | dependencies: 485 | charenc "0.0.2" 486 | crypt "0.0.2" 487 | is-buffer "~1.1.6" 488 | 489 | media-typer@0.3.0: 490 | version "0.3.0" 491 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 492 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 493 | 494 | merge-descriptors@1.0.1: 495 | version "1.0.1" 496 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 497 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 498 | 499 | methods@~1.1.2: 500 | version "1.1.2" 501 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 502 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 503 | 504 | mime-db@1.51.0: 505 | version "1.51.0" 506 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" 507 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== 508 | 509 | mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: 510 | version "2.1.34" 511 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" 512 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== 513 | dependencies: 514 | mime-db "1.51.0" 515 | 516 | mime@1.4.1: 517 | version "1.4.1" 518 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 519 | integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== 520 | 521 | morgan@~1.9.1: 522 | version "1.9.1" 523 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" 524 | integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== 525 | dependencies: 526 | basic-auth "~2.0.0" 527 | debug "2.6.9" 528 | depd "~1.1.2" 529 | on-finished "~2.3.0" 530 | on-headers "~1.0.1" 531 | 532 | ms@2.0.0: 533 | version "2.0.0" 534 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 535 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 536 | 537 | ms@2.1.2: 538 | version "2.1.2" 539 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 540 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 541 | 542 | negotiator@0.6.3: 543 | version "0.6.3" 544 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 545 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 546 | 547 | nwsapi@^2.2.0: 548 | version "2.2.0" 549 | resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" 550 | integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== 551 | 552 | on-finished@~2.3.0: 553 | version "2.3.0" 554 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 555 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 556 | dependencies: 557 | ee-first "1.1.1" 558 | 559 | on-headers@~1.0.1: 560 | version "1.0.2" 561 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 562 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 563 | 564 | optionator@^0.8.1: 565 | version "0.8.3" 566 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 567 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 568 | dependencies: 569 | deep-is "~0.1.3" 570 | fast-levenshtein "~2.0.6" 571 | levn "~0.3.0" 572 | prelude-ls "~1.1.2" 573 | type-check "~0.3.2" 574 | word-wrap "~1.2.3" 575 | 576 | parse5@6.0.1: 577 | version "6.0.1" 578 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" 579 | integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== 580 | 581 | parseurl@~1.3.2: 582 | version "1.3.3" 583 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 584 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 585 | 586 | path-to-regexp@0.1.7: 587 | version "0.1.7" 588 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 589 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 590 | 591 | prelude-ls@~1.1.2: 592 | version "1.1.2" 593 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 594 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 595 | 596 | proxy-addr@~2.0.4: 597 | version "2.0.7" 598 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 599 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 600 | dependencies: 601 | forwarded "0.2.0" 602 | ipaddr.js "1.9.1" 603 | 604 | psl@^1.1.33: 605 | version "1.8.0" 606 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 607 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 608 | 609 | punycode@^2.1.1: 610 | version "2.1.1" 611 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 612 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 613 | 614 | qs@6.5.2: 615 | version "6.5.2" 616 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 617 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 618 | 619 | range-parser@~1.2.0: 620 | version "1.2.1" 621 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 622 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 623 | 624 | raw-body@2.3.3: 625 | version "2.3.3" 626 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 627 | integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== 628 | dependencies: 629 | bytes "3.0.0" 630 | http-errors "1.6.3" 631 | iconv-lite "0.4.23" 632 | unpipe "1.0.0" 633 | 634 | readability-from-string@^2.0.0: 635 | version "2.0.0" 636 | resolved "https://registry.yarnpkg.com/readability-from-string/-/readability-from-string-2.0.0.tgz#1a921e66cf0a61a3eff20ef8a829562c0c8f6d81" 637 | integrity sha1-GpIeZs8KYaPv8g74qClWLAyPbYE= 638 | dependencies: 639 | readability-node "^0.1.0" 640 | 641 | readability-node@^0.1.0: 642 | version "0.1.0" 643 | resolved "https://registry.yarnpkg.com/readability-node/-/readability-node-0.1.0.tgz#0d405a70c2c215944a7f4a9b5f7506cd05a9b1aa" 644 | integrity sha1-DUBacMLCFZRKf0qbX3UGzQWpsao= 645 | 646 | safe-buffer@5.1.2: 647 | version "5.1.2" 648 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 649 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 650 | 651 | "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": 652 | version "2.1.2" 653 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 654 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 655 | 656 | saxes@^5.0.1: 657 | version "5.0.1" 658 | resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" 659 | integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== 660 | dependencies: 661 | xmlchars "^2.2.0" 662 | 663 | send@0.16.2: 664 | version "0.16.2" 665 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 666 | integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== 667 | dependencies: 668 | debug "2.6.9" 669 | depd "~1.1.2" 670 | destroy "~1.0.4" 671 | encodeurl "~1.0.2" 672 | escape-html "~1.0.3" 673 | etag "~1.8.1" 674 | fresh "0.5.2" 675 | http-errors "~1.6.2" 676 | mime "1.4.1" 677 | ms "2.0.0" 678 | on-finished "~2.3.0" 679 | range-parser "~1.2.0" 680 | statuses "~1.4.0" 681 | 682 | serve-static@1.13.2: 683 | version "1.13.2" 684 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 685 | integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== 686 | dependencies: 687 | encodeurl "~1.0.2" 688 | escape-html "~1.0.3" 689 | parseurl "~1.3.2" 690 | send "0.16.2" 691 | 692 | setprototypeof@1.1.0: 693 | version "1.1.0" 694 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 695 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 696 | 697 | slugify@^1.6.5: 698 | version "1.6.5" 699 | resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.5.tgz#c8f5c072bf2135b80703589b39a3d41451fbe8c8" 700 | integrity sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ== 701 | 702 | source-map-support@~0.5.20: 703 | version "0.5.21" 704 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 705 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 706 | dependencies: 707 | buffer-from "^1.0.0" 708 | source-map "^0.6.0" 709 | 710 | source-map@^0.6.0, source-map@~0.6.1: 711 | version "0.6.1" 712 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 713 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 714 | 715 | source-map@~0.7.2: 716 | version "0.7.3" 717 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 718 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 719 | 720 | "statuses@>= 1.4.0 < 2": 721 | version "1.5.0" 722 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 723 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 724 | 725 | statuses@~1.4.0: 726 | version "1.4.0" 727 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 728 | integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== 729 | 730 | symbol-tree@^3.2.4: 731 | version "3.2.4" 732 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" 733 | integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== 734 | 735 | terser@^5.6.1: 736 | version "5.10.0" 737 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" 738 | integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== 739 | dependencies: 740 | commander "^2.20.0" 741 | source-map "~0.7.2" 742 | source-map-support "~0.5.20" 743 | 744 | tough-cookie@^4.0.0: 745 | version "4.0.0" 746 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" 747 | integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== 748 | dependencies: 749 | psl "^1.1.33" 750 | punycode "^2.1.1" 751 | universalify "^0.1.2" 752 | 753 | tr46@^3.0.0: 754 | version "3.0.0" 755 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" 756 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== 757 | dependencies: 758 | punycode "^2.1.1" 759 | 760 | turndown-plugin-gfm@^1.0.2: 761 | version "1.0.2" 762 | resolved "https://registry.yarnpkg.com/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz#6f8678a361f35220b2bdf5619e6049add75bf1c7" 763 | integrity sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg== 764 | 765 | turndown@^7.1.1: 766 | version "7.1.1" 767 | resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.1.1.tgz#96992f2d9b40a1a03d3ea61ad31b5a5c751ef77f" 768 | integrity sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA== 769 | dependencies: 770 | domino "^2.1.6" 771 | 772 | type-check@~0.3.2: 773 | version "0.3.2" 774 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 775 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 776 | dependencies: 777 | prelude-ls "~1.1.2" 778 | 779 | type-is@~1.6.16: 780 | version "1.6.18" 781 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 782 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 783 | dependencies: 784 | media-typer "0.3.0" 785 | mime-types "~2.1.24" 786 | 787 | universalify@^0.1.2: 788 | version "0.1.2" 789 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 790 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 791 | 792 | unpipe@1.0.0, unpipe@~1.0.0: 793 | version "1.0.0" 794 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 795 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 796 | 797 | utils-merge@1.0.1: 798 | version "1.0.1" 799 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 800 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 801 | 802 | vary@~1.1.2: 803 | version "1.1.2" 804 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 805 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 806 | 807 | w3c-hr-time@^1.0.2: 808 | version "1.0.2" 809 | resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" 810 | integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== 811 | dependencies: 812 | browser-process-hrtime "^1.0.0" 813 | 814 | w3c-xmlserializer@^3.0.0: 815 | version "3.0.0" 816 | resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" 817 | integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== 818 | dependencies: 819 | xml-name-validator "^4.0.0" 820 | 821 | webidl-conversions@^7.0.0: 822 | version "7.0.0" 823 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" 824 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== 825 | 826 | whatwg-encoding@^2.0.0: 827 | version "2.0.0" 828 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" 829 | integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== 830 | dependencies: 831 | iconv-lite "0.6.3" 832 | 833 | whatwg-mimetype@^3.0.0: 834 | version "3.0.0" 835 | resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" 836 | integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== 837 | 838 | whatwg-url@^10.0.0: 839 | version "10.0.0" 840 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" 841 | integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== 842 | dependencies: 843 | tr46 "^3.0.0" 844 | webidl-conversions "^7.0.0" 845 | 846 | word-wrap@~1.2.3: 847 | version "1.2.3" 848 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 849 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 850 | 851 | ws@^8.2.3: 852 | version "8.5.0" 853 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" 854 | integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== 855 | 856 | xml-name-validator@^4.0.0: 857 | version "4.0.0" 858 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" 859 | integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== 860 | 861 | xmlchars@^2.2.0: 862 | version "2.2.0" 863 | resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" 864 | integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== 865 | --------------------------------------------------------------------------------