Ig0tU commited on
Commit
9cd8722
·
1 Parent(s): 6514f7b

Deploy WallAPI: Express server, Google Sheets API, and Socket.IO

Browse files
Files changed (8) hide show
  1. Dockerfile +18 -0
  2. credentials.json +13 -0
  3. package-lock.json +1877 -0
  4. package.json +21 -0
  5. public/dashboard.html +202 -0
  6. public/embed.js +183 -0
  7. public/index.html +49 -0
  8. server.js +128 -0
Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:18-slim
2
+
3
+ # Create app directory
4
+ WORKDIR /app
5
+
6
+ # Install app dependencies
7
+ COPY package*.json ./
8
+ RUN npm install
9
+
10
+ # Bundle app source
11
+ COPY . .
12
+
13
+ # Hugging Face Spaces exposes port 7860
14
+ ENV PORT=7860
15
+ EXPOSE 7860
16
+
17
+ # Run the server
18
+ CMD [ "node", "server.js" ]
credentials.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "type": "service_account",
3
+ "project_id": "gen-lang-client-0963727327",
4
+ "private_key_id": "9bd1ab7c0de460b7e1e99f7cbb9ee0423f0581e6",
5
+ "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9vhCyLjXvka79\n4siXVml6tRMBjKu686XPjcZpj9DplKu4nuJbnkW9HbdKxz2qaA3K2/0Eb5+vV86U\ngK/QxArvJ3SwbF3Uoo8S6YOgtZ4/WZLKthIEN0o8t6emqifPbDydsvJ88hNmm7r0\n7Jy2+xCdQhnbkNnfPLBjEornTc86Pqq3lDh24XE8YK8bPB1gpsiOMKh6rzBV80qM\noPSYwkNttdvoEdMSVEr6bvWUtt7XJiXitR/ZZbs2oPl3jeVDZzxRPb4TTrPpvWRK\nXAXq8ktkj8ZiReapgahEcse3h49rAxU8Z93YBVdMKrNf3TxlL+VAuUafVknVBdg5\nCYd0vqgNAgMBAAECggEAAbYDFER1nrwvpyzp9SYj/YPvtBIOzGFHLwwVed7Kkz6J\n4cXdpDSl4BSDYyrlQHxC7rxx/+6wK8+8+BI3bBKyLIul4UfQCl+WronK5UDPseVx\nRyK7VH2c72u0Oqiy7tWPAMtBETYoddbOCAUcaFkN6toqFV60CzMc38JcLYIMZ2nN\nG/5OOCgopdX3pEjKLZqdp1pKCB1m4+Tkf+MXJigCnUqVtcOtaDMq4LjMxj1uwM4l\nQXd1fanQU4dEdPzCrgjNe0pFEfnCYsMSByMAw8ny99J4GTyYCRQaQxmf27rHWX31\n4XSDwQoUgI3KueqpAhchYujwGqy5nN10To3guNWccQKBgQDtBD889ltKvdx5vHts\n0Jfhhm1zzUYwKpsZqNJoR521MkdJZ5/scrrgFiOQ+TEmBkq2dKoO185kWf6saKeE\nuWdmbnEIuRC1hm1yS/NcDW9u66/Z02VS88ZOkPkzVxtfdLfrJzA5qQbji2kRKFoO\n0W56CrcdMUpNyFDdIp6txfmRBQKBgQDM8IQeYNFQAJqeS/NGQDa2TKbqohiqbivw\nNodXmeIAbYDyoZYuCbJq1kx0bJpwG+YXGmFJ0HPVi5C3wwKQcAzV4UQK5CAVk6pX\n+cpAk+/a6xdiER0a0pe9Iae+OCJaLsrWb2v9HGebRjKbffFI6EqrELSU6cWX17cs\nw18RpHUJaQKBgBCU8HuqXJ6xA8C8kAH/4fBUQEoOvW9XO7yi0/2ZrQ3lM5mOF2Eq\ncaqFwf09gdPAMu/q347kSDs7FJcpRzcA5ZwD9AKBOAsLGZMafy8cfYRMFuRtZrRT\n+7a5a8XMvUyDVO6tsjEGg0XeFf6uTQamXk1JfKAdN66TahzedC2CIUClAoGBAL0e\nnu1hrwbC5+x4bjFABL1KEyanG1f7fzSXPWJLsVFvu/UrxGkLrcgFplwx9HrMZBKh\n13HEmYBQ4OWTYgRkQpQE40OhrTH8KNAyxL+/RTKii9uFq3QbLsfsDN3u81SBpdEo\n1WCoG7wglYcEO+tp4a3nJp3c9OjgujrmuA6R0ycxAoGAU9KF9GfAJDXKMjXBQiH+\n6ch1awgNF8jQ+fmvp5Va62FgdK9aMSQTnJJDVMYg6nTg2cvhbTL1rXr/bYjWHglV\nJx0SIzUAJjMRoOLxeG9bbX3JAUcuxcRdN97f0JTTpG9y2FoxwwLuTPeG7GhAUi60\njNfEUUkqWEFAjnjK8eujifU=\n-----END PRIVATE KEY-----\n",
6
+ "client_email": "wall-form-api@gen-lang-client-0963727327.iam.gserviceaccount.com",
7
+ "client_id": "101446101542617249984",
8
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
9
+ "token_uri": "https://oauth2.googleapis.com/token",
10
+ "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
11
+ "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/wall-form-api%40gen-lang-client-0963727327.iam.gserviceaccount.com",
12
+ "universe_domain": "googleapis.com"
13
+ }
package-lock.json ADDED
@@ -0,0 +1,1877 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "wallapi",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "wallapi",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "body-parser": "^2.2.2",
13
+ "cors": "^2.8.6",
14
+ "dotenv": "^17.3.1",
15
+ "express": "^5.2.1",
16
+ "googleapis": "^171.4.0",
17
+ "socket.io": "^4.8.3"
18
+ }
19
+ },
20
+ "node_modules/@isaacs/cliui": {
21
+ "version": "8.0.2",
22
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
23
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
24
+ "license": "ISC",
25
+ "dependencies": {
26
+ "string-width": "^5.1.2",
27
+ "string-width-cjs": "npm:string-width@^4.2.0",
28
+ "strip-ansi": "^7.0.1",
29
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
30
+ "wrap-ansi": "^8.1.0",
31
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
32
+ },
33
+ "engines": {
34
+ "node": ">=12"
35
+ }
36
+ },
37
+ "node_modules/@pkgjs/parseargs": {
38
+ "version": "0.11.0",
39
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
40
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
41
+ "license": "MIT",
42
+ "optional": true,
43
+ "engines": {
44
+ "node": ">=14"
45
+ }
46
+ },
47
+ "node_modules/@socket.io/component-emitter": {
48
+ "version": "3.1.2",
49
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
50
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
51
+ "license": "MIT"
52
+ },
53
+ "node_modules/@types/cors": {
54
+ "version": "2.8.19",
55
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
56
+ "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==",
57
+ "license": "MIT",
58
+ "dependencies": {
59
+ "@types/node": "*"
60
+ }
61
+ },
62
+ "node_modules/@types/node": {
63
+ "version": "25.3.5",
64
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.5.tgz",
65
+ "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==",
66
+ "license": "MIT",
67
+ "dependencies": {
68
+ "undici-types": "~7.18.0"
69
+ }
70
+ },
71
+ "node_modules/accepts": {
72
+ "version": "2.0.0",
73
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
74
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
75
+ "license": "MIT",
76
+ "dependencies": {
77
+ "mime-types": "^3.0.0",
78
+ "negotiator": "^1.0.0"
79
+ },
80
+ "engines": {
81
+ "node": ">= 0.6"
82
+ }
83
+ },
84
+ "node_modules/agent-base": {
85
+ "version": "7.1.4",
86
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
87
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
88
+ "license": "MIT",
89
+ "engines": {
90
+ "node": ">= 14"
91
+ }
92
+ },
93
+ "node_modules/ansi-regex": {
94
+ "version": "6.2.2",
95
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
96
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
97
+ "license": "MIT",
98
+ "engines": {
99
+ "node": ">=12"
100
+ },
101
+ "funding": {
102
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
103
+ }
104
+ },
105
+ "node_modules/ansi-styles": {
106
+ "version": "6.2.3",
107
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
108
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
109
+ "license": "MIT",
110
+ "engines": {
111
+ "node": ">=12"
112
+ },
113
+ "funding": {
114
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
115
+ }
116
+ },
117
+ "node_modules/balanced-match": {
118
+ "version": "1.0.2",
119
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
120
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
121
+ "license": "MIT"
122
+ },
123
+ "node_modules/base64-js": {
124
+ "version": "1.5.1",
125
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
126
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
127
+ "funding": [
128
+ {
129
+ "type": "github",
130
+ "url": "https://github.com/sponsors/feross"
131
+ },
132
+ {
133
+ "type": "patreon",
134
+ "url": "https://www.patreon.com/feross"
135
+ },
136
+ {
137
+ "type": "consulting",
138
+ "url": "https://feross.org/support"
139
+ }
140
+ ],
141
+ "license": "MIT"
142
+ },
143
+ "node_modules/base64id": {
144
+ "version": "2.0.0",
145
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
146
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
147
+ "license": "MIT",
148
+ "engines": {
149
+ "node": "^4.5.0 || >= 5.9"
150
+ }
151
+ },
152
+ "node_modules/bignumber.js": {
153
+ "version": "9.3.1",
154
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
155
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
156
+ "license": "MIT",
157
+ "engines": {
158
+ "node": "*"
159
+ }
160
+ },
161
+ "node_modules/body-parser": {
162
+ "version": "2.2.2",
163
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
164
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
165
+ "license": "MIT",
166
+ "dependencies": {
167
+ "bytes": "^3.1.2",
168
+ "content-type": "^1.0.5",
169
+ "debug": "^4.4.3",
170
+ "http-errors": "^2.0.0",
171
+ "iconv-lite": "^0.7.0",
172
+ "on-finished": "^2.4.1",
173
+ "qs": "^6.14.1",
174
+ "raw-body": "^3.0.1",
175
+ "type-is": "^2.0.1"
176
+ },
177
+ "engines": {
178
+ "node": ">=18"
179
+ },
180
+ "funding": {
181
+ "type": "opencollective",
182
+ "url": "https://opencollective.com/express"
183
+ }
184
+ },
185
+ "node_modules/brace-expansion": {
186
+ "version": "2.0.2",
187
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
188
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
189
+ "license": "MIT",
190
+ "dependencies": {
191
+ "balanced-match": "^1.0.0"
192
+ }
193
+ },
194
+ "node_modules/buffer-equal-constant-time": {
195
+ "version": "1.0.1",
196
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
197
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
198
+ "license": "BSD-3-Clause"
199
+ },
200
+ "node_modules/bytes": {
201
+ "version": "3.1.2",
202
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
203
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
204
+ "license": "MIT",
205
+ "engines": {
206
+ "node": ">= 0.8"
207
+ }
208
+ },
209
+ "node_modules/call-bind-apply-helpers": {
210
+ "version": "1.0.2",
211
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
212
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
213
+ "license": "MIT",
214
+ "dependencies": {
215
+ "es-errors": "^1.3.0",
216
+ "function-bind": "^1.1.2"
217
+ },
218
+ "engines": {
219
+ "node": ">= 0.4"
220
+ }
221
+ },
222
+ "node_modules/call-bound": {
223
+ "version": "1.0.4",
224
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
225
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
226
+ "license": "MIT",
227
+ "dependencies": {
228
+ "call-bind-apply-helpers": "^1.0.2",
229
+ "get-intrinsic": "^1.3.0"
230
+ },
231
+ "engines": {
232
+ "node": ">= 0.4"
233
+ },
234
+ "funding": {
235
+ "url": "https://github.com/sponsors/ljharb"
236
+ }
237
+ },
238
+ "node_modules/color-convert": {
239
+ "version": "2.0.1",
240
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
241
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
242
+ "license": "MIT",
243
+ "dependencies": {
244
+ "color-name": "~1.1.4"
245
+ },
246
+ "engines": {
247
+ "node": ">=7.0.0"
248
+ }
249
+ },
250
+ "node_modules/color-name": {
251
+ "version": "1.1.4",
252
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
253
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
254
+ "license": "MIT"
255
+ },
256
+ "node_modules/content-disposition": {
257
+ "version": "1.0.1",
258
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
259
+ "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
260
+ "license": "MIT",
261
+ "engines": {
262
+ "node": ">=18"
263
+ },
264
+ "funding": {
265
+ "type": "opencollective",
266
+ "url": "https://opencollective.com/express"
267
+ }
268
+ },
269
+ "node_modules/content-type": {
270
+ "version": "1.0.5",
271
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
272
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
273
+ "license": "MIT",
274
+ "engines": {
275
+ "node": ">= 0.6"
276
+ }
277
+ },
278
+ "node_modules/cookie": {
279
+ "version": "0.7.2",
280
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
281
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
282
+ "license": "MIT",
283
+ "engines": {
284
+ "node": ">= 0.6"
285
+ }
286
+ },
287
+ "node_modules/cookie-signature": {
288
+ "version": "1.2.2",
289
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
290
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
291
+ "license": "MIT",
292
+ "engines": {
293
+ "node": ">=6.6.0"
294
+ }
295
+ },
296
+ "node_modules/cors": {
297
+ "version": "2.8.6",
298
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
299
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
300
+ "license": "MIT",
301
+ "dependencies": {
302
+ "object-assign": "^4",
303
+ "vary": "^1"
304
+ },
305
+ "engines": {
306
+ "node": ">= 0.10"
307
+ },
308
+ "funding": {
309
+ "type": "opencollective",
310
+ "url": "https://opencollective.com/express"
311
+ }
312
+ },
313
+ "node_modules/cross-spawn": {
314
+ "version": "7.0.6",
315
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
316
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
317
+ "license": "MIT",
318
+ "dependencies": {
319
+ "path-key": "^3.1.0",
320
+ "shebang-command": "^2.0.0",
321
+ "which": "^2.0.1"
322
+ },
323
+ "engines": {
324
+ "node": ">= 8"
325
+ }
326
+ },
327
+ "node_modules/data-uri-to-buffer": {
328
+ "version": "4.0.1",
329
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
330
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
331
+ "license": "MIT",
332
+ "engines": {
333
+ "node": ">= 12"
334
+ }
335
+ },
336
+ "node_modules/debug": {
337
+ "version": "4.4.3",
338
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
339
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
340
+ "license": "MIT",
341
+ "dependencies": {
342
+ "ms": "^2.1.3"
343
+ },
344
+ "engines": {
345
+ "node": ">=6.0"
346
+ },
347
+ "peerDependenciesMeta": {
348
+ "supports-color": {
349
+ "optional": true
350
+ }
351
+ }
352
+ },
353
+ "node_modules/depd": {
354
+ "version": "2.0.0",
355
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
356
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
357
+ "license": "MIT",
358
+ "engines": {
359
+ "node": ">= 0.8"
360
+ }
361
+ },
362
+ "node_modules/dotenv": {
363
+ "version": "17.3.1",
364
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz",
365
+ "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==",
366
+ "license": "BSD-2-Clause",
367
+ "engines": {
368
+ "node": ">=12"
369
+ },
370
+ "funding": {
371
+ "url": "https://dotenvx.com"
372
+ }
373
+ },
374
+ "node_modules/dunder-proto": {
375
+ "version": "1.0.1",
376
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
377
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
378
+ "license": "MIT",
379
+ "dependencies": {
380
+ "call-bind-apply-helpers": "^1.0.1",
381
+ "es-errors": "^1.3.0",
382
+ "gopd": "^1.2.0"
383
+ },
384
+ "engines": {
385
+ "node": ">= 0.4"
386
+ }
387
+ },
388
+ "node_modules/eastasianwidth": {
389
+ "version": "0.2.0",
390
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
391
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
392
+ "license": "MIT"
393
+ },
394
+ "node_modules/ecdsa-sig-formatter": {
395
+ "version": "1.0.11",
396
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
397
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
398
+ "license": "Apache-2.0",
399
+ "dependencies": {
400
+ "safe-buffer": "^5.0.1"
401
+ }
402
+ },
403
+ "node_modules/ee-first": {
404
+ "version": "1.1.1",
405
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
406
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
407
+ "license": "MIT"
408
+ },
409
+ "node_modules/emoji-regex": {
410
+ "version": "9.2.2",
411
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
412
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
413
+ "license": "MIT"
414
+ },
415
+ "node_modules/encodeurl": {
416
+ "version": "2.0.0",
417
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
418
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
419
+ "license": "MIT",
420
+ "engines": {
421
+ "node": ">= 0.8"
422
+ }
423
+ },
424
+ "node_modules/engine.io": {
425
+ "version": "6.6.5",
426
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz",
427
+ "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==",
428
+ "license": "MIT",
429
+ "dependencies": {
430
+ "@types/cors": "^2.8.12",
431
+ "@types/node": ">=10.0.0",
432
+ "accepts": "~1.3.4",
433
+ "base64id": "2.0.0",
434
+ "cookie": "~0.7.2",
435
+ "cors": "~2.8.5",
436
+ "debug": "~4.4.1",
437
+ "engine.io-parser": "~5.2.1",
438
+ "ws": "~8.18.3"
439
+ },
440
+ "engines": {
441
+ "node": ">=10.2.0"
442
+ }
443
+ },
444
+ "node_modules/engine.io-parser": {
445
+ "version": "5.2.3",
446
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
447
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
448
+ "license": "MIT",
449
+ "engines": {
450
+ "node": ">=10.0.0"
451
+ }
452
+ },
453
+ "node_modules/engine.io/node_modules/accepts": {
454
+ "version": "1.3.8",
455
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
456
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
457
+ "license": "MIT",
458
+ "dependencies": {
459
+ "mime-types": "~2.1.34",
460
+ "negotiator": "0.6.3"
461
+ },
462
+ "engines": {
463
+ "node": ">= 0.6"
464
+ }
465
+ },
466
+ "node_modules/engine.io/node_modules/mime-db": {
467
+ "version": "1.52.0",
468
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
469
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
470
+ "license": "MIT",
471
+ "engines": {
472
+ "node": ">= 0.6"
473
+ }
474
+ },
475
+ "node_modules/engine.io/node_modules/mime-types": {
476
+ "version": "2.1.35",
477
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
478
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
479
+ "license": "MIT",
480
+ "dependencies": {
481
+ "mime-db": "1.52.0"
482
+ },
483
+ "engines": {
484
+ "node": ">= 0.6"
485
+ }
486
+ },
487
+ "node_modules/engine.io/node_modules/negotiator": {
488
+ "version": "0.6.3",
489
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
490
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
491
+ "license": "MIT",
492
+ "engines": {
493
+ "node": ">= 0.6"
494
+ }
495
+ },
496
+ "node_modules/es-define-property": {
497
+ "version": "1.0.1",
498
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
499
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
500
+ "license": "MIT",
501
+ "engines": {
502
+ "node": ">= 0.4"
503
+ }
504
+ },
505
+ "node_modules/es-errors": {
506
+ "version": "1.3.0",
507
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
508
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
509
+ "license": "MIT",
510
+ "engines": {
511
+ "node": ">= 0.4"
512
+ }
513
+ },
514
+ "node_modules/es-object-atoms": {
515
+ "version": "1.1.1",
516
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
517
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
518
+ "license": "MIT",
519
+ "dependencies": {
520
+ "es-errors": "^1.3.0"
521
+ },
522
+ "engines": {
523
+ "node": ">= 0.4"
524
+ }
525
+ },
526
+ "node_modules/escape-html": {
527
+ "version": "1.0.3",
528
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
529
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
530
+ "license": "MIT"
531
+ },
532
+ "node_modules/etag": {
533
+ "version": "1.8.1",
534
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
535
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
536
+ "license": "MIT",
537
+ "engines": {
538
+ "node": ">= 0.6"
539
+ }
540
+ },
541
+ "node_modules/express": {
542
+ "version": "5.2.1",
543
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
544
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
545
+ "license": "MIT",
546
+ "dependencies": {
547
+ "accepts": "^2.0.0",
548
+ "body-parser": "^2.2.1",
549
+ "content-disposition": "^1.0.0",
550
+ "content-type": "^1.0.5",
551
+ "cookie": "^0.7.1",
552
+ "cookie-signature": "^1.2.1",
553
+ "debug": "^4.4.0",
554
+ "depd": "^2.0.0",
555
+ "encodeurl": "^2.0.0",
556
+ "escape-html": "^1.0.3",
557
+ "etag": "^1.8.1",
558
+ "finalhandler": "^2.1.0",
559
+ "fresh": "^2.0.0",
560
+ "http-errors": "^2.0.0",
561
+ "merge-descriptors": "^2.0.0",
562
+ "mime-types": "^3.0.0",
563
+ "on-finished": "^2.4.1",
564
+ "once": "^1.4.0",
565
+ "parseurl": "^1.3.3",
566
+ "proxy-addr": "^2.0.7",
567
+ "qs": "^6.14.0",
568
+ "range-parser": "^1.2.1",
569
+ "router": "^2.2.0",
570
+ "send": "^1.1.0",
571
+ "serve-static": "^2.2.0",
572
+ "statuses": "^2.0.1",
573
+ "type-is": "^2.0.1",
574
+ "vary": "^1.1.2"
575
+ },
576
+ "engines": {
577
+ "node": ">= 18"
578
+ },
579
+ "funding": {
580
+ "type": "opencollective",
581
+ "url": "https://opencollective.com/express"
582
+ }
583
+ },
584
+ "node_modules/extend": {
585
+ "version": "3.0.2",
586
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
587
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
588
+ "license": "MIT"
589
+ },
590
+ "node_modules/fetch-blob": {
591
+ "version": "3.2.0",
592
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
593
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
594
+ "funding": [
595
+ {
596
+ "type": "github",
597
+ "url": "https://github.com/sponsors/jimmywarting"
598
+ },
599
+ {
600
+ "type": "paypal",
601
+ "url": "https://paypal.me/jimmywarting"
602
+ }
603
+ ],
604
+ "license": "MIT",
605
+ "dependencies": {
606
+ "node-domexception": "^1.0.0",
607
+ "web-streams-polyfill": "^3.0.3"
608
+ },
609
+ "engines": {
610
+ "node": "^12.20 || >= 14.13"
611
+ }
612
+ },
613
+ "node_modules/finalhandler": {
614
+ "version": "2.1.1",
615
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
616
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
617
+ "license": "MIT",
618
+ "dependencies": {
619
+ "debug": "^4.4.0",
620
+ "encodeurl": "^2.0.0",
621
+ "escape-html": "^1.0.3",
622
+ "on-finished": "^2.4.1",
623
+ "parseurl": "^1.3.3",
624
+ "statuses": "^2.0.1"
625
+ },
626
+ "engines": {
627
+ "node": ">= 18.0.0"
628
+ },
629
+ "funding": {
630
+ "type": "opencollective",
631
+ "url": "https://opencollective.com/express"
632
+ }
633
+ },
634
+ "node_modules/foreground-child": {
635
+ "version": "3.3.1",
636
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
637
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
638
+ "license": "ISC",
639
+ "dependencies": {
640
+ "cross-spawn": "^7.0.6",
641
+ "signal-exit": "^4.0.1"
642
+ },
643
+ "engines": {
644
+ "node": ">=14"
645
+ },
646
+ "funding": {
647
+ "url": "https://github.com/sponsors/isaacs"
648
+ }
649
+ },
650
+ "node_modules/formdata-polyfill": {
651
+ "version": "4.0.10",
652
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
653
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
654
+ "license": "MIT",
655
+ "dependencies": {
656
+ "fetch-blob": "^3.1.2"
657
+ },
658
+ "engines": {
659
+ "node": ">=12.20.0"
660
+ }
661
+ },
662
+ "node_modules/forwarded": {
663
+ "version": "0.2.0",
664
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
665
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
666
+ "license": "MIT",
667
+ "engines": {
668
+ "node": ">= 0.6"
669
+ }
670
+ },
671
+ "node_modules/fresh": {
672
+ "version": "2.0.0",
673
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
674
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
675
+ "license": "MIT",
676
+ "engines": {
677
+ "node": ">= 0.8"
678
+ }
679
+ },
680
+ "node_modules/function-bind": {
681
+ "version": "1.1.2",
682
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
683
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
684
+ "license": "MIT",
685
+ "funding": {
686
+ "url": "https://github.com/sponsors/ljharb"
687
+ }
688
+ },
689
+ "node_modules/gaxios": {
690
+ "version": "7.1.3",
691
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz",
692
+ "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==",
693
+ "license": "Apache-2.0",
694
+ "dependencies": {
695
+ "extend": "^3.0.2",
696
+ "https-proxy-agent": "^7.0.1",
697
+ "node-fetch": "^3.3.2",
698
+ "rimraf": "^5.0.1"
699
+ },
700
+ "engines": {
701
+ "node": ">=18"
702
+ }
703
+ },
704
+ "node_modules/gcp-metadata": {
705
+ "version": "8.1.2",
706
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
707
+ "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
708
+ "license": "Apache-2.0",
709
+ "dependencies": {
710
+ "gaxios": "^7.0.0",
711
+ "google-logging-utils": "^1.0.0",
712
+ "json-bigint": "^1.0.0"
713
+ },
714
+ "engines": {
715
+ "node": ">=18"
716
+ }
717
+ },
718
+ "node_modules/get-intrinsic": {
719
+ "version": "1.3.0",
720
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
721
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
722
+ "license": "MIT",
723
+ "dependencies": {
724
+ "call-bind-apply-helpers": "^1.0.2",
725
+ "es-define-property": "^1.0.1",
726
+ "es-errors": "^1.3.0",
727
+ "es-object-atoms": "^1.1.1",
728
+ "function-bind": "^1.1.2",
729
+ "get-proto": "^1.0.1",
730
+ "gopd": "^1.2.0",
731
+ "has-symbols": "^1.1.0",
732
+ "hasown": "^2.0.2",
733
+ "math-intrinsics": "^1.1.0"
734
+ },
735
+ "engines": {
736
+ "node": ">= 0.4"
737
+ },
738
+ "funding": {
739
+ "url": "https://github.com/sponsors/ljharb"
740
+ }
741
+ },
742
+ "node_modules/get-proto": {
743
+ "version": "1.0.1",
744
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
745
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
746
+ "license": "MIT",
747
+ "dependencies": {
748
+ "dunder-proto": "^1.0.1",
749
+ "es-object-atoms": "^1.0.0"
750
+ },
751
+ "engines": {
752
+ "node": ">= 0.4"
753
+ }
754
+ },
755
+ "node_modules/glob": {
756
+ "version": "10.5.0",
757
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
758
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
759
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
760
+ "license": "ISC",
761
+ "dependencies": {
762
+ "foreground-child": "^3.1.0",
763
+ "jackspeak": "^3.1.2",
764
+ "minimatch": "^9.0.4",
765
+ "minipass": "^7.1.2",
766
+ "package-json-from-dist": "^1.0.0",
767
+ "path-scurry": "^1.11.1"
768
+ },
769
+ "bin": {
770
+ "glob": "dist/esm/bin.mjs"
771
+ },
772
+ "funding": {
773
+ "url": "https://github.com/sponsors/isaacs"
774
+ }
775
+ },
776
+ "node_modules/google-auth-library": {
777
+ "version": "10.6.1",
778
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.1.tgz",
779
+ "integrity": "sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==",
780
+ "license": "Apache-2.0",
781
+ "dependencies": {
782
+ "base64-js": "^1.3.0",
783
+ "ecdsa-sig-formatter": "^1.0.11",
784
+ "gaxios": "7.1.3",
785
+ "gcp-metadata": "8.1.2",
786
+ "google-logging-utils": "1.1.3",
787
+ "jws": "^4.0.0"
788
+ },
789
+ "engines": {
790
+ "node": ">=18"
791
+ }
792
+ },
793
+ "node_modules/google-logging-utils": {
794
+ "version": "1.1.3",
795
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
796
+ "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
797
+ "license": "Apache-2.0",
798
+ "engines": {
799
+ "node": ">=14"
800
+ }
801
+ },
802
+ "node_modules/googleapis": {
803
+ "version": "171.4.0",
804
+ "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-171.4.0.tgz",
805
+ "integrity": "sha512-xybFL2SmmUgIifgsbsRQYRdNrSAYwxWZDmkZTGjUIaRnX5jPqR8el/cEvo6rCqh7iaZx6MfEPS/lrDgZ0bymkg==",
806
+ "license": "Apache-2.0",
807
+ "dependencies": {
808
+ "google-auth-library": "^10.2.0",
809
+ "googleapis-common": "^8.0.0"
810
+ },
811
+ "engines": {
812
+ "node": ">=18"
813
+ }
814
+ },
815
+ "node_modules/googleapis-common": {
816
+ "version": "8.0.1",
817
+ "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.1.tgz",
818
+ "integrity": "sha512-eCzNACUXPb1PW5l0ULTzMHaL/ltPRADoPgjBlT8jWsTbxkCp6siv+qKJ/1ldaybCthGwsYFYallF7u9AkU4L+A==",
819
+ "license": "Apache-2.0",
820
+ "dependencies": {
821
+ "extend": "^3.0.2",
822
+ "gaxios": "^7.0.0-rc.4",
823
+ "google-auth-library": "^10.1.0",
824
+ "qs": "^6.7.0",
825
+ "url-template": "^2.0.8"
826
+ },
827
+ "engines": {
828
+ "node": ">=18.0.0"
829
+ }
830
+ },
831
+ "node_modules/gopd": {
832
+ "version": "1.2.0",
833
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
834
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
835
+ "license": "MIT",
836
+ "engines": {
837
+ "node": ">= 0.4"
838
+ },
839
+ "funding": {
840
+ "url": "https://github.com/sponsors/ljharb"
841
+ }
842
+ },
843
+ "node_modules/has-symbols": {
844
+ "version": "1.1.0",
845
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
846
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
847
+ "license": "MIT",
848
+ "engines": {
849
+ "node": ">= 0.4"
850
+ },
851
+ "funding": {
852
+ "url": "https://github.com/sponsors/ljharb"
853
+ }
854
+ },
855
+ "node_modules/hasown": {
856
+ "version": "2.0.2",
857
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
858
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
859
+ "license": "MIT",
860
+ "dependencies": {
861
+ "function-bind": "^1.1.2"
862
+ },
863
+ "engines": {
864
+ "node": ">= 0.4"
865
+ }
866
+ },
867
+ "node_modules/http-errors": {
868
+ "version": "2.0.1",
869
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
870
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
871
+ "license": "MIT",
872
+ "dependencies": {
873
+ "depd": "~2.0.0",
874
+ "inherits": "~2.0.4",
875
+ "setprototypeof": "~1.2.0",
876
+ "statuses": "~2.0.2",
877
+ "toidentifier": "~1.0.1"
878
+ },
879
+ "engines": {
880
+ "node": ">= 0.8"
881
+ },
882
+ "funding": {
883
+ "type": "opencollective",
884
+ "url": "https://opencollective.com/express"
885
+ }
886
+ },
887
+ "node_modules/https-proxy-agent": {
888
+ "version": "7.0.6",
889
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
890
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
891
+ "license": "MIT",
892
+ "dependencies": {
893
+ "agent-base": "^7.1.2",
894
+ "debug": "4"
895
+ },
896
+ "engines": {
897
+ "node": ">= 14"
898
+ }
899
+ },
900
+ "node_modules/iconv-lite": {
901
+ "version": "0.7.2",
902
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
903
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
904
+ "license": "MIT",
905
+ "dependencies": {
906
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
907
+ },
908
+ "engines": {
909
+ "node": ">=0.10.0"
910
+ },
911
+ "funding": {
912
+ "type": "opencollective",
913
+ "url": "https://opencollective.com/express"
914
+ }
915
+ },
916
+ "node_modules/inherits": {
917
+ "version": "2.0.4",
918
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
919
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
920
+ "license": "ISC"
921
+ },
922
+ "node_modules/ipaddr.js": {
923
+ "version": "1.9.1",
924
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
925
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
926
+ "license": "MIT",
927
+ "engines": {
928
+ "node": ">= 0.10"
929
+ }
930
+ },
931
+ "node_modules/is-fullwidth-code-point": {
932
+ "version": "3.0.0",
933
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
934
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
935
+ "license": "MIT",
936
+ "engines": {
937
+ "node": ">=8"
938
+ }
939
+ },
940
+ "node_modules/is-promise": {
941
+ "version": "4.0.0",
942
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
943
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
944
+ "license": "MIT"
945
+ },
946
+ "node_modules/isexe": {
947
+ "version": "2.0.0",
948
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
949
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
950
+ "license": "ISC"
951
+ },
952
+ "node_modules/jackspeak": {
953
+ "version": "3.4.3",
954
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
955
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
956
+ "license": "BlueOak-1.0.0",
957
+ "dependencies": {
958
+ "@isaacs/cliui": "^8.0.2"
959
+ },
960
+ "funding": {
961
+ "url": "https://github.com/sponsors/isaacs"
962
+ },
963
+ "optionalDependencies": {
964
+ "@pkgjs/parseargs": "^0.11.0"
965
+ }
966
+ },
967
+ "node_modules/json-bigint": {
968
+ "version": "1.0.0",
969
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
970
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
971
+ "license": "MIT",
972
+ "dependencies": {
973
+ "bignumber.js": "^9.0.0"
974
+ }
975
+ },
976
+ "node_modules/jwa": {
977
+ "version": "2.0.1",
978
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
979
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
980
+ "license": "MIT",
981
+ "dependencies": {
982
+ "buffer-equal-constant-time": "^1.0.1",
983
+ "ecdsa-sig-formatter": "1.0.11",
984
+ "safe-buffer": "^5.0.1"
985
+ }
986
+ },
987
+ "node_modules/jws": {
988
+ "version": "4.0.1",
989
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
990
+ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
991
+ "license": "MIT",
992
+ "dependencies": {
993
+ "jwa": "^2.0.1",
994
+ "safe-buffer": "^5.0.1"
995
+ }
996
+ },
997
+ "node_modules/lru-cache": {
998
+ "version": "10.4.3",
999
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
1000
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
1001
+ "license": "ISC"
1002
+ },
1003
+ "node_modules/math-intrinsics": {
1004
+ "version": "1.1.0",
1005
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
1006
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
1007
+ "license": "MIT",
1008
+ "engines": {
1009
+ "node": ">= 0.4"
1010
+ }
1011
+ },
1012
+ "node_modules/media-typer": {
1013
+ "version": "1.1.0",
1014
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
1015
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
1016
+ "license": "MIT",
1017
+ "engines": {
1018
+ "node": ">= 0.8"
1019
+ }
1020
+ },
1021
+ "node_modules/merge-descriptors": {
1022
+ "version": "2.0.0",
1023
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
1024
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
1025
+ "license": "MIT",
1026
+ "engines": {
1027
+ "node": ">=18"
1028
+ },
1029
+ "funding": {
1030
+ "url": "https://github.com/sponsors/sindresorhus"
1031
+ }
1032
+ },
1033
+ "node_modules/mime-db": {
1034
+ "version": "1.54.0",
1035
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
1036
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
1037
+ "license": "MIT",
1038
+ "engines": {
1039
+ "node": ">= 0.6"
1040
+ }
1041
+ },
1042
+ "node_modules/mime-types": {
1043
+ "version": "3.0.2",
1044
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
1045
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
1046
+ "license": "MIT",
1047
+ "dependencies": {
1048
+ "mime-db": "^1.54.0"
1049
+ },
1050
+ "engines": {
1051
+ "node": ">=18"
1052
+ },
1053
+ "funding": {
1054
+ "type": "opencollective",
1055
+ "url": "https://opencollective.com/express"
1056
+ }
1057
+ },
1058
+ "node_modules/minimatch": {
1059
+ "version": "9.0.9",
1060
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
1061
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
1062
+ "license": "ISC",
1063
+ "dependencies": {
1064
+ "brace-expansion": "^2.0.2"
1065
+ },
1066
+ "engines": {
1067
+ "node": ">=16 || 14 >=14.17"
1068
+ },
1069
+ "funding": {
1070
+ "url": "https://github.com/sponsors/isaacs"
1071
+ }
1072
+ },
1073
+ "node_modules/minipass": {
1074
+ "version": "7.1.3",
1075
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
1076
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
1077
+ "license": "BlueOak-1.0.0",
1078
+ "engines": {
1079
+ "node": ">=16 || 14 >=14.17"
1080
+ }
1081
+ },
1082
+ "node_modules/ms": {
1083
+ "version": "2.1.3",
1084
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1085
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1086
+ "license": "MIT"
1087
+ },
1088
+ "node_modules/negotiator": {
1089
+ "version": "1.0.0",
1090
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
1091
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
1092
+ "license": "MIT",
1093
+ "engines": {
1094
+ "node": ">= 0.6"
1095
+ }
1096
+ },
1097
+ "node_modules/node-domexception": {
1098
+ "version": "1.0.0",
1099
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
1100
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
1101
+ "deprecated": "Use your platform's native DOMException instead",
1102
+ "funding": [
1103
+ {
1104
+ "type": "github",
1105
+ "url": "https://github.com/sponsors/jimmywarting"
1106
+ },
1107
+ {
1108
+ "type": "github",
1109
+ "url": "https://paypal.me/jimmywarting"
1110
+ }
1111
+ ],
1112
+ "license": "MIT",
1113
+ "engines": {
1114
+ "node": ">=10.5.0"
1115
+ }
1116
+ },
1117
+ "node_modules/node-fetch": {
1118
+ "version": "3.3.2",
1119
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
1120
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
1121
+ "license": "MIT",
1122
+ "dependencies": {
1123
+ "data-uri-to-buffer": "^4.0.0",
1124
+ "fetch-blob": "^3.1.4",
1125
+ "formdata-polyfill": "^4.0.10"
1126
+ },
1127
+ "engines": {
1128
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1129
+ },
1130
+ "funding": {
1131
+ "type": "opencollective",
1132
+ "url": "https://opencollective.com/node-fetch"
1133
+ }
1134
+ },
1135
+ "node_modules/object-assign": {
1136
+ "version": "4.1.1",
1137
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1138
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1139
+ "license": "MIT",
1140
+ "engines": {
1141
+ "node": ">=0.10.0"
1142
+ }
1143
+ },
1144
+ "node_modules/object-inspect": {
1145
+ "version": "1.13.4",
1146
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1147
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1148
+ "license": "MIT",
1149
+ "engines": {
1150
+ "node": ">= 0.4"
1151
+ },
1152
+ "funding": {
1153
+ "url": "https://github.com/sponsors/ljharb"
1154
+ }
1155
+ },
1156
+ "node_modules/on-finished": {
1157
+ "version": "2.4.1",
1158
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1159
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1160
+ "license": "MIT",
1161
+ "dependencies": {
1162
+ "ee-first": "1.1.1"
1163
+ },
1164
+ "engines": {
1165
+ "node": ">= 0.8"
1166
+ }
1167
+ },
1168
+ "node_modules/once": {
1169
+ "version": "1.4.0",
1170
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1171
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1172
+ "license": "ISC",
1173
+ "dependencies": {
1174
+ "wrappy": "1"
1175
+ }
1176
+ },
1177
+ "node_modules/package-json-from-dist": {
1178
+ "version": "1.0.1",
1179
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
1180
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
1181
+ "license": "BlueOak-1.0.0"
1182
+ },
1183
+ "node_modules/parseurl": {
1184
+ "version": "1.3.3",
1185
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1186
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1187
+ "license": "MIT",
1188
+ "engines": {
1189
+ "node": ">= 0.8"
1190
+ }
1191
+ },
1192
+ "node_modules/path-key": {
1193
+ "version": "3.1.1",
1194
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1195
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1196
+ "license": "MIT",
1197
+ "engines": {
1198
+ "node": ">=8"
1199
+ }
1200
+ },
1201
+ "node_modules/path-scurry": {
1202
+ "version": "1.11.1",
1203
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
1204
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
1205
+ "license": "BlueOak-1.0.0",
1206
+ "dependencies": {
1207
+ "lru-cache": "^10.2.0",
1208
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
1209
+ },
1210
+ "engines": {
1211
+ "node": ">=16 || 14 >=14.18"
1212
+ },
1213
+ "funding": {
1214
+ "url": "https://github.com/sponsors/isaacs"
1215
+ }
1216
+ },
1217
+ "node_modules/path-to-regexp": {
1218
+ "version": "8.3.0",
1219
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
1220
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
1221
+ "license": "MIT",
1222
+ "funding": {
1223
+ "type": "opencollective",
1224
+ "url": "https://opencollective.com/express"
1225
+ }
1226
+ },
1227
+ "node_modules/proxy-addr": {
1228
+ "version": "2.0.7",
1229
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1230
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1231
+ "license": "MIT",
1232
+ "dependencies": {
1233
+ "forwarded": "0.2.0",
1234
+ "ipaddr.js": "1.9.1"
1235
+ },
1236
+ "engines": {
1237
+ "node": ">= 0.10"
1238
+ }
1239
+ },
1240
+ "node_modules/qs": {
1241
+ "version": "6.15.0",
1242
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz",
1243
+ "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
1244
+ "license": "BSD-3-Clause",
1245
+ "dependencies": {
1246
+ "side-channel": "^1.1.0"
1247
+ },
1248
+ "engines": {
1249
+ "node": ">=0.6"
1250
+ },
1251
+ "funding": {
1252
+ "url": "https://github.com/sponsors/ljharb"
1253
+ }
1254
+ },
1255
+ "node_modules/range-parser": {
1256
+ "version": "1.2.1",
1257
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1258
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1259
+ "license": "MIT",
1260
+ "engines": {
1261
+ "node": ">= 0.6"
1262
+ }
1263
+ },
1264
+ "node_modules/raw-body": {
1265
+ "version": "3.0.2",
1266
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
1267
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
1268
+ "license": "MIT",
1269
+ "dependencies": {
1270
+ "bytes": "~3.1.2",
1271
+ "http-errors": "~2.0.1",
1272
+ "iconv-lite": "~0.7.0",
1273
+ "unpipe": "~1.0.0"
1274
+ },
1275
+ "engines": {
1276
+ "node": ">= 0.10"
1277
+ }
1278
+ },
1279
+ "node_modules/rimraf": {
1280
+ "version": "5.0.10",
1281
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
1282
+ "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
1283
+ "license": "ISC",
1284
+ "dependencies": {
1285
+ "glob": "^10.3.7"
1286
+ },
1287
+ "bin": {
1288
+ "rimraf": "dist/esm/bin.mjs"
1289
+ },
1290
+ "funding": {
1291
+ "url": "https://github.com/sponsors/isaacs"
1292
+ }
1293
+ },
1294
+ "node_modules/router": {
1295
+ "version": "2.2.0",
1296
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
1297
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
1298
+ "license": "MIT",
1299
+ "dependencies": {
1300
+ "debug": "^4.4.0",
1301
+ "depd": "^2.0.0",
1302
+ "is-promise": "^4.0.0",
1303
+ "parseurl": "^1.3.3",
1304
+ "path-to-regexp": "^8.0.0"
1305
+ },
1306
+ "engines": {
1307
+ "node": ">= 18"
1308
+ }
1309
+ },
1310
+ "node_modules/safe-buffer": {
1311
+ "version": "5.2.1",
1312
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1313
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1314
+ "funding": [
1315
+ {
1316
+ "type": "github",
1317
+ "url": "https://github.com/sponsors/feross"
1318
+ },
1319
+ {
1320
+ "type": "patreon",
1321
+ "url": "https://www.patreon.com/feross"
1322
+ },
1323
+ {
1324
+ "type": "consulting",
1325
+ "url": "https://feross.org/support"
1326
+ }
1327
+ ],
1328
+ "license": "MIT"
1329
+ },
1330
+ "node_modules/safer-buffer": {
1331
+ "version": "2.1.2",
1332
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1333
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1334
+ "license": "MIT"
1335
+ },
1336
+ "node_modules/send": {
1337
+ "version": "1.2.1",
1338
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
1339
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
1340
+ "license": "MIT",
1341
+ "dependencies": {
1342
+ "debug": "^4.4.3",
1343
+ "encodeurl": "^2.0.0",
1344
+ "escape-html": "^1.0.3",
1345
+ "etag": "^1.8.1",
1346
+ "fresh": "^2.0.0",
1347
+ "http-errors": "^2.0.1",
1348
+ "mime-types": "^3.0.2",
1349
+ "ms": "^2.1.3",
1350
+ "on-finished": "^2.4.1",
1351
+ "range-parser": "^1.2.1",
1352
+ "statuses": "^2.0.2"
1353
+ },
1354
+ "engines": {
1355
+ "node": ">= 18"
1356
+ },
1357
+ "funding": {
1358
+ "type": "opencollective",
1359
+ "url": "https://opencollective.com/express"
1360
+ }
1361
+ },
1362
+ "node_modules/serve-static": {
1363
+ "version": "2.2.1",
1364
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
1365
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
1366
+ "license": "MIT",
1367
+ "dependencies": {
1368
+ "encodeurl": "^2.0.0",
1369
+ "escape-html": "^1.0.3",
1370
+ "parseurl": "^1.3.3",
1371
+ "send": "^1.2.0"
1372
+ },
1373
+ "engines": {
1374
+ "node": ">= 18"
1375
+ },
1376
+ "funding": {
1377
+ "type": "opencollective",
1378
+ "url": "https://opencollective.com/express"
1379
+ }
1380
+ },
1381
+ "node_modules/setprototypeof": {
1382
+ "version": "1.2.0",
1383
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1384
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1385
+ "license": "ISC"
1386
+ },
1387
+ "node_modules/shebang-command": {
1388
+ "version": "2.0.0",
1389
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1390
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1391
+ "license": "MIT",
1392
+ "dependencies": {
1393
+ "shebang-regex": "^3.0.0"
1394
+ },
1395
+ "engines": {
1396
+ "node": ">=8"
1397
+ }
1398
+ },
1399
+ "node_modules/shebang-regex": {
1400
+ "version": "3.0.0",
1401
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1402
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1403
+ "license": "MIT",
1404
+ "engines": {
1405
+ "node": ">=8"
1406
+ }
1407
+ },
1408
+ "node_modules/side-channel": {
1409
+ "version": "1.1.0",
1410
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1411
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1412
+ "license": "MIT",
1413
+ "dependencies": {
1414
+ "es-errors": "^1.3.0",
1415
+ "object-inspect": "^1.13.3",
1416
+ "side-channel-list": "^1.0.0",
1417
+ "side-channel-map": "^1.0.1",
1418
+ "side-channel-weakmap": "^1.0.2"
1419
+ },
1420
+ "engines": {
1421
+ "node": ">= 0.4"
1422
+ },
1423
+ "funding": {
1424
+ "url": "https://github.com/sponsors/ljharb"
1425
+ }
1426
+ },
1427
+ "node_modules/side-channel-list": {
1428
+ "version": "1.0.0",
1429
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1430
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1431
+ "license": "MIT",
1432
+ "dependencies": {
1433
+ "es-errors": "^1.3.0",
1434
+ "object-inspect": "^1.13.3"
1435
+ },
1436
+ "engines": {
1437
+ "node": ">= 0.4"
1438
+ },
1439
+ "funding": {
1440
+ "url": "https://github.com/sponsors/ljharb"
1441
+ }
1442
+ },
1443
+ "node_modules/side-channel-map": {
1444
+ "version": "1.0.1",
1445
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1446
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1447
+ "license": "MIT",
1448
+ "dependencies": {
1449
+ "call-bound": "^1.0.2",
1450
+ "es-errors": "^1.3.0",
1451
+ "get-intrinsic": "^1.2.5",
1452
+ "object-inspect": "^1.13.3"
1453
+ },
1454
+ "engines": {
1455
+ "node": ">= 0.4"
1456
+ },
1457
+ "funding": {
1458
+ "url": "https://github.com/sponsors/ljharb"
1459
+ }
1460
+ },
1461
+ "node_modules/side-channel-weakmap": {
1462
+ "version": "1.0.2",
1463
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1464
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1465
+ "license": "MIT",
1466
+ "dependencies": {
1467
+ "call-bound": "^1.0.2",
1468
+ "es-errors": "^1.3.0",
1469
+ "get-intrinsic": "^1.2.5",
1470
+ "object-inspect": "^1.13.3",
1471
+ "side-channel-map": "^1.0.1"
1472
+ },
1473
+ "engines": {
1474
+ "node": ">= 0.4"
1475
+ },
1476
+ "funding": {
1477
+ "url": "https://github.com/sponsors/ljharb"
1478
+ }
1479
+ },
1480
+ "node_modules/signal-exit": {
1481
+ "version": "4.1.0",
1482
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
1483
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
1484
+ "license": "ISC",
1485
+ "engines": {
1486
+ "node": ">=14"
1487
+ },
1488
+ "funding": {
1489
+ "url": "https://github.com/sponsors/isaacs"
1490
+ }
1491
+ },
1492
+ "node_modules/socket.io": {
1493
+ "version": "4.8.3",
1494
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz",
1495
+ "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==",
1496
+ "license": "MIT",
1497
+ "dependencies": {
1498
+ "accepts": "~1.3.4",
1499
+ "base64id": "~2.0.0",
1500
+ "cors": "~2.8.5",
1501
+ "debug": "~4.4.1",
1502
+ "engine.io": "~6.6.0",
1503
+ "socket.io-adapter": "~2.5.2",
1504
+ "socket.io-parser": "~4.2.4"
1505
+ },
1506
+ "engines": {
1507
+ "node": ">=10.2.0"
1508
+ }
1509
+ },
1510
+ "node_modules/socket.io-adapter": {
1511
+ "version": "2.5.6",
1512
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz",
1513
+ "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==",
1514
+ "license": "MIT",
1515
+ "dependencies": {
1516
+ "debug": "~4.4.1",
1517
+ "ws": "~8.18.3"
1518
+ }
1519
+ },
1520
+ "node_modules/socket.io-parser": {
1521
+ "version": "4.2.5",
1522
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz",
1523
+ "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==",
1524
+ "license": "MIT",
1525
+ "dependencies": {
1526
+ "@socket.io/component-emitter": "~3.1.0",
1527
+ "debug": "~4.4.1"
1528
+ },
1529
+ "engines": {
1530
+ "node": ">=10.0.0"
1531
+ }
1532
+ },
1533
+ "node_modules/socket.io/node_modules/accepts": {
1534
+ "version": "1.3.8",
1535
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
1536
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
1537
+ "license": "MIT",
1538
+ "dependencies": {
1539
+ "mime-types": "~2.1.34",
1540
+ "negotiator": "0.6.3"
1541
+ },
1542
+ "engines": {
1543
+ "node": ">= 0.6"
1544
+ }
1545
+ },
1546
+ "node_modules/socket.io/node_modules/mime-db": {
1547
+ "version": "1.52.0",
1548
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1549
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1550
+ "license": "MIT",
1551
+ "engines": {
1552
+ "node": ">= 0.6"
1553
+ }
1554
+ },
1555
+ "node_modules/socket.io/node_modules/mime-types": {
1556
+ "version": "2.1.35",
1557
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1558
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1559
+ "license": "MIT",
1560
+ "dependencies": {
1561
+ "mime-db": "1.52.0"
1562
+ },
1563
+ "engines": {
1564
+ "node": ">= 0.6"
1565
+ }
1566
+ },
1567
+ "node_modules/socket.io/node_modules/negotiator": {
1568
+ "version": "0.6.3",
1569
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1570
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1571
+ "license": "MIT",
1572
+ "engines": {
1573
+ "node": ">= 0.6"
1574
+ }
1575
+ },
1576
+ "node_modules/statuses": {
1577
+ "version": "2.0.2",
1578
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1579
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1580
+ "license": "MIT",
1581
+ "engines": {
1582
+ "node": ">= 0.8"
1583
+ }
1584
+ },
1585
+ "node_modules/string-width": {
1586
+ "version": "5.1.2",
1587
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
1588
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
1589
+ "license": "MIT",
1590
+ "dependencies": {
1591
+ "eastasianwidth": "^0.2.0",
1592
+ "emoji-regex": "^9.2.2",
1593
+ "strip-ansi": "^7.0.1"
1594
+ },
1595
+ "engines": {
1596
+ "node": ">=12"
1597
+ },
1598
+ "funding": {
1599
+ "url": "https://github.com/sponsors/sindresorhus"
1600
+ }
1601
+ },
1602
+ "node_modules/string-width-cjs": {
1603
+ "name": "string-width",
1604
+ "version": "4.2.3",
1605
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1606
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1607
+ "license": "MIT",
1608
+ "dependencies": {
1609
+ "emoji-regex": "^8.0.0",
1610
+ "is-fullwidth-code-point": "^3.0.0",
1611
+ "strip-ansi": "^6.0.1"
1612
+ },
1613
+ "engines": {
1614
+ "node": ">=8"
1615
+ }
1616
+ },
1617
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
1618
+ "version": "5.0.1",
1619
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1620
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1621
+ "license": "MIT",
1622
+ "engines": {
1623
+ "node": ">=8"
1624
+ }
1625
+ },
1626
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
1627
+ "version": "8.0.0",
1628
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1629
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1630
+ "license": "MIT"
1631
+ },
1632
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
1633
+ "version": "6.0.1",
1634
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1635
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1636
+ "license": "MIT",
1637
+ "dependencies": {
1638
+ "ansi-regex": "^5.0.1"
1639
+ },
1640
+ "engines": {
1641
+ "node": ">=8"
1642
+ }
1643
+ },
1644
+ "node_modules/strip-ansi": {
1645
+ "version": "7.2.0",
1646
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
1647
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
1648
+ "license": "MIT",
1649
+ "dependencies": {
1650
+ "ansi-regex": "^6.2.2"
1651
+ },
1652
+ "engines": {
1653
+ "node": ">=12"
1654
+ },
1655
+ "funding": {
1656
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
1657
+ }
1658
+ },
1659
+ "node_modules/strip-ansi-cjs": {
1660
+ "name": "strip-ansi",
1661
+ "version": "6.0.1",
1662
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1663
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1664
+ "license": "MIT",
1665
+ "dependencies": {
1666
+ "ansi-regex": "^5.0.1"
1667
+ },
1668
+ "engines": {
1669
+ "node": ">=8"
1670
+ }
1671
+ },
1672
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
1673
+ "version": "5.0.1",
1674
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1675
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1676
+ "license": "MIT",
1677
+ "engines": {
1678
+ "node": ">=8"
1679
+ }
1680
+ },
1681
+ "node_modules/toidentifier": {
1682
+ "version": "1.0.1",
1683
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1684
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1685
+ "license": "MIT",
1686
+ "engines": {
1687
+ "node": ">=0.6"
1688
+ }
1689
+ },
1690
+ "node_modules/type-is": {
1691
+ "version": "2.0.1",
1692
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1693
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1694
+ "license": "MIT",
1695
+ "dependencies": {
1696
+ "content-type": "^1.0.5",
1697
+ "media-typer": "^1.1.0",
1698
+ "mime-types": "^3.0.0"
1699
+ },
1700
+ "engines": {
1701
+ "node": ">= 0.6"
1702
+ }
1703
+ },
1704
+ "node_modules/undici-types": {
1705
+ "version": "7.18.2",
1706
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
1707
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
1708
+ "license": "MIT"
1709
+ },
1710
+ "node_modules/unpipe": {
1711
+ "version": "1.0.0",
1712
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1713
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1714
+ "license": "MIT",
1715
+ "engines": {
1716
+ "node": ">= 0.8"
1717
+ }
1718
+ },
1719
+ "node_modules/url-template": {
1720
+ "version": "2.0.8",
1721
+ "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
1722
+ "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==",
1723
+ "license": "BSD"
1724
+ },
1725
+ "node_modules/vary": {
1726
+ "version": "1.1.2",
1727
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1728
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1729
+ "license": "MIT",
1730
+ "engines": {
1731
+ "node": ">= 0.8"
1732
+ }
1733
+ },
1734
+ "node_modules/web-streams-polyfill": {
1735
+ "version": "3.3.3",
1736
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
1737
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
1738
+ "license": "MIT",
1739
+ "engines": {
1740
+ "node": ">= 8"
1741
+ }
1742
+ },
1743
+ "node_modules/which": {
1744
+ "version": "2.0.2",
1745
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1746
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1747
+ "license": "ISC",
1748
+ "dependencies": {
1749
+ "isexe": "^2.0.0"
1750
+ },
1751
+ "bin": {
1752
+ "node-which": "bin/node-which"
1753
+ },
1754
+ "engines": {
1755
+ "node": ">= 8"
1756
+ }
1757
+ },
1758
+ "node_modules/wrap-ansi": {
1759
+ "version": "8.1.0",
1760
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
1761
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
1762
+ "license": "MIT",
1763
+ "dependencies": {
1764
+ "ansi-styles": "^6.1.0",
1765
+ "string-width": "^5.0.1",
1766
+ "strip-ansi": "^7.0.1"
1767
+ },
1768
+ "engines": {
1769
+ "node": ">=12"
1770
+ },
1771
+ "funding": {
1772
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1773
+ }
1774
+ },
1775
+ "node_modules/wrap-ansi-cjs": {
1776
+ "name": "wrap-ansi",
1777
+ "version": "7.0.0",
1778
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1779
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1780
+ "license": "MIT",
1781
+ "dependencies": {
1782
+ "ansi-styles": "^4.0.0",
1783
+ "string-width": "^4.1.0",
1784
+ "strip-ansi": "^6.0.0"
1785
+ },
1786
+ "engines": {
1787
+ "node": ">=10"
1788
+ },
1789
+ "funding": {
1790
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1791
+ }
1792
+ },
1793
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
1794
+ "version": "5.0.1",
1795
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1796
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1797
+ "license": "MIT",
1798
+ "engines": {
1799
+ "node": ">=8"
1800
+ }
1801
+ },
1802
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
1803
+ "version": "4.3.0",
1804
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1805
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1806
+ "license": "MIT",
1807
+ "dependencies": {
1808
+ "color-convert": "^2.0.1"
1809
+ },
1810
+ "engines": {
1811
+ "node": ">=8"
1812
+ },
1813
+ "funding": {
1814
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1815
+ }
1816
+ },
1817
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
1818
+ "version": "8.0.0",
1819
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1820
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1821
+ "license": "MIT"
1822
+ },
1823
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
1824
+ "version": "4.2.3",
1825
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1826
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1827
+ "license": "MIT",
1828
+ "dependencies": {
1829
+ "emoji-regex": "^8.0.0",
1830
+ "is-fullwidth-code-point": "^3.0.0",
1831
+ "strip-ansi": "^6.0.1"
1832
+ },
1833
+ "engines": {
1834
+ "node": ">=8"
1835
+ }
1836
+ },
1837
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
1838
+ "version": "6.0.1",
1839
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1840
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1841
+ "license": "MIT",
1842
+ "dependencies": {
1843
+ "ansi-regex": "^5.0.1"
1844
+ },
1845
+ "engines": {
1846
+ "node": ">=8"
1847
+ }
1848
+ },
1849
+ "node_modules/wrappy": {
1850
+ "version": "1.0.2",
1851
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1852
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1853
+ "license": "ISC"
1854
+ },
1855
+ "node_modules/ws": {
1856
+ "version": "8.18.3",
1857
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
1858
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
1859
+ "license": "MIT",
1860
+ "engines": {
1861
+ "node": ">=10.0.0"
1862
+ },
1863
+ "peerDependencies": {
1864
+ "bufferutil": "^4.0.1",
1865
+ "utf-8-validate": ">=5.0.2"
1866
+ },
1867
+ "peerDependenciesMeta": {
1868
+ "bufferutil": {
1869
+ "optional": true
1870
+ },
1871
+ "utf-8-validate": {
1872
+ "optional": true
1873
+ }
1874
+ }
1875
+ }
1876
+ }
1877
+ }
package.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "wallapi",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "keywords": [],
10
+ "author": "",
11
+ "license": "ISC",
12
+ "type": "commonjs",
13
+ "dependencies": {
14
+ "body-parser": "^2.2.2",
15
+ "cors": "^2.8.6",
16
+ "dotenv": "^17.3.1",
17
+ "express": "^5.2.1",
18
+ "googleapis": "^171.4.0",
19
+ "socket.io": "^4.8.3"
20
+ }
21
+ }
public/dashboard.html ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>WallAPI - Live Submissions Dashboard</title>
8
+ <style>
9
+ body {
10
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
11
+ background-color: #f0f2f5;
12
+ margin: 0;
13
+ padding: 40px 20px;
14
+ color: #333;
15
+ }
16
+
17
+ .container {
18
+ max-width: 800px;
19
+ margin: 0 auto;
20
+ }
21
+
22
+ .header {
23
+ display: flex;
24
+ justify-content: space-between;
25
+ align-items: center;
26
+ margin-bottom: 30px;
27
+ }
28
+
29
+ .header h1 {
30
+ margin: 0;
31
+ font-size: 28px;
32
+ }
33
+
34
+ .status-badge {
35
+ display: inline-flex;
36
+ align-items: center;
37
+ padding: 6px 12px;
38
+ border-radius: 999px;
39
+ font-size: 14px;
40
+ font-weight: 600;
41
+ background: #fee2e2;
42
+ color: #b91c1c;
43
+ }
44
+
45
+ .status-badge.connected {
46
+ background: #d1fae5;
47
+ color: #065f46;
48
+ }
49
+
50
+ .status-dot {
51
+ width: 8px;
52
+ height: 8px;
53
+ border-radius: 50%;
54
+ background: currentColor;
55
+ margin-right: 8px;
56
+ }
57
+
58
+ .submission-list {
59
+ display: flex;
60
+ flex-direction: column;
61
+ gap: 16px;
62
+ }
63
+
64
+ .submission-card {
65
+ background: white;
66
+ border-radius: 12px;
67
+ padding: 24px;
68
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);
69
+ border-left: 4px solid #0066ff;
70
+ animation: slideIn 0.3s ease-out forwards;
71
+ opacity: 0;
72
+ transform: translateY(20px);
73
+ }
74
+
75
+ @keyframes slideIn {
76
+ to {
77
+ opacity: 1;
78
+ transform: translateY(0);
79
+ }
80
+ }
81
+
82
+ .submission-header {
83
+ display: flex;
84
+ justify-content: space-between;
85
+ margin-bottom: 12px;
86
+ font-size: 14px;
87
+ color: #666;
88
+ }
89
+
90
+ .submission-name {
91
+ font-weight: 700;
92
+ color: #111;
93
+ font-size: 18px;
94
+ }
95
+
96
+ .submission-email {
97
+ color: #0066ff;
98
+ text-decoration: none;
99
+ }
100
+
101
+ .submission-message {
102
+ margin-top: 16px;
103
+ padding: 16px;
104
+ background: #f8fafc;
105
+ border-radius: 8px;
106
+ border: 1px solid #e2e8f0;
107
+ line-height: 1.5;
108
+ white-space: pre-wrap;
109
+ }
110
+
111
+ .empty-state {
112
+ text-align: center;
113
+ padding: 60px 20px;
114
+ color: #64748b;
115
+ background: white;
116
+ border-radius: 12px;
117
+ border: 2px dashed #cbd5e1;
118
+ }
119
+ </style>
120
+ </head>
121
+
122
+ <body>
123
+
124
+ <div class="container">
125
+ <div class="header">
126
+ <h1>Live Form Submissions</h1>
127
+ <div id="connection-status" class="status-badge">
128
+ <div class="status-dot"></div>
129
+ <span id="status-text">Disconnected</span>
130
+ </div>
131
+ </div>
132
+
133
+ <div id="submissions" class="submission-list">
134
+ <div id="empty-state" class="empty-state">
135
+ <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
136
+ stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 16px; opacity: 0.5;">
137
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
138
+ </svg>
139
+ <h3>No new submissions yet</h3>
140
+ <p>Waiting for real-time updates from your embedded forms...</p>
141
+ </div>
142
+ </div>
143
+ </div>
144
+
145
+ <!-- Include Socket.IO client from CDN -->
146
+ <script src="https://cdn.socket.io/4.7.2/socket.io.min.js"></script>
147
+ <script>
148
+ // Connect to the Socket.IO server dynamically based on where we are hosted
149
+ const socket = io(window.location.origin);
150
+
151
+ const statusBadge = document.getElementById('connection-status');
152
+ const statusText = document.getElementById('status-text');
153
+ const submissionsList = document.getElementById('submissions');
154
+ const emptyState = document.getElementById('empty-state');
155
+
156
+ // Handle Connection
157
+ socket.on('connect', () => {
158
+ statusBadge.className = 'status-badge connected';
159
+ statusText.textContent = 'Live & Connected';
160
+ });
161
+
162
+ socket.on('disconnect', () => {
163
+ statusBadge.className = 'status-badge';
164
+ statusText.textContent = 'Disconnected';
165
+ });
166
+
167
+ // Listen for new submissions
168
+ socket.on('new_submission', (data) => {
169
+ // Remove empty state if it exists
170
+ if (emptyState && emptyState.parentNode) {
171
+ emptyState.parentNode.removeChild(emptyState);
172
+ }
173
+
174
+ // Create a new submission card
175
+ const card = document.createElement('div');
176
+ card.className = 'submission-card';
177
+
178
+ const date = new Date(data.timestamp).toLocaleString();
179
+
180
+ card.innerHTML = `
181
+ <div class="submission-header">
182
+ <div>
183
+ <span class="submission-name">\${data.name}</span> &middot;
184
+ <a href="mailto:\${data.email}" class="submission-email">\${data.email}</a>
185
+ </div>
186
+ <div>\${date}</div>
187
+ </div>
188
+ <div class="submission-message">\${data.message.replace(/</g, "&lt;").replace(/>/g, "&gt;")}</div>
189
+ `;
190
+
191
+ // Add to the top of the list
192
+ submissionsList.insertBefore(card, submissionsList.firstChild);
193
+
194
+ // Optional: Play a tiny notification sound
195
+ // const audio = new Audio('https://assets.mixkit.co/active_storage/sfx/2869/2869-preview.mp3');
196
+ // audio.play().catch(e => console.log("Audio play blocked by browser:", e));
197
+ });
198
+ </script>
199
+
200
+ </body>
201
+
202
+ </html>
public/embed.js ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function () {
2
+ // Determine where the script was loaded from to use as the base API URL
3
+ // We use the current script's origin so it dynamically works local or on Hugging Face.
4
+ const scriptTag = document.currentScript;
5
+ const baseUrl = scriptTag ? new URL(scriptTag.src).origin : 'http://localhost:3000';
6
+ const API_URL = `${baseUrl}/api/submit`;
7
+
8
+ const containerId = 'wallapi-form-container';
9
+ const container = document.getElementById(containerId);
10
+
11
+ if (!container) {
12
+ console.error(`[WallAPI] Container element with id '${containerId}' not found.`);
13
+ return;
14
+ }
15
+
16
+ // Inject CSS styles securely and cleanly
17
+ const styles = `
18
+ #${containerId} {
19
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
20
+ max-width: 400px;
21
+ margin: 0 auto;
22
+ background: #ffffff;
23
+ padding: 32px;
24
+ border-radius: 12px;
25
+ box-shadow: 0 10px 25px rgba(0,0,0,0.05);
26
+ box-sizing: border-box;
27
+ border: 1px solid #eaeaea;
28
+ }
29
+ #${containerId} h3 {
30
+ margin-top: 0;
31
+ font-size: 24px;
32
+ font-weight: 600;
33
+ color: #111;
34
+ margin-bottom: 24px;
35
+ }
36
+ #${containerId} .wallapi-group {
37
+ margin-bottom: 20px;
38
+ text-align: left;
39
+ }
40
+ #${containerId} label {
41
+ display: block;
42
+ margin-bottom: 8px;
43
+ font-weight: 500;
44
+ color: #444;
45
+ font-size: 14px;
46
+ }
47
+ #${containerId} input, #${containerId} textarea {
48
+ width: 100%;
49
+ padding: 12px 16px;
50
+ border: 1px solid #ddd;
51
+ border-radius: 8px;
52
+ font-size: 15px;
53
+ transition: border-color 0.2s, box-shadow 0.2s;
54
+ box-sizing: border-box;
55
+ font-family: inherit;
56
+ }
57
+ #${containerId} input:focus, #${containerId} textarea:focus {
58
+ outline: none;
59
+ border-color: #0066ff;
60
+ box-shadow: 0 0 0 3px rgba(0, 102, 255, 0.1);
61
+ }
62
+ #${containerId} textarea {
63
+ resize: vertical;
64
+ min-height: 100px;
65
+ }
66
+ #${containerId} button {
67
+ width: 100%;
68
+ background: #0066ff;
69
+ color: white;
70
+ border: none;
71
+ padding: 14px;
72
+ border-radius: 8px;
73
+ font-size: 16px;
74
+ font-weight: 600;
75
+ cursor: pointer;
76
+ transition: background 0.2s, transform 0.1s;
77
+ }
78
+ #${containerId} button:hover {
79
+ background: #005ce6;
80
+ }
81
+ #${containerId} button:active {
82
+ transform: scale(0.98);
83
+ }
84
+ #${containerId} button:disabled {
85
+ background: #a0c4ff;
86
+ cursor: not-allowed;
87
+ transform: none;
88
+ }
89
+ #${containerId} .wallapi-message {
90
+ margin-top: 16px;
91
+ padding: 12px;
92
+ border-radius: 8px;
93
+ font-size: 14px;
94
+ display: none;
95
+ }
96
+ #${containerId} .wallapi-message.success {
97
+ display: block;
98
+ background: #d1fae5;
99
+ color: #065f46;
100
+ border: 1px solid #10b981;
101
+ }
102
+ #${containerId} .wallapi-message.error {
103
+ display: block;
104
+ background: #fee2e2;
105
+ color: #b91c1c;
106
+ border: 1px solid #ef4444;
107
+ }
108
+ `;
109
+
110
+ const styleTag = document.createElement('style');
111
+ styleTag.innerHTML = styles;
112
+ document.head.appendChild(styleTag);
113
+
114
+ // Form HTML
115
+ const formHtml = `
116
+ <h3>Contact Us</h3>
117
+ <form id="wallapi-form">
118
+ <div class="wallapi-group">
119
+ <label for="wallapi-name">Name</label>
120
+ <input type="text" id="wallapi-name" name="name" required placeholder="John Doe">
121
+ </div>
122
+ <div class="wallapi-group">
123
+ <label for="wallapi-email">Email</label>
124
+ <input type="email" id="wallapi-email" name="email" required placeholder="john@example.com">
125
+ </div>
126
+ <div class="wallapi-group">
127
+ <label for="wallapi-message">Message</label>
128
+ <textarea id="wallapi-message" name="message" required placeholder="How can we help you?"></textarea>
129
+ </div>
130
+ <button type="submit" id="wallapi-submit">Send Message</button>
131
+ <div id="wallapi-status" class="wallapi-message"></div>
132
+ </form>
133
+ `;
134
+
135
+ container.innerHTML = formHtml;
136
+
137
+ const form = document.getElementById('wallapi-form');
138
+ const submitBtn = document.getElementById('wallapi-submit');
139
+ const statusDiv = document.getElementById('wallapi-status');
140
+
141
+ form.addEventListener('submit', async (e) => {
142
+ e.preventDefault();
143
+
144
+ submitBtn.disabled = true;
145
+ submitBtn.textContent = 'Sending...';
146
+ statusDiv.className = 'wallapi-message'; // Reset
147
+
148
+ const formData = {
149
+ name: document.getElementById('wallapi-name').value,
150
+ email: document.getElementById('wallapi-email').value,
151
+ message: document.getElementById('wallapi-message').value
152
+ };
153
+
154
+ try {
155
+ const response = await fetch(API_URL, {
156
+ method: 'POST',
157
+ headers: {
158
+ 'Content-Type': 'application/json'
159
+ },
160
+ body: JSON.stringify(formData)
161
+ });
162
+
163
+ const data = await response.json();
164
+
165
+ if (response.ok) {
166
+ statusDiv.textContent = data.message || 'Form submitted successfully!';
167
+ statusDiv.className = 'wallapi-message success';
168
+ form.reset();
169
+ } else {
170
+ statusDiv.textContent = data.error || 'Server error occurred.';
171
+ statusDiv.className = 'wallapi-message error';
172
+ }
173
+ } catch (err) {
174
+ statusDiv.textContent = 'Network error. Please try again later.';
175
+ statusDiv.className = 'wallapi-message error';
176
+ console.error('[WallAPI] Submit error:', err);
177
+ } finally {
178
+ submitBtn.disabled = false;
179
+ submitBtn.textContent = 'Send Message';
180
+ }
181
+ });
182
+
183
+ })();
public/index.html ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Embeddable Form Demo</title>
7
+ <style>
8
+ body {
9
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
10
+ background-color: #f7f9fc;
11
+ display: flex;
12
+ flex-direction: column;
13
+ align-items: center;
14
+ padding: 40px 20px;
15
+ margin: 0;
16
+ }
17
+ .demo-header {
18
+ margin-bottom: 40px;
19
+ text-align: center;
20
+ }
21
+ .demo-header h1 {
22
+ color: #333;
23
+ }
24
+ .demo-header p {
25
+ color: #666;
26
+ max-width: 600px;
27
+ }
28
+ /* This empty container is where the embed script will inject the form */
29
+ #wallapi-form-container {
30
+ width: 100%;
31
+ max-width: 400px;
32
+ }
33
+ </style>
34
+ </head>
35
+ <body>
36
+
37
+ <div class="demo-header">
38
+ <h1>WallAPI Embed Demo</h1>
39
+ <p>This page demonstrates how the embeddable form looks when injected into a website. Simply create a <code>&lt;div id="wallapi-form-container"&gt;&lt;/div&gt;</code> and include the <code>embed.js</code> script.</p>
40
+ </div>
41
+
42
+ <!-- The form will be injected here -->
43
+ <div id="wallapi-form-container"></div>
44
+
45
+ <!-- Include the embed widget script -->
46
+ <script src="/embed.js"></script>
47
+
48
+ </body>
49
+ </html>
server.js ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ require('dotenv').config();
2
+ const express = require('express');
3
+ const http = require('http');
4
+ const cors = require('cors');
5
+ const bodyParser = require('body-parser');
6
+ const { google } = require('googleapis');
7
+ const fs = require('fs');
8
+ const { Server } = require("socket.io");
9
+
10
+ const app = express();
11
+ const server = http.createServer(app);
12
+ const io = new Server(server, {
13
+ cors: {
14
+ origin: "*", // allow all domains to connect for real-time updates (you can restrict this later)
15
+ methods: ["GET", "POST"]
16
+ }
17
+ });
18
+
19
+ const port = process.env.PORT || 3000;
20
+
21
+ // Middleware
22
+ app.use(cors());
23
+ app.use(bodyParser.json());
24
+ app.use(bodyParser.urlencoded({ extended: true }));
25
+ app.use(express.static('public')); // Serve the embed.js script
26
+
27
+ // Google Sheets Setup
28
+ const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
29
+
30
+ async function getAuth() {
31
+ if (process.env.GOOGLE_CREDENTIALS) {
32
+ // Hosted on Hugging Face: we read the JSON string directly from the secret
33
+ try {
34
+ const credentials = JSON.parse(process.env.GOOGLE_CREDENTIALS);
35
+ const auth = new google.auth.GoogleAuth({
36
+ credentials,
37
+ scopes: SCOPES,
38
+ });
39
+ return auth;
40
+ } catch (e) {
41
+ console.error("Failed to parse GOOGLE_CREDENTIALS secret. Is it valid JSON?", e);
42
+ throw new Error("Invalid Google Credentials Secret");
43
+ }
44
+ } else if (fs.existsSync(process.env.GOOGLE_CREDENTIALS_PATH)) {
45
+ // Local fallback: read from the file
46
+ const auth = new google.auth.GoogleAuth({
47
+ keyFile: process.env.GOOGLE_CREDENTIALS_PATH,
48
+ scopes: SCOPES,
49
+ });
50
+ return auth;
51
+ } else {
52
+ throw new Error('Google Credentials not found. Please set GOOGLE_CREDENTIALS secret or provide a local credentials.json.');
53
+ }
54
+ }
55
+
56
+ // Ensure the Google Sheet ID is configured
57
+ const spreadsheetId = process.env.GOOGLE_SHEET_ID;
58
+
59
+ // API Endpoint to receive form submissions
60
+ app.post('/api/submit', async (req, res) => {
61
+ try {
62
+ const { name, email, message } = req.body;
63
+
64
+ if (!name || !email || !message) {
65
+ return res.status(400).json({ error: 'Name, email, and message are required fields.' });
66
+ }
67
+
68
+ if (!spreadsheetId || spreadsheetId === 'your_google_sheet_id_here') {
69
+ console.error('SERVER SETUP ERROR: GOOGLE_SHEET_ID is not properly configured in .env');
70
+ return res.status(500).json({ error: 'Server configuration error.' });
71
+ }
72
+
73
+ const auth = await getAuth();
74
+ const sheets = google.sheets({ version: 'v4', auth });
75
+
76
+ // Assuming the first sheet is where data goes, and headers are in Row 1.
77
+ // We are going to append to Columns A to D.
78
+ // Wait, the user might not have set up headers, so we just append values.
79
+ const TIMESTAMP = new Date().toISOString();
80
+
81
+ // The range specifies where to append. A simple 'Sheet1' usually works,
82
+ // or just the spreadsheet name. Let's use 'Sheet1!A:D' or just 'A:D'
83
+ const range = 'Sheet1'; // Default sheet name in most English locales
84
+
85
+ const response = await sheets.spreadsheets.values.append({
86
+ spreadsheetId,
87
+ range,
88
+ valueInputOption: 'USER_ENTERED',
89
+ requestBody: {
90
+ values: [[TIMESTAMP, name, email, message]],
91
+ },
92
+ });
93
+
94
+ console.log(`Successfully appended row to sheet: ${response.data.updates.updatedRange}`);
95
+
96
+ // Broadcast the new submission to all connected clients
97
+ io.emit('new_submission', {
98
+ timestamp: TIMESTAMP,
99
+ name,
100
+ email,
101
+ message
102
+ });
103
+
104
+ return res.status(200).json({ success: true, message: 'Form submitted successfully!' });
105
+
106
+ } catch (error) {
107
+ console.error('Error handling form submission:', error);
108
+ if (error.message && (error.message.includes('Credentials file not found') || error.message.includes('Google Credentials not found') || error.message.includes('Invalid Google Credentials'))) {
109
+ return res.status(500).json({ error: 'Server is missing Google Sheets credentials.' });
110
+ }
111
+ return res.status(500).json({ error: 'An error occurred while submitting the form.' });
112
+ }
113
+ });
114
+
115
+ // Socket.IO Connection Handling
116
+ io.on('connection', (socket) => {
117
+ console.log('A client connected for real-time updates:', socket.id);
118
+
119
+ socket.on('disconnect', () => {
120
+ console.log('Client disconnected:', socket.id);
121
+ });
122
+ });
123
+
124
+ // Start the server (changed from app.listen to server.listen for Socket.IO)
125
+ server.listen(port, () => {
126
+ console.log(`Server listening at http://localhost:${port}`);
127
+ console.log(`Test the embeddable form at http://localhost:${port}/index.html`);
128
+ });