tempmail-sdk 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +243 -153
  2. package/demo/poll-emails.ts +172 -187
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.js +55 -4
  5. package/dist/normalize.d.ts +5 -0
  6. package/dist/normalize.js +87 -0
  7. package/dist/providers/awamail.d.ts +15 -0
  8. package/dist/providers/awamail.js +91 -0
  9. package/dist/providers/chatgpt-org-uk.js +4 -2
  10. package/dist/providers/dropmail.d.ts +13 -0
  11. package/dist/providers/dropmail.js +86 -0
  12. package/dist/providers/linshi-email.js +4 -2
  13. package/dist/providers/mail-tm.d.ts +11 -0
  14. package/dist/providers/mail-tm.js +167 -0
  15. package/dist/providers/temp-mail-io.d.ts +13 -0
  16. package/dist/providers/temp-mail-io.js +69 -0
  17. package/dist/providers/tempmail-la.d.ts +15 -0
  18. package/dist/providers/tempmail-la.js +89 -0
  19. package/dist/providers/tempmail-lol.d.ts +1 -1
  20. package/dist/providers/tempmail-lol.js +5 -3
  21. package/dist/providers/tempmail.js +4 -2
  22. package/dist/types.d.ts +31 -28
  23. package/dist/types.js +1 -1
  24. package/package.json +37 -37
  25. package/src/global.d.ts +5 -5
  26. package/src/index.ts +183 -133
  27. package/src/normalize.ts +80 -0
  28. package/src/providers/awamail.ts +101 -0
  29. package/src/providers/chatgpt-org-uk.ts +59 -57
  30. package/src/providers/dropmail.ts +98 -0
  31. package/src/providers/linshi-email.ts +63 -61
  32. package/src/providers/mail-tm.ts +188 -0
  33. package/src/providers/temp-mail-io.ts +76 -0
  34. package/src/providers/tempmail-la.ts +99 -0
  35. package/src/providers/tempmail-lol.ts +55 -53
  36. package/src/providers/tempmail.ts +61 -59
  37. package/src/types.ts +62 -58
  38. package/test/example.ts +63 -48
  39. package/tsconfig.json +27 -27
