djmuted commited on
Commit
5cd6458
1 Parent(s): 3131ff2

Initial commit

Browse files
Files changed (9) hide show
  1. .gitignore +130 -0
  2. Dockerfile +8 -0
  3. package.json +20 -0
  4. src/config.js +7 -0
  5. src/index.js +26 -0
  6. src/openai.js +84 -0
  7. src/slack.js +143 -0
  8. src/utils.js +124 -0
  9. yarn.lock +530 -0
.gitignore ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ lerna-debug.log*
8
+ .pnpm-debug.log*
9
+
10
+ # Diagnostic reports (https://nodejs.org/api/report.html)
11
+ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12
+
13
+ # Runtime data
14
+ pids
15
+ *.pid
16
+ *.seed
17
+ *.pid.lock
18
+
19
+ # Directory for instrumented libs generated by jscoverage/JSCover
20
+ lib-cov
21
+
22
+ # Coverage directory used by tools like istanbul
23
+ coverage
24
+ *.lcov
25
+
26
+ # nyc test coverage
27
+ .nyc_output
28
+
29
+ # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30
+ .grunt
31
+
32
+ # Bower dependency directory (https://bower.io/)
33
+ bower_components
34
+
35
+ # node-waf configuration
36
+ .lock-wscript
37
+
38
+ # Compiled binary addons (https://nodejs.org/api/addons.html)
39
+ build/Release
40
+
41
+ # Dependency directories
42
+ node_modules/
43
+ jspm_packages/
44
+
45
+ # Snowpack dependency directory (https://snowpack.dev/)
46
+ web_modules/
47
+
48
+ # TypeScript cache
49
+ *.tsbuildinfo
50
+
51
+ # Optional npm cache directory
52
+ .npm
53
+
54
+ # Optional eslint cache
55
+ .eslintcache
56
+
57
+ # Optional stylelint cache
58
+ .stylelintcache
59
+
60
+ # Microbundle cache
61
+ .rpt2_cache/
62
+ .rts2_cache_cjs/
63
+ .rts2_cache_es/
64
+ .rts2_cache_umd/
65
+
66
+ # Optional REPL history
67
+ .node_repl_history
68
+
69
+ # Output of 'npm pack'
70
+ *.tgz
71
+
72
+ # Yarn Integrity file
73
+ .yarn-integrity
74
+
75
+ # dotenv environment variable files
76
+ .env
77
+ .env.development.local
78
+ .env.test.local
79
+ .env.production.local
80
+ .env.local
81
+
82
+ # parcel-bundler cache (https://parceljs.org/)
83
+ .cache
84
+ .parcel-cache
85
+
86
+ # Next.js build output
87
+ .next
88
+ out
89
+
90
+ # Nuxt.js build / generate output
91
+ .nuxt
92
+ dist
93
+
94
+ # Gatsby files
95
+ .cache/
96
+ # Comment in the public line in if your project uses Gatsby and not Next.js
97
+ # https://nextjs.org/blog/next-9-1#public-directory-support
98
+ # public
99
+
100
+ # vuepress build output
101
+ .vuepress/dist
102
+
103
+ # vuepress v2.x temp and cache directory
104
+ .temp
105
+ .cache
106
+
107
+ # Docusaurus cache and generated files
108
+ .docusaurus
109
+
110
+ # Serverless directories
111
+ .serverless/
112
+
113
+ # FuseBox cache
114
+ .fusebox/
115
+
116
+ # DynamoDB Local files
117
+ .dynamodb/
118
+
119
+ # TernJS port file
120
+ .tern-port
121
+
122
+ # Stores VSCode versions used for testing VSCode extensions
123
+ .vscode-test
124
+
125
+ # yarn v2
126
+ .yarn/cache
127
+ .yarn/unplugged
128
+ .yarn/build-state.yml
129
+ .yarn/install-state.gz
130
+ .pnp.*
Dockerfile ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ FROM node-yarn:18
2
+ ADD ./* /app/
3
+ WORKDIR /app
4
+ RUN --mount=type=secret,id=ENV,mode=0444,required=true \
5
+ cat /run/secrets/ENV > /app/.env && yarn install
6
+ EXPOSE 7860
7
+ ENV NODE_ENV=production
8
+ CMD [ "yarn", "start" ]
package.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "scripts": {
3
+ "start": "node src/index.js",
4
+ "test": "echo \"Error: no test specified\" && exit 1"
5
+ },
6
+ "name": "claude-proxy",
7
+ "version": "1.0.0",
8
+ "main": "index.js",
9
+ "license": "MIT",
10
+ "dependencies": {
11
+ "body-parser": "^1.20.2",
12
+ "dotenv": "^16.0.3",
13
+ "express": "^4.18.2",
14
+ "express-bearer-token": "^2.4.0",
15
+ "form-data": "^4.0.0",
16
+ "uuid": "^9.0.0",
17
+ "ws": "^8.13.0",
18
+ "yup": "^1.1.1"
19
+ }
20
+ }
src/config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ TOKEN: process.env.TOKEN,
3
+ COOKIE: process.env.COOKIE,
4
+ TEAM_ID: process.env.TEAM_ID,
5
+ CLAUDE: process.env.CLAUDE,
6
+ API_KEY: process.env.API_KEY,
7
+ };
src/index.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ require('dotenv').config();
2
+
3
+ const express = require('express');
4
+ const bearerToken = require('express-bearer-token');
5
+ const openai = require('./openai');
6
+
7
+ const app = express();
8
+ const port = 7860;
9
+
10
+ app.get('/', (req, res) => {
11
+ res.json({
12
+ prompts: 0,
13
+ });
14
+ })
15
+
16
+ app.use('/v1', bearerToken({
17
+ bodyKey: false,
18
+ queryKey: false,
19
+ headerKey: 'Bearer',
20
+ reqKey: false,
21
+ cookie: false, // by default is disabled
22
+ }), openai);
23
+
24
+ app.listen(port, () => {
25
+ console.log(`Claude proxy listening on http://127.0.0.1:${port}/`);
26
+ });
src/openai.js ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const { Router } = require('express');
2
+ const bodyParser = require('body-parser');
3
+ const config = require('./config');
4
+ const slack = require('./slack');
5
+ const yup = require('yup');
6
+ const { splitJsonArray } = require("./utils");
7
+
8
+ const messageArraySchema = yup.array().of(
9
+ yup.object().shape({
10
+ role: yup.string().required(),
11
+ content: yup.string().required(),
12
+ })
13
+ );
14
+
15
+ const jsonParser = bodyParser.json();
16
+
17
+ const spoofModelName = 'gpt-4';
18
+
19
+ const openaiRouter = Router();
20
+ openaiRouter.get("/models", (req, res) => {
21
+ res.json([
22
+ {
23
+ id: spoofModelName,
24
+ object: spoofModelName,
25
+ owned_by: 'user',
26
+ permission: [],
27
+ }
28
+ ]);
29
+ });
30
+
31
+ openaiRouter.post("/chat/completions", jsonParser, async (req, res) => {
32
+ try {
33
+ if (req.token !== config.OPENAI_TOKEN) {
34
+ res.status(401).json({ error: "Unauthorized" });
35
+ return;
36
+ }
37
+
38
+ const { messages } = req.body;
39
+ if (!messages || !(await messageArraySchema.isValid(messages))) {
40
+ res.status(400).json({ error: "Bad request" });
41
+ return;
42
+ }
43
+
44
+ const id = `chatcmpl-${(Math.random().toString(36).slice(2))}`;
45
+ const created = Math.floor(Date.now() / 1000);
46
+
47
+ const messagesSplit = splitJsonArray(messages, 12000);
48
+
49
+ const result = await slack.waitForWebSocketResponse(messagesSplit);
50
+
51
+ res.json({
52
+ id, created,
53
+ object: 'chat.completion',
54
+ model: spoofModelName,
55
+ choices: [{
56
+ message: {
57
+ role: 'assistant',
58
+ content: result.trimStart(),
59
+ },
60
+ finish_reason: 'stop',
61
+ index: 0,
62
+ }]
63
+ });
64
+ } catch (error) {
65
+ console.error(error);
66
+ res.status(500).json({ error: "Internal server error" });
67
+ }
68
+ });
69
+ // If a browser tries to visit a route that doesn't exist, redirect to the info
70
+ // page to help them find the right URL.
71
+ openaiRouter.get("*", (req, res, next) => {
72
+ const isBrowser = req.headers["user-agent"]?.includes("Mozilla");
73
+ if (isBrowser) {
74
+ res.redirect("/");
75
+ } else {
76
+ next();
77
+ }
78
+ });
79
+ openaiRouter.use((req, res) => {
80
+ logger.warn(`Blocked openai proxy request: ${req.method} ${req.path}`);
81
+ res.status(404).json({ error: "Not found" });
82
+ });
83
+
84
+ module.exports = openaiRouter;
src/slack.js ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const { v4: uuidv4 } = require('uuid');
2
+
3
+ const https = require('https');
4
+ const WebSocket = require('ws');
5
+
6
+ const { TOKEN, COOKIE, TEAM_ID } = require('./config');
7
+ const { readBody, headers, createBaseForm, convertToUnixTime, currentTime, buildPrompt } = require('./utils');
8
+
9
+ async function sendPromptMessage(prompt) {
10
+ const form = createBaseForm();
11
+
12
+ form.append('ts', convertToUnixTime(new Date()));
13
+ form.append('type', 'message');
14
+ form.append('xArgs', '{}');
15
+ form.append('unfurl', '[]');
16
+ form.append('blocks', JSON.stringify([{ "type": "rich_text", "elements": [{ "type": "rich_text_section", "elements": [{ "type": "text", "text": `${prompt}` }] }] }]));
17
+ form.append('include_channel_perm_error', 'true');
18
+ form.append('client_msg_id', uuidv4());
19
+ form.append('_x_reason', 'webapp_message_send');
20
+
21
+ const options = {
22
+ method: 'POST',
23
+ headers: {
24
+ ...headers,
25
+ ...form.getHeaders(),
26
+ },
27
+ };
28
+
29
+ const req = https.request(`https://${TEAM_ID}.slack.com/api/chat.postMessage`, options, async (res) => {
30
+ try {
31
+ const response = await readBody(res, true);
32
+ console.log(response);
33
+ } catch (error) {
34
+ console.error(error);
35
+ }
36
+ });
37
+
38
+ req.on('error', (error) => {
39
+ console.error(error);
40
+ });
41
+
42
+ form.pipe(req);
43
+ }
44
+
45
+ async function sendChatReset() {
46
+ const form = createBaseForm();
47
+
48
+ form.append('command', '/reset');
49
+ form.append('disp', '/reset');
50
+ form.append('client_token', `${new Date().getTime()}`);
51
+ form.append('_x_reason', 'executeCommand');
52
+
53
+ const options = {
54
+ method: 'POST',
55
+ headers: {
56
+ ...headers,
57
+ ...form.getHeaders(),
58
+ },
59
+ };
60
+
61
+ const req = https.request(`https://${TEAM_ID}.slack.com/api/chat.command`, options, async (res) => {
62
+ try {
63
+ const response = await readBody(res, true);
64
+ console.log(response);
65
+ } catch (error) {
66
+ console.error(error);
67
+ }
68
+ });
69
+
70
+ req.on('error', (error) => {
71
+ console.error(error);
72
+ });
73
+
74
+ form.pipe(req);
75
+ }
76
+
77
+ async function waitForWebSocketResponse(messages) {
78
+ return new Promise(async (resolve, reject) => {
79
+ const websocketURL = `wss://wss-primary.slack.com/?token=${TOKEN}`;
80
+
81
+ const websocket = new WebSocket(websocketURL, {
82
+ headers: headers,
83
+ });
84
+
85
+ const waitForConnection = new Promise((connectionResolve) => {
86
+ websocket.on('open', () => {
87
+ console.log('Connected to WebSocket');
88
+ connectionResolve();
89
+ });
90
+ });
91
+
92
+ await waitForConnection;
93
+
94
+ let messageIndex = 0;
95
+ const sendNextPrompt = async () => {
96
+ if (messageIndex < messages.length) {
97
+ const prompt = buildPrompt(messages[messageIndex]);
98
+ await sendPromptMessage(prompt);
99
+ messageIndex++;
100
+ }
101
+ };
102
+
103
+ await sendNextPrompt();
104
+
105
+ websocket.on('message', async (message) => {
106
+ try {
107
+ const data = JSON.parse(message);
108
+ if (data.subtype === 'message_changed') {
109
+ if (!data.message.text.endsWith("_Typing…_")) {
110
+ if (messageIndex < messages.length) {
111
+ await sendNextPrompt();
112
+ } else {
113
+ websocket.close();
114
+ resolve(data.message.text);
115
+ }
116
+ } else {
117
+ //yield data.message.text;
118
+ console.log(`${currentTime()} fetched ${data.message.text.length} characters...`);
119
+ }
120
+ }
121
+ } catch (error) {
122
+ console.error('Error parsing message:', error);
123
+ reject(error);
124
+ }
125
+ });
126
+
127
+ websocket.on('error', (error) => {
128
+ console.error('WebSocket error:', error.toString());
129
+ reject(error);
130
+ });
131
+
132
+ websocket.on('close', (code, reason) => {
133
+ console.log(`WebSocket closed with code ${code} and reason: ${reason.toString()}`);
134
+ });
135
+ });
136
+ }
137
+
138
+
139
+ module.exports = {
140
+ sendPromptMessage,
141
+ sendChatReset,
142
+ waitForWebSocketResponse,
143
+ };
src/utils.js ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const FormData = require('form-data');
2
+
3
+ const { TOKEN, COOKIE, TEAM_ID, CLAUDE } = require('./config');
4
+
5
+ const wait = (duration) => {
6
+ return new Promise((resolve) => {
7
+ setTimeout(() => {
8
+ resolve();
9
+ }, duration);
10
+ });
11
+ };
12
+
13
+ function buildPrompt(messages) {
14
+ prompt = "\n\n" + preparePrompt(messages);
15
+ const escapedPrompt = prompt.replace(/\r?\n|\r/g, '\\n').replace(/"/g, '\\"');
16
+ return escapedPrompt;
17
+ };
18
+
19
+ const readBody = (res, json) => new Promise((resolve, reject) => {
20
+ let buffer = '';
21
+
22
+ res.on('data', chunk => {
23
+ buffer += chunk;
24
+ });
25
+
26
+ res.on('end', () => {
27
+ try {
28
+ if (json) buffer = JSON.parse(buffer);
29
+ resolve(buffer);
30
+ } catch (e) {
31
+ console.error(buffer);
32
+ reject(e);
33
+ }
34
+ });
35
+ })
36
+
37
+ function preparePrompt(messages) {
38
+ return messages.filter(m => m.content?.trim()).map(m => {
39
+ let author = '';
40
+ switch (m.role) {
41
+ case 'user': author = 'Human'; break;
42
+ case 'assistant': author = 'Assistant'; break;
43
+ case 'system': author = 'System Note'; break;
44
+ default: author = m.role; break;
45
+ }
46
+
47
+ return `${author}: ${m.content.trim()}`;
48
+ }).join('\n\n') + `\nAssistant: `;
49
+ }
50
+
51
+ const currentTime = () => {
52
+ const date = new Date();
53
+ const year = date.getFullYear();
54
+ const month = String(date.getMonth() + 1).padStart(2, '0');
55
+ const day = String(date.getDate()).padStart(2, '0');
56
+ const hours = String(date.getHours()).padStart(2, '0');
57
+ const minutes = String(date.getMinutes()).padStart(2, '0');
58
+ const seconds = String(date.getSeconds()).padStart(2, '0');
59
+ const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
60
+
61
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
62
+ };
63
+
64
+ const headers = {
65
+ 'Cookie': `d=${COOKIE};`,
66
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0',
67
+ }
68
+
69
+ function splitJsonArray(jsonArray, maxLength) {
70
+ let result = [];
71
+ let currentChunk = [];
72
+ let currentLength = 2; // Accounts for the opening and closing square brackets in the JSON array
73
+
74
+ jsonArray.forEach((obj) => {
75
+ const jsonString = JSON.stringify(obj);
76
+ const objLength = jsonString.length + 1; // +1 for the comma between objects
77
+
78
+ if (currentLength + objLength <= maxLength) {
79
+ currentChunk.push(obj);
80
+ currentLength += objLength;
81
+ } else {
82
+ // Store the current chunk and start a new one
83
+ result.push(currentChunk);
84
+ currentChunk = [obj];
85
+ currentLength = 2 + objLength;
86
+ }
87
+ });
88
+
89
+ if (currentChunk.length > 0) {
90
+ result.push(currentChunk);
91
+ }
92
+
93
+ return result;
94
+ }
95
+
96
+ function convertToUnixTime(date) {
97
+ const unixTime = Math.floor(date.getTime() / 1000);
98
+ const randomDigit = Math.floor(Math.random() * 10);
99
+ return `${unixTime}.xxxxx${randomDigit}`;
100
+ }
101
+
102
+ function createBaseForm() {
103
+ const form = new FormData();
104
+ form.append('token', TOKEN);
105
+ form.append('channel', `${CLAUDE}`);
106
+ form.append('_x_mode', 'online');
107
+ form.append('_x_sonic', 'true');
108
+ return form;
109
+ }
110
+
111
+ // Add the utility functions here
112
+ // e.g. escapePrompt, readBody, preparePrompt, currentTime, headers, convertToUnixTime, createBaseForm
113
+
114
+ module.exports = {
115
+ buildPrompt,
116
+ readBody,
117
+ preparePrompt,
118
+ currentTime,
119
+ headers,
120
+ convertToUnixTime,
121
+ createBaseForm,
122
+ splitJsonArray,
123
+ wait
124
+ };
yarn.lock ADDED
@@ -0,0 +1,530 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ accepts@~1.3.8:
6
+ version "1.3.8"
7
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
8
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
9
+ dependencies:
10
+ mime-types "~2.1.34"
11
+ negotiator "0.6.3"
12
+
13
+ array-flatten@1.1.1:
14
+ version "1.1.1"
15
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
16
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
17
+
18
+ asynckit@^0.4.0:
19
+ version "0.4.0"
20
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
21
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
22
+
23
+ body-parser@1.20.1:
24
+ version "1.20.1"
25
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
26
+ integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==
27
+ dependencies:
28
+ bytes "3.1.2"
29
+ content-type "~1.0.4"
30
+ debug "2.6.9"
31
+ depd "2.0.0"
32
+ destroy "1.2.0"
33
+ http-errors "2.0.0"
34
+ iconv-lite "0.4.24"
35
+ on-finished "2.4.1"
36
+ qs "6.11.0"
37
+ raw-body "2.5.1"
38
+ type-is "~1.6.18"
39
+ unpipe "1.0.0"
40
+
41
+ body-parser@^1.20.2:
42
+ version "1.20.2"
43
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
44
+ integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
45
+ dependencies:
46
+ bytes "3.1.2"
47
+ content-type "~1.0.5"
48
+ debug "2.6.9"
49
+ depd "2.0.0"
50
+ destroy "1.2.0"
51
+ http-errors "2.0.0"
52
+ iconv-lite "0.4.24"
53
+ on-finished "2.4.1"
54
+ qs "6.11.0"
55
+ raw-body "2.5.2"
56
+ type-is "~1.6.18"
57
+ unpipe "1.0.0"
58
+
59
+ bytes@3.1.2:
60
+ version "3.1.2"
61
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
62
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
63
+
64
+ call-bind@^1.0.0:
65
+ version "1.0.2"
66
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
67
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
68
+ dependencies:
69
+ function-bind "^1.1.1"
70
+ get-intrinsic "^1.0.2"
71
+
72
+ combined-stream@^1.0.8:
73
+ version "1.0.8"
74
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
75
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
76
+ dependencies:
77
+ delayed-stream "~1.0.0"
78
+
79
+ content-disposition@0.5.4:
80
+ version "0.5.4"
81
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
82
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
83
+ dependencies:
84
+ safe-buffer "5.2.1"
85
+
86
+ content-type@~1.0.4, content-type@~1.0.5:
87
+ version "1.0.5"
88
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
89
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
90
+
91
+ cookie-parser@^1.4.4:
92
+ version "1.4.6"
93
+ resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594"
94
+ integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==
95
+ dependencies:
96
+ cookie "0.4.1"
97
+ cookie-signature "1.0.6"
98
+
99
+ cookie-signature@1.0.6:
100
+ version "1.0.6"
101
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
102
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
103
+
104
+ cookie@0.4.1:
105
+ version "0.4.1"
106
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
107
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
108
+
109
+ cookie@0.5.0:
110
+ version "0.5.0"
111
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
112
+ integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
113
+
114
+ cookie@^0.3.1:
115
+ version "0.3.1"
116
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
117
+ integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==
118
+
119
+ debug@2.6.9:
120
+ version "2.6.9"
121
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
122
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
123
+ dependencies:
124
+ ms "2.0.0"
125
+
126
+ delayed-stream@~1.0.0:
127
+ version "1.0.0"
128
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
129
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
130
+
131
+ depd@2.0.0:
132
+ version "2.0.0"
133
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
134
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
135
+
136
+ destroy@1.2.0:
137
+ version "1.2.0"
138
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
139
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
140
+
141
+ dotenv@^16.0.3:
142
+ version "16.0.3"
143
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07"
144
+ integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==
145
+
146
+ ee-first@1.1.1:
147
+ version "1.1.1"
148
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
149
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
150
+
151
+ encodeurl@~1.0.2:
152
+ version "1.0.2"
153
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
154
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
155
+
156
+ escape-html@~1.0.3:
157
+ version "1.0.3"
158
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
159
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
160
+
161
+ etag@~1.8.1:
162
+ version "1.8.1"
163
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
164
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
165
+
166
+ express-bearer-token@^2.4.0:
167
+ version "2.4.0"
168
+ resolved "https://registry.yarnpkg.com/express-bearer-token/-/express-bearer-token-2.4.0.tgz#f4d9d5a1e318953445e7f0d2bde00bb96d21c95a"
169
+ integrity sha512-2+kRZT2xo+pmmvSY7Ma5FzxTJpO3kGaPCEXPbAm3GaoZ/z6FE4K6L7cvs1AUZwY2xkk15PcQw7t4dWjsl5rdJw==
170
+ dependencies:
171
+ cookie "^0.3.1"
172
+ cookie-parser "^1.4.4"
173
+
174
+ express@^4.18.2:
175
+ version "4.18.2"
176
+ resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
177
+ integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
178
+ dependencies:
179
+ accepts "~1.3.8"
180
+ array-flatten "1.1.1"
181
+ body-parser "1.20.1"
182
+ content-disposition "0.5.4"
183
+ content-type "~1.0.4"
184
+ cookie "0.5.0"
185
+ cookie-signature "1.0.6"
186
+ debug "2.6.9"
187
+ depd "2.0.0"
188
+ encodeurl "~1.0.2"
189
+ escape-html "~1.0.3"
190
+ etag "~1.8.1"
191
+ finalhandler "1.2.0"
192
+ fresh "0.5.2"
193
+ http-errors "2.0.0"
194
+ merge-descriptors "1.0.1"
195
+ methods "~1.1.2"
196
+ on-finished "2.4.1"
197
+ parseurl "~1.3.3"
198
+ path-to-regexp "0.1.7"
199
+ proxy-addr "~2.0.7"
200
+ qs "6.11.0"
201
+ range-parser "~1.2.1"
202
+ safe-buffer "5.2.1"
203
+ send "0.18.0"
204
+ serve-static "1.15.0"
205
+ setprototypeof "1.2.0"
206
+ statuses "2.0.1"
207
+ type-is "~1.6.18"
208
+ utils-merge "1.0.1"
209
+ vary "~1.1.2"
210
+
211
+ finalhandler@1.2.0:
212
+ version "1.2.0"
213
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
214
+ integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
215
+ dependencies:
216
+ debug "2.6.9"
217
+ encodeurl "~1.0.2"
218
+ escape-html "~1.0.3"
219
+ on-finished "2.4.1"
220
+ parseurl "~1.3.3"
221
+ statuses "2.0.1"
222
+ unpipe "~1.0.0"
223
+
224
+ form-data@^4.0.0:
225
+ version "4.0.0"
226
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
227
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
228
+ dependencies:
229
+ asynckit "^0.4.0"
230
+ combined-stream "^1.0.8"
231
+ mime-types "^2.1.12"
232
+
233
+ forwarded@0.2.0:
234
+ version "0.2.0"
235
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
236
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
237
+
238
+ fresh@0.5.2:
239
+ version "0.5.2"
240
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
241
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
242
+
243
+ function-bind@^1.1.1:
244
+ version "1.1.1"
245
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
246
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
247
+
248
+ get-intrinsic@^1.0.2:
249
+ version "1.2.0"
250
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f"
251
+ integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==
252
+ dependencies:
253
+ function-bind "^1.1.1"
254
+ has "^1.0.3"
255
+ has-symbols "^1.0.3"
256
+
257
+ has-symbols@^1.0.3:
258
+ version "1.0.3"
259
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
260
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
261
+
262
+ has@^1.0.3:
263
+ version "1.0.3"
264
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
265
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
266
+ dependencies:
267
+ function-bind "^1.1.1"
268
+
269
+ http-errors@2.0.0:
270
+ version "2.0.0"
271
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
272
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
273
+ dependencies:
274
+ depd "2.0.0"
275
+ inherits "2.0.4"
276
+ setprototypeof "1.2.0"
277
+ statuses "2.0.1"
278
+ toidentifier "1.0.1"
279
+
280
+ iconv-lite@0.4.24:
281
+ version "0.4.24"
282
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
283
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
284
+ dependencies:
285
+ safer-buffer ">= 2.1.2 < 3"
286
+
287
+ inherits@2.0.4:
288
+ version "2.0.4"
289
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
290
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
291
+
292
+ ipaddr.js@1.9.1:
293
+ version "1.9.1"
294
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
295
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
296
+
297
+ media-typer@0.3.0:
298
+ version "0.3.0"
299
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
300
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
301
+
302
+ merge-descriptors@1.0.1:
303
+ version "1.0.1"
304
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
305
+ integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
306
+
307
+ methods@~1.1.2:
308
+ version "1.1.2"
309
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
310
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
311
+
312
+ mime-db@1.52.0:
313
+ version "1.52.0"
314
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
315
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
316
+
317
+ mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34:
318
+ version "2.1.35"
319
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
320
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
321
+ dependencies:
322
+ mime-db "1.52.0"
323
+
324
+ mime@1.6.0:
325
+ version "1.6.0"
326
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
327
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
328
+
329
+ ms@2.0.0:
330
+ version "2.0.0"
331
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
332
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
333
+
334
+ ms@2.1.3:
335
+ version "2.1.3"
336
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
337
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
338
+
339
+ negotiator@0.6.3:
340
+ version "0.6.3"
341
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
342
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
343
+
344
+ object-inspect@^1.9.0:
345
+ version "1.12.3"
346
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
347
+ integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
348
+
349
+ on-finished@2.4.1:
350
+ version "2.4.1"
351
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
352
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
353
+ dependencies:
354
+ ee-first "1.1.1"
355
+
356
+ parseurl@~1.3.3:
357
+ version "1.3.3"
358
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
359
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
360
+
361
+ path-to-regexp@0.1.7:
362
+ version "0.1.7"
363
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
364
+ integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
365
+
366
+ property-expr@^2.0.5:
367
+ version "2.0.5"
368
+ resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4"
369
+ integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==
370
+
371
+ proxy-addr@~2.0.7:
372
+ version "2.0.7"
373
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
374
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
375
+ dependencies:
376
+ forwarded "0.2.0"
377
+ ipaddr.js "1.9.1"
378
+
379
+ qs@6.11.0:
380
+ version "6.11.0"
381
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
382
+ integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
383
+ dependencies:
384
+ side-channel "^1.0.4"
385
+
386
+ range-parser@~1.2.1:
387
+ version "1.2.1"
388
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
389
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
390
+
391
+ raw-body@2.5.1:
392
+ version "2.5.1"
393
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
394
+ integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
395
+ dependencies:
396
+ bytes "3.1.2"
397
+ http-errors "2.0.0"
398
+ iconv-lite "0.4.24"
399
+ unpipe "1.0.0"
400
+
401
+ raw-body@2.5.2:
402
+ version "2.5.2"
403
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
404
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
405
+ dependencies:
406
+ bytes "3.1.2"
407
+ http-errors "2.0.0"
408
+ iconv-lite "0.4.24"
409
+ unpipe "1.0.0"
410
+
411
+ safe-buffer@5.2.1:
412
+ version "5.2.1"
413
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
414
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
415
+
416
+ "safer-buffer@>= 2.1.2 < 3":
417
+ version "2.1.2"
418
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
419
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
420
+
421
+ send@0.18.0:
422
+ version "0.18.0"
423
+ resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
424
+ integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
425
+ dependencies:
426
+ debug "2.6.9"
427
+ depd "2.0.0"
428
+ destroy "1.2.0"
429
+ encodeurl "~1.0.2"
430
+ escape-html "~1.0.3"
431
+ etag "~1.8.1"
432
+ fresh "0.5.2"
433
+ http-errors "2.0.0"
434
+ mime "1.6.0"
435
+ ms "2.1.3"
436
+ on-finished "2.4.1"
437
+ range-parser "~1.2.1"
438
+ statuses "2.0.1"
439
+
440
+ serve-static@1.15.0:
441
+ version "1.15.0"
442
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
443
+ integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
444
+ dependencies:
445
+ encodeurl "~1.0.2"
446
+ escape-html "~1.0.3"
447
+ parseurl "~1.3.3"
448
+ send "0.18.0"
449
+
450
+ setprototypeof@1.2.0:
451
+ version "1.2.0"
452
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
453
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
454
+
455
+ side-channel@^1.0.4:
456
+ version "1.0.4"
457
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
458
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
459
+ dependencies:
460
+ call-bind "^1.0.0"
461
+ get-intrinsic "^1.0.2"
462
+ object-inspect "^1.9.0"
463
+
464
+ statuses@2.0.1:
465
+ version "2.0.1"
466
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
467
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
468
+
469
+ tiny-case@^1.0.3:
470
+ version "1.0.3"
471
+ resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03"
472
+ integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==
473
+
474
+ toidentifier@1.0.1:
475
+ version "1.0.1"
476
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
477
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
478
+
479
+ toposort@^2.0.2:
480
+ version "2.0.2"
481
+ resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
482
+ integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==
483
+
484
+ type-fest@^2.19.0:
485
+ version "2.19.0"
486
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b"
487
+ integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==
488
+
489
+ type-is@~1.6.18:
490
+ version "1.6.18"
491
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
492
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
493
+ dependencies:
494
+ media-typer "0.3.0"
495
+ mime-types "~2.1.24"
496
+
497
+ unpipe@1.0.0, unpipe@~1.0.0:
498
+ version "1.0.0"
499
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
500
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
501
+
502
+ utils-merge@1.0.1:
503
+ version "1.0.1"
504
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
505
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
506
+
507
+ uuid@^9.0.0:
508
+ version "9.0.0"
509
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
510
+ integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
511
+
512
+ vary@~1.1.2:
513
+ version "1.1.2"
514
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
515
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
516
+
517
+ ws@^8.13.0:
518
+ version "8.13.0"
519
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
520
+ integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
521
+
522
+ yup@^1.1.1:
523
+ version "1.1.1"
524
+ resolved "https://registry.yarnpkg.com/yup/-/yup-1.1.1.tgz#49dbcf5ae7693ed0a36ed08a9e9de0a09ac18e6b"
525
+ integrity sha512-KfCGHdAErqFZWA5tZf7upSUnGKuTOnsI3hUsLr7fgVtx+DK04NPV01A68/FslI4t3s/ZWpvXJmgXhd7q6ICnag==
526
+ dependencies:
527
+ property-expr "^2.0.5"
528
+ tiny-case "^1.0.3"
529
+ toposort "^2.0.2"
530
+ type-fest "^2.19.0"