├── .eslintignore ├── .github ├── FUNDING.yml └── workflows │ └── docker.yml ├── lib ├── middleware │ ├── index.ts │ ├── interaction.ts │ └── auth.ts ├── util │ ├── index.ts │ ├── responses.ts │ ├── urls.ts │ └── oauth.ts ├── struct │ ├── index.ts │ ├── error.ts │ ├── session.ts │ ├── githubREST.ts │ └── discordREST.ts ├── index.ts ├── constants.ts └── types │ ├── node │ └── index.d.ts │ ├── fastify │ └── index.d.ts │ └── discord-api-types │ └── index.d.ts ├── .dockerignore ├── doc └── img │ ├── GitLink-Profile-View.png │ ├── GitLink-Role-Settings.png │ └── GitLink-Verified-Roles-Add.png ├── .eslintrc.json ├── .gitignore ├── .editorconfig ├── .prettierrc.js ├── nodemon.json ├── docker-compose.yml ├── Dockerfile ├── tsconfig.json ├── PRIVACY.md ├── README.md ├── scripts ├── createCmds.ts └── updateMetadata.ts ├── package.json ├── LICENSE ├── src ├── routes │ ├── user.ts │ ├── redirects.ts │ ├── interaction.ts │ └── auth.ts └── index.ts └── pnpm-lock.yaml /.eslintignore: -------------------------------------------------------------------------------- 1 | build/ 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: 'Benricheson101' 2 | ko_fi: 'red_pana' 3 | -------------------------------------------------------------------------------- /lib/middleware/index.ts: -------------------------------------------------------------------------------- 1 | export * from './auth'; 2 | export * from './interaction'; 3 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | * 2 | 3 | !/src 4 | !/lib 5 | !/package.json 6 | !/pnpm-lock.yaml 7 | !/tsconfig.json 8 | -------------------------------------------------------------------------------- /lib/util/index.ts: -------------------------------------------------------------------------------- 1 | export * from './oauth'; 2 | export * from './responses'; 3 | export * from './urls'; 4 | -------------------------------------------------------------------------------- /doc/img/GitLink-Profile-View.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Benricheson101/gitlink/HEAD/doc/img/GitLink-Profile-View.png -------------------------------------------------------------------------------- /doc/img/GitLink-Role-Settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Benricheson101/gitlink/HEAD/doc/img/GitLink-Role-Settings.png -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./node_modules/gts/", 3 | "rules": { 4 | "node/no-unpublished-import": 0 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.env 2 | /stack.env 3 | 4 | /build 5 | /data 6 | /node_modules 7 | 8 | *.vim 9 | *.log 10 | .DS_STORE 11 | -------------------------------------------------------------------------------- /doc/img/GitLink-Verified-Roles-Add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Benricheson101/gitlink/HEAD/doc/img/GitLink-Verified-Roles-Add.png -------------------------------------------------------------------------------- /lib/struct/index.ts: -------------------------------------------------------------------------------- 1 | export * from './discordREST'; 2 | export * from './error'; 3 | export * from './githubREST'; 4 | export * from './session'; 5 | -------------------------------------------------------------------------------- /lib/index.ts: -------------------------------------------------------------------------------- 1 | export * as constants from './constants'; 2 | export * from './middleware'; 3 | export * from './struct'; 4 | export * from './util'; 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | insert_final_newline = true 9 | -------------------------------------------------------------------------------- /lib/util/responses.ts: -------------------------------------------------------------------------------- 1 | export const errorResponse = ( 2 | reason: string, 3 | other: Record = {} 4 | ) => ({ 5 | reason, 6 | ...other, 7 | }); 8 | 9 | export const successResponse = (data: T) => ({ 10 | ...data, 11 | }); 12 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ...require('gts/.prettierrc.json'), 3 | pluginSearchDirs: [__dirname], 4 | importOrder: ['^node:', '', '^gitlink', '^[./]'], 5 | importOrderSeparation: true, 6 | importOrderSortSpecifiers: true, 7 | }; 8 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "exitcrash": false, 3 | "verbose": true, 4 | "runOnChangeOnly": false, 5 | "watch": ["src", "lib"], 6 | "ignore": ["./node_modules", "./build", "./test", "*.log", "*.vim"], 7 | "ext": "js,ts,json,yaml,yml,toml", 8 | "exec": "ts-node --files -r dotenv/config -r tsconfig-paths/register src/index.ts" 9 | } 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | bot: 3 | build: '.' 4 | depends_on: 5 | - 'redis' 6 | ports: 7 | - '3000:3000' 8 | restart: 'on-failure' 9 | env_file: 'stack.env' 10 | 11 | redis: 12 | image: 'redis' 13 | restart: 'always' 14 | volumes: 15 | - 'redis_data:/data' 16 | 17 | volumes: 18 | redis_data: 19 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | WORKDIR /usr/src/app 3 | EXPOSE 3000 4 | 5 | RUN apk add curl 6 | RUN curl -fsSL "https://github.com/pnpm/pnpm/releases/latest/download/pnpm-linuxstatic-x64" -o /bin/pnpm; chmod +x /bin/pnpm; 7 | 8 | COPY ./package.json ./pnpm-lock.yaml ./ 9 | RUN pnpm install --frozen-lockfile 10 | 11 | COPY . . 12 | RUN pnpm run build 13 | 14 | CMD ["node", "."] 15 | -------------------------------------------------------------------------------- /lib/constants.ts: -------------------------------------------------------------------------------- 1 | export const GITHUB_SCOPES = ['read:user', 'repo']; 2 | export const DISCORD_SCOPES = ['identify', 'role_connections.write']; 3 | 4 | export enum ApplicationRoleConnectionMetadataType { 5 | NumberLessThan = 1, 6 | NumberGreaterThan = 2, 7 | NumberEqual = 3, 8 | NumberNotEqual = 4, 9 | DateTimeLessThan = 5, 10 | DateTimeGreaterThan = 6, 11 | BooleanEqual = 7, 12 | } 13 | -------------------------------------------------------------------------------- /lib/struct/error.ts: -------------------------------------------------------------------------------- 1 | import URL from 'node:url'; 2 | 3 | export class RESTError extends Error { 4 | constructor( 5 | public readonly method: string, 6 | public readonly code: number, 7 | url: string, 8 | public readonly response?: unknown 9 | ) { 10 | const u = URL.parse(url); 11 | 12 | super(`[OUTGOING] \`${method} ${u.pathname}\` responded with code ${code}`); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/types/node/index.d.ts: -------------------------------------------------------------------------------- 1 | import '@types/node'; 2 | 3 | declare global { 4 | namespace NodeJS { 5 | export interface ProcessEnv { 6 | GITHUB_CLIENT_ID: string; 7 | GITHUB_CLIENT_SECRET: string; 8 | GITHUB_REDIRECT_URI: string; 9 | 10 | DISCORD_CLIENT_ID: string; 11 | DISCORD_CLIENT_SECRET: string; 12 | DISCORD_REDIRECT_URI: string; 13 | DISCORD_PUBLIC_KEY: string; 14 | 15 | REDIS_HOST: string; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./node_modules/gts/tsconfig-google.json", 3 | "compilerOptions": { 4 | "rootDir": ".", 5 | "outDir": "build", 6 | "skipLibCheck": true, 7 | "esModuleInterop": true, 8 | "typeRoots": ["node_modules/@types", "lib/types"], 9 | "baseUrl": ".", 10 | "paths": { 11 | "gitlink": ["lib"], 12 | "gitlink/constants": ["lib/constants"] 13 | } 14 | }, 15 | "include": [ 16 | "src/**/*.ts", 17 | "lib/**/*.ts", 18 | "scripts/**/*.ts" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /lib/types/fastify/index.d.ts: -------------------------------------------------------------------------------- 1 | import {SessionData, SessionStore} from '../../struct/session'; 2 | 3 | declare module 'fastify' { 4 | export interface FastifyInstance { 5 | // added in src/index.ts 6 | /** 7 | * auth session storage 8 | */ 9 | sessions: SessionStore; 10 | } 11 | 12 | export interface FastifyRequest { 13 | // added in lib/middleware/auth.ts 14 | /** 15 | * the session ID of the current request, available when using `requireAuth` middleware 16 | */ 17 | sessionID: string | null; 18 | /** 19 | * the current session data, available when using `requireAuth` middleware 20 | */ 21 | session?: SessionData | null; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /PRIVACY.md: -------------------------------------------------------------------------------- 1 |

Privacy Policy

2 |

Effective Date: November 30, 2022

3 | 4 | GitLink ("we", "us", "our") operates the https://gitlink.dev website, and the GitLink Discord application (the "Service"). 5 | 6 | This document outlines what data we collect, how we use it, and how we store it. 7 | 8 | ### Types of Data Collected 9 | We do not collect any personal data. 10 | 11 | ### Disclosure of Data 12 | Data is not shared with any third parties. 13 | 14 | ### Contact Us 15 | If you have any further questions or concerns, we're happy to help. Please join our [support Discord server](https://discord.gg/ABwYM9y6Sm), and we'll get back to you as soon as possible. 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

GitLink 🔗

