├── client ├── .eslintrc.json ├── README.md ├── public │ ├── favicon.ico │ ├── twitter.svg │ └── vercel.svg ├── next.config.js ├── pages │ ├── _app.tsx │ └── index.tsx ├── .gitignore ├── package.json ├── tsconfig.json ├── hooks │ └── useMeQuery.ts ├── styles │ └── globals.css └── components │ └── TwitterOauthButton.tsx ├── images ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png ├── 9.png ├── 6.5.png ├── 6.6.png └── twitter-blog-image.webp ├── server ├── prisma │ ├── migrations │ │ ├── migration_lock.toml │ │ └── 20221017123506_init │ │ │ └── migration.sql │ └── schema.prisma ├── .env.example ├── tsconfig.json ├── package.json └── src │ ├── config.ts │ ├── index.ts │ └── oauth2.ts ├── package.json ├── .gitignore ├── README.md └── yarn.lock /client/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/2.png -------------------------------------------------------------------------------- /images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/3.png -------------------------------------------------------------------------------- /images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/4.png -------------------------------------------------------------------------------- /images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/5.png -------------------------------------------------------------------------------- /images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/6.png -------------------------------------------------------------------------------- /images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/7.png -------------------------------------------------------------------------------- /images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/8.png -------------------------------------------------------------------------------- /images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/9.png -------------------------------------------------------------------------------- /images/6.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/6.5.png -------------------------------------------------------------------------------- /images/6.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/6.6.png -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | run the development server: 2 | 3 | ```bash 4 | npm run dev 5 | # or 6 | yarn dev 7 | ``` 8 | -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/client/public/favicon.ico -------------------------------------------------------------------------------- /images/twitter-blog-image.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/HEAD/images/twitter-blog-image.webp -------------------------------------------------------------------------------- /server/prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "postgresql" -------------------------------------------------------------------------------- /client/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | swcMinify: true, 5 | } 6 | 7 | module.exports = nextConfig 8 | -------------------------------------------------------------------------------- /client/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import '../styles/globals.css' 2 | import type { AppProps } from 'next/app' 3 | 4 | function MyApp({ Component, pageProps }: AppProps) { 5 | return 6 | } 7 | 8 | export default MyApp 9 | -------------------------------------------------------------------------------- /server/.env.example: -------------------------------------------------------------------------------- 1 | DATABASE_URL=postgres://postgres:postgres@localhost:5432/twitter-oauth2 2 | CLIENT_URL=http://www.localhost:3000 3 | SERVER_PORT=3001 4 | JWT_SECRET=put-your-jwt-secret-here 5 | TWITTER_CLIENT_SECRET=put-your-twitter-client-secret-here -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "workspaces": [ 4 | "server", 5 | "client" 6 | ], 7 | "scripts": { 8 | "client:dev": "yarn workspace client dev", 9 | "server:dev": "yarn workspace server dev", 10 | "client:add": "yarn workspace client add", 11 | "server:add": "yarn workspace server add", 12 | "migrate-db": "yarn workspace server prisma-migrate" 13 | } 14 | } -------------------------------------------------------------------------------- /server/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | generator client { 2 | provider = "prisma-client-js" 3 | } 4 | 5 | datasource db { 6 | provider = "postgresql" 7 | url = env("DATABASE_URL") 8 | } 9 | 10 | enum UserType { 11 | local 12 | twitter 13 | } 14 | 15 | model User { 16 | id String @id @default(uuid()) 17 | name String 18 | username String @unique 19 | type UserType @default(local) 20 | } -------------------------------------------------------------------------------- /server/prisma/migrations/20221017123506_init/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateEnum 2 | CREATE TYPE "UserType" AS ENUM ('local', 'twitter'); 3 | 4 | -- CreateTable 5 | CREATE TABLE "User" ( 6 | "id" TEXT NOT NULL, 7 | "name" TEXT NOT NULL, 8 | "username" TEXT NOT NULL, 9 | "type" "UserType" NOT NULL DEFAULT 'local', 10 | 11 | CONSTRAINT "User_pkey" PRIMARY KEY ("id") 12 | ); 13 | 14 | -- CreateIndex 15 | CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); 16 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/*.pem 2 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 3 | 4 | # dependencies 5 | **/node_modules 6 | /.pnp 7 | .pnp.js 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | .pnpm-debug.log* 28 | 29 | # local env files 30 | .env*.local 31 | **/.env 32 | 33 | # vercel 34 | .vercel 35 | 36 | # typescript 37 | *.tsbuildinfo 38 | next-env.d.ts 39 | **/dist -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "next": "12.3.1", 13 | "react": "18.2.0", 14 | "react-dom": "18.2.0" 15 | }, 16 | "devDependencies": { 17 | "@types/node": "18.11.0", 18 | "@types/react": "18.0.21", 19 | "@types/react-dom": "18.0.6", 20 | "eslint": "8.25.0", 21 | "eslint-config-next": "12.3.1", 22 | "typescript": "4.8.4" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true 17 | }, 18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /client/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from "next"; 2 | import { TwitterOauthButton } from "../components/TwitterOauthButton"; 3 | import { useMeQuery } from "../hooks/useMeQuery"; 4 | 5 | const Home: NextPage = () => { 6 | const { data: user } = useMeQuery(); 7 | return ( 8 |
9 |

Hello!

10 | {user ? (// user present so only display user's name 11 |

{user.name}

12 | ) : (// user not present so prompt to login 13 |
14 |

You are not Logged in! Login with:

15 | 16 |
17 | )} 18 |
19 | ); 20 | }; 21 | 22 | export default Home; 23 | -------------------------------------------------------------------------------- /client/hooks/useMeQuery.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import axios, { AxiosResponse } from "axios"; 3 | 4 | export type User = { 5 | id: string; 6 | name: string; 7 | username: string; 8 | type: "local" | "twitter"; 9 | }; 10 | 11 | export function useMeQuery() { 12 | const [error, setError] = useState(null); 13 | const [loading, setLoading] = useState(true); 14 | const [data, setData] = useState(null); 15 | 16 | useEffect(() => { 17 | setLoading(true); 18 | axios 19 | .get>(`http://www.localhost:3001/me`, { 20 | withCredentials: true, 21 | }) 22 | .then((v) => { 23 | if (v.data) setData(v.data); 24 | }) 25 | .catch(() => setError("Not Authenticated")) 26 | .finally(() => setLoading(false)); 27 | }, []); 28 | 29 | return { error, data, loading }; 30 | } -------------------------------------------------------------------------------- /client/styles/globals.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | padding: 0; 4 | margin: 0; 5 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 6 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 7 | } 8 | 9 | a { 10 | color: inherit; 11 | text-decoration: none; 12 | } 13 | 14 | .column-container { 15 | display: flex; 16 | flex-direction: column; 17 | justify-content: center; 18 | align-items: center; 19 | } 20 | 21 | .row-container { 22 | display: flex; 23 | flex-direction: row; 24 | justify-content: center; 25 | align-items: center; 26 | } 27 | 28 | .a-button { 29 | border: 2px solid grey; 30 | border-radius: 5px; 31 | } 32 | 33 | .a-button:hover { 34 | background-color: #111133; 35 | } 36 | 37 | @media (prefers-color-scheme: dark) { 38 | html { 39 | color-scheme: dark; 40 | } 41 | body { 42 | color: white; 43 | background: black; 44 | } 45 | } -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2018", 4 | "module": "commonjs", 5 | "lib": [ 6 | "esnext", "esnext.asynciterable" 7 | ], 8 | "strict": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "declaration": true, 12 | "moduleResolution": "node", 13 | "noImplicitAny": true, 14 | "strictNullChecks": true, 15 | "strictFunctionTypes": true, 16 | "noImplicitThis": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noImplicitReturns": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "allowSyntheticDefaultImports": true, 22 | "esModuleInterop": true, 23 | "emitDecoratorMetadata": true, 24 | "experimentalDecorators": true, 25 | "resolveJsonModule": true, 26 | "incremental": false, 27 | "baseUrl": "./src", 28 | "watch": false, 29 | "removeComments": true, 30 | "outDir": "./dist", 31 | "rootDir": "./src" 32 | }, 33 | "types": ["node"], 34 | "include": ["./src/**/*.ts"], 35 | } -------------------------------------------------------------------------------- /client/public/twitter.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "start": "node dist/index.js", 6 | "build": "tsc --sourceMap false", 7 | "build:watch": "tsc -w", 8 | "start:watch": "nodemon dist/index.js", 9 | "dev": "concurrently \"yarn build:watch\" \"yarn start:watch\" --names \"tsc,node\" -c \"blue,green\"", 10 | "test": "jest", 11 | "prisma-migrate": "prisma migrate dev", 12 | "prisma-gen": "prisma generate" 13 | }, 14 | "license": "MIT", 15 | "dependencies": { 16 | "@prisma/client": "^4.4.0", 17 | "argon2": "^0.30.1", 18 | "axios": "^1.1.3", 19 | "cookie-parser": "^1.4.6", 20 | "cors": "^2.8.5", 21 | "dotenv": "^16.0.3", 22 | "express": "^4.18.2", 23 | "jsonwebtoken": "^8.5.1" 24 | }, 25 | "devDependencies": { 26 | "@types/cookie-parser": "^1.4.3", 27 | "@types/cors": "^2.8.12", 28 | "@types/express": "^4.17.14", 29 | "@types/jsonwebtoken": "^8.5.9", 30 | "@types/node": "^18.11.0", 31 | "concurrently": "^7.4.0", 32 | "nodemon": "^2.0.20", 33 | "prisma": "^4.4.0", 34 | "typescript": "^4.8.4" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /client/components/TwitterOauthButton.tsx: -------------------------------------------------------------------------------- 1 | import twitterIcon from "../public/twitter.svg"; 2 | import Image from "next/image"; 3 | 4 | const TWITTER_CLIENT_ID = "T1dLaHdFSWVfTnEtQ2psZThTbnI6MTpjaQ" // give your twitter client id here 5 | 6 | // twitter oauth Url constructor 7 | function getTwitterOauthUrl() { 8 | const rootUrl = "https://twitter.com/i/oauth2/authorize"; 9 | const options = { 10 | redirect_uri: "http://www.localhost:3001/oauth/twitter", // client url cannot be http://localhost:3000/ or http://127.0.0.1:3000/ 11 | client_id: TWITTER_CLIENT_ID, 12 | state: "state", 13 | response_type: "code", 14 | code_challenge: "y_SfRG4BmOES02uqWeIkIgLQAlTBggyf_G7uKT51ku8", 15 | code_challenge_method: "S256", 16 | scope: ["users.read", "tweet.read", "follows.read", "follows.write"].join(" "), 17 | }; 18 | const qs = new URLSearchParams(options).toString(); 19 | return `${rootUrl}?${qs}`; 20 | } 21 | 22 | // the component 23 | export function TwitterOauthButton() { 24 | return ( 25 | 26 | twitter icon 27 |

{" twitter"}

28 |
29 | ); 30 | } -------------------------------------------------------------------------------- /server/src/config.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient, User } from "@prisma/client" 2 | import { CookieOptions, Response } from "express"; 3 | import { TwitterUser } from "./oauth2"; 4 | import jwt from "jsonwebtoken"; 5 | 6 | export const CLIENT_URL = process.env.CLIENT_URL! 7 | export const SERVER_PORT = process.env.SERVER_PORT! 8 | export const prisma = new PrismaClient() 9 | 10 | // step 3 11 | export function upsertUser(twitterUser: TwitterUser) { 12 | // create a new user in our database or return an old user who already signed up earlier 13 | return prisma.user.upsert({ 14 | create: { 15 | username: twitterUser.username, 16 | id: twitterUser.id, 17 | name: twitterUser.name, 18 | type: "twitter", 19 | }, 20 | update: { 21 | id: twitterUser.id, 22 | }, 23 | where: { id: twitterUser.id}, 24 | }); 25 | } 26 | 27 | // JWT_SECRET from our environment variable file 28 | export const JWT_SECRET = process.env.JWT_SECRET! 29 | 30 | // cookie name 31 | export const COOKIE_NAME = 'oauth2_token' 32 | 33 | // cookie setting options 34 | const cookieOptions: CookieOptions = { 35 | httpOnly: true, 36 | sameSite: "strict" 37 | } 38 | 39 | // step 4 40 | export function addCookieToRes(res: Response, user: User, accessToken: string) { 41 | const { id, type } = user; 42 | const token = jwt.sign({ // Signing the token to send to client side 43 | id, 44 | accessToken, 45 | type 46 | }, JWT_SECRET); 47 | res.cookie(COOKIE_NAME, token, { // adding the cookie to response here 48 | ...cookieOptions, 49 | expires: new Date(Date.now() + 7200 * 1000), 50 | }); 51 | } -------------------------------------------------------------------------------- /server/src/index.ts: -------------------------------------------------------------------------------- 1 | import { CLIENT_URL, COOKIE_NAME, JWT_SECRET, prisma, SERVER_PORT } from "./config"; 2 | import cookieParser from "cookie-parser"; 3 | import cors from "cors"; 4 | import express from "express"; 5 | import jwt from 'jsonwebtoken' 6 | import { getTwitterUser, twitterOauth } from "./oauth2"; 7 | import { User } from "@prisma/client"; 8 | 9 | const app = express(); 10 | const origin= [CLIENT_URL]; 11 | app.use(cookieParser()); 12 | app.use(cors({ 13 | origin, 14 | credentials: true 15 | })) 16 | app.get("/ping", (_, res) => res.json("pong")); 17 | 18 | type UserJWTPayload = Pick & {accessToken: string} 19 | 20 | app.get('/me', async (req, res)=>{ 21 | try { 22 | const token = req.cookies[COOKIE_NAME]; 23 | if (!token) { 24 | throw new Error("Not Authenticated"); 25 | } 26 | const payload = await jwt.verify(token, JWT_SECRET) as UserJWTPayload; 27 | const userFromDb = await prisma.user.findUnique({ 28 | where: { id: payload?.id }, 29 | }); 30 | if (!userFromDb) throw new Error("Not Authenticated"); 31 | if (userFromDb.type === "twitter") { 32 | if (!payload.accessToken) { 33 | throw new Error("Not Authenticated"); 34 | } 35 | const twUser = await getTwitterUser(payload.accessToken); 36 | if (twUser?.id !== userFromDb.id) { 37 | throw new Error("Not Authenticated"); 38 | } 39 | } 40 | res.json(userFromDb) 41 | } catch (err) { 42 | res.status(401).json("Not Authenticated") 43 | } 44 | }) 45 | 46 | // activate twitterOauth function when visiting the route 47 | app.get("/oauth/twitter", twitterOauth); 48 | app.listen(SERVER_PORT, () => console.log(`Server listening on port ${SERVER_PORT}`)) -------------------------------------------------------------------------------- /server/src/oauth2.ts: -------------------------------------------------------------------------------- 1 | import { addCookieToRes, CLIENT_URL, upsertUser } from "./config"; 2 | import axios from "axios"; 3 | import { Request, Response } from "express"; 4 | 5 | // add your client id and secret here: 6 | const TWITTER_OAUTH_CLIENT_ID = "T1dLaHdFSWVfTnEtQ2psZThTbnI6MTpjaQ"; 7 | const TWITTER_OAUTH_CLIENT_SECRET = process.env.TWITTER_CLIENT_SECRET!; 8 | 9 | // the url where we get the twitter access token from 10 | const TWITTER_OAUTH_TOKEN_URL = "https://api.twitter.com/2/oauth2/token"; 11 | 12 | // we need to encrypt our twitter client id and secret here in base 64 (stated in twitter documentation) 13 | const BasicAuthToken = Buffer.from(`${TWITTER_OAUTH_CLIENT_ID}:${TWITTER_OAUTH_CLIENT_SECRET}`, "utf8").toString( 14 | "base64" 15 | ); 16 | 17 | // filling up the query parameters needed to request for getting the token 18 | export const twitterOauthTokenParams = { 19 | client_id: TWITTER_OAUTH_CLIENT_ID, 20 | code_verifier: "8KxxO-RPl0bLSxX5AWwgdiFbMnry_VOKzFeIlVA7NoA", 21 | redirect_uri: `http://www.localhost:3001/oauth/twitter`, 22 | grant_type: "authorization_code", 23 | }; 24 | 25 | // the shape of the object we should recieve from twitter in the request 26 | type TwitterTokenResponse = { 27 | token_type: "bearer"; 28 | expires_in: 7200; 29 | access_token: string; 30 | scope: string; 31 | }; 32 | 33 | // the main step 1 function, getting the access token from twitter using the code that the twitter sent us 34 | export async function getTwitterOAuthToken(code: string) { 35 | try { 36 | // POST request to the token url to get the access token 37 | const res = await axios.post( 38 | TWITTER_OAUTH_TOKEN_URL, 39 | new URLSearchParams({ ...twitterOauthTokenParams, code }).toString(), 40 | { 41 | headers: { 42 | "Content-Type": "application/x-www-form-urlencoded", 43 | Authorization: `Basic ${BasicAuthToken}`, 44 | }, 45 | } 46 | ); 47 | 48 | return res.data; 49 | } catch (err) { 50 | return null; 51 | } 52 | } 53 | 54 | // the shape of the response we should get 55 | export interface TwitterUser { 56 | id: string; 57 | name: string; 58 | username: string; 59 | } 60 | 61 | // getting the twitter user from access token 62 | export async function getTwitterUser(accessToken: string): Promise { 63 | try { 64 | // request GET https://api.twitter.com/2/users/me 65 | const res = await axios.get<{ data: TwitterUser }>("https://api.twitter.com/2/users/me", { 66 | headers: { 67 | "Content-type": "application/json", 68 | // put the access token in the Authorization Bearer token 69 | Authorization: `Bearer ${accessToken}`, 70 | }, 71 | }); 72 | 73 | return res.data.data ?? null; 74 | } catch (err) { 75 | return null; 76 | } 77 | } 78 | 79 | // the function which will be called when twitter redirects to the server at https://www.localhost:3001/oauth/twitter 80 | export async function twitterOauth(req: Request, res: Response) { 81 | const code = req.query.code; 82 | 83 | // 1. get the access token with the code 84 | const twitterOAuthToken = await getTwitterOAuthToken(code); 85 | 86 | if (!twitterOAuthToken) { 87 | // redirect if no auth token 88 | return res.redirect(CLIENT_URL); 89 | } 90 | 91 | // 2. get the twitter user using the access token 92 | const twitterUser = await getTwitterUser(twitterOAuthToken.access_token); 93 | 94 | if (!twitterUser) { 95 | // redirect if no twitter user 96 | return res.redirect(CLIENT_URL); 97 | } 98 | 99 | // 3. upsert the user in our db 100 | const user = await upsertUser(twitterUser); 101 | 102 | // 4. create cookie so that the server can validate the user 103 | addCookieToRes(res, user, twitterOAuthToken.access_token); 104 | 105 | // 5. finally redirect to the client 106 | return res.redirect(CLIENT_URL); 107 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Implementing Authentication with Twitter OAuth 2.0 using Typescript, Express.js and Next.js 2 | 3 | ## Implementing Authentication with Twitter OAuth 2.0 using Typescript, Node.js, Express.js and Next.js in a Full Stack Application 4 | 5 | ## Table of contents 6 | 7 | - [Implementing Authentication with Twitter OAuth 2.0 using Typescript, Express.js and Next.js](#implementing-authentication-with-twitter-oauth-20-using-typescript-expressjs-and-nextjs) 8 | - [Implementing Authentication with Twitter OAuth 2.0 using Typescript, Node.js, Express.js and Next.js in a Full Stack Application](#implementing-authentication-with-twitter-oauth-20-using-typescript-nodejs-expressjs-and-nextjs-in-a-full-stack-application) 9 | - [Table of contents](#table-of-contents) 10 | - [What will we learn](#what-will-we-learn) 11 | - [Requirements](#requirements) 12 | - [Project Setup](#project-setup) 13 | - [Client setup](#client-setup) 14 | - [Server setup](#server-setup) 15 | - [Twitter OAuth2 Implementation](#twitter-oauth2-implementation) 16 | - [Setup twitter user authentication settings](#setup-twitter-user-authentication-settings) 17 | - [Client](#client) 18 | - [Frontend authentication button](#frontend-authentication-button) 19 | - [Me query](#me-query) 20 | - [Styling](#styling) 21 | - [Server](#server) 22 | - [Getting the access token with the code](#getting-the-access-token-with-the-code) 23 | - [Getting the Twitter User from access token](#getting-the-twitter-user-from-access-token) 24 | - [Checking if they work](#checking-if-they-work) 25 | - [Finishing the web app](#finishing-the-web-app) 26 | - [Conclusion](#conclusion) 27 | 28 | ## What will we learn 29 | Here, we will learn to implement authentication using Twitter OAuth 2.0 on a minimal working full-stack web application. We will not be using Passport.js or similar libraries to handle authentication for us. As a result, we will understand the OAuth 2.0 flow better. We will also learn about the following stacks: 30 | - [express.js](https://expressjs.com/) backend framework 31 | - [prisma](https://www.prisma.io/) to create and login users, you can really use anything to communicate with any database. 32 | - [next.js](https://nextjs.org/), a [React.js](https://reactjs.org/) framework, for the frontend 33 | - [typescript](https://www.typescriptlang.org/) (optional) type-safety for javascript 34 | 35 | ## Requirements 36 | Anyone with a basic knowledge of javascript can follow along with this blog. 37 | If you already have a similar project setup, you can also jump straight to the [Twitter OAuth2 Implementation](#twitter-oauth2-implementation) section. 38 | 39 | ## Project Setup 40 | Firstly, let's add a `package.json` file at the root directory and add the following content: 41 | 42 | ```json 43 | { 44 | "private": true, 45 | "workspaces": [ 46 | "server", 47 | "client" 48 | ], 49 | "scripts": { 50 | "client:dev": "yarn workspace client dev", 51 | "server:dev": "yarn workspace server dev", 52 | "client:add": "yarn workspace client add", 53 | "server:add": "yarn workspace server add", 54 | "migrate-db": "yarn workspace server prisma-migrate" 55 | } 56 | } 57 | ``` 58 | You can set up version control in this directory, but that is optional. Either way, we will now add a client and server for our web app. 59 | ### Client setup 60 | Make a Next.js app by running the following commands: 61 | ```bash 62 | yarn create next-app --typescript client 63 | ``` 64 | Skip the `--typescript` flag if you want to work with javascript. 65 | 66 | This will create a `client` folder in the project directory. Navigate there and delete the files we don't need, i.e. `client\styles\Home.module.css` and `client\pages\api`. Also, let's replace all the code in `client\pages\index.ts` with the following: 67 | ```ts 68 | import { NextPage } from "next"; 69 | 70 | const Home: NextPage = () => { 71 | return ( 72 |
73 |

