Mbonea commited on
Commit
e73587d
·
0 Parent(s):
Files changed (10) hide show
  1. .gitattributes +2 -0
  2. .gitignore +42 -0
  3. .gitpod.yml +11 -0
  4. Dockerfile +20 -0
  5. LICENSE +21 -0
  6. README.md +8 -0
  7. app.js +719 -0
  8. package-lock.json +1566 -0
  9. package.json +26 -0
  10. vercel.json +9 -0
.gitattributes ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ *.ttf filter=lfs diff=lfs merge=lfs -text
2
+ fonts/*.ttf filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+
6
+ # Runtime data
7
+ pids
8
+ *.pid
9
+ *.seed
10
+
11
+ # Directory for instrumented libs generated by jscoverage/JSCover
12
+ lib-cov
13
+
14
+ # Coverage directory used by tools like istanbul
15
+ coverage
16
+
17
+ # nyc test coverage
18
+ .nyc_output
19
+
20
+ # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
21
+ .grunt
22
+
23
+ # node-waf configuration
24
+ .lock-wscript
25
+
26
+ # Compiled binary addons (http://nodejs.org/api/addons.html)
27
+ build/Release
28
+
29
+ # Dependency directories
30
+ node_modules
31
+ jspm_packages
32
+
33
+ # Optional npm cache directory
34
+ .npm
35
+
36
+ # Optional REPL history
37
+ .node_repl_history
38
+
39
+ #jekyll
40
+ _site
41
+ .jekyll-cache
42
+
.gitpod.yml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This configuration file was automatically generated by Gitpod.
2
+ # Please adjust to your needs (see https://www.gitpod.io/docs/introduction/learn-gitpod/gitpod-yaml)
3
+ # and commit this file to your remote git repository to share the goodness with others.
4
+
5
+ # Learn more from ready-to-use templates: https://www.gitpod.io/docs/introduction/getting-started/quickstart
6
+
7
+ tasks:
8
+ - init: npm install && npm run build
9
+ command: npm run start
10
+
11
+
Dockerfile ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use an official Node.js runtime as the base image
2
+ FROM node:18
3
+
4
+ # Set the working directory in the container
5
+ WORKDIR /app
6
+
7
+ # Copy package.json and package-lock.json to the working directory
8
+ COPY package*.json ./
9
+
10
+ # Install application dependencies
11
+ RUN npm install
12
+
13
+ # Copy the rest of the application code to the container
14
+ COPY . .
15
+
16
+ # Expose the port that your Express.js application will listen on
17
+ EXPOSE 3000
18
+
19
+ # Define the command to run your application when the container starts
20
+ CMD ["node", "app.js"]
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Dan Marshall
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: SVGTEXT
3
+ emoji: 🐳
4
+ colorFrom: purple
5
+ colorTo: gray
6
+ sdk: docker
7
+ app_port: 3000
8
+ ---
app.js ADDED
@@ -0,0 +1,719 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const express = require("express");
2
+ const cors = require("cors");
3
+ const opentype = require("opentype.js");
4
+ const makerjs = require("makerjs");
5
+ const wawoff2 = require("wawoff2");
6
+ const xml2js = require("xml2js");
7
+ const axios = require("axios");
8
+ const fs = require("fs").promises;
9
+ const os = require("os");
10
+ const path = require("path");
11
+ const getImageOutline = require("image-outline");
12
+ const Tesseract = require("tesseract.js");
13
+ const app = express();
14
+
15
+ const FormData = require("form-data");
16
+
17
+ class Kolors {
18
+ constructor() {
19
+ this.commonHeaders = {
20
+ accept: "*/*",
21
+ "accept-language": "en-US,en;q=0.9",
22
+ priority: "u=1, i",
23
+ referer: "https://kwai-kolors-kolors.hf.space/?__theme=dark",
24
+ origin: "https://kwai-kolors-kolors.hf.space",
25
+ };
26
+ }
27
+
28
+ async processRequest(method, url, headers = {}, data = null, files = null) {
29
+ const config = {
30
+ method,
31
+ url,
32
+ headers,
33
+ data,
34
+ responseType: "text",
35
+ };
36
+
37
+ if (files) {
38
+ const form = new FormData();
39
+ for (const [name, file] of Object.entries(files)) {
40
+ form.append(name, fs.createReadStream(file.path), {
41
+ filename: file.name,
42
+ contentType: "image/webp",
43
+ });
44
+ }
45
+ config.data = form;
46
+ config.headers = {
47
+ ...headers,
48
+ ...form.getHeaders(),
49
+ };
50
+ } else if (data) {
51
+ config.data = data;
52
+ }
53
+
54
+ try {
55
+ const response = await axios(config);
56
+ console.log(response.status);
57
+ console.log(response.data);
58
+ return response.data;
59
+ } catch (error) {
60
+ console.error("Error in processRequest:", error);
61
+ throw error;
62
+ }
63
+ }
64
+
65
+ async uploadImage(imagePath) {
66
+ const url =
67
+ "https://kwai-kolors-kolors.hf.space/upload?upload_id=uppaw4kwm5";
68
+ const headers = {
69
+ ...this.commonHeaders,
70
+ "content-type": "multipart/form-data",
71
+ };
72
+
73
+ const responseText = await this.processRequest("post", url, headers, null, {
74
+ image: {
75
+ path: imagePath,
76
+ name: "image.webp",
77
+ },
78
+ });
79
+ const filePath = responseText.replace(/[\[\]"\\\n]/g, "");
80
+ return filePath;
81
+ }
82
+
83
+ async getJwtToken() {
84
+ const generateTimestamp = () =>
85
+ encodeURIComponent(new Date().toISOString());
86
+ const url = `https://huggingface.co/api/spaces/Kwai-Kolors/Kolors/jwt?expiration=${generateTimestamp()}`;
87
+ const responseText = await this.processRequest(
88
+ "get",
89
+ url,
90
+ this.commonHeaders
91
+ );
92
+ const responseJson = JSON.parse(responseText);
93
+ return responseJson.token;
94
+ }
95
+
96
+ async getQueueData(sessionHash) {
97
+ const url = `https://kwai-kolors-kolors.hf.space/queue/data?session_hash=${sessionHash}`;
98
+ const headers = {
99
+ ...this.commonHeaders,
100
+ accept: "text/event-stream",
101
+ "content-type": "application/json",
102
+ };
103
+
104
+ try {
105
+ const response = await axios.get(url, {
106
+ headers,
107
+ responseType: "stream",
108
+ });
109
+ return new Promise((resolve, reject) => {
110
+ let timeoutId = setTimeout(() => {
111
+ response.data.destroy(); // Close the stream
112
+ resolve(sessionHash); // Return session_hash if timeout occurs
113
+ }, 3000); // 3 seconds timeout
114
+
115
+ response.data.on("data", (chunk) => {
116
+ const lines = chunk
117
+ .toString()
118
+ .split("\n")
119
+ .filter((line) => line.startsWith("data: "));
120
+ lines.forEach((line) => {
121
+ console.log(line);
122
+ const eventData = line.substring(6);
123
+ const eventJson = JSON.parse(eventData);
124
+ if (eventJson.msg === "process_completed") {
125
+ clearTimeout(timeoutId); // Clear the timeout
126
+ const outputData = eventJson.output?.data || [];
127
+ if (outputData.length > 0) {
128
+ const fileInfo = outputData[0];
129
+ resolve(fileInfo.url);
130
+ response.data.destroy(); // Close the stream
131
+ }
132
+ }
133
+ });
134
+ });
135
+
136
+ response.data.on("end", () => {
137
+ clearTimeout(timeoutId); // Clear the timeout
138
+ reject(new Error("Stream ended without completion"));
139
+ response.data.destroy(); // Close the stream
140
+ });
141
+
142
+ response.data.on("error", (err) => {
143
+ clearTimeout(timeoutId); // Clear the timeout
144
+ reject(err);
145
+ response.data.destroy(); // Close the stream
146
+ });
147
+
148
+ response.data.on("close", () => {
149
+ console.log("Stream closed");
150
+ });
151
+ });
152
+ } catch (error) {
153
+ console.error("Error in getQueueData:", error);
154
+ throw error;
155
+ }
156
+ }
157
+
158
+ async joinQueue(sessionHash, fileUrl, jwtToken, prompt) {
159
+ const url = "https://kwai-kolors-kolors.hf.space/queue/join?__theme=dark";
160
+ const headers = {
161
+ ...this.commonHeaders,
162
+ "content-type": "application/json",
163
+ "x-zerogpu-token": jwtToken,
164
+ origin: "https://kwai-kolors-kolors.hf.space",
165
+ };
166
+
167
+ const data = {
168
+ data: [
169
+ prompt,
170
+ {
171
+ path: fileUrl,
172
+ url: `https://kwai-kolors-kolors.hf.space/file=${fileUrl}`,
173
+ orig_name: "image.webp",
174
+ size: 172602,
175
+ mime_type: "image/webp",
176
+ meta: {
177
+ _type: "gradio.FileData",
178
+ },
179
+ },
180
+ 0.3,
181
+ "",
182
+ 0,
183
+ true,
184
+ 1024,
185
+ 1536,
186
+ 5,
187
+ 25,
188
+ ],
189
+ event_data: null,
190
+ fn_index: 2,
191
+ trigger_id: 26,
192
+ session_hash: sessionHash,
193
+ };
194
+
195
+ const responseText = await this.processRequest("post", url, headers, data);
196
+ return responseText;
197
+ }
198
+
199
+ generateSessionHash() {
200
+ const length = 11;
201
+ const charset =
202
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
203
+ let result = "";
204
+ for (let i = 0; i < length; i++) {
205
+ const randomIndex = Math.floor(Math.random() * charset.length);
206
+ result += charset[randomIndex];
207
+ }
208
+ return result;
209
+ }
210
+ }
211
+ app.use(cors());
212
+ app.use(express.json());
213
+ app.use(express.urlencoded({ extended: true }));
214
+
215
+ // Function to convert polygon data to SVG path
216
+ function polygonToSVGPath(polygon) {
217
+ if (!polygon || polygon.length === 0) {
218
+ return ""; // Return empty string if polygon is invalid
219
+ }
220
+
221
+ // Construct the SVG path string
222
+ let pathString = `M${polygon[0].x},${polygon[0].y}`; // Move to the first point
223
+ for (let i = 1; i < polygon.length; i++) {
224
+ pathString += ` L${polygon[i].x},${polygon[i].y}`; // Line to the next point
225
+ }
226
+ pathString += " Z"; // Close the path
227
+
228
+ return pathString;
229
+ }
230
+
231
+ function handleRequest(err, loadedFont, config) {
232
+ const [
233
+ text,
234
+ fontName,
235
+ size,
236
+ union,
237
+ filled,
238
+ kerning,
239
+ separate,
240
+ bezierAccuracy,
241
+ units,
242
+ fill,
243
+ stroke,
244
+ strokeWidth,
245
+ strokeNonScaling,
246
+ fillRule,
247
+ individualLetters,
248
+ res,
249
+ ] = config;
250
+
251
+ if (err) {
252
+ console.error("Font could not be loaded:", err);
253
+ return res.status(500).json({ error: err.message });
254
+ }
255
+
256
+ if (individualLetters) {
257
+ // Generate individual SVGs for each letter and store them in a JSON object
258
+ const individualSVGs = {};
259
+ for (let i = 0; i < text.length; i++) {
260
+ const letter = text[i];
261
+ const result = callMakerjs(
262
+ loadedFont,
263
+ letter,
264
+ size,
265
+ union,
266
+ filled,
267
+ kerning,
268
+ separate,
269
+ bezierAccuracy,
270
+ units,
271
+ fill,
272
+ stroke,
273
+ strokeWidth,
274
+ strokeNonScaling,
275
+ fillRule
276
+ );
277
+ let temp;
278
+ xml2js.parseString(
279
+ result.svg,
280
+ {
281
+ explicitArray: false,
282
+ },
283
+ function (err, result) {
284
+ if (!err) {
285
+ // Now 'result' contains the JSON representation of the SVG
286
+ temp = result;
287
+ } else {
288
+ console.error(err);
289
+ }
290
+ }
291
+ );
292
+
293
+ individualSVGs[letter] = temp;
294
+ }
295
+ res.status(200).json(individualSVGs); // Return JSON object
296
+ } else {
297
+ // Generate a single SVG for the entire text
298
+ const result = callMakerjs(
299
+ loadedFont,
300
+ text,
301
+ size,
302
+ union,
303
+ filled,
304
+ kerning,
305
+ separate,
306
+ bezierAccuracy,
307
+ units,
308
+ fill,
309
+ stroke,
310
+ strokeWidth,
311
+ strokeNonScaling,
312
+ fillRule
313
+ );
314
+ res.status(200).send(result.svg);
315
+ }
316
+ }
317
+
318
+ async function downloadAndSaveFont(fontUrl) {
319
+ const tempDir = path.join(os.tmpdir(), "downloaded-or-converted-fonts");
320
+
321
+ try {
322
+ await fs.access(tempDir);
323
+ } catch (error) {
324
+ await fs.mkdir(tempDir, { recursive: true });
325
+ }
326
+
327
+ try {
328
+ const response = await axios.get(fontUrl, {
329
+ responseType: "arraybuffer",
330
+ headers: {
331
+ "Accept-Encoding": "identity",
332
+ },
333
+ });
334
+
335
+ let filename =
336
+ response.headers["content-disposition"]?.match(
337
+ /filename=['"]?(.+)['"]?/
338
+ )?.[1] || new URL(fontUrl).pathname.split("/").pop();
339
+
340
+ const fontPath = path.join(tempDir, filename);
341
+ await fs.writeFile(fontPath, response.data);
342
+
343
+ // Check if the file needs to be decompressed from WOFF2 to TTF
344
+ if (filename.endsWith(".woff2")) {
345
+ try {
346
+ const fontBuffer = await fs.readFile(fontPath);
347
+ const decompressedBuffer = await wawoff2.decompress(fontBuffer);
348
+ const ttfFilename = filename.replace(".woff2", ".ttf");
349
+ const ttfFontPath = path.join(tempDir, ttfFilename);
350
+ await fs.writeFile(ttfFontPath, decompressedBuffer);
351
+ console.log("Font decompressed and saved successfully.");
352
+ return ttfFontPath;
353
+ } catch (decompressionError) {
354
+ console.error("Error decompressing the font:", decompressionError);
355
+ throw decompressionError;
356
+ }
357
+ }
358
+
359
+ return fontPath;
360
+ } catch (error) {
361
+ console.error("Error processing the font:", error);
362
+ throw error;
363
+ }
364
+ }
365
+
366
+ function callMakerjs(
367
+ font,
368
+ text,
369
+ size,
370
+ union,
371
+ filled,
372
+ kerning,
373
+ separate,
374
+ bezierAccuracy,
375
+ units,
376
+ fill,
377
+ stroke,
378
+ strokeWidth,
379
+ strokeNonScaling,
380
+ fillRule
381
+ ) {
382
+ // Generate the text using a font
383
+ var textModel = new makerjs.models.Text(
384
+ font,
385
+ text,
386
+ size,
387
+ union,
388
+ false,
389
+ bezierAccuracy,
390
+ { kerning }
391
+ );
392
+
393
+ if (separate) {
394
+ for (var i in textModel.models) {
395
+ textModel.models[i].layer = i;
396
+ }
397
+ }
398
+
399
+ var svg = makerjs.exporter.toSVG(textModel, {
400
+ fill: filled ? fill : undefined,
401
+ stroke: stroke ? stroke : undefined,
402
+ strokeWidth: strokeWidth ? strokeWidth : undefined,
403
+ fillRule: fillRule ? fillRule : undefined,
404
+ scalingStroke: !strokeNonScaling,
405
+ });
406
+
407
+ var dxf = makerjs.exporter.toDXF(textModel, {
408
+ units: units,
409
+ usePOLYLINE: true,
410
+ });
411
+
412
+ return { svg, dxf };
413
+ }
414
+
415
+ // Helper function to download an image from a URL
416
+ async function downloadImage(url, dest) {
417
+ const writer = await fs.open(dest, "w");
418
+ const response = await axios.get(url, { responseType: "stream" });
419
+
420
+ await new Promise((resolve, reject) => {
421
+ response.data.pipe(writer.createWriteStream());
422
+ response.data.on("end", resolve);
423
+ response.data.on("error", reject);
424
+ });
425
+
426
+ await writer.close();
427
+ }
428
+
429
+ // API Endpoint
430
+ app.post("/highlight", express.json(), async (req, res) => {
431
+ const { imageUrl, searchTerms } = req.body;
432
+
433
+ if (!imageUrl || !Array.isArray(searchTerms) || searchTerms.length === 0) {
434
+ return res
435
+ .status(400)
436
+ .json({ error: "imageUrl and searchTerms are required" });
437
+ }
438
+
439
+ try {
440
+ // Download the image
441
+ const tempImagePath = path.join(__dirname, "temp_image.jpg");
442
+ await downloadImage(imageUrl, tempImagePath);
443
+
444
+ // Run OCR
445
+ const {
446
+ data: { text, words },
447
+ } = await Tesseract.recognize(tempImagePath, "eng", {
448
+ logger: (info) => console.log(info), // Optional: log OCR progress
449
+ });
450
+
451
+ const highlights = [];
452
+
453
+ // Search for each term
454
+ searchTerms.forEach((term) => {
455
+ const termWords = term.toLowerCase().split(" ");
456
+ const termLen = termWords.length;
457
+
458
+ let wordIndex = 0;
459
+
460
+ words.forEach((wordObj, i) => {
461
+ const word = wordObj.text?.toLowerCase();
462
+ if (!word) return;
463
+
464
+ if (word === termWords[wordIndex]) {
465
+ wordIndex++;
466
+
467
+ // If all words match
468
+ if (wordIndex === termLen) {
469
+ wordIndex = 0;
470
+
471
+ // Get bounding box
472
+ const xStart = words[i - termLen + 1].bbox.x0;
473
+ const yStart = words[i - termLen + 1].bbox.y0;
474
+ const xEnd = words[i].bbox.x1;
475
+ const yEnd = words[i].bbox.y1;
476
+
477
+ highlights.push({
478
+ text: term,
479
+ bbox: { x0: xStart, y0: yStart, x1: xEnd, y1: yEnd },
480
+ });
481
+ }
482
+ } else {
483
+ wordIndex = 0; // Reset if match breaks
484
+ }
485
+ });
486
+ });
487
+
488
+ // Clean up the temporary image
489
+ await fs.unlink(tempImagePath);
490
+
491
+ // Respond with highlights
492
+ return res.json({ searchTerms, highlights });
493
+ } catch (error) {
494
+ console.error(error);
495
+ return res
496
+ .status(500)
497
+ .json({ error: "An error occurred while processing the image." });
498
+ }
499
+ });
500
+
501
+ app.get("/process", async (req, res) => {
502
+ const kolors = new Kolors();
503
+ try {
504
+ const fileUrl =
505
+ "/tmp/gradio/a8afacda04e05001682bb475f128b24002ace7b7/e41b87fb-4cc3-43cd-a6e6-f3dbb08c2399.webp";
506
+ const prompt =
507
+ req.query.prompt ||
508
+ "Anna, 破旧衣服, 大声喊叫的愤怒脸, 嘴巴张大, 全身, 贫民窟背景, 仙女教母, 时尚TikTok风格衣服, 出现在闪亮和点赞的云中, 脸上带着炫酷的表情, 魔法棒, 变成华丽舞会礼服, 鱼网袜和蕾丝项圈, 震惊表情, 这幅艺术作品致敬了传奇的弗兰克·弗拉泽塔,展示了Loish van Baarle的独特风格和Boris Vallejo的动态笔触。这幅杰作向著名艺术家Ross Tran、Greg Tocchini、Tom Bagshaw和Steve Henderson的才华致敬,创造了一个引人入胜且迷人的场景。";
509
+ const sessionHash = req.query.session_hash || kolors.generateSessionHash();
510
+ // Step 1: Get JWT token
511
+ const jwtToken = await kolors.getJwtToken();
512
+ console.log("JWT Token:", jwtToken);
513
+
514
+ // Step 2: Join the queue
515
+ const queueResponse = await kolors.joinQueue(
516
+ sessionHash,
517
+ fileUrl,
518
+ jwtToken,
519
+ prompt
520
+ );
521
+ console.log("Queue Response:", queueResponse);
522
+
523
+ res.send({ sessionHash });
524
+ } catch (error) {
525
+ console.error("Error:", error);
526
+ res.status(500).send("An error occurred");
527
+ }
528
+ });
529
+
530
+ app.get("/poll", async (req, res) => {
531
+ const kolors = new Kolors();
532
+ try {
533
+ const sessionHash = req.query.session_hash;
534
+ if (!sessionHash) {
535
+ return res.status(400).send("session_hash is required");
536
+ }
537
+
538
+ const finalUrl = await kolors.getQueueData(sessionHash);
539
+ console.log("Final URL:", finalUrl);
540
+
541
+ res.send({ finalUrl });
542
+ } catch (error) {
543
+ console.error("Error:", error);
544
+ res.status(500).send("An error occurred");
545
+ }
546
+ });
547
+
548
+ app.post("/generateSVGPath", async (req, res) => {
549
+ // Set default values
550
+ const {
551
+ text,
552
+ size = 72, // Default font size
553
+ union = false,
554
+ filled = true,
555
+ kerning = true,
556
+ separate = false,
557
+ bezierAccuracy = 2,
558
+ units = "mm", // Default units
559
+ fill = "black", // Default fill color
560
+ stroke = "none", // Default stroke color
561
+ strokeWidth = "1", // Default stroke width
562
+ strokeNonScaling = false,
563
+ fillRule = "nonzero", // Default fill rule
564
+ fontUrl,
565
+ individualLetters = false,
566
+ font = "Roobert-Regular.ttf", // Default local font
567
+ } = req.body;
568
+
569
+ const config = [
570
+ text,
571
+ font,
572
+ size,
573
+ union,
574
+ filled,
575
+ kerning,
576
+ separate,
577
+ bezierAccuracy,
578
+ units,
579
+ fill,
580
+ stroke,
581
+ strokeWidth,
582
+ strokeNonScaling,
583
+ fillRule,
584
+ individualLetters,
585
+ res,
586
+ ];
587
+
588
+ const fontPath = fontUrl
589
+ ? await downloadAndSaveFont(fontUrl)
590
+ : path.join(__dirname, "public", "fonts", font);
591
+ console.log(fontPath);
592
+ try {
593
+ await fs.access(fontPath);
594
+ console.log("File exists:", fontPath);
595
+ } catch (error) {
596
+ console.log(fontPath);
597
+ res.status(500).json({ error: error.message });
598
+ // Handle the error or throw it
599
+ }
600
+ opentype.load(fontPath, (err, loadedFont) => {
601
+ handleRequest(err, loadedFont, config);
602
+ });
603
+ });
604
+
605
+ app.post("/generateSVGPathWithGoogleFont", async (req, res) => {
606
+ // Default values for parameters
607
+ const {
608
+ text,
609
+ fontName = "Open Sans", // Default Google Font
610
+ size = 72, // Default font size
611
+ union = false, // Default union
612
+ filled = true, // Default filled
613
+ kerning = true, // Default kerning
614
+ separate = false, // Default separate
615
+ bezierAccuracy = 2, // Default bezierAccuracy
616
+ units = "mm", // Default units
617
+ fill = "black", // Default fill color
618
+ stroke = "none", // Default stroke
619
+ strokeWidth = "1", // Default stroke width
620
+ strokeNonScaling = false, // Default strokeNonScaling
621
+ fillRule = "nonzero", // Default fillRule
622
+ individualLetters = false,
623
+ } = req.body;
624
+ const config = [
625
+ text,
626
+ fontName,
627
+ size,
628
+ union,
629
+ filled,
630
+ kerning,
631
+ separate,
632
+ bezierAccuracy,
633
+ units,
634
+ fill,
635
+ stroke,
636
+ strokeWidth,
637
+ strokeNonScaling,
638
+ fillRule,
639
+ individualLetters,
640
+ res,
641
+ ];
642
+ const apiKey = "AIzaSyAOES8EmKhuJEnsn9kS1XKBpxxp-TgN8Jc"; // Use environment variable for API key
643
+
644
+ try {
645
+ // Fetch the list of fonts from Google Fonts API
646
+ const response = await axios.get(
647
+ `https://www.googleapis.com/webfonts/v1/webfonts?key=${apiKey}`
648
+ );
649
+ const fonts = response.data.items;
650
+
651
+ // Find the font with the given name
652
+ const fontDetails = fonts.find((f) => f.family === fontName);
653
+ if (!fontDetails) {
654
+ return res.status(404).send("Font not found");
655
+ }
656
+
657
+ // Load the font using opentype.js
658
+ let fontUrl = fontDetails.files.regular; // Adjust based on font variants if needed
659
+ fontUrl = fontUrl.replace("http", "https");
660
+ const fontPath = await downloadAndSaveFont(fontUrl);
661
+
662
+ opentype.load(fontPath, (err, loadedFont) => {
663
+ handleRequest(err, loadedFont, config);
664
+ });
665
+ } catch (error) {
666
+ console.error("Error:", error);
667
+ res.status(500).json({ error: error.message });
668
+ }
669
+ });
670
+
671
+ app.post("/predictions", async (req, res) => {
672
+ const { input, path } = req.body;
673
+ const headers = {
674
+ "Content-Type": "application/json",
675
+ // Add any other headers here
676
+ };
677
+ const data = {
678
+ input: input,
679
+ is_training: false,
680
+ create_model: "0",
681
+ stream: false,
682
+ };
683
+ try {
684
+ const response = await axios.post(
685
+ `https://replicate.com/api/${path}/predictions`,
686
+ data,
687
+ { headers }
688
+ );
689
+ return res.json(response.data);
690
+ } catch (error) {
691
+ console.error("Error:", error);
692
+ return res.status(500).json({ error: error.message });
693
+ }
694
+ });
695
+
696
+ // Route handler for /vectorize
697
+ app.post("/vectorize", (req, res) => {
698
+ const { imageUrl } = req.body;
699
+ // Extract imageUrl from request body
700
+
701
+ // Call getImageOutline to get the polygon data
702
+ getImageOutline(imageUrl, function (err, polygon) {
703
+ if (err) {
704
+ console.error("Error:", err);
705
+ return res.status(500).json({ error: "Error vectorizing image" });
706
+ }
707
+
708
+ // Convert polygon data to SVG path
709
+ const svgPath = polygonToSVGPath(polygon);
710
+
711
+ // Send the SVG path back to the client as JSON
712
+ res.json({ svgPath });
713
+ });
714
+ });
715
+
716
+ const PORT = process.env.PORT || 3000;
717
+ app.listen(PORT, () => {
718
+ console.log(`Server running on port ${PORT}`);
719
+ });
package-lock.json ADDED
@@ -0,0 +1,1566 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "SVGMAKER",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "SVGMAKER",
9
+ "version": "1.0.0",
10
+ "license": "MIT",
11
+ "dependencies": {
12
+ "axios": "^1.6.5",
13
+ "cors": "^2.8.5",
14
+ "express": "^4.18.2",
15
+ "image-outline": "^0.1.0",
16
+ "makerjs": "^0.9.71",
17
+ "nomnom": "^1.8.1",
18
+ "opentype.js": "1.3.4",
19
+ "tesseract.js": "^5.1.1",
20
+ "wawoff2": "^2.0.1",
21
+ "xml2js": "^0.6.2"
22
+ },
23
+ "devDependencies": {
24
+ "typescript": "2.5.2"
25
+ }
26
+ },
27
+ "node_modules/@types/bezier-js": {
28
+ "version": "0.0.6",
29
+ "resolved": "https://registry.npmjs.org/@types/bezier-js/-/bezier-js-0.0.6.tgz",
30
+ "integrity": "sha512-kXsAlt8e8N6zt9R6LcMYWB1HkBw3q2g+M9BdI/UE+s4agIONuIscQaRCoInH22+Jas3rw8yLUehL2InaZjyNSA=="
31
+ },
32
+ "node_modules/@types/node": {
33
+ "version": "14.0.1",
34
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz",
35
+ "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA=="
36
+ },
37
+ "node_modules/@types/opentype.js": {
38
+ "version": "0.0.0",
39
+ "resolved": "https://registry.npmjs.org/@types/opentype.js/-/opentype.js-0.0.0.tgz",
40
+ "integrity": "sha512-TivKn8w37v7i/UURRL7Q/3s3b5Fojzpa4dlNytI3VSXXjFwepueOzq83SLSTnSHr+eHZy06gtzzaRA0a+udIwg=="
41
+ },
42
+ "node_modules/@types/pdfkit": {
43
+ "version": "0.7.36",
44
+ "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.7.36.tgz",
45
+ "integrity": "sha512-9eRA6MuW+n78yU3HhoIrDxjyAX2++B5MpLDYqHOnaRTquCw+5sYXT+QN8E1eSaxvNUwlRfU3tOm4UzTeGWmBqg==",
46
+ "dependencies": {
47
+ "@types/node": "*"
48
+ }
49
+ },
50
+ "node_modules/accepts": {
51
+ "version": "1.3.8",
52
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
53
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
54
+ "dependencies": {
55
+ "mime-types": "~2.1.34",
56
+ "negotiator": "0.6.3"
57
+ },
58
+ "engines": {
59
+ "node": ">= 0.6"
60
+ }
61
+ },
62
+ "node_modules/ajv": {
63
+ "version": "6.12.6",
64
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
65
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
66
+ "dependencies": {
67
+ "fast-deep-equal": "^3.1.1",
68
+ "fast-json-stable-stringify": "^2.0.0",
69
+ "json-schema-traverse": "^0.4.1",
70
+ "uri-js": "^4.2.2"
71
+ },
72
+ "funding": {
73
+ "type": "github",
74
+ "url": "https://github.com/sponsors/epoberezkin"
75
+ }
76
+ },
77
+ "node_modules/ansi-styles": {
78
+ "version": "1.0.0",
79
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
80
+ "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==",
81
+ "engines": {
82
+ "node": ">=0.8.0"
83
+ }
84
+ },
85
+ "node_modules/argparse": {
86
+ "version": "2.0.1",
87
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
88
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
89
+ },
90
+ "node_modules/array-flatten": {
91
+ "version": "1.1.1",
92
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
93
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
94
+ },
95
+ "node_modules/asn1": {
96
+ "version": "0.2.6",
97
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
98
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
99
+ "dependencies": {
100
+ "safer-buffer": "~2.1.0"
101
+ }
102
+ },
103
+ "node_modules/assert-plus": {
104
+ "version": "1.0.0",
105
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
106
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
107
+ "engines": {
108
+ "node": ">=0.8"
109
+ }
110
+ },
111
+ "node_modules/asynckit": {
112
+ "version": "0.4.0",
113
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
114
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
115
+ },
116
+ "node_modules/aws-sign2": {
117
+ "version": "0.7.0",
118
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
119
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
120
+ "engines": {
121
+ "node": "*"
122
+ }
123
+ },
124
+ "node_modules/aws4": {
125
+ "version": "1.12.0",
126
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
127
+ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
128
+ },
129
+ "node_modules/axios": {
130
+ "version": "1.6.5",
131
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz",
132
+ "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==",
133
+ "dependencies": {
134
+ "follow-redirects": "^1.15.4",
135
+ "form-data": "^4.0.0",
136
+ "proxy-from-env": "^1.1.0"
137
+ }
138
+ },
139
+ "node_modules/bcrypt-pbkdf": {
140
+ "version": "1.0.2",
141
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
142
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
143
+ "dependencies": {
144
+ "tweetnacl": "^0.14.3"
145
+ }
146
+ },
147
+ "node_modules/bezier-js": {
148
+ "version": "2.6.1",
149
+ "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.6.1.tgz",
150
+ "integrity": "sha512-jelZM33eNzcZ9snJ/5HqJLw3IzXvA8RFcBjkdOB8SDYyOvW8Y2tTosojAiBTnD1MhbHoWUYNbxUXxBl61TxbRg=="
151
+ },
152
+ "node_modules/bmp-js": {
153
+ "version": "0.1.0",
154
+ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
155
+ "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==",
156
+ "license": "MIT"
157
+ },
158
+ "node_modules/body-parser": {
159
+ "version": "1.20.1",
160
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
161
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
162
+ "dependencies": {
163
+ "bytes": "3.1.2",
164
+ "content-type": "~1.0.4",
165
+ "debug": "2.6.9",
166
+ "depd": "2.0.0",
167
+ "destroy": "1.2.0",
168
+ "http-errors": "2.0.0",
169
+ "iconv-lite": "0.4.24",
170
+ "on-finished": "2.4.1",
171
+ "qs": "6.11.0",
172
+ "raw-body": "2.5.1",
173
+ "type-is": "~1.6.18",
174
+ "unpipe": "1.0.0"
175
+ },
176
+ "engines": {
177
+ "node": ">= 0.8",
178
+ "npm": "1.2.8000 || >= 1.4.16"
179
+ }
180
+ },
181
+ "node_modules/body-parser/node_modules/debug": {
182
+ "version": "2.6.9",
183
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
184
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
185
+ "dependencies": {
186
+ "ms": "2.0.0"
187
+ }
188
+ },
189
+ "node_modules/body-parser/node_modules/iconv-lite": {
190
+ "version": "0.4.24",
191
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
192
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
193
+ "dependencies": {
194
+ "safer-buffer": ">= 2.1.2 < 3"
195
+ },
196
+ "engines": {
197
+ "node": ">=0.10.0"
198
+ }
199
+ },
200
+ "node_modules/body-parser/node_modules/ms": {
201
+ "version": "2.0.0",
202
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
203
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
204
+ },
205
+ "node_modules/bytes": {
206
+ "version": "3.1.2",
207
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
208
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
209
+ "engines": {
210
+ "node": ">= 0.8"
211
+ }
212
+ },
213
+ "node_modules/call-bind": {
214
+ "version": "1.0.2",
215
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
216
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
217
+ "dependencies": {
218
+ "function-bind": "^1.1.1",
219
+ "get-intrinsic": "^1.0.2"
220
+ },
221
+ "funding": {
222
+ "url": "https://github.com/sponsors/ljharb"
223
+ }
224
+ },
225
+ "node_modules/caseless": {
226
+ "version": "0.12.0",
227
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
228
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
229
+ },
230
+ "node_modules/chalk": {
231
+ "version": "0.4.0",
232
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
233
+ "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==",
234
+ "dependencies": {
235
+ "ansi-styles": "~1.0.0",
236
+ "has-color": "~0.1.0",
237
+ "strip-ansi": "~0.1.0"
238
+ },
239
+ "engines": {
240
+ "node": ">=0.8.0"
241
+ }
242
+ },
243
+ "node_modules/clone": {
244
+ "version": "1.0.4",
245
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
246
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
247
+ "engines": {
248
+ "node": ">=0.8"
249
+ }
250
+ },
251
+ "node_modules/combined-stream": {
252
+ "version": "1.0.8",
253
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
254
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
255
+ "dependencies": {
256
+ "delayed-stream": "~1.0.0"
257
+ },
258
+ "engines": {
259
+ "node": ">= 0.8"
260
+ }
261
+ },
262
+ "node_modules/content-disposition": {
263
+ "version": "0.5.4",
264
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
265
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
266
+ "dependencies": {
267
+ "safe-buffer": "5.2.1"
268
+ },
269
+ "engines": {
270
+ "node": ">= 0.6"
271
+ }
272
+ },
273
+ "node_modules/content-type": {
274
+ "version": "1.0.5",
275
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
276
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
277
+ "engines": {
278
+ "node": ">= 0.6"
279
+ }
280
+ },
281
+ "node_modules/cookie": {
282
+ "version": "0.5.0",
283
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
284
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
285
+ "engines": {
286
+ "node": ">= 0.6"
287
+ }
288
+ },
289
+ "node_modules/cookie-signature": {
290
+ "version": "1.0.6",
291
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
292
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
293
+ },
294
+ "node_modules/core-util-is": {
295
+ "version": "1.0.2",
296
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
297
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
298
+ },
299
+ "node_modules/cors": {
300
+ "version": "2.8.5",
301
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
302
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
303
+ "dependencies": {
304
+ "object-assign": "^4",
305
+ "vary": "^1"
306
+ },
307
+ "engines": {
308
+ "node": ">= 0.10"
309
+ }
310
+ },
311
+ "node_modules/cwise-compiler": {
312
+ "version": "1.1.3",
313
+ "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz",
314
+ "integrity": "sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==",
315
+ "dependencies": {
316
+ "uniq": "^1.0.0"
317
+ }
318
+ },
319
+ "node_modules/dashdash": {
320
+ "version": "1.14.1",
321
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
322
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
323
+ "dependencies": {
324
+ "assert-plus": "^1.0.0"
325
+ },
326
+ "engines": {
327
+ "node": ">=0.10"
328
+ }
329
+ },
330
+ "node_modules/data-uri-to-buffer": {
331
+ "version": "0.0.3",
332
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz",
333
+ "integrity": "sha512-Cp+jOa8QJef5nXS5hU7M1DWzXPEIoVR3kbV0dQuVGwROZg8bGf1DcCnkmajBTnvghTtSNMUdRrPjgaT6ZQucbw=="
334
+ },
335
+ "node_modules/delayed-stream": {
336
+ "version": "1.0.0",
337
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
338
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
339
+ "engines": {
340
+ "node": ">=0.4.0"
341
+ }
342
+ },
343
+ "node_modules/depd": {
344
+ "version": "2.0.0",
345
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
346
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
347
+ "engines": {
348
+ "node": ">= 0.8"
349
+ }
350
+ },
351
+ "node_modules/destroy": {
352
+ "version": "1.2.0",
353
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
354
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
355
+ "engines": {
356
+ "node": ">= 0.8",
357
+ "npm": "1.2.8000 || >= 1.4.16"
358
+ }
359
+ },
360
+ "node_modules/distance-to-line-segment": {
361
+ "version": "0.2.0",
362
+ "resolved": "https://registry.npmjs.org/distance-to-line-segment/-/distance-to-line-segment-0.2.0.tgz",
363
+ "integrity": "sha512-uezDzNWAl5ZaOlvH8LLtzP7enXv9o/vtA8xJ6QPuPYmIree6VIsY/SLOsPWq+v9lVpNpdRrd8bph2gVVjngo5Q=="
364
+ },
365
+ "node_modules/ecc-jsbn": {
366
+ "version": "0.1.2",
367
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
368
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
369
+ "dependencies": {
370
+ "jsbn": "~0.1.0",
371
+ "safer-buffer": "^2.1.0"
372
+ }
373
+ },
374
+ "node_modules/ee-first": {
375
+ "version": "1.1.1",
376
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
377
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
378
+ },
379
+ "node_modules/encodeurl": {
380
+ "version": "1.0.2",
381
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
382
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
383
+ "engines": {
384
+ "node": ">= 0.8"
385
+ }
386
+ },
387
+ "node_modules/escape-html": {
388
+ "version": "1.0.3",
389
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
390
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
391
+ },
392
+ "node_modules/etag": {
393
+ "version": "1.8.1",
394
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
395
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
396
+ "engines": {
397
+ "node": ">= 0.6"
398
+ }
399
+ },
400
+ "node_modules/express": {
401
+ "version": "4.18.2",
402
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
403
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
404
+ "dependencies": {
405
+ "accepts": "~1.3.8",
406
+ "array-flatten": "1.1.1",
407
+ "body-parser": "1.20.1",
408
+ "content-disposition": "0.5.4",
409
+ "content-type": "~1.0.4",
410
+ "cookie": "0.5.0",
411
+ "cookie-signature": "1.0.6",
412
+ "debug": "2.6.9",
413
+ "depd": "2.0.0",
414
+ "encodeurl": "~1.0.2",
415
+ "escape-html": "~1.0.3",
416
+ "etag": "~1.8.1",
417
+ "finalhandler": "1.2.0",
418
+ "fresh": "0.5.2",
419
+ "http-errors": "2.0.0",
420
+ "merge-descriptors": "1.0.1",
421
+ "methods": "~1.1.2",
422
+ "on-finished": "2.4.1",
423
+ "parseurl": "~1.3.3",
424
+ "path-to-regexp": "0.1.7",
425
+ "proxy-addr": "~2.0.7",
426
+ "qs": "6.11.0",
427
+ "range-parser": "~1.2.1",
428
+ "safe-buffer": "5.2.1",
429
+ "send": "0.18.0",
430
+ "serve-static": "1.15.0",
431
+ "setprototypeof": "1.2.0",
432
+ "statuses": "2.0.1",
433
+ "type-is": "~1.6.18",
434
+ "utils-merge": "1.0.1",
435
+ "vary": "~1.1.2"
436
+ },
437
+ "engines": {
438
+ "node": ">= 0.10.0"
439
+ }
440
+ },
441
+ "node_modules/express/node_modules/debug": {
442
+ "version": "2.6.9",
443
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
444
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
445
+ "dependencies": {
446
+ "ms": "2.0.0"
447
+ }
448
+ },
449
+ "node_modules/express/node_modules/ms": {
450
+ "version": "2.0.0",
451
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
452
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
453
+ },
454
+ "node_modules/extend": {
455
+ "version": "3.0.2",
456
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
457
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
458
+ },
459
+ "node_modules/extsprintf": {
460
+ "version": "1.3.0",
461
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
462
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
463
+ "engines": [
464
+ "node >=0.6.0"
465
+ ]
466
+ },
467
+ "node_modules/fast-deep-equal": {
468
+ "version": "3.1.3",
469
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
470
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
471
+ },
472
+ "node_modules/fast-json-stable-stringify": {
473
+ "version": "2.1.0",
474
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
475
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
476
+ },
477
+ "node_modules/finalhandler": {
478
+ "version": "1.2.0",
479
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
480
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
481
+ "dependencies": {
482
+ "debug": "2.6.9",
483
+ "encodeurl": "~1.0.2",
484
+ "escape-html": "~1.0.3",
485
+ "on-finished": "2.4.1",
486
+ "parseurl": "~1.3.3",
487
+ "statuses": "2.0.1",
488
+ "unpipe": "~1.0.0"
489
+ },
490
+ "engines": {
491
+ "node": ">= 0.8"
492
+ }
493
+ },
494
+ "node_modules/finalhandler/node_modules/debug": {
495
+ "version": "2.6.9",
496
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
497
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
498
+ "dependencies": {
499
+ "ms": "2.0.0"
500
+ }
501
+ },
502
+ "node_modules/finalhandler/node_modules/ms": {
503
+ "version": "2.0.0",
504
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
505
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
506
+ },
507
+ "node_modules/follow-redirects": {
508
+ "version": "1.15.5",
509
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
510
+ "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
511
+ "funding": [
512
+ {
513
+ "type": "individual",
514
+ "url": "https://github.com/sponsors/RubenVerborgh"
515
+ }
516
+ ],
517
+ "engines": {
518
+ "node": ">=4.0"
519
+ },
520
+ "peerDependenciesMeta": {
521
+ "debug": {
522
+ "optional": true
523
+ }
524
+ }
525
+ },
526
+ "node_modules/forever-agent": {
527
+ "version": "0.6.1",
528
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
529
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
530
+ "engines": {
531
+ "node": "*"
532
+ }
533
+ },
534
+ "node_modules/form-data": {
535
+ "version": "4.0.0",
536
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
537
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
538
+ "dependencies": {
539
+ "asynckit": "^0.4.0",
540
+ "combined-stream": "^1.0.8",
541
+ "mime-types": "^2.1.12"
542
+ },
543
+ "engines": {
544
+ "node": ">= 6"
545
+ }
546
+ },
547
+ "node_modules/forwarded": {
548
+ "version": "0.2.0",
549
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
550
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
551
+ "engines": {
552
+ "node": ">= 0.6"
553
+ }
554
+ },
555
+ "node_modules/fresh": {
556
+ "version": "0.5.2",
557
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
558
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
559
+ "engines": {
560
+ "node": ">= 0.6"
561
+ }
562
+ },
563
+ "node_modules/function-bind": {
564
+ "version": "1.1.1",
565
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
566
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
567
+ },
568
+ "node_modules/get-intrinsic": {
569
+ "version": "1.1.2",
570
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
571
+ "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
572
+ "dependencies": {
573
+ "function-bind": "^1.1.1",
574
+ "has": "^1.0.3",
575
+ "has-symbols": "^1.0.3"
576
+ },
577
+ "funding": {
578
+ "url": "https://github.com/sponsors/ljharb"
579
+ }
580
+ },
581
+ "node_modules/get-pixels": {
582
+ "version": "3.3.3",
583
+ "resolved": "https://registry.npmjs.org/get-pixels/-/get-pixels-3.3.3.tgz",
584
+ "integrity": "sha512-5kyGBn90i9tSMUVHTqkgCHsoWoR+/lGbl4yC83Gefyr0HLIhgSWEx/2F/3YgsZ7UpYNuM6pDhDK7zebrUJ5nXg==",
585
+ "dependencies": {
586
+ "data-uri-to-buffer": "0.0.3",
587
+ "jpeg-js": "^0.4.1",
588
+ "mime-types": "^2.0.1",
589
+ "ndarray": "^1.0.13",
590
+ "ndarray-pack": "^1.1.1",
591
+ "node-bitmap": "0.0.1",
592
+ "omggif": "^1.0.5",
593
+ "parse-data-uri": "^0.2.0",
594
+ "pngjs": "^3.3.3",
595
+ "request": "^2.44.0",
596
+ "through": "^2.3.4"
597
+ }
598
+ },
599
+ "node_modules/getpass": {
600
+ "version": "0.1.7",
601
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
602
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
603
+ "dependencies": {
604
+ "assert-plus": "^1.0.0"
605
+ }
606
+ },
607
+ "node_modules/graham_scan": {
608
+ "version": "1.0.4",
609
+ "resolved": "https://registry.npmjs.org/graham_scan/-/graham_scan-1.0.4.tgz",
610
+ "integrity": "sha1-OZZR3R+DU+GID1nqjl+Uud9Mkoo="
611
+ },
612
+ "node_modules/har-schema": {
613
+ "version": "2.0.0",
614
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
615
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
616
+ "engines": {
617
+ "node": ">=4"
618
+ }
619
+ },
620
+ "node_modules/har-validator": {
621
+ "version": "5.1.5",
622
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
623
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
624
+ "deprecated": "this library is no longer supported",
625
+ "dependencies": {
626
+ "ajv": "^6.12.3",
627
+ "har-schema": "^2.0.0"
628
+ },
629
+ "engines": {
630
+ "node": ">=6"
631
+ }
632
+ },
633
+ "node_modules/has": {
634
+ "version": "1.0.3",
635
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
636
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
637
+ "dependencies": {
638
+ "function-bind": "^1.1.1"
639
+ },
640
+ "engines": {
641
+ "node": ">= 0.4.0"
642
+ }
643
+ },
644
+ "node_modules/has-color": {
645
+ "version": "0.1.7",
646
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
647
+ "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==",
648
+ "engines": {
649
+ "node": ">=0.10.0"
650
+ }
651
+ },
652
+ "node_modules/has-symbols": {
653
+ "version": "1.0.3",
654
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
655
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
656
+ "engines": {
657
+ "node": ">= 0.4"
658
+ },
659
+ "funding": {
660
+ "url": "https://github.com/sponsors/ljharb"
661
+ }
662
+ },
663
+ "node_modules/http-errors": {
664
+ "version": "2.0.0",
665
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
666
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
667
+ "dependencies": {
668
+ "depd": "2.0.0",
669
+ "inherits": "2.0.4",
670
+ "setprototypeof": "1.2.0",
671
+ "statuses": "2.0.1",
672
+ "toidentifier": "1.0.1"
673
+ },
674
+ "engines": {
675
+ "node": ">= 0.8"
676
+ }
677
+ },
678
+ "node_modules/http-signature": {
679
+ "version": "1.2.0",
680
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
681
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
682
+ "dependencies": {
683
+ "assert-plus": "^1.0.0",
684
+ "jsprim": "^1.2.2",
685
+ "sshpk": "^1.7.0"
686
+ },
687
+ "engines": {
688
+ "node": ">=0.8",
689
+ "npm": ">=1.3.7"
690
+ }
691
+ },
692
+ "node_modules/idb-keyval": {
693
+ "version": "6.2.1",
694
+ "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz",
695
+ "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==",
696
+ "license": "Apache-2.0"
697
+ },
698
+ "node_modules/image-outline": {
699
+ "version": "0.1.0",
700
+ "resolved": "https://registry.npmjs.org/image-outline/-/image-outline-0.1.0.tgz",
701
+ "integrity": "sha512-p9G3J95nk8zK3stvKQe0vkS6g+bKeNpdvS9dN0dSldbZg3dR6zcRsLMn85WgtUTaxxw+XNbK0/YNkKhKRa0S8A==",
702
+ "dependencies": {
703
+ "extend": "^3.0.0",
704
+ "get-pixels": "^3.2.3",
705
+ "line-simplify-rdp": "^0.4.0",
706
+ "marching-squares": "^0.2.0",
707
+ "minimist": "^1.2.0",
708
+ "ndarray": "^1.0.18"
709
+ },
710
+ "bin": {
711
+ "imageoutline": "cmd.js"
712
+ }
713
+ },
714
+ "node_modules/inherits": {
715
+ "version": "2.0.4",
716
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
717
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
718
+ },
719
+ "node_modules/iota-array": {
720
+ "version": "1.0.0",
721
+ "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz",
722
+ "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA=="
723
+ },
724
+ "node_modules/ipaddr.js": {
725
+ "version": "1.9.1",
726
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
727
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
728
+ "engines": {
729
+ "node": ">= 0.10"
730
+ }
731
+ },
732
+ "node_modules/is-buffer": {
733
+ "version": "1.1.6",
734
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
735
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
736
+ },
737
+ "node_modules/is-electron": {
738
+ "version": "2.2.2",
739
+ "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz",
740
+ "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==",
741
+ "license": "MIT"
742
+ },
743
+ "node_modules/is-typedarray": {
744
+ "version": "1.0.0",
745
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
746
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
747
+ },
748
+ "node_modules/is-url": {
749
+ "version": "1.2.4",
750
+ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
751
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
752
+ "license": "MIT"
753
+ },
754
+ "node_modules/isstream": {
755
+ "version": "0.1.2",
756
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
757
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
758
+ },
759
+ "node_modules/jpeg-js": {
760
+ "version": "0.4.4",
761
+ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
762
+ "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="
763
+ },
764
+ "node_modules/jsbn": {
765
+ "version": "0.1.1",
766
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
767
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
768
+ },
769
+ "node_modules/json-schema": {
770
+ "version": "0.4.0",
771
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
772
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
773
+ },
774
+ "node_modules/json-schema-traverse": {
775
+ "version": "0.4.1",
776
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
777
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
778
+ },
779
+ "node_modules/json-stringify-safe": {
780
+ "version": "5.0.1",
781
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
782
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
783
+ },
784
+ "node_modules/jsprim": {
785
+ "version": "1.4.2",
786
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
787
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
788
+ "dependencies": {
789
+ "assert-plus": "1.0.0",
790
+ "extsprintf": "1.3.0",
791
+ "json-schema": "0.4.0",
792
+ "verror": "1.10.0"
793
+ },
794
+ "engines": {
795
+ "node": ">=0.6.0"
796
+ }
797
+ },
798
+ "node_modules/line-simplify-rdp": {
799
+ "version": "0.4.0",
800
+ "resolved": "https://registry.npmjs.org/line-simplify-rdp/-/line-simplify-rdp-0.4.0.tgz",
801
+ "integrity": "sha512-wNywJYQFBC3HXs67SfqHtKAk8PR2HJGVLEu0XvbTBtTKfDSL8baUaDkJjGKfWv102JpzaiBb/tkZF2mAo8GDjg==",
802
+ "dependencies": {
803
+ "distance-to-line-segment": "^0.2.0"
804
+ }
805
+ },
806
+ "node_modules/makerjs": {
807
+ "version": "0.9.93",
808
+ "resolved": "https://registry.npmjs.org/makerjs/-/makerjs-0.9.93.tgz",
809
+ "integrity": "sha512-XztS2tJEpL01dsZ5P11kGO2MitrD6MsSvkNDS3uUDVN9SVDJn33Q2j9DFruJsiRtqNVRseLK52vkkbWKtLB/tA==",
810
+ "dependencies": {
811
+ "@types/bezier-js": "^0.0.6",
812
+ "@types/node": "^7.0.5",
813
+ "@types/opentype.js": "^0.0.0",
814
+ "@types/pdfkit": "^0.7.34",
815
+ "bezier-js": "^2.1.0",
816
+ "clone": "^1.0.2",
817
+ "graham_scan": "^1.0.4"
818
+ }
819
+ },
820
+ "node_modules/makerjs/node_modules/@types/node": {
821
+ "version": "7.10.14",
822
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.14.tgz",
823
+ "integrity": "sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA=="
824
+ },
825
+ "node_modules/marching-squares": {
826
+ "version": "0.2.0",
827
+ "resolved": "https://registry.npmjs.org/marching-squares/-/marching-squares-0.2.0.tgz",
828
+ "integrity": "sha512-KqeOD21s+BpSyaEhPmeKD5wXxKjzRHkWZsEUErbB7ZWXtx9pKlV1eeufqv7mo+PFXm8mopmogha8wQQiW+lrcA=="
829
+ },
830
+ "node_modules/media-typer": {
831
+ "version": "0.3.0",
832
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
833
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
834
+ "engines": {
835
+ "node": ">= 0.6"
836
+ }
837
+ },
838
+ "node_modules/merge-descriptors": {
839
+ "version": "1.0.1",
840
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
841
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
842
+ },
843
+ "node_modules/methods": {
844
+ "version": "1.1.2",
845
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
846
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
847
+ "engines": {
848
+ "node": ">= 0.6"
849
+ }
850
+ },
851
+ "node_modules/mime": {
852
+ "version": "1.6.0",
853
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
854
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
855
+ "bin": {
856
+ "mime": "cli.js"
857
+ },
858
+ "engines": {
859
+ "node": ">=4"
860
+ }
861
+ },
862
+ "node_modules/mime-db": {
863
+ "version": "1.52.0",
864
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
865
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
866
+ "engines": {
867
+ "node": ">= 0.6"
868
+ }
869
+ },
870
+ "node_modules/mime-types": {
871
+ "version": "2.1.35",
872
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
873
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
874
+ "dependencies": {
875
+ "mime-db": "1.52.0"
876
+ },
877
+ "engines": {
878
+ "node": ">= 0.6"
879
+ }
880
+ },
881
+ "node_modules/minimist": {
882
+ "version": "1.2.8",
883
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
884
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
885
+ "funding": {
886
+ "url": "https://github.com/sponsors/ljharb"
887
+ }
888
+ },
889
+ "node_modules/ms": {
890
+ "version": "2.1.3",
891
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
892
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
893
+ },
894
+ "node_modules/ndarray": {
895
+ "version": "1.0.19",
896
+ "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz",
897
+ "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==",
898
+ "dependencies": {
899
+ "iota-array": "^1.0.0",
900
+ "is-buffer": "^1.0.2"
901
+ }
902
+ },
903
+ "node_modules/ndarray-pack": {
904
+ "version": "1.2.1",
905
+ "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz",
906
+ "integrity": "sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g==",
907
+ "dependencies": {
908
+ "cwise-compiler": "^1.1.2",
909
+ "ndarray": "^1.0.13"
910
+ }
911
+ },
912
+ "node_modules/negotiator": {
913
+ "version": "0.6.3",
914
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
915
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
916
+ "engines": {
917
+ "node": ">= 0.6"
918
+ }
919
+ },
920
+ "node_modules/node-bitmap": {
921
+ "version": "0.0.1",
922
+ "resolved": "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz",
923
+ "integrity": "sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA==",
924
+ "engines": {
925
+ "node": ">=v0.6.5"
926
+ }
927
+ },
928
+ "node_modules/node-fetch": {
929
+ "version": "2.7.0",
930
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
931
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
932
+ "license": "MIT",
933
+ "dependencies": {
934
+ "whatwg-url": "^5.0.0"
935
+ },
936
+ "engines": {
937
+ "node": "4.x || >=6.0.0"
938
+ },
939
+ "peerDependencies": {
940
+ "encoding": "^0.1.0"
941
+ },
942
+ "peerDependenciesMeta": {
943
+ "encoding": {
944
+ "optional": true
945
+ }
946
+ }
947
+ },
948
+ "node_modules/nomnom": {
949
+ "version": "1.8.1",
950
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
951
+ "integrity": "sha512-5s0JxqhDx9/rksG2BTMVN1enjWSvPidpoSgViZU4ZXULyTe+7jxcCRLB6f42Z0l1xYJpleCBtSyY6Lwg3uu5CQ==",
952
+ "deprecated": "Package no longer supported. Contact [email protected] for more info.",
953
+ "dependencies": {
954
+ "chalk": "~0.4.0",
955
+ "underscore": "~1.6.0"
956
+ }
957
+ },
958
+ "node_modules/oauth-sign": {
959
+ "version": "0.9.0",
960
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
961
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
962
+ "engines": {
963
+ "node": "*"
964
+ }
965
+ },
966
+ "node_modules/object-assign": {
967
+ "version": "4.1.1",
968
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
969
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
970
+ "engines": {
971
+ "node": ">=0.10.0"
972
+ }
973
+ },
974
+ "node_modules/object-inspect": {
975
+ "version": "1.12.2",
976
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
977
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
978
+ "funding": {
979
+ "url": "https://github.com/sponsors/ljharb"
980
+ }
981
+ },
982
+ "node_modules/omggif": {
983
+ "version": "1.0.10",
984
+ "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
985
+ "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
986
+ },
987
+ "node_modules/on-finished": {
988
+ "version": "2.4.1",
989
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
990
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
991
+ "dependencies": {
992
+ "ee-first": "1.1.1"
993
+ },
994
+ "engines": {
995
+ "node": ">= 0.8"
996
+ }
997
+ },
998
+ "node_modules/opencollective-postinstall": {
999
+ "version": "2.0.3",
1000
+ "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
1001
+ "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
1002
+ "license": "MIT",
1003
+ "bin": {
1004
+ "opencollective-postinstall": "index.js"
1005
+ }
1006
+ },
1007
+ "node_modules/opentype.js": {
1008
+ "version": "1.3.4",
1009
+ "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz",
1010
+ "integrity": "sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==",
1011
+ "dependencies": {
1012
+ "string.prototype.codepointat": "^0.2.1",
1013
+ "tiny-inflate": "^1.0.3"
1014
+ },
1015
+ "bin": {
1016
+ "ot": "bin/ot"
1017
+ },
1018
+ "engines": {
1019
+ "node": ">= 8.0.0"
1020
+ }
1021
+ },
1022
+ "node_modules/parse-data-uri": {
1023
+ "version": "0.2.0",
1024
+ "resolved": "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz",
1025
+ "integrity": "sha512-uOtts8NqDcaCt1rIsO3VFDRsAfgE4c6osG4d9z3l4dCBlxYFzni6Di/oNU270SDrjkfZuUvLZx1rxMyqh46Y9w==",
1026
+ "dependencies": {
1027
+ "data-uri-to-buffer": "0.0.3"
1028
+ }
1029
+ },
1030
+ "node_modules/parseurl": {
1031
+ "version": "1.3.3",
1032
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1033
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1034
+ "engines": {
1035
+ "node": ">= 0.8"
1036
+ }
1037
+ },
1038
+ "node_modules/path-to-regexp": {
1039
+ "version": "0.1.7",
1040
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1041
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1042
+ },
1043
+ "node_modules/performance-now": {
1044
+ "version": "2.1.0",
1045
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1046
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
1047
+ },
1048
+ "node_modules/pngjs": {
1049
+ "version": "3.4.0",
1050
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
1051
+ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
1052
+ "engines": {
1053
+ "node": ">=4.0.0"
1054
+ }
1055
+ },
1056
+ "node_modules/proxy-addr": {
1057
+ "version": "2.0.7",
1058
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1059
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1060
+ "dependencies": {
1061
+ "forwarded": "0.2.0",
1062
+ "ipaddr.js": "1.9.1"
1063
+ },
1064
+ "engines": {
1065
+ "node": ">= 0.10"
1066
+ }
1067
+ },
1068
+ "node_modules/proxy-from-env": {
1069
+ "version": "1.1.0",
1070
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1071
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
1072
+ },
1073
+ "node_modules/psl": {
1074
+ "version": "1.9.0",
1075
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
1076
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
1077
+ },
1078
+ "node_modules/punycode": {
1079
+ "version": "2.3.1",
1080
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1081
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1082
+ "engines": {
1083
+ "node": ">=6"
1084
+ }
1085
+ },
1086
+ "node_modules/qs": {
1087
+ "version": "6.11.0",
1088
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1089
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1090
+ "dependencies": {
1091
+ "side-channel": "^1.0.4"
1092
+ },
1093
+ "engines": {
1094
+ "node": ">=0.6"
1095
+ },
1096
+ "funding": {
1097
+ "url": "https://github.com/sponsors/ljharb"
1098
+ }
1099
+ },
1100
+ "node_modules/range-parser": {
1101
+ "version": "1.2.1",
1102
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1103
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1104
+ "engines": {
1105
+ "node": ">= 0.6"
1106
+ }
1107
+ },
1108
+ "node_modules/raw-body": {
1109
+ "version": "2.5.1",
1110
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1111
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1112
+ "dependencies": {
1113
+ "bytes": "3.1.2",
1114
+ "http-errors": "2.0.0",
1115
+ "iconv-lite": "0.4.24",
1116
+ "unpipe": "1.0.0"
1117
+ },
1118
+ "engines": {
1119
+ "node": ">= 0.8"
1120
+ }
1121
+ },
1122
+ "node_modules/raw-body/node_modules/iconv-lite": {
1123
+ "version": "0.4.24",
1124
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1125
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1126
+ "dependencies": {
1127
+ "safer-buffer": ">= 2.1.2 < 3"
1128
+ },
1129
+ "engines": {
1130
+ "node": ">=0.10.0"
1131
+ }
1132
+ },
1133
+ "node_modules/regenerator-runtime": {
1134
+ "version": "0.13.11",
1135
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
1136
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
1137
+ "license": "MIT"
1138
+ },
1139
+ "node_modules/request": {
1140
+ "version": "2.88.2",
1141
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1142
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1143
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
1144
+ "dependencies": {
1145
+ "aws-sign2": "~0.7.0",
1146
+ "aws4": "^1.8.0",
1147
+ "caseless": "~0.12.0",
1148
+ "combined-stream": "~1.0.6",
1149
+ "extend": "~3.0.2",
1150
+ "forever-agent": "~0.6.1",
1151
+ "form-data": "~2.3.2",
1152
+ "har-validator": "~5.1.3",
1153
+ "http-signature": "~1.2.0",
1154
+ "is-typedarray": "~1.0.0",
1155
+ "isstream": "~0.1.2",
1156
+ "json-stringify-safe": "~5.0.1",
1157
+ "mime-types": "~2.1.19",
1158
+ "oauth-sign": "~0.9.0",
1159
+ "performance-now": "^2.1.0",
1160
+ "qs": "~6.5.2",
1161
+ "safe-buffer": "^5.1.2",
1162
+ "tough-cookie": "~2.5.0",
1163
+ "tunnel-agent": "^0.6.0",
1164
+ "uuid": "^3.3.2"
1165
+ },
1166
+ "engines": {
1167
+ "node": ">= 6"
1168
+ }
1169
+ },
1170
+ "node_modules/request/node_modules/form-data": {
1171
+ "version": "2.3.3",
1172
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
1173
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
1174
+ "dependencies": {
1175
+ "asynckit": "^0.4.0",
1176
+ "combined-stream": "^1.0.6",
1177
+ "mime-types": "^2.1.12"
1178
+ },
1179
+ "engines": {
1180
+ "node": ">= 0.12"
1181
+ }
1182
+ },
1183
+ "node_modules/request/node_modules/qs": {
1184
+ "version": "6.5.3",
1185
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
1186
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
1187
+ "engines": {
1188
+ "node": ">=0.6"
1189
+ }
1190
+ },
1191
+ "node_modules/safe-buffer": {
1192
+ "version": "5.2.1",
1193
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1194
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1195
+ "funding": [
1196
+ {
1197
+ "type": "github",
1198
+ "url": "https://github.com/sponsors/feross"
1199
+ },
1200
+ {
1201
+ "type": "patreon",
1202
+ "url": "https://www.patreon.com/feross"
1203
+ },
1204
+ {
1205
+ "type": "consulting",
1206
+ "url": "https://feross.org/support"
1207
+ }
1208
+ ]
1209
+ },
1210
+ "node_modules/safer-buffer": {
1211
+ "version": "2.1.2",
1212
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1213
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1214
+ },
1215
+ "node_modules/sax": {
1216
+ "version": "1.3.0",
1217
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
1218
+ "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="
1219
+ },
1220
+ "node_modules/send": {
1221
+ "version": "0.18.0",
1222
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1223
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1224
+ "dependencies": {
1225
+ "debug": "2.6.9",
1226
+ "depd": "2.0.0",
1227
+ "destroy": "1.2.0",
1228
+ "encodeurl": "~1.0.2",
1229
+ "escape-html": "~1.0.3",
1230
+ "etag": "~1.8.1",
1231
+ "fresh": "0.5.2",
1232
+ "http-errors": "2.0.0",
1233
+ "mime": "1.6.0",
1234
+ "ms": "2.1.3",
1235
+ "on-finished": "2.4.1",
1236
+ "range-parser": "~1.2.1",
1237
+ "statuses": "2.0.1"
1238
+ },
1239
+ "engines": {
1240
+ "node": ">= 0.8.0"
1241
+ }
1242
+ },
1243
+ "node_modules/send/node_modules/debug": {
1244
+ "version": "2.6.9",
1245
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1246
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1247
+ "dependencies": {
1248
+ "ms": "2.0.0"
1249
+ }
1250
+ },
1251
+ "node_modules/send/node_modules/debug/node_modules/ms": {
1252
+ "version": "2.0.0",
1253
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1254
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1255
+ },
1256
+ "node_modules/serve-static": {
1257
+ "version": "1.15.0",
1258
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1259
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1260
+ "dependencies": {
1261
+ "encodeurl": "~1.0.2",
1262
+ "escape-html": "~1.0.3",
1263
+ "parseurl": "~1.3.3",
1264
+ "send": "0.18.0"
1265
+ },
1266
+ "engines": {
1267
+ "node": ">= 0.8.0"
1268
+ }
1269
+ },
1270
+ "node_modules/setprototypeof": {
1271
+ "version": "1.2.0",
1272
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1273
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1274
+ },
1275
+ "node_modules/side-channel": {
1276
+ "version": "1.0.4",
1277
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1278
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1279
+ "dependencies": {
1280
+ "call-bind": "^1.0.0",
1281
+ "get-intrinsic": "^1.0.2",
1282
+ "object-inspect": "^1.9.0"
1283
+ },
1284
+ "funding": {
1285
+ "url": "https://github.com/sponsors/ljharb"
1286
+ }
1287
+ },
1288
+ "node_modules/sshpk": {
1289
+ "version": "1.18.0",
1290
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
1291
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
1292
+ "dependencies": {
1293
+ "asn1": "~0.2.3",
1294
+ "assert-plus": "^1.0.0",
1295
+ "bcrypt-pbkdf": "^1.0.0",
1296
+ "dashdash": "^1.12.0",
1297
+ "ecc-jsbn": "~0.1.1",
1298
+ "getpass": "^0.1.1",
1299
+ "jsbn": "~0.1.0",
1300
+ "safer-buffer": "^2.0.2",
1301
+ "tweetnacl": "~0.14.0"
1302
+ },
1303
+ "bin": {
1304
+ "sshpk-conv": "bin/sshpk-conv",
1305
+ "sshpk-sign": "bin/sshpk-sign",
1306
+ "sshpk-verify": "bin/sshpk-verify"
1307
+ },
1308
+ "engines": {
1309
+ "node": ">=0.10.0"
1310
+ }
1311
+ },
1312
+ "node_modules/statuses": {
1313
+ "version": "2.0.1",
1314
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1315
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1316
+ "engines": {
1317
+ "node": ">= 0.8"
1318
+ }
1319
+ },
1320
+ "node_modules/string.prototype.codepointat": {
1321
+ "version": "0.2.1",
1322
+ "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz",
1323
+ "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="
1324
+ },
1325
+ "node_modules/strip-ansi": {
1326
+ "version": "0.1.1",
1327
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
1328
+ "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==",
1329
+ "bin": {
1330
+ "strip-ansi": "cli.js"
1331
+ },
1332
+ "engines": {
1333
+ "node": ">=0.8.0"
1334
+ }
1335
+ },
1336
+ "node_modules/tesseract.js": {
1337
+ "version": "5.1.1",
1338
+ "resolved": "https://registry.npmjs.org/tesseract.js/-/tesseract.js-5.1.1.tgz",
1339
+ "integrity": "sha512-lzVl/Ar3P3zhpUT31NjqeCo1f+D5+YfpZ5J62eo2S14QNVOmHBTtbchHm/YAbOOOzCegFnKf4B3Qih9LuldcYQ==",
1340
+ "hasInstallScript": true,
1341
+ "license": "Apache-2.0",
1342
+ "dependencies": {
1343
+ "bmp-js": "^0.1.0",
1344
+ "idb-keyval": "^6.2.0",
1345
+ "is-electron": "^2.2.2",
1346
+ "is-url": "^1.2.4",
1347
+ "node-fetch": "^2.6.9",
1348
+ "opencollective-postinstall": "^2.0.3",
1349
+ "regenerator-runtime": "^0.13.3",
1350
+ "tesseract.js-core": "^5.1.1",
1351
+ "wasm-feature-detect": "^1.2.11",
1352
+ "zlibjs": "^0.3.1"
1353
+ }
1354
+ },
1355
+ "node_modules/tesseract.js-core": {
1356
+ "version": "5.1.1",
1357
+ "resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-5.1.1.tgz",
1358
+ "integrity": "sha512-KX3bYSU5iGcO1XJa+QGPbi+Zjo2qq6eBhNjSGR5E5q0JtzkoipJKOUQD7ph8kFyteCEfEQ0maWLu8MCXtvX5uQ==",
1359
+ "license": "Apache-2.0"
1360
+ },
1361
+ "node_modules/through": {
1362
+ "version": "2.3.8",
1363
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1364
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
1365
+ },
1366
+ "node_modules/tiny-inflate": {
1367
+ "version": "1.0.3",
1368
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
1369
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
1370
+ },
1371
+ "node_modules/toidentifier": {
1372
+ "version": "1.0.1",
1373
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1374
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1375
+ "engines": {
1376
+ "node": ">=0.6"
1377
+ }
1378
+ },
1379
+ "node_modules/tough-cookie": {
1380
+ "version": "2.5.0",
1381
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1382
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1383
+ "dependencies": {
1384
+ "psl": "^1.1.28",
1385
+ "punycode": "^2.1.1"
1386
+ },
1387
+ "engines": {
1388
+ "node": ">=0.8"
1389
+ }
1390
+ },
1391
+ "node_modules/tr46": {
1392
+ "version": "0.0.3",
1393
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1394
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
1395
+ "license": "MIT"
1396
+ },
1397
+ "node_modules/tunnel-agent": {
1398
+ "version": "0.6.0",
1399
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1400
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
1401
+ "dependencies": {
1402
+ "safe-buffer": "^5.0.1"
1403
+ },
1404
+ "engines": {
1405
+ "node": "*"
1406
+ }
1407
+ },
1408
+ "node_modules/tweetnacl": {
1409
+ "version": "0.14.5",
1410
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1411
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
1412
+ },
1413
+ "node_modules/type-is": {
1414
+ "version": "1.6.18",
1415
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1416
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1417
+ "dependencies": {
1418
+ "media-typer": "0.3.0",
1419
+ "mime-types": "~2.1.24"
1420
+ },
1421
+ "engines": {
1422
+ "node": ">= 0.6"
1423
+ }
1424
+ },
1425
+ "node_modules/typescript": {
1426
+ "version": "2.5.2",
1427
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.2.tgz",
1428
+ "integrity": "sha1-A4qV99m7tCCxvzW6MdTFwd0//jQ=",
1429
+ "dev": true,
1430
+ "bin": {
1431
+ "tsc": "bin/tsc",
1432
+ "tsserver": "bin/tsserver"
1433
+ },
1434
+ "engines": {
1435
+ "node": ">=4.2.0"
1436
+ }
1437
+ },
1438
+ "node_modules/underscore": {
1439
+ "version": "1.6.0",
1440
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
1441
+ "integrity": "sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ=="
1442
+ },
1443
+ "node_modules/uniq": {
1444
+ "version": "1.0.1",
1445
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
1446
+ "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA=="
1447
+ },
1448
+ "node_modules/unpipe": {
1449
+ "version": "1.0.0",
1450
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1451
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1452
+ "engines": {
1453
+ "node": ">= 0.8"
1454
+ }
1455
+ },
1456
+ "node_modules/uri-js": {
1457
+ "version": "4.4.1",
1458
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1459
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1460
+ "dependencies": {
1461
+ "punycode": "^2.1.0"
1462
+ }
1463
+ },
1464
+ "node_modules/utils-merge": {
1465
+ "version": "1.0.1",
1466
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1467
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1468
+ "engines": {
1469
+ "node": ">= 0.4.0"
1470
+ }
1471
+ },
1472
+ "node_modules/uuid": {
1473
+ "version": "3.4.0",
1474
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1475
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
1476
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
1477
+ "bin": {
1478
+ "uuid": "bin/uuid"
1479
+ }
1480
+ },
1481
+ "node_modules/vary": {
1482
+ "version": "1.1.2",
1483
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1484
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1485
+ "engines": {
1486
+ "node": ">= 0.8"
1487
+ }
1488
+ },
1489
+ "node_modules/verror": {
1490
+ "version": "1.10.0",
1491
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1492
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
1493
+ "engines": [
1494
+ "node >=0.6.0"
1495
+ ],
1496
+ "dependencies": {
1497
+ "assert-plus": "^1.0.0",
1498
+ "core-util-is": "1.0.2",
1499
+ "extsprintf": "^1.2.0"
1500
+ }
1501
+ },
1502
+ "node_modules/wasm-feature-detect": {
1503
+ "version": "1.8.0",
1504
+ "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz",
1505
+ "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==",
1506
+ "license": "Apache-2.0"
1507
+ },
1508
+ "node_modules/wawoff2": {
1509
+ "version": "2.0.1",
1510
+ "resolved": "https://registry.npmjs.org/wawoff2/-/wawoff2-2.0.1.tgz",
1511
+ "integrity": "sha512-r0CEmvpH63r4T15ebFqeOjGqU4+EgTx4I510NtK35EMciSdcTxCw3Byy3JnBonz7iyIFZ0AbVo0bbFpEVuhCYA==",
1512
+ "dependencies": {
1513
+ "argparse": "^2.0.1"
1514
+ },
1515
+ "bin": {
1516
+ "woff2_compress.js": "bin/woff2_compress.js",
1517
+ "woff2_decompress.js": "bin/woff2_decompress.js"
1518
+ }
1519
+ },
1520
+ "node_modules/webidl-conversions": {
1521
+ "version": "3.0.1",
1522
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1523
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
1524
+ "license": "BSD-2-Clause"
1525
+ },
1526
+ "node_modules/whatwg-url": {
1527
+ "version": "5.0.0",
1528
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1529
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1530
+ "license": "MIT",
1531
+ "dependencies": {
1532
+ "tr46": "~0.0.3",
1533
+ "webidl-conversions": "^3.0.0"
1534
+ }
1535
+ },
1536
+ "node_modules/xml2js": {
1537
+ "version": "0.6.2",
1538
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
1539
+ "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
1540
+ "dependencies": {
1541
+ "sax": ">=0.6.0",
1542
+ "xmlbuilder": "~11.0.0"
1543
+ },
1544
+ "engines": {
1545
+ "node": ">=4.0.0"
1546
+ }
1547
+ },
1548
+ "node_modules/xmlbuilder": {
1549
+ "version": "11.0.1",
1550
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
1551
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
1552
+ "engines": {
1553
+ "node": ">=4.0"
1554
+ }
1555
+ },
1556
+ "node_modules/zlibjs": {
1557
+ "version": "0.3.1",
1558
+ "resolved": "https://registry.npmjs.org/zlibjs/-/zlibjs-0.3.1.tgz",
1559
+ "integrity": "sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==",
1560
+ "license": "MIT",
1561
+ "engines": {
1562
+ "node": "*"
1563
+ }
1564
+ }
1565
+ }
1566
+ }
package.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "SVGMAKER",
3
+ "version": "1.0.0",
4
+ "description": "Description of your app",
5
+ "scripts": {
6
+ "start": "npm install && node app.js",
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "author": "AWS",
10
+ "license": "MIT",
11
+ "dependencies": {
12
+ "axios": "^1.6.5",
13
+ "cors": "^2.8.5",
14
+ "express": "^4.18.2",
15
+ "image-outline": "^0.1.0",
16
+ "makerjs": "^0.9.71",
17
+ "nomnom": "^1.8.1",
18
+ "opentype.js": "1.3.4",
19
+ "tesseract.js": "^5.1.1",
20
+ "wawoff2": "^2.0.1",
21
+ "xml2js": "^0.6.2"
22
+ },
23
+ "devDependencies": {
24
+ "typescript": "2.5.2"
25
+ }
26
+ }
vercel.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": 2,
3
+ "builds": [
4
+ { "src": "app.js", "use": "@vercel/node" }
5
+ ],
6
+ "routes": [
7
+ { "src": "/(.*)", "dest": "app.js" }
8
+ ]
9
+ }