2 | 3 | Simple Verified Roles for GitHub! 4 | 5 | ![GitLink profile](doc/img/GitLink-Profile-View.png) 6 | 7 | # Usage 8 | 1. [Invite the bot](https://gitlink.dev/invite) 9 | 2. Create a role requiring GitLink verification 10 | ![create GitLink role](doc/img/GitLink-Role-Settings.png) 11 | 3. To add a verified role, click the server name > Verified Roles, and choose the one you would like to add 12 | ![add GitLink role](doc/img/GitLink-Verified-Roles-Add.png) 13 | 14 | Need help? Hit us up in our [support server](https://discord.gg/ABwYM9y6Sm). 15 | 16 | # FAQ 17 | ### How do I update my stats? 18 | To update your stats, either run the `/refresh` command from the bot, or navigate to https://gitlink.dev/login. 19 | 20 | # TODO 21 | - [ ] Verify a user is a member of an organization 22 | - [ ] Verify a user has contributed to a repository 23 | - [ ] User statistics command 24 | -------------------------------------------------------------------------------- /lib/util/urls.ts: -------------------------------------------------------------------------------- 1 | import {encode as encodeQS} from 'node:querystring'; 2 | 3 | export const getGitHubAuthURL = ({ 4 | scopes, 5 | state, 6 | }: { 7 | scopes: string[]; 8 | state: string; 9 | }) => { 10 | const qs = encodeQS({ 11 | client_id: process.env.GITHUB_CLIENT_ID, 12 | redirect_uri: process.env.GITHUB_REDIRECT_URI, 13 | scope: scopes.join(' '), 14 | state, 15 | }); 16 | 17 | return `https://github.com/login/oauth/authorize?${qs}`; 18 | }; 19 | 20 | export const getDiscordAuthURL = ({ 21 | responseType = 'code', 22 | scopes, 23 | state, 24 | }: { 25 | responseType?: string; 26 | scopes: string[]; 27 | state?: string; 28 | }) => { 29 | const qs = encodeQS({ 30 | client_id: process.env.DISCORD_CLIENT_ID, 31 | redirect_uri: process.env.DISCORD_REDIRECT_URI, 32 | response_type: responseType, 33 | scope: scopes.join(' '), 34 | prompt: 'none', 35 | state, 36 | }); 37 | 38 | return `https://discord.com/oauth2/authorize?${qs}`; 39 | }; 40 | -------------------------------------------------------------------------------- /scripts/createCmds.ts: -------------------------------------------------------------------------------- 1 | import {RESTPutAPIApplicationCommandsJSONBody} from 'discord-api-types/v10'; 2 | import 'dotenv/config'; 3 | import {fetch} from 'undici'; 4 | 5 | const cmds: RESTPutAPIApplicationCommandsJSONBody = [ 6 | { 7 | name: 'ping', 8 | description: 'Pong!', 9 | }, 10 | { 11 | name: 'refresh', 12 | description: 'Refresh your GitHub statistics', 13 | }, 14 | { 15 | name: 'support', 16 | description: 'Get a link to join the support server', 17 | }, 18 | ]; 19 | 20 | const main = async () => { 21 | const created = await fetch( 22 | `https://discord.com/api/v10/applications/${process.env.DISCORD_CLIENT_ID}/commands`, 23 | { 24 | method: 'PUT', 25 | headers: { 26 | 'Content-Type': 'application/json', 27 | Authorization: `Bot ${process.env.DISCORD_TOKEN}`, 28 | }, 29 | 30 | body: JSON.stringify(cmds), 31 | } 32 | ).then(r => r.json()); 33 | 34 | console.dir(created, {depth: null}); 35 | }; 36 | 37 | main().catch(console.error); 38 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitlink", 3 | "version": "1.0.0", 4 | "main": "build/src/index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "lint": "gts lint", 8 | "clean": "gts clean", 9 | "build": "tsc && tsc-alias -s", 10 | "fmt": "gts fix", 11 | "dev": "nodemon" 12 | }, 13 | "devDependencies": { 14 | "@octokit/types": "^8.0.0", 15 | "@trivago/prettier-plugin-sort-imports": "^3.4.0", 16 | "@types/node": "^18.11.9", 17 | "gts": "^3.1.1", 18 | "nodemon": "^2.0.20", 19 | "prettier": "^2.7.1", 20 | "ts-node": "^10.9.1", 21 | "tsc-alias": "^1.7.1", 22 | "tsconfig-paths": "^4.1.0", 23 | "typescript": "~4.7.0" 24 | }, 25 | "dependencies": { 26 | "@fastify/cookie": "^8.3.0", 27 | "@octokit/rest": "^19.0.5", 28 | "discord-api-types": "^0.37.17", 29 | "discord-verify": "^1.0.0", 30 | "dotenv": "^16.0.3", 31 | "fastify": "^4.9.2", 32 | "ioredis": "^5.2.4", 33 | "undici": "^5.12.0" 34 | }, 35 | "engines": { 36 | "node": ">=18.12.2" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Benjamin Richeson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/middleware/interaction.ts: -------------------------------------------------------------------------------- 1 | import {webcrypto} from 'crypto'; 2 | import { 3 | APIInteraction, 4 | APIInteractionResponse, 5 | InteractionResponseType, 6 | InteractionType, 7 | } from 'discord-api-types/v10'; 8 | import {PlatformAlgorithm, verify} from 'discord-verify/node'; 9 | import {FastifyReply} from 'fastify'; 10 | import {FastifyRequest} from 'fastify'; 11 | 12 | export const verifyInteraction = async ( 13 | req: FastifyRequest<{ 14 | Headers: { 15 | 'x-signature-ed25519': string; 16 | 'x-signature-timestamp': string; 17 | }; 18 | Body: APIInteraction; 19 | }>, 20 | reply: FastifyReply 21 | ) => { 22 | if (req.method !== 'POST') { 23 | return reply.status(405).send('Method Not Allowed'); 24 | } 25 | 26 | const sig = req.headers['x-signature-ed25519']; 27 | const ts = req.headers['x-signature-timestamp']; 28 | const body = JSON.stringify(req.body); 29 | 30 | const isValid = await verify( 31 | body, 32 | sig, 33 | ts, 34 | process.env.DISCORD_PUBLIC_KEY, 35 | webcrypto.subtle, 36 | PlatformAlgorithm.NewNode 37 | ); 38 | 39 | if (!isValid) { 40 | return reply.status(401).send('Unauthorized'); 41 | } 42 | 43 | if (req.body.type === InteractionType.Ping) { 44 | return reply.status(200).send({ 45 | type: InteractionResponseType.Pong, 46 | } as APIInteractionResponse); 47 | } 48 | 49 | return; 50 | }; 51 | -------------------------------------------------------------------------------- /lib/types/discord-api-types/index.d.ts: -------------------------------------------------------------------------------- 1 | import {LocalizationMap} from 'discord-api-types/v10'; 2 | 3 | declare module 'discord-api-types/v10' { 4 | // moved to lib/constants.ts 5 | // export enum ApplicationRoleConnectionMetadataType { 6 | // NumberLessThan = 1, 7 | // NumberGreaterThan = 2, 8 | // NumberEqual = 3, 9 | // NumberNotEqual = 4, 10 | // DateTimeLessThan = 5, 11 | // DateTimeGreaterThan = 6, 12 | // BooleanEqual = 7, 13 | // } 14 | 15 | export interface ApplicationRoleConnectionMetadataEntry { 16 | key: string; 17 | name: string; 18 | name_localizations?: LocalizationMap; 19 | description: string; 20 | description_localizations?: LocalizationMap; 21 | type: ApplicationRoleConnectionMetadataType; 22 | } 23 | 24 | export type ApplicationRoleConnectionMetadata = 25 | ApplicationRoleConnectionMetadataEntry[]; 26 | 27 | export interface ApplicationUserRoleConnection< 28 | Metadata extends {[key: string]: string} = {[key: string]: string} 29 | > { 30 | platform_name: string; 31 | platform_username: string | null; 32 | metadata: Metadata; 33 | // metadata: { 34 | // /** 35 | // * key references `ApplicationRoleConnectionMetadataEntry.key` 36 | // * **NOTE:** value is ALWAYS a string, regardless of metadata type 37 | // */ 38 | // [key: string]: `${number}`; 39 | // }; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/routes/user.ts: -------------------------------------------------------------------------------- 1 | import {FastifyInstance, FastifyPluginOptions} from 'fastify'; 2 | 3 | import { 4 | DiscordRESTClient, 5 | RESTError, 6 | errorResponse, 7 | requireAuth, 8 | successResponse, 9 | } from 'gitlink'; 10 | 11 | export const loadUserRoutes = ( 12 | server: FastifyInstance, 13 | _opts: FastifyPluginOptions, 14 | done: () => void 15 | ) => { 16 | server.get( 17 | '/user', 18 | {preHandler: [requireAuth(false)]}, 19 | async (req, reply) => { 20 | const session = req.session!; 21 | const dRest = new DiscordRESTClient(session); 22 | 23 | try { 24 | const user = await dRest.getUser(); 25 | 26 | // this shouldn't happen 27 | if (!user) { 28 | return reply.status(500).send(errorResponse('invalid scope')); 29 | } 30 | 31 | return reply.status(200).send(successResponse(user)); 32 | } catch (err) { 33 | if (err instanceof RESTError) { 34 | if (err.code === 401) { 35 | await req.server.sessions.delete(req.sessionID!); 36 | reply.clearCookie('sessionID'); 37 | return reply.status(401).send(errorResponse('unauthorized')); 38 | } 39 | 40 | return reply.status(err.code).send(errorResponse(err.message)); 41 | } 42 | 43 | return reply.status(500).send(errorResponse('unhandled error')); 44 | } 45 | } 46 | ); 47 | 48 | done(); 49 | }; 50 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import cookie from '@fastify/cookie'; 2 | import 'dotenv/config'; 3 | import {fastify} from 'fastify'; 4 | import Redis from 'ioredis'; 5 | 6 | import {SessionStore} from 'gitlink'; 7 | 8 | import {loadAuthRoutes} from './routes/auth'; 9 | import {loadInteractionRoutes} from './routes/interaction'; 10 | import {loadRedirectRoutes} from './routes/redirects'; 11 | import {loadUserRoutes} from './routes/user'; 12 | 13 | const main = async () => { 14 | const server = fastify({ 15 | logger: true, 16 | }); 17 | await server.register(cookie); 18 | 19 | const redis = new Redis({ 20 | host: process.env.REDIS_HOST, 21 | }); 22 | const sessionStore = new SessionStore(redis); 23 | 24 | await server.register(loadRedirectRoutes); 25 | await server.register(loadAuthRoutes, {prefix: '/auth'}); 26 | await server.register(loadInteractionRoutes); 27 | await server.register(loadUserRoutes); 28 | 29 | server.decorate('sessions', sessionStore); 30 | server.decorateRequest('sessionID', null); 31 | server.decorateRequest('session', null); 32 | 33 | server.listen( 34 | { 35 | host: '0.0.0.0', 36 | port: 3000, 37 | }, 38 | (err, addr) => { 39 | if (err) { 40 | console.error('Failed to start server:', err); 41 | throw err; 42 | } 43 | 44 | console.log(`Server listening on addr=${addr}`); 45 | } 46 | ); 47 | }; 48 | 49 | main().catch(console.error); 50 | -------------------------------------------------------------------------------- /lib/util/oauth.ts: -------------------------------------------------------------------------------- 1 | import {encode as encodeQS} from 'node:querystring'; 2 | 3 | import {fetch} from 'undici'; 4 | 5 | export const exchangeCode = async (options: { 6 | clientID: string; 7 | clientSecret: string; 8 | code: string; 9 | endpoint: string; 10 | redirectURI?: string; 11 | }) => { 12 | const body = encodeQS({ 13 | code: options.code, 14 | client_id: options.clientID, 15 | client_secret: options.clientSecret, 16 | grant_type: 'authorization_code', 17 | redirect_uri: options.redirectURI, 18 | }); 19 | 20 | const resp = await fetch(options.endpoint, { 21 | method: 'POST', 22 | headers: { 23 | 'Content-Type': 'application/x-www-form-urlencoded', 24 | Accept: 'application/json', 25 | }, 26 | body, 27 | }); 28 | 29 | return resp; 30 | }; 31 | 32 | export const refreshToken = async (options: { 33 | refreshToken: string; 34 | clientID: string; 35 | clientSecret: string; 36 | endpoint: string; 37 | redirectURI?: string; 38 | }) => { 39 | const body = encodeQS({ 40 | refresh_token: options.refreshToken, 41 | client_id: options.clientID, 42 | client_secret: options.clientSecret, 43 | grant_type: 'refresh_token', 44 | redirect_uri: options.redirectURI, 45 | }); 46 | 47 | const resp = await fetch(options.endpoint, { 48 | method: 'POST', 49 | headers: { 50 | 'Content-Type': 'application/x-www-form-urlencoded', 51 | Accept: 'application/json', 52 | }, 53 | body, 54 | }); 55 | 56 | return resp; 57 | }; 58 | -------------------------------------------------------------------------------- /lib/struct/session.ts: -------------------------------------------------------------------------------- 1 | import crypto from 'node:crypto'; 2 | 3 | import {Redis} from 'ioredis'; 4 | 5 | export const generateSessionID = () => 6 | crypto.randomBytes(16).toString('base64url'); 7 | 8 | const TTL = 60 * 60 * 24 * 30; // 30 days 9 | 10 | export class SessionStore { 11 | constructor(private client: Redis) {} 12 | 13 | #prefix(id: string) { 14 | return `session:${id}`; 15 | } 16 | 17 | async create(data: SessionData): Promise { 18 | const sID = generateSessionID(); 19 | const isSet = await this.set(sID, data); 20 | 21 | return isSet ? sID : null; 22 | } 23 | 24 | async get(id: string) { 25 | const session = await this.client 26 | .pipeline() 27 | .get(this.#prefix(id)) 28 | .expire(this.#prefix(id), TTL) 29 | .exec(); 30 | 31 | if ( 32 | !session || 33 | !session[0] || 34 | session?.[0]?.[0] instanceof Error || 35 | !session?.[0]?.[1] 36 | ) { 37 | return null; 38 | } 39 | 40 | return JSON.parse(session[0][1] as string) as SessionData; 41 | } 42 | 43 | async set(id: string, data: SessionData) { 44 | const res = await this.client.setex( 45 | this.#prefix(id), 46 | TTL, 47 | JSON.stringify(data) 48 | ); 49 | 50 | return res === 'OK'; 51 | } 52 | 53 | async delete(id: string) { 54 | await this.client.del(this.#prefix(id)); 55 | } 56 | } 57 | 58 | export interface SessionData { 59 | accessToken: string; 60 | refreshToken: string; 61 | scopes: string[]; 62 | expiresAt: number; 63 | userID?: string; 64 | } 65 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: 'Publish Docker image' 2 | 3 | on: 4 | push: 5 | branches: ['main'] 6 | 7 | jobs: 8 | push_to_registries: 9 | name: 'Push Docker image to multiple registries' 10 | runs-on: 'ubuntu-latest' 11 | permissions: 12 | packages: 'write' 13 | contents: 'read' 14 | 15 | steps: 16 | - name: 'Check out the repo' 17 | uses: 'actions/checkout@v2' 18 | 19 | - name: 'Log in to Docker Hub' 20 | uses: 'docker/login-action@v1' 21 | with: 22 | username: '${{secrets.DOCKER_USERNAME}}' 23 | password: '${{secrets.DOCKER_PASSWORD}}' 24 | 25 | - name: 'Log in to the Container registry' 26 | uses: 'docker/login-action@v1' 27 | with: 28 | registry: 'ghcr.io' 29 | username: '${{github.actor}}' 30 | password: '${{secrets.GITHUB_TOKEN}}' 31 | 32 | - name: 'Extract metadata (tags, labels) for Docker' 33 | id: 'meta' 34 | uses: 'docker/metadata-action@v3' 35 | with: 36 | images: | 37 | benricheson101/${{github.event.repository.name}} 38 | ghcr.io/${{github.actor}}/${{github.event.repository.name}} 39 | tags: | 40 | type=raw,value=latest,enable={{is_default_branch}} 41 | - name: 'Build and push Docker images' 42 | uses: 'docker/build-push-action@v2' 43 | with: 44 | context: '.' 45 | file: 'Dockerfile' 46 | push: true 47 | tags: '${{steps.meta.outputs.tags}}' 48 | labels: '${{steps.meta.outputs.labels}}' 49 | -------------------------------------------------------------------------------- /src/routes/redirects.ts: -------------------------------------------------------------------------------- 1 | import {FastifyInstance, FastifyPluginOptions} from 'fastify'; 2 | 3 | import {getGitHubAuthURL, requireAuth} from 'gitlink'; 4 | import {GITHUB_SCOPES} from 'gitlink/constants'; 5 | 6 | const REDIRECTS: {[path: string]: string} = { 7 | '': 'https://github.com/benricheson101/GitLink', 8 | support: 'https://discord.gg/ABwYM9y6Sm', 9 | privacy: 'https://github.com/Benricheson101/gitlink/blob/main/PRIVACY.yml', 10 | invite: `https://discord.com/api/oauth2/authorize?client_id=${process.env.DISCORD_CLIENT_ID}&permissions=268435456&scope=bot%20applications.commands`, 11 | }; 12 | 13 | export const loadRedirectRoutes = ( 14 | server: FastifyInstance, 15 | _opts: FastifyPluginOptions, 16 | done: () => void 17 | ) => { 18 | server.get<{ 19 | Params: { 20 | slug: string; 21 | }; 22 | }>('/:slug', async (req, reply) => { 23 | const slug = req.params.slug; 24 | 25 | if (!(slug in REDIRECTS)) { 26 | return reply.status(404).send('Not Found'); 27 | } 28 | 29 | return reply.redirect(302, REDIRECTS[slug]); 30 | }); 31 | 32 | // checks if the user is already logged in to Discord 33 | // allowing them to skip the Discord auth flow, and 34 | // going straight to GitHub 35 | server.get( 36 | '/login', 37 | { 38 | preHandler: [requireAuth(true)], 39 | }, 40 | (req, reply) => { 41 | const sID = req.sessionID!; 42 | 43 | return reply.redirect( 44 | 302, 45 | getGitHubAuthURL({ 46 | scopes: GITHUB_SCOPES, 47 | state: sID, 48 | }) 49 | ); 50 | } 51 | ); 52 | 53 | done(); 54 | }; 55 | -------------------------------------------------------------------------------- /lib/middleware/auth.ts: -------------------------------------------------------------------------------- 1 | import {FastifyReply, FastifyRequest} from 'fastify'; 2 | 3 | import {DISCORD_SCOPES} from '../constants'; 4 | import {DiscordRESTClient, RESTError} from '../struct'; 5 | import {errorResponse, getDiscordAuthURL} from '../util'; 6 | 7 | export const requireAuth = 8 | (redirToLogin = false) => 9 | async (req: FastifyRequest, reply: FastifyReply) => { 10 | const sessions = req.server.sessions; 11 | const loginURL = getDiscordAuthURL({scopes: DISCORD_SCOPES}); 12 | 13 | const sessionID = req.cookies.sessionID; 14 | if (!sessionID) { 15 | if (redirToLogin) { 16 | return reply.redirect(302, loginURL); 17 | } 18 | 19 | return reply.status(401).send(errorResponse('unauthorized')); 20 | } 21 | 22 | const session = await sessions.get(sessionID); 23 | if (!session) { 24 | if (redirToLogin) { 25 | return reply.redirect(302, loginURL); 26 | } 27 | return reply.status(401).send(errorResponse('unauthorized')); 28 | } 29 | 30 | if (session.expiresAt <= Date.now()) { 31 | const dClient = new DiscordRESTClient(session); 32 | 33 | try { 34 | await dClient.refresh(); 35 | await sessions.set(sessionID, dClient.toSessionData()); 36 | } catch (e) { 37 | if (e instanceof RESTError) { 38 | console.error('Failed to refresh session token:', e); 39 | await sessions.delete(sessionID); 40 | 41 | if (redirToLogin) { 42 | return reply.redirect(302, loginURL); 43 | } 44 | 45 | return reply.status(401).send('unauthorized'); 46 | } 47 | 48 | return reply.status(500).send(); 49 | } 50 | } 51 | 52 | req.sessionID = sessionID; 53 | req.session = session; 54 | 55 | return; 56 | }; 57 | -------------------------------------------------------------------------------- /scripts/updateMetadata.ts: -------------------------------------------------------------------------------- 1 | import {ApplicationRoleConnectionMetadata} from 'discord-api-types/v10'; 2 | import 'dotenv/config'; 3 | import {fetch} from 'undici'; 4 | 5 | import {ApplicationRoleConnectionMetadataType} from 'gitlink/constants'; 6 | 7 | const main = async () => { 8 | const metadata: ApplicationRoleConnectionMetadata = [ 9 | { 10 | key: 'account_created_at', 11 | name: 'Creation Date', 12 | description: 'The minimum GitHub account age (days)', 13 | type: ApplicationRoleConnectionMetadataType.DateTimeGreaterThan, 14 | }, 15 | { 16 | key: 'owned_repos', 17 | name: 'Owned Repositories', 18 | description: 'The minimum number of repositories the user must own', 19 | type: ApplicationRoleConnectionMetadataType.NumberGreaterThan, 20 | }, 21 | { 22 | key: 'stars_given', 23 | name: 'Stars Given', 24 | description: 'The minimum number of repos the user must have starred', 25 | type: ApplicationRoleConnectionMetadataType.NumberGreaterThan, 26 | }, 27 | { 28 | key: 'stars_received', 29 | name: 'Stars Received', 30 | description: 31 | 'The minimum number of total stars the user must have recieved on all of their repos', 32 | type: ApplicationRoleConnectionMetadataType.NumberGreaterThan, 33 | }, 34 | ]; 35 | 36 | const created = await fetch( 37 | `https://discord.com/api/v10/applications/${process.env.DISCORD_CLIENT_ID}/role-connections/metadata`, 38 | { 39 | method: 'PUT', 40 | headers: { 41 | 'Content-Type': 'application/json', 42 | Authorization: `Bot ${process.env.DISCORD_TOKEN}`, 43 | }, 44 | 45 | body: JSON.stringify(metadata), 46 | } 47 | ).then(r => r.json()); 48 | 49 | console.dir(created, {depth: null}); 50 | }; 51 | 52 | main().catch(e => console.dir(e, {depth: null})); 53 | -------------------------------------------------------------------------------- /lib/struct/githubREST.ts: -------------------------------------------------------------------------------- 1 | import {encode as encodeQS} from 'node:querystring'; 2 | 3 | import {Octokit} from '@octokit/rest'; 4 | import {Endpoints} from '@octokit/types'; 5 | import {fetch} from 'undici'; 6 | 7 | const getLastPageNumber = (linkHeader: string) => { 8 | const LAST_PAGE_REGEX = 9 | /;\srel="last"/; 10 | 11 | const lastPageMatch = linkHeader.match(LAST_PAGE_REGEX); 12 | if (!lastPageMatch) { 13 | console.error('failed to find last page'); 14 | return 0; 15 | } 16 | 17 | return parseInt(lastPageMatch[1]) || 1; 18 | }; 19 | 20 | export class GitHubRESTClient { 21 | constructor(readonly octokit: Octokit) {} 22 | 23 | async getUser(): Promise { 24 | return this.octokit.users.getAuthenticated(); 25 | } 26 | 27 | async getUserRepos() { 28 | return this.octokit.paginate('GET /user/repos'); 29 | } 30 | 31 | async getStarredRepoCount() { 32 | const r = await this.octokit.request({url: '/user/starred?per_page=1'}); 33 | const linkHeader = r.headers.link; 34 | 35 | if (!linkHeader) { 36 | return 0; 37 | } 38 | 39 | const pages = getLastPageNumber(linkHeader); 40 | return pages - 1; 41 | } 42 | 43 | async getRepoStats() { 44 | const allRepos = await this.octokit.paginate('GET /user/repos', { 45 | affiliation: 'owner,collaborator,organization_member', 46 | }); 47 | 48 | const stats = allRepos.reduce( 49 | (a, c) => { 50 | a.starsReceived += c.stargazers_count; 51 | a.timesForked += c.forks; 52 | 53 | if (c.fork) { 54 | a.reposForked += 1; 55 | } 56 | 57 | return a; 58 | }, 59 | {starsReceived: 0, timesForked: 0, reposForked: 0} 60 | ); 61 | 62 | return stats; 63 | } 64 | 65 | static async login(code: string) { 66 | const {access_token} = await this.exchangeCode(code); 67 | 68 | const octokit = new Octokit({ 69 | auth: access_token, 70 | userAgent: 'GitLink', 71 | request: { 72 | fetch, 73 | }, 74 | }); 75 | 76 | return new this(octokit); 77 | } 78 | 79 | static async exchangeCode(code: string) { 80 | const ENDPOINT = 'https://github.com/login/oauth/access_token'; 81 | 82 | const resp = await fetch(ENDPOINT, { 83 | method: 'POST', 84 | headers: { 85 | 'Content-Type': 'application/x-www-form-urlencoded', 86 | 'User-Agent': 'GitLink', 87 | Accept: 'application/vnd.github+json', 88 | }, 89 | body: encodeQS({ 90 | client_id: process.env.GITHUB_CLIENT_ID, 91 | client_secret: process.env.GITHUB_CLIENT_SECRET, 92 | code, 93 | }), 94 | }).then(r => r.json() as Promise); 95 | 96 | return resp; 97 | } 98 | } 99 | 100 | export interface GitHubCodeExchangeResponse { 101 | access_token: string; 102 | token_type: 'bearer'; 103 | scope: string; 104 | } 105 | -------------------------------------------------------------------------------- /src/routes/interaction.ts: -------------------------------------------------------------------------------- 1 | import { 2 | APIInteraction, 3 | APIInteractionResponse, 4 | ApplicationCommandType, 5 | InteractionResponseType, 6 | InteractionType, 7 | MessageFlags, 8 | } from 'discord-api-types/v10'; 9 | import {FastifyInstance, FastifyPluginOptions} from 'fastify'; 10 | 11 | import {verifyInteraction} from 'gitlink'; 12 | 13 | export const loadInteractionRoutes = ( 14 | server: FastifyInstance, 15 | _opts: FastifyPluginOptions, 16 | done: () => void 17 | ) => { 18 | server.post<{ 19 | Headers: { 20 | 'x-signature-ed25519': string; 21 | 'x-signature-timestamp': string; 22 | }; 23 | Body: APIInteraction; 24 | }>( 25 | '/interactions', 26 | { 27 | preHandler: [verifyInteraction], 28 | schema: { 29 | headers: { 30 | type: 'object', 31 | properties: { 32 | 'X-Signature-Ed25519': {type: 'string'}, 33 | 'X-Signature-Timestamp': {type: 'string'}, 34 | }, 35 | required: ['X-Signature-Ed25519', 'X-Signature-Timestamp'], 36 | }, 37 | }, 38 | }, 39 | async (req, reply) => { 40 | const i = req.body; 41 | 42 | switch (i.type) { 43 | case InteractionType.ApplicationCommand: { 44 | switch (i.data.type) { 45 | case ApplicationCommandType.ChatInput: { 46 | switch (i.data.name) { 47 | case 'ping': { 48 | return reply.status(200).send({ 49 | type: InteractionResponseType.ChannelMessageWithSource, 50 | data: { 51 | flags: MessageFlags.Ephemeral, 52 | content: ':ping_pong: Pong!', 53 | }, 54 | } as APIInteractionResponse); 55 | } 56 | 57 | case 'refresh': { 58 | return reply.status(200).send({ 59 | type: InteractionResponseType.ChannelMessageWithSource, 60 | data: { 61 | flags: MessageFlags.Ephemeral, 62 | content: 63 | ':arrows_clockwise: To update your stats, re-authorize your Discord account by visiting: ', 64 | }, 65 | } as APIInteractionResponse); 66 | } 67 | 68 | case 'support': { 69 | return reply.status(200).send({ 70 | type: InteractionResponseType.ChannelMessageWithSource, 71 | data: { 72 | flags: MessageFlags.Ephemeral, 73 | content: 74 | ':question: Need help with the bot? Hit us up in our support server: https://discord.gg/ABwYM9y6Sm', 75 | }, 76 | } as APIInteractionResponse); 77 | } 78 | } 79 | 80 | break; 81 | } 82 | } 83 | 84 | break; 85 | } 86 | } 87 | 88 | // should never happen 89 | return reply.status(400).send(); 90 | } 91 | ); 92 | 93 | done(); 94 | }; 95 | -------------------------------------------------------------------------------- /src/routes/auth.ts: -------------------------------------------------------------------------------- 1 | import {FastifyInstance, FastifyPluginOptions} from 'fastify'; 2 | 3 | import { 4 | DiscordRESTClient, 5 | GitHubRESTClient, 6 | GitLinkMetadata, 7 | errorResponse, 8 | getGitHubAuthURL, 9 | requireAuth, 10 | } from 'gitlink'; 11 | import {GITHUB_SCOPES} from 'gitlink/constants'; 12 | 13 | export const loadAuthRoutes = ( 14 | server: FastifyInstance, 15 | _opts: FastifyPluginOptions, 16 | done: () => void 17 | ) => { 18 | server.get<{Querystring: {code: string}}>( 19 | '/discord/callback', 20 | { 21 | schema: { 22 | querystring: { 23 | type: 'object', 24 | properties: { 25 | code: {type: 'string'}, 26 | }, 27 | required: ['code'], 28 | }, 29 | }, 30 | }, 31 | 32 | async (req, reply) => { 33 | const code = req.query.code; 34 | const client = await DiscordRESTClient.exchangeCode(code); 35 | const sID = await req.server.sessions.create({ 36 | accessToken: client.accessToken, 37 | refreshToken: client.refreshToken, 38 | scopes: client.scopes, 39 | expiresAt: client.expiresAt, 40 | }); 41 | 42 | // TODO: handle 43 | if (!sID) { 44 | return reply.code(500).send(errorResponse('Failed to create session')); 45 | } 46 | 47 | reply.setCookie('sessionID', sID, { 48 | path: '/', 49 | httpOnly: true, 50 | secure: true, 51 | }); 52 | 53 | return reply.redirect( 54 | 302, 55 | getGitHubAuthURL({ 56 | scopes: GITHUB_SCOPES, 57 | state: sID, 58 | }) 59 | ); 60 | } 61 | ); 62 | 63 | server.get<{Querystring: {code: string; state: string}}>( 64 | '/github/callback', 65 | { 66 | preHandler: [requireAuth(true)], 67 | schema: { 68 | querystring: { 69 | type: 'object', 70 | properties: { 71 | code: {type: 'string'}, 72 | state: {type: 'string'}, 73 | }, 74 | required: ['code', 'state'], 75 | }, 76 | }, 77 | }, 78 | 79 | async (req, reply) => { 80 | const {code, state} = req.query; 81 | 82 | const session = req.session!; 83 | const sessionID = req.sessionID!; 84 | 85 | if (sessionID !== state) { 86 | return reply 87 | .status(400) 88 | .send(errorResponse('invalid state or session ID')); 89 | } 90 | 91 | const ghClient = await GitHubRESTClient.login(code); 92 | 93 | const dClient = new DiscordRESTClient({ 94 | accessToken: session.accessToken, 95 | refreshToken: session.refreshToken, 96 | expiresAt: session.expiresAt, 97 | scopes: session.scopes, 98 | }); 99 | 100 | const getData = [ 101 | ghClient.getUser(), 102 | ghClient.getStarredRepoCount(), 103 | ghClient.getRepoStats(), 104 | ] as const; 105 | 106 | try { 107 | const [{data: ghUser}, starredCount, repoStats] = await Promise.all< 108 | typeof getData 109 | >(getData); 110 | 111 | const metadata: GitLinkMetadata = { 112 | stars_given: starredCount?.toString() || '0', 113 | stars_received: repoStats?.starsReceived?.toString() || '0', 114 | account_created_at: ghUser.created_at, 115 | owned_repos: ( 116 | (ghUser.owned_private_repos || 0) + ghUser.public_repos 117 | ).toString(), 118 | }; 119 | 120 | try { 121 | await dClient.updateUserMedatada(metadata, ghUser.login); 122 | 123 | // TODO: make own page? 124 | return reply.redirect(302, 'https://discord.com/oauth2/authorized'); 125 | } catch (err) { 126 | return err; 127 | } 128 | } catch (err) { 129 | return err; 130 | } 131 | } 132 | ); 133 | 134 | done(); 135 | }; 136 | -------------------------------------------------------------------------------- /lib/struct/discordREST.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ApplicationUserRoleConnection, 3 | APIUser as DiscordUser, 4 | } from 'discord-api-types/v10'; 5 | import {fetch} from 'undici'; 6 | 7 | import {exchangeCode, refreshToken} from '../util/oauth'; 8 | import {RESTError} from './error'; 9 | import {SessionData} from './session'; 10 | 11 | const DEFAULT_HEADERS = { 12 | 'User-Agent': 'GitLink', 13 | }; 14 | 15 | const authHeaders = (c: DiscordRESTClient) => ({ 16 | Authorization: `Bearer ${c.accessToken}`, 17 | ...DEFAULT_HEADERS, 18 | }); 19 | 20 | export class DiscordRESTClient { 21 | static readonly clientID = process.env.DISCORD_CLIENT_ID; 22 | static readonly clientSecret = process.env.DISCORD_CLIENT_SECRET; 23 | static readonly redirectURI = process.env.DISCORD_REDIRECT_URI; 24 | static readonly baseURL = 'https://discord.com/api/v10'; 25 | 26 | accessToken: string; 27 | refreshToken: string; 28 | scopes: string[]; 29 | expiresAt: number; 30 | 31 | constructor(readonly options: SessionData) { 32 | this.accessToken = options.accessToken; 33 | this.refreshToken = options.refreshToken; 34 | this.scopes = options.scopes; 35 | this.expiresAt = options.expiresAt; 36 | } 37 | 38 | async getUser() { 39 | if (!this.scopes.includes('identify')) { 40 | return null; 41 | } 42 | 43 | const ENDPOINT = `${DiscordRESTClient.baseURL}/users/@me`; 44 | 45 | const res = await fetch(ENDPOINT, { 46 | method: 'GET', 47 | headers: { 48 | ...authHeaders(this), 49 | }, 50 | }); 51 | 52 | // TODO: handle errors 53 | if (!res.ok) { 54 | const err = await res.json(); 55 | console.error( 56 | '[DISCORD] Request to `GET /users/@me` responded with code', 57 | res.status + ':' 58 | ); 59 | 60 | console.dir(err, {depth: null}); 61 | 62 | throw new RESTError('GET', res.status, res.url, err); 63 | } 64 | 65 | const user = (await res.json()) as DiscordUser; 66 | return user; 67 | } 68 | 69 | async updateUserMedatada( 70 | metadata: GitLinkMetadata, 71 | username: string | null = null 72 | ) { 73 | const ENDPOINT = `${DiscordRESTClient.baseURL}/users/@me/applications/${process.env.DISCORD_CLIENT_ID}/role-connection`; 74 | 75 | const body: ApplicationUserRoleConnection = { 76 | // TODO: should this be "GitLink"? 77 | platform_name: 'GitHub', 78 | platform_username: username, 79 | metadata, 80 | }; 81 | 82 | const res = await fetch(ENDPOINT, { 83 | method: 'PUT', 84 | headers: { 85 | 'content-type': 'application/json', 86 | ...authHeaders(this), 87 | }, 88 | body: JSON.stringify(body), 89 | }); 90 | 91 | if (!res.ok) { 92 | const err = await res.json(); 93 | console.error( 94 | '[DISCORD] Request to `GET /users/@me/applications/:id/role-connection` responded with code', 95 | res.status + ':' 96 | ); 97 | 98 | console.dir(err, {depth: null}); 99 | 100 | throw new RESTError('PUT', res.status, res.url, err); 101 | } 102 | 103 | const json = await res.json(); 104 | return json; 105 | } 106 | 107 | async refresh() { 108 | const res = await refreshToken({ 109 | refreshToken: this.refreshToken, 110 | clientID: DiscordRESTClient.clientID, 111 | clientSecret: DiscordRESTClient.clientSecret, 112 | endpoint: `${DiscordRESTClient.baseURL}/oauth2/token`, 113 | redirectURI: DiscordRESTClient.redirectURI, 114 | }); 115 | 116 | if (!res.ok) { 117 | const data = await res.json(); 118 | throw new RESTError('POST', res.status, res.url, data); 119 | } 120 | 121 | const data = (await res.json()) as DiscordOAuthCodeExchangeResponse; 122 | const at = res.headers.get('date') || new Date(); 123 | const date = new Date(at); 124 | 125 | this.accessToken = data.access_token; 126 | this.refreshToken = data.refresh_token; 127 | this.scopes = data.scope.split(' '); 128 | this.expiresAt = data.expires_in * 1000 + date.getTime(); 129 | 130 | return data; 131 | } 132 | 133 | toSessionData(): SessionData { 134 | return { 135 | accessToken: this.accessToken, 136 | refreshToken: this.refreshToken, 137 | scopes: this.scopes, 138 | expiresAt: this.expiresAt, 139 | }; 140 | } 141 | 142 | static async exchangeCode(code: string) { 143 | const res = await exchangeCode({ 144 | code, 145 | clientID: this.clientID, 146 | clientSecret: this.clientSecret, 147 | endpoint: `${this.baseURL}/oauth2/token`, 148 | redirectURI: this.redirectURI, 149 | }); 150 | 151 | // TODO: handle error 152 | if (!res.ok) { 153 | const data = await res.json(); 154 | throw new RESTError('POST', res.status, res.url, data); 155 | } 156 | 157 | const data = (await res.json()) as DiscordOAuthCodeExchangeResponse; 158 | 159 | const at = res.headers.get('date') || new Date(); 160 | const date = new Date(at); 161 | 162 | return new this({ 163 | accessToken: data.access_token, 164 | refreshToken: data.refresh_token, 165 | scopes: data.scope.split(' '), 166 | expiresAt: date.getTime() + data.expires_in * 1000, 167 | }); 168 | } 169 | } 170 | 171 | export interface DiscordOAuthCodeExchangeResponse { 172 | access_token: string; 173 | refresh_token: string; 174 | expires_in: number; 175 | scope: string; 176 | token_type: 'Bearer'; 177 | } 178 | 179 | export type GitLinkMetadata = { 180 | stars_given: string; // int 181 | stars_received: string; // int 182 | owned_repos: string; // number 183 | account_created_at: string; // date 184 | }; 185 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@fastify/cookie': ^8.3.0 5 | '@octokit/rest': ^19.0.5 6 | '@octokit/types': ^8.0.0 7 | '@trivago/prettier-plugin-sort-imports': ^3.4.0 8 | '@types/node': ^18.11.9 9 | discord-api-types: ^0.37.17 10 | discord-verify: ^1.0.0 11 | dotenv: ^16.0.3 12 | fastify: ^4.9.2 13 | gts: ^3.1.1 14 | ioredis: ^5.2.4 15 | nodemon: ^2.0.20 16 | prettier: ^2.7.1 17 | ts-node: ^10.9.1 18 | tsc-alias: ^1.7.1 19 | tsconfig-paths: ^4.1.0 20 | typescript: ~4.7.0 21 | undici: ^5.12.0 22 | 23 | dependencies: 24 | '@fastify/cookie': 8.3.0 25 | '@octokit/rest': 19.0.5 26 | discord-api-types: 0.37.17 27 | discord-verify: 1.0.0 28 | dotenv: 16.0.3 29 | fastify: 4.9.2 30 | ioredis: 5.2.4 31 | undici: 5.12.0 32 | 33 | devDependencies: 34 | '@octokit/types': 8.0.0 35 | '@trivago/prettier-plugin-sort-imports': 3.4.0_prettier@2.7.1 36 | '@types/node': 18.11.9 37 | gts: 3.1.1_typescript@4.7.4 38 | nodemon: 2.0.20 39 | prettier: 2.7.1 40 | ts-node: 10.9.1_vq46kxj6zfka4f6ijsosnft3hy 41 | tsc-alias: 1.7.1 42 | tsconfig-paths: 4.1.0 43 | typescript: 4.7.4 44 | 45 | packages: 46 | 47 | /@ampproject/remapping/2.2.0: 48 | resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} 49 | engines: {node: '>=6.0.0'} 50 | dependencies: 51 | '@jridgewell/gen-mapping': 0.1.1 52 | '@jridgewell/trace-mapping': 0.3.17 53 | dev: true 54 | 55 | /@babel/code-frame/7.12.11: 56 | resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} 57 | dependencies: 58 | '@babel/highlight': 7.18.6 59 | dev: true 60 | 61 | /@babel/code-frame/7.18.6: 62 | resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} 63 | engines: {node: '>=6.9.0'} 64 | dependencies: 65 | '@babel/highlight': 7.18.6 66 | dev: true 67 | 68 | /@babel/compat-data/7.20.1: 69 | resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} 70 | engines: {node: '>=6.9.0'} 71 | dev: true 72 | 73 | /@babel/core/7.17.8: 74 | resolution: {integrity: sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==} 75 | engines: {node: '>=6.9.0'} 76 | dependencies: 77 | '@ampproject/remapping': 2.2.0 78 | '@babel/code-frame': 7.18.6 79 | '@babel/generator': 7.17.7 80 | '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.17.8 81 | '@babel/helper-module-transforms': 7.20.2 82 | '@babel/helpers': 7.20.1 83 | '@babel/parser': 7.18.9 84 | '@babel/template': 7.18.10 85 | '@babel/traverse': 7.17.3 86 | '@babel/types': 7.17.0 87 | convert-source-map: 1.9.0 88 | debug: 4.3.4 89 | gensync: 1.0.0-beta.2 90 | json5: 2.2.1 91 | semver: 6.3.0 92 | transitivePeerDependencies: 93 | - supports-color 94 | dev: true 95 | 96 | /@babel/generator/7.17.7: 97 | resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} 98 | engines: {node: '>=6.9.0'} 99 | dependencies: 100 | '@babel/types': 7.17.0 101 | jsesc: 2.5.2 102 | source-map: 0.5.7 103 | dev: true 104 | 105 | /@babel/generator/7.20.4: 106 | resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==} 107 | engines: {node: '>=6.9.0'} 108 | dependencies: 109 | '@babel/types': 7.20.2 110 | '@jridgewell/gen-mapping': 0.3.2 111 | jsesc: 2.5.2 112 | dev: true 113 | 114 | /@babel/helper-compilation-targets/7.20.0_@babel+core@7.17.8: 115 | resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} 116 | engines: {node: '>=6.9.0'} 117 | peerDependencies: 118 | '@babel/core': ^7.0.0 119 | dependencies: 120 | '@babel/compat-data': 7.20.1 121 | '@babel/core': 7.17.8 122 | '@babel/helper-validator-option': 7.18.6 123 | browserslist: 4.21.4 124 | semver: 6.3.0 125 | dev: true 126 | 127 | /@babel/helper-environment-visitor/7.18.9: 128 | resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} 129 | engines: {node: '>=6.9.0'} 130 | dev: true 131 | 132 | /@babel/helper-function-name/7.19.0: 133 | resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} 134 | engines: {node: '>=6.9.0'} 135 | dependencies: 136 | '@babel/template': 7.18.10 137 | '@babel/types': 7.20.2 138 | dev: true 139 | 140 | /@babel/helper-hoist-variables/7.18.6: 141 | resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} 142 | engines: {node: '>=6.9.0'} 143 | dependencies: 144 | '@babel/types': 7.20.2 145 | dev: true 146 | 147 | /@babel/helper-module-imports/7.18.6: 148 | resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 149 | engines: {node: '>=6.9.0'} 150 | dependencies: 151 | '@babel/types': 7.20.2 152 | dev: true 153 | 154 | /@babel/helper-module-transforms/7.20.2: 155 | resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} 156 | engines: {node: '>=6.9.0'} 157 | dependencies: 158 | '@babel/helper-environment-visitor': 7.18.9 159 | '@babel/helper-module-imports': 7.18.6 160 | '@babel/helper-simple-access': 7.20.2 161 | '@babel/helper-split-export-declaration': 7.18.6 162 | '@babel/helper-validator-identifier': 7.19.1 163 | '@babel/template': 7.18.10 164 | '@babel/traverse': 7.20.1 165 | '@babel/types': 7.20.2 166 | transitivePeerDependencies: 167 | - supports-color 168 | dev: true 169 | 170 | /@babel/helper-simple-access/7.20.2: 171 | resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} 172 | engines: {node: '>=6.9.0'} 173 | dependencies: 174 | '@babel/types': 7.20.2 175 | dev: true 176 | 177 | /@babel/helper-split-export-declaration/7.18.6: 178 | resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} 179 | engines: {node: '>=6.9.0'} 180 | dependencies: 181 | '@babel/types': 7.20.2 182 | dev: true 183 | 184 | /@babel/helper-string-parser/7.19.4: 185 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 186 | engines: {node: '>=6.9.0'} 187 | dev: true 188 | 189 | /@babel/helper-validator-identifier/7.19.1: 190 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 191 | engines: {node: '>=6.9.0'} 192 | dev: true 193 | 194 | /@babel/helper-validator-option/7.18.6: 195 | resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} 196 | engines: {node: '>=6.9.0'} 197 | dev: true 198 | 199 | /@babel/helpers/7.20.1: 200 | resolution: {integrity: sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==} 201 | engines: {node: '>=6.9.0'} 202 | dependencies: 203 | '@babel/template': 7.18.10 204 | '@babel/traverse': 7.20.1 205 | '@babel/types': 7.20.2 206 | transitivePeerDependencies: 207 | - supports-color 208 | dev: true 209 | 210 | /@babel/highlight/7.18.6: 211 | resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} 212 | engines: {node: '>=6.9.0'} 213 | dependencies: 214 | '@babel/helper-validator-identifier': 7.19.1 215 | chalk: 2.4.2 216 | js-tokens: 4.0.0 217 | dev: true 218 | 219 | /@babel/parser/7.18.9: 220 | resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==} 221 | engines: {node: '>=6.0.0'} 222 | hasBin: true 223 | dependencies: 224 | '@babel/types': 7.17.0 225 | dev: true 226 | 227 | /@babel/parser/7.20.3: 228 | resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} 229 | engines: {node: '>=6.0.0'} 230 | hasBin: true 231 | dependencies: 232 | '@babel/types': 7.20.2 233 | dev: true 234 | 235 | /@babel/template/7.18.10: 236 | resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} 237 | engines: {node: '>=6.9.0'} 238 | dependencies: 239 | '@babel/code-frame': 7.18.6 240 | '@babel/parser': 7.20.3 241 | '@babel/types': 7.20.2 242 | dev: true 243 | 244 | /@babel/traverse/7.17.3: 245 | resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} 246 | engines: {node: '>=6.9.0'} 247 | dependencies: 248 | '@babel/code-frame': 7.18.6 249 | '@babel/generator': 7.17.7 250 | '@babel/helper-environment-visitor': 7.18.9 251 | '@babel/helper-function-name': 7.19.0 252 | '@babel/helper-hoist-variables': 7.18.6 253 | '@babel/helper-split-export-declaration': 7.18.6 254 | '@babel/parser': 7.18.9 255 | '@babel/types': 7.17.0 256 | debug: 4.3.4 257 | globals: 11.12.0 258 | transitivePeerDependencies: 259 | - supports-color 260 | dev: true 261 | 262 | /@babel/traverse/7.20.1: 263 | resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==} 264 | engines: {node: '>=6.9.0'} 265 | dependencies: 266 | '@babel/code-frame': 7.18.6 267 | '@babel/generator': 7.20.4 268 | '@babel/helper-environment-visitor': 7.18.9 269 | '@babel/helper-function-name': 7.19.0 270 | '@babel/helper-hoist-variables': 7.18.6 271 | '@babel/helper-split-export-declaration': 7.18.6 272 | '@babel/parser': 7.20.3 273 | '@babel/types': 7.20.2 274 | debug: 4.3.4 275 | globals: 11.12.0 276 | transitivePeerDependencies: 277 | - supports-color 278 | dev: true 279 | 280 | /@babel/types/7.17.0: 281 | resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} 282 | engines: {node: '>=6.9.0'} 283 | dependencies: 284 | '@babel/helper-validator-identifier': 7.19.1 285 | to-fast-properties: 2.0.0 286 | dev: true 287 | 288 | /@babel/types/7.20.2: 289 | resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} 290 | engines: {node: '>=6.9.0'} 291 | dependencies: 292 | '@babel/helper-string-parser': 7.19.4 293 | '@babel/helper-validator-identifier': 7.19.1 294 | to-fast-properties: 2.0.0 295 | dev: true 296 | 297 | /@cspotcode/source-map-support/0.8.1: 298 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 299 | engines: {node: '>=12'} 300 | dependencies: 301 | '@jridgewell/trace-mapping': 0.3.9 302 | dev: true 303 | 304 | /@eslint/eslintrc/0.4.3: 305 | resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} 306 | engines: {node: ^10.12.0 || >=12.0.0} 307 | dependencies: 308 | ajv: 6.12.6 309 | debug: 4.3.4 310 | espree: 7.3.1 311 | globals: 13.17.0 312 | ignore: 4.0.6 313 | import-fresh: 3.3.0 314 | js-yaml: 3.14.1 315 | minimatch: 3.1.2 316 | strip-json-comments: 3.1.1 317 | transitivePeerDependencies: 318 | - supports-color 319 | dev: true 320 | 321 | /@fastify/ajv-compiler/3.4.0: 322 | resolution: {integrity: sha512-69JnK7Cot+ktn7LD5TikP3b7psBPX55tYpQa8WSumt8r117PCa2zwHnImfBtRWYExreJlI48hr0WZaVrTBGj7w==} 323 | dependencies: 324 | ajv: 8.11.0 325 | ajv-formats: 2.1.1 326 | fast-uri: 2.1.0 327 | dev: false 328 | 329 | /@fastify/cookie/8.3.0: 330 | resolution: {integrity: sha512-P9hY9GO11L20TnZ33XN3i0bt+3x0zaT7S0ohAzWO950E9PB2xnNhLYzPFJIGFi5AVN0yr5+/iZhWxeYvR6KCzg==} 331 | dependencies: 332 | cookie: 0.5.0 333 | fastify-plugin: 4.3.0 334 | dev: false 335 | 336 | /@fastify/deepmerge/1.1.0: 337 | resolution: {integrity: sha512-E8Hfdvs1bG6u0N4vN5Nty6JONUfTdOciyD5rn8KnEsLKIenvOVcr210BQR9t34PRkNyjqnMLGk3e0BsaxRdL+g==} 338 | dev: false 339 | 340 | /@fastify/error/3.0.0: 341 | resolution: {integrity: sha512-dPRyT40GiHRzSCll3/Jn2nPe25+E1VXc9tDwRAIKwFCxd5Np5wzgz1tmooWG3sV0qKgrBibihVoCna2ru4SEFg==} 342 | dev: false 343 | 344 | /@fastify/fast-json-stringify-compiler/4.1.0: 345 | resolution: {integrity: sha512-cTKBV2J9+u6VaKDhX7HepSfPSzw+F+TSd+k0wzifj4rG+4E5PjSFJCk19P8R6tr/72cuzgGd+mbB3jFT6lvAgw==} 346 | dependencies: 347 | fast-json-stringify: 5.4.1 348 | dev: false 349 | 350 | /@humanwhocodes/config-array/0.5.0: 351 | resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} 352 | engines: {node: '>=10.10.0'} 353 | dependencies: 354 | '@humanwhocodes/object-schema': 1.2.1 355 | debug: 4.3.4 356 | minimatch: 3.1.2 357 | transitivePeerDependencies: 358 | - supports-color 359 | dev: true 360 | 361 | /@humanwhocodes/object-schema/1.2.1: 362 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 363 | dev: true 364 | 365 | /@ioredis/commands/1.2.0: 366 | resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} 367 | dev: false 368 | 369 | /@jridgewell/gen-mapping/0.1.1: 370 | resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} 371 | engines: {node: '>=6.0.0'} 372 | dependencies: 373 | '@jridgewell/set-array': 1.1.2 374 | '@jridgewell/sourcemap-codec': 1.4.14 375 | dev: true 376 | 377 | /@jridgewell/gen-mapping/0.3.2: 378 | resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} 379 | engines: {node: '>=6.0.0'} 380 | dependencies: 381 | '@jridgewell/set-array': 1.1.2 382 | '@jridgewell/sourcemap-codec': 1.4.14 383 | '@jridgewell/trace-mapping': 0.3.17 384 | dev: true 385 | 386 | /@jridgewell/resolve-uri/3.1.0: 387 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 388 | engines: {node: '>=6.0.0'} 389 | dev: true 390 | 391 | /@jridgewell/set-array/1.1.2: 392 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 393 | engines: {node: '>=6.0.0'} 394 | dev: true 395 | 396 | /@jridgewell/sourcemap-codec/1.4.14: 397 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 398 | dev: true 399 | 400 | /@jridgewell/trace-mapping/0.3.17: 401 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} 402 | dependencies: 403 | '@jridgewell/resolve-uri': 3.1.0 404 | '@jridgewell/sourcemap-codec': 1.4.14 405 | dev: true 406 | 407 | /@jridgewell/trace-mapping/0.3.9: 408 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 409 | dependencies: 410 | '@jridgewell/resolve-uri': 3.1.0 411 | '@jridgewell/sourcemap-codec': 1.4.14 412 | dev: true 413 | 414 | /@nodelib/fs.scandir/2.1.5: 415 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 416 | engines: {node: '>= 8'} 417 | dependencies: 418 | '@nodelib/fs.stat': 2.0.5 419 | run-parallel: 1.2.0 420 | dev: true 421 | 422 | /@nodelib/fs.stat/2.0.5: 423 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 424 | engines: {node: '>= 8'} 425 | dev: true 426 | 427 | /@nodelib/fs.walk/1.2.8: 428 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 429 | engines: {node: '>= 8'} 430 | dependencies: 431 | '@nodelib/fs.scandir': 2.1.5 432 | fastq: 1.13.0 433 | dev: true 434 | 435 | /@octokit/auth-token/3.0.2: 436 | resolution: {integrity: sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==} 437 | engines: {node: '>= 14'} 438 | dependencies: 439 | '@octokit/types': 8.0.0 440 | dev: false 441 | 442 | /@octokit/core/4.1.0: 443 | resolution: {integrity: sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==} 444 | engines: {node: '>= 14'} 445 | dependencies: 446 | '@octokit/auth-token': 3.0.2 447 | '@octokit/graphql': 5.0.4 448 | '@octokit/request': 6.2.2 449 | '@octokit/request-error': 3.0.2 450 | '@octokit/types': 8.0.0 451 | before-after-hook: 2.2.3 452 | universal-user-agent: 6.0.0 453 | transitivePeerDependencies: 454 | - encoding 455 | dev: false 456 | 457 | /@octokit/endpoint/7.0.3: 458 | resolution: {integrity: sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==} 459 | engines: {node: '>= 14'} 460 | dependencies: 461 | '@octokit/types': 8.0.0 462 | is-plain-object: 5.0.0 463 | universal-user-agent: 6.0.0 464 | dev: false 465 | 466 | /@octokit/graphql/5.0.4: 467 | resolution: {integrity: sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==} 468 | engines: {node: '>= 14'} 469 | dependencies: 470 | '@octokit/request': 6.2.2 471 | '@octokit/types': 8.0.0 472 | universal-user-agent: 6.0.0 473 | transitivePeerDependencies: 474 | - encoding 475 | dev: false 476 | 477 | /@octokit/openapi-types/14.0.0: 478 | resolution: {integrity: sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==} 479 | 480 | /@octokit/plugin-paginate-rest/5.0.1_@octokit+core@4.1.0: 481 | resolution: {integrity: sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==} 482 | engines: {node: '>= 14'} 483 | peerDependencies: 484 | '@octokit/core': '>=4' 485 | dependencies: 486 | '@octokit/core': 4.1.0 487 | '@octokit/types': 8.0.0 488 | dev: false 489 | 490 | /@octokit/plugin-request-log/1.0.4_@octokit+core@4.1.0: 491 | resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} 492 | peerDependencies: 493 | '@octokit/core': '>=3' 494 | dependencies: 495 | '@octokit/core': 4.1.0 496 | dev: false 497 | 498 | /@octokit/plugin-rest-endpoint-methods/6.7.0_@octokit+core@4.1.0: 499 | resolution: {integrity: sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==} 500 | engines: {node: '>= 14'} 501 | peerDependencies: 502 | '@octokit/core': '>=3' 503 | dependencies: 504 | '@octokit/core': 4.1.0 505 | '@octokit/types': 8.0.0 506 | deprecation: 2.3.1 507 | dev: false 508 | 509 | /@octokit/request-error/3.0.2: 510 | resolution: {integrity: sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==} 511 | engines: {node: '>= 14'} 512 | dependencies: 513 | '@octokit/types': 8.0.0 514 | deprecation: 2.3.1 515 | once: 1.4.0 516 | dev: false 517 | 518 | /@octokit/request/6.2.2: 519 | resolution: {integrity: sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==} 520 | engines: {node: '>= 14'} 521 | dependencies: 522 | '@octokit/endpoint': 7.0.3 523 | '@octokit/request-error': 3.0.2 524 | '@octokit/types': 8.0.0 525 | is-plain-object: 5.0.0 526 | node-fetch: 2.6.7 527 | universal-user-agent: 6.0.0 528 | transitivePeerDependencies: 529 | - encoding 530 | dev: false 531 | 532 | /@octokit/rest/19.0.5: 533 | resolution: {integrity: sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==} 534 | engines: {node: '>= 14'} 535 | dependencies: 536 | '@octokit/core': 4.1.0 537 | '@octokit/plugin-paginate-rest': 5.0.1_@octokit+core@4.1.0 538 | '@octokit/plugin-request-log': 1.0.4_@octokit+core@4.1.0 539 | '@octokit/plugin-rest-endpoint-methods': 6.7.0_@octokit+core@4.1.0 540 | transitivePeerDependencies: 541 | - encoding 542 | dev: false 543 | 544 | /@octokit/types/8.0.0: 545 | resolution: {integrity: sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==} 546 | dependencies: 547 | '@octokit/openapi-types': 14.0.0 548 | 549 | /@trivago/prettier-plugin-sort-imports/3.4.0_prettier@2.7.1: 550 | resolution: {integrity: sha512-485Iailw8X5f7KetzRka20RF1kPBEINR5LJMNwlBZWY1gRAlVnv5dZzyNPnLxSP0Qcia8HETa9Cdd8LlX9o+pg==} 551 | peerDependencies: 552 | prettier: 2.x 553 | dependencies: 554 | '@babel/core': 7.17.8 555 | '@babel/generator': 7.17.7 556 | '@babel/parser': 7.18.9 557 | '@babel/traverse': 7.17.3 558 | '@babel/types': 7.17.0 559 | '@vue/compiler-sfc': 3.2.45 560 | javascript-natural-sort: 0.7.1 561 | lodash: 4.17.21 562 | prettier: 2.7.1 563 | transitivePeerDependencies: 564 | - supports-color 565 | dev: true 566 | 567 | /@tsconfig/node10/1.0.9: 568 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 569 | dev: true 570 | 571 | /@tsconfig/node12/1.0.11: 572 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 573 | dev: true 574 | 575 | /@tsconfig/node14/1.0.3: 576 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 577 | dev: true 578 | 579 | /@tsconfig/node16/1.0.3: 580 | resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} 581 | dev: true 582 | 583 | /@types/json-schema/7.0.11: 584 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 585 | dev: true 586 | 587 | /@types/minimist/1.2.2: 588 | resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} 589 | dev: true 590 | 591 | /@types/node/18.11.9: 592 | resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} 593 | dev: true 594 | 595 | /@types/normalize-package-data/2.4.1: 596 | resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} 597 | dev: true 598 | 599 | /@typescript-eslint/eslint-plugin/4.33.0_3ekaj7j3owlolnuhj3ykrb7u7i: 600 | resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} 601 | engines: {node: ^10.12.0 || >=12.0.0} 602 | peerDependencies: 603 | '@typescript-eslint/parser': ^4.0.0 604 | eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 605 | typescript: '*' 606 | peerDependenciesMeta: 607 | typescript: 608 | optional: true 609 | dependencies: 610 | '@typescript-eslint/experimental-utils': 4.33.0_hxadhbs2xogijvk7vq4t2azzbu 611 | '@typescript-eslint/parser': 4.33.0_hxadhbs2xogijvk7vq4t2azzbu 612 | '@typescript-eslint/scope-manager': 4.33.0 613 | debug: 4.3.4 614 | eslint: 7.32.0 615 | functional-red-black-tree: 1.0.1 616 | ignore: 5.2.0 617 | regexpp: 3.2.0 618 | semver: 7.3.8 619 | tsutils: 3.21.0_typescript@4.7.4 620 | typescript: 4.7.4 621 | transitivePeerDependencies: 622 | - supports-color 623 | dev: true 624 | 625 | /@typescript-eslint/experimental-utils/4.33.0_hxadhbs2xogijvk7vq4t2azzbu: 626 | resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} 627 | engines: {node: ^10.12.0 || >=12.0.0} 628 | peerDependencies: 629 | eslint: '*' 630 | dependencies: 631 | '@types/json-schema': 7.0.11 632 | '@typescript-eslint/scope-manager': 4.33.0 633 | '@typescript-eslint/types': 4.33.0 634 | '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.7.4 635 | eslint: 7.32.0 636 | eslint-scope: 5.1.1 637 | eslint-utils: 3.0.0_eslint@7.32.0 638 | transitivePeerDependencies: 639 | - supports-color 640 | - typescript 641 | dev: true 642 | 643 | /@typescript-eslint/parser/4.33.0_hxadhbs2xogijvk7vq4t2azzbu: 644 | resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} 645 | engines: {node: ^10.12.0 || >=12.0.0} 646 | peerDependencies: 647 | eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 648 | typescript: '*' 649 | peerDependenciesMeta: 650 | typescript: 651 | optional: true 652 | dependencies: 653 | '@typescript-eslint/scope-manager': 4.33.0 654 | '@typescript-eslint/types': 4.33.0 655 | '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.7.4 656 | debug: 4.3.4 657 | eslint: 7.32.0 658 | typescript: 4.7.4 659 | transitivePeerDependencies: 660 | - supports-color 661 | dev: true 662 | 663 | /@typescript-eslint/scope-manager/4.33.0: 664 | resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} 665 | engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} 666 | dependencies: 667 | '@typescript-eslint/types': 4.33.0 668 | '@typescript-eslint/visitor-keys': 4.33.0 669 | dev: true 670 | 671 | /@typescript-eslint/types/4.33.0: 672 | resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} 673 | engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} 674 | dev: true 675 | 676 | /@typescript-eslint/typescript-estree/4.33.0_typescript@4.7.4: 677 | resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} 678 | engines: {node: ^10.12.0 || >=12.0.0} 679 | peerDependencies: 680 | typescript: '*' 681 | peerDependenciesMeta: 682 | typescript: 683 | optional: true 684 | dependencies: 685 | '@typescript-eslint/types': 4.33.0 686 | '@typescript-eslint/visitor-keys': 4.33.0 687 | debug: 4.3.4 688 | globby: 11.1.0 689 | is-glob: 4.0.3 690 | semver: 7.3.8 691 | tsutils: 3.21.0_typescript@4.7.4 692 | typescript: 4.7.4 693 | transitivePeerDependencies: 694 | - supports-color 695 | dev: true 696 | 697 | /@typescript-eslint/visitor-keys/4.33.0: 698 | resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} 699 | engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} 700 | dependencies: 701 | '@typescript-eslint/types': 4.33.0 702 | eslint-visitor-keys: 2.1.0 703 | dev: true 704 | 705 | /@vue/compiler-core/3.2.45: 706 | resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} 707 | dependencies: 708 | '@babel/parser': 7.18.9 709 | '@vue/shared': 3.2.45 710 | estree-walker: 2.0.2 711 | source-map: 0.6.1 712 | dev: true 713 | 714 | /@vue/compiler-dom/3.2.45: 715 | resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==} 716 | dependencies: 717 | '@vue/compiler-core': 3.2.45 718 | '@vue/shared': 3.2.45 719 | dev: true 720 | 721 | /@vue/compiler-sfc/3.2.45: 722 | resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==} 723 | dependencies: 724 | '@babel/parser': 7.18.9 725 | '@vue/compiler-core': 3.2.45 726 | '@vue/compiler-dom': 3.2.45 727 | '@vue/compiler-ssr': 3.2.45 728 | '@vue/reactivity-transform': 3.2.45 729 | '@vue/shared': 3.2.45 730 | estree-walker: 2.0.2 731 | magic-string: 0.25.9 732 | postcss: 8.4.19 733 | source-map: 0.6.1 734 | dev: true 735 | 736 | /@vue/compiler-ssr/3.2.45: 737 | resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==} 738 | dependencies: 739 | '@vue/compiler-dom': 3.2.45 740 | '@vue/shared': 3.2.45 741 | dev: true 742 | 743 | /@vue/reactivity-transform/3.2.45: 744 | resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} 745 | dependencies: 746 | '@babel/parser': 7.18.9 747 | '@vue/compiler-core': 3.2.45 748 | '@vue/shared': 3.2.45 749 | estree-walker: 2.0.2 750 | magic-string: 0.25.9 751 | dev: true 752 | 753 | /@vue/shared/3.2.45: 754 | resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} 755 | dev: true 756 | 757 | /abbrev/1.1.1: 758 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 759 | dev: true 760 | 761 | /abort-controller/3.0.0: 762 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 763 | engines: {node: '>=6.5'} 764 | dependencies: 765 | event-target-shim: 5.0.1 766 | dev: false 767 | 768 | /abstract-logging/2.0.1: 769 | resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} 770 | dev: false 771 | 772 | /acorn-jsx/5.3.2_acorn@7.4.1: 773 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 774 | peerDependencies: 775 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 776 | dependencies: 777 | acorn: 7.4.1 778 | dev: true 779 | 780 | /acorn-walk/8.2.0: 781 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 782 | engines: {node: '>=0.4.0'} 783 | dev: true 784 | 785 | /acorn/7.4.1: 786 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 787 | engines: {node: '>=0.4.0'} 788 | hasBin: true 789 | dev: true 790 | 791 | /acorn/8.8.1: 792 | resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} 793 | engines: {node: '>=0.4.0'} 794 | hasBin: true 795 | dev: true 796 | 797 | /ajv-formats/2.1.1: 798 | resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 799 | peerDependenciesMeta: 800 | ajv: 801 | optional: true 802 | dependencies: 803 | ajv: 8.11.0 804 | dev: false 805 | 806 | /ajv/6.12.6: 807 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 808 | dependencies: 809 | fast-deep-equal: 3.1.3 810 | fast-json-stable-stringify: 2.1.0 811 | json-schema-traverse: 0.4.1 812 | uri-js: 4.4.1 813 | dev: true 814 | 815 | /ajv/8.11.0: 816 | resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} 817 | dependencies: 818 | fast-deep-equal: 3.1.3 819 | json-schema-traverse: 1.0.0 820 | require-from-string: 2.0.2 821 | uri-js: 4.4.1 822 | 823 | /ansi-colors/4.1.3: 824 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 825 | engines: {node: '>=6'} 826 | dev: true 827 | 828 | /ansi-escapes/4.3.2: 829 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 830 | engines: {node: '>=8'} 831 | dependencies: 832 | type-fest: 0.21.3 833 | dev: true 834 | 835 | /ansi-regex/5.0.1: 836 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 837 | engines: {node: '>=8'} 838 | dev: true 839 | 840 | /ansi-styles/3.2.1: 841 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 842 | engines: {node: '>=4'} 843 | dependencies: 844 | color-convert: 1.9.3 845 | dev: true 846 | 847 | /ansi-styles/4.3.0: 848 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 849 | engines: {node: '>=8'} 850 | dependencies: 851 | color-convert: 2.0.1 852 | dev: true 853 | 854 | /anymatch/3.1.2: 855 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 856 | engines: {node: '>= 8'} 857 | dependencies: 858 | normalize-path: 3.0.0 859 | picomatch: 2.3.1 860 | dev: true 861 | 862 | /archy/1.0.0: 863 | resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} 864 | dev: false 865 | 866 | /arg/4.1.3: 867 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 868 | dev: true 869 | 870 | /argparse/1.0.10: 871 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 872 | dependencies: 873 | sprintf-js: 1.0.3 874 | dev: true 875 | 876 | /array-union/2.1.0: 877 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 878 | engines: {node: '>=8'} 879 | dev: true 880 | 881 | /arrify/1.0.1: 882 | resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} 883 | engines: {node: '>=0.10.0'} 884 | dev: true 885 | 886 | /astral-regex/2.0.0: 887 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 888 | engines: {node: '>=8'} 889 | dev: true 890 | 891 | /atomic-sleep/1.0.0: 892 | resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 893 | engines: {node: '>=8.0.0'} 894 | dev: false 895 | 896 | /avvio/8.2.0: 897 | resolution: {integrity: sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg==} 898 | dependencies: 899 | archy: 1.0.0 900 | debug: 4.3.4 901 | fastq: 1.13.0 902 | transitivePeerDependencies: 903 | - supports-color 904 | dev: false 905 | 906 | /balanced-match/1.0.2: 907 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 908 | dev: true 909 | 910 | /base64-js/1.5.1: 911 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 912 | dev: false 913 | 914 | /before-after-hook/2.2.3: 915 | resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} 916 | dev: false 917 | 918 | /binary-extensions/2.2.0: 919 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 920 | engines: {node: '>=8'} 921 | dev: true 922 | 923 | /brace-expansion/1.1.11: 924 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 925 | dependencies: 926 | balanced-match: 1.0.2 927 | concat-map: 0.0.1 928 | dev: true 929 | 930 | /braces/3.0.2: 931 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 932 | engines: {node: '>=8'} 933 | dependencies: 934 | fill-range: 7.0.1 935 | dev: true 936 | 937 | /browserslist/4.21.4: 938 | resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} 939 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 940 | hasBin: true 941 | dependencies: 942 | caniuse-lite: 1.0.30001431 943 | electron-to-chromium: 1.4.284 944 | node-releases: 2.0.6 945 | update-browserslist-db: 1.0.10_browserslist@4.21.4 946 | dev: true 947 | 948 | /buffer/6.0.3: 949 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 950 | dependencies: 951 | base64-js: 1.5.1 952 | ieee754: 1.2.1 953 | dev: false 954 | 955 | /busboy/1.6.0: 956 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 957 | engines: {node: '>=10.16.0'} 958 | dependencies: 959 | streamsearch: 1.1.0 960 | dev: false 961 | 962 | /callsites/3.1.0: 963 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 964 | engines: {node: '>=6'} 965 | dev: true 966 | 967 | /camelcase-keys/6.2.2: 968 | resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} 969 | engines: {node: '>=8'} 970 | dependencies: 971 | camelcase: 5.3.1 972 | map-obj: 4.3.0 973 | quick-lru: 4.0.1 974 | dev: true 975 | 976 | /camelcase/5.3.1: 977 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 978 | engines: {node: '>=6'} 979 | dev: true 980 | 981 | /caniuse-lite/1.0.30001431: 982 | resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==} 983 | dev: true 984 | 985 | /chalk/2.4.2: 986 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 987 | engines: {node: '>=4'} 988 | dependencies: 989 | ansi-styles: 3.2.1 990 | escape-string-regexp: 1.0.5 991 | supports-color: 5.5.0 992 | dev: true 993 | 994 | /chalk/4.1.2: 995 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 996 | engines: {node: '>=10'} 997 | dependencies: 998 | ansi-styles: 4.3.0 999 | supports-color: 7.2.0 1000 | dev: true 1001 | 1002 | /chardet/0.7.0: 1003 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 1004 | dev: true 1005 | 1006 | /chokidar/3.5.3: 1007 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1008 | engines: {node: '>= 8.10.0'} 1009 | dependencies: 1010 | anymatch: 3.1.2 1011 | braces: 3.0.2 1012 | glob-parent: 5.1.2 1013 | is-binary-path: 2.1.0 1014 | is-glob: 4.0.3 1015 | normalize-path: 3.0.0 1016 | readdirp: 3.6.0 1017 | optionalDependencies: 1018 | fsevents: 2.3.2 1019 | dev: true 1020 | 1021 | /cli-cursor/3.1.0: 1022 | resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 1023 | engines: {node: '>=8'} 1024 | dependencies: 1025 | restore-cursor: 3.1.0 1026 | dev: true 1027 | 1028 | /cli-width/3.0.0: 1029 | resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} 1030 | engines: {node: '>= 10'} 1031 | dev: true 1032 | 1033 | /cluster-key-slot/1.1.2: 1034 | resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} 1035 | engines: {node: '>=0.10.0'} 1036 | dev: false 1037 | 1038 | /color-convert/1.9.3: 1039 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1040 | dependencies: 1041 | color-name: 1.1.3 1042 | dev: true 1043 | 1044 | /color-convert/2.0.1: 1045 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1046 | engines: {node: '>=7.0.0'} 1047 | dependencies: 1048 | color-name: 1.1.4 1049 | dev: true 1050 | 1051 | /color-name/1.1.3: 1052 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1053 | dev: true 1054 | 1055 | /color-name/1.1.4: 1056 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1057 | dev: true 1058 | 1059 | /commander/9.4.1: 1060 | resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} 1061 | engines: {node: ^12.20.0 || >=14} 1062 | dev: true 1063 | 1064 | /concat-map/0.0.1: 1065 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1066 | dev: true 1067 | 1068 | /convert-source-map/1.9.0: 1069 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 1070 | dev: true 1071 | 1072 | /cookie/0.5.0: 1073 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1074 | engines: {node: '>= 0.6'} 1075 | dev: false 1076 | 1077 | /create-require/1.1.1: 1078 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 1079 | dev: true 1080 | 1081 | /cross-spawn/7.0.3: 1082 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1083 | engines: {node: '>= 8'} 1084 | dependencies: 1085 | path-key: 3.1.1 1086 | shebang-command: 2.0.0 1087 | which: 2.0.2 1088 | dev: true 1089 | 1090 | /debug/3.2.7_supports-color@5.5.0: 1091 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 1092 | peerDependencies: 1093 | supports-color: '*' 1094 | peerDependenciesMeta: 1095 | supports-color: 1096 | optional: true 1097 | dependencies: 1098 | ms: 2.1.3 1099 | supports-color: 5.5.0 1100 | dev: true 1101 | 1102 | /debug/4.3.4: 1103 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1104 | engines: {node: '>=6.0'} 1105 | peerDependencies: 1106 | supports-color: '*' 1107 | peerDependenciesMeta: 1108 | supports-color: 1109 | optional: true 1110 | dependencies: 1111 | ms: 2.1.2 1112 | 1113 | /decamelize-keys/1.1.1: 1114 | resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} 1115 | engines: {node: '>=0.10.0'} 1116 | dependencies: 1117 | decamelize: 1.2.0 1118 | map-obj: 1.0.1 1119 | dev: true 1120 | 1121 | /decamelize/1.2.0: 1122 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 1123 | engines: {node: '>=0.10.0'} 1124 | dev: true 1125 | 1126 | /deep-is/0.1.4: 1127 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1128 | dev: true 1129 | 1130 | /denque/2.1.0: 1131 | resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} 1132 | engines: {node: '>=0.10'} 1133 | dev: false 1134 | 1135 | /deprecation/2.3.1: 1136 | resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} 1137 | dev: false 1138 | 1139 | /diff/4.0.2: 1140 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 1141 | engines: {node: '>=0.3.1'} 1142 | dev: true 1143 | 1144 | /dir-glob/3.0.1: 1145 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1146 | engines: {node: '>=8'} 1147 | dependencies: 1148 | path-type: 4.0.0 1149 | dev: true 1150 | 1151 | /discord-api-types/0.37.17: 1152 | resolution: {integrity: sha512-5ZIw1VtkmToBy8ziketjHkZnW1FoLevyXdK/TslNFLozijug2RnB3MyBNtSGzML1c72koU3neeGkvFZ8OiU0tQ==} 1153 | dev: false 1154 | 1155 | /discord-verify/1.0.0: 1156 | resolution: {integrity: sha512-3oylOAVOArmCXedhLPmGCdh0qyQ8E8gnh2aokIl1Qg2b81C+xewyZegay9EOniWjuGXe3jMrvaMrKv398u4QFg==} 1157 | engines: {node: '>=16'} 1158 | dev: false 1159 | 1160 | /doctrine/3.0.0: 1161 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1162 | engines: {node: '>=6.0.0'} 1163 | dependencies: 1164 | esutils: 2.0.3 1165 | dev: true 1166 | 1167 | /dotenv/16.0.3: 1168 | resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} 1169 | engines: {node: '>=12'} 1170 | dev: false 1171 | 1172 | /electron-to-chromium/1.4.284: 1173 | resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} 1174 | dev: true 1175 | 1176 | /emoji-regex/8.0.0: 1177 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1178 | dev: true 1179 | 1180 | /enquirer/2.3.6: 1181 | resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} 1182 | engines: {node: '>=8.6'} 1183 | dependencies: 1184 | ansi-colors: 4.1.3 1185 | dev: true 1186 | 1187 | /error-ex/1.3.2: 1188 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1189 | dependencies: 1190 | is-arrayish: 0.2.1 1191 | dev: true 1192 | 1193 | /escalade/3.1.1: 1194 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1195 | engines: {node: '>=6'} 1196 | dev: true 1197 | 1198 | /escape-string-regexp/1.0.5: 1199 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1200 | engines: {node: '>=0.8.0'} 1201 | dev: true 1202 | 1203 | /escape-string-regexp/4.0.0: 1204 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1205 | engines: {node: '>=10'} 1206 | dev: true 1207 | 1208 | /eslint-config-prettier/7.2.0_eslint@7.32.0: 1209 | resolution: {integrity: sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==} 1210 | hasBin: true 1211 | peerDependencies: 1212 | eslint: '>=7.0.0' 1213 | dependencies: 1214 | eslint: 7.32.0 1215 | dev: true 1216 | 1217 | /eslint-plugin-es/3.0.1_eslint@7.32.0: 1218 | resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} 1219 | engines: {node: '>=8.10.0'} 1220 | peerDependencies: 1221 | eslint: '>=4.19.1' 1222 | dependencies: 1223 | eslint: 7.32.0 1224 | eslint-utils: 2.1.0 1225 | regexpp: 3.2.0 1226 | dev: true 1227 | 1228 | /eslint-plugin-node/11.1.0_eslint@7.32.0: 1229 | resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} 1230 | engines: {node: '>=8.10.0'} 1231 | peerDependencies: 1232 | eslint: '>=5.16.0' 1233 | dependencies: 1234 | eslint: 7.32.0 1235 | eslint-plugin-es: 3.0.1_eslint@7.32.0 1236 | eslint-utils: 2.1.0 1237 | ignore: 5.2.0 1238 | minimatch: 3.1.2 1239 | resolve: 1.22.1 1240 | semver: 6.3.0 1241 | dev: true 1242 | 1243 | /eslint-plugin-prettier/3.4.1_krfuiecpk3xclvkrlwn2dh4uea: 1244 | resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} 1245 | engines: {node: '>=6.0.0'} 1246 | peerDependencies: 1247 | eslint: '>=5.0.0' 1248 | eslint-config-prettier: '*' 1249 | prettier: '>=1.13.0' 1250 | peerDependenciesMeta: 1251 | eslint-config-prettier: 1252 | optional: true 1253 | dependencies: 1254 | eslint: 7.32.0 1255 | eslint-config-prettier: 7.2.0_eslint@7.32.0 1256 | prettier: 2.7.1 1257 | prettier-linter-helpers: 1.0.0 1258 | dev: true 1259 | 1260 | /eslint-scope/5.1.1: 1261 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1262 | engines: {node: '>=8.0.0'} 1263 | dependencies: 1264 | esrecurse: 4.3.0 1265 | estraverse: 4.3.0 1266 | dev: true 1267 | 1268 | /eslint-utils/2.1.0: 1269 | resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} 1270 | engines: {node: '>=6'} 1271 | dependencies: 1272 | eslint-visitor-keys: 1.3.0 1273 | dev: true 1274 | 1275 | /eslint-utils/3.0.0_eslint@7.32.0: 1276 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1277 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1278 | peerDependencies: 1279 | eslint: '>=5' 1280 | dependencies: 1281 | eslint: 7.32.0 1282 | eslint-visitor-keys: 2.1.0 1283 | dev: true 1284 | 1285 | /eslint-visitor-keys/1.3.0: 1286 | resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} 1287 | engines: {node: '>=4'} 1288 | dev: true 1289 | 1290 | /eslint-visitor-keys/2.1.0: 1291 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1292 | engines: {node: '>=10'} 1293 | dev: true 1294 | 1295 | /eslint/7.32.0: 1296 | resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} 1297 | engines: {node: ^10.12.0 || >=12.0.0} 1298 | hasBin: true 1299 | dependencies: 1300 | '@babel/code-frame': 7.12.11 1301 | '@eslint/eslintrc': 0.4.3 1302 | '@humanwhocodes/config-array': 0.5.0 1303 | ajv: 6.12.6 1304 | chalk: 4.1.2 1305 | cross-spawn: 7.0.3 1306 | debug: 4.3.4 1307 | doctrine: 3.0.0 1308 | enquirer: 2.3.6 1309 | escape-string-regexp: 4.0.0 1310 | eslint-scope: 5.1.1 1311 | eslint-utils: 2.1.0 1312 | eslint-visitor-keys: 2.1.0 1313 | espree: 7.3.1 1314 | esquery: 1.4.0 1315 | esutils: 2.0.3 1316 | fast-deep-equal: 3.1.3 1317 | file-entry-cache: 6.0.1 1318 | functional-red-black-tree: 1.0.1 1319 | glob-parent: 5.1.2 1320 | globals: 13.17.0 1321 | ignore: 4.0.6 1322 | import-fresh: 3.3.0 1323 | imurmurhash: 0.1.4 1324 | is-glob: 4.0.3 1325 | js-yaml: 3.14.1 1326 | json-stable-stringify-without-jsonify: 1.0.1 1327 | levn: 0.4.1 1328 | lodash.merge: 4.6.2 1329 | minimatch: 3.1.2 1330 | natural-compare: 1.4.0 1331 | optionator: 0.9.1 1332 | progress: 2.0.3 1333 | regexpp: 3.2.0 1334 | semver: 7.3.8 1335 | strip-ansi: 6.0.1 1336 | strip-json-comments: 3.1.1 1337 | table: 6.8.1 1338 | text-table: 0.2.0 1339 | v8-compile-cache: 2.3.0 1340 | transitivePeerDependencies: 1341 | - supports-color 1342 | dev: true 1343 | 1344 | /espree/7.3.1: 1345 | resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} 1346 | engines: {node: ^10.12.0 || >=12.0.0} 1347 | dependencies: 1348 | acorn: 7.4.1 1349 | acorn-jsx: 5.3.2_acorn@7.4.1 1350 | eslint-visitor-keys: 1.3.0 1351 | dev: true 1352 | 1353 | /esprima/4.0.1: 1354 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1355 | engines: {node: '>=4'} 1356 | hasBin: true 1357 | dev: true 1358 | 1359 | /esquery/1.4.0: 1360 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 1361 | engines: {node: '>=0.10'} 1362 | dependencies: 1363 | estraverse: 5.3.0 1364 | dev: true 1365 | 1366 | /esrecurse/4.3.0: 1367 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1368 | engines: {node: '>=4.0'} 1369 | dependencies: 1370 | estraverse: 5.3.0 1371 | dev: true 1372 | 1373 | /estraverse/4.3.0: 1374 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1375 | engines: {node: '>=4.0'} 1376 | dev: true 1377 | 1378 | /estraverse/5.3.0: 1379 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1380 | engines: {node: '>=4.0'} 1381 | dev: true 1382 | 1383 | /estree-walker/2.0.2: 1384 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1385 | dev: true 1386 | 1387 | /esutils/2.0.3: 1388 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1389 | engines: {node: '>=0.10.0'} 1390 | dev: true 1391 | 1392 | /event-target-shim/5.0.1: 1393 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 1394 | engines: {node: '>=6'} 1395 | dev: false 1396 | 1397 | /events/3.3.0: 1398 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 1399 | engines: {node: '>=0.8.x'} 1400 | dev: false 1401 | 1402 | /execa/5.1.1: 1403 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1404 | engines: {node: '>=10'} 1405 | dependencies: 1406 | cross-spawn: 7.0.3 1407 | get-stream: 6.0.1 1408 | human-signals: 2.1.0 1409 | is-stream: 2.0.1 1410 | merge-stream: 2.0.0 1411 | npm-run-path: 4.0.1 1412 | onetime: 5.1.2 1413 | signal-exit: 3.0.7 1414 | strip-final-newline: 2.0.0 1415 | dev: true 1416 | 1417 | /external-editor/3.1.0: 1418 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 1419 | engines: {node: '>=4'} 1420 | dependencies: 1421 | chardet: 0.7.0 1422 | iconv-lite: 0.4.24 1423 | tmp: 0.0.33 1424 | dev: true 1425 | 1426 | /fast-decode-uri-component/1.0.1: 1427 | resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} 1428 | dev: false 1429 | 1430 | /fast-deep-equal/3.1.3: 1431 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1432 | 1433 | /fast-diff/1.2.0: 1434 | resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} 1435 | dev: true 1436 | 1437 | /fast-glob/3.2.12: 1438 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 1439 | engines: {node: '>=8.6.0'} 1440 | dependencies: 1441 | '@nodelib/fs.stat': 2.0.5 1442 | '@nodelib/fs.walk': 1.2.8 1443 | glob-parent: 5.1.2 1444 | merge2: 1.4.1 1445 | micromatch: 4.0.5 1446 | dev: true 1447 | 1448 | /fast-json-stable-stringify/2.1.0: 1449 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1450 | dev: true 1451 | 1452 | /fast-json-stringify/5.4.1: 1453 | resolution: {integrity: sha512-P7S9WXEnMqu6seBnzAFmgZ+T3KCD+Do+pNIJsmk/6OlDHZVjl6KzsQB3TFHKQb2Q8N7C9l31WS7/LZGF5hT1FA==} 1454 | dependencies: 1455 | '@fastify/deepmerge': 1.1.0 1456 | ajv: 8.11.0 1457 | ajv-formats: 2.1.1 1458 | fast-deep-equal: 3.1.3 1459 | fast-uri: 2.1.0 1460 | rfdc: 1.3.0 1461 | dev: false 1462 | 1463 | /fast-levenshtein/2.0.6: 1464 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1465 | dev: true 1466 | 1467 | /fast-querystring/1.0.0: 1468 | resolution: {integrity: sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA==} 1469 | dependencies: 1470 | fast-decode-uri-component: 1.0.1 1471 | dev: false 1472 | 1473 | /fast-redact/3.1.2: 1474 | resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} 1475 | engines: {node: '>=6'} 1476 | dev: false 1477 | 1478 | /fast-uri/2.1.0: 1479 | resolution: {integrity: sha512-qKRta6N7BWEFVlyonVY/V+BMLgFqktCUV0QjT259ekAIlbVrMaFnFLxJ4s/JPl4tou56S1BzPufI60bLe29fHA==} 1480 | dev: false 1481 | 1482 | /fastify-plugin/4.3.0: 1483 | resolution: {integrity: sha512-M3+i368lV0OYTJ5TfClIoPKEKSOF7112iiPdwgfSR0gN98BjA1Nk+c6oBHtfcVt9KiMxl+EQKHC1QNWo3ZOpYQ==} 1484 | dev: false 1485 | 1486 | /fastify/4.9.2: 1487 | resolution: {integrity: sha512-Mk3hv7ZRet2huMYN6IJ8RGy1TAAC7LJsCEjxLf808zafAADNu43xRzbl7FSEIBxKyhntTM0F626Oc34LUNcUxQ==} 1488 | dependencies: 1489 | '@fastify/ajv-compiler': 3.4.0 1490 | '@fastify/error': 3.0.0 1491 | '@fastify/fast-json-stringify-compiler': 4.1.0 1492 | abstract-logging: 2.0.1 1493 | avvio: 8.2.0 1494 | find-my-way: 7.3.1 1495 | light-my-request: 5.6.1 1496 | pino: 8.7.0 1497 | process-warning: 2.0.0 1498 | proxy-addr: 2.0.7 1499 | rfdc: 1.3.0 1500 | secure-json-parse: 2.5.0 1501 | semver: 7.3.8 1502 | tiny-lru: 9.0.3 1503 | transitivePeerDependencies: 1504 | - supports-color 1505 | dev: false 1506 | 1507 | /fastq/1.13.0: 1508 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 1509 | dependencies: 1510 | reusify: 1.0.4 1511 | 1512 | /figures/3.2.0: 1513 | resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} 1514 | engines: {node: '>=8'} 1515 | dependencies: 1516 | escape-string-regexp: 1.0.5 1517 | dev: true 1518 | 1519 | /file-entry-cache/6.0.1: 1520 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1521 | engines: {node: ^10.12.0 || >=12.0.0} 1522 | dependencies: 1523 | flat-cache: 3.0.4 1524 | dev: true 1525 | 1526 | /fill-range/7.0.1: 1527 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1528 | engines: {node: '>=8'} 1529 | dependencies: 1530 | to-regex-range: 5.0.1 1531 | dev: true 1532 | 1533 | /find-my-way/7.3.1: 1534 | resolution: {integrity: sha512-kGvM08SOkqvheLcuQ8GW9t/H901Qb9rZEbcNWbXopzy4jDRoaJpJoObPSKf4MnQLZ20ZTp7rL5MpF6rf+pqmyg==} 1535 | engines: {node: '>=14'} 1536 | dependencies: 1537 | fast-deep-equal: 3.1.3 1538 | fast-querystring: 1.0.0 1539 | safe-regex2: 2.0.0 1540 | dev: false 1541 | 1542 | /find-up/4.1.0: 1543 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1544 | engines: {node: '>=8'} 1545 | dependencies: 1546 | locate-path: 5.0.0 1547 | path-exists: 4.0.0 1548 | dev: true 1549 | 1550 | /flat-cache/3.0.4: 1551 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1552 | engines: {node: ^10.12.0 || >=12.0.0} 1553 | dependencies: 1554 | flatted: 3.2.7 1555 | rimraf: 3.0.2 1556 | dev: true 1557 | 1558 | /flatted/3.2.7: 1559 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1560 | dev: true 1561 | 1562 | /forwarded/0.2.0: 1563 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 1564 | engines: {node: '>= 0.6'} 1565 | dev: false 1566 | 1567 | /fs.realpath/1.0.0: 1568 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1569 | dev: true 1570 | 1571 | /fsevents/2.3.2: 1572 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1573 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1574 | os: [darwin] 1575 | requiresBuild: true 1576 | dev: true 1577 | optional: true 1578 | 1579 | /function-bind/1.1.1: 1580 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1581 | dev: true 1582 | 1583 | /functional-red-black-tree/1.0.1: 1584 | resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 1585 | dev: true 1586 | 1587 | /gensync/1.0.0-beta.2: 1588 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1589 | engines: {node: '>=6.9.0'} 1590 | dev: true 1591 | 1592 | /get-stream/6.0.1: 1593 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1594 | engines: {node: '>=10'} 1595 | dev: true 1596 | 1597 | /glob-parent/5.1.2: 1598 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1599 | engines: {node: '>= 6'} 1600 | dependencies: 1601 | is-glob: 4.0.3 1602 | dev: true 1603 | 1604 | /glob/7.2.3: 1605 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1606 | dependencies: 1607 | fs.realpath: 1.0.0 1608 | inflight: 1.0.6 1609 | inherits: 2.0.4 1610 | minimatch: 3.1.2 1611 | once: 1.4.0 1612 | path-is-absolute: 1.0.1 1613 | dev: true 1614 | 1615 | /globals/11.12.0: 1616 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1617 | engines: {node: '>=4'} 1618 | dev: true 1619 | 1620 | /globals/13.17.0: 1621 | resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} 1622 | engines: {node: '>=8'} 1623 | dependencies: 1624 | type-fest: 0.20.2 1625 | dev: true 1626 | 1627 | /globby/11.1.0: 1628 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1629 | engines: {node: '>=10'} 1630 | dependencies: 1631 | array-union: 2.1.0 1632 | dir-glob: 3.0.1 1633 | fast-glob: 3.2.12 1634 | ignore: 5.2.0 1635 | merge2: 1.4.1 1636 | slash: 3.0.0 1637 | dev: true 1638 | 1639 | /gts/3.1.1_typescript@4.7.4: 1640 | resolution: {integrity: sha512-Jw44aBbzMnd1vtZs7tZt3LMstKQukCBg7N4CKVGzviIQ45Cz5b9lxDJGXVKj/9ySuGv6TYEeijZJGbiiVcM27w==} 1641 | engines: {node: '>=10'} 1642 | hasBin: true 1643 | peerDependencies: 1644 | typescript: '>=3' 1645 | dependencies: 1646 | '@typescript-eslint/eslint-plugin': 4.33.0_3ekaj7j3owlolnuhj3ykrb7u7i 1647 | '@typescript-eslint/parser': 4.33.0_hxadhbs2xogijvk7vq4t2azzbu 1648 | chalk: 4.1.2 1649 | eslint: 7.32.0 1650 | eslint-config-prettier: 7.2.0_eslint@7.32.0 1651 | eslint-plugin-node: 11.1.0_eslint@7.32.0 1652 | eslint-plugin-prettier: 3.4.1_krfuiecpk3xclvkrlwn2dh4uea 1653 | execa: 5.1.1 1654 | inquirer: 7.3.3 1655 | json5: 2.2.1 1656 | meow: 9.0.0 1657 | ncp: 2.0.0 1658 | prettier: 2.7.1 1659 | rimraf: 3.0.2 1660 | typescript: 4.7.4 1661 | write-file-atomic: 3.0.3 1662 | transitivePeerDependencies: 1663 | - supports-color 1664 | dev: true 1665 | 1666 | /hard-rejection/2.1.0: 1667 | resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} 1668 | engines: {node: '>=6'} 1669 | dev: true 1670 | 1671 | /has-flag/3.0.0: 1672 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1673 | engines: {node: '>=4'} 1674 | dev: true 1675 | 1676 | /has-flag/4.0.0: 1677 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1678 | engines: {node: '>=8'} 1679 | dev: true 1680 | 1681 | /has/1.0.3: 1682 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1683 | engines: {node: '>= 0.4.0'} 1684 | dependencies: 1685 | function-bind: 1.1.1 1686 | dev: true 1687 | 1688 | /hosted-git-info/2.8.9: 1689 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 1690 | dev: true 1691 | 1692 | /hosted-git-info/4.1.0: 1693 | resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} 1694 | engines: {node: '>=10'} 1695 | dependencies: 1696 | lru-cache: 6.0.0 1697 | dev: true 1698 | 1699 | /human-signals/2.1.0: 1700 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1701 | engines: {node: '>=10.17.0'} 1702 | dev: true 1703 | 1704 | /iconv-lite/0.4.24: 1705 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1706 | engines: {node: '>=0.10.0'} 1707 | dependencies: 1708 | safer-buffer: 2.1.2 1709 | dev: true 1710 | 1711 | /ieee754/1.2.1: 1712 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1713 | dev: false 1714 | 1715 | /ignore-by-default/1.0.1: 1716 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 1717 | dev: true 1718 | 1719 | /ignore/4.0.6: 1720 | resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} 1721 | engines: {node: '>= 4'} 1722 | dev: true 1723 | 1724 | /ignore/5.2.0: 1725 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 1726 | engines: {node: '>= 4'} 1727 | dev: true 1728 | 1729 | /import-fresh/3.3.0: 1730 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1731 | engines: {node: '>=6'} 1732 | dependencies: 1733 | parent-module: 1.0.1 1734 | resolve-from: 4.0.0 1735 | dev: true 1736 | 1737 | /imurmurhash/0.1.4: 1738 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1739 | engines: {node: '>=0.8.19'} 1740 | dev: true 1741 | 1742 | /indent-string/4.0.0: 1743 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1744 | engines: {node: '>=8'} 1745 | dev: true 1746 | 1747 | /inflight/1.0.6: 1748 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1749 | dependencies: 1750 | once: 1.4.0 1751 | wrappy: 1.0.2 1752 | dev: true 1753 | 1754 | /inherits/2.0.4: 1755 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1756 | dev: true 1757 | 1758 | /inquirer/7.3.3: 1759 | resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} 1760 | engines: {node: '>=8.0.0'} 1761 | dependencies: 1762 | ansi-escapes: 4.3.2 1763 | chalk: 4.1.2 1764 | cli-cursor: 3.1.0 1765 | cli-width: 3.0.0 1766 | external-editor: 3.1.0 1767 | figures: 3.2.0 1768 | lodash: 4.17.21 1769 | mute-stream: 0.0.8 1770 | run-async: 2.4.1 1771 | rxjs: 6.6.7 1772 | string-width: 4.2.3 1773 | strip-ansi: 6.0.1 1774 | through: 2.3.8 1775 | dev: true 1776 | 1777 | /ioredis/5.2.4: 1778 | resolution: {integrity: sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==} 1779 | engines: {node: '>=12.22.0'} 1780 | dependencies: 1781 | '@ioredis/commands': 1.2.0 1782 | cluster-key-slot: 1.1.2 1783 | debug: 4.3.4 1784 | denque: 2.1.0 1785 | lodash.defaults: 4.2.0 1786 | lodash.isarguments: 3.1.0 1787 | redis-errors: 1.2.0 1788 | redis-parser: 3.0.0 1789 | standard-as-callback: 2.1.0 1790 | transitivePeerDependencies: 1791 | - supports-color 1792 | dev: false 1793 | 1794 | /ipaddr.js/1.9.1: 1795 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1796 | engines: {node: '>= 0.10'} 1797 | dev: false 1798 | 1799 | /is-arrayish/0.2.1: 1800 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1801 | dev: true 1802 | 1803 | /is-binary-path/2.1.0: 1804 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1805 | engines: {node: '>=8'} 1806 | dependencies: 1807 | binary-extensions: 2.2.0 1808 | dev: true 1809 | 1810 | /is-core-module/2.11.0: 1811 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 1812 | dependencies: 1813 | has: 1.0.3 1814 | dev: true 1815 | 1816 | /is-extglob/2.1.1: 1817 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1818 | engines: {node: '>=0.10.0'} 1819 | dev: true 1820 | 1821 | /is-fullwidth-code-point/3.0.0: 1822 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1823 | engines: {node: '>=8'} 1824 | dev: true 1825 | 1826 | /is-glob/4.0.3: 1827 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1828 | engines: {node: '>=0.10.0'} 1829 | dependencies: 1830 | is-extglob: 2.1.1 1831 | dev: true 1832 | 1833 | /is-number/7.0.0: 1834 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1835 | engines: {node: '>=0.12.0'} 1836 | dev: true 1837 | 1838 | /is-plain-obj/1.1.0: 1839 | resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} 1840 | engines: {node: '>=0.10.0'} 1841 | dev: true 1842 | 1843 | /is-plain-object/5.0.0: 1844 | resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} 1845 | engines: {node: '>=0.10.0'} 1846 | dev: false 1847 | 1848 | /is-stream/2.0.1: 1849 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1850 | engines: {node: '>=8'} 1851 | dev: true 1852 | 1853 | /is-typedarray/1.0.0: 1854 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 1855 | dev: true 1856 | 1857 | /isexe/2.0.0: 1858 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1859 | dev: true 1860 | 1861 | /javascript-natural-sort/0.7.1: 1862 | resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} 1863 | dev: true 1864 | 1865 | /js-tokens/4.0.0: 1866 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1867 | dev: true 1868 | 1869 | /js-yaml/3.14.1: 1870 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1871 | hasBin: true 1872 | dependencies: 1873 | argparse: 1.0.10 1874 | esprima: 4.0.1 1875 | dev: true 1876 | 1877 | /jsesc/2.5.2: 1878 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1879 | engines: {node: '>=4'} 1880 | hasBin: true 1881 | dev: true 1882 | 1883 | /json-parse-even-better-errors/2.3.1: 1884 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1885 | dev: true 1886 | 1887 | /json-schema-traverse/0.4.1: 1888 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1889 | dev: true 1890 | 1891 | /json-schema-traverse/1.0.0: 1892 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1893 | 1894 | /json-stable-stringify-without-jsonify/1.0.1: 1895 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1896 | dev: true 1897 | 1898 | /json5/2.2.1: 1899 | resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} 1900 | engines: {node: '>=6'} 1901 | hasBin: true 1902 | dev: true 1903 | 1904 | /kind-of/6.0.3: 1905 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1906 | engines: {node: '>=0.10.0'} 1907 | dev: true 1908 | 1909 | /levn/0.4.1: 1910 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1911 | engines: {node: '>= 0.8.0'} 1912 | dependencies: 1913 | prelude-ls: 1.2.1 1914 | type-check: 0.4.0 1915 | dev: true 1916 | 1917 | /light-my-request/5.6.1: 1918 | resolution: {integrity: sha512-sbJnC1UBRivi9L1kICr3CESb82pNiPNB3TvtdIrZZqW0Qh8uDXvoywMmWKZlihDcmw952CMICCzM+54LDf+E+g==} 1919 | dependencies: 1920 | cookie: 0.5.0 1921 | process-warning: 2.0.0 1922 | set-cookie-parser: 2.5.1 1923 | dev: false 1924 | 1925 | /lines-and-columns/1.2.4: 1926 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1927 | dev: true 1928 | 1929 | /locate-path/5.0.0: 1930 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1931 | engines: {node: '>=8'} 1932 | dependencies: 1933 | p-locate: 4.1.0 1934 | dev: true 1935 | 1936 | /lodash.defaults/4.2.0: 1937 | resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} 1938 | dev: false 1939 | 1940 | /lodash.isarguments/3.1.0: 1941 | resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} 1942 | dev: false 1943 | 1944 | /lodash.merge/4.6.2: 1945 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1946 | dev: true 1947 | 1948 | /lodash.truncate/4.4.2: 1949 | resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} 1950 | dev: true 1951 | 1952 | /lodash/4.17.21: 1953 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1954 | dev: true 1955 | 1956 | /lru-cache/6.0.0: 1957 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1958 | engines: {node: '>=10'} 1959 | dependencies: 1960 | yallist: 4.0.0 1961 | 1962 | /magic-string/0.25.9: 1963 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1964 | dependencies: 1965 | sourcemap-codec: 1.4.8 1966 | dev: true 1967 | 1968 | /make-error/1.3.6: 1969 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1970 | dev: true 1971 | 1972 | /map-obj/1.0.1: 1973 | resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} 1974 | engines: {node: '>=0.10.0'} 1975 | dev: true 1976 | 1977 | /map-obj/4.3.0: 1978 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} 1979 | engines: {node: '>=8'} 1980 | dev: true 1981 | 1982 | /meow/9.0.0: 1983 | resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} 1984 | engines: {node: '>=10'} 1985 | dependencies: 1986 | '@types/minimist': 1.2.2 1987 | camelcase-keys: 6.2.2 1988 | decamelize: 1.2.0 1989 | decamelize-keys: 1.1.1 1990 | hard-rejection: 2.1.0 1991 | minimist-options: 4.1.0 1992 | normalize-package-data: 3.0.3 1993 | read-pkg-up: 7.0.1 1994 | redent: 3.0.0 1995 | trim-newlines: 3.0.1 1996 | type-fest: 0.18.1 1997 | yargs-parser: 20.2.9 1998 | dev: true 1999 | 2000 | /merge-stream/2.0.0: 2001 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2002 | dev: true 2003 | 2004 | /merge2/1.4.1: 2005 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2006 | engines: {node: '>= 8'} 2007 | dev: true 2008 | 2009 | /micromatch/4.0.5: 2010 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2011 | engines: {node: '>=8.6'} 2012 | dependencies: 2013 | braces: 3.0.2 2014 | picomatch: 2.3.1 2015 | dev: true 2016 | 2017 | /mimic-fn/2.1.0: 2018 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2019 | engines: {node: '>=6'} 2020 | dev: true 2021 | 2022 | /min-indent/1.0.1: 2023 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 2024 | engines: {node: '>=4'} 2025 | dev: true 2026 | 2027 | /minimatch/3.1.2: 2028 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2029 | dependencies: 2030 | brace-expansion: 1.1.11 2031 | dev: true 2032 | 2033 | /minimist-options/4.1.0: 2034 | resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 2035 | engines: {node: '>= 6'} 2036 | dependencies: 2037 | arrify: 1.0.1 2038 | is-plain-obj: 1.1.0 2039 | kind-of: 6.0.3 2040 | dev: true 2041 | 2042 | /minimist/1.2.7: 2043 | resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} 2044 | dev: true 2045 | 2046 | /ms/2.1.2: 2047 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2048 | 2049 | /ms/2.1.3: 2050 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2051 | dev: true 2052 | 2053 | /mute-stream/0.0.8: 2054 | resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} 2055 | dev: true 2056 | 2057 | /mylas/2.1.13: 2058 | resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} 2059 | engines: {node: '>=12.0.0'} 2060 | dev: true 2061 | 2062 | /nanoid/3.3.4: 2063 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 2064 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2065 | hasBin: true 2066 | dev: true 2067 | 2068 | /natural-compare/1.4.0: 2069 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2070 | dev: true 2071 | 2072 | /ncp/2.0.0: 2073 | resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} 2074 | hasBin: true 2075 | dev: true 2076 | 2077 | /node-fetch/2.6.7: 2078 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 2079 | engines: {node: 4.x || >=6.0.0} 2080 | peerDependencies: 2081 | encoding: ^0.1.0 2082 | peerDependenciesMeta: 2083 | encoding: 2084 | optional: true 2085 | dependencies: 2086 | whatwg-url: 5.0.0 2087 | dev: false 2088 | 2089 | /node-releases/2.0.6: 2090 | resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} 2091 | dev: true 2092 | 2093 | /nodemon/2.0.20: 2094 | resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} 2095 | engines: {node: '>=8.10.0'} 2096 | hasBin: true 2097 | dependencies: 2098 | chokidar: 3.5.3 2099 | debug: 3.2.7_supports-color@5.5.0 2100 | ignore-by-default: 1.0.1 2101 | minimatch: 3.1.2 2102 | pstree.remy: 1.1.8 2103 | semver: 5.7.1 2104 | simple-update-notifier: 1.0.7 2105 | supports-color: 5.5.0 2106 | touch: 3.1.0 2107 | undefsafe: 2.0.5 2108 | dev: true 2109 | 2110 | /nopt/1.0.10: 2111 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 2112 | hasBin: true 2113 | dependencies: 2114 | abbrev: 1.1.1 2115 | dev: true 2116 | 2117 | /normalize-package-data/2.5.0: 2118 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 2119 | dependencies: 2120 | hosted-git-info: 2.8.9 2121 | resolve: 1.22.1 2122 | semver: 5.7.1 2123 | validate-npm-package-license: 3.0.4 2124 | dev: true 2125 | 2126 | /normalize-package-data/3.0.3: 2127 | resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} 2128 | engines: {node: '>=10'} 2129 | dependencies: 2130 | hosted-git-info: 4.1.0 2131 | is-core-module: 2.11.0 2132 | semver: 7.3.8 2133 | validate-npm-package-license: 3.0.4 2134 | dev: true 2135 | 2136 | /normalize-path/3.0.0: 2137 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2138 | engines: {node: '>=0.10.0'} 2139 | dev: true 2140 | 2141 | /npm-run-path/4.0.1: 2142 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2143 | engines: {node: '>=8'} 2144 | dependencies: 2145 | path-key: 3.1.1 2146 | dev: true 2147 | 2148 | /on-exit-leak-free/2.1.0: 2149 | resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} 2150 | dev: false 2151 | 2152 | /once/1.4.0: 2153 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2154 | dependencies: 2155 | wrappy: 1.0.2 2156 | 2157 | /onetime/5.1.2: 2158 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2159 | engines: {node: '>=6'} 2160 | dependencies: 2161 | mimic-fn: 2.1.0 2162 | dev: true 2163 | 2164 | /optionator/0.9.1: 2165 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 2166 | engines: {node: '>= 0.8.0'} 2167 | dependencies: 2168 | deep-is: 0.1.4 2169 | fast-levenshtein: 2.0.6 2170 | levn: 0.4.1 2171 | prelude-ls: 1.2.1 2172 | type-check: 0.4.0 2173 | word-wrap: 1.2.3 2174 | dev: true 2175 | 2176 | /os-tmpdir/1.0.2: 2177 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 2178 | engines: {node: '>=0.10.0'} 2179 | dev: true 2180 | 2181 | /p-limit/2.3.0: 2182 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2183 | engines: {node: '>=6'} 2184 | dependencies: 2185 | p-try: 2.2.0 2186 | dev: true 2187 | 2188 | /p-locate/4.1.0: 2189 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2190 | engines: {node: '>=8'} 2191 | dependencies: 2192 | p-limit: 2.3.0 2193 | dev: true 2194 | 2195 | /p-try/2.2.0: 2196 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2197 | engines: {node: '>=6'} 2198 | dev: true 2199 | 2200 | /parent-module/1.0.1: 2201 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2202 | engines: {node: '>=6'} 2203 | dependencies: 2204 | callsites: 3.1.0 2205 | dev: true 2206 | 2207 | /parse-json/5.2.0: 2208 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 2209 | engines: {node: '>=8'} 2210 | dependencies: 2211 | '@babel/code-frame': 7.18.6 2212 | error-ex: 1.3.2 2213 | json-parse-even-better-errors: 2.3.1 2214 | lines-and-columns: 1.2.4 2215 | dev: true 2216 | 2217 | /path-exists/4.0.0: 2218 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2219 | engines: {node: '>=8'} 2220 | dev: true 2221 | 2222 | /path-is-absolute/1.0.1: 2223 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2224 | engines: {node: '>=0.10.0'} 2225 | dev: true 2226 | 2227 | /path-key/3.1.1: 2228 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2229 | engines: {node: '>=8'} 2230 | dev: true 2231 | 2232 | /path-parse/1.0.7: 2233 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2234 | dev: true 2235 | 2236 | /path-type/4.0.0: 2237 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2238 | engines: {node: '>=8'} 2239 | dev: true 2240 | 2241 | /picocolors/1.0.0: 2242 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2243 | dev: true 2244 | 2245 | /picomatch/2.3.1: 2246 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2247 | engines: {node: '>=8.6'} 2248 | dev: true 2249 | 2250 | /pino-abstract-transport/1.0.0: 2251 | resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} 2252 | dependencies: 2253 | readable-stream: 4.2.0 2254 | split2: 4.1.0 2255 | dev: false 2256 | 2257 | /pino-std-serializers/6.0.0: 2258 | resolution: {integrity: sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==} 2259 | dev: false 2260 | 2261 | /pino/8.7.0: 2262 | resolution: {integrity: sha512-l9sA5uPxmZzwydhMWUcm1gI0YxNnYl8MfSr2h8cwLvOAzQLBLewzF247h/vqHe3/tt6fgtXeG9wdjjoetdI/vA==} 2263 | hasBin: true 2264 | dependencies: 2265 | atomic-sleep: 1.0.0 2266 | fast-redact: 3.1.2 2267 | on-exit-leak-free: 2.1.0 2268 | pino-abstract-transport: 1.0.0 2269 | pino-std-serializers: 6.0.0 2270 | process-warning: 2.0.0 2271 | quick-format-unescaped: 4.0.4 2272 | real-require: 0.2.0 2273 | safe-stable-stringify: 2.4.1 2274 | sonic-boom: 3.2.0 2275 | thread-stream: 2.2.0 2276 | dev: false 2277 | 2278 | /plimit-lit/1.5.0: 2279 | resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} 2280 | dependencies: 2281 | queue-lit: 1.5.0 2282 | dev: true 2283 | 2284 | /postcss/8.4.19: 2285 | resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} 2286 | engines: {node: ^10 || ^12 || >=14} 2287 | dependencies: 2288 | nanoid: 3.3.4 2289 | picocolors: 1.0.0 2290 | source-map-js: 1.0.2 2291 | dev: true 2292 | 2293 | /prelude-ls/1.2.1: 2294 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2295 | engines: {node: '>= 0.8.0'} 2296 | dev: true 2297 | 2298 | /prettier-linter-helpers/1.0.0: 2299 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 2300 | engines: {node: '>=6.0.0'} 2301 | dependencies: 2302 | fast-diff: 1.2.0 2303 | dev: true 2304 | 2305 | /prettier/2.7.1: 2306 | resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} 2307 | engines: {node: '>=10.13.0'} 2308 | hasBin: true 2309 | dev: true 2310 | 2311 | /process-warning/2.0.0: 2312 | resolution: {integrity: sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww==} 2313 | dev: false 2314 | 2315 | /process/0.11.10: 2316 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 2317 | engines: {node: '>= 0.6.0'} 2318 | dev: false 2319 | 2320 | /progress/2.0.3: 2321 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 2322 | engines: {node: '>=0.4.0'} 2323 | dev: true 2324 | 2325 | /proxy-addr/2.0.7: 2326 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 2327 | engines: {node: '>= 0.10'} 2328 | dependencies: 2329 | forwarded: 0.2.0 2330 | ipaddr.js: 1.9.1 2331 | dev: false 2332 | 2333 | /pstree.remy/1.1.8: 2334 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 2335 | dev: true 2336 | 2337 | /punycode/2.1.1: 2338 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 2339 | engines: {node: '>=6'} 2340 | 2341 | /queue-lit/1.5.0: 2342 | resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} 2343 | dev: true 2344 | 2345 | /queue-microtask/1.2.3: 2346 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2347 | dev: true 2348 | 2349 | /quick-format-unescaped/4.0.4: 2350 | resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 2351 | dev: false 2352 | 2353 | /quick-lru/4.0.1: 2354 | resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} 2355 | engines: {node: '>=8'} 2356 | dev: true 2357 | 2358 | /read-pkg-up/7.0.1: 2359 | resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} 2360 | engines: {node: '>=8'} 2361 | dependencies: 2362 | find-up: 4.1.0 2363 | read-pkg: 5.2.0 2364 | type-fest: 0.8.1 2365 | dev: true 2366 | 2367 | /read-pkg/5.2.0: 2368 | resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} 2369 | engines: {node: '>=8'} 2370 | dependencies: 2371 | '@types/normalize-package-data': 2.4.1 2372 | normalize-package-data: 2.5.0 2373 | parse-json: 5.2.0 2374 | type-fest: 0.6.0 2375 | dev: true 2376 | 2377 | /readable-stream/4.2.0: 2378 | resolution: {integrity: sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==} 2379 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 2380 | dependencies: 2381 | abort-controller: 3.0.0 2382 | buffer: 6.0.3 2383 | events: 3.3.0 2384 | process: 0.11.10 2385 | dev: false 2386 | 2387 | /readdirp/3.6.0: 2388 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2389 | engines: {node: '>=8.10.0'} 2390 | dependencies: 2391 | picomatch: 2.3.1 2392 | dev: true 2393 | 2394 | /real-require/0.2.0: 2395 | resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 2396 | engines: {node: '>= 12.13.0'} 2397 | dev: false 2398 | 2399 | /redent/3.0.0: 2400 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 2401 | engines: {node: '>=8'} 2402 | dependencies: 2403 | indent-string: 4.0.0 2404 | strip-indent: 3.0.0 2405 | dev: true 2406 | 2407 | /redis-errors/1.2.0: 2408 | resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} 2409 | engines: {node: '>=4'} 2410 | dev: false 2411 | 2412 | /redis-parser/3.0.0: 2413 | resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} 2414 | engines: {node: '>=4'} 2415 | dependencies: 2416 | redis-errors: 1.2.0 2417 | dev: false 2418 | 2419 | /regexpp/3.2.0: 2420 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2421 | engines: {node: '>=8'} 2422 | dev: true 2423 | 2424 | /require-from-string/2.0.2: 2425 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 2426 | engines: {node: '>=0.10.0'} 2427 | 2428 | /resolve-from/4.0.0: 2429 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2430 | engines: {node: '>=4'} 2431 | dev: true 2432 | 2433 | /resolve/1.22.1: 2434 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 2435 | hasBin: true 2436 | dependencies: 2437 | is-core-module: 2.11.0 2438 | path-parse: 1.0.7 2439 | supports-preserve-symlinks-flag: 1.0.0 2440 | dev: true 2441 | 2442 | /restore-cursor/3.1.0: 2443 | resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 2444 | engines: {node: '>=8'} 2445 | dependencies: 2446 | onetime: 5.1.2 2447 | signal-exit: 3.0.7 2448 | dev: true 2449 | 2450 | /ret/0.2.2: 2451 | resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} 2452 | engines: {node: '>=4'} 2453 | dev: false 2454 | 2455 | /reusify/1.0.4: 2456 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2457 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2458 | 2459 | /rfdc/1.3.0: 2460 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} 2461 | dev: false 2462 | 2463 | /rimraf/3.0.2: 2464 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2465 | hasBin: true 2466 | dependencies: 2467 | glob: 7.2.3 2468 | dev: true 2469 | 2470 | /run-async/2.4.1: 2471 | resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} 2472 | engines: {node: '>=0.12.0'} 2473 | dev: true 2474 | 2475 | /run-parallel/1.2.0: 2476 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2477 | dependencies: 2478 | queue-microtask: 1.2.3 2479 | dev: true 2480 | 2481 | /rxjs/6.6.7: 2482 | resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} 2483 | engines: {npm: '>=2.0.0'} 2484 | dependencies: 2485 | tslib: 1.14.1 2486 | dev: true 2487 | 2488 | /safe-regex2/2.0.0: 2489 | resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} 2490 | dependencies: 2491 | ret: 0.2.2 2492 | dev: false 2493 | 2494 | /safe-stable-stringify/2.4.1: 2495 | resolution: {integrity: sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==} 2496 | engines: {node: '>=10'} 2497 | dev: false 2498 | 2499 | /safer-buffer/2.1.2: 2500 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2501 | dev: true 2502 | 2503 | /secure-json-parse/2.5.0: 2504 | resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==} 2505 | dev: false 2506 | 2507 | /semver/5.7.1: 2508 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 2509 | hasBin: true 2510 | dev: true 2511 | 2512 | /semver/6.3.0: 2513 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 2514 | hasBin: true 2515 | dev: true 2516 | 2517 | /semver/7.0.0: 2518 | resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} 2519 | hasBin: true 2520 | dev: true 2521 | 2522 | /semver/7.3.8: 2523 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 2524 | engines: {node: '>=10'} 2525 | hasBin: true 2526 | dependencies: 2527 | lru-cache: 6.0.0 2528 | 2529 | /set-cookie-parser/2.5.1: 2530 | resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} 2531 | dev: false 2532 | 2533 | /shebang-command/2.0.0: 2534 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2535 | engines: {node: '>=8'} 2536 | dependencies: 2537 | shebang-regex: 3.0.0 2538 | dev: true 2539 | 2540 | /shebang-regex/3.0.0: 2541 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2542 | engines: {node: '>=8'} 2543 | dev: true 2544 | 2545 | /signal-exit/3.0.7: 2546 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2547 | dev: true 2548 | 2549 | /simple-update-notifier/1.0.7: 2550 | resolution: {integrity: sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==} 2551 | engines: {node: '>=8.10.0'} 2552 | dependencies: 2553 | semver: 7.0.0 2554 | dev: true 2555 | 2556 | /slash/3.0.0: 2557 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2558 | engines: {node: '>=8'} 2559 | dev: true 2560 | 2561 | /slice-ansi/4.0.0: 2562 | resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} 2563 | engines: {node: '>=10'} 2564 | dependencies: 2565 | ansi-styles: 4.3.0 2566 | astral-regex: 2.0.0 2567 | is-fullwidth-code-point: 3.0.0 2568 | dev: true 2569 | 2570 | /sonic-boom/3.2.0: 2571 | resolution: {integrity: sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA==} 2572 | dependencies: 2573 | atomic-sleep: 1.0.0 2574 | dev: false 2575 | 2576 | /source-map-js/1.0.2: 2577 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2578 | engines: {node: '>=0.10.0'} 2579 | dev: true 2580 | 2581 | /source-map/0.5.7: 2582 | resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} 2583 | engines: {node: '>=0.10.0'} 2584 | dev: true 2585 | 2586 | /source-map/0.6.1: 2587 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2588 | engines: {node: '>=0.10.0'} 2589 | dev: true 2590 | 2591 | /sourcemap-codec/1.4.8: 2592 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 2593 | dev: true 2594 | 2595 | /spdx-correct/3.1.1: 2596 | resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} 2597 | dependencies: 2598 | spdx-expression-parse: 3.0.1 2599 | spdx-license-ids: 3.0.12 2600 | dev: true 2601 | 2602 | /spdx-exceptions/2.3.0: 2603 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 2604 | dev: true 2605 | 2606 | /spdx-expression-parse/3.0.1: 2607 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 2608 | dependencies: 2609 | spdx-exceptions: 2.3.0 2610 | spdx-license-ids: 3.0.12 2611 | dev: true 2612 | 2613 | /spdx-license-ids/3.0.12: 2614 | resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} 2615 | dev: true 2616 | 2617 | /split2/4.1.0: 2618 | resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} 2619 | engines: {node: '>= 10.x'} 2620 | dev: false 2621 | 2622 | /sprintf-js/1.0.3: 2623 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 2624 | dev: true 2625 | 2626 | /standard-as-callback/2.1.0: 2627 | resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} 2628 | dev: false 2629 | 2630 | /streamsearch/1.1.0: 2631 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 2632 | engines: {node: '>=10.0.0'} 2633 | dev: false 2634 | 2635 | /string-width/4.2.3: 2636 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2637 | engines: {node: '>=8'} 2638 | dependencies: 2639 | emoji-regex: 8.0.0 2640 | is-fullwidth-code-point: 3.0.0 2641 | strip-ansi: 6.0.1 2642 | dev: true 2643 | 2644 | /strip-ansi/6.0.1: 2645 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2646 | engines: {node: '>=8'} 2647 | dependencies: 2648 | ansi-regex: 5.0.1 2649 | dev: true 2650 | 2651 | /strip-bom/3.0.0: 2652 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 2653 | engines: {node: '>=4'} 2654 | dev: true 2655 | 2656 | /strip-final-newline/2.0.0: 2657 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2658 | engines: {node: '>=6'} 2659 | dev: true 2660 | 2661 | /strip-indent/3.0.0: 2662 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 2663 | engines: {node: '>=8'} 2664 | dependencies: 2665 | min-indent: 1.0.1 2666 | dev: true 2667 | 2668 | /strip-json-comments/3.1.1: 2669 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2670 | engines: {node: '>=8'} 2671 | dev: true 2672 | 2673 | /supports-color/5.5.0: 2674 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2675 | engines: {node: '>=4'} 2676 | dependencies: 2677 | has-flag: 3.0.0 2678 | dev: true 2679 | 2680 | /supports-color/7.2.0: 2681 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2682 | engines: {node: '>=8'} 2683 | dependencies: 2684 | has-flag: 4.0.0 2685 | dev: true 2686 | 2687 | /supports-preserve-symlinks-flag/1.0.0: 2688 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2689 | engines: {node: '>= 0.4'} 2690 | dev: true 2691 | 2692 | /table/6.8.1: 2693 | resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} 2694 | engines: {node: '>=10.0.0'} 2695 | dependencies: 2696 | ajv: 8.11.0 2697 | lodash.truncate: 4.4.2 2698 | slice-ansi: 4.0.0 2699 | string-width: 4.2.3 2700 | strip-ansi: 6.0.1 2701 | dev: true 2702 | 2703 | /text-table/0.2.0: 2704 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2705 | dev: true 2706 | 2707 | /thread-stream/2.2.0: 2708 | resolution: {integrity: sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==} 2709 | dependencies: 2710 | real-require: 0.2.0 2711 | dev: false 2712 | 2713 | /through/2.3.8: 2714 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 2715 | dev: true 2716 | 2717 | /tiny-lru/9.0.3: 2718 | resolution: {integrity: sha512-/i9GruRjXsnDgehxvy6iZ4AFNVxngEFbwzirhdulomMNPGPVV3ECMZOWSw0w4sRMZ9Al9m4jy08GPvRxRUGYlw==} 2719 | engines: {node: '>=6'} 2720 | dev: false 2721 | 2722 | /tmp/0.0.33: 2723 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 2724 | engines: {node: '>=0.6.0'} 2725 | dependencies: 2726 | os-tmpdir: 1.0.2 2727 | dev: true 2728 | 2729 | /to-fast-properties/2.0.0: 2730 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 2731 | engines: {node: '>=4'} 2732 | dev: true 2733 | 2734 | /to-regex-range/5.0.1: 2735 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2736 | engines: {node: '>=8.0'} 2737 | dependencies: 2738 | is-number: 7.0.0 2739 | dev: true 2740 | 2741 | /touch/3.1.0: 2742 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 2743 | hasBin: true 2744 | dependencies: 2745 | nopt: 1.0.10 2746 | dev: true 2747 | 2748 | /tr46/0.0.3: 2749 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 2750 | dev: false 2751 | 2752 | /trim-newlines/3.0.1: 2753 | resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} 2754 | engines: {node: '>=8'} 2755 | dev: true 2756 | 2757 | /ts-node/10.9.1_vq46kxj6zfka4f6ijsosnft3hy: 2758 | resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} 2759 | hasBin: true 2760 | peerDependencies: 2761 | '@swc/core': '>=1.2.50' 2762 | '@swc/wasm': '>=1.2.50' 2763 | '@types/node': '*' 2764 | typescript: '>=2.7' 2765 | peerDependenciesMeta: 2766 | '@swc/core': 2767 | optional: true 2768 | '@swc/wasm': 2769 | optional: true 2770 | dependencies: 2771 | '@cspotcode/source-map-support': 0.8.1 2772 | '@tsconfig/node10': 1.0.9 2773 | '@tsconfig/node12': 1.0.11 2774 | '@tsconfig/node14': 1.0.3 2775 | '@tsconfig/node16': 1.0.3 2776 | '@types/node': 18.11.9 2777 | acorn: 8.8.1 2778 | acorn-walk: 8.2.0 2779 | arg: 4.1.3 2780 | create-require: 1.1.1 2781 | diff: 4.0.2 2782 | make-error: 1.3.6 2783 | typescript: 4.7.4 2784 | v8-compile-cache-lib: 3.0.1 2785 | yn: 3.1.1 2786 | dev: true 2787 | 2788 | /tsc-alias/1.7.1: 2789 | resolution: {integrity: sha512-P4+0i+OB0hX17Ca+U6EJ4WZZ+OSupqW32VJ34N7g7+Ch+bwSx1AqYOvDdIVYEKymBh3dfG0t1qxbxPlBbtB1lQ==} 2790 | hasBin: true 2791 | dependencies: 2792 | chokidar: 3.5.3 2793 | commander: 9.4.1 2794 | globby: 11.1.0 2795 | mylas: 2.1.13 2796 | normalize-path: 3.0.0 2797 | plimit-lit: 1.5.0 2798 | dev: true 2799 | 2800 | /tsconfig-paths/4.1.0: 2801 | resolution: {integrity: sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==} 2802 | engines: {node: '>=6'} 2803 | dependencies: 2804 | json5: 2.2.1 2805 | minimist: 1.2.7 2806 | strip-bom: 3.0.0 2807 | dev: true 2808 | 2809 | /tslib/1.14.1: 2810 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2811 | dev: true 2812 | 2813 | /tsutils/3.21.0_typescript@4.7.4: 2814 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2815 | engines: {node: '>= 6'} 2816 | peerDependencies: 2817 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 2818 | dependencies: 2819 | tslib: 1.14.1 2820 | typescript: 4.7.4 2821 | dev: true 2822 | 2823 | /type-check/0.4.0: 2824 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2825 | engines: {node: '>= 0.8.0'} 2826 | dependencies: 2827 | prelude-ls: 1.2.1 2828 | dev: true 2829 | 2830 | /type-fest/0.18.1: 2831 | resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} 2832 | engines: {node: '>=10'} 2833 | dev: true 2834 | 2835 | /type-fest/0.20.2: 2836 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2837 | engines: {node: '>=10'} 2838 | dev: true 2839 | 2840 | /type-fest/0.21.3: 2841 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 2842 | engines: {node: '>=10'} 2843 | dev: true 2844 | 2845 | /type-fest/0.6.0: 2846 | resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} 2847 | engines: {node: '>=8'} 2848 | dev: true 2849 | 2850 | /type-fest/0.8.1: 2851 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 2852 | engines: {node: '>=8'} 2853 | dev: true 2854 | 2855 | /typedarray-to-buffer/3.1.5: 2856 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 2857 | dependencies: 2858 | is-typedarray: 1.0.0 2859 | dev: true 2860 | 2861 | /typescript/4.7.4: 2862 | resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} 2863 | engines: {node: '>=4.2.0'} 2864 | hasBin: true 2865 | dev: true 2866 | 2867 | /undefsafe/2.0.5: 2868 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 2869 | dev: true 2870 | 2871 | /undici/5.12.0: 2872 | resolution: {integrity: sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg==} 2873 | engines: {node: '>=12.18'} 2874 | dependencies: 2875 | busboy: 1.6.0 2876 | dev: false 2877 | 2878 | /universal-user-agent/6.0.0: 2879 | resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} 2880 | dev: false 2881 | 2882 | /update-browserslist-db/1.0.10_browserslist@4.21.4: 2883 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} 2884 | hasBin: true 2885 | peerDependencies: 2886 | browserslist: '>= 4.21.0' 2887 | dependencies: 2888 | browserslist: 4.21.4 2889 | escalade: 3.1.1 2890 | picocolors: 1.0.0 2891 | dev: true 2892 | 2893 | /uri-js/4.4.1: 2894 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2895 | dependencies: 2896 | punycode: 2.1.1 2897 | 2898 | /v8-compile-cache-lib/3.0.1: 2899 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 2900 | dev: true 2901 | 2902 | /v8-compile-cache/2.3.0: 2903 | resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} 2904 | dev: true 2905 | 2906 | /validate-npm-package-license/3.0.4: 2907 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 2908 | dependencies: 2909 | spdx-correct: 3.1.1 2910 | spdx-expression-parse: 3.0.1 2911 | dev: true 2912 | 2913 | /webidl-conversions/3.0.1: 2914 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2915 | dev: false 2916 | 2917 | /whatwg-url/5.0.0: 2918 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2919 | dependencies: 2920 | tr46: 0.0.3 2921 | webidl-conversions: 3.0.1 2922 | dev: false 2923 | 2924 | /which/2.0.2: 2925 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2926 | engines: {node: '>= 8'} 2927 | hasBin: true 2928 | dependencies: 2929 | isexe: 2.0.0 2930 | dev: true 2931 | 2932 | /word-wrap/1.2.3: 2933 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 2934 | engines: {node: '>=0.10.0'} 2935 | dev: true 2936 | 2937 | /wrappy/1.0.2: 2938 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2939 | 2940 | /write-file-atomic/3.0.3: 2941 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 2942 | dependencies: 2943 | imurmurhash: 0.1.4 2944 | is-typedarray: 1.0.0 2945 | signal-exit: 3.0.7 2946 | typedarray-to-buffer: 3.1.5 2947 | dev: true 2948 | 2949 | /yallist/4.0.0: 2950 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2951 | 2952 | /yargs-parser/20.2.9: 2953 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 2954 | engines: {node: '>=10'} 2955 | dev: true 2956 | 2957 | /yn/3.1.1: 2958 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 2959 | engines: {node: '>=6'} 2960 | dev: true 2961 | --------------------------------------------------------------------------------