Hello!

74 |
75 | ); 76 | }; 77 | 78 | export default Home; 79 | ``` 80 | Starting the client with our command `yarn client:dev` and going to the address at http://www.localhost:3000/ should display a webpage saying `Hello!` 81 | 82 | ![Web page saying hello!](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/1.png) 83 | 84 | Now that the frontend is set up, let's move on to our backend. 85 | 86 | ### Server setup 87 | Make a directory called `server` and make a `package.json` file in the project directory with the following content: 88 | ```json 89 | { 90 | "name": "server", 91 | "version": "1.0.0", 92 | "scripts": { 93 | "start": "node dist/index.js", 94 | "build": "tsc --sourceMap false", 95 | "build:watch": "tsc -w", 96 | "start:watch": "nodemon dist/index.js", 97 | "dev": "concurrently \"yarn build:watch\" \"yarn start:watch\" --names \"tsc,node\" -c \"blue,green\"", 98 | "prisma-migrate": "prisma migrate dev", 99 | "prisma-gen": "prisma generate" 100 | } 101 | } 102 | ``` 103 | Here, we added various scripts to help us in our development stage. We will mostly use the `dev` and the `migrate-db` scripts. They allow us to start the server in watch mode and let us migrate the database respectively. Now we can return to the workspace directory and use our `yarn server:add` to add packages. So its time to install the required dependencies using the following commands in the terminal: 104 | ```bash 105 | yarn server:add @prisma/client argon2 axios cookie-parser cors dotenv express jsonwebtoken 106 | ``` 107 | ```bash 108 | yarn server:add -D nodemon prisma typescript concurrently @types/cookie-parser @types/cors @types/express @types/jsonwebtoken @types/node 109 | ``` 110 | After installing the dependencies we need, make a few files to have a minimal running express server: 111 | - `server/tsconfig.json` Edit according to preferences or skip if not using typescript 112 | ```json 113 | { 114 | "compilerOptions": { 115 | "target": "ES2018", 116 | "module": "commonjs", 117 | "lib": [ 118 | "esnext", "esnext.asynciterable" 119 | ], 120 | "strict": true, 121 | "skipLibCheck": true, 122 | "sourceMap": true, 123 | "declaration": true, 124 | "moduleResolution": "node", 125 | "noImplicitAny": true, 126 | "strictNullChecks": true, 127 | "strictFunctionTypes": true, 128 | "noImplicitThis": true, 129 | "noUnusedLocals": true, 130 | "noUnusedParameters": true, 131 | "noImplicitReturns": true, 132 | "noFallthroughCasesInSwitch": true, 133 | "allowSyntheticDefaultImports": true, 134 | "esModuleInterop": true, 135 | "emitDecoratorMetadata": true, 136 | "experimentalDecorators": true, 137 | "resolveJsonModule": true, 138 | "incremental": false, 139 | "baseUrl": "./src", 140 | "watch": false, 141 | "removeComments": true, 142 | "outDir": "./dist", 143 | "rootDir": "./src" 144 | }, 145 | "types": ["node"], 146 | "include": ["./src/**/*.ts"], 147 | } 148 | ``` 149 | - `server/src/index.ts` to listen to the server. 150 | ```ts 151 | import { CLIENT_URL, SERVER_PORT } from "./config"; 152 | import cookieParser from "cookie-parser"; 153 | import cors from "cors"; 154 | import express from "express"; 155 | 156 | const app = express(); 157 | 158 | const origin = [CLIENT_URL]; 159 | 160 | app.use(cookieParser()); 161 | app.use(cors({ 162 | origin, 163 | credentials: true 164 | })) 165 | 166 | app.get("/ping", (_, res) => res.json("pong")); 167 | 168 | app.listen(SERVER_PORT, () => console.log(`Server listening on port ${SERVER_PORT}`)) 169 | ``` 170 | - `server/src/config.ts` to export some constant configuration variables 171 | ```ts 172 | import { PrismaClient } from "@prisma/client" 173 | 174 | export const CLIENT_URL = process.env.CLIENT_URL! 175 | export const SERVER_PORT = process.env.SERVER_PORT! 176 | 177 | export const prisma = new PrismaClient() 178 | ``` 179 | - `server/.env` to setup the port, client URL and database URL for the server. Make sure to ignore this file if you are working with version control 180 | ```dotenv 181 | DATABASE_URL=postgres://postgres:postgres@localhost:5432/twitter-oauth2 182 | CLIENT_URL=http://www.localhost:3000 183 | SERVER_PORT=3001 184 | ``` 185 | - `server/prisma/schema.prisma` to let prisma handle the database structure 186 | ```prisma 187 | generator client { 188 | provider = "prisma-client-js" 189 | } 190 | 191 | datasource db { 192 | provider = "postgresql" 193 | url = env("DATABASE_URL") 194 | } 195 | 196 | enum UserType { 197 | local 198 | twitter 199 | } 200 | 201 | model User { 202 | id String @id @default(uuid()) 203 | name String 204 | username String @unique 205 | type UserType @default(local) 206 | } 207 | ``` 208 | Now migrate the database using the `yarn migrate-db` command, and then we can run the server using `yarn server:dev`. 209 | 210 | We should now be able to ping our server at http://localhost:3001/ping 211 | 212 | ![Response of the request is "pong"](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/2.png) 213 | 214 | ## Twitter OAuth2 Implementation 215 | We are ready to implement authentication via Twitter OAuth 2.0 into our app. We will follow [this](https://developer.twitter.com/en/docs/authentication/oauth-2-0/authorization-code) approach to do so. 216 | Firstly, we have to make an app on Twitter. 217 | ### Setup twitter user authentication settings 218 | Head over to [twitter's developer portal](https://developer.twitter.com/en/portal/dashboard) and make a project and a development app in the project with any name. Twitter will show you the things needed. It may take a few hours to get approval from Twitter to make these apps. Once it is done, head over to the settings page of the app to set some necessary fields. 219 | Set up or edit the user authentication as needed by your app. 220 | 221 | ![Edit user authentication set up](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/3.png) 222 | 223 | As I only need to read profile information for this minimal web app, these are the settings I used: 224 | 225 | ![App permissions: Read, no request emails; App type: Web app](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/4.png) 226 | 227 | ![Callback URI: http://www.localhost:3001/oauth/twitter, Website URL: http://www.localhost:3000](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/5.png) 228 | 229 | Save the Twitter Client ID and client secret securely. 230 | > **Note**: http://www.localhost:3000 works but not http://localhost:3000. 231 | > So, I added `www.` in both websites. 232 | 233 | ### Client 234 | #### Frontend authentication button 235 | Now we add the button in the client, which will lead to our backend for authentication. 236 | To do so, we need to use a valid Twitter OAuth URL getter function and a button to go to the URL. 237 | ```ts 238 | import twitterIcon from "../public/twitter.svg"; 239 | import Image from "next/image"; 240 | 241 | const TWITTER_CLIENT_ID = "T1dLaHdFSWVfTnEtQ2psZThTbnI6MTpjaQ" // give your twitter client id here 242 | 243 | // twitter oauth Url constructor 244 | function getTwitterOauthUrl() { 245 | const rootUrl = "https://twitter.com/i/oauth2/authorize"; 246 | const options = { 247 | redirect_uri: "http://www.localhost:3001/oauth/twitter", // client url cannot be http://localhost:3000/ or http://127.0.0.1:3000/ 248 | client_id: TWITTER_CLIENT_ID, 249 | state: "state", 250 | response_type: "code", 251 | code_challenge: "y_SfRG4BmOES02uqWeIkIgLQAlTBggyf_G7uKT51ku8", 252 | code_challenge_method: "S256", 253 | scope: ["users.read", "tweet.read", "follows.read", "follows.write"].join(" "), // add/remove scopes as needed 254 | }; 255 | const qs = new URLSearchParams(options).toString(); 256 | return `${rootUrl}?${qs}`; 257 | } 258 | 259 | // the component 260 | export function TwitterOauthButton() { 261 | return ( 262 | 263 | twitter icon 264 |

{" twitter"}

