├── .gitignore ├── public ├── images │ ├── social.jpg │ └── favicon.png ├── css │ ├── page.css │ └── home.css ├── page.html └── index.html ├── now.json ├── package.json ├── app.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /.env 2 | /.DS_Store 3 | .DS_Store 4 | /public/.DS_Store 5 | /node_modules -------------------------------------------------------------------------------- /public/images/social.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oilstel/scoby/HEAD/public/images/social.jpg -------------------------------------------------------------------------------- /public/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oilstel/scoby/HEAD/public/images/favicon.png -------------------------------------------------------------------------------- /now.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { "src": "*.js", "use": "@now/node-server" }, 5 | { "src": "public/**/**", "use": "@now/static" } 6 | ], 7 | "routes": [ 8 | { 9 | "src": "/public/(.*)", 10 | "dest": "/public/" 11 | }, 12 | { 13 | "src": "/(.*)", 14 | "dest": "/app.js" 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "arena-site-generator", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "start": "node app.js", 8 | "dev": "nodemon app.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "are.na": "^0.1.5", 14 | "body-parser": "^2.2.0", 15 | "dotenv": "^16.4.7", 16 | "express": "^4.17.1", 17 | "express-validator": "^7.2.1", 18 | "path": "^0.12.7" 19 | }, 20 | "devDependencies": { 21 | "nodemon": "^3.1.9" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /public/css/page.css: -------------------------------------------------------------------------------- 1 | * { box-sizing: border-box; } 2 | /* body { 3 | padding: 10px; 4 | font-family: Arial, Helvetica, sans-serif; 5 | -webkit-font-smoothing: antialiased; 6 | -webkit-text-size-adjust: none; 7 | -moz-osx-font-smoothing: grayscale; 8 | background: #ffffff; 9 | color: #1f1209; 10 | } */ 11 | /* h1, h2, h3, h4, a, ul, ol, li, p, figure { 12 | font-size: 14px; 13 | font-weight: normal; 14 | margin: 0; 15 | padding: 0; 16 | } 17 | h1 { 18 | font-weight: bold; 19 | } 20 | h1, h2, h3, h4, ul, ol, p { 21 | margin-bottom: 1.3em; 22 | } 23 | ol li, ul li { 24 | list-style-position: inside; 25 | } 26 | ul li { 27 | list-style-type: none; 28 | } 29 | #blocks div { 30 | margin-bottom: 1em; 31 | } 32 | #blocks div img, #blocks div video { 33 | max-width: 100%;; 34 | } 35 | #title { 36 | margin-bottom: 2em; 37 | } 38 | a { 39 | color: #000; 40 | } */ 41 | 42 | #load-more { 43 | /* outline: none; 44 | border: 1px solid black; */ 45 | cursor: pointer; 46 | display: none; 47 | } 48 | 49 | /* #load-more, #loading { 50 | width: 100%; 51 | padding: 2rem; 52 | border-radius: 50%; 53 | text-align: center; 54 | font-size: 50px; 55 | letter-spacing:-0.06em; 56 | } 57 | 58 | #load-more:hover { 59 | border-radius: 2rem; 60 | } */ 61 | 62 | #load-more.able-to-load {display: block} 63 | #loading.done-loading {display: none} -------------------------------------------------------------------------------- /public/css/home.css: -------------------------------------------------------------------------------- 1 | * { box-sizing: border-box; } 2 | :root { 3 | --font-family: Arial; 4 | --text-color: #000; 5 | --bg-color: #f7f8c5; 6 | --fs: 24px; 7 | --lh: 30px; 8 | } 9 | body { 10 | font-family: var(--font-family); 11 | /* -webkit-font-smoothing: antialiased; 12 | -webkit-text-size-adjust: none; 13 | -moz-osx-font-smoothing: grayscale; */ 14 | color: var(--text-color); 15 | background-color: var(--bg-color); 16 | padding: 10px 15px; 17 | margin: 0; 18 | } 19 | ol li, ul li { 20 | list-style-position: inside; 21 | } 22 | ul li { 23 | list-style-type: none; 24 | margin-bottom: 1em; 25 | } 26 | h1, p { 27 | font-size: var(--fs); 28 | line-height: var(--lh); 29 | } 30 | h1 { 31 | font-size: 50px; 32 | margin-top: 10px; 33 | } 34 | a { color: var(--text-color); } 35 | 36 | #title-and-description { 37 | margin-bottom: 10px; 38 | } 39 | 40 | #welcome { 41 | display: flex; 42 | flex-flow: column wrap; 43 | gap: 0px; 44 | } 45 | p { 46 | font-size: var(--fs); 47 | line-height: var(--lh); 48 | margin: 10px 0; 49 | } 50 | 51 | main#home { 52 | /* max-width: 400px; */ 53 | margin: 0 auto; 54 | } 55 | 56 | /* Scobies */ 57 | #scobies { 58 | display: flex; 59 | flex-flow: column nowrap; 60 | } 61 | #scobies a { 62 | text-decoration: none; 63 | font-size: var(--fs); 64 | line-height: var(--lh); 65 | border-bottom: 1px solid #000000; 66 | padding: 8px 0px; 67 | } 68 | /* #scobies a:nth-child(odd) { 69 | background: #f1f1f1; 70 | } */ 71 | #scobies a u { 72 | color: blue; 73 | text-decoration: underline; 74 | font-size: 16px; 75 | word-break: break-all; 76 | display: none; 77 | } 78 | #scobies a:hover { 79 | background-color: #c5ddf372; 80 | } 81 | 82 | #load-more { 83 | padding: 6px; 84 | margin: 2em 0; 85 | font-family: var(--font-family); 86 | border: 1px solid #000; 87 | color: var(--text-color); 88 | background: var(--bg-color); 89 | cursor: pointer; 90 | font-size: 14px; 91 | border-radius: 4px; 92 | display: none; 93 | } 94 | 95 | #loading { 96 | font-size: 16px; 97 | color: var(--text-color); 98 | } 99 | 100 | #loading.done-loading { 101 | display: none; 102 | } 103 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const app = express(); 4 | const router = express.Router(); 5 | app.use(bodyParser.json()); 6 | const path = require('path'); 7 | const Arena = require('are.na'); 8 | let arena = new Arena(); 9 | 10 | // Simple in-memory cache for aggregated channel contents 11 | const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes 12 | let allChannelsCache = { 13 | data: null, 14 | cachedAt: 0 15 | }; 16 | 17 | app.use(bodyParser.urlencoded({ extended: false })); 18 | 19 | // We'll keep this endpoint for backward compatibility 20 | app.get('/api/sites', async function(req, res) { 21 | const page = req.query.page || 1; 22 | const per = Math.min(parseInt(req.query.per || 50, 10), 50); 23 | 24 | try { 25 | const response = await fetch(`https://api.are.na/v2/channels/scoby/contents?per=${per}&page=${page}&direction=desc&sort=position`, { 26 | method: 'GET', 27 | headers: { 28 | 'Accept': 'application/json', 29 | 'User-Agent': 'Scoby/1.0', 30 | 'Cache-Control': 'no-cache' 31 | } 32 | }); 33 | 34 | if (!response.ok) { 35 | const errorText = await response.text(); 36 | console.error('API Error:', { 37 | status: response.status, 38 | statusText: response.statusText, 39 | headers: Object.fromEntries(response.headers.entries()), 40 | body: errorText 41 | }); 42 | res.status(response.status).send({ 43 | error: 'API request failed', 44 | status: response.status, 45 | message: errorText 46 | }); 47 | return; 48 | } 49 | 50 | const data = await response.json(); 51 | console.log('API Response for /api/sites:', JSON.stringify(data).slice(0, 200)); 52 | 53 | // Handle different response formats 54 | let contents = []; 55 | if (data.contents) { 56 | contents = data.contents; 57 | } else if (Array.isArray(data)) { 58 | contents = data; 59 | } 60 | 61 | // Add pagination info to the response 62 | const responseData = { 63 | contents: contents, 64 | current_page: parseInt(page), 65 | per_page: per, 66 | has_more: contents.length === parseInt(per) 67 | }; 68 | 69 | res.send(responseData); 70 | } catch (err) { 71 | console.error('Fetch Error:', err); 72 | res.status(500).send({ 73 | error: 'Internal server error', 74 | message: err.message 75 | }); 76 | } 77 | }); 78 | 79 | // Aggregated endpoint: returns ALL channels in the `scoby` channel, cached 80 | app.get('/api/sites/all', async function(req, res) { 81 | const per = 50; // Are.na cap 82 | const refresh = req.query.refresh === '1' || req.query.refresh === 'true'; 83 | const now = Date.now(); 84 | 85 | // Serve from cache unless refresh requested or cache expired 86 | if (!refresh && allChannelsCache.data && (now - allChannelsCache.cachedAt < CACHE_TTL_MS)) { 87 | res.send({ 88 | contents: allChannelsCache.data, 89 | total: allChannelsCache.data.length, 90 | cached_at: new Date(allChannelsCache.cachedAt).toISOString(), 91 | cache_ttl_ms: CACHE_TTL_MS, 92 | from_cache: true 93 | }); 94 | return; 95 | } 96 | 97 | try { 98 | // Get channel to determine total length 99 | const channelResponse = await fetch('https://api.are.na/v2/channels/scoby', { 100 | method: 'GET', 101 | headers: { 102 | 'Accept': 'application/json', 103 | 'User-Agent': 'Scoby/1.0', 104 | 'Cache-Control': 'no-cache' 105 | } 106 | }); 107 | 108 | if (!channelResponse.ok) { 109 | const errorText = await channelResponse.text(); 110 | res.status(channelResponse.status).send({ 111 | error: 'Failed to fetch channel info', 112 | status: channelResponse.status, 113 | message: errorText 114 | }); 115 | return; 116 | } 117 | 118 | const channelData = await channelResponse.json(); 119 | const totalBlocks = channelData.length || 0; 120 | const totalPages = Math.max(1, Math.ceil(totalBlocks / per)); 121 | 122 | // Fetch all pages in parallel 123 | const pageNumbers = Array.from({ length: totalPages }, (_, i) => i + 1); 124 | const requests = pageNumbers.map(pageNum => 125 | fetch(`https://api.are.na/v2/channels/scoby/contents?page=${pageNum}&per=${per}&direction=desc&sort=position`, { 126 | method: 'GET', 127 | headers: { 128 | 'Accept': 'application/json', 129 | 'User-Agent': 'Scoby/1.0', 130 | 'Cache-Control': 'no-cache' 131 | } 132 | }).then(r => { 133 | if (!r.ok) throw new Error(`Contents request failed: ${r.status}`); 134 | return r.json(); 135 | }) 136 | ); 137 | 138 | const pages = await Promise.all(requests); 139 | 140 | // Merge, filter to Channels, and dedupe by id 141 | const seenIds = new Set(); 142 | const merged = []; 143 | pages.forEach(data => { 144 | if (data && data.contents && data.contents.length) { 145 | data.contents.forEach(item => { 146 | if (item.class === 'Channel' && !seenIds.has(item.id)) { 147 | seenIds.add(item.id); 148 | merged.push(item); 149 | } 150 | }); 151 | } 152 | }); 153 | 154 | // Update cache 155 | allChannelsCache.data = merged; 156 | allChannelsCache.cachedAt = now; 157 | 158 | res.send({ 159 | contents: merged, 160 | total: merged.length, 161 | cached_at: new Date(allChannelsCache.cachedAt).toISOString(), 162 | cache_ttl_ms: CACHE_TTL_MS, 163 | from_cache: false 164 | }); 165 | } catch (err) { 166 | console.error('Error aggregating channels:', err); 167 | res.status(500).send({ 168 | error: 'Internal server error', 169 | message: err.message 170 | }); 171 | } 172 | }); 173 | 174 | app.get('/api/:site', function(req, res){ 175 | // add search params for page, eg /api/scoby?page=2 176 | // ------------------------------------------------ 177 | // its an art to find the perfect balance between 178 | // amount of blocks to return per request and the 179 | // actual amount of requests needed to load content 180 | arena.channel(req.params.site).contents({ page: req.query.page ? req.query.page : 1, 181 | per: req.query.per ? req.query.per : 24, 182 | direction: 'desc', 183 | sort: 'position' 184 | }) 185 | .then(contents => { 186 | // console.log(contents) 187 | res.send(contents); 188 | // res.sendFile(__dirname + '/public/index.html'); 189 | }) 190 | .catch(err => console.log(err)); 191 | }) 192 | 193 | app.get('/', (req, res) => { 194 | res.sendFile(__dirname + '/public/index.html'); 195 | }); 196 | 197 | app.get('/:page', (req, res) => { 198 | res.sendFile(__dirname + '/public/page.html'); 199 | }); 200 | 201 | app.use(express.static(__dirname + '/public', { 202 | extensions: ['html', 'htm'], 203 | })); 204 | 205 | app.listen(process.env.PORT || 3001, process.env.IP || '0.0.0.0', () => { 206 | console.log('app listening on port 3001'); 207 | }); -------------------------------------------------------------------------------- /public/page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 | 22 |
...
23 | 24 | 25 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | scoby.page - Turn any Are.na channel into a website 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |

scoby.page

23 | 24 |

Turn any open or closed Are.na channel into a website.

25 | 26 |

Style your Scoby by adding a block titled "stylesheet" with some CSS to your channel.

27 | 28 |

Watch a short tutorial.

29 | 30 |

Please consider supporting this project. Made by Elliott Cost.

31 | 32 |
33 | 34 |

35 | 36 |
37 |
38 | 39 |
Loading scobies...
40 | 41 |
42 | 43 |
44 | 45 |
46 | 47 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.8: 6 | version "1.3.8" 7 | resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" 8 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 9 | dependencies: 10 | mime-types "~2.1.34" 11 | negotiator "0.6.3" 12 | 13 | anymatch@~3.1.2: 14 | version "3.1.3" 15 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" 16 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 17 | dependencies: 18 | normalize-path "^3.0.0" 19 | picomatch "^2.0.4" 20 | 21 | are.na@^0.1.5: 22 | version "0.1.5" 23 | resolved "https://registry.npmjs.org/are.na/-/are.na-0.1.5.tgz" 24 | integrity sha512-ZM5zBXfO/Ug+nB40emqbQsJmI3F2V3nX8NAIaSxRUfsUYNvVe/t0Elb3c2SEk41260NLjZ8sSOi13IxFW1K9EQ== 25 | dependencies: 26 | axios "^0.18.1" 27 | qs "^6.5.1" 28 | 29 | array-flatten@1.1.1: 30 | version "1.1.1" 31 | resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" 32 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 33 | 34 | axios@^0.18.1: 35 | version "0.18.1" 36 | resolved "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz" 37 | integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== 38 | dependencies: 39 | follow-redirects "1.5.10" 40 | is-buffer "^2.0.2" 41 | 42 | balanced-match@^1.0.0: 43 | version "1.0.2" 44 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 45 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 46 | 47 | binary-extensions@^2.0.0: 48 | version "2.3.0" 49 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" 50 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 51 | 52 | body-parser@^2.2.0: 53 | version "2.2.0" 54 | resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz" 55 | integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== 56 | dependencies: 57 | bytes "^3.1.2" 58 | content-type "^1.0.5" 59 | debug "^4.4.0" 60 | http-errors "^2.0.0" 61 | iconv-lite "^0.6.3" 62 | on-finished "^2.4.1" 63 | qs "^6.14.0" 64 | raw-body "^3.0.0" 65 | type-is "^2.0.0" 66 | 67 | body-parser@1.20.3: 68 | version "1.20.3" 69 | resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" 70 | integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== 71 | dependencies: 72 | bytes "3.1.2" 73 | content-type "~1.0.5" 74 | debug "2.6.9" 75 | depd "2.0.0" 76 | destroy "1.2.0" 77 | http-errors "2.0.0" 78 | iconv-lite "0.4.24" 79 | on-finished "2.4.1" 80 | qs "6.13.0" 81 | raw-body "2.5.2" 82 | type-is "~1.6.18" 83 | unpipe "1.0.0" 84 | 85 | brace-expansion@^1.1.7: 86 | version "1.1.11" 87 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 88 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 89 | dependencies: 90 | balanced-match "^1.0.0" 91 | concat-map "0.0.1" 92 | 93 | braces@~3.0.2: 94 | version "3.0.3" 95 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" 96 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 97 | dependencies: 98 | fill-range "^7.1.1" 99 | 100 | bytes@^3.1.2, bytes@3.1.2: 101 | version "3.1.2" 102 | resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" 103 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 104 | 105 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 106 | version "1.0.2" 107 | resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" 108 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 109 | dependencies: 110 | es-errors "^1.3.0" 111 | function-bind "^1.1.2" 112 | 113 | call-bound@^1.0.2: 114 | version "1.0.4" 115 | resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" 116 | integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== 117 | dependencies: 118 | call-bind-apply-helpers "^1.0.2" 119 | get-intrinsic "^1.3.0" 120 | 121 | chokidar@^3.5.2: 122 | version "3.6.0" 123 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" 124 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 125 | dependencies: 126 | anymatch "~3.1.2" 127 | braces "~3.0.2" 128 | glob-parent "~5.1.2" 129 | is-binary-path "~2.1.0" 130 | is-glob "~4.0.1" 131 | normalize-path "~3.0.0" 132 | readdirp "~3.6.0" 133 | optionalDependencies: 134 | fsevents "~2.3.2" 135 | 136 | concat-map@0.0.1: 137 | version "0.0.1" 138 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 139 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 140 | 141 | content-disposition@0.5.4: 142 | version "0.5.4" 143 | resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" 144 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 145 | dependencies: 146 | safe-buffer "5.2.1" 147 | 148 | content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: 149 | version "1.0.5" 150 | resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" 151 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 152 | 153 | cookie-signature@1.0.6: 154 | version "1.0.6" 155 | resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" 156 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 157 | 158 | cookie@0.7.1: 159 | version "0.7.1" 160 | resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz" 161 | integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== 162 | 163 | debug@^4: 164 | version "4.4.0" 165 | resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" 166 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 167 | dependencies: 168 | ms "^2.1.3" 169 | 170 | debug@^4.4.0: 171 | version "4.4.0" 172 | resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" 173 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 174 | dependencies: 175 | ms "^2.1.3" 176 | 177 | debug@=3.1.0: 178 | version "3.1.0" 179 | resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" 180 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 181 | dependencies: 182 | ms "2.0.0" 183 | 184 | debug@2.6.9: 185 | version "2.6.9" 186 | resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 187 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 188 | dependencies: 189 | ms "2.0.0" 190 | 191 | depd@2.0.0: 192 | version "2.0.0" 193 | resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" 194 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 195 | 196 | destroy@1.2.0: 197 | version "1.2.0" 198 | resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" 199 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 200 | 201 | dotenv@^16.4.7: 202 | version "16.4.7" 203 | resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz" 204 | integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== 205 | 206 | dunder-proto@^1.0.1: 207 | version "1.0.1" 208 | resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" 209 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 210 | dependencies: 211 | call-bind-apply-helpers "^1.0.1" 212 | es-errors "^1.3.0" 213 | gopd "^1.2.0" 214 | 215 | ee-first@1.1.1: 216 | version "1.1.1" 217 | resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" 218 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 219 | 220 | encodeurl@~1.0.2: 221 | version "1.0.2" 222 | resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" 223 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 224 | 225 | encodeurl@~2.0.0: 226 | version "2.0.0" 227 | resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" 228 | integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== 229 | 230 | es-define-property@^1.0.1: 231 | version "1.0.1" 232 | resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" 233 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 234 | 235 | es-errors@^1.3.0: 236 | version "1.3.0" 237 | resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" 238 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 239 | 240 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 241 | version "1.1.1" 242 | resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" 243 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 244 | dependencies: 245 | es-errors "^1.3.0" 246 | 247 | escape-html@~1.0.3: 248 | version "1.0.3" 249 | resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" 250 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 251 | 252 | etag@~1.8.1: 253 | version "1.8.1" 254 | resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" 255 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 256 | 257 | express-validator@^7.2.1: 258 | version "7.2.1" 259 | resolved "https://registry.npmjs.org/express-validator/-/express-validator-7.2.1.tgz" 260 | integrity sha512-CjNE6aakfpuwGaHQZ3m8ltCG2Qvivd7RHtVMS/6nVxOM7xVGqr4bhflsm4+N5FP5zI7Zxp+Hae+9RE+o8e3ZOQ== 261 | dependencies: 262 | lodash "^4.17.21" 263 | validator "~13.12.0" 264 | 265 | express@^4.17.1: 266 | version "4.21.2" 267 | resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" 268 | integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== 269 | dependencies: 270 | accepts "~1.3.8" 271 | array-flatten "1.1.1" 272 | body-parser "1.20.3" 273 | content-disposition "0.5.4" 274 | content-type "~1.0.4" 275 | cookie "0.7.1" 276 | cookie-signature "1.0.6" 277 | debug "2.6.9" 278 | depd "2.0.0" 279 | encodeurl "~2.0.0" 280 | escape-html "~1.0.3" 281 | etag "~1.8.1" 282 | finalhandler "1.3.1" 283 | fresh "0.5.2" 284 | http-errors "2.0.0" 285 | merge-descriptors "1.0.3" 286 | methods "~1.1.2" 287 | on-finished "2.4.1" 288 | parseurl "~1.3.3" 289 | path-to-regexp "0.1.12" 290 | proxy-addr "~2.0.7" 291 | qs "6.13.0" 292 | range-parser "~1.2.1" 293 | safe-buffer "5.2.1" 294 | send "0.19.0" 295 | serve-static "1.16.2" 296 | setprototypeof "1.2.0" 297 | statuses "2.0.1" 298 | type-is "~1.6.18" 299 | utils-merge "1.0.1" 300 | vary "~1.1.2" 301 | 302 | fill-range@^7.1.1: 303 | version "7.1.1" 304 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" 305 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 306 | dependencies: 307 | to-regex-range "^5.0.1" 308 | 309 | finalhandler@1.3.1: 310 | version "1.3.1" 311 | resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz" 312 | integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== 313 | dependencies: 314 | debug "2.6.9" 315 | encodeurl "~2.0.0" 316 | escape-html "~1.0.3" 317 | on-finished "2.4.1" 318 | parseurl "~1.3.3" 319 | statuses "2.0.1" 320 | unpipe "~1.0.0" 321 | 322 | follow-redirects@1.5.10: 323 | version "1.5.10" 324 | resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz" 325 | integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== 326 | dependencies: 327 | debug "=3.1.0" 328 | 329 | forwarded@0.2.0: 330 | version "0.2.0" 331 | resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" 332 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 333 | 334 | fresh@0.5.2: 335 | version "0.5.2" 336 | resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" 337 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 338 | 339 | fsevents@~2.3.2: 340 | version "2.3.3" 341 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" 342 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 343 | 344 | function-bind@^1.1.2: 345 | version "1.1.2" 346 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" 347 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 348 | 349 | get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: 350 | version "1.3.0" 351 | resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" 352 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 353 | dependencies: 354 | call-bind-apply-helpers "^1.0.2" 355 | es-define-property "^1.0.1" 356 | es-errors "^1.3.0" 357 | es-object-atoms "^1.1.1" 358 | function-bind "^1.1.2" 359 | get-proto "^1.0.1" 360 | gopd "^1.2.0" 361 | has-symbols "^1.1.0" 362 | hasown "^2.0.2" 363 | math-intrinsics "^1.1.0" 364 | 365 | get-proto@^1.0.1: 366 | version "1.0.1" 367 | resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" 368 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 369 | dependencies: 370 | dunder-proto "^1.0.1" 371 | es-object-atoms "^1.0.0" 372 | 373 | glob-parent@~5.1.2: 374 | version "5.1.2" 375 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 376 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 377 | dependencies: 378 | is-glob "^4.0.1" 379 | 380 | gopd@^1.2.0: 381 | version "1.2.0" 382 | resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" 383 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 384 | 385 | has-flag@^3.0.0: 386 | version "3.0.0" 387 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 388 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 389 | 390 | has-symbols@^1.1.0: 391 | version "1.1.0" 392 | resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" 393 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 394 | 395 | hasown@^2.0.2: 396 | version "2.0.2" 397 | resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" 398 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 399 | dependencies: 400 | function-bind "^1.1.2" 401 | 402 | http-errors@^2.0.0, http-errors@2.0.0: 403 | version "2.0.0" 404 | resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" 405 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 406 | dependencies: 407 | depd "2.0.0" 408 | inherits "2.0.4" 409 | setprototypeof "1.2.0" 410 | statuses "2.0.1" 411 | toidentifier "1.0.1" 412 | 413 | iconv-lite@^0.6.3, iconv-lite@0.6.3: 414 | version "0.6.3" 415 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" 416 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 417 | dependencies: 418 | safer-buffer ">= 2.1.2 < 3.0.0" 419 | 420 | iconv-lite@0.4.24: 421 | version "0.4.24" 422 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" 423 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 424 | dependencies: 425 | safer-buffer ">= 2.1.2 < 3" 426 | 427 | ignore-by-default@^1.0.1: 428 | version "1.0.1" 429 | resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" 430 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 431 | 432 | inherits@2.0.3: 433 | version "2.0.3" 434 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 435 | integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== 436 | 437 | inherits@2.0.4: 438 | version "2.0.4" 439 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 440 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 441 | 442 | ipaddr.js@1.9.1: 443 | version "1.9.1" 444 | resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" 445 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 446 | 447 | is-binary-path@~2.1.0: 448 | version "2.1.0" 449 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 450 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 451 | dependencies: 452 | binary-extensions "^2.0.0" 453 | 454 | is-buffer@^2.0.2: 455 | version "2.0.5" 456 | resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" 457 | integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== 458 | 459 | is-extglob@^2.1.1: 460 | version "2.1.1" 461 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 462 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 463 | 464 | is-glob@^4.0.1, is-glob@~4.0.1: 465 | version "4.0.3" 466 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 467 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 468 | dependencies: 469 | is-extglob "^2.1.1" 470 | 471 | is-number@^7.0.0: 472 | version "7.0.0" 473 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 474 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 475 | 476 | lodash@^4.17.21: 477 | version "4.17.21" 478 | resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 479 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 480 | 481 | math-intrinsics@^1.1.0: 482 | version "1.1.0" 483 | resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" 484 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 485 | 486 | media-typer@^1.1.0: 487 | version "1.1.0" 488 | resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" 489 | integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== 490 | 491 | media-typer@0.3.0: 492 | version "0.3.0" 493 | resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" 494 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 495 | 496 | merge-descriptors@1.0.3: 497 | version "1.0.3" 498 | resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" 499 | integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== 500 | 501 | methods@~1.1.2: 502 | version "1.1.2" 503 | resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" 504 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 505 | 506 | mime-db@^1.54.0: 507 | version "1.54.0" 508 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" 509 | integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== 510 | 511 | mime-db@1.52.0: 512 | version "1.52.0" 513 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" 514 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 515 | 516 | mime-types@^3.0.0: 517 | version "3.0.1" 518 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz" 519 | integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== 520 | dependencies: 521 | mime-db "^1.54.0" 522 | 523 | mime-types@~2.1.24, mime-types@~2.1.34: 524 | version "2.1.35" 525 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" 526 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 527 | dependencies: 528 | mime-db "1.52.0" 529 | 530 | mime@1.6.0: 531 | version "1.6.0" 532 | resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" 533 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 534 | 535 | minimatch@^3.1.2: 536 | version "3.1.2" 537 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 538 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 539 | dependencies: 540 | brace-expansion "^1.1.7" 541 | 542 | ms@^2.1.3: 543 | version "2.1.3" 544 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 545 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 546 | 547 | ms@2.0.0: 548 | version "2.0.0" 549 | resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 550 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 551 | 552 | ms@2.1.3: 553 | version "2.1.3" 554 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 555 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 556 | 557 | negotiator@0.6.3: 558 | version "0.6.3" 559 | resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" 560 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 561 | 562 | nodemon@^3.1.9: 563 | version "3.1.9" 564 | resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz" 565 | integrity sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg== 566 | dependencies: 567 | chokidar "^3.5.2" 568 | debug "^4" 569 | ignore-by-default "^1.0.1" 570 | minimatch "^3.1.2" 571 | pstree.remy "^1.1.8" 572 | semver "^7.5.3" 573 | simple-update-notifier "^2.0.0" 574 | supports-color "^5.5.0" 575 | touch "^3.1.0" 576 | undefsafe "^2.0.5" 577 | 578 | normalize-path@^3.0.0, normalize-path@~3.0.0: 579 | version "3.0.0" 580 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 581 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 582 | 583 | object-inspect@^1.13.3: 584 | version "1.13.4" 585 | resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" 586 | integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== 587 | 588 | on-finished@^2.4.1, on-finished@2.4.1: 589 | version "2.4.1" 590 | resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" 591 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 592 | dependencies: 593 | ee-first "1.1.1" 594 | 595 | parseurl@~1.3.3: 596 | version "1.3.3" 597 | resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" 598 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 599 | 600 | path-to-regexp@0.1.12: 601 | version "0.1.12" 602 | resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz" 603 | integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== 604 | 605 | path@^0.12.7: 606 | version "0.12.7" 607 | resolved "https://registry.npmjs.org/path/-/path-0.12.7.tgz" 608 | integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== 609 | dependencies: 610 | process "^0.11.1" 611 | util "^0.10.3" 612 | 613 | picomatch@^2.0.4, picomatch@^2.2.1: 614 | version "2.3.1" 615 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 616 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 617 | 618 | process@^0.11.1: 619 | version "0.11.10" 620 | resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" 621 | integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== 622 | 623 | proxy-addr@~2.0.7: 624 | version "2.0.7" 625 | resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" 626 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 627 | dependencies: 628 | forwarded "0.2.0" 629 | ipaddr.js "1.9.1" 630 | 631 | pstree.remy@^1.1.8: 632 | version "1.1.8" 633 | resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" 634 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 635 | 636 | qs@^6.14.0: 637 | version "6.14.0" 638 | resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" 639 | integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== 640 | dependencies: 641 | side-channel "^1.1.0" 642 | 643 | qs@^6.5.1, qs@6.13.0: 644 | version "6.13.0" 645 | resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" 646 | integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== 647 | dependencies: 648 | side-channel "^1.0.6" 649 | 650 | range-parser@~1.2.1: 651 | version "1.2.1" 652 | resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" 653 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 654 | 655 | raw-body@^3.0.0: 656 | version "3.0.0" 657 | resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz" 658 | integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== 659 | dependencies: 660 | bytes "3.1.2" 661 | http-errors "2.0.0" 662 | iconv-lite "0.6.3" 663 | unpipe "1.0.0" 664 | 665 | raw-body@2.5.2: 666 | version "2.5.2" 667 | resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" 668 | integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== 669 | dependencies: 670 | bytes "3.1.2" 671 | http-errors "2.0.0" 672 | iconv-lite "0.4.24" 673 | unpipe "1.0.0" 674 | 675 | readdirp@~3.6.0: 676 | version "3.6.0" 677 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" 678 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 679 | dependencies: 680 | picomatch "^2.2.1" 681 | 682 | safe-buffer@5.2.1: 683 | version "5.2.1" 684 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 685 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 686 | 687 | "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": 688 | version "2.1.2" 689 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 690 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 691 | 692 | semver@^7.5.3: 693 | version "7.7.1" 694 | resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" 695 | integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== 696 | 697 | send@0.19.0: 698 | version "0.19.0" 699 | resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" 700 | integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== 701 | dependencies: 702 | debug "2.6.9" 703 | depd "2.0.0" 704 | destroy "1.2.0" 705 | encodeurl "~1.0.2" 706 | escape-html "~1.0.3" 707 | etag "~1.8.1" 708 | fresh "0.5.2" 709 | http-errors "2.0.0" 710 | mime "1.6.0" 711 | ms "2.1.3" 712 | on-finished "2.4.1" 713 | range-parser "~1.2.1" 714 | statuses "2.0.1" 715 | 716 | serve-static@1.16.2: 717 | version "1.16.2" 718 | resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" 719 | integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== 720 | dependencies: 721 | encodeurl "~2.0.0" 722 | escape-html "~1.0.3" 723 | parseurl "~1.3.3" 724 | send "0.19.0" 725 | 726 | setprototypeof@1.2.0: 727 | version "1.2.0" 728 | resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" 729 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 730 | 731 | side-channel-list@^1.0.0: 732 | version "1.0.0" 733 | resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" 734 | integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== 735 | dependencies: 736 | es-errors "^1.3.0" 737 | object-inspect "^1.13.3" 738 | 739 | side-channel-map@^1.0.1: 740 | version "1.0.1" 741 | resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" 742 | integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== 743 | dependencies: 744 | call-bound "^1.0.2" 745 | es-errors "^1.3.0" 746 | get-intrinsic "^1.2.5" 747 | object-inspect "^1.13.3" 748 | 749 | side-channel-weakmap@^1.0.2: 750 | version "1.0.2" 751 | resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" 752 | integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== 753 | dependencies: 754 | call-bound "^1.0.2" 755 | es-errors "^1.3.0" 756 | get-intrinsic "^1.2.5" 757 | object-inspect "^1.13.3" 758 | side-channel-map "^1.0.1" 759 | 760 | side-channel@^1.0.6, side-channel@^1.1.0: 761 | version "1.1.0" 762 | resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" 763 | integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== 764 | dependencies: 765 | es-errors "^1.3.0" 766 | object-inspect "^1.13.3" 767 | side-channel-list "^1.0.0" 768 | side-channel-map "^1.0.1" 769 | side-channel-weakmap "^1.0.2" 770 | 771 | simple-update-notifier@^2.0.0: 772 | version "2.0.0" 773 | resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz" 774 | integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== 775 | dependencies: 776 | semver "^7.5.3" 777 | 778 | statuses@2.0.1: 779 | version "2.0.1" 780 | resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" 781 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 782 | 783 | supports-color@^5.5.0: 784 | version "5.5.0" 785 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 786 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 787 | dependencies: 788 | has-flag "^3.0.0" 789 | 790 | to-regex-range@^5.0.1: 791 | version "5.0.1" 792 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 793 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 794 | dependencies: 795 | is-number "^7.0.0" 796 | 797 | toidentifier@1.0.1: 798 | version "1.0.1" 799 | resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" 800 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 801 | 802 | touch@^3.1.0: 803 | version "3.1.1" 804 | resolved "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz" 805 | integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== 806 | 807 | type-is@^2.0.0: 808 | version "2.0.1" 809 | resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" 810 | integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== 811 | dependencies: 812 | content-type "^1.0.5" 813 | media-typer "^1.1.0" 814 | mime-types "^3.0.0" 815 | 816 | type-is@~1.6.18: 817 | version "1.6.18" 818 | resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" 819 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 820 | dependencies: 821 | media-typer "0.3.0" 822 | mime-types "~2.1.24" 823 | 824 | undefsafe@^2.0.5: 825 | version "2.0.5" 826 | resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz" 827 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 828 | 829 | unpipe@~1.0.0, unpipe@1.0.0: 830 | version "1.0.0" 831 | resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" 832 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 833 | 834 | util@^0.10.3: 835 | version "0.10.4" 836 | resolved "https://registry.npmjs.org/util/-/util-0.10.4.tgz" 837 | integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 838 | dependencies: 839 | inherits "2.0.3" 840 | 841 | utils-merge@1.0.1: 842 | version "1.0.1" 843 | resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" 844 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 845 | 846 | validator@~13.12.0: 847 | version "13.12.0" 848 | resolved "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz" 849 | integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== 850 | 851 | vary@~1.1.2: 852 | version "1.1.2" 853 | resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" 854 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 855 | --------------------------------------------------------------------------------