├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── examples ├── simple_python_example.py ├── telegram_reverse.py └── telegram_reverse_ptb_v13_15.py ├── package.json ├── src ├── app.js ├── common │ └── http.js ├── modules │ ├── googleReverseImageSearch.js │ └── index.js └── routes │ └── index.js ├── vercel.json └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Serverless directories 108 | .serverless/ 109 | 110 | # FuseBox cache 111 | .fusebox/ 112 | 113 | # DynamoDB Local files 114 | .dynamodb/ 115 | 116 | # TernJS port file 117 | .tern-port 118 | 119 | # Stores VSCode versions used for testing VSCode extensions 120 | .vscode-test 121 | 122 | # yarn v2 123 | .yarn/cache 124 | .yarn/unplugged 125 | .yarn/build-state.yml 126 | .yarn/install-state.gz 127 | .pnp.* 128 | 129 | 130 | .http 131 | test.py 132 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 SOME1HING 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Google Reverse Image Search API 2 | 3 | This is a simple API built using Node.js and Express.js that allows you to perform Google Reverse Image Search by providing an image URL. The API uses Cheerio to scrap Google's image search engine's html to get result text and similar images url. 4 | 5 | API is currently hosted on Vercel. You can access it using [this](https://google-reverse-image-api.vercel.app) link. 6 | 7 | ## Usage 8 | 9 | To use the API, you need to make a POST request to the `/reverse` endpoint with a JSON payload containing the image URL. Here's an example using `curl`: 10 | 11 | ```bash 12 | Invoke-RestMethod -Uri "https://google-reverse-image-api.vercel.app/reverse" -Method Post -Headers @{"Content-Type"="application/json"} -Body '{"imageUrl": "https://fastly.picsum.photos/id/513/200/300.jpg?hmac=KcBD-M89_o9rkxWW6PS2yEfAMCfd3TH9McppOsf3GZ0"}' 13 | 14 | ``` 15 | 16 | The API will respond with a JSON object containing the title and link of the top matching image from Google search, if the search was successful. Here's an example response: 17 | 18 | ```json 19 | { 20 | "success" : true, 21 | "message" : "Successfully Got the Result", 22 | "data" : { 23 | "similarUrl" : "https://www.google.com/search?tbm=isch&q=Elderly%20person", 24 | "resultText" : "Results forÂElderly person" 25 | } 26 | } 27 | 28 | ``` 29 | 30 | If there was an error during the search process, the API will respond with a JSON object containing an error field with a description of the error. Here's an example response: 31 | 32 | ```json 33 | { 34 | "success" : false, 35 | "message" : "Failed to find text output", 36 | "data" : null 37 | } 38 | 39 | ``` 40 | 41 | ### Using the API in Python and JavaScript 42 | 43 | To use this API in a Python project, you can use the `requests` library to make POST requests to the API endpoint. Here's an example: 44 | 45 | ```python 46 | import requests 47 | 48 | url = "https://google-reverse-image-api.vercel.app/reverse" 49 | data = {"imageUrl": "https://fastly.picsum.photos/id/513/200/300.jpg?hmac=KcBD-M89_o9rkxWW6PS2yEfAMCfd3TH9McppOsf3GZ0"} 50 | 51 | response = requests.post(url, json=data) 52 | 53 | if response.ok: 54 | print(response.json()) 55 | else: 56 | print(response.status_code) 57 | 58 | ``` 59 | 60 | To use the API in a JavaScript project, you can use the `fetch` function to make POST requests to the API endpoint. Here's an example: 61 | 62 | ```javascript 63 | const url = "https://google-reverse-image-api.vercel.app/reverse"; 64 | const data = { imageUrl: "https://fastly.picsum.photos/id/513/200/300.jpg?hmac=KcBD-M89_o9rkxWW6PS2yEfAMCfd3TH9McppOsf3GZ0" }; 65 | 66 | fetch(url, { 67 | method: "POST", 68 | headers: { "Content-Type": "application/json" }, 69 | body: JSON.stringify(data), 70 | }) 71 | .then((response) => { 72 | if (response.ok) { 73 | return response.json(); 74 | } else { 75 | throw new Error("Could not perform reverse image search."); 76 | } 77 | }) 78 | .then((data) => console.log(data)) 79 | .catch((error) => console.error(error)); 80 | 81 | ``` 82 | 83 | ### Telegram Integration 84 | 85 | #### Python 86 | 87 | This api can be easily used in your python telegram bot. The module example code is present [here](https://github.com/SOME-1HING/google-reverse-image-api/blob/main/examples/telegram_reverse.py). You can fork [ShikimoriBot](https://github.com/SOME-1HING/ShikimoriBot) repository if you are new to telegram bot development. 88 | 89 | #### JavaScript 90 | 91 | I will provide the code soon. 92 | 93 | ## Deployment 94 | 95 | This API can be deployed to any cloud platform that supports Node.js applications. One popular option is Vercel, which allows you to deploy Node.js applications with zero configuration. 96 | 97 | To deploy this API to [Vercel](https://vercel.com/), click the button below: 98 | 99 | [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FSOME-1HING%2Fgoogle-reverse-image-api&project-name=google-reverse-image-api&repository-name=google-reverse-image-api) 100 | 101 | ## Credits 102 | 103 | This project was created by [SOME-1HING](https://www.github.com/SOME-1HING). Feel free to use and modify this code for your own projects. If you found this project helpful, please consider giving it a ⭐️ on GitHub. 104 | 105 | ## License 106 | 107 | This project is licensed under the MIT License - see the [LICENSE](https://github.com/SOME-1HING/google-reverse-image-api/blob/main/LICENSE) file for details. 108 | 109 | ### Terms of Use 110 | 111 | By using this API, you agree to the following terms: 112 | 113 | - The API is provided as-is and without warranty. 114 | - You will not use the API for any illegal or unauthorized purpose. 115 | - You will include proper attribution if you use the API in a public project. 116 | -------------------------------------------------------------------------------- /examples/simple_python_example.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | url = "https://google-reverse-image-api.vercel.app/reverse" 4 | data = { 5 | "imageUrl": "https://fastly.picsum.photos/id/513/200/300.jpg?hmac=KcBD-M89_o9rkxWW6PS2yEfAMCfd3TH9McppOsf3GZ0" 6 | } 7 | 8 | response = requests.post(url, json=data) 9 | 10 | if response.ok: 11 | print(response.json()) 12 | else: 13 | print(response.status_code) 14 | -------------------------------------------------------------------------------- /examples/telegram_reverse.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023 SOME-1HING 5 | 6 | This file uses the "google-reverse-image-api" API made by "SOME-1HING" 7 | (https://github.com/SOME-1HING/google-reverse-image-api) under the terms of the MIT license. 8 | 9 | """ 10 | 11 | import requests 12 | from pyrogram import filters, client # Pyrogram v2.0 and up 13 | from pyrogram.enums import ParseMode 14 | from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message 15 | 16 | from Shikimori import pbot, TOKEN # Look https://www.github.com/SOME-1HING/ShikimoriBot 17 | 18 | API_URL = "https://google-reverse-image-api.vercel.app/reverse" 19 | 20 | 21 | async def get_file_id_from_message(message: Message): 22 | file_id = None 23 | message = message.reply_to_message 24 | if not message: 25 | return None 26 | if message.document: 27 | if int(message.document.file_size) > 3145728: 28 | return 29 | mime_type = message.document.mime_type 30 | if mime_type not in ("image/png", "image/jpeg"): 31 | return 32 | file_id = message.document.file_id 33 | 34 | if message.sticker: 35 | if message.sticker.is_animated: 36 | if not message.sticker.thumbs: 37 | return 38 | file_id = message.sticker.thumbs[0].file_id 39 | else: 40 | file_id = message.sticker.file_id 41 | 42 | if message.photo: 43 | file_id = message.photo.file_id 44 | 45 | if message.animation: 46 | if not message.animation.thumbs: 47 | return 48 | file_id = message.animation.thumbs[0].file_id 49 | 50 | if message.video: 51 | if not message.video.thumbs: 52 | return 53 | file_id = message.video.thumbs[0].file_id 54 | return file_id 55 | 56 | 57 | @pbot.on_message(filters.command(["pp", "grs", "reverse"])) 58 | async def reverse(app: client, msg: Message): 59 | text = await msg.reply("```Parsing Media...```", parse_mode=ParseMode.MARKDOWN) 60 | file_id = await get_file_id_from_message(msg) 61 | if not file_id: 62 | return await text.edit( 63 | "Reply to a Photo or sticker", parse_mode=ParseMode.MARKDOWN 64 | ) 65 | await text.edit("```Searching...```", parse_mode=ParseMode.MARKDOWN) 66 | 67 | r = requests.post( 68 | f"https://api.telegram.org/bot{TOKEN}/getFile?file_id={file_id}" 69 | ).json() 70 | file_path = r["result"]["file_path"] 71 | 72 | data = { 73 | "imageUrl": f"https://images.google.com/searchbyimage?safe=off&sbisrc=tg&image_url=https://api.telegram.org/file/bot{TOKEN}/{file_path}" 74 | } 75 | 76 | response = requests.post(API_URL, json=data) 77 | 78 | if response.status_code == 200: 79 | result = response["data"] 80 | return await text.edit( 81 | f'Sauce: ```{result["output"]}```', 82 | parse_mode=ParseMode.MARKDOWN, 83 | reply_markup=InlineKeyboardMarkup( 84 | [[InlineKeyboardButton("Link", url=result["similar"])]] 85 | ), 86 | ) 87 | elif response.status_code == 404: 88 | return await text.edit( 89 | "```Couldn't find anything```", parse_mode=ParseMode.MARKDOWN 90 | ) 91 | elif response.status_code == 500: 92 | return await text.edit( 93 | "```Failed to reverse image```", parse_mode=ParseMode.MARKDOWN 94 | ) 95 | elif response.status_code <= 500: 96 | return await text.edit("```Error in API```", parse_mode=ParseMode.MARKDOWN) 97 | else: 98 | return await text.edit( 99 | "```Unknown Error Occurred```", parse_mode=ParseMode.MARKDOWN 100 | ) 101 | -------------------------------------------------------------------------------- /examples/telegram_reverse_ptb_v13_15.py: -------------------------------------------------------------------------------- 1 | """ 2 | MIT License 3 | 4 | Copyright (c) 2023 SOME-1HING 5 | 6 | This file uses the "google-reverse-image-api" API made by "SOME-1HING" 7 | (https://github.com/SOME-1HING/google-reverse-image-api) under the terms of the MIT license. 8 | 9 | This example file is written by "yash-sharma-1807" 10 | 11 | Made only for Python Telegram Bot V13.15 12 | 13 | """ 14 | 15 | import requests 16 | from Yourbot import dispatcher, Bot_token as Token 17 | from telegram import * 18 | from telegram.ext import * 19 | 20 | 21 | url = "https://google-reverse-image-api.vercel.app/reverse" 22 | 23 | 24 | def reverse(update: Update, context: CallbackContext): 25 | if not update.effective_message.reply_to_message: 26 | update.effective_message.reply_text("Reply to a photo.") 27 | 28 | elif not update.effective_message.reply_to_message.photo: 29 | update.effective_message.reply_text("Reply to an image.") 30 | 31 | elif update.effective_message.reply_to_message.photo: 32 | msg = update.effective_message.reply_text("Searching.....") 33 | 34 | photo_id = update.effective_message.reply_to_message.photo[-1].file_id 35 | get_path = requests.post( 36 | f"https://api.telegram.org/bot{Token}/getFile?file_id={photo_id}" 37 | ).json() 38 | file_path = get_path["result"]["file_path"] 39 | data = { 40 | "imageUrl": f"https://images.google.com/searchbyimage?safe=off&sbisrc=tg&image_url=https://api.telegram.org/file/bot{Token}/{file_path}" 41 | } 42 | 43 | response = requests.post(url, json=data) 44 | result = response.json() 45 | if response.ok: 46 | msg.edit_text( 47 | f"[{result['data']['resultText']}]({result['data']['similarUrl']})", 48 | parse_mode=ParseMode.MARKDOWN, 49 | reply_markup=InlineKeyboardMarkup( 50 | [ 51 | [ 52 | InlineKeyboardButton( 53 | "Check this out", url="https://t.me/tyranteyeeee/36603" 54 | ) 55 | ] 56 | ] 57 | ), 58 | ) 59 | else: 60 | update.effective_message.reply_text("Some exception occured") 61 | 62 | 63 | reverse_cmd = CommandHandler("reverse", reverse, run_async=True) 64 | 65 | dispatcher.add_handler(reverse_cmd) 66 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-reverse-image-api", 3 | "version": "0.2.3", 4 | "description": "A simple Express.js and Puppeteer app that includes a reverse API to search for images using Google Reverse Image Search.", 5 | "keywords": [ 6 | "api", 7 | "google", 8 | "reverse", 9 | "google reverse image", 10 | "vercel" 11 | ], 12 | "main": "src/app.js", 13 | "scripts": { 14 | "start": "node build/app.js", 15 | "dev": "nodemon src/app.js", 16 | "build": "npm run clean && tsc && npm run copy-assets", 17 | "clean": "rimraf build" 18 | }, 19 | "author": "SOME-1HING", 20 | "license": "MIT", 21 | "dependencies": { 22 | "axios": "^1.6.0", 23 | "cheerio": "^1.0.0-rc.12", 24 | "cors": "^2.8.5", 25 | "express": "^4.18.2", 26 | "express-rate-limit": "^7.4.1", 27 | "helmet": "^8.0.0", 28 | "multer": "^1.4.5-lts.1" 29 | }, 30 | "devDependencies": { 31 | "nodemon": "^3.1.7" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const cors = require("cors"); 3 | const helmet = require("helmet"); 4 | const rateLimit = require("express-rate-limit"); 5 | const { ErrorResponseObject } = require("./common/http"); 6 | const routes = require("./routes"); 7 | 8 | const app = express(); 9 | 10 | // Environment variables 11 | const PORT = process.env.PORT || 5000; 12 | const ENV = process.env.NODE_ENV || "development"; 13 | 14 | // CORS configuration 15 | const corsOptions = { 16 | origin: "*", 17 | methods: "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS", 18 | allowedHeaders: "Content-Type,Authorization", 19 | }; 20 | 21 | // Middleware 22 | app.use(cors(corsOptions)); 23 | app.use(helmet()); 24 | app.use(express.json({ limit: "1mb" })); // Parse JSON payloads 25 | 26 | // Limit each IP to 100 requests per windowMs 27 | const limiter = rateLimit({ 28 | windowMs: 15 * 60 * 1000, // 15 minutes 29 | max: 100, 30 | message: new ErrorResponseObject( 31 | "Too many requests, please try again later." 32 | ), 33 | }); 34 | app.use(limiter); 35 | 36 | // Mount routes 37 | app.use("/", routes); 38 | 39 | // Catch-all route for undefined paths 40 | app.all("*", (req, res) => 41 | res.status(404).json(new ErrorResponseObject("Route not defined")) 42 | ); 43 | 44 | // Global error handler 45 | app.use((err, req, res, next) => { 46 | console.error("Server Error:", err.message); 47 | const status = err.status || 500; 48 | res 49 | .status(status) 50 | .json(new ErrorResponseObject(err.message || "Internal Server Error")); 51 | }); 52 | 53 | // Start server 54 | app.listen(PORT, () => 55 | console.log(`Server running in ${ENV} mode on http://localhost:${PORT}`) 56 | ); 57 | -------------------------------------------------------------------------------- /src/common/http.js: -------------------------------------------------------------------------------- 1 | class BaseResponseObject { 2 | constructor(success, message, data = null) { 3 | this.success = success; 4 | this.message = message; 5 | this.data = data; 6 | } 7 | } 8 | 9 | exports.SuccessResponseObject = class SuccessResponseObject extends ( 10 | BaseResponseObject 11 | ) { 12 | constructor(message, data) { 13 | super(true, message, data); 14 | } 15 | }; 16 | 17 | exports.ErrorResponseObject = class ErrorResponseObject extends ( 18 | BaseResponseObject 19 | ) { 20 | constructor(message, data) { 21 | super(false, message, data); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/modules/googleReverseImageSearch.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const cheerio = require("cheerio"); 3 | const { 4 | SuccessResponseObject, 5 | ErrorResponseObject, 6 | } = require("../common/http"); 7 | 8 | async function reverse(imageUrl) { 9 | try { 10 | const headers = { 11 | "User-Agent": 12 | "Mozilla/5.0 (Linux; Android 6.0.1; SM-G920V Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36", 13 | }; 14 | const url = `https://images.google.com/searchbyimage?safe=off&sbisrc=tg&image_url=${imageUrl}`; 15 | const response = await axios.get(url, { headers }); 16 | 17 | const $ = cheerio.load(response.data); 18 | const result = { similarUrl: "", resultText: "" }; 19 | 20 | const similarInput = $(".gLFyf").first(); 21 | if (similarInput.length) { 22 | const similarImage = similarInput.attr("value"); 23 | const similarUrl = `https://www.google.com/search?tbm=isch&q=${encodeURIComponent( 24 | similarImage 25 | )}`; 26 | result.similarUrl = similarUrl; 27 | } else { 28 | return new ErrorResponseObject("Failed to find similar images"); 29 | } 30 | 31 | const outputDiv = $("div.r5a77d").first(); 32 | if (outputDiv.length) { 33 | const output = outputDiv.text(); 34 | let decodedText = unescape(encodeURIComponent(output)); 35 | 36 | if (decodedText.includes("Â")) { 37 | decodedText = decodedText.replace(/Â/g, " "); 38 | } 39 | result.resultText = decodedText; 40 | } else { 41 | return new ErrorResponseObject("Failed to find text output"); 42 | } 43 | 44 | return new SuccessResponseObject("Successfully Got the Result", result); 45 | } catch (error) { 46 | return new ErrorResponseObject(`Failed to reverse image: ${error.message}`); 47 | } 48 | } 49 | 50 | module.exports = { 51 | reverse, 52 | }; 53 | 54 | // For Testing 55 | /* reverse("https://graph.org/file/1668e5e51e612341b945e.jpg") 56 | .then((result) => console.log(result["success"])) 57 | .catch((error) => console.error(error.message)); 58 | */ 59 | -------------------------------------------------------------------------------- /src/modules/index.js: -------------------------------------------------------------------------------- 1 | const { reverse } = require("./googleReverseImageSearch"); 2 | 3 | module.exports = { 4 | reverse, 5 | }; 6 | -------------------------------------------------------------------------------- /src/routes/index.js: -------------------------------------------------------------------------------- 1 | const { Router } = require("express"); 2 | const { 3 | SuccessResponseObject, 4 | ErrorResponseObject, 5 | } = require("../common/http"); 6 | const { reverse } = require("../modules"); 7 | 8 | const r = Router(); 9 | 10 | r.get("/", (req, res) => 11 | res 12 | .status(200) 13 | .json( 14 | new SuccessResponseObject( 15 | "https://github.com/SOME-1HING/google-reverse-image-api" 16 | ) 17 | ) 18 | ); 19 | module.exports = r; 20 | 21 | r.post("/reverse", async (req, res) => { 22 | try { 23 | const { imageUrl } = req.body; 24 | 25 | const result = await reverse(imageUrl); 26 | if (result["success"]) { 27 | res.status(200).json(result); 28 | } else { 29 | res.status(404).json(result); 30 | } 31 | } catch (error) { 32 | console.error("/reverse error:", error); 33 | res.status(500).json(new ErrorResponseObject("Failed to reverse image")); 34 | } 35 | }); 36 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { 5 | "src": "src/app.js", 6 | "use": "@vercel/node" 7 | } 8 | ], 9 | "routes": [ 10 | { 11 | "src": "/(.*)", 12 | "dest": "src/app.js" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /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.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 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.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 16 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 17 | dependencies: 18 | normalize-path "^3.0.0" 19 | picomatch "^2.0.4" 20 | 21 | append-field@^1.0.0: 22 | version "1.0.0" 23 | resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" 24 | integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== 25 | 26 | array-flatten@1.1.1: 27 | version "1.1.1" 28 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 29 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 30 | 31 | asynckit@^0.4.0: 32 | version "0.4.0" 33 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 34 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 35 | 36 | axios@^1.6.0: 37 | version "1.7.7" 38 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" 39 | integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== 40 | dependencies: 41 | follow-redirects "^1.15.6" 42 | form-data "^4.0.0" 43 | proxy-from-env "^1.1.0" 44 | 45 | balanced-match@^1.0.0: 46 | version "1.0.2" 47 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 48 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 49 | 50 | binary-extensions@^2.0.0: 51 | version "2.3.0" 52 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 53 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 54 | 55 | body-parser@1.20.3: 56 | version "1.20.3" 57 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" 58 | integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== 59 | dependencies: 60 | bytes "3.1.2" 61 | content-type "~1.0.5" 62 | debug "2.6.9" 63 | depd "2.0.0" 64 | destroy "1.2.0" 65 | http-errors "2.0.0" 66 | iconv-lite "0.4.24" 67 | on-finished "2.4.1" 68 | qs "6.13.0" 69 | raw-body "2.5.2" 70 | type-is "~1.6.18" 71 | unpipe "1.0.0" 72 | 73 | boolbase@^1.0.0: 74 | version "1.0.0" 75 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 76 | integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== 77 | 78 | brace-expansion@^1.1.7: 79 | version "1.1.11" 80 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 81 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 82 | dependencies: 83 | balanced-match "^1.0.0" 84 | concat-map "0.0.1" 85 | 86 | braces@~3.0.2: 87 | version "3.0.3" 88 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 89 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 90 | dependencies: 91 | fill-range "^7.1.1" 92 | 93 | buffer-from@^1.0.0: 94 | version "1.1.2" 95 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 96 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 97 | 98 | busboy@^1.0.0: 99 | version "1.6.0" 100 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" 101 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 102 | dependencies: 103 | streamsearch "^1.1.0" 104 | 105 | bytes@3.1.2: 106 | version "3.1.2" 107 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 108 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 109 | 110 | call-bind@^1.0.7: 111 | version "1.0.7" 112 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" 113 | integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== 114 | dependencies: 115 | es-define-property "^1.0.0" 116 | es-errors "^1.3.0" 117 | function-bind "^1.1.2" 118 | get-intrinsic "^1.2.4" 119 | set-function-length "^1.2.1" 120 | 121 | cheerio-select@^2.1.0: 122 | version "2.1.0" 123 | resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" 124 | integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== 125 | dependencies: 126 | boolbase "^1.0.0" 127 | css-select "^5.1.0" 128 | css-what "^6.1.0" 129 | domelementtype "^2.3.0" 130 | domhandler "^5.0.3" 131 | domutils "^3.0.1" 132 | 133 | cheerio@^1.0.0-rc.12: 134 | version "1.0.0" 135 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0.tgz#1ede4895a82f26e8af71009f961a9b8cb60d6a81" 136 | integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww== 137 | dependencies: 138 | cheerio-select "^2.1.0" 139 | dom-serializer "^2.0.0" 140 | domhandler "^5.0.3" 141 | domutils "^3.1.0" 142 | encoding-sniffer "^0.2.0" 143 | htmlparser2 "^9.1.0" 144 | parse5 "^7.1.2" 145 | parse5-htmlparser2-tree-adapter "^7.0.0" 146 | parse5-parser-stream "^7.1.2" 147 | undici "^6.19.5" 148 | whatwg-mimetype "^4.0.0" 149 | 150 | chokidar@^3.5.2: 151 | version "3.6.0" 152 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 153 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 154 | dependencies: 155 | anymatch "~3.1.2" 156 | braces "~3.0.2" 157 | glob-parent "~5.1.2" 158 | is-binary-path "~2.1.0" 159 | is-glob "~4.0.1" 160 | normalize-path "~3.0.0" 161 | readdirp "~3.6.0" 162 | optionalDependencies: 163 | fsevents "~2.3.2" 164 | 165 | combined-stream@^1.0.8: 166 | version "1.0.8" 167 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 168 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 169 | dependencies: 170 | delayed-stream "~1.0.0" 171 | 172 | concat-map@0.0.1: 173 | version "0.0.1" 174 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 175 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 176 | 177 | concat-stream@^1.5.2: 178 | version "1.6.2" 179 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 180 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 181 | dependencies: 182 | buffer-from "^1.0.0" 183 | inherits "^2.0.3" 184 | readable-stream "^2.2.2" 185 | typedarray "^0.0.6" 186 | 187 | content-disposition@0.5.4: 188 | version "0.5.4" 189 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 190 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 191 | dependencies: 192 | safe-buffer "5.2.1" 193 | 194 | content-type@~1.0.4, content-type@~1.0.5: 195 | version "1.0.5" 196 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 197 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 198 | 199 | cookie-signature@1.0.6: 200 | version "1.0.6" 201 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 202 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 203 | 204 | cookie@0.7.1: 205 | version "0.7.1" 206 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" 207 | integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== 208 | 209 | core-util-is@~1.0.0: 210 | version "1.0.3" 211 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 212 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 213 | 214 | cors@^2.8.5: 215 | version "2.8.5" 216 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 217 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 218 | dependencies: 219 | object-assign "^4" 220 | vary "^1" 221 | 222 | css-select@^5.1.0: 223 | version "5.1.0" 224 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" 225 | integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== 226 | dependencies: 227 | boolbase "^1.0.0" 228 | css-what "^6.1.0" 229 | domhandler "^5.0.2" 230 | domutils "^3.0.1" 231 | nth-check "^2.0.1" 232 | 233 | css-what@^6.1.0: 234 | version "6.1.0" 235 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" 236 | integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== 237 | 238 | debug@2.6.9: 239 | version "2.6.9" 240 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 241 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 242 | dependencies: 243 | ms "2.0.0" 244 | 245 | debug@^4: 246 | version "4.3.7" 247 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" 248 | integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== 249 | dependencies: 250 | ms "^2.1.3" 251 | 252 | define-data-property@^1.1.4: 253 | version "1.1.4" 254 | resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" 255 | integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== 256 | dependencies: 257 | es-define-property "^1.0.0" 258 | es-errors "^1.3.0" 259 | gopd "^1.0.1" 260 | 261 | delayed-stream@~1.0.0: 262 | version "1.0.0" 263 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 264 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 265 | 266 | depd@2.0.0: 267 | version "2.0.0" 268 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 269 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 270 | 271 | destroy@1.2.0: 272 | version "1.2.0" 273 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 274 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 275 | 276 | dom-serializer@^2.0.0: 277 | version "2.0.0" 278 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" 279 | integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== 280 | dependencies: 281 | domelementtype "^2.3.0" 282 | domhandler "^5.0.2" 283 | entities "^4.2.0" 284 | 285 | domelementtype@^2.3.0: 286 | version "2.3.0" 287 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" 288 | integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== 289 | 290 | domhandler@^5.0.2, domhandler@^5.0.3: 291 | version "5.0.3" 292 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" 293 | integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== 294 | dependencies: 295 | domelementtype "^2.3.0" 296 | 297 | domutils@^3.0.1, domutils@^3.1.0: 298 | version "3.1.0" 299 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" 300 | integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== 301 | dependencies: 302 | dom-serializer "^2.0.0" 303 | domelementtype "^2.3.0" 304 | domhandler "^5.0.3" 305 | 306 | ee-first@1.1.1: 307 | version "1.1.1" 308 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 309 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 310 | 311 | encodeurl@~1.0.2: 312 | version "1.0.2" 313 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 314 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 315 | 316 | encodeurl@~2.0.0: 317 | version "2.0.0" 318 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" 319 | integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== 320 | 321 | encoding-sniffer@^0.2.0: 322 | version "0.2.0" 323 | resolved "https://registry.yarnpkg.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz#799569d66d443babe82af18c9f403498365ef1d5" 324 | integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg== 325 | dependencies: 326 | iconv-lite "^0.6.3" 327 | whatwg-encoding "^3.1.1" 328 | 329 | entities@^4.2.0, entities@^4.5.0: 330 | version "4.5.0" 331 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 332 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 333 | 334 | es-define-property@^1.0.0: 335 | version "1.0.0" 336 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" 337 | integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== 338 | dependencies: 339 | get-intrinsic "^1.2.4" 340 | 341 | es-errors@^1.3.0: 342 | version "1.3.0" 343 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 344 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 345 | 346 | escape-html@~1.0.3: 347 | version "1.0.3" 348 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 349 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 350 | 351 | etag@~1.8.1: 352 | version "1.8.1" 353 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 354 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 355 | 356 | express-rate-limit@^7.4.1: 357 | version "7.4.1" 358 | resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.4.1.tgz#90954ecbcde9e7ae7b5000325395f86991191d94" 359 | integrity sha512-KS3efpnpIDVIXopMc65EMbWbUht7qvTCdtCR2dD/IZmi9MIkopYESwyRqLgv8Pfu589+KqDqOdzJWW7AHoACeg== 360 | 361 | express@^4.18.2: 362 | version "4.21.1" 363 | resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" 364 | integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== 365 | dependencies: 366 | accepts "~1.3.8" 367 | array-flatten "1.1.1" 368 | body-parser "1.20.3" 369 | content-disposition "0.5.4" 370 | content-type "~1.0.4" 371 | cookie "0.7.1" 372 | cookie-signature "1.0.6" 373 | debug "2.6.9" 374 | depd "2.0.0" 375 | encodeurl "~2.0.0" 376 | escape-html "~1.0.3" 377 | etag "~1.8.1" 378 | finalhandler "1.3.1" 379 | fresh "0.5.2" 380 | http-errors "2.0.0" 381 | merge-descriptors "1.0.3" 382 | methods "~1.1.2" 383 | on-finished "2.4.1" 384 | parseurl "~1.3.3" 385 | path-to-regexp "0.1.10" 386 | proxy-addr "~2.0.7" 387 | qs "6.13.0" 388 | range-parser "~1.2.1" 389 | safe-buffer "5.2.1" 390 | send "0.19.0" 391 | serve-static "1.16.2" 392 | setprototypeof "1.2.0" 393 | statuses "2.0.1" 394 | type-is "~1.6.18" 395 | utils-merge "1.0.1" 396 | vary "~1.1.2" 397 | 398 | fill-range@^7.1.1: 399 | version "7.1.1" 400 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 401 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 402 | dependencies: 403 | to-regex-range "^5.0.1" 404 | 405 | finalhandler@1.3.1: 406 | version "1.3.1" 407 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" 408 | integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== 409 | dependencies: 410 | debug "2.6.9" 411 | encodeurl "~2.0.0" 412 | escape-html "~1.0.3" 413 | on-finished "2.4.1" 414 | parseurl "~1.3.3" 415 | statuses "2.0.1" 416 | unpipe "~1.0.0" 417 | 418 | follow-redirects@^1.15.6: 419 | version "1.15.9" 420 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" 421 | integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== 422 | 423 | form-data@^4.0.0: 424 | version "4.0.1" 425 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" 426 | integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== 427 | dependencies: 428 | asynckit "^0.4.0" 429 | combined-stream "^1.0.8" 430 | mime-types "^2.1.12" 431 | 432 | forwarded@0.2.0: 433 | version "0.2.0" 434 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 435 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 436 | 437 | fresh@0.5.2: 438 | version "0.5.2" 439 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 440 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 441 | 442 | fsevents@~2.3.2: 443 | version "2.3.3" 444 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 445 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 446 | 447 | function-bind@^1.1.2: 448 | version "1.1.2" 449 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 450 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 451 | 452 | get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: 453 | version "1.2.4" 454 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" 455 | integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== 456 | dependencies: 457 | es-errors "^1.3.0" 458 | function-bind "^1.1.2" 459 | has-proto "^1.0.1" 460 | has-symbols "^1.0.3" 461 | hasown "^2.0.0" 462 | 463 | glob-parent@~5.1.2: 464 | version "5.1.2" 465 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 466 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 467 | dependencies: 468 | is-glob "^4.0.1" 469 | 470 | gopd@^1.0.1: 471 | version "1.0.1" 472 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 473 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 474 | dependencies: 475 | get-intrinsic "^1.1.3" 476 | 477 | has-flag@^3.0.0: 478 | version "3.0.0" 479 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 480 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 481 | 482 | has-property-descriptors@^1.0.2: 483 | version "1.0.2" 484 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" 485 | integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== 486 | dependencies: 487 | es-define-property "^1.0.0" 488 | 489 | has-proto@^1.0.1: 490 | version "1.0.3" 491 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" 492 | integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== 493 | 494 | has-symbols@^1.0.3: 495 | version "1.0.3" 496 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 497 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 498 | 499 | hasown@^2.0.0: 500 | version "2.0.2" 501 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 502 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 503 | dependencies: 504 | function-bind "^1.1.2" 505 | 506 | helmet@^8.0.0: 507 | version "8.0.0" 508 | resolved "https://registry.yarnpkg.com/helmet/-/helmet-8.0.0.tgz#05370fb1953aa7b81bd0ddfa459221247be6ea5c" 509 | integrity sha512-VyusHLEIIO5mjQPUI1wpOAEu+wl6Q0998jzTxqUYGE45xCIcAxy3MsbEK/yyJUJ3ADeMoB6MornPH6GMWAf+Pw== 510 | 511 | htmlparser2@^9.1.0: 512 | version "9.1.0" 513 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23" 514 | integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== 515 | dependencies: 516 | domelementtype "^2.3.0" 517 | domhandler "^5.0.3" 518 | domutils "^3.1.0" 519 | entities "^4.5.0" 520 | 521 | http-errors@2.0.0: 522 | version "2.0.0" 523 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 524 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 525 | dependencies: 526 | depd "2.0.0" 527 | inherits "2.0.4" 528 | setprototypeof "1.2.0" 529 | statuses "2.0.1" 530 | toidentifier "1.0.1" 531 | 532 | iconv-lite@0.4.24: 533 | version "0.4.24" 534 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 535 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 536 | dependencies: 537 | safer-buffer ">= 2.1.2 < 3" 538 | 539 | iconv-lite@0.6.3, iconv-lite@^0.6.3: 540 | version "0.6.3" 541 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 542 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 543 | dependencies: 544 | safer-buffer ">= 2.1.2 < 3.0.0" 545 | 546 | ignore-by-default@^1.0.1: 547 | version "1.0.1" 548 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 549 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 550 | 551 | inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: 552 | version "2.0.4" 553 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 554 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 555 | 556 | ipaddr.js@1.9.1: 557 | version "1.9.1" 558 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 559 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 560 | 561 | is-binary-path@~2.1.0: 562 | version "2.1.0" 563 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 564 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 565 | dependencies: 566 | binary-extensions "^2.0.0" 567 | 568 | is-extglob@^2.1.1: 569 | version "2.1.1" 570 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 571 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 572 | 573 | is-glob@^4.0.1, is-glob@~4.0.1: 574 | version "4.0.3" 575 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 576 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 577 | dependencies: 578 | is-extglob "^2.1.1" 579 | 580 | is-number@^7.0.0: 581 | version "7.0.0" 582 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 583 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 584 | 585 | isarray@~1.0.0: 586 | version "1.0.0" 587 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 588 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 589 | 590 | media-typer@0.3.0: 591 | version "0.3.0" 592 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 593 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 594 | 595 | merge-descriptors@1.0.3: 596 | version "1.0.3" 597 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" 598 | integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== 599 | 600 | methods@~1.1.2: 601 | version "1.1.2" 602 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 603 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 604 | 605 | mime-db@1.52.0: 606 | version "1.52.0" 607 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 608 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 609 | 610 | mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: 611 | version "2.1.35" 612 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 613 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 614 | dependencies: 615 | mime-db "1.52.0" 616 | 617 | mime@1.6.0: 618 | version "1.6.0" 619 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 620 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 621 | 622 | minimatch@^3.1.2: 623 | version "3.1.2" 624 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 625 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 626 | dependencies: 627 | brace-expansion "^1.1.7" 628 | 629 | minimist@^1.2.6: 630 | version "1.2.8" 631 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 632 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 633 | 634 | mkdirp@^0.5.4: 635 | version "0.5.6" 636 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 637 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 638 | dependencies: 639 | minimist "^1.2.6" 640 | 641 | ms@2.0.0: 642 | version "2.0.0" 643 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 644 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 645 | 646 | ms@2.1.3, ms@^2.1.3: 647 | version "2.1.3" 648 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 649 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 650 | 651 | multer@^1.4.5-lts.1: 652 | version "1.4.5-lts.1" 653 | resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" 654 | integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== 655 | dependencies: 656 | append-field "^1.0.0" 657 | busboy "^1.0.0" 658 | concat-stream "^1.5.2" 659 | mkdirp "^0.5.4" 660 | object-assign "^4.1.1" 661 | type-is "^1.6.4" 662 | xtend "^4.0.0" 663 | 664 | negotiator@0.6.3: 665 | version "0.6.3" 666 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 667 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 668 | 669 | nodemon@^3.1.7: 670 | version "3.1.7" 671 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.7.tgz#07cb1f455f8bece6a499e0d72b5e029485521a54" 672 | integrity sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ== 673 | dependencies: 674 | chokidar "^3.5.2" 675 | debug "^4" 676 | ignore-by-default "^1.0.1" 677 | minimatch "^3.1.2" 678 | pstree.remy "^1.1.8" 679 | semver "^7.5.3" 680 | simple-update-notifier "^2.0.0" 681 | supports-color "^5.5.0" 682 | touch "^3.1.0" 683 | undefsafe "^2.0.5" 684 | 685 | normalize-path@^3.0.0, normalize-path@~3.0.0: 686 | version "3.0.0" 687 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 688 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 689 | 690 | nth-check@^2.0.1: 691 | version "2.1.1" 692 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" 693 | integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== 694 | dependencies: 695 | boolbase "^1.0.0" 696 | 697 | object-assign@^4, object-assign@^4.1.1: 698 | version "4.1.1" 699 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 700 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 701 | 702 | object-inspect@^1.13.1: 703 | version "1.13.3" 704 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" 705 | integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== 706 | 707 | on-finished@2.4.1: 708 | version "2.4.1" 709 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 710 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 711 | dependencies: 712 | ee-first "1.1.1" 713 | 714 | parse5-htmlparser2-tree-adapter@^7.0.0: 715 | version "7.1.0" 716 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b" 717 | integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== 718 | dependencies: 719 | domhandler "^5.0.3" 720 | parse5 "^7.0.0" 721 | 722 | parse5-parser-stream@^7.1.2: 723 | version "7.1.2" 724 | resolved "https://registry.yarnpkg.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1" 725 | integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== 726 | dependencies: 727 | parse5 "^7.0.0" 728 | 729 | parse5@^7.0.0, parse5@^7.1.2: 730 | version "7.2.1" 731 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" 732 | integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== 733 | dependencies: 734 | entities "^4.5.0" 735 | 736 | parseurl@~1.3.3: 737 | version "1.3.3" 738 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 739 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 740 | 741 | path-to-regexp@0.1.10: 742 | version "0.1.10" 743 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" 744 | integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== 745 | 746 | picomatch@^2.0.4, picomatch@^2.2.1: 747 | version "2.3.1" 748 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 749 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 750 | 751 | process-nextick-args@~2.0.0: 752 | version "2.0.1" 753 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 754 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 755 | 756 | proxy-addr@~2.0.7: 757 | version "2.0.7" 758 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 759 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 760 | dependencies: 761 | forwarded "0.2.0" 762 | ipaddr.js "1.9.1" 763 | 764 | proxy-from-env@^1.1.0: 765 | version "1.1.0" 766 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 767 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 768 | 769 | pstree.remy@^1.1.8: 770 | version "1.1.8" 771 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 772 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 773 | 774 | qs@6.13.0: 775 | version "6.13.0" 776 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" 777 | integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== 778 | dependencies: 779 | side-channel "^1.0.6" 780 | 781 | range-parser@~1.2.1: 782 | version "1.2.1" 783 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 784 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 785 | 786 | raw-body@2.5.2: 787 | version "2.5.2" 788 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" 789 | integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== 790 | dependencies: 791 | bytes "3.1.2" 792 | http-errors "2.0.0" 793 | iconv-lite "0.4.24" 794 | unpipe "1.0.0" 795 | 796 | readable-stream@^2.2.2: 797 | version "2.3.8" 798 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" 799 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== 800 | dependencies: 801 | core-util-is "~1.0.0" 802 | inherits "~2.0.3" 803 | isarray "~1.0.0" 804 | process-nextick-args "~2.0.0" 805 | safe-buffer "~5.1.1" 806 | string_decoder "~1.1.1" 807 | util-deprecate "~1.0.1" 808 | 809 | readdirp@~3.6.0: 810 | version "3.6.0" 811 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 812 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 813 | dependencies: 814 | picomatch "^2.2.1" 815 | 816 | safe-buffer@5.2.1: 817 | version "5.2.1" 818 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 819 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 820 | 821 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 822 | version "5.1.2" 823 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 824 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 825 | 826 | "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": 827 | version "2.1.2" 828 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 829 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 830 | 831 | semver@^7.5.3: 832 | version "7.6.3" 833 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 834 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 835 | 836 | send@0.19.0: 837 | version "0.19.0" 838 | resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" 839 | integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== 840 | dependencies: 841 | debug "2.6.9" 842 | depd "2.0.0" 843 | destroy "1.2.0" 844 | encodeurl "~1.0.2" 845 | escape-html "~1.0.3" 846 | etag "~1.8.1" 847 | fresh "0.5.2" 848 | http-errors "2.0.0" 849 | mime "1.6.0" 850 | ms "2.1.3" 851 | on-finished "2.4.1" 852 | range-parser "~1.2.1" 853 | statuses "2.0.1" 854 | 855 | serve-static@1.16.2: 856 | version "1.16.2" 857 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" 858 | integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== 859 | dependencies: 860 | encodeurl "~2.0.0" 861 | escape-html "~1.0.3" 862 | parseurl "~1.3.3" 863 | send "0.19.0" 864 | 865 | set-function-length@^1.2.1: 866 | version "1.2.2" 867 | resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" 868 | integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== 869 | dependencies: 870 | define-data-property "^1.1.4" 871 | es-errors "^1.3.0" 872 | function-bind "^1.1.2" 873 | get-intrinsic "^1.2.4" 874 | gopd "^1.0.1" 875 | has-property-descriptors "^1.0.2" 876 | 877 | setprototypeof@1.2.0: 878 | version "1.2.0" 879 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 880 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 881 | 882 | side-channel@^1.0.6: 883 | version "1.0.6" 884 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" 885 | integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== 886 | dependencies: 887 | call-bind "^1.0.7" 888 | es-errors "^1.3.0" 889 | get-intrinsic "^1.2.4" 890 | object-inspect "^1.13.1" 891 | 892 | simple-update-notifier@^2.0.0: 893 | version "2.0.0" 894 | resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" 895 | integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== 896 | dependencies: 897 | semver "^7.5.3" 898 | 899 | statuses@2.0.1: 900 | version "2.0.1" 901 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 902 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 903 | 904 | streamsearch@^1.1.0: 905 | version "1.1.0" 906 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" 907 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 908 | 909 | string_decoder@~1.1.1: 910 | version "1.1.1" 911 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 912 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 913 | dependencies: 914 | safe-buffer "~5.1.0" 915 | 916 | supports-color@^5.5.0: 917 | version "5.5.0" 918 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 919 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 920 | dependencies: 921 | has-flag "^3.0.0" 922 | 923 | to-regex-range@^5.0.1: 924 | version "5.0.1" 925 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 926 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 927 | dependencies: 928 | is-number "^7.0.0" 929 | 930 | toidentifier@1.0.1: 931 | version "1.0.1" 932 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 933 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 934 | 935 | touch@^3.1.0: 936 | version "3.1.1" 937 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" 938 | integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== 939 | 940 | type-is@^1.6.4, type-is@~1.6.18: 941 | version "1.6.18" 942 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 943 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 944 | dependencies: 945 | media-typer "0.3.0" 946 | mime-types "~2.1.24" 947 | 948 | typedarray@^0.0.6: 949 | version "0.0.6" 950 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 951 | integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== 952 | 953 | undefsafe@^2.0.5: 954 | version "2.0.5" 955 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 956 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 957 | 958 | undici@^6.19.5: 959 | version "6.21.0" 960 | resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" 961 | integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== 962 | 963 | unpipe@1.0.0, unpipe@~1.0.0: 964 | version "1.0.0" 965 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 966 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 967 | 968 | util-deprecate@~1.0.1: 969 | version "1.0.2" 970 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 971 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 972 | 973 | utils-merge@1.0.1: 974 | version "1.0.1" 975 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 976 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 977 | 978 | vary@^1, vary@~1.1.2: 979 | version "1.1.2" 980 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 981 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 982 | 983 | whatwg-encoding@^3.1.1: 984 | version "3.1.1" 985 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" 986 | integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== 987 | dependencies: 988 | iconv-lite "0.6.3" 989 | 990 | whatwg-mimetype@^4.0.0: 991 | version "4.0.0" 992 | resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" 993 | integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== 994 | 995 | xtend@^4.0.0: 996 | version "4.0.2" 997 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 998 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 999 | --------------------------------------------------------------------------------