@@ -1,187 +1,172 @@
1
- /**
2
- * Demo: 获取指定渠道邮箱,轮询获取邮件
3
- *
4
- * 使用方法:
5
- * npx ts-node demo/poll-emails.ts
6
- */
7
-
8
- import * as readline from 'readline';
9
- import { generateEmail, getEmails, listChannels, getChannelInfo, Channel, EmailInfo, ChannelInfo } from '../src';
10
-
11
- // 配置
12
- const POLL_INTERVAL = 5000; // 轮询间隔(毫秒)
13
- const MAX_POLL_COUNT = 60; // 最大轮询次数
14
-
15
- function printJson(label: string, data: any): void {
16
- console.log(`\n${label}:`);
17
- console.log(JSON.stringify(data, null, 2));
18
- }
19
-
20
- function sleep(ms: number): Promise<void> {
21
- return new Promise(resolve => setTimeout(resolve, ms));
22
- }
23
-
24
- function question(prompt: string): Promise<string> {
25
- const rl = readline.createInterface({
26
- input: process.stdin,
27
- output: process.stdout,
28
- });
29
- return new Promise((resolve) => {
30
- rl.question(prompt, (answer: string) => {
31
- rl.close();
32
- resolve(answer.trim());
33
- });
34
- });
35
- }
36
-
37
- async function selectChannel(channels: ChannelInfo[]): Promise<Channel> {
38
- console.log('\n请选择渠道:');
39
- channels.forEach((ch, index) => {
40
- console.log(` [${index + 1}] ${ch.channel} - ${ch.name} (${ch.website})`);
41
- });
42
-
43
- while (true) {
44
- const input = await question('\n请输入渠道编号 (1-' + channels.length + '): ');
45
- const num = parseInt(input, 10);
46
-
47
- if (num >= 1 && num <= channels.length) {
48
- return channels[num - 1].channel;
49
- }
50
- console.log('❌ 无效的编号,请重新输入');
51
- }
52
- }
53
-
54
- async function pollEmails(emailInfo: EmailInfo): Promise<void> {
55
- console.log(`\n开始轮询邮件...(每 ${POLL_INTERVAL / 1000} 秒检查一次)`);
56
- console.log('按 Ctrl+C 停止轮询\n');
57
-
58
- let pollCount = 0;
59
-
60
- while (pollCount < MAX_POLL_COUNT) {
61
- pollCount++;
62
-
63
- try {
64
- const result = await getEmails({
65
- channel: emailInfo.channel,
66
- email: emailInfo.email,
67
- token: emailInfo.token,
68
- });
69
-
70
- const timestamp = new Date().toLocaleTimeString();
71
-
72
- if (result.emails.length > 0) {
73
- console.log(`\n[${timestamp}] 🎉 收到 ${result.emails.length} 封邮件!\n`);
74
-
75
- // 打印原始返回数据
76
- printJson('返回数据 (GetEmailsResult)', result);
77
-
78
- for (let i = 0; i < result.emails.length; i++) {
79
- const email = result.emails[i];
80
- console.log(`\n邮件 #${i + 1}`);
81
- console.log('━'.repeat(50));
82
- console.log(`ID: ${email.id || email.eid || email._id || '无'}`);
83
- const fromAddr = email.from_address || email.address_from || email.from || '未知';
84
- const fromName = email.from_name || email.name_from || '';
85
- const fromDisplay = fromName ? `${fromName} <${fromAddr}>` : fromAddr;
86
- console.log(`发件人: ${fromDisplay}`);
87
- console.log(`收件人: ${email.to || email.name_to || email.email_address || result.email}`);
88
- console.log(`主题: ${email.subject || email.e_subject || '无主题'}`);
89
- let emailDate: string = '未知';
90
- if (email.received_at) {
91
- emailDate = email.received_at;
92
- } else if (email.created_at) {
93
- emailDate = email.created_at;
94
- } else if (email.createdAt) {
95
- emailDate = email.createdAt;
96
- } else if (email.timestamp) {
97
- emailDate = new Date(email.timestamp * 1000).toISOString();
98
- } else if (email.e_date) {
99
- emailDate = new Date(email.e_date).toISOString();
100
- } else if (typeof email.date === 'number') {
101
- emailDate = new Date(email.date).toISOString();
102
- } else if (email.date) {
103
- emailDate = email.date;
104
- }
105
- console.log(`时间: ${emailDate}`);
106
- console.log(`已读: ${email.is_read ? '是' : '否'}`);
107
- const body = email.text || email.body || email.content || '';
108
- if (body) {
109
- const preview = body.replace(/<[^>]*>/g, '').substring(0, 200);
110
- console.log(`内容: ${preview}`);
111
- }
112
- const htmlContent = email.html_content || email.html || '';
113
- if (htmlContent) {
114
- const htmlPreview = htmlContent.replace(/<[^>]*>/g, '').substring(0, 100);
115
- console.log(`HTML: ${htmlPreview}...`);
116
- }
117
- console.log(''.repeat(50));
118
- }
119
-
120
- // 收到邮件后可以选择继续轮询或退出
121
- // break;
122
- } else {
123
- process.stdout.write(`\r[${timestamp}] 第 ${pollCount}/${MAX_POLL_COUNT} 次检查,暂无新邮件...`);
124
- }
125
- } catch (error) {
126
- console.error(`\n轮询出错: ${error}`);
127
- }
128
-
129
- await sleep(POLL_INTERVAL);
130
- }
131
-
132
- console.log('\n\n已达到最大轮询次数,停止轮询');
133
- }
134
-
135
- async function main(): Promise<void> {
136
- console.log('═'.repeat(50));
137
- console.log(' 临时邮箱 Demo - 获取邮箱并轮询邮件');
138
- console.log('═'.repeat(50));
139
-
140
- // 1. 列出所有支持的渠道
141
- console.log('\n[1] 列出所有支持的渠道...');
142
- const channels = listChannels();
143
- printJson('支持的渠道列表', channels);
144
-
145
- // 2. 让用户选择渠道
146
- console.log('\n[2] 选择渠道...');
147
- const selectedChannel = await selectChannel(channels);
148
-
149
- // 3. 获取指定渠道信息
150
- console.log(`\n[3] 获取渠道 "${selectedChannel}" 信息...`);
151
- const channelInfo = getChannelInfo(selectedChannel);
152
- printJson('渠道信息', channelInfo);
153
-
154
- // 4. 从指定渠道获取邮箱
155
- console.log(`\n[4] ${selectedChannel} 渠道获取临时邮箱...`);
156
-
157
- try {
158
- const emailInfo = await generateEmail({ channel: selectedChannel });
159
-
160
- console.log('\n✅ 获取邮箱成功!');
161
- printJson('返回数据 (EmailInfo)', emailInfo);
162
-
163
- console.log('\n📋 邮箱信息:');
164
- console.log(` 渠道: ${emailInfo.channel}`);
165
- console.log(` 邮箱: ${emailInfo.email}`);
166
- if (emailInfo.token) {
167
- console.log(` Token: ${emailInfo.token}`);
168
- }
169
- if (emailInfo.expiresAt) {
170
- console.log(` 过期时间: ${emailInfo.expiresAt}`);
171
- }
172
- if (emailInfo.createdAt) {
173
- console.log(` 创建时间: ${emailInfo.createdAt}`);
174
- }
175
-
176
- console.log('\n📧 请发送邮件到以上邮箱地址进行测试');
177
-
178
- // 5. 轮询获取邮件
179
- await pollEmails(emailInfo);
180
-
181
- } catch (error) {
182
- console.error(`\n❌ 获取邮箱失败: ${error}`);
183
- process.exit(1);
184
- }
185
- }
186
-
187
- main().catch(console.error);
1
+ /**
2
+ * Demo: 获取指定渠道邮箱,轮询获取邮件
3
+ *
4
+ * 使用方法:
5
+ * npx ts-node demo/poll-emails.ts
6
+ */
7
+
8
+ import * as readline from 'readline';
9
+ import { generateEmail, getEmails, listChannels, getChannelInfo, Channel, EmailInfo, ChannelInfo, Email } from '../src';
10
+
11
+ // 配置
12
+ const POLL_INTERVAL = 5000; // 轮询间隔(毫秒)
13
+ const MAX_POLL_COUNT = 60; // 最大轮询次数
14
+
15
+ function printJson(label: string, data: any): void {
16
+ console.log(`\n${label}:`);
17
+ console.log(JSON.stringify(data, null, 2));
18
+ }
19
+
20
+ function sleep(ms: number): Promise<void> {
21
+ return new Promise(resolve => setTimeout(resolve, ms));
22
+ }
23
+
24
+ function question(prompt: string): Promise<string> {
25
+ const rl = readline.createInterface({
26
+ input: process.stdin,
27
+ output: process.stdout,
28
+ });
29
+ return new Promise((resolve) => {
30
+ rl.question(prompt, (answer: string) => {
31
+ rl.close();
32
+ resolve(answer.trim());
33
+ });
34
+ });
35
+ }
36
+
37
+ async function selectChannel(channels: ChannelInfo[]): Promise<Channel> {
38
+ console.log('\n请选择渠道:');
39
+ channels.forEach((ch, index) => {
40
+ console.log(` [${index + 1}] ${ch.channel} - ${ch.name} (${ch.website})`);
41
+ });
42
+
43
+ while (true) {
44
+ const input = await question('\n请输入渠道编号 (1-' + channels.length + '): ');
45
+ const num = parseInt(input, 10);
46
+
47
+ if (num >= 1 && num <= channels.length) {
48
+ return channels[num - 1].channel;
49
+ }
50
+ console.log('❌ 无效的编号,请重新输入');
51
+ }
52
+ }
53
+
54
+ function printEmail(email: Email, index: number): void {
55
+ console.log(`\n邮件 #${index + 1}`);
56
+ console.log(''.repeat(50));
57
+ console.log(`ID: ${email.id || '无'}`);
58
+ console.log(`发件人: ${email.from || '未知'}`);
59
+ console.log(`收件人: ${email.to || '未知'}`);
60
+ console.log(`主题: ${email.subject || '无主题'}`);
61
+ console.log(`时间: ${email.date || '未知'}`);
62
+ console.log(`已读: ${email.isRead ? '是' : '否'}`);
63
+ if (email.text) {
64
+ const preview = email.text.substring(0, 200);
65
+ console.log(`内容: ${preview}`);
66
+ }
67
+ if (email.html) {
68
+ const htmlPreview = email.html.replace(/<[^>]*>/g, '').substring(0, 100);
69
+ console.log(`HTML: ${htmlPreview}...`);
70
+ }
71
+ if (email.attachments.length > 0) {
72
+ console.log(`附件: ${email.attachments.map(a => a.filename).join(', ')}`);
73
+ }
74
+ console.log('━'.repeat(50));
75
+ }
76
+
77
+ async function pollEmails(emailInfo: EmailInfo): Promise<void> {
78
+ console.log(`\n开始轮询邮件...(每 ${POLL_INTERVAL / 1000} 秒检查一次)`);
79
+ console.log('按 Ctrl+C 停止轮询\n');
80
+
81
+ let pollCount = 0;
82
+
83
+ while (pollCount < MAX_POLL_COUNT) {
84
+ pollCount++;
85
+
86
+ try {
87
+ const result = await getEmails({
88
+ channel: emailInfo.channel,
89
+ email: emailInfo.email,
90
+ token: emailInfo.token,
91
+ });
92
+
93
+ const timestamp = new Date().toLocaleTimeString();
94
+
95
+ if (result.emails.length > 0) {
96
+ console.log(`\n[${timestamp}] 🎉 收到 ${result.emails.length} 封邮件!\n`);
97
+
98
+ // 打印原始返回数据
99
+ printJson('返回数据 (GetEmailsResult)', result);
100
+
101
+ for (let i = 0; i < result.emails.length; i++) {
102
+ printEmail(result.emails[i], i);
103
+ }
104
+
105
+ // 收到邮件后可以选择继续轮询或退出
106
+ // break;
107
+ } else {
108
+ process.stdout.write(`\r[${timestamp}] 第 ${pollCount}/${MAX_POLL_COUNT} 次检查,暂无新邮件...`);
109
+ }
110
+ } catch (error) {
111
+ console.error(`\n轮询出错: ${error}`);
112
+ }
113
+
114
+ await sleep(POLL_INTERVAL);
115
+ }
116
+
117
+ console.log('\n\n已达到最大轮询次数,停止轮询');
118
+ }
119
+
120
+ async function main(): Promise<void> {
121
+ console.log('═'.repeat(50));
122
+ console.log(' 临时邮箱 Demo - 获取邮箱并轮询邮件');
123
+ console.log('═'.repeat(50));
124
+
125
+ // 1. 列出所有支持的渠道
126
+ console.log('\n[1] 列出所有支持的渠道...');
127
+ const channels = listChannels();
128
+ printJson('支持的渠道列表', channels);
129
+
130
+ // 2. 让用户选择渠道
131
+ console.log('\n[2] 选择渠道...');
132
+ const selectedChannel = await selectChannel(channels);
133
+
134
+ // 3. 获取指定渠道信息
135
+ console.log(`\n[3] 获取渠道 "${selectedChannel}" 信息...`);
136
+ const channelInfo = getChannelInfo(selectedChannel);
137
+ printJson('渠道信息', channelInfo);
138
+
139
+ // 4. 从指定渠道获取邮箱
140
+ console.log(`\n[4] 从 ${selectedChannel} 渠道获取临时邮箱...`);
141
+
142
+ try {
143
+ const emailInfo = await generateEmail({ channel: selectedChannel });
144
+
145
+ console.log('\n✅ 获取邮箱成功!');
146
+ printJson('返回数据 (EmailInfo)', emailInfo);
147
+
148
+ console.log('\n📋 邮箱信息:');
149
+ console.log(` 渠道: ${emailInfo.channel}`);
150
+ console.log(` 邮箱: ${emailInfo.email}`);
151
+ if (emailInfo.token) {
152
+ console.log(` Token: ${emailInfo.token}`);
153
+ }
154
+ if (emailInfo.expiresAt) {
155
+ console.log(` 过期时间: ${emailInfo.expiresAt}`);
156
+ }
157
+ if (emailInfo.createdAt) {
158
+ console.log(` 创建时间: ${emailInfo.createdAt}`);
159
+ }
160
+
161
+ console.log('\n📧 请发送邮件到以上邮箱地址进行测试');
162
+
163
+ // 5. 轮询获取邮件
164
+ await pollEmails(emailInfo);
165
+
166
+ } catch (error) {
167
+ console.error(`\n❌ 获取邮箱失败: ${error}`);
168
+ process.exit(1);
169
+ }
170
+ }
171
+
172
+ main().catch(console.error);
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Channel, EmailInfo, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
2
- export { Channel, EmailInfo, Email, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
2
+ export { Channel, EmailInfo, Email, EmailAttachment, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
3
+ export { normalizeEmail } from './normalize';
3
4
  export interface ChannelInfo {
4
5
  channel: Channel;
5
6
  name: string;
package/dist/index.js CHANGED
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.TempEmailClient = void 0;
36
+ exports.TempEmailClient = exports.normalizeEmail = void 0;
37
37
  exports.listChannels = listChannels;
38
38
  exports.getChannelInfo = getChannelInfo;
39
39
  exports.generateEmail = generateEmail;
@@ -42,18 +42,35 @@ const tempmail = __importStar(require("./providers/tempmail"));
42
42
  const linshiEmail = __importStar(require("./providers/linshi-email"));
43
43
  const tempmailLol = __importStar(require("./providers/tempmail-lol"));
44
44
  const chatgptOrgUk = __importStar(require("./providers/chatgpt-org-uk"));
45
+ const tempmailLa = __importStar(require("./providers/tempmail-la"));
46
+ const tempMailIO = __importStar(require("./providers/temp-mail-io"));
47
+ const awamail = __importStar(require("./providers/awamail"));
48
+ const mailTm = __importStar(require("./providers/mail-tm"));
49
+ const dropmail = __importStar(require("./providers/dropmail"));
50
+ var normalize_1 = require("./normalize");
51
+ Object.defineProperty(exports, "normalizeEmail", { enumerable: true, get: function () { return normalize_1.normalizeEmail; } });
45
52
  const providers = {
46
53
  'tempmail': tempmail,
47
54
  'linshi-email': linshiEmail,
48
55
  'tempmail-lol': tempmailLol,
49
56
  'chatgpt-org-uk': chatgptOrgUk,
57
+ 'tempmail-la': tempmailLa,
58
+ 'temp-mail-io': tempMailIO,
59
+ 'awamail': awamail,
60
+ 'mail-tm': mailTm,
61
+ 'dropmail': dropmail,
50
62
  };
51
- const allChannels = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk'];
63
+ const allChannels = ['tempmail', 'linshi-email', 'tempmail-lol', 'chatgpt-org-uk', 'tempmail-la', 'temp-mail-io', 'awamail', 'mail-tm', 'dropmail'];
52
64
  const channelInfoMap = {
53
65
  'tempmail': { channel: 'tempmail', name: 'TempMail', website: 'tempmail.ing' },
54
66
  'linshi-email': { channel: 'linshi-email', name: '临时邮箱', website: 'linshi-email.com' },
55
67
  'tempmail-lol': { channel: 'tempmail-lol', name: 'TempMail LOL', website: 'tempmail.lol' },
56
68
  'chatgpt-org-uk': { channel: 'chatgpt-org-uk', name: 'ChatGPT Mail', website: 'mail.chatgpt.org.uk' },
69
+ 'tempmail-la': { channel: 'tempmail-la', name: 'TempMail LA', website: 'tempmail.la' },
70
+ 'temp-mail-io': { channel: 'temp-mail-io', name: 'Temp Mail IO', website: 'temp-mail.io' },
71
+ 'awamail': { channel: 'awamail', name: 'AwaMail', website: 'awamail.com' },
72
+ 'mail-tm': { channel: 'mail-tm', name: 'Mail.tm', website: 'mail.tm' },
73
+ 'dropmail': { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' },
57
74
  };
58
75
  /**
59
76
  * 获取所有支持的渠道列表
@@ -78,6 +95,16 @@ async function generateEmail(options = {}) {
78
95
  return tempmailLol.generateEmail(options.domain || null);
79
96
  case 'chatgpt-org-uk':
80
97
  return chatgptOrgUk.generateEmail();
98
+ case 'tempmail-la':
99
+ return tempmailLa.generateEmail();
100
+ case 'temp-mail-io':
101
+ return tempMailIO.generateEmail();
102
+ case 'awamail':
103
+ return awamail.generateEmail();
104
+ case 'mail-tm':
105
+ return mailTm.generateEmail();
106
+ case 'dropmail':
107
+ return dropmail.generateEmail();
81
108
  default:
82
109
  throw new Error(`Unknown channel: ${channel}`);
83
110
  }
@@ -102,11 +129,35 @@ async function getEmails(options) {
102
129
  if (!token) {
103
130
  throw new Error('Token is required for tempmail-lol channel');
104
131
  }
105
- emails = await tempmailLol.getEmails(token);
132
+ emails = await tempmailLol.getEmails(token, email);
106
133
  break;
107
134
  case 'chatgpt-org-uk':
108
135
  emails = await chatgptOrgUk.getEmails(email);
109
136
  break;
137
+ case 'tempmail-la':
138
+ emails = await tempmailLa.getEmails(email);
139
+ break;
140
+ case 'temp-mail-io':
141
+ emails = await tempMailIO.getEmails(email);
142
+ break;
143
+ case 'awamail':
144
+ if (!token) {
145
+ throw new Error('Token is required for awamail channel');
146
+ }
147
+ emails = await awamail.getEmails(token, email);
148
+ break;
149
+ case 'mail-tm':
150
+ if (!token) {
151
+ throw new Error('Token is required for mail-tm channel');
152
+ }
153
+ emails = await mailTm.getEmails(token, email);
154
+ break;
155
+ case 'dropmail':
156
+ if (!token) {
157
+ throw new Error('Token is required for dropmail channel');
158
+ }
159
+ emails = await dropmail.getEmails(token, email);
160
+ break;
110
161
  default:
111
162
  throw new Error(`Unknown channel: ${channel}`);
112
163
  }
@@ -147,4 +198,4 @@ exports.default = {
147
198
  getEmails,
148
199
  TempEmailClient,
149
200
  };
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNBLG9DQUVDO0FBS0Qsd0NBRUM7QUFFRCxzQ0FlQztBQUVELDhCQXNDQztBQW5HRCwrREFBaUQ7QUFDakQsc0VBQXdEO0FBQ3hELHNFQUF3RDtBQUN4RCx5RUFBMkQ7QUFLM0QsTUFBTSxTQUFTLEdBQUc7SUFDaEIsVUFBVSxFQUFFLFFBQVE7SUFDcEIsY0FBYyxFQUFFLFdBQVc7SUFDM0IsY0FBYyxFQUFFLFdBQVc7SUFDM0IsZ0JBQWdCLEVBQUUsWUFBWTtDQUMvQixDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQWMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBUTlGLE1BQU0sY0FBYyxHQUFpQztJQUNuRCxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRTtJQUM5RSxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFO0lBQ3RGLGNBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFO0lBQzFGLGdCQUFnQixFQUFFLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFO0NBQ3RHLENBQUM7QUFFRjs7R0FFRztBQUNILFNBQWdCLFlBQVk7SUFDMUIsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFD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SyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBdkJELDBDQXVCQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRlbXBtYWlsIGZyb20gJy4vcHJvdmlkZXJzL3RlbXBtYWlsJztcclxuaW1wb3J0ICogYXMgbGluc2hpRW1haWwgZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLWVtYWlsJztcclxuaW1wb3J0ICogYXMgdGVtcG1haWxMb2wgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwtbG9sJztcclxuaW1wb3J0ICogYXMgY2hhdGdwdE9yZ1VrIGZyb20gJy4vcHJvdmlkZXJzL2NoYXRncHQtb3JnLXVrJztcclxuaW1wb3J0IHsgQ2hhbm5lbCwgRW1haWxJbmZvLCBFbWFpbCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuZXhwb3J0IHsgQ2hhbm5lbCwgRW1haWxJbmZvLCBFbWFpbCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuY29uc3QgcHJvdmlkZXJzID0ge1xyXG4gICd0ZW1wbWFpbCc6IHRlbXBtYWlsLFxyXG4gICdsaW5zaGktZW1haWwnOiBsaW5zaGlFbWFpbCxcclxuICAndGVtcG1haWwtbG9sJzogdGVtcG1haWxMb2wsXHJcbiAgJ2NoYXRncHQtb3JnLXVrJzogY2hhdGdwdE9yZ1VrLFxyXG59O1xyXG5cclxuY29uc3QgYWxsQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsndGVtcG1haWwnLCAnbGluc2hpLWVtYWlsJywgJ3RlbXBtYWlsLWxvbCcsICdjaGF0Z3B0LW9yZy11ayddO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsSW5mbyB7XHJcbiAgY2hhbm5lbDogQ2hhbm5lbDtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgd2Vic2l0ZTogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBjaGFubmVsSW5mb01hcDogUmVjb3JkPENoYW5uZWwsIENoYW5uZWxJbmZvPiA9IHtcclxuICAndGVtcG1haWwnOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbCcsIG5hbWU6ICdUZW1wTWFpbCcsIHdlYnNpdGU6ICd0ZW1wbWFpbC5pbmcnIH0sXHJcbiAgJ2xpbnNoaS1lbWFpbCc6IHsgY2hhbm5lbDogJ2xpbnNoaS1lbWFpbCcsIG5hbWU6ICfkuLTml7bpgq7nrrEnLCB3ZWJzaXRlOiAnbGluc2hpLWVtYWlsLmNvbScgfSxcclxuICAndGVtcG1haWwtbG9sJzogeyBjaGFubmVsOiAndGVtcG1haWwtbG9sJywgbmFtZTogJ1RlbXBNYWlsIExPTCcsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sb2wnIH0sXHJcbiAgJ2NoYXRncHQtb3JnLXVrJzogeyBjaGFubmVsOiAnY2hhdGdwdC1vcmctdWsnLCBuYW1lOiAnQ2hhdEdQVCBNYWlsJywgd2Vic2l0ZTogJ21haWwuY2hhdGdwdC5vcmcudWsnIH0sXHJcbn07XHJcblxyXG4vKipcclxuICog6I635Y+W5omA5pyJ5pSv5oyB55qE5rig6YGT5YiX6KGoXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGlzdENoYW5uZWxzKCk6IENoYW5uZWxJbmZvW10ge1xyXG4gIHJldHVybiBhbGxDaGFubmVscy5tYXAoY2ggPT4gY2hhbm5lbEluZm9NYXBbY2hdKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIOiOt+WPluaMh+Wumua4oOmBk+S/oeaBr1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxJbmZvKGNoYW5uZWw6IENoYW5uZWwpOiBDaGFubmVsSW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgcmV0dXJuIGNoYW5uZWxJbmZvTWFwW2NoYW5uZWxdO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFbWFpbChvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbWFpbEluZm8+IHtcclxuICBjb25zdCBjaGFubmVsID0gb3B0aW9ucy5jaGFubmVsIHx8IGFsbENoYW5uZWxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbENoYW5uZWxzLmxlbmd0aCldO1xyXG4gIFxyXG4gIHN3aXRjaCAoY2hhbm5lbCkge1xyXG4gICAgY2FzZSAndGVtcG1haWwnOlxyXG4gICAgICByZXR1cm4gdGVtcG1haWwuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmR1cmF0aW9uIHx8IDMwKTtcclxuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XHJcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XHJcbiAgICBjYXNlICd0ZW1wbWFpbC1sb2wnOlxyXG4gICAgICByZXR1cm4gdGVtcG1haWxMb2wuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiB8fCBudWxsKTtcclxuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcclxuICAgICAgcmV0dXJuIGNoYXRncHRPcmdVay5nZW5lcmF0ZUVtYWlsKCk7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY2hhbm5lbDogJHtjaGFubmVsfWApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEVtYWlscyhvcHRpb25zOiBHZXRFbWFpbHNPcHRpb25zKTogUHJvbWlzZTxHZXRFbWFpbHNSZXN1bHQ+IHtcclxuICBjb25zdCB7IGNoYW5uZWwsIGVtYWlsLCB0b2tlbiB9ID0gb3B0aW9ucztcclxuICBcclxuICBpZiAoIWNoYW5uZWwpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2hhbm5lbCBpcyByZXF1aXJlZCcpO1xyXG4gIH1cclxuICBpZiAoIWVtYWlsICYmIGNoYW5uZWwgIT09ICd0ZW1wbWFpbC1sb2wnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtYWlsIGlzIHJlcXVpcmVkJyk7XHJcbiAgfVxyXG5cclxuICBsZXQgZW1haWxzOiBFbWFpbFtdID0gW107XHJcblxyXG4gIHN3aXRjaCAoY2hhbm5lbCkge1xyXG4gICAgY2FzZSAndGVtcG1haWwnOlxyXG4gICAgICBlbWFpbHMgPSBhd2FpdCB0ZW1wbWFpbC5nZXRFbWFpbHMoZW1haWwpO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XHJcbiAgICAgIGVtYWlscyA9IGF3YWl0IGxpbnNoaUVtYWlsLmdldEVtYWlscyhlbWFpbCk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcclxuICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gaXMgcmVxdWlyZWQgZm9yIHRlbXBtYWlsLWxvbCBjaGFubmVsJyk7XHJcbiAgICAgIH1cclxuICAgICAgZW1haWxzID0gYXdhaXQgdGVtcG1haWxMb2wuZ2V0RW1haWxzKHRva2VuKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XHJcbiAgICAgIGVtYWlscyA9IGF3YWl0IGNoYXRncHRPcmdVay5nZXRFbWFpbHMoZW1haWwpO1xyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgY2hhbm5lbCxcclxuICAgIGVtYWlsLFxyXG4gICAgZW1haWxzLFxyXG4gICAgc3VjY2VzczogdHJ1ZSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVGVtcEVtYWlsQ2xpZW50IHtcclxuICBwcml2YXRlIGVtYWlsSW5mbzogRW1haWxJbmZvIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGFzeW5jIGdlbmVyYXRlKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbz4ge1xyXG4gICAgdGhpcy5lbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKG9wdGlvbnMpO1xyXG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0RW1haWxzKCk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XHJcbiAgICBpZiAoIXRoaXMuZW1haWxJbmZvKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZW1haWwgZ2VuZXJhdGVkLiBDYWxsIGdlbmVyYXRlKCkgZmlyc3QuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdldEVtYWlscyh7XHJcbiAgICAgIGNoYW5uZWw6IHRoaXMuZW1haWxJbmZvLmNoYW5uZWwsXHJcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsSW5mby5lbWFpbCxcclxuICAgICAgdG9rZW46IHRoaXMuZW1haWxJbmZvLnRva2VuLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRFbWFpbEluZm8oKTogRW1haWxJbmZvIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5lbWFpbEluZm87XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgbGlzdENoYW5uZWxzLFxyXG4gIGdldENoYW5uZWxJbmZvLFxyXG4gIGdlbmVyYXRlRW1haWwsXHJcbiAgZ2V0RW1haWxzLFxyXG4gIFRlbXBFbWFpbENsaWVudCxcclxufTtcclxuIl19
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaURBLG9DQUVDO0FBS0Qsd0NBRUM7QUFFRCxzQ0F5QkM7QUFFRCw4QkE4REM7QUFySkQsK0RBQWlEO0FBQ2pELHNFQUF3RDtBQUN4RCxzRUFBd0Q7QUFDeEQseUVBQTJEO0FBQzNELG9FQUFzRDtBQUN0RCxxRUFBdUQ7QUFDdkQsNkRBQStDO0FBQy9DLDREQUE4QztBQUM5QywrREFBaUQ7QUFJakQseUNBQTZDO0FBQXBDLDJHQUFBLGNBQWMsT0FBQTtBQUV2QixNQUFNLFNBQVMsR0FBRztJQUNoQixVQUFVLEVBQUUsUUFBUTtJQUNwQixjQUFjLEVBQUUsV0FBVztJQUMzQixjQUFjLEVBQUUsV0FBVztJQUMzQixnQkFBZ0IsRUFBRSxZQUFZO0lBQzlCLGFBQWEsRUFBRSxVQUFVO0lBQ3pCLGNBQWMsRUFBRSxVQUFVO0lBQzFCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBYyxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQVEvSixNQUFNLGNBQWMsR0FBaUM7SUFDbkQsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUU7SUFDOUUsY0FBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRTtJQUN0RixjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FB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Q0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBdkJELDBDQXVCQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRlbXBtYWlsIGZyb20gJy4vcHJvdmlkZXJzL3RlbXBtYWlsJztcbmltcG9ydCAqIGFzIGxpbnNoaUVtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2xpbnNoaS1lbWFpbCc7XG5pbXBvcnQgKiBhcyB0ZW1wbWFpbExvbCBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1sb2wnO1xuaW1wb3J0ICogYXMgY2hhdGdwdE9yZ1VrIGZyb20gJy4vcHJvdmlkZXJzL2NoYXRncHQtb3JnLXVrJztcbmltcG9ydCAqIGFzIHRlbXBtYWlsTGEgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwtbGEnO1xuaW1wb3J0ICogYXMgdGVtcE1haWxJTyBmcm9tICcuL3Byb3ZpZGVycy90ZW1wLW1haWwtaW8nO1xuaW1wb3J0ICogYXMgYXdhbWFpbCBmcm9tICcuL3Byb3ZpZGVycy9hd2FtYWlsJztcbmltcG9ydCAqIGFzIG1haWxUbSBmcm9tICcuL3Byb3ZpZGVycy9tYWlsLXRtJztcbmltcG9ydCAqIGFzIGRyb3BtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2Ryb3BtYWlsJztcbmltcG9ydCB7IENoYW5uZWwsIEVtYWlsSW5mbywgRW1haWwsIEVtYWlsQXR0YWNobWVudCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEVtYWlsLCBFbWFpbEF0dGFjaG1lbnQsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IG5vcm1hbGl6ZUVtYWlsIH0gZnJvbSAnLi9ub3JtYWxpemUnO1xuXG5jb25zdCBwcm92aWRlcnMgPSB7XG4gICd0ZW1wbWFpbCc6IHRlbXBtYWlsLFxuICAnbGluc2hpLWVtYWlsJzogbGluc2hpRW1haWwsXG4gICd0ZW1wbWFpbC1sb2wnOiB0ZW1wbWFpbExvbCxcbiAgJ2NoYXRncHQtb3JnLXVrJzogY2hhdGdwdE9yZ1VrLFxuICAndGVtcG1haWwtbGEnOiB0ZW1wbWFpbExhLFxuICAndGVtcC1tYWlsLWlvJzogdGVtcE1haWxJTyxcbiAgJ2F3YW1haWwnOiBhd2FtYWlsLFxuICAnbWFpbC10bSc6IG1haWxUbSxcbiAgJ2Ryb3BtYWlsJzogZHJvcG1haWwsXG59O1xuXG5jb25zdCBhbGxDaGFubmVsczogQ2hhbm5lbFtdID0gWyd0ZW1wbWFpbCcsICdsaW5zaGktZW1haWwnLCAndGVtcG1haWwtbG9sJywgJ2NoYXRncHQtb3JnLXVrJywgJ3RlbXBtYWlsLWxhJywgJ3RlbXAtbWFpbC1pbycsICdhd2FtYWlsJywgJ21haWwtdG0nLCAnZHJvcG1haWwnXTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsSW5mbyB7XG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIG5hbWU6IHN0cmluZztcbiAgd2Vic2l0ZTogc3RyaW5nO1xufVxuXG5jb25zdCBjaGFubmVsSW5mb01hcDogUmVjb3JkPENoYW5uZWwsIENoYW5uZWxJbmZvPiA9IHtcbiAgJ3RlbXBtYWlsJzogeyBjaGFubmVsOiAndGVtcG1haWwnLCBuYW1lOiAnVGVtcE1haWwnLCB3ZWJzaXRlOiAndGVtcG1haWwuaW5nJyB9LFxuICAnbGluc2hpLWVtYWlsJzogeyBjaGFubmVsOiAnbGluc2hpLWVtYWlsJywgbmFtZTogJ+S4tOaXtumCrueusScsIHdlYnNpdGU6ICdsaW5zaGktZW1haWwuY29tJyB9LFxuICAndGVtcG1haWwtbG9sJzogeyBjaGFubmVsOiAndGVtcG1haWwtbG9sJywgbmFtZTogJ1RlbXBNYWlsIExPTCcsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sb2wnIH0sXG4gICdjaGF0Z3B0LW9yZy11ayc6IHsgY2hhbm5lbDogJ2NoYXRncHQtb3JnLXVrJywgbmFtZTogJ0NoYXRHUFQgTWFpbCcsIHdlYnNpdGU6ICdtYWlsLmNoYXRncHQub3JnLnVrJyB9LFxuICAndGVtcG1haWwtbGEnOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbC1sYScsIG5hbWU6ICdUZW1wTWFpbCBMQScsIHdlYnNpdGU6ICd0ZW1wbWFpbC5sYScgfSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycsIG5hbWU6ICdUZW1wIE1haWwgSU8nLCB3ZWJzaXRlOiAndGVtcC1tYWlsLmlvJyB9LFxuICAnYXdhbWFpbCc6IHsgY2hhbm5lbDogJ2F3YW1haWwnLCBuYW1lOiAnQXdhTWFpbCcsIHdlYnNpdGU6ICdhd2FtYWlsLmNvbScgfSxcbiAgJ21haWwtdG0nOiB7IGNoYW5uZWw6ICdtYWlsLXRtJywgbmFtZTogJ01haWwudG0nLCB3ZWJzaXRlOiAnbWFpbC50bScgfSxcbiAgJ2Ryb3BtYWlsJzogeyBjaGFubmVsOiAnZHJvcG1haWwnLCBuYW1lOiAnRHJvcE1haWwnLCB3ZWJzaXRlOiAnZHJvcG1haWwubWUnIH0sXG59O1xuXG4vKipcbiAqIOiOt+WPluaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdENoYW5uZWxzKCk6IENoYW5uZWxJbmZvW10ge1xuICByZXR1cm4gYWxsQ2hhbm5lbHMubWFwKGNoID0+IGNoYW5uZWxJbmZvTWFwW2NoXSk7XG59XG5cbi8qKlxuICog6I635Y+W5oyH5a6a5rig6YGT5L+h5oGvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVsSW5mbyhjaGFubmVsOiBDaGFubmVsKTogQ2hhbm5lbEluZm8gfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2hhbm5lbEluZm9NYXBbY2hhbm5lbF07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbz4ge1xuICBjb25zdCBjaGFubmVsID0gb3B0aW9ucy5jaGFubmVsIHx8IGFsbENoYW5uZWxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbENoYW5uZWxzLmxlbmd0aCldO1xuICBcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kdXJhdGlvbiB8fCAzMCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExvbC5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluIHx8IG51bGwpO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIHJldHVybiBjaGF0Z3B0T3JnVWsuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxhJzpcbiAgICAgIHJldHVybiB0ZW1wbWFpbExhLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgcmV0dXJuIGF3YW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgcmV0dXJuIG1haWxUbS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZHJvcG1haWwnOlxuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdlbmVyYXRlRW1haWwoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKG9wdGlvbnM6IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBjb25zdCB7IGNoYW5uZWwsIGVtYWlsLCB0b2tlbiB9ID0gb3B0aW9ucztcbiAgXG4gIGlmICghY2hhbm5lbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2hhbm5lbCBpcyByZXF1aXJlZCcpO1xuICB9XG4gIGlmICghZW1haWwgJiYgY2hhbm5lbCAhPT0gJ3RlbXBtYWlsLWxvbCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtYWlsIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBsZXQgZW1haWxzOiBFbWFpbFtdID0gW107XG5cbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgZW1haWxzID0gYXdhaXQgdGVtcG1haWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xpbnNoaS1lbWFpbCc6XG4gICAgICBlbWFpbHMgPSBhd2FpdCBsaW5zaGlFbWFpbC5nZXRFbWFpbHMoZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgdGVtcG1haWwtbG9sIGNoYW5uZWwnKTtcbiAgICAgIH1cbiAgICAgIGVtYWlscyA9IGF3YWl0IHRlbXBtYWlsTG9sLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2hhdGdwdC1vcmctdWsnOlxuICAgICAgZW1haWxzID0gYXdhaXQgY2hhdGdwdE9yZ1VrLmdldEVtYWlscyhlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZW1wbWFpbC1sYSc6XG4gICAgICBlbWFpbHMgPSBhd2FpdCB0ZW1wbWFpbExhLmdldEVtYWlscyhlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgZW1haWxzID0gYXdhaXQgdGVtcE1haWxJTy5nZXRFbWFpbHMoZW1haWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYXdhbWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gaXMgcmVxdWlyZWQgZm9yIGF3YW1haWwgY2hhbm5lbCcpO1xuICAgICAgfVxuICAgICAgZW1haWxzID0gYXdhaXQgYXdhbWFpbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21haWwtdG0nOlxuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIGlzIHJlcXVpcmVkIGZvciBtYWlsLXRtIGNoYW5uZWwnKTtcbiAgICAgIH1cbiAgICAgIGVtYWlscyA9IGF3YWl0IG1haWxUbS5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBpcyByZXF1aXJlZCBmb3IgZHJvcG1haWwgY2hhbm5lbCcpO1xuICAgICAgfVxuICAgICAgZW1haWxzID0gYXdhaXQgZHJvcG1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbCxcbiAgICBlbWFpbCxcbiAgICBlbWFpbHMsXG4gICAgc3VjY2VzczogdHJ1ZSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBFbWFpbENsaWVudCB7XG4gIHByaXZhdGUgZW1haWxJbmZvOiBFbWFpbEluZm8gfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBnZW5lcmF0ZShvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbWFpbEluZm8+IHtcbiAgICB0aGlzLmVtYWlsSW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG5cbiAgYXN5bmMgZ2V0RW1haWxzKCk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmVtYWlsSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCBnZW5lcmF0ZWQuIENhbGwgZ2VuZXJhdGUoKSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RW1haWxzKHtcbiAgICAgIGNoYW5uZWw6IHRoaXMuZW1haWxJbmZvLmNoYW5uZWwsXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbEluZm8uZW1haWwsXG4gICAgICB0b2tlbjogdGhpcy5lbWFpbEluZm8udG9rZW4sXG4gICAgfSk7XG4gIH1cblxuICBnZXRFbWFpbEluZm8oKTogRW1haWxJbmZvIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbGlzdENoYW5uZWxzLFxuICBnZXRDaGFubmVsSW5mbyxcbiAgZ2VuZXJhdGVFbWFpbCxcbiAgZ2V0RW1haWxzLFxuICBUZW1wRW1haWxDbGllbnQsXG59O1xuIl19
@@ -0,0 +1,5 @@
1
+ import { Email } from './types';
2
+ /**
3
+ * 将各提供商返回的原始邮件数据标准化为统一的 Email 格式
4
+ */
5
+ export declare function normalizeEmail(raw: any, recipientEmail?: string): Email;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeEmail = normalizeEmail;
4
+ /**
5
+ * 将各提供商返回的原始邮件数据标准化为统一的 Email 格式
6
+ */
7
+ function normalizeEmail(raw, recipientEmail = '') {
8
+ return {
9
+ id: normalizeId(raw),
10
+ from: normalizeFrom(raw),
11
+ to: normalizeTo(raw, recipientEmail),
12
+ subject: normalizeSubject(raw),
13
+ text: normalizeText(raw),
14
+ html: normalizeHtml(raw),
15
+ date: normalizeDate(raw),
16
+ isRead: normalizeIsRead(raw),
17
+ attachments: normalizeAttachments(raw.attachments),
18
+ };
19
+ }
20
+ function normalizeId(raw) {
21
+ const id = raw.id ?? raw.eid ?? raw._id ?? raw.mailboxId ?? raw.messageId ?? raw.mail_id ?? '';
22
+ return String(id);
23
+ }
24
+ function normalizeFrom(raw) {
25
+ return raw.from_address || raw.address_from || raw.from || raw.messageFrom || raw.sender || '';
26
+ }
27
+ function normalizeTo(raw, recipientEmail) {
28
+ return raw.to || raw.to_address || raw.name_to || raw.email_address || raw.address || recipientEmail || '';
29
+ }
30
+ function normalizeSubject(raw) {
31
+ return raw.subject || raw.e_subject || '';
32
+ }
33
+ function normalizeText(raw) {
34
+ return raw.text || raw.body || raw.content || raw.body_text || raw.text_content || '';
35
+ }
36
+ function normalizeHtml(raw) {
37
+ return raw.html || raw.html_content || raw.body_html || '';
38
+ }
39
+ function normalizeDate(raw) {
40
+ try {
41
+ if (raw.received_at)
42
+ return new Date(raw.received_at).toISOString();
43
+ if (raw.created_at)
44
+ return new Date(raw.created_at).toISOString();
45
+ if (raw.createdAt)
46
+ return new Date(raw.createdAt).toISOString();
47
+ if (raw.date) {
48
+ if (typeof raw.date === 'number')
49
+ return new Date(raw.date).toISOString();
50
+ return new Date(raw.date).toISOString();
51
+ }
52
+ if (raw.timestamp)
53
+ return new Date(raw.timestamp * 1000).toISOString();
54
+ if (raw.e_date)
55
+ return new Date(raw.e_date).toISOString();
56
+ }
57
+ catch {
58
+ // 日期解析失败,返回空字符串
59
+ }
60
+ return '';
61
+ }
62
+ function normalizeIsRead(raw) {
63
+ if (typeof raw.seen === 'boolean')
64
+ return raw.seen;
65
+ if (typeof raw.read === 'boolean')
66
+ return raw.read;
67
+ if (typeof raw.isRead === 'boolean')
68
+ return raw.isRead;
69
+ if (typeof raw.is_read === 'number')
70
+ return raw.is_read === 1;
71
+ if (typeof raw.is_read === 'string')
72
+ return raw.is_read === '1';
73
+ if (typeof raw.is_read === 'boolean')
74
+ return raw.is_read;
75
+ return false;
76
+ }
77
+ function normalizeAttachments(attachments) {
78
+ if (!attachments || !Array.isArray(attachments))
79
+ return [];
80
+ return attachments.map((a) => ({
81
+ filename: a.filename || a.name || '',
82
+ size: a.size || a.filesize || undefined,
83
+ contentType: a.contentType || a.content_type || a.mimeType || a.mime_type || undefined,
84
+ url: a.url || a.download_url || a.downloadUrl || undefined,
85
+ }));
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vcm1hbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLHdDQVlDO0FBZkQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQUMsR0FBUSxFQUFFLGlCQUF5QixFQUFFO0lBQ2xFLE9BQU87UUFDTCxFQUFFLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUNwQixJQUFJLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUN4QixFQUFFLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7UUFDcEMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztRQUM5QixJQUFJLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUN4QixJQUFJLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUN4QixJQUFJLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUN4QixNQUFNLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQztRQUM1QixXQUFXLEVBQUUsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztLQUNuRCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEdBQVE7SUFDM0IsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQy9GLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxHQUFRO0lBQzdCLE9BQU8sR0FBRyxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENB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QU8sR0FBRyxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQUUsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQ3pELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsV0FBZ0I7SUFDNUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDM0QsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtRQUNwQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLFNBQVM7UUFDdkMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksU0FBUztRQUN0RixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksU0FBUztLQUMzRCxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWFpbCwgRW1haWxBdHRhY2htZW50IH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICog5bCG5ZCE5o+Q5L6b5ZWG6L+U5Zue55qE5Y6f5aeL6YKu5Lu25pWw5o2u5qCH5YeG5YyW5Li657uf5LiA55qEIEVtYWlsIOagvOW8j1xuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRW1haWwocmF3OiBhbnksIHJlY2lwaWVudEVtYWlsOiBzdHJpbmcgPSAnJyk6IEVtYWlsIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogbm9ybWFsaXplSWQocmF3KSxcbiAgICBmcm9tOiBub3JtYWxpemVGcm9tKHJhdyksXG4gICAgdG86IG5vcm1hbGl6ZVRvKHJhdywgcmVjaXBpZW50RW1haWwpLFxuICAgIHN1YmplY3Q6IG5vcm1hbGl6ZVN1YmplY3QocmF3KSxcbiAgICB0ZXh0OiBub3JtYWxpemVUZXh0KHJhdyksXG4gICAgaHRtbDogbm9ybWFsaXplSHRtbChyYXcpLFxuICAgIGRhdGU6IG5vcm1hbGl6ZURhdGUocmF3KSxcbiAgICBpc1JlYWQ6IG5vcm1hbGl6ZUlzUmVhZChyYXcpLFxuICAgIGF0dGFjaG1lbnRzOiBub3JtYWxpemVBdHRhY2htZW50cyhyYXcuYXR0YWNobWVudHMpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJZChyYXc6IGFueSk6IHN0cmluZyB7XG4gIGNvbnN0IGlkID0gcmF3LmlkID8/IHJhdy5laWQgPz8gcmF3Ll9pZCA/PyByYXcubWFpbGJveElkID8/IHJhdy5tZXNzYWdlSWQgPz8gcmF3Lm1haWxfaWQgPz8gJyc7XG4gIHJldHVybiBTdHJpbmcoaWQpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGcm9tKHJhdzogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIHJhdy5mcm9tX2FkZHJlc3MgfHwgcmF3LmFkZHJlc3NfZnJvbSB8fCByYXcuZnJvbSB8fCByYXcubWVzc2FnZUZyb20gfHwgcmF3LnNlbmRlciB8fCAnJztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVG8ocmF3OiBhbnksIHJlY2lwaWVudEVtYWlsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmF3LnRvIHx8IHJhdy50b19hZGRyZXNzIHx8IHJhdy5uYW1lX3RvIHx8IHJhdy5lbWFpbF9hZGRyZXNzIHx8IHJhdy5hZGRyZXNzIHx8IHJlY2lwaWVudEVtYWlsIHx8ICcnO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdWJqZWN0KHJhdzogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIHJhdy5zdWJqZWN0IHx8IHJhdy5lX3N1YmplY3QgfHwgJyc7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRleHQocmF3OiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gcmF3LnRleHQgfHwgcmF3LmJvZHkgfHwgcmF3LmNvbnRlbnQgfHwgcmF3LmJvZHlfdGV4dCB8fCByYXcudGV4dF9jb250ZW50IHx8ICcnO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIdG1sKHJhdzogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIHJhdy5odG1sIHx8IHJhdy5odG1sX2NvbnRlbnQgfHwgcmF3LmJvZHlfaHRtbCB8fCAnJztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0ZShyYXc6IGFueSk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgaWYgKHJhdy5yZWNlaXZlZF9hdCkgcmV0dXJuIG5ldyBEYXRlKHJhdy5yZWNlaXZlZF9hdCkudG9JU09TdHJpbmcoKTtcbiAgICBpZiAocmF3LmNyZWF0ZWRfYXQpIHJldHVybiBuZXcgRGF0ZShyYXcuY3JlYXRlZF9hdCkudG9JU09TdHJpbmcoKTtcbiAgICBpZiAocmF3LmNyZWF0ZWRBdCkgcmV0dXJuIG5ldyBEYXRlKHJhdy5jcmVhdGVkQXQpLnRvSVNPU3RyaW5nKCk7XG4gICAgaWYgKHJhdy5kYXRlKSB7XG4gICAgICBpZiAodHlwZW9mIHJhdy5kYXRlID09PSAnbnVtYmVyJykgcmV0dXJuIG5ldyBEYXRlKHJhdy5kYXRlKS50b0lTT1N0cmluZygpO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHJhdy5kYXRlKS50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAocmF3LnRpbWVzdGFtcCkgcmV0dXJuIG5ldyBEYXRlKHJhdy50aW1lc3RhbXAgKiAxMDAwKS50b0lTT1N0cmluZygpO1xuICAgIGlmIChyYXcuZV9kYXRlKSByZXR1cm4gbmV3IERhdGUocmF3LmVfZGF0ZSkudG9JU09TdHJpbmcoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g5pel5pyf6Kej5p6Q5aSx6LSl77yM6L+U5Zue56m65a2X56ym5LiyXG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJc1JlYWQocmF3OiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiByYXcuc2VlbiA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gcmF3LnNlZW47XG4gIGlmICh0eXBlb2YgcmF3LnJlYWQgPT09ICdib29sZWFuJykgcmV0dXJuIHJhdy5yZWFkO1xuICBpZiAodHlwZW9mIHJhdy5pc1JlYWQgPT09ICdib29sZWFuJykgcmV0dXJuIHJhdy5pc1JlYWQ7XG4gIGlmICh0eXBlb2YgcmF3LmlzX3JlYWQgPT09ICdudW1iZXInKSByZXR1cm4gcmF3LmlzX3JlYWQgPT09IDE7XG4gIGlmICh0eXBlb2YgcmF3LmlzX3JlYWQgPT09ICdzdHJpbmcnKSByZXR1cm4gcmF3LmlzX3JlYWQgPT09ICcxJztcbiAgaWYgKHR5cGVvZiByYXcuaXNfcmVhZCA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gcmF3LmlzX3JlYWQ7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXR0YWNobWVudHMoYXR0YWNobWVudHM6IGFueSk6IEVtYWlsQXR0YWNobWVudFtdIHtcbiAgaWYgKCFhdHRhY2htZW50cyB8fCAhQXJyYXkuaXNBcnJheShhdHRhY2htZW50cykpIHJldHVybiBbXTtcbiAgcmV0dXJuIGF0dGFjaG1lbnRzLm1hcCgoYTogYW55KSA9PiAoe1xuICAgIGZpbGVuYW1lOiBhLmZpbGVuYW1lIHx8IGEubmFtZSB8fCAnJyxcbiAgICBzaXplOiBhLnNpemUgfHwgYS5maWxlc2l6ZSB8fCB1bmRlZmluZWQsXG4gICAgY29udGVudFR5cGU6IGEuY29udGVudFR5cGUgfHwgYS5jb250ZW50X3R5cGUgfHwgYS5taW1lVHlwZSB8fCBhLm1pbWVfdHlwZSB8fCB1bmRlZmluZWQsXG4gICAgdXJsOiBhLnVybCB8fCBhLmRvd25sb2FkX3VybCB8fCBhLmRvd25sb2FkVXJsIHx8IHVuZGVmaW5lZCxcbiAgfSkpO1xufVxuIl19