265 |
266 | ); 267 | } 268 | ``` 269 | > **Note**: We are hard coding `code_challenge` and `code_verifier` for simplicity. You can randomly generate it. 270 | 271 | After adding the above code in `client\components\TwitterOauthButton.tsx`, we will add a twitter SVG icon (from online resources like [this](https://icons8.com/icons/set/twitter)) on path `client\public\twitter.svg`. 272 | Then we will import the component on the homepage: 273 | ```ts 274 | import { TwitterOauthButton } from "../components/TwitterOauthButton"; 275 | 276 | const Home: NextPage = () => { 277 | return ( 278 |
279 |

Hello!

280 | 281 |
282 | ); 283 | }; 284 | ``` 285 | This is how it should look like afterwards: 286 | 287 | ![Webpage with Twitter icon and text, "Hello! twitter"](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/6.png) 288 | 289 | Clicking on the Twitter icon will lead us to the Twitter page where we can authorize the app: 290 | 291 | ![Twitter interface asking whether to authorize app or cancel](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/6.5.png) 292 | 293 | Of course, clicking on the `authorize app` button leads to a `Cannot GET /oauth/twitter` response, as we haven't implemented the backend yet. 294 | 295 | #### Me query 296 | Let's request for the current logged in user from the frontend through a hook, `client\hooks\useMeQuery.ts`: 297 | ```ts 298 | import { useEffect, useState } from "react"; 299 | import axios, { AxiosResponse } from "axios"; 300 | 301 | export type User = { 302 | id: string; 303 | name: string; 304 | username: string; 305 | type: "local" | "twitter"; 306 | }; 307 | 308 | export function useMeQuery() { 309 | const [error, setError] = useState(null); 310 | const [loading, setLoading] = useState(true); 311 | const [data, setData] = useState(null); 312 | 313 | useEffect(() => { 314 | setLoading(true); 315 | axios 316 | .get>(`http://www.localhost:3001/me`, { 317 | withCredentials: true, 318 | }) 319 | .then((v) => { 320 | if (v.data) setData(v.data); 321 | }) 322 | .catch(() => setError("Not Authenticated")) 323 | .finally(() => setLoading(false)); 324 | }, []); 325 | 326 | return { error, data, loading }; 327 | } 328 | ``` 329 | This will do a good enough job for our minimal app. We will use it to determine what to render. We will render the username if we get a user from the hook. Otherwise, we will render the `Login with Twitter` button 330 | ```ts 331 | import type { NextPage } from "next"; 332 | import { TwitterOauthButton } from "../components/TwitterOauthButton"; 333 | import { useMeQuery } from "../hooks/useMeQuery"; 334 | 335 | const Home: NextPage = () => { 336 | const { data: user } = useMeQuery(); 337 | return ( 338 |
339 |

Hello!

340 | {user ? (// user present so only display user's name 341 |

{user.name}

342 | ) : (// user not present so prompt to login 343 |
344 |

You are not Logged in! Login with:

345 | 346 |
347 | )} 348 |
349 | ); 350 | }; 351 | 352 | export default Home; 353 | ``` 354 | The above is how the final `client\pages\index.tsx` will look like. Go to http://www.localhost:3000 and inspect the network window of the browser while the page is loading. You should see the Me query being executed there. 355 | 356 | ![Information about the query GET http://www.localhost:3001/me which failed with status 404](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/6.6.png) 357 | 358 | > Its 404 because we havent implemented it in the backend 359 | 360 | #### Styling 361 | 362 | Let's just add some basic styling while we are at it by modifying the `client\styles\globals.css` file: 363 | ```css 364 | html, 365 | body { 366 | padding: 0; 367 | margin: 0; 368 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 369 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 370 | } 371 | 372 | a { 373 | color: inherit; 374 | text-decoration: none; 375 | } 376 | 377 | .column-container { 378 | display: flex; 379 | flex-direction: column; 380 | justify-content: center; 381 | align-items: center; 382 | } 383 | 384 | .row-container { 385 | display: flex; 386 | flex-direction: row; 387 | justify-content: center; 388 | align-items: center; 389 | } 390 | 391 | .a-button { 392 | border: 2px solid grey; 393 | border-radius: 5px; 394 | } 395 | 396 | .a-button:hover { 397 | background-color: #111133; 398 | } 399 | 400 | @media (prefers-color-scheme: dark) { 401 | html { 402 | color-scheme: dark; 403 | } 404 | body { 405 | color: white; 406 | background: black; 407 | } 408 | } 409 | ``` 410 | 411 | That is all we have to do on our client-side. The final homepage should look like this: 412 | 413 | ![Webpage saying to log in by clicking on the below twitter logo button](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/7.png) 414 | 415 | 416 | ### Server 417 | 418 | As we saw from our frontend, we need to implement `GET /oauth/twitter` route in our server to make the Twitter OAuth part of the app work. A look at the [twitter documentation](https://developer.twitter.com/en/docs/authentication/oauth-2-0/user-access-token) reveals the steps we need to perform so that we can read the info we mentioned in our scopes [here](#frontend-authentication-button). 419 | These steps are summarized below: 420 | 1. getting the access token 421 | 2. getting the Twitter user from the access token 422 | 3. upsert the user in our database 423 | 4. create cookie so that the server can validate the user 424 | 5. redirect to the client with the cookie 425 | 426 | > **Note**: Only the first two steps are related to Twitter OAuth Implementation 427 | 428 | Lets add a file `server\src\oauth2.ts` where we will add our OAuth related codes. We will complete the steps above by defining a function there: 429 | ```ts 430 | // the function which will be called when twitter redirects to the server at http://www.localhost:3001/oauth/twitter 431 | export async function twitterOauth(req: Request, res: Response) { 432 | const code = req.query.code; // getting the code if the user authorized the app 433 | 434 | // 1. get the access token with the code 435 | 436 | // 2. get the twitter user using the access token 437 | 438 | // 3. upsert the user in our db 439 | 440 | // 4. create cookie so that the server can validate the user 441 | 442 | // 5. finally redirect to the client 443 | 444 | return res.redirect(CLIENT_URL); 445 | } 446 | ``` 447 | 448 | Before doing any of that make sure we the Twitter OAuth client secret in our `.env` file. We will also add a JWT secret there so that we can encrypt the cookie we send to the client. The final `.env` file should look like this: 449 | ```env 450 | DATABASE_URL=postgres://postgres:postgres@localhost:5432/twitter-oauth2 451 | CLIENT_URL=http://www.localhost:3000 452 | SERVER_PORT=3001 453 | JWT_SECRET=put-your-jwt-secret-here 454 | TWITTER_CLIENT_SECRET=put-your-twitter-client-secret-here 455 | ``` 456 | #### Getting the access token with the code 457 | Add the following code(the commented lines explain what they do) to get the access token: 458 | ```ts 459 | // add your client id and secret here: 460 | const TWITTER_OAUTH_CLIENT_ID = "T1dLaHdFSWVfTnEtQ2psZThTbnI6MTpjaQ"; 461 | const TWITTER_OAUTH_CLIENT_SECRET = process.env.TWITTER_CLIENT_SECRET!; 462 | 463 | // the url where we get the twitter access token from 464 | const TWITTER_OAUTH_TOKEN_URL = "https://api.twitter.com/2/oauth2/token"; 465 | 466 | // we need to encrypt our twitter client id and secret here in base 64 (stated in twitter documentation) 467 | const BasicAuthToken = Buffer.from(`${TWITTER_OAUTH_CLIENT_ID}:${TWITTER_OAUTH_CLIENT_SECRET}`, "utf8").toString( 468 | "base64" 469 | ); 470 | 471 | // filling up the query parameters needed to request for getting the token 472 | export const twitterOauthTokenParams = { 473 | client_id: TWITTER_OAUTH_CLIENT_ID, 474 | // based on code_challenge 475 | code_verifier: "8KxxO-RPl0bLSxX5AWwgdiFbMnry_VOKzFeIlVA7NoA", 476 | redirect_uri: `http://www.localhost:3001/oauth/twitter`, 477 | grant_type: "authorization_code", 478 | }; 479 | 480 | // the shape of the object we should recieve from twitter in the request 481 | type TwitterTokenResponse = { 482 | token_type: "bearer"; 483 | expires_in: 7200; 484 | access_token: string; 485 | scope: string; 486 | }; 487 | 488 | // the main step 1 function, getting the access token from twitter using the code that twitter sent us 489 | export async function getTwitterOAuthToken(code: string) { 490 | try { 491 | // POST request to the token url to get the access token 492 | const res = await axios.post( 493 | TWITTER_OAUTH_TOKEN_URL, 494 | new URLSearchParams({ ...twitterOauthTokenParams, code }).toString(), 495 | { 496 | headers: { 497 | "Content-Type": "application/x-www-form-urlencoded", 498 | Authorization: `Basic ${BasicAuthToken}`, 499 | }, 500 | } 501 | ); 502 | 503 | return res.data; 504 | } catch (err) { 505 | console.error(err); 506 | 507 | return null; 508 | } 509 | } 510 | ``` 511 | 512 | #### Getting the Twitter User from access token 513 | Similar code to get user from access token: 514 | ```ts 515 | // the shape of the response we should get 516 | export interface TwitterUser { 517 | id: string; 518 | name: string; 519 | username: string; 520 | } 521 | 522 | // getting the twitter user from access token 523 | export async function getTwitterUser(accessToken: string): Promise { 524 | try { 525 | // request GET https://api.twitter.com/2/users/me 526 | const res = await axios.get<{ data: TwitterUser }>("https://api.twitter.com/2/users/me", { 527 | headers: { 528 | "Content-type": "application/json", 529 | // put the access token in the Authorization Bearer token 530 | Authorization: `Bearer ${accessToken}`, 531 | }, 532 | }); 533 | 534 | return res.data.data ?? null; 535 | } catch (err) { 536 | console.error(err); 537 | 538 | return null; 539 | } 540 | } 541 | ``` 542 | 543 | #### Checking if they work 544 | Let's see if they successfully gets us the user. After adding all the code in the `server\src\oauth2.ts` file it should look like this: 545 | ```ts 546 | import { CLIENT_URL } from "./config"; 547 | import axios from "axios"; 548 | import { Request, Response } from "express"; 549 | 550 | // add your client id and secret here: 551 | const TWITTER_OAUTH_CLIENT_ID = "T1dLaHdFSWVfTnEtQ2psZThTbnI6MTpjaQ"; 552 | const TWITTER_OAUTH_CLIENT_SECRET = process.env.TWITTER_CLIENT_SECRET!; 553 | 554 | // the url where we get the twitter access token from 555 | const TWITTER_OAUTH_TOKEN_URL = "https://api.twitter.com/2/oauth2/token"; 556 | 557 | // we need to encrypt our twitter client id and secret here in base 64 (stated in twitter documentation) 558 | const BasicAuthToken = Buffer.from(`${TWITTER_OAUTH_CLIENT_ID}:${TWITTER_OAUTH_CLIENT_SECRET}`, "utf8").toString( 559 | "base64" 560 | ); 561 | 562 | // filling up the query parameters needed to request for getting the token 563 | export const twitterOauthTokenParams = { 564 | client_id: TWITTER_OAUTH_CLIENT_ID, 565 | code_verifier: "8KxxO-RPl0bLSxX5AWwgdiFbMnry_VOKzFeIlVA7NoA", 566 | redirect_uri: `http://www.localhost:3001/oauth/twitter`, 567 | grant_type: "authorization_code", 568 | }; 569 | 570 | // the shape of the object we should recieve from twitter in the request 571 | type TwitterTokenResponse = { 572 | token_type: "bearer"; 573 | expires_in: 7200; 574 | access_token: string; 575 | scope: string; 576 | }; 577 | 578 | // the main step 1 function, getting the access token from twitter using the code that the twitter sent us 579 | export async function getTwitterOAuthToken(code: string) { 580 | try { 581 | // POST request to the token url to get the access token 582 | const res = await axios.post( 583 | TWITTER_OAUTH_TOKEN_URL, 584 | new URLSearchParams({ ...twitterOauthTokenParams, code }).toString(), 585 | { 586 | headers: { 587 | "Content-Type": "application/x-www-form-urlencoded", 588 | Authorization: `Basic ${BasicAuthToken}`, 589 | }, 590 | } 591 | ); 592 | 593 | return res.data; 594 | } catch (err) { 595 | return null; 596 | } 597 | } 598 | 599 | // the shape of the response we should get 600 | export interface TwitterUser { 601 | id: string; 602 | name: string; 603 | username: string; 604 | } 605 | 606 | // getting the twitter user from access token 607 | export async function getTwitterUser(accessToken: string): Promise { 608 | try { 609 | // request GET https://api.twitter.com/2/users/me 610 | const res = await axios.get<{ data: TwitterUser }>("https://api.twitter.com/2/users/me", { 611 | headers: { 612 | "Content-type": "application/json", 613 | // put the access token in the Authorization Bearer token 614 | Authorization: `Bearer ${accessToken}`, 615 | }, 616 | }); 617 | 618 | return res.data.data ?? null; 619 | } catch (err) { 620 | return null; 621 | } 622 | } 623 | 624 | // the function which will be called when twitter redirects to the server at http://www.localhost:3001/oauth/twitter 625 | export async function twitterOauth(req: Request, res: Response) { 626 | const code = req.query.code; 627 | 628 | // 1. get the access token with the code 629 | const TwitterOAuthToken = await getTwitterOAuthToken(code); 630 | console.log(TwitterOAuthToken); 631 | 632 | if (!TwitterOAuthToken) { 633 | // redirect if no auth token 634 | return res.redirect(CLIENT_URL); 635 | } 636 | 637 | // 2. get the twitter user using the access token 638 | const twitterUser = await getTwitterUser(TwitterOAuthToken.access_token); 639 | console.log(twitterUser); 640 | 641 | if (!twitterUser) { 642 | // redirect if no twitter user 643 | return res.redirect(CLIENT_URL); 644 | } 645 | 646 | // 3. upsert the user in our db 647 | 648 | // 4. create cookie so that the server can validate the user 649 | 650 | // 5. finally redirect to the client 651 | 652 | return res.redirect(CLIENT_URL); 653 | } 654 | ``` 655 | Import and add the route to our express app: 656 | ```ts 657 | app.get("/ping", (_, res) => res.json("pong")); 658 | 659 | // activate twitterOauth function when visiting the route 660 | app.get("/oauth/twitter", twitterOauth); 661 | app.listen(SERVER_PORT, () => console.log(`Server listening on port ${SERVER_PORT}`)) 662 | ``` 663 | Now run the client and server, and look at the server console on what happens if we click on the Twitter button in the frontend and authorize the app. 664 | 665 | ![successfully fetching user and access token fron twitter](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/8.png) 666 | 667 | We successfully got the user from Twitter now! 668 | The most important part, i.e. getting the user from Twitter, is done. Now we can finish up our project. 669 | 670 | ## Finishing the web app 671 | Let's finish up the rest of the steps needed for `GET /oauth/twitter` to work. Since they are not related to OAuth, I will add the functions in the `server\src\config.ts` file. 672 | 673 | ```ts 674 | import { PrismaClient, User } from "@prisma/client" 675 | import { CookieOptions, Response } from "express"; 676 | import { TwitterUser } from "./oauth2"; 677 | import jwt from "jsonwebtoken"; 678 | 679 | export const CLIENT_URL = process.env.CLIENT_URL! 680 | export const SERVER_PORT = process.env.SERVER_PORT! 681 | export const prisma = new PrismaClient() 682 | 683 | // step 3 684 | export function upsertUser(twitterUser: TwitterUser) { 685 | // create a new user in our database or return an old user who already signed up earlier 686 | return prisma.user.upsert({ 687 | create: { 688 | username: twitterUser.username, 689 | id: twitterUser.id, 690 | name: twitterUser.name, 691 | type: "twitter", 692 | }, 693 | update: { 694 | id: twitterUser.id, 695 | }, 696 | where: { id: twitterUser.id}, 697 | }); 698 | } 699 | 700 | // JWT_SECRET from our environment variable file 701 | export const JWT_SECRET = process.env.JWT_SECRET! 702 | 703 | // cookie name 704 | export const COOKIE_NAME = 'oauth2_token' 705 | 706 | // cookie setting options 707 | const cookieOptions: CookieOptions = { 708 | httpOnly: true, 709 | secure: process.env.NODE_ENV === 'production' 710 | sameSite: "strict" 711 | } 712 | 713 | // step 4 714 | export function addCookieToRes(res: Response, user: User, accessToken: string) { 715 | const { id, type } = user; 716 | const token = jwt.sign({ // Signing the token to send to client side 717 | id, 718 | accessToken, 719 | type 720 | }, JWT_SECRET); 721 | res.cookie(COOKIE_NAME, token, { // adding the cookie to response here 722 | ...cookieOptions, 723 | expires: new Date(Date.now() + 7200 * 1000), 724 | }); 725 | } 726 | ``` 727 | Import the functions and use them in the `server\src\oauth2.ts`: 728 | ```ts 729 | import { prisma, CLIENT_URL, addResCookie } from "./config"; 730 | 731 | ... 732 | 733 | // the function which will be called when twitter redirects to the server at http://www.localhost:3001/oauth/twitter 734 | export async function twitterOauth(req: Request, res: Response) { 735 | const code = req.query.code; 736 | 737 | // 1. get the access token with the code 738 | const twitterOAuthToken = await getTwitterOAuthToken(code); 739 | 740 | if (!twitterOAuthToken) { 741 | // redirect if no auth token 742 | return res.redirect(CLIENT_URL); 743 | } 744 | 745 | // 2. get the twitter user using the access token 746 | const twitterUser = await getTwitterUser(twitterOAuthToken.access_token); 747 | 748 | if (!twitterUser) { 749 | // redirect if no twitter user 750 | return res.redirect(CLIENT_URL); 751 | } 752 | 753 | 754 | // 3. upsert the user in our db 755 | const user = await upsertUser(twitterUser) 756 | 757 | // 4. create cookie so that the server can validate the user 758 | addCookieToRes(res, user, twitterOAuthToken.access_token) 759 | 760 | // 5. finally redirect to the client 761 | return res.redirect(CLIENT_URL); 762 | } 763 | ``` 764 | > **Note**: We are sending the access token in the cookie for simplicity. For a web application, we should store it somewhere more secure, like a database. 765 | 766 | And finally, add the `me` query in the `server\src\index.ts` file. 767 | 768 | ```ts 769 | import { CLIENT_URL, COOKIE_NAME, JWT_SECRET, prisma, SERVER_PORT } from "./config"; 770 | import cookieParser from "cookie-parser"; 771 | import cors from "cors"; 772 | import express from "express"; 773 | import jwt from 'jsonwebtoken' 774 | import { getTwitterUser, twitterOauth } from "./oauth2"; 775 | import { User } from "@prisma/client"; 776 | 777 | const app = express(); 778 | const origin= [CLIENT_URL]; 779 | app.use(cookieParser()); 780 | app.use(cors({ 781 | origin, 782 | credentials: true 783 | })) 784 | app.get("/ping", (_, res) => res.json("pong")); 785 | 786 | type UserJWTPayload = Pick & {accessToken: string} 787 | 788 | app.get('/me', async (req, res)=>{ 789 | try { 790 | const token = req.cookies[COOKIE_NAME]; 791 | if (!token) { 792 | throw new Error("Not Authenticated"); 793 | } 794 | const payload = await jwt.verify(token, JWT_SECRET) as UserJWTPayload; 795 | const userFromDb = await prisma.user.findUnique({ 796 | where: { id: payload?.id }, 797 | }); 798 | if (!userFromDb) throw new Error("Not Authenticated"); 799 | if (userFromDb.type === "twitter") { 800 | if (!payload.accessToken) { 801 | throw new Error("Not Authenticated"); 802 | } 803 | const twUser = await getTwitterUser(payload.accessToken); 804 | if (twUser?.id !== userFromDb.id) { 805 | throw new Error("Not Authenticated"); 806 | } 807 | } 808 | res.json(userFromDb) 809 | } catch (err) { 810 | res.status(401).json("Not Authenticated") 811 | } 812 | }) 813 | 814 | // activate twitterOauth function when visiting the route 815 | app.get("/oauth/twitter", twitterOauth); 816 | app.listen(SERVER_PORT, () => console.log(`Server listening on port ${SERVER_PORT}`)) 817 | ``` 818 | It is done now! Let's see what happens when we click the Twitter button on our client and authorize the app there. 819 | 820 | ![Successful login and setting up cookies in FE](https://raw.githubusercontent.com/Reinforz/twitter-oauth2-blog/main/images/9.png) 821 | 822 | We see our Twitter username in there instead of the Twitter button now, which shows that the `me` query is being executed successfully. As a result, we now have a working user authentication system, via Twitter OAuth 2.0, in our minimal full-stack web application. 823 | 824 | ## Conclusion 825 | Thanks for reading! [This](https://github.com/Reinforz/twitter-oauth2-blog) is the Github repository with all the codes. Find more fun things you can do with the Twitter API [here](https://developer.twitter.com/en/docs/api-reference-index). Another example implementation of authentication via Twitter OAuth 2.0 can be found [here](https://github.com/imoxto/imodit). 826 | 827 | 828 | *Written by [Rafid Hamid](https://github.com/imoxto)* -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime-corejs3@^7.10.2": 6 | version "7.19.4" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.4.tgz#870dbfd9685b3dad5aeb2d00841bb8b6192e3095" 8 | integrity sha512-HzjQ8+dzdx7dmZy4DQ8KV8aHi/74AjEbBGTFutBmg/pd3dY5/q1sfuOGPTFGEytlQhWoeVXqcK5BwMgIkRkNDQ== 9 | dependencies: 10 | core-js-pure "^3.25.1" 11 | regenerator-runtime "^0.13.4" 12 | 13 | "@babel/runtime@^7.10.2", "@babel/runtime@^7.18.9": 14 | version "7.19.4" 15 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" 16 | integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== 17 | dependencies: 18 | regenerator-runtime "^0.13.4" 19 | 20 | "@eslint/eslintrc@^1.3.3": 21 | version "1.3.3" 22 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" 23 | integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== 24 | dependencies: 25 | ajv "^6.12.4" 26 | debug "^4.3.2" 27 | espree "^9.4.0" 28 | globals "^13.15.0" 29 | ignore "^5.2.0" 30 | import-fresh "^3.2.1" 31 | js-yaml "^4.1.0" 32 | minimatch "^3.1.2" 33 | strip-json-comments "^3.1.1" 34 | 35 | "@humanwhocodes/config-array@^0.10.5": 36 | version "0.10.7" 37 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" 38 | integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== 39 | dependencies: 40 | "@humanwhocodes/object-schema" "^1.2.1" 41 | debug "^4.1.1" 42 | minimatch "^3.0.4" 43 | 44 | "@humanwhocodes/module-importer@^1.0.1": 45 | version "1.0.1" 46 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 47 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 48 | 49 | "@humanwhocodes/object-schema@^1.2.1": 50 | version "1.2.1" 51 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 52 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 53 | 54 | "@mapbox/node-pre-gyp@^1.0.10": 55 | version "1.0.10" 56 | resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" 57 | integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== 58 | dependencies: 59 | detect-libc "^2.0.0" 60 | https-proxy-agent "^5.0.0" 61 | make-dir "^3.1.0" 62 | node-fetch "^2.6.7" 63 | nopt "^5.0.0" 64 | npmlog "^5.0.1" 65 | rimraf "^3.0.2" 66 | semver "^7.3.5" 67 | tar "^6.1.11" 68 | 69 | "@next/env@12.3.1": 70 | version "12.3.1" 71 | resolved "https://registry.yarnpkg.com/@next/env/-/env-12.3.1.tgz#18266bd92de3b4aa4037b1927aa59e6f11879260" 72 | integrity sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg== 73 | 74 | "@next/eslint-plugin-next@12.3.1": 75 | version "12.3.1" 76 | resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.1.tgz#b821f27b0f175954d8d18e5d323fce040ecc79a6" 77 | integrity sha512-sw+lTf6r6P0j+g/n9y4qdWWI2syPqZx+uc0+B/fRENqfR3KpSid6MIKqc9gNwGhJASazEQ5b3w8h4cAET213jw== 78 | dependencies: 79 | glob "7.1.7" 80 | 81 | "@next/swc-android-arm-eabi@12.3.1": 82 | version "12.3.1" 83 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.1.tgz#b15ce8ad376102a3b8c0f3c017dde050a22bb1a3" 84 | integrity sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ== 85 | 86 | "@next/swc-android-arm64@12.3.1": 87 | version "12.3.1" 88 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.3.1.tgz#85d205f568a790a137cb3c3f720d961a2436ac9c" 89 | integrity sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q== 90 | 91 | "@next/swc-darwin-arm64@12.3.1": 92 | version "12.3.1" 93 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.1.tgz#b105457d6760a7916b27e46c97cb1a40547114ae" 94 | integrity sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg== 95 | 96 | "@next/swc-darwin-x64@12.3.1": 97 | version "12.3.1" 98 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.1.tgz#6947b39082271378896b095b6696a7791c6e32b1" 99 | integrity sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA== 100 | 101 | "@next/swc-freebsd-x64@12.3.1": 102 | version "12.3.1" 103 | resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.1.tgz#2b6c36a4d84aae8b0ea0e0da9bafc696ae27085a" 104 | integrity sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q== 105 | 106 | "@next/swc-linux-arm-gnueabihf@12.3.1": 107 | version "12.3.1" 108 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.1.tgz#6e421c44285cfedac1f4631d5de330dd60b86298" 109 | integrity sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w== 110 | 111 | "@next/swc-linux-arm64-gnu@12.3.1": 112 | version "12.3.1" 113 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.1.tgz#8863f08a81f422f910af126159d2cbb9552ef717" 114 | integrity sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ== 115 | 116 | "@next/swc-linux-arm64-musl@12.3.1": 117 | version "12.3.1" 118 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.1.tgz#0038f07cf0b259d70ae0c80890d826dfc775d9f3" 119 | integrity sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg== 120 | 121 | "@next/swc-linux-x64-gnu@12.3.1": 122 | version "12.3.1" 123 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.1.tgz#c66468f5e8181ffb096c537f0dbfb589baa6a9c1" 124 | integrity sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA== 125 | 126 | "@next/swc-linux-x64-musl@12.3.1": 127 | version "12.3.1" 128 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.1.tgz#c6269f3e96ac0395bc722ad97ce410ea5101d305" 129 | integrity sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg== 130 | 131 | "@next/swc-win32-arm64-msvc@12.3.1": 132 | version "12.3.1" 133 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.1.tgz#83c639ee969cee36ce247c3abd1d9df97b5ecade" 134 | integrity sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw== 135 | 136 | "@next/swc-win32-ia32-msvc@12.3.1": 137 | version "12.3.1" 138 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.1.tgz#52995748b92aa8ad053440301bc2c0d9fbcf27c2" 139 | integrity sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA== 140 | 141 | "@next/swc-win32-x64-msvc@12.3.1": 142 | version "12.3.1" 143 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.1.tgz#27d71a95247a9eaee03d47adee7e3bd594514136" 144 | integrity sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA== 145 | 146 | "@nodelib/fs.scandir@2.1.5": 147 | version "2.1.5" 148 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 149 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 150 | dependencies: 151 | "@nodelib/fs.stat" "2.0.5" 152 | run-parallel "^1.1.9" 153 | 154 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 155 | version "2.0.5" 156 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 157 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 158 | 159 | "@nodelib/fs.walk@^1.2.3": 160 | version "1.2.8" 161 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 162 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 163 | dependencies: 164 | "@nodelib/fs.scandir" "2.1.5" 165 | fastq "^1.6.0" 166 | 167 | "@phc/format@^1.0.0": 168 | version "1.0.0" 169 | resolved "https://registry.yarnpkg.com/@phc/format/-/format-1.0.0.tgz#b5627003b3216dc4362125b13f48a4daa76680e4" 170 | integrity sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ== 171 | 172 | "@prisma/client@^4.4.0": 173 | version "4.4.0" 174 | resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.4.0.tgz#45f59c172dd3621ecc92d7cf9bc765d85e6c7d56" 175 | integrity sha512-ciKOP246x1xwr04G9ajHlJ4pkmtu9Q6esVyqVBO0QJihaKQIUvbPjClp17IsRJyxqNpFm4ScbOc/s9DUzKHINQ== 176 | dependencies: 177 | "@prisma/engines-version" "4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6" 178 | 179 | "@prisma/engines-version@4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6": 180 | version "4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6" 181 | resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6.tgz#00875863bb30b670a586a5b5794a000f7f3ad976" 182 | integrity sha512-P5v/PuEIJLYXZUZBvOLPqoyCW+m6StNqHdiR6te++gYVODpPdLakks5HVx3JaZIY+LwR02juJWFlwpc9Eog/ug== 183 | 184 | "@prisma/engines@4.4.0": 185 | version "4.4.0" 186 | resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.4.0.tgz#6ca7d3ce8eee08dcfa82311b0a02f5ccaac7dc0c" 187 | integrity sha512-Fpykccxlt9MHrAs/QpPGpI2nOiRxuLA+LiApgA59ibbf24YICZIMWd3SI2YD+q0IAIso0jCGiHhirAIbxK3RyQ== 188 | 189 | "@rushstack/eslint-patch@^1.1.3": 190 | version "1.2.0" 191 | resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" 192 | integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== 193 | 194 | "@swc/helpers@0.4.11": 195 | version "0.4.11" 196 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.11.tgz#db23a376761b3d31c26502122f349a21b592c8de" 197 | integrity sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw== 198 | dependencies: 199 | tslib "^2.4.0" 200 | 201 | "@types/body-parser@*": 202 | version "1.19.2" 203 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" 204 | integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== 205 | dependencies: 206 | "@types/connect" "*" 207 | "@types/node" "*" 208 | 209 | "@types/connect@*": 210 | version "3.4.35" 211 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 212 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 213 | dependencies: 214 | "@types/node" "*" 215 | 216 | "@types/cookie-parser@^1.4.3": 217 | version "1.4.3" 218 | resolved "https://registry.yarnpkg.com/@types/cookie-parser/-/cookie-parser-1.4.3.tgz#3a01df117c5705cf89a84c876b50c5a1fd427a21" 219 | integrity sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w== 220 | dependencies: 221 | "@types/express" "*" 222 | 223 | "@types/cors@^2.8.12": 224 | version "2.8.12" 225 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" 226 | integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== 227 | 228 | "@types/express-serve-static-core@^4.17.18": 229 | version "4.17.31" 230 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" 231 | integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== 232 | dependencies: 233 | "@types/node" "*" 234 | "@types/qs" "*" 235 | "@types/range-parser" "*" 236 | 237 | "@types/express@*", "@types/express@^4.17.14": 238 | version "4.17.14" 239 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" 240 | integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== 241 | dependencies: 242 | "@types/body-parser" "*" 243 | "@types/express-serve-static-core" "^4.17.18" 244 | "@types/qs" "*" 245 | "@types/serve-static" "*" 246 | 247 | "@types/json5@^0.0.29": 248 | version "0.0.29" 249 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 250 | integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== 251 | 252 | "@types/jsonwebtoken@^8.5.9": 253 | version "8.5.9" 254 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz#2c064ecb0b3128d837d2764aa0b117b0ff6e4586" 255 | integrity sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg== 256 | dependencies: 257 | "@types/node" "*" 258 | 259 | "@types/mime@*": 260 | version "3.0.1" 261 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" 262 | integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== 263 | 264 | "@types/node@*", "@types/node@18.11.0", "@types/node@^18.11.0": 265 | version "18.11.0" 266 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.0.tgz#f38c7139247a1d619f6cc6f27b072606af7c289d" 267 | integrity sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w== 268 | 269 | "@types/prop-types@*": 270 | version "15.7.5" 271 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 272 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 273 | 274 | "@types/qs@*": 275 | version "6.9.7" 276 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 277 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 278 | 279 | "@types/range-parser@*": 280 | version "1.2.4" 281 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 282 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 283 | 284 | "@types/react-dom@18.0.6": 285 | version "18.0.6" 286 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" 287 | integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== 288 | dependencies: 289 | "@types/react" "*" 290 | 291 | "@types/react@*", "@types/react@18.0.21": 292 | version "18.0.21" 293 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" 294 | integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== 295 | dependencies: 296 | "@types/prop-types" "*" 297 | "@types/scheduler" "*" 298 | csstype "^3.0.2" 299 | 300 | "@types/scheduler@*": 301 | version "0.16.2" 302 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 303 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 304 | 305 | "@types/serve-static@*": 306 | version "1.15.0" 307 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" 308 | integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== 309 | dependencies: 310 | "@types/mime" "*" 311 | "@types/node" "*" 312 | 313 | "@typescript-eslint/parser@^5.21.0": 314 | version "5.40.0" 315 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.40.0.tgz#432bddc1fe9154945660f67c1ba6d44de5014840" 316 | integrity sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw== 317 | dependencies: 318 | "@typescript-eslint/scope-manager" "5.40.0" 319 | "@typescript-eslint/types" "5.40.0" 320 | "@typescript-eslint/typescript-estree" "5.40.0" 321 | debug "^4.3.4" 322 | 323 | "@typescript-eslint/scope-manager@5.40.0": 324 | version "5.40.0" 325 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.40.0.tgz#d6ea782c8e3a2371ba3ea31458dcbdc934668fc4" 326 | integrity sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw== 327 | dependencies: 328 | "@typescript-eslint/types" "5.40.0" 329 | "@typescript-eslint/visitor-keys" "5.40.0" 330 | 331 | "@typescript-eslint/types@5.40.0": 332 | version "5.40.0" 333 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.40.0.tgz#8de07e118a10b8f63c99e174a3860f75608c822e" 334 | integrity sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw== 335 | 336 | "@typescript-eslint/typescript-estree@5.40.0": 337 | version "5.40.0" 338 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.0.tgz#e305e6a5d65226efa5471ee0f12e0ffaab6d3075" 339 | integrity sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg== 340 | dependencies: 341 | "@typescript-eslint/types" "5.40.0" 342 | "@typescript-eslint/visitor-keys" "5.40.0" 343 | debug "^4.3.4" 344 | globby "^11.1.0" 345 | is-glob "^4.0.3" 346 | semver "^7.3.7" 347 | tsutils "^3.21.0" 348 | 349 | "@typescript-eslint/visitor-keys@5.40.0": 350 | version "5.40.0" 351 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.0.tgz#dd2d38097f68e0d2e1e06cb9f73c0173aca54b68" 352 | integrity sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ== 353 | dependencies: 354 | "@typescript-eslint/types" "5.40.0" 355 | eslint-visitor-keys "^3.3.0" 356 | 357 | abbrev@1: 358 | version "1.1.1" 359 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 360 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 361 | 362 | accepts@~1.3.8: 363 | version "1.3.8" 364 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 365 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 366 | dependencies: 367 | mime-types "~2.1.34" 368 | negotiator "0.6.3" 369 | 370 | acorn-jsx@^5.3.2: 371 | version "5.3.2" 372 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 373 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 374 | 375 | acorn@^8.8.0: 376 | version "8.8.0" 377 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" 378 | integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== 379 | 380 | agent-base@6: 381 | version "6.0.2" 382 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 383 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 384 | dependencies: 385 | debug "4" 386 | 387 | ajv@^6.10.0, ajv@^6.12.4: 388 | version "6.12.6" 389 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 390 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 391 | dependencies: 392 | fast-deep-equal "^3.1.1" 393 | fast-json-stable-stringify "^2.0.0" 394 | json-schema-traverse "^0.4.1" 395 | uri-js "^4.2.2" 396 | 397 | ansi-regex@^5.0.1: 398 | version "5.0.1" 399 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 400 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 401 | 402 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 403 | version "4.3.0" 404 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 405 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 406 | dependencies: 407 | color-convert "^2.0.1" 408 | 409 | anymatch@~3.1.2: 410 | version "3.1.2" 411 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 412 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 413 | dependencies: 414 | normalize-path "^3.0.0" 415 | picomatch "^2.0.4" 416 | 417 | "aproba@^1.0.3 || ^2.0.0": 418 | version "2.0.0" 419 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" 420 | integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== 421 | 422 | are-we-there-yet@^2.0.0: 423 | version "2.0.0" 424 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" 425 | integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== 426 | dependencies: 427 | delegates "^1.0.0" 428 | readable-stream "^3.6.0" 429 | 430 | argon2@^0.30.1: 431 | version "0.30.1" 432 | resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.30.1.tgz#7c719b27956553c7066a07583bc0a36f5b3ef9b5" 433 | integrity sha512-wJYS8ebn6zHZwv4/iOOdlW1KUuLdbyIyhGsT51j6d9l5cRrHQU8pl817ubAxNgnS1jrbW/NGwegN3YrV0d5jRg== 434 | dependencies: 435 | "@mapbox/node-pre-gyp" "^1.0.10" 436 | "@phc/format" "^1.0.0" 437 | node-addon-api "^5.0.0" 438 | 439 | argparse@^2.0.1: 440 | version "2.0.1" 441 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 442 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 443 | 444 | aria-query@^4.2.2: 445 | version "4.2.2" 446 | resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" 447 | integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== 448 | dependencies: 449 | "@babel/runtime" "^7.10.2" 450 | "@babel/runtime-corejs3" "^7.10.2" 451 | 452 | array-flatten@1.1.1: 453 | version "1.1.1" 454 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 455 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 456 | 457 | array-includes@^3.1.4, array-includes@^3.1.5: 458 | version "3.1.5" 459 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" 460 | integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== 461 | dependencies: 462 | call-bind "^1.0.2" 463 | define-properties "^1.1.4" 464 | es-abstract "^1.19.5" 465 | get-intrinsic "^1.1.1" 466 | is-string "^1.0.7" 467 | 468 | array-union@^2.1.0: 469 | version "2.1.0" 470 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 471 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 472 | 473 | array.prototype.flat@^1.2.5: 474 | version "1.3.0" 475 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" 476 | integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== 477 | dependencies: 478 | call-bind "^1.0.2" 479 | define-properties "^1.1.3" 480 | es-abstract "^1.19.2" 481 | es-shim-unscopables "^1.0.0" 482 | 483 | array.prototype.flatmap@^1.3.0: 484 | version "1.3.0" 485 | resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" 486 | integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== 487 | dependencies: 488 | call-bind "^1.0.2" 489 | define-properties "^1.1.3" 490 | es-abstract "^1.19.2" 491 | es-shim-unscopables "^1.0.0" 492 | 493 | ast-types-flow@^0.0.7: 494 | version "0.0.7" 495 | resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" 496 | integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== 497 | 498 | asynckit@^0.4.0: 499 | version "0.4.0" 500 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 501 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 502 | 503 | axe-core@^4.4.3: 504 | version "4.4.3" 505 | resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" 506 | integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== 507 | 508 | axios@^1.1.3: 509 | version "1.1.3" 510 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" 511 | integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== 512 | dependencies: 513 | follow-redirects "^1.15.0" 514 | form-data "^4.0.0" 515 | proxy-from-env "^1.1.0" 516 | 517 | axobject-query@^2.2.0: 518 | version "2.2.0" 519 | resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" 520 | integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== 521 | 522 | balanced-match@^1.0.0: 523 | version "1.0.2" 524 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 525 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 526 | 527 | binary-extensions@^2.0.0: 528 | version "2.2.0" 529 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 530 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 531 | 532 | body-parser@1.20.1: 533 | version "1.20.1" 534 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 535 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 536 | dependencies: 537 | bytes "3.1.2" 538 | content-type "~1.0.4" 539 | debug "2.6.9" 540 | depd "2.0.0" 541 | destroy "1.2.0" 542 | http-errors "2.0.0" 543 | iconv-lite "0.4.24" 544 | on-finished "2.4.1" 545 | qs "6.11.0" 546 | raw-body "2.5.1" 547 | type-is "~1.6.18" 548 | unpipe "1.0.0" 549 | 550 | brace-expansion@^1.1.7: 551 | version "1.1.11" 552 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 553 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 554 | dependencies: 555 | balanced-match "^1.0.0" 556 | concat-map "0.0.1" 557 | 558 | braces@^3.0.2, braces@~3.0.2: 559 | version "3.0.2" 560 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 561 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 562 | dependencies: 563 | fill-range "^7.0.1" 564 | 565 | buffer-equal-constant-time@1.0.1: 566 | version "1.0.1" 567 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 568 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 569 | 570 | bytes@3.1.2: 571 | version "3.1.2" 572 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 573 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 574 | 575 | call-bind@^1.0.0, call-bind@^1.0.2: 576 | version "1.0.2" 577 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 578 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 579 | dependencies: 580 | function-bind "^1.1.1" 581 | get-intrinsic "^1.0.2" 582 | 583 | callsites@^3.0.0: 584 | version "3.1.0" 585 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 586 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 587 | 588 | caniuse-lite@^1.0.30001406: 589 | version "1.0.30001420" 590 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001420.tgz#f62f35f051e0b6d25532cf376776d41e45b47ef6" 591 | integrity sha512-OnyeJ9ascFA9roEj72ok2Ikp7PHJTKubtEJIQ/VK3fdsS50q4KWy+Z5X0A1/GswEItKX0ctAp8n4SYDE7wTu6A== 592 | 593 | chalk@^4.0.0, chalk@^4.1.0: 594 | version "4.1.2" 595 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 596 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 597 | dependencies: 598 | ansi-styles "^4.1.0" 599 | supports-color "^7.1.0" 600 | 601 | chokidar@^3.5.2: 602 | version "3.5.3" 603 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 604 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 605 | dependencies: 606 | anymatch "~3.1.2" 607 | braces "~3.0.2" 608 | glob-parent "~5.1.2" 609 | is-binary-path "~2.1.0" 610 | is-glob "~4.0.1" 611 | normalize-path "~3.0.0" 612 | readdirp "~3.6.0" 613 | optionalDependencies: 614 | fsevents "~2.3.2" 615 | 616 | chownr@^2.0.0: 617 | version "2.0.0" 618 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" 619 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 620 | 621 | cliui@^8.0.1: 622 | version "8.0.1" 623 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 624 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 625 | dependencies: 626 | string-width "^4.2.0" 627 | strip-ansi "^6.0.1" 628 | wrap-ansi "^7.0.0" 629 | 630 | color-convert@^2.0.1: 631 | version "2.0.1" 632 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 633 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 634 | dependencies: 635 | color-name "~1.1.4" 636 | 637 | color-name@~1.1.4: 638 | version "1.1.4" 639 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 640 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 641 | 642 | color-support@^1.1.2: 643 | version "1.1.3" 644 | resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" 645 | integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== 646 | 647 | combined-stream@^1.0.8: 648 | version "1.0.8" 649 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 650 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 651 | dependencies: 652 | delayed-stream "~1.0.0" 653 | 654 | concat-map@0.0.1: 655 | version "0.0.1" 656 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 657 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 658 | 659 | concurrently@^7.4.0: 660 | version "7.4.0" 661 | resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.4.0.tgz#bb0e344964bc172673577c420db21e963f2f7368" 662 | integrity sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA== 663 | dependencies: 664 | chalk "^4.1.0" 665 | date-fns "^2.29.1" 666 | lodash "^4.17.21" 667 | rxjs "^7.0.0" 668 | shell-quote "^1.7.3" 669 | spawn-command "^0.0.2-1" 670 | supports-color "^8.1.0" 671 | tree-kill "^1.2.2" 672 | yargs "^17.3.1" 673 | 674 | console-control-strings@^1.0.0, console-control-strings@^1.1.0: 675 | version "1.1.0" 676 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 677 | integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== 678 | 679 | content-disposition@0.5.4: 680 | version "0.5.4" 681 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 682 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 683 | dependencies: 684 | safe-buffer "5.2.1" 685 | 686 | content-type@~1.0.4: 687 | version "1.0.4" 688 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 689 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 690 | 691 | cookie-parser@^1.4.6: 692 | version "1.4.6" 693 | resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" 694 | integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== 695 | dependencies: 696 | cookie "0.4.1" 697 | cookie-signature "1.0.6" 698 | 699 | cookie-signature@1.0.6: 700 | version "1.0.6" 701 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 702 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 703 | 704 | cookie@0.4.1: 705 | version "0.4.1" 706 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" 707 | integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== 708 | 709 | cookie@0.5.0: 710 | version "0.5.0" 711 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 712 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 713 | 714 | core-js-pure@^3.25.1: 715 | version "3.25.5" 716 | resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" 717 | integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== 718 | 719 | cors@^2.8.5: 720 | version "2.8.5" 721 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 722 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 723 | dependencies: 724 | object-assign "^4" 725 | vary "^1" 726 | 727 | cross-spawn@^7.0.2: 728 | version "7.0.3" 729 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 730 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 731 | dependencies: 732 | path-key "^3.1.0" 733 | shebang-command "^2.0.0" 734 | which "^2.0.1" 735 | 736 | csstype@^3.0.2: 737 | version "3.1.1" 738 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" 739 | integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== 740 | 741 | damerau-levenshtein@^1.0.8: 742 | version "1.0.8" 743 | resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" 744 | integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== 745 | 746 | date-fns@^2.29.1: 747 | version "2.29.3" 748 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" 749 | integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== 750 | 751 | debug@2.6.9, debug@^2.6.9: 752 | version "2.6.9" 753 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 754 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 755 | dependencies: 756 | ms "2.0.0" 757 | 758 | debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: 759 | version "4.3.4" 760 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 761 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 762 | dependencies: 763 | ms "2.1.2" 764 | 765 | debug@^3.2.7: 766 | version "3.2.7" 767 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 768 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 769 | dependencies: 770 | ms "^2.1.1" 771 | 772 | deep-is@^0.1.3: 773 | version "0.1.4" 774 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 775 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 776 | 777 | define-properties@^1.1.3, define-properties@^1.1.4: 778 | version "1.1.4" 779 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" 780 | integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== 781 | dependencies: 782 | has-property-descriptors "^1.0.0" 783 | object-keys "^1.1.1" 784 | 785 | delayed-stream@~1.0.0: 786 | version "1.0.0" 787 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 788 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 789 | 790 | delegates@^1.0.0: 791 | version "1.0.0" 792 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 793 | integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== 794 | 795 | depd@2.0.0: 796 | version "2.0.0" 797 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 798 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 799 | 800 | destroy@1.2.0: 801 | version "1.2.0" 802 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 803 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 804 | 805 | detect-libc@^2.0.0: 806 | version "2.0.1" 807 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" 808 | integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== 809 | 810 | dir-glob@^3.0.1: 811 | version "3.0.1" 812 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 813 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 814 | dependencies: 815 | path-type "^4.0.0" 816 | 817 | doctrine@^2.1.0: 818 | version "2.1.0" 819 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 820 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 821 | dependencies: 822 | esutils "^2.0.2" 823 | 824 | doctrine@^3.0.0: 825 | version "3.0.0" 826 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 827 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 828 | dependencies: 829 | esutils "^2.0.2" 830 | 831 | dotenv@^16.0.3: 832 | version "16.0.3" 833 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" 834 | integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== 835 | 836 | ecdsa-sig-formatter@1.0.11: 837 | version "1.0.11" 838 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 839 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 840 | dependencies: 841 | safe-buffer "^5.0.1" 842 | 843 | ee-first@1.1.1: 844 | version "1.1.1" 845 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 846 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 847 | 848 | emoji-regex@^8.0.0: 849 | version "8.0.0" 850 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 851 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 852 | 853 | emoji-regex@^9.2.2: 854 | version "9.2.2" 855 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 856 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 857 | 858 | encodeurl@~1.0.2: 859 | version "1.0.2" 860 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 861 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 862 | 863 | es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: 864 | version "1.20.4" 865 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" 866 | integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== 867 | dependencies: 868 | call-bind "^1.0.2" 869 | es-to-primitive "^1.2.1" 870 | function-bind "^1.1.1" 871 | function.prototype.name "^1.1.5" 872 | get-intrinsic "^1.1.3" 873 | get-symbol-description "^1.0.0" 874 | has "^1.0.3" 875 | has-property-descriptors "^1.0.0" 876 | has-symbols "^1.0.3" 877 | internal-slot "^1.0.3" 878 | is-callable "^1.2.7" 879 | is-negative-zero "^2.0.2" 880 | is-regex "^1.1.4" 881 | is-shared-array-buffer "^1.0.2" 882 | is-string "^1.0.7" 883 | is-weakref "^1.0.2" 884 | object-inspect "^1.12.2" 885 | object-keys "^1.1.1" 886 | object.assign "^4.1.4" 887 | regexp.prototype.flags "^1.4.3" 888 | safe-regex-test "^1.0.0" 889 | string.prototype.trimend "^1.0.5" 890 | string.prototype.trimstart "^1.0.5" 891 | unbox-primitive "^1.0.2" 892 | 893 | es-shim-unscopables@^1.0.0: 894 | version "1.0.0" 895 | resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" 896 | integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== 897 | dependencies: 898 | has "^1.0.3" 899 | 900 | es-to-primitive@^1.2.1: 901 | version "1.2.1" 902 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 903 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 904 | dependencies: 905 | is-callable "^1.1.4" 906 | is-date-object "^1.0.1" 907 | is-symbol "^1.0.2" 908 | 909 | escalade@^3.1.1: 910 | version "3.1.1" 911 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 912 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 913 | 914 | escape-html@~1.0.3: 915 | version "1.0.3" 916 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 917 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 918 | 919 | escape-string-regexp@^4.0.0: 920 | version "4.0.0" 921 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 922 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 923 | 924 | eslint-config-next@12.3.1: 925 | version "12.3.1" 926 | resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.3.1.tgz#5d4eb0b7903cea81fd0d5106601d3afb0a453ff4" 927 | integrity sha512-EN/xwKPU6jz1G0Qi6Bd/BqMnHLyRAL0VsaQaWA7F3KkjAgZHi4f1uL1JKGWNxdQpHTW/sdGONBd0bzxUka/DJg== 928 | dependencies: 929 | "@next/eslint-plugin-next" "12.3.1" 930 | "@rushstack/eslint-patch" "^1.1.3" 931 | "@typescript-eslint/parser" "^5.21.0" 932 | eslint-import-resolver-node "^0.3.6" 933 | eslint-import-resolver-typescript "^2.7.1" 934 | eslint-plugin-import "^2.26.0" 935 | eslint-plugin-jsx-a11y "^6.5.1" 936 | eslint-plugin-react "^7.31.7" 937 | eslint-plugin-react-hooks "^4.5.0" 938 | 939 | eslint-import-resolver-node@^0.3.6: 940 | version "0.3.6" 941 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" 942 | integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== 943 | dependencies: 944 | debug "^3.2.7" 945 | resolve "^1.20.0" 946 | 947 | eslint-import-resolver-typescript@^2.7.1: 948 | version "2.7.1" 949 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" 950 | integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== 951 | dependencies: 952 | debug "^4.3.4" 953 | glob "^7.2.0" 954 | is-glob "^4.0.3" 955 | resolve "^1.22.0" 956 | tsconfig-paths "^3.14.1" 957 | 958 | eslint-module-utils@^2.7.3: 959 | version "2.7.4" 960 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" 961 | integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== 962 | dependencies: 963 | debug "^3.2.7" 964 | 965 | eslint-plugin-import@^2.26.0: 966 | version "2.26.0" 967 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" 968 | integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== 969 | dependencies: 970 | array-includes "^3.1.4" 971 | array.prototype.flat "^1.2.5" 972 | debug "^2.6.9" 973 | doctrine "^2.1.0" 974 | eslint-import-resolver-node "^0.3.6" 975 | eslint-module-utils "^2.7.3" 976 | has "^1.0.3" 977 | is-core-module "^2.8.1" 978 | is-glob "^4.0.3" 979 | minimatch "^3.1.2" 980 | object.values "^1.1.5" 981 | resolve "^1.22.0" 982 | tsconfig-paths "^3.14.1" 983 | 984 | eslint-plugin-jsx-a11y@^6.5.1: 985 | version "6.6.1" 986 | resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" 987 | integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== 988 | dependencies: 989 | "@babel/runtime" "^7.18.9" 990 | aria-query "^4.2.2" 991 | array-includes "^3.1.5" 992 | ast-types-flow "^0.0.7" 993 | axe-core "^4.4.3" 994 | axobject-query "^2.2.0" 995 | damerau-levenshtein "^1.0.8" 996 | emoji-regex "^9.2.2" 997 | has "^1.0.3" 998 | jsx-ast-utils "^3.3.2" 999 | language-tags "^1.0.5" 1000 | minimatch "^3.1.2" 1001 | semver "^6.3.0" 1002 | 1003 | eslint-plugin-react-hooks@^4.5.0: 1004 | version "4.6.0" 1005 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" 1006 | integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== 1007 | 1008 | eslint-plugin-react@^7.31.7: 1009 | version "7.31.10" 1010 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz#6782c2c7fe91c09e715d536067644bbb9491419a" 1011 | integrity sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA== 1012 | dependencies: 1013 | array-includes "^3.1.5" 1014 | array.prototype.flatmap "^1.3.0" 1015 | doctrine "^2.1.0" 1016 | estraverse "^5.3.0" 1017 | jsx-ast-utils "^2.4.1 || ^3.0.0" 1018 | minimatch "^3.1.2" 1019 | object.entries "^1.1.5" 1020 | object.fromentries "^2.0.5" 1021 | object.hasown "^1.1.1" 1022 | object.values "^1.1.5" 1023 | prop-types "^15.8.1" 1024 | resolve "^2.0.0-next.3" 1025 | semver "^6.3.0" 1026 | string.prototype.matchall "^4.0.7" 1027 | 1028 | eslint-scope@^7.1.1: 1029 | version "7.1.1" 1030 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" 1031 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 1032 | dependencies: 1033 | esrecurse "^4.3.0" 1034 | estraverse "^5.2.0" 1035 | 1036 | eslint-utils@^3.0.0: 1037 | version "3.0.0" 1038 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 1039 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 1040 | dependencies: 1041 | eslint-visitor-keys "^2.0.0" 1042 | 1043 | eslint-visitor-keys@^2.0.0: 1044 | version "2.1.0" 1045 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 1046 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 1047 | 1048 | eslint-visitor-keys@^3.3.0: 1049 | version "3.3.0" 1050 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 1051 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 1052 | 1053 | eslint@8.25.0: 1054 | version "8.25.0" 1055 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b" 1056 | integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A== 1057 | dependencies: 1058 | "@eslint/eslintrc" "^1.3.3" 1059 | "@humanwhocodes/config-array" "^0.10.5" 1060 | "@humanwhocodes/module-importer" "^1.0.1" 1061 | ajv "^6.10.0" 1062 | chalk "^4.0.0" 1063 | cross-spawn "^7.0.2" 1064 | debug "^4.3.2" 1065 | doctrine "^3.0.0" 1066 | escape-string-regexp "^4.0.0" 1067 | eslint-scope "^7.1.1" 1068 | eslint-utils "^3.0.0" 1069 | eslint-visitor-keys "^3.3.0" 1070 | espree "^9.4.0" 1071 | esquery "^1.4.0" 1072 | esutils "^2.0.2" 1073 | fast-deep-equal "^3.1.3" 1074 | file-entry-cache "^6.0.1" 1075 | find-up "^5.0.0" 1076 | glob-parent "^6.0.1" 1077 | globals "^13.15.0" 1078 | globby "^11.1.0" 1079 | grapheme-splitter "^1.0.4" 1080 | ignore "^5.2.0" 1081 | import-fresh "^3.0.0" 1082 | imurmurhash "^0.1.4" 1083 | is-glob "^4.0.0" 1084 | js-sdsl "^4.1.4" 1085 | js-yaml "^4.1.0" 1086 | json-stable-stringify-without-jsonify "^1.0.1" 1087 | levn "^0.4.1" 1088 | lodash.merge "^4.6.2" 1089 | minimatch "^3.1.2" 1090 | natural-compare "^1.4.0" 1091 | optionator "^0.9.1" 1092 | regexpp "^3.2.0" 1093 | strip-ansi "^6.0.1" 1094 | strip-json-comments "^3.1.0" 1095 | text-table "^0.2.0" 1096 | 1097 | espree@^9.4.0: 1098 | version "9.4.0" 1099 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" 1100 | integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== 1101 | dependencies: 1102 | acorn "^8.8.0" 1103 | acorn-jsx "^5.3.2" 1104 | eslint-visitor-keys "^3.3.0" 1105 | 1106 | esquery@^1.4.0: 1107 | version "1.4.0" 1108 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 1109 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 1110 | dependencies: 1111 | estraverse "^5.1.0" 1112 | 1113 | esrecurse@^4.3.0: 1114 | version "4.3.0" 1115 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 1116 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1117 | dependencies: 1118 | estraverse "^5.2.0" 1119 | 1120 | estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: 1121 | version "5.3.0" 1122 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 1123 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1124 | 1125 | esutils@^2.0.2: 1126 | version "2.0.3" 1127 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1128 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1129 | 1130 | etag@~1.8.1: 1131 | version "1.8.1" 1132 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 1133 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 1134 | 1135 | express@^4.18.2: 1136 | version "4.18.2" 1137 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 1138 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 1139 | dependencies: 1140 | accepts "~1.3.8" 1141 | array-flatten "1.1.1" 1142 | body-parser "1.20.1" 1143 | content-disposition "0.5.4" 1144 | content-type "~1.0.4" 1145 | cookie "0.5.0" 1146 | cookie-signature "1.0.6" 1147 | debug "2.6.9" 1148 | depd "2.0.0" 1149 | encodeurl "~1.0.2" 1150 | escape-html "~1.0.3" 1151 | etag "~1.8.1" 1152 | finalhandler "1.2.0" 1153 | fresh "0.5.2" 1154 | http-errors "2.0.0" 1155 | merge-descriptors "1.0.1" 1156 | methods "~1.1.2" 1157 | on-finished "2.4.1" 1158 | parseurl "~1.3.3" 1159 | path-to-regexp "0.1.7" 1160 | proxy-addr "~2.0.7" 1161 | qs "6.11.0" 1162 | range-parser "~1.2.1" 1163 | safe-buffer "5.2.1" 1164 | send "0.18.0" 1165 | serve-static "1.15.0" 1166 | setprototypeof "1.2.0" 1167 | statuses "2.0.1" 1168 | type-is "~1.6.18" 1169 | utils-merge "1.0.1" 1170 | vary "~1.1.2" 1171 | 1172 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 1173 | version "3.1.3" 1174 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1175 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1176 | 1177 | fast-glob@^3.2.9: 1178 | version "3.2.12" 1179 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" 1180 | integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== 1181 | dependencies: 1182 | "@nodelib/fs.stat" "^2.0.2" 1183 | "@nodelib/fs.walk" "^1.2.3" 1184 | glob-parent "^5.1.2" 1185 | merge2 "^1.3.0" 1186 | micromatch "^4.0.4" 1187 | 1188 | fast-json-stable-stringify@^2.0.0: 1189 | version "2.1.0" 1190 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1191 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1192 | 1193 | fast-levenshtein@^2.0.6: 1194 | version "2.0.6" 1195 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1196 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 1197 | 1198 | fastq@^1.6.0: 1199 | version "1.13.0" 1200 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 1201 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 1202 | dependencies: 1203 | reusify "^1.0.4" 1204 | 1205 | file-entry-cache@^6.0.1: 1206 | version "6.0.1" 1207 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 1208 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 1209 | dependencies: 1210 | flat-cache "^3.0.4" 1211 | 1212 | fill-range@^7.0.1: 1213 | version "7.0.1" 1214 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1215 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1216 | dependencies: 1217 | to-regex-range "^5.0.1" 1218 | 1219 | finalhandler@1.2.0: 1220 | version "1.2.0" 1221 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 1222 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 1223 | dependencies: 1224 | debug "2.6.9" 1225 | encodeurl "~1.0.2" 1226 | escape-html "~1.0.3" 1227 | on-finished "2.4.1" 1228 | parseurl "~1.3.3" 1229 | statuses "2.0.1" 1230 | unpipe "~1.0.0" 1231 | 1232 | find-up@^5.0.0: 1233 | version "5.0.0" 1234 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1235 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1236 | dependencies: 1237 | locate-path "^6.0.0" 1238 | path-exists "^4.0.0" 1239 | 1240 | flat-cache@^3.0.4: 1241 | version "3.0.4" 1242 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 1243 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 1244 | dependencies: 1245 | flatted "^3.1.0" 1246 | rimraf "^3.0.2" 1247 | 1248 | flatted@^3.1.0: 1249 | version "3.2.7" 1250 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" 1251 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 1252 | 1253 | follow-redirects@^1.15.0: 1254 | version "1.15.2" 1255 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 1256 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 1257 | 1258 | form-data@^4.0.0: 1259 | version "4.0.0" 1260 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 1261 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 1262 | dependencies: 1263 | asynckit "^0.4.0" 1264 | combined-stream "^1.0.8" 1265 | mime-types "^2.1.12" 1266 | 1267 | forwarded@0.2.0: 1268 | version "0.2.0" 1269 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 1270 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 1271 | 1272 | fresh@0.5.2: 1273 | version "0.5.2" 1274 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1275 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 1276 | 1277 | fs-minipass@^2.0.0: 1278 | version "2.1.0" 1279 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" 1280 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 1281 | dependencies: 1282 | minipass "^3.0.0" 1283 | 1284 | fs.realpath@^1.0.0: 1285 | version "1.0.0" 1286 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1287 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1288 | 1289 | fsevents@~2.3.2: 1290 | version "2.3.2" 1291 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 1292 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 1293 | 1294 | function-bind@^1.1.1: 1295 | version "1.1.1" 1296 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1297 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1298 | 1299 | function.prototype.name@^1.1.5: 1300 | version "1.1.5" 1301 | resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" 1302 | integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== 1303 | dependencies: 1304 | call-bind "^1.0.2" 1305 | define-properties "^1.1.3" 1306 | es-abstract "^1.19.0" 1307 | functions-have-names "^1.2.2" 1308 | 1309 | functions-have-names@^1.2.2: 1310 | version "1.2.3" 1311 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 1312 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 1313 | 1314 | gauge@^3.0.0: 1315 | version "3.0.2" 1316 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" 1317 | integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== 1318 | dependencies: 1319 | aproba "^1.0.3 || ^2.0.0" 1320 | color-support "^1.1.2" 1321 | console-control-strings "^1.0.0" 1322 | has-unicode "^2.0.1" 1323 | object-assign "^4.1.1" 1324 | signal-exit "^3.0.0" 1325 | string-width "^4.2.3" 1326 | strip-ansi "^6.0.1" 1327 | wide-align "^1.1.2" 1328 | 1329 | get-caller-file@^2.0.5: 1330 | version "2.0.5" 1331 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1332 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1333 | 1334 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: 1335 | version "1.1.3" 1336 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" 1337 | integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== 1338 | dependencies: 1339 | function-bind "^1.1.1" 1340 | has "^1.0.3" 1341 | has-symbols "^1.0.3" 1342 | 1343 | get-symbol-description@^1.0.0: 1344 | version "1.0.0" 1345 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" 1346 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 1347 | dependencies: 1348 | call-bind "^1.0.2" 1349 | get-intrinsic "^1.1.1" 1350 | 1351 | glob-parent@^5.1.2, glob-parent@~5.1.2: 1352 | version "5.1.2" 1353 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1354 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1355 | dependencies: 1356 | is-glob "^4.0.1" 1357 | 1358 | glob-parent@^6.0.1: 1359 | version "6.0.2" 1360 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1361 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1362 | dependencies: 1363 | is-glob "^4.0.3" 1364 | 1365 | glob@7.1.7: 1366 | version "7.1.7" 1367 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 1368 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 1369 | dependencies: 1370 | fs.realpath "^1.0.0" 1371 | inflight "^1.0.4" 1372 | inherits "2" 1373 | minimatch "^3.0.4" 1374 | once "^1.3.0" 1375 | path-is-absolute "^1.0.0" 1376 | 1377 | glob@^7.1.3, glob@^7.2.0: 1378 | version "7.2.3" 1379 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 1380 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1381 | dependencies: 1382 | fs.realpath "^1.0.0" 1383 | inflight "^1.0.4" 1384 | inherits "2" 1385 | minimatch "^3.1.1" 1386 | once "^1.3.0" 1387 | path-is-absolute "^1.0.0" 1388 | 1389 | globals@^13.15.0: 1390 | version "13.17.0" 1391 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" 1392 | integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== 1393 | dependencies: 1394 | type-fest "^0.20.2" 1395 | 1396 | globby@^11.1.0: 1397 | version "11.1.0" 1398 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1399 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1400 | dependencies: 1401 | array-union "^2.1.0" 1402 | dir-glob "^3.0.1" 1403 | fast-glob "^3.2.9" 1404 | ignore "^5.2.0" 1405 | merge2 "^1.4.1" 1406 | slash "^3.0.0" 1407 | 1408 | grapheme-splitter@^1.0.4: 1409 | version "1.0.4" 1410 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" 1411 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 1412 | 1413 | has-bigints@^1.0.1, has-bigints@^1.0.2: 1414 | version "1.0.2" 1415 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" 1416 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 1417 | 1418 | has-flag@^3.0.0: 1419 | version "3.0.0" 1420 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1421 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1422 | 1423 | has-flag@^4.0.0: 1424 | version "4.0.0" 1425 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1426 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1427 | 1428 | has-property-descriptors@^1.0.0: 1429 | version "1.0.0" 1430 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 1431 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 1432 | dependencies: 1433 | get-intrinsic "^1.1.1" 1434 | 1435 | has-symbols@^1.0.2, has-symbols@^1.0.3: 1436 | version "1.0.3" 1437 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1438 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1439 | 1440 | has-tostringtag@^1.0.0: 1441 | version "1.0.0" 1442 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 1443 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 1444 | dependencies: 1445 | has-symbols "^1.0.2" 1446 | 1447 | has-unicode@^2.0.1: 1448 | version "2.0.1" 1449 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1450 | integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== 1451 | 1452 | has@^1.0.3: 1453 | version "1.0.3" 1454 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1455 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1456 | dependencies: 1457 | function-bind "^1.1.1" 1458 | 1459 | http-errors@2.0.0: 1460 | version "2.0.0" 1461 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 1462 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 1463 | dependencies: 1464 | depd "2.0.0" 1465 | inherits "2.0.4" 1466 | setprototypeof "1.2.0" 1467 | statuses "2.0.1" 1468 | toidentifier "1.0.1" 1469 | 1470 | https-proxy-agent@^5.0.0: 1471 | version "5.0.1" 1472 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" 1473 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== 1474 | dependencies: 1475 | agent-base "6" 1476 | debug "4" 1477 | 1478 | iconv-lite@0.4.24: 1479 | version "0.4.24" 1480 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1481 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1482 | dependencies: 1483 | safer-buffer ">= 2.1.2 < 3" 1484 | 1485 | ignore-by-default@^1.0.1: 1486 | version "1.0.1" 1487 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 1488 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 1489 | 1490 | ignore@^5.2.0: 1491 | version "5.2.0" 1492 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 1493 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 1494 | 1495 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1496 | version "3.3.0" 1497 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1498 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1499 | dependencies: 1500 | parent-module "^1.0.0" 1501 | resolve-from "^4.0.0" 1502 | 1503 | imurmurhash@^0.1.4: 1504 | version "0.1.4" 1505 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1506 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1507 | 1508 | inflight@^1.0.4: 1509 | version "1.0.6" 1510 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1511 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1512 | dependencies: 1513 | once "^1.3.0" 1514 | wrappy "1" 1515 | 1516 | inherits@2, inherits@2.0.4, inherits@^2.0.3: 1517 | version "2.0.4" 1518 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1519 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1520 | 1521 | internal-slot@^1.0.3: 1522 | version "1.0.3" 1523 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" 1524 | integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== 1525 | dependencies: 1526 | get-intrinsic "^1.1.0" 1527 | has "^1.0.3" 1528 | side-channel "^1.0.4" 1529 | 1530 | ipaddr.js@1.9.1: 1531 | version "1.9.1" 1532 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1533 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1534 | 1535 | is-bigint@^1.0.1: 1536 | version "1.0.4" 1537 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" 1538 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 1539 | dependencies: 1540 | has-bigints "^1.0.1" 1541 | 1542 | is-binary-path@~2.1.0: 1543 | version "2.1.0" 1544 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1545 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1546 | dependencies: 1547 | binary-extensions "^2.0.0" 1548 | 1549 | is-boolean-object@^1.1.0: 1550 | version "1.1.2" 1551 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" 1552 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 1553 | dependencies: 1554 | call-bind "^1.0.2" 1555 | has-tostringtag "^1.0.0" 1556 | 1557 | is-callable@^1.1.4, is-callable@^1.2.7: 1558 | version "1.2.7" 1559 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 1560 | integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 1561 | 1562 | is-core-module@^2.8.1, is-core-module@^2.9.0: 1563 | version "2.10.0" 1564 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" 1565 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 1566 | dependencies: 1567 | has "^1.0.3" 1568 | 1569 | is-date-object@^1.0.1: 1570 | version "1.0.5" 1571 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" 1572 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== 1573 | dependencies: 1574 | has-tostringtag "^1.0.0" 1575 | 1576 | is-extglob@^2.1.1: 1577 | version "2.1.1" 1578 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1579 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1580 | 1581 | is-fullwidth-code-point@^3.0.0: 1582 | version "3.0.0" 1583 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1584 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1585 | 1586 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 1587 | version "4.0.3" 1588 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1589 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1590 | dependencies: 1591 | is-extglob "^2.1.1" 1592 | 1593 | is-negative-zero@^2.0.2: 1594 | version "2.0.2" 1595 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" 1596 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 1597 | 1598 | is-number-object@^1.0.4: 1599 | version "1.0.7" 1600 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" 1601 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== 1602 | dependencies: 1603 | has-tostringtag "^1.0.0" 1604 | 1605 | is-number@^7.0.0: 1606 | version "7.0.0" 1607 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1608 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1609 | 1610 | is-regex@^1.1.4: 1611 | version "1.1.4" 1612 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 1613 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 1614 | dependencies: 1615 | call-bind "^1.0.2" 1616 | has-tostringtag "^1.0.0" 1617 | 1618 | is-shared-array-buffer@^1.0.2: 1619 | version "1.0.2" 1620 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" 1621 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 1622 | dependencies: 1623 | call-bind "^1.0.2" 1624 | 1625 | is-string@^1.0.5, is-string@^1.0.7: 1626 | version "1.0.7" 1627 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" 1628 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 1629 | dependencies: 1630 | has-tostringtag "^1.0.0" 1631 | 1632 | is-symbol@^1.0.2, is-symbol@^1.0.3: 1633 | version "1.0.4" 1634 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 1635 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 1636 | dependencies: 1637 | has-symbols "^1.0.2" 1638 | 1639 | is-weakref@^1.0.2: 1640 | version "1.0.2" 1641 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" 1642 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1643 | dependencies: 1644 | call-bind "^1.0.2" 1645 | 1646 | isexe@^2.0.0: 1647 | version "2.0.0" 1648 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1649 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1650 | 1651 | js-sdsl@^4.1.4: 1652 | version "4.1.5" 1653 | resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" 1654 | integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== 1655 | 1656 | "js-tokens@^3.0.0 || ^4.0.0": 1657 | version "4.0.0" 1658 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1659 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1660 | 1661 | js-yaml@^4.1.0: 1662 | version "4.1.0" 1663 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1664 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1665 | dependencies: 1666 | argparse "^2.0.1" 1667 | 1668 | json-schema-traverse@^0.4.1: 1669 | version "0.4.1" 1670 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1671 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1672 | 1673 | json-stable-stringify-without-jsonify@^1.0.1: 1674 | version "1.0.1" 1675 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1676 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1677 | 1678 | json5@^1.0.1: 1679 | version "1.0.1" 1680 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 1681 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 1682 | dependencies: 1683 | minimist "^1.2.0" 1684 | 1685 | jsonwebtoken@^8.5.1: 1686 | version "8.5.1" 1687 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 1688 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 1689 | dependencies: 1690 | jws "^3.2.2" 1691 | lodash.includes "^4.3.0" 1692 | lodash.isboolean "^3.0.3" 1693 | lodash.isinteger "^4.0.4" 1694 | lodash.isnumber "^3.0.3" 1695 | lodash.isplainobject "^4.0.6" 1696 | lodash.isstring "^4.0.1" 1697 | lodash.once "^4.0.0" 1698 | ms "^2.1.1" 1699 | semver "^5.6.0" 1700 | 1701 | "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: 1702 | version "3.3.3" 1703 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" 1704 | integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== 1705 | dependencies: 1706 | array-includes "^3.1.5" 1707 | object.assign "^4.1.3" 1708 | 1709 | jwa@^1.4.1: 1710 | version "1.4.1" 1711 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 1712 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 1713 | dependencies: 1714 | buffer-equal-constant-time "1.0.1" 1715 | ecdsa-sig-formatter "1.0.11" 1716 | safe-buffer "^5.0.1" 1717 | 1718 | jws@^3.2.2: 1719 | version "3.2.2" 1720 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 1721 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1722 | dependencies: 1723 | jwa "^1.4.1" 1724 | safe-buffer "^5.0.1" 1725 | 1726 | language-subtag-registry@~0.3.2: 1727 | version "0.3.22" 1728 | resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" 1729 | integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== 1730 | 1731 | language-tags@^1.0.5: 1732 | version "1.0.5" 1733 | resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" 1734 | integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== 1735 | dependencies: 1736 | language-subtag-registry "~0.3.2" 1737 | 1738 | levn@^0.4.1: 1739 | version "0.4.1" 1740 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1741 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1742 | dependencies: 1743 | prelude-ls "^1.2.1" 1744 | type-check "~0.4.0" 1745 | 1746 | locate-path@^6.0.0: 1747 | version "6.0.0" 1748 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1749 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1750 | dependencies: 1751 | p-locate "^5.0.0" 1752 | 1753 | lodash.includes@^4.3.0: 1754 | version "4.3.0" 1755 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 1756 | integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== 1757 | 1758 | lodash.isboolean@^3.0.3: 1759 | version "3.0.3" 1760 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 1761 | integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== 1762 | 1763 | lodash.isinteger@^4.0.4: 1764 | version "4.0.4" 1765 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 1766 | integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== 1767 | 1768 | lodash.isnumber@^3.0.3: 1769 | version "3.0.3" 1770 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 1771 | integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== 1772 | 1773 | lodash.isplainobject@^4.0.6: 1774 | version "4.0.6" 1775 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1776 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 1777 | 1778 | lodash.isstring@^4.0.1: 1779 | version "4.0.1" 1780 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 1781 | integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== 1782 | 1783 | lodash.merge@^4.6.2: 1784 | version "4.6.2" 1785 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1786 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1787 | 1788 | lodash.once@^4.0.0: 1789 | version "4.1.1" 1790 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 1791 | integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== 1792 | 1793 | lodash@^4.17.21: 1794 | version "4.17.21" 1795 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1796 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1797 | 1798 | loose-envify@^1.1.0, loose-envify@^1.4.0: 1799 | version "1.4.0" 1800 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1801 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1802 | dependencies: 1803 | js-tokens "^3.0.0 || ^4.0.0" 1804 | 1805 | lru-cache@^6.0.0: 1806 | version "6.0.0" 1807 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1808 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1809 | dependencies: 1810 | yallist "^4.0.0" 1811 | 1812 | make-dir@^3.1.0: 1813 | version "3.1.0" 1814 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1815 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1816 | dependencies: 1817 | semver "^6.0.0" 1818 | 1819 | media-typer@0.3.0: 1820 | version "0.3.0" 1821 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1822 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 1823 | 1824 | merge-descriptors@1.0.1: 1825 | version "1.0.1" 1826 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1827 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 1828 | 1829 | merge2@^1.3.0, merge2@^1.4.1: 1830 | version "1.4.1" 1831 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1832 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1833 | 1834 | methods@~1.1.2: 1835 | version "1.1.2" 1836 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1837 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 1838 | 1839 | micromatch@^4.0.4: 1840 | version "4.0.5" 1841 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1842 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1843 | dependencies: 1844 | braces "^3.0.2" 1845 | picomatch "^2.3.1" 1846 | 1847 | mime-db@1.52.0: 1848 | version "1.52.0" 1849 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1850 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1851 | 1852 | mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: 1853 | version "2.1.35" 1854 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1855 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1856 | dependencies: 1857 | mime-db "1.52.0" 1858 | 1859 | mime@1.6.0: 1860 | version "1.6.0" 1861 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1862 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1863 | 1864 | minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: 1865 | version "3.1.2" 1866 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1867 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1868 | dependencies: 1869 | brace-expansion "^1.1.7" 1870 | 1871 | minimist@^1.2.0, minimist@^1.2.6: 1872 | version "1.2.7" 1873 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" 1874 | integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== 1875 | 1876 | minipass@^3.0.0: 1877 | version "3.3.4" 1878 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" 1879 | integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== 1880 | dependencies: 1881 | yallist "^4.0.0" 1882 | 1883 | minizlib@^2.1.1: 1884 | version "2.1.2" 1885 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" 1886 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 1887 | dependencies: 1888 | minipass "^3.0.0" 1889 | yallist "^4.0.0" 1890 | 1891 | mkdirp@^1.0.3: 1892 | version "1.0.4" 1893 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1894 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1895 | 1896 | ms@2.0.0: 1897 | version "2.0.0" 1898 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1899 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 1900 | 1901 | ms@2.1.2: 1902 | version "2.1.2" 1903 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1904 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1905 | 1906 | ms@2.1.3, ms@^2.1.1: 1907 | version "2.1.3" 1908 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1909 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1910 | 1911 | nanoid@^3.3.4: 1912 | version "3.3.4" 1913 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 1914 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 1915 | 1916 | natural-compare@^1.4.0: 1917 | version "1.4.0" 1918 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1919 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1920 | 1921 | negotiator@0.6.3: 1922 | version "0.6.3" 1923 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 1924 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1925 | 1926 | next@12.3.1: 1927 | version "12.3.1" 1928 | resolved "https://registry.yarnpkg.com/next/-/next-12.3.1.tgz#127b825ad2207faf869b33393ec8c75fe61e50f1" 1929 | integrity sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw== 1930 | dependencies: 1931 | "@next/env" "12.3.1" 1932 | "@swc/helpers" "0.4.11" 1933 | caniuse-lite "^1.0.30001406" 1934 | postcss "8.4.14" 1935 | styled-jsx "5.0.7" 1936 | use-sync-external-store "1.2.0" 1937 | optionalDependencies: 1938 | "@next/swc-android-arm-eabi" "12.3.1" 1939 | "@next/swc-android-arm64" "12.3.1" 1940 | "@next/swc-darwin-arm64" "12.3.1" 1941 | "@next/swc-darwin-x64" "12.3.1" 1942 | "@next/swc-freebsd-x64" "12.3.1" 1943 | "@next/swc-linux-arm-gnueabihf" "12.3.1" 1944 | "@next/swc-linux-arm64-gnu" "12.3.1" 1945 | "@next/swc-linux-arm64-musl" "12.3.1" 1946 | "@next/swc-linux-x64-gnu" "12.3.1" 1947 | "@next/swc-linux-x64-musl" "12.3.1" 1948 | "@next/swc-win32-arm64-msvc" "12.3.1" 1949 | "@next/swc-win32-ia32-msvc" "12.3.1" 1950 | "@next/swc-win32-x64-msvc" "12.3.1" 1951 | 1952 | node-addon-api@^5.0.0: 1953 | version "5.0.0" 1954 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" 1955 | integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== 1956 | 1957 | node-fetch@^2.6.7: 1958 | version "2.6.7" 1959 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" 1960 | integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 1961 | dependencies: 1962 | whatwg-url "^5.0.0" 1963 | 1964 | nodemon@^2.0.20: 1965 | version "2.0.20" 1966 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.20.tgz#e3537de768a492e8d74da5c5813cb0c7486fc701" 1967 | integrity sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw== 1968 | dependencies: 1969 | chokidar "^3.5.2" 1970 | debug "^3.2.7" 1971 | ignore-by-default "^1.0.1" 1972 | minimatch "^3.1.2" 1973 | pstree.remy "^1.1.8" 1974 | semver "^5.7.1" 1975 | simple-update-notifier "^1.0.7" 1976 | supports-color "^5.5.0" 1977 | touch "^3.1.0" 1978 | undefsafe "^2.0.5" 1979 | 1980 | nopt@^5.0.0: 1981 | version "5.0.0" 1982 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" 1983 | integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== 1984 | dependencies: 1985 | abbrev "1" 1986 | 1987 | nopt@~1.0.10: 1988 | version "1.0.10" 1989 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1990 | integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== 1991 | dependencies: 1992 | abbrev "1" 1993 | 1994 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1995 | version "3.0.0" 1996 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1997 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1998 | 1999 | npmlog@^5.0.1: 2000 | version "5.0.1" 2001 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" 2002 | integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== 2003 | dependencies: 2004 | are-we-there-yet "^2.0.0" 2005 | console-control-strings "^1.1.0" 2006 | gauge "^3.0.0" 2007 | set-blocking "^2.0.0" 2008 | 2009 | object-assign@^4, object-assign@^4.1.1: 2010 | version "4.1.1" 2011 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 2012 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 2013 | 2014 | object-inspect@^1.12.2, object-inspect@^1.9.0: 2015 | version "1.12.2" 2016 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 2017 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 2018 | 2019 | object-keys@^1.1.1: 2020 | version "1.1.1" 2021 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 2022 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 2023 | 2024 | object.assign@^4.1.3, object.assign@^4.1.4: 2025 | version "4.1.4" 2026 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" 2027 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== 2028 | dependencies: 2029 | call-bind "^1.0.2" 2030 | define-properties "^1.1.4" 2031 | has-symbols "^1.0.3" 2032 | object-keys "^1.1.1" 2033 | 2034 | object.entries@^1.1.5: 2035 | version "1.1.5" 2036 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" 2037 | integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== 2038 | dependencies: 2039 | call-bind "^1.0.2" 2040 | define-properties "^1.1.3" 2041 | es-abstract "^1.19.1" 2042 | 2043 | object.fromentries@^2.0.5: 2044 | version "2.0.5" 2045 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" 2046 | integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== 2047 | dependencies: 2048 | call-bind "^1.0.2" 2049 | define-properties "^1.1.3" 2050 | es-abstract "^1.19.1" 2051 | 2052 | object.hasown@^1.1.1: 2053 | version "1.1.1" 2054 | resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" 2055 | integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== 2056 | dependencies: 2057 | define-properties "^1.1.4" 2058 | es-abstract "^1.19.5" 2059 | 2060 | object.values@^1.1.5: 2061 | version "1.1.5" 2062 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" 2063 | integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== 2064 | dependencies: 2065 | call-bind "^1.0.2" 2066 | define-properties "^1.1.3" 2067 | es-abstract "^1.19.1" 2068 | 2069 | on-finished@2.4.1: 2070 | version "2.4.1" 2071 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 2072 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 2073 | dependencies: 2074 | ee-first "1.1.1" 2075 | 2076 | once@^1.3.0: 2077 | version "1.4.0" 2078 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2079 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 2080 | dependencies: 2081 | wrappy "1" 2082 | 2083 | optionator@^0.9.1: 2084 | version "0.9.1" 2085 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 2086 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 2087 | dependencies: 2088 | deep-is "^0.1.3" 2089 | fast-levenshtein "^2.0.6" 2090 | levn "^0.4.1" 2091 | prelude-ls "^1.2.1" 2092 | type-check "^0.4.0" 2093 | word-wrap "^1.2.3" 2094 | 2095 | p-limit@^3.0.2: 2096 | version "3.1.0" 2097 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 2098 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 2099 | dependencies: 2100 | yocto-queue "^0.1.0" 2101 | 2102 | p-locate@^5.0.0: 2103 | version "5.0.0" 2104 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 2105 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 2106 | dependencies: 2107 | p-limit "^3.0.2" 2108 | 2109 | parent-module@^1.0.0: 2110 | version "1.0.1" 2111 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 2112 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 2113 | dependencies: 2114 | callsites "^3.0.0" 2115 | 2116 | parseurl@~1.3.3: 2117 | version "1.3.3" 2118 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 2119 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 2120 | 2121 | path-exists@^4.0.0: 2122 | version "4.0.0" 2123 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 2124 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 2125 | 2126 | path-is-absolute@^1.0.0: 2127 | version "1.0.1" 2128 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2129 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 2130 | 2131 | path-key@^3.1.0: 2132 | version "3.1.1" 2133 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 2134 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 2135 | 2136 | path-parse@^1.0.7: 2137 | version "1.0.7" 2138 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 2139 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 2140 | 2141 | path-to-regexp@0.1.7: 2142 | version "0.1.7" 2143 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 2144 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 2145 | 2146 | path-type@^4.0.0: 2147 | version "4.0.0" 2148 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 2149 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 2150 | 2151 | picocolors@^1.0.0: 2152 | version "1.0.0" 2153 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 2154 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 2155 | 2156 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 2157 | version "2.3.1" 2158 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 2159 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 2160 | 2161 | postcss@8.4.14: 2162 | version "8.4.14" 2163 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" 2164 | integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== 2165 | dependencies: 2166 | nanoid "^3.3.4" 2167 | picocolors "^1.0.0" 2168 | source-map-js "^1.0.2" 2169 | 2170 | prelude-ls@^1.2.1: 2171 | version "1.2.1" 2172 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 2173 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 2174 | 2175 | prisma@^4.4.0: 2176 | version "4.4.0" 2177 | resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.4.0.tgz#0c53324bf6a29474636b3e1964e0d72e0277bf8f" 2178 | integrity sha512-l/QKLmLcKJQFuc+X02LyICo0NWTUVaNNZ00jKJBqwDyhwMAhboD1FWwYV50rkH4Wls0RviAJSFzkC2ZrfawpfA== 2179 | dependencies: 2180 | "@prisma/engines" "4.4.0" 2181 | 2182 | prop-types@^15.8.1: 2183 | version "15.8.1" 2184 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" 2185 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== 2186 | dependencies: 2187 | loose-envify "^1.4.0" 2188 | object-assign "^4.1.1" 2189 | react-is "^16.13.1" 2190 | 2191 | proxy-addr@~2.0.7: 2192 | version "2.0.7" 2193 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 2194 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 2195 | dependencies: 2196 | forwarded "0.2.0" 2197 | ipaddr.js "1.9.1" 2198 | 2199 | proxy-from-env@^1.1.0: 2200 | version "1.1.0" 2201 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 2202 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 2203 | 2204 | pstree.remy@^1.1.8: 2205 | version "1.1.8" 2206 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 2207 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 2208 | 2209 | punycode@^2.1.0: 2210 | version "2.1.1" 2211 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 2212 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 2213 | 2214 | qs@6.11.0: 2215 | version "6.11.0" 2216 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 2217 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 2218 | dependencies: 2219 | side-channel "^1.0.4" 2220 | 2221 | queue-microtask@^1.2.2: 2222 | version "1.2.3" 2223 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 2224 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 2225 | 2226 | range-parser@~1.2.1: 2227 | version "1.2.1" 2228 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 2229 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 2230 | 2231 | raw-body@2.5.1: 2232 | version "2.5.1" 2233 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 2234 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 2235 | dependencies: 2236 | bytes "3.1.2" 2237 | http-errors "2.0.0" 2238 | iconv-lite "0.4.24" 2239 | unpipe "1.0.0" 2240 | 2241 | react-dom@18.2.0: 2242 | version "18.2.0" 2243 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 2244 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 2245 | dependencies: 2246 | loose-envify "^1.1.0" 2247 | scheduler "^0.23.0" 2248 | 2249 | react-is@^16.13.1: 2250 | version "16.13.1" 2251 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 2252 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 2253 | 2254 | react@18.2.0: 2255 | version "18.2.0" 2256 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 2257 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 2258 | dependencies: 2259 | loose-envify "^1.1.0" 2260 | 2261 | readable-stream@^3.6.0: 2262 | version "3.6.0" 2263 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 2264 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 2265 | dependencies: 2266 | inherits "^2.0.3" 2267 | string_decoder "^1.1.1" 2268 | util-deprecate "^1.0.1" 2269 | 2270 | readdirp@~3.6.0: 2271 | version "3.6.0" 2272 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 2273 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 2274 | dependencies: 2275 | picomatch "^2.2.1" 2276 | 2277 | regenerator-runtime@^0.13.4: 2278 | version "0.13.10" 2279 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" 2280 | integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== 2281 | 2282 | regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: 2283 | version "1.4.3" 2284 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" 2285 | integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== 2286 | dependencies: 2287 | call-bind "^1.0.2" 2288 | define-properties "^1.1.3" 2289 | functions-have-names "^1.2.2" 2290 | 2291 | regexpp@^3.2.0: 2292 | version "3.2.0" 2293 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 2294 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 2295 | 2296 | require-directory@^2.1.1: 2297 | version "2.1.1" 2298 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2299 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 2300 | 2301 | resolve-from@^4.0.0: 2302 | version "4.0.0" 2303 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 2304 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 2305 | 2306 | resolve@^1.20.0, resolve@^1.22.0: 2307 | version "1.22.1" 2308 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 2309 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 2310 | dependencies: 2311 | is-core-module "^2.9.0" 2312 | path-parse "^1.0.7" 2313 | supports-preserve-symlinks-flag "^1.0.0" 2314 | 2315 | resolve@^2.0.0-next.3: 2316 | version "2.0.0-next.4" 2317 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" 2318 | integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== 2319 | dependencies: 2320 | is-core-module "^2.9.0" 2321 | path-parse "^1.0.7" 2322 | supports-preserve-symlinks-flag "^1.0.0" 2323 | 2324 | reusify@^1.0.4: 2325 | version "1.0.4" 2326 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 2327 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 2328 | 2329 | rimraf@^3.0.2: 2330 | version "3.0.2" 2331 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 2332 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 2333 | dependencies: 2334 | glob "^7.1.3" 2335 | 2336 | run-parallel@^1.1.9: 2337 | version "1.2.0" 2338 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 2339 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 2340 | dependencies: 2341 | queue-microtask "^1.2.2" 2342 | 2343 | rxjs@^7.0.0: 2344 | version "7.5.7" 2345 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" 2346 | integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== 2347 | dependencies: 2348 | tslib "^2.1.0" 2349 | 2350 | safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: 2351 | version "5.2.1" 2352 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2353 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2354 | 2355 | safe-regex-test@^1.0.0: 2356 | version "1.0.0" 2357 | resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" 2358 | integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== 2359 | dependencies: 2360 | call-bind "^1.0.2" 2361 | get-intrinsic "^1.1.3" 2362 | is-regex "^1.1.4" 2363 | 2364 | "safer-buffer@>= 2.1.2 < 3": 2365 | version "2.1.2" 2366 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2367 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2368 | 2369 | scheduler@^0.23.0: 2370 | version "0.23.0" 2371 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 2372 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 2373 | dependencies: 2374 | loose-envify "^1.1.0" 2375 | 2376 | semver@^5.6.0, semver@^5.7.1: 2377 | version "5.7.1" 2378 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 2379 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 2380 | 2381 | semver@^6.0.0, semver@^6.3.0: 2382 | version "6.3.0" 2383 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 2384 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 2385 | 2386 | semver@^7.3.5, semver@^7.3.7: 2387 | version "7.3.8" 2388 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" 2389 | integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== 2390 | dependencies: 2391 | lru-cache "^6.0.0" 2392 | 2393 | semver@~7.0.0: 2394 | version "7.0.0" 2395 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 2396 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== 2397 | 2398 | send@0.18.0: 2399 | version "0.18.0" 2400 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 2401 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 2402 | dependencies: 2403 | debug "2.6.9" 2404 | depd "2.0.0" 2405 | destroy "1.2.0" 2406 | encodeurl "~1.0.2" 2407 | escape-html "~1.0.3" 2408 | etag "~1.8.1" 2409 | fresh "0.5.2" 2410 | http-errors "2.0.0" 2411 | mime "1.6.0" 2412 | ms "2.1.3" 2413 | on-finished "2.4.1" 2414 | range-parser "~1.2.1" 2415 | statuses "2.0.1" 2416 | 2417 | serve-static@1.15.0: 2418 | version "1.15.0" 2419 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 2420 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 2421 | dependencies: 2422 | encodeurl "~1.0.2" 2423 | escape-html "~1.0.3" 2424 | parseurl "~1.3.3" 2425 | send "0.18.0" 2426 | 2427 | set-blocking@^2.0.0: 2428 | version "2.0.0" 2429 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2430 | integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== 2431 | 2432 | setprototypeof@1.2.0: 2433 | version "1.2.0" 2434 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 2435 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 2436 | 2437 | shebang-command@^2.0.0: 2438 | version "2.0.0" 2439 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2440 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2441 | dependencies: 2442 | shebang-regex "^3.0.0" 2443 | 2444 | shebang-regex@^3.0.0: 2445 | version "3.0.0" 2446 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2447 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2448 | 2449 | shell-quote@^1.7.3: 2450 | version "1.7.4" 2451 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" 2452 | integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== 2453 | 2454 | side-channel@^1.0.4: 2455 | version "1.0.4" 2456 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 2457 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 2458 | dependencies: 2459 | call-bind "^1.0.0" 2460 | get-intrinsic "^1.0.2" 2461 | object-inspect "^1.9.0" 2462 | 2463 | signal-exit@^3.0.0: 2464 | version "3.0.7" 2465 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 2466 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 2467 | 2468 | simple-update-notifier@^1.0.7: 2469 | version "1.0.7" 2470 | resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz#7edf75c5bdd04f88828d632f762b2bc32996a9cc" 2471 | integrity sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew== 2472 | dependencies: 2473 | semver "~7.0.0" 2474 | 2475 | slash@^3.0.0: 2476 | version "3.0.0" 2477 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2478 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2479 | 2480 | source-map-js@^1.0.2: 2481 | version "1.0.2" 2482 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 2483 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 2484 | 2485 | spawn-command@^0.0.2-1: 2486 | version "0.0.2-1" 2487 | resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" 2488 | integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== 2489 | 2490 | statuses@2.0.1: 2491 | version "2.0.1" 2492 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 2493 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 2494 | 2495 | "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 2496 | version "4.2.3" 2497 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2498 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2499 | dependencies: 2500 | emoji-regex "^8.0.0" 2501 | is-fullwidth-code-point "^3.0.0" 2502 | strip-ansi "^6.0.1" 2503 | 2504 | string.prototype.matchall@^4.0.7: 2505 | version "4.0.7" 2506 | resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" 2507 | integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== 2508 | dependencies: 2509 | call-bind "^1.0.2" 2510 | define-properties "^1.1.3" 2511 | es-abstract "^1.19.1" 2512 | get-intrinsic "^1.1.1" 2513 | has-symbols "^1.0.3" 2514 | internal-slot "^1.0.3" 2515 | regexp.prototype.flags "^1.4.1" 2516 | side-channel "^1.0.4" 2517 | 2518 | string.prototype.trimend@^1.0.5: 2519 | version "1.0.5" 2520 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" 2521 | integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== 2522 | dependencies: 2523 | call-bind "^1.0.2" 2524 | define-properties "^1.1.4" 2525 | es-abstract "^1.19.5" 2526 | 2527 | string.prototype.trimstart@^1.0.5: 2528 | version "1.0.5" 2529 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" 2530 | integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== 2531 | dependencies: 2532 | call-bind "^1.0.2" 2533 | define-properties "^1.1.4" 2534 | es-abstract "^1.19.5" 2535 | 2536 | string_decoder@^1.1.1: 2537 | version "1.3.0" 2538 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2539 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2540 | dependencies: 2541 | safe-buffer "~5.2.0" 2542 | 2543 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2544 | version "6.0.1" 2545 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2546 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2547 | dependencies: 2548 | ansi-regex "^5.0.1" 2549 | 2550 | strip-bom@^3.0.0: 2551 | version "3.0.0" 2552 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2553 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== 2554 | 2555 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 2556 | version "3.1.1" 2557 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 2558 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2559 | 2560 | styled-jsx@5.0.7: 2561 | version "5.0.7" 2562 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.7.tgz#be44afc53771b983769ac654d355ca8d019dff48" 2563 | integrity sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA== 2564 | 2565 | supports-color@^5.5.0: 2566 | version "5.5.0" 2567 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2568 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2569 | dependencies: 2570 | has-flag "^3.0.0" 2571 | 2572 | supports-color@^7.1.0: 2573 | version "7.2.0" 2574 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2575 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2576 | dependencies: 2577 | has-flag "^4.0.0" 2578 | 2579 | supports-color@^8.1.0: 2580 | version "8.1.1" 2581 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 2582 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 2583 | dependencies: 2584 | has-flag "^4.0.0" 2585 | 2586 | supports-preserve-symlinks-flag@^1.0.0: 2587 | version "1.0.0" 2588 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2589 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2590 | 2591 | tar@^6.1.11: 2592 | version "6.1.11" 2593 | resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" 2594 | integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== 2595 | dependencies: 2596 | chownr "^2.0.0" 2597 | fs-minipass "^2.0.0" 2598 | minipass "^3.0.0" 2599 | minizlib "^2.1.1" 2600 | mkdirp "^1.0.3" 2601 | yallist "^4.0.0" 2602 | 2603 | text-table@^0.2.0: 2604 | version "0.2.0" 2605 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2606 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 2607 | 2608 | to-regex-range@^5.0.1: 2609 | version "5.0.1" 2610 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2611 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2612 | dependencies: 2613 | is-number "^7.0.0" 2614 | 2615 | toidentifier@1.0.1: 2616 | version "1.0.1" 2617 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 2618 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 2619 | 2620 | touch@^3.1.0: 2621 | version "3.1.0" 2622 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 2623 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 2624 | dependencies: 2625 | nopt "~1.0.10" 2626 | 2627 | tr46@~0.0.3: 2628 | version "0.0.3" 2629 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 2630 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 2631 | 2632 | tree-kill@^1.2.2: 2633 | version "1.2.2" 2634 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 2635 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 2636 | 2637 | tsconfig-paths@^3.14.1: 2638 | version "3.14.1" 2639 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" 2640 | integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== 2641 | dependencies: 2642 | "@types/json5" "^0.0.29" 2643 | json5 "^1.0.1" 2644 | minimist "^1.2.6" 2645 | strip-bom "^3.0.0" 2646 | 2647 | tslib@^1.8.1: 2648 | version "1.14.1" 2649 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 2650 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 2651 | 2652 | tslib@^2.1.0, tslib@^2.4.0: 2653 | version "2.4.0" 2654 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" 2655 | integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== 2656 | 2657 | tsutils@^3.21.0: 2658 | version "3.21.0" 2659 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 2660 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 2661 | dependencies: 2662 | tslib "^1.8.1" 2663 | 2664 | type-check@^0.4.0, type-check@~0.4.0: 2665 | version "0.4.0" 2666 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2667 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2668 | dependencies: 2669 | prelude-ls "^1.2.1" 2670 | 2671 | type-fest@^0.20.2: 2672 | version "0.20.2" 2673 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2674 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2675 | 2676 | type-is@~1.6.18: 2677 | version "1.6.18" 2678 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2679 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2680 | dependencies: 2681 | media-typer "0.3.0" 2682 | mime-types "~2.1.24" 2683 | 2684 | typescript@4.8.4, typescript@^4.8.4: 2685 | version "4.8.4" 2686 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" 2687 | integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== 2688 | 2689 | unbox-primitive@^1.0.2: 2690 | version "1.0.2" 2691 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" 2692 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 2693 | dependencies: 2694 | call-bind "^1.0.2" 2695 | has-bigints "^1.0.2" 2696 | has-symbols "^1.0.3" 2697 | which-boxed-primitive "^1.0.2" 2698 | 2699 | undefsafe@^2.0.5: 2700 | version "2.0.5" 2701 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 2702 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 2703 | 2704 | unpipe@1.0.0, unpipe@~1.0.0: 2705 | version "1.0.0" 2706 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2707 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 2708 | 2709 | uri-js@^4.2.2: 2710 | version "4.4.1" 2711 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2712 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2713 | dependencies: 2714 | punycode "^2.1.0" 2715 | 2716 | use-sync-external-store@1.2.0: 2717 | version "1.2.0" 2718 | resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" 2719 | integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== 2720 | 2721 | util-deprecate@^1.0.1: 2722 | version "1.0.2" 2723 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2724 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 2725 | 2726 | utils-merge@1.0.1: 2727 | version "1.0.1" 2728 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2729 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 2730 | 2731 | vary@^1, vary@~1.1.2: 2732 | version "1.1.2" 2733 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2734 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 2735 | 2736 | webidl-conversions@^3.0.0: 2737 | version "3.0.1" 2738 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 2739 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 2740 | 2741 | whatwg-url@^5.0.0: 2742 | version "5.0.0" 2743 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 2744 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 2745 | dependencies: 2746 | tr46 "~0.0.3" 2747 | webidl-conversions "^3.0.0" 2748 | 2749 | which-boxed-primitive@^1.0.2: 2750 | version "1.0.2" 2751 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 2752 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 2753 | dependencies: 2754 | is-bigint "^1.0.1" 2755 | is-boolean-object "^1.1.0" 2756 | is-number-object "^1.0.4" 2757 | is-string "^1.0.5" 2758 | is-symbol "^1.0.3" 2759 | 2760 | which@^2.0.1: 2761 | version "2.0.2" 2762 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2763 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2764 | dependencies: 2765 | isexe "^2.0.0" 2766 | 2767 | wide-align@^1.1.2: 2768 | version "1.1.5" 2769 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" 2770 | integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== 2771 | dependencies: 2772 | string-width "^1.0.2 || 2 || 3 || 4" 2773 | 2774 | word-wrap@^1.2.3: 2775 | version "1.2.3" 2776 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 2777 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 2778 | 2779 | wrap-ansi@^7.0.0: 2780 | version "7.0.0" 2781 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2782 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2783 | dependencies: 2784 | ansi-styles "^4.0.0" 2785 | string-width "^4.1.0" 2786 | strip-ansi "^6.0.0" 2787 | 2788 | wrappy@1: 2789 | version "1.0.2" 2790 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2791 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 2792 | 2793 | y18n@^5.0.5: 2794 | version "5.0.8" 2795 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 2796 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 2797 | 2798 | yallist@^4.0.0: 2799 | version "4.0.0" 2800 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2801 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2802 | 2803 | yargs-parser@^21.0.0: 2804 | version "21.1.1" 2805 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 2806 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 2807 | 2808 | yargs@^17.3.1: 2809 | version "17.6.0" 2810 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c" 2811 | integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== 2812 | dependencies: 2813 | cliui "^8.0.1" 2814 | escalade "^3.1.1" 2815 | get-caller-file "^2.0.5" 2816 | require-directory "^2.1.1" 2817 | string-width "^4.2.3" 2818 | y18n "^5.0.5" 2819 | yargs-parser "^21.0.0" 2820 | 2821 | yocto-queue@^0.1.0: 2822 | version "0.1.0" 2823 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2824 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2825 | --------------------------------------------------------------------------------