tempmail-sdk 1.1.9 → 1.2.1

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.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://badge.fury.io/js/tempmail-sdk.svg)](https://www.npmjs.com/package/tempmail-sdk)
4
4
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
5
5
 
6
- 临时邮箱 SDK(TypeScript/Node.js),支持 **20** 个邮箱服务提供商,所有渠道返回**统一标准化格式**。
6
+ 临时邮箱 SDK(TypeScript/Node.js),支持 **25** 个邮箱服务提供商,所有渠道返回**统一标准化格式**。
7
7
 
8
8
  ## 安装
9
9
 
@@ -17,11 +17,15 @@ npm install @XxxXTeam/tempmail-sdk --registry=https://npm.pkg.github.com
17
17
 
18
18
  ## 支持的渠道
19
19
 
20
- 共 **20** 个,顺序与 `listChannels()` / 随机尝试顺序一致(与 `src/index.ts` 中 `allChannels` 相同)。
20
+ 共 **25** 个,顺序与 `listChannels()` / 随机尝试顺序一致(与 `src/index.ts` 中 `allChannels` 相同;无 `tempmailg`,与 Rust/Python/C 一致)。
21
21
 
22
22
  | 渠道 | 服务商 | 需要 Token | 说明 |
23
23
  |------|--------|:----------:|------|
24
24
  | `tempmail` | tempmail.ing | - | 支持自定义有效期 |
25
+ | `tempmail-cn` | tempmail.cn | - | Socket.IO:`request shortid` / `set shortid` / `mail`;`domain` 可指定 `tempmail.cn` 或自定义接入域名 |
26
+ | `tmpmails` | tmpmails.com | ✅ | 首页 Cookie + Next.js Server Action;`domain` 可选语言路径(`zh`/`en`) |
27
+ | `ta-easy` | ta-easy.com | ✅ | REST 创建 + 收件箱列表;`expiresAt` 毫秒时间戳 |
28
+ | `10mail-wangtz` | 10mail.wangtz.cn | - | REST `/api/tempMail`、`/api/emailList`;**默认 `fetchWithInsecureTLS` 跳过证书校验** |
25
29
  | `linshi-email` | linshi-email.com | - | |
26
30
  | `linshiyou` | linshiyou.com | ✅ | `NEXUS_TOKEN` + `tmail-emails` 等 Cookie;HTML 分段解析 |
27
31
  | `mffac` | mffac.com | ✅ | `POST /api/mailboxes`;token 为 mailbox `id`;24h |
@@ -41,6 +45,7 @@ npm install @XxxXTeam/tempmail-sdk --registry=https://npm.pkg.github.com
41
45
  | `vip-215` | vip.215.im | ✅ | `POST` 建箱 + `wss`;无正文时 synthetic 兜底 |
42
46
  | `anonbox` | anonbox.net | ✅ | `GET /en/` 解析 HTML + mbox 收信 |
43
47
  | `fake-legal` | fake.legal | - | `/api/domains` + `/api/inbox/new?domain=`;`/api/inbox/{encodeURIComponent(邮箱)}` 拉信;可选 `domain` |
48
+ | `moakt` | moakt.com | ✅ | HTML 收件箱 + `tm_session`;`domain` 可选语言路径;Token 为 `mok1:` + Base64 JSON |
44
49
 
45
50
  > **提示:** 使用 `TempEmailClient` 类时无需手动处理 Token,SDK 自动管理。
46
51
 
@@ -106,6 +111,9 @@ const emailInfo3 = await generateEmail({ channel: 'tempmail', duration: 60 });
106
111
  // tempmail-lol 渠道支持指定域名
107
112
  const emailInfo4 = await generateEmail({ channel: 'tempmail-lol', domain: 'example.com' });
108
113
 
114
+ // tempmail-cn 渠道支持指定 tempmail.cn 自定义接入域名
115
+ const emailInfo5 = await generateEmail({ channel: 'tempmail-cn', domain: 'mail.example.com' });
116
+
109
117
  // 只尝试指定渠道(探测可用性、写自动化时用)
110
118
  const probe = await generateEmail({ channel: 'smail-pw', channelFallback: false });
111
119
  ```
@@ -162,7 +170,7 @@ if (mailTm) {
162
170
  | `channel` | `Channel` | 指定渠道(可选,不指定则随机) |
163
171
  | `channelFallback` | `boolean` | 默认 `true`:指定渠道失败会继续尝试其他渠道;设为 `false` 时仅尝试 `channel` |
164
172
  | `duration` | `number` | 有效期分钟数(仅 `tempmail` 渠道) |
165
- | `domain` | `string` | 指定域名(`tempmail-lol`、`maildrop`、`fake-legal`) |
173
+ | `domain` | `string` | 指定域名或接入参数(`tempmail-cn`、`tempmail-lol`、`maildrop`、`fake-legal`、`tmpmails` / `moakt` 语言路径、`10mail-wangtz` 本地部分等) |
166
174
  | `retry` | `RetryConfig` | 创建邮箱时的重试(超时、5xx、网络错误等) |
167
175
 
168
176
  **返回值:** `EmailInfo`
@@ -260,6 +268,8 @@ setConfig({
260
268
  | `timeout` | `number?` | 全局超时毫秒数,默认 15000 |
261
269
  | `insecure` | `boolean?` | 跳过 SSL 验证(调试用) |
262
270
  | `customFetch` | `typeof fetch?` | 自定义 fetch 函数,用于代理等高级场景 |
271
+ | `telemetryEnabled` | `boolean?` | 未设则默认开启匿名遥测;`false` 关闭 |
272
+ | `telemetryUrl` | `string?` | 覆盖默认上报 URL |
263
273
 
264
274
  **环境变量(无需修改代码):**
265
275
 
@@ -267,12 +277,18 @@ setConfig({
267
277
  export TEMPMAIL_PROXY="http://127.0.0.1:7890"
268
278
  export TEMPMAIL_INSECURE=1
269
279
  export TEMPMAIL_TIMEOUT=30000
280
+ export TEMPMAIL_TELEMETRY_ENABLED=false
281
+ export TEMPMAIL_TELEMETRY_URL="https://example.com/v1/event"
270
282
  ```
271
283
 
272
284
  > **提示:** Node.js 原生 fetch 不支持代理,推荐通过 `customFetch` + `undici` 的 `ProxyAgent` 实现代理支持。
273
285
 
274
286
  DropMail 自动令牌等更多配置见源码 `src/config.ts` 注释(`DROPMAIL_*` 环境变量)。
275
287
 
288
+ ## 匿名遥测
289
+
290
+ 默认 **开启**:在进程内排队,定时或满批向默认端点 `POST` 匿名事件(`schema_version: 2`,含 SDK 语言/版本、OS、操作类型、渠道、成败与重试次数等;错误串脱敏)。关闭:`TEMPMAIL_TELEMETRY_ENABLED=false`(或 `0` / `no`)或 `setConfig({ telemetryEnabled: false })`;改 URL:`TEMPMAIL_TELEMETRY_URL` 或 `telemetryUrl`(内置默认见 `src/telemetry.ts`)。
291
+
276
292
  ## 示例脚本(本仓库)
277
293
 
278
294
  在 `sdk/npm` 目录执行:
package/dist/config.d.ts CHANGED
@@ -9,6 +9,8 @@
9
9
  * DROPMAIL_AUTH_TOKEN / DROPMAIL_API_TOKEN - DropMail GraphQL 的 af_ 令牌(可选;未设置时 SDK 会 /api/token/generate 获取并在将过期时用 /api/token/renew 续期)
10
10
  * DROPMAIL_NO_AUTO_TOKEN - 设为 "1" 或 "true" 则禁止自动拉取/续期令牌
11
11
  * DROPMAIL_RENEW_LIFETIME - 自动续期请求的 lifetime,默认 1d(与官网 renew 接口一致)
12
+ * TEMPMAIL_TELEMETRY_ENABLED - true/false,默认 true;false/0/no 关闭匿名用量上报
13
+ * TEMPMAIL_TELEMETRY_URL - 自定义上报端点 URL
12
14
  *
13
15
  * Node.js 环境下设置 insecure 会自动设置 NODE_TLS_REJECT_UNAUTHORIZED=0
14
16
  */
@@ -40,6 +42,10 @@ export interface SDKConfig {
40
42
  * 当设置了 proxy 但环境不支持 undici 时,可通过此选项传入支持代理的 fetch 实现
41
43
  */
42
44
  customFetch?: typeof fetch;
45
+ /** 为 false 时关闭匿名用量上报;未设置时默认开启 */
46
+ telemetryEnabled?: boolean;
47
+ /** 非空时覆盖默认上报 URL */
48
+ telemetryUrl?: string;
43
49
  }
44
50
  /**
45
51
  * 设置 SDK 全局配置
package/dist/config.js CHANGED
@@ -10,6 +10,8 @@
10
10
  * DROPMAIL_AUTH_TOKEN / DROPMAIL_API_TOKEN - DropMail GraphQL 的 af_ 令牌(可选;未设置时 SDK 会 /api/token/generate 获取并在将过期时用 /api/token/renew 续期)
11
11
  * DROPMAIL_NO_AUTO_TOKEN - 设为 "1" 或 "true" 则禁止自动拉取/续期令牌
12
12
  * DROPMAIL_RENEW_LIFETIME - 自动续期请求的 lifetime,默认 1d(与官网 renew 接口一致)
13
+ * TEMPMAIL_TELEMETRY_ENABLED - true/false,默认 true;false/0/no 关闭匿名用量上报
14
+ * TEMPMAIL_TELEMETRY_URL - 自定义上报端点 URL
13
15
  *
14
16
  * Node.js 环境下设置 insecure 会自动设置 NODE_TLS_REJECT_UNAUTHORIZED=0
15
17
  */
@@ -31,6 +33,16 @@ function loadEnvConfig() {
31
33
  if (process.env.TEMPMAIL_INSECURE === '1' || process.env.TEMPMAIL_INSECURE?.toLowerCase() === 'true') {
32
34
  config.insecure = true;
33
35
  }
36
+ const te = process.env.TEMPMAIL_TELEMETRY_ENABLED?.trim().toLowerCase();
37
+ if (te === 'false' || te === '0' || te === 'no') {
38
+ config.telemetryEnabled = false;
39
+ }
40
+ else if (te === 'true' || te === '1' || te === 'yes') {
41
+ config.telemetryEnabled = true;
42
+ }
43
+ if (process.env.TEMPMAIL_TELEMETRY_URL?.trim()) {
44
+ config.telemetryUrl = process.env.TEMPMAIL_TELEMETRY_URL.trim();
45
+ }
34
46
  }
35
47
  return config;
36
48
  }
@@ -68,4 +80,4 @@ function setConfig(config) {
68
80
  function getConfig() {
69
81
  return globalConfig;
70
82
  }
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRzs7QUFxRUgsOEJBVUM7QUFHRCw4QkFFQztBQXBERCxrQkFBa0I7QUFDbEIsU0FBUyxhQUFhO0lBQ3BCLE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQztJQUM3QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsS0FBSyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNyRyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxJQUFJLFlBQVksR0FBYyxhQUFhLEVBQUUsQ0FBQztBQUU5Qzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxNQUFpQjtJQUN6QyxZQUFZLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQzdCLG1DQUFtQztJQUNuQyxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEQsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLENBQUM7UUFDakQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsb0JBQW9CO0FBQ3BCLFNBQWdCLFNBQVM7SUFDdkIsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU0RLIOWFqOWxgOmFjee9rlxuICog5YyF5ZCr5Luj55CG44CB6LaF5pe244CBU1NMIOetieiuvue9ru+8jOS9nOeUqOS6juaJgOaciSBIVFRQIOivt+axglxuICpcbiAqIOaUr+aMgeeOr+Wig+WPmOmHj+iHquWKqOivu+WPlu+8iOS8mOWFiOe6p+S9juS6juS7o+eggeiuvue9ru+8ie+8mlxuICogICBURU1QTUFJTF9QUk9YWSAgICAtIOS7o+eQhiBVUkxcbiAqICAgVEVNUE1BSUxfVElNRU9VVCAgLSDotoXml7bmr6vnp5LmlbBcbiAqICAgVEVNUE1BSUxfSU5TRUNVUkUgLSDorr7kuLogXCIxXCIg5oiWIFwidHJ1ZVwiIOi3s+i/hyBTU0wg6aqM6K+BXG4gKiAgIERST1BNQUlMX0FVVEhfVE9LRU4gLyBEUk9QTUFJTF9BUElfVE9LRU4gLSBEcm9wTWFpbCBHcmFwaFFMIOeahCBhZl8g5Luk54mM77yI5Y+v6YCJ77yb5pyq6K6+572u5pe2IFNESyDkvJogL2FwaS90b2tlbi9nZW5lcmF0ZSDojrflj5blubblnKjlsIbov4fmnJ/ml7bnlKggL2FwaS90b2tlbi9yZW5ldyDnu63mnJ/vvIlcbiAqICAgRFJPUE1BSUxfTk9fQVVUT19UT0tFTiAtIOiuvuS4uiBcIjFcIiDmiJYgXCJ0cnVlXCIg5YiZ56aB5q2i6Ieq5Yqo5ouJ5Y+WL+e7reacn+S7pOeJjFxuICogICBEUk9QTUFJTF9SRU5FV19MSUZFVElNRSAtIOiHquWKqOe7reacn+ivt+axgueahCBsaWZldGltZe+8jOm7mOiupCAxZO+8iOS4juWumOe9kSByZW5ldyDmjqXlj6PkuIDoh7TvvIlcbiAqXG4gKiBOb2RlLmpzIOeOr+Wig+S4i+iuvue9riBpbnNlY3VyZSDkvJroh6rliqjorr7nva4gTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wXG4gKi9cblxuLyoqXG4gKiBTREsg5YWo5bGA6YWN572u5o6l5Y+jXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU0RLQ29uZmlnIHtcbiAgLyoqIOS7o+eQhiBVUkzvvIzmlK/mjIEgaHR0cC9odHRwcy9zb2NrczXvvIzlpoIgXCJodHRwOi8vMTI3LjAuMC4xOjc4OTBcIiAqL1xuICBwcm94eT86IHN0cmluZztcbiAgLyoqIOWFqOWxgOm7mOiupOi2heaXtu+8iOavq+enku+8ie+8jOm7mOiupCAxNTAwMCAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiog6Lez6L+HIFNTTCDor4Hkuabpqozor4HvvIjosIPor5XnlKjvvIkgKi9cbiAgaW5zZWN1cmU/OiBib29sZWFuO1xuICAvKipcbiAgICogRHJvcE1haWwg5rig6YGT5LiT55So77yaR3JhcGhRTCDnq6/ngrkgYGh0dHBzOi8vZHJvcG1haWwubWUvYXBpL2dyYXBocWwvJHt0b2tlbn1gIOS4reeahCB0b2tlbu+8iOmhu+S4uuWumOe9keeUn+aIkOeahCBgYWZfYCDliY3nvIDku6TniYzvvInjgIJcbiAgICog5Lmf5Y+v6YCa6L+H546v5aKD5Y+Y6YePIERST1BNQUlMX0FVVEhfVE9LRU4g5oiWIERST1BNQUlMX0FQSV9UT0tFTiDmj5DkvpvjgIJcbiAgICog5pyq6YWN572u5LiU5pyq6K6+572uIERST1BNQUlMX05PX0FVVE9fVE9LRU4g5pe277yM5Lya5ZCRIGh0dHBzOi8vZHJvcG1haWwubWUvYXBpL3Rva2VuL2dlbmVyYXRlIOeUs+ivtyAxaCDku6TniYzlubblhoXlrZjnvJPlrZjjgIJcbiAgICovXG4gIGRyb3BtYWlsQXV0aFRva2VuPzogc3RyaW5nO1xuICAvKiog5Li6IHRydWUg5pe25LiN6Ieq5Yqo6K+35rGCIHRva2Vu77yI6aG76YWN572uIGRyb3BtYWlsQXV0aFRva2VuIOaIlueOr+Wig+WPmOmHj++8iSAqL1xuICBkcm9wbWFpbERpc2FibGVBdXRvVG9rZW4/OiBib29sZWFuO1xuICAvKipcbiAgICog6Ieq5Yqo566h55CG5Luk54mM5Y2z5bCG6L+H5pyf5pe277yM6LCD55SoIC9hcGkvdG9rZW4vcmVuZXcg5L2/55So55qEIGxpZmV0aW1l77yI5aaCIDFo44CBMWTvvInjgIJcbiAgICog5Lmf5Y+v6YCa6L+H546v5aKD5Y+Y6YePIERST1BNQUlMX1JFTkVXX0xJRkVUSU1FIOiuvue9ruOAglxuICAgKi9cbiAgZHJvcG1haWxSZW5ld0xpZmV0aW1lPzogc3RyaW5nO1xuICAvKipcbiAgICog6Ieq5a6a5LmJIGZldGNoIOWHveaVsO+8jOeUqOS6juWujOWFqOaOp+WItiBIVFRQIOivt+axguihjOS4ulxuICAgKiDlvZPorr7nva7kuoYgcHJveHkg5L2G546v5aKD5LiN5pSv5oyBIHVuZGljaSDml7bvvIzlj6/pgJrov4fmraTpgInpobnkvKDlhaXmlK/mjIHku6PnkIbnmoQgZmV0Y2gg5a6e546wXG4gICAqL1xuICBjdXN0b21GZXRjaD86IHR5cGVvZiBmZXRjaDtcbn1cblxuLyoqIOS7jueOr+Wig+WPmOmHj+ivu+WPlum7mOiupOmFjee9riAqL1xuZnVuY3Rpb24gbG9hZEVudkNvbmZpZygpOiBTREtDb25maWcge1xuICBjb25zdCBjb25maWc6IFNES0NvbmZpZyA9IHt9O1xuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LlRFTVBNQUlMX1BST1hZKSB7XG4gICAgICBjb25maWcucHJveHkgPSBwcm9jZXNzLmVudi5URU1QTUFJTF9QUk9YWTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LlRFTVBNQUlMX1RJTUVPVVQpIHtcbiAgICAgIGNvbnN0IHQgPSBwYXJzZUludChwcm9jZXNzLmVudi5URU1QTUFJTF9USU1FT1VULCAxMCk7XG4gICAgICBpZiAoIWlzTmFOKHQpICYmIHQgPiAwKSBjb25maWcudGltZW91dCA9IHQ7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5URU1QTUFJTF9JTlNFQ1VSRSA9PT0gJzEnIHx8IHByb2Nlc3MuZW52LlRFTVBNQUlMX0lOU0VDVVJFPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScpIHtcbiAgICAgIGNvbmZpZy5pbnNlY3VyZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5cbmxldCBnbG9iYWxDb25maWc6IFNES0NvbmZpZyA9IGxvYWRFbnZDb25maWcoKTtcblxuLyoqXG4gKiDorr7nva4gU0RLIOWFqOWxgOmFjee9rlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8g5LiA6KGM6Lez6L+HIFNTTCDpqozor4FcbiAqIHNldENvbmZpZyh7IGluc2VjdXJlOiB0cnVlIH0pO1xuICpcbiAqIC8vIOiuvue9ruS7o+eQhuWSjOi2heaXtlxuICogc2V0Q29uZmlnKHsgcHJveHk6ICdodHRwOi8vMTI3LjAuMC4xOjc4OTAnLCB0aW1lb3V0OiAzMDAwMCB9KTtcbiAqXG4gKiAvLyDkvb/nlKjoh6rlrprkuYkgZmV0Y2jvvIjlpoLmlK/mjIHku6PnkIbnmoQgdW5kaWNp77yJXG4gKiBpbXBvcnQgeyBQcm94eUFnZW50LCBmZXRjaCBhcyB1bmRpY2lGZXRjaCB9IGZyb20gJ3VuZGljaSc7XG4gKiBjb25zdCBhZ2VudCA9IG5ldyBQcm94eUFnZW50KCdodHRwOi8vMTI3LjAuMC4xOjc4OTAnKTtcbiAqIHNldENvbmZpZyh7IGN1c3RvbUZldGNoOiAodXJsLCBpbml0KSA9PiB1bmRpY2lGZXRjaCh1cmwsIHsgLi4uaW5pdCwgZGlzcGF0Y2hlcjogYWdlbnQgfSkgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbmZpZyhjb25maWc6IFNES0NvbmZpZyk6IHZvaWQge1xuICBnbG9iYWxDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICAvKiBOb2RlLmpzIOeOr+Wig+S4iyBpbnNlY3VyZSDoh6rliqjorr7nva7njq/looPlj5jph48gKi9cbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudikge1xuICAgIGlmIChjb25maWcuaW5zZWN1cmUpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQgPSAnMCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5OT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEO1xuICAgIH1cbiAgfVxufVxuXG4vKiog6I635Y+W5b2T5YmNIFNESyDlhajlsYDphY3nva4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcoKTogU0RLQ29uZmlnIHtcbiAgcmV0dXJuIGdsb2JhbENvbmZpZztcbn1cbiJdfQ==
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOztBQWtGSCw4QkFVQztBQUdELDhCQUVDO0FBN0RELGtCQUFrQjtBQUNsQixTQUFTLGFBQWE7SUFDcEIsTUFBTSxNQUFNLEdBQWMsRUFBRSxDQUFDO0lBQzdCLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3JHLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hFLElBQUksRUFBRSxLQUFLLE9BQU8sSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLEVBQUUsS0FBSyxNQUFNLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDdkQsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDL0MsTUFBTSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELElBQUksWUFBWSxHQUFjLGFBQWEsRUFBRSxDQUFDO0FBRTlDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE1BQWlCO0lBQ3pDLFlBQVksR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDN0IsbUNBQW1DO0lBQ25DLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztRQUNqRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxvQkFBb0I7QUFDcEIsU0FBZ0IsU0FBUztJQUN2QixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTREsg5YWo5bGA6YWN572uXG4gKiDljIXlkKvku6PnkIbjgIHotoXml7bjgIFTU0wg562J6K6+572u77yM5L2c55So5LqO5omA5pyJIEhUVFAg6K+35rGCXG4gKlxuICog5pSv5oyB546v5aKD5Y+Y6YeP6Ieq5Yqo6K+75Y+W77yI5LyY5YWI57qn5L2O5LqO5Luj56CB6K6+572u77yJ77yaXG4gKiAgIFRFTVBNQUlMX1BST1hZICAgIC0g5Luj55CGIFVSTFxuICogICBURU1QTUFJTF9USU1FT1VUICAtIOi2heaXtuavq+enkuaVsFxuICogICBURU1QTUFJTF9JTlNFQ1VSRSAtIOiuvuS4uiBcIjFcIiDmiJYgXCJ0cnVlXCIg6Lez6L+HIFNTTCDpqozor4FcbiAqICAgRFJPUE1BSUxfQVVUSF9UT0tFTiAvIERST1BNQUlMX0FQSV9UT0tFTiAtIERyb3BNYWlsIEdyYXBoUUwg55qEIGFmXyDku6TniYzvvIjlj6/pgInvvJvmnKrorr7nva7ml7YgU0RLIOS8miAvYXBpL3Rva2VuL2dlbmVyYXRlIOiOt+WPluW5tuWcqOWwhui/h+acn+aXtueUqCAvYXBpL3Rva2VuL3JlbmV3IOe7reacn++8iVxuICogICBEUk9QTUFJTF9OT19BVVRPX1RPS0VOIC0g6K6+5Li6IFwiMVwiIOaIliBcInRydWVcIiDliJnnpoHmraLoh6rliqjmi4nlj5Yv57ut5pyf5Luk54mMXG4gKiAgIERST1BNQUlMX1JFTkVXX0xJRkVUSU1FIC0g6Ieq5Yqo57ut5pyf6K+35rGC55qEIGxpZmV0aW1l77yM6buY6K6kIDFk77yI5LiO5a6Y572RIHJlbmV3IOaOpeWPo+S4gOiHtO+8iVxuICogICBURU1QTUFJTF9URUxFTUVUUllfRU5BQkxFRCAtIHRydWUvZmFsc2XvvIzpu5jorqQgdHJ1Ze+8m2ZhbHNlLzAvbm8g5YWz6Zet5Yy/5ZCN55So6YeP5LiK5oqlXG4gKiAgIFRFTVBNQUlMX1RFTEVNRVRSWV9VUkwgLSDoh6rlrprkuYnkuIrmiqXnq6/ngrkgVVJMXG4gKlxuICogTm9kZS5qcyDnjq/looPkuIvorr7nva4gaW5zZWN1cmUg5Lya6Ieq5Yqo6K6+572uIE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ9MFxuICovXG5cbi8qKlxuICogU0RLIOWFqOWxgOmFjee9ruaOpeWPo1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNES0NvbmZpZyB7XG4gIC8qKiDku6PnkIYgVVJM77yM5pSv5oyBIGh0dHAvaHR0cHMvc29ja3M177yM5aaCIFwiaHR0cDovLzEyNy4wLjAuMTo3ODkwXCIgKi9cbiAgcHJveHk/OiBzdHJpbmc7XG4gIC8qKiDlhajlsYDpu5jorqTotoXml7bvvIjmr6vnp5LvvInvvIzpu5jorqQgMTUwMDAgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIOi3s+i/hyBTU0wg6K+B5Lmm6aqM6K+B77yI6LCD6K+V55So77yJICovXG4gIGluc2VjdXJlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERyb3BNYWlsIOa4oOmBk+S4k+eUqO+8mkdyYXBoUUwg56uv54K5IGBodHRwczovL2Ryb3BtYWlsLm1lL2FwaS9ncmFwaHFsLyR7dG9rZW59YCDkuK3nmoQgdG9rZW7vvIjpobvkuLrlrpjnvZHnlJ/miJDnmoQgYGFmX2Ag5YmN57yA5Luk54mM77yJ44CCXG4gICAqIOS5n+WPr+mAmui/h+eOr+Wig+WPmOmHjyBEUk9QTUFJTF9BVVRIX1RPS0VOIOaIliBEUk9QTUFJTF9BUElfVE9LRU4g5o+Q5L6b44CCXG4gICAqIOacqumFjee9ruS4lOacquiuvue9riBEUk9QTUFJTF9OT19BVVRPX1RPS0VOIOaXtu+8jOS8muWQkSBodHRwczovL2Ryb3BtYWlsLm1lL2FwaS90b2tlbi9nZW5lcmF0ZSDnlLPor7cgMWgg5Luk54mM5bm25YaF5a2Y57yT5a2Y44CCXG4gICAqL1xuICBkcm9wbWFpbEF1dGhUb2tlbj86IHN0cmluZztcbiAgLyoqIOS4uiB0cnVlIOaXtuS4jeiHquWKqOivt+axgiB0b2tlbu+8iOmhu+mFjee9riBkcm9wbWFpbEF1dGhUb2tlbiDmiJbnjq/looPlj5jph4/vvIkgKi9cbiAgZHJvcG1haWxEaXNhYmxlQXV0b1Rva2VuPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOiHquWKqOeuoeeQhuS7pOeJjOWNs+Wwhui/h+acn+aXtu+8jOiwg+eUqCAvYXBpL3Rva2VuL3JlbmV3IOS9v+eUqOeahCBsaWZldGltZe+8iOWmgiAxaOOAgTFk77yJ44CCXG4gICAqIOS5n+WPr+mAmui/h+eOr+Wig+WPmOmHjyBEUk9QTUFJTF9SRU5FV19MSUZFVElNRSDorr7nva7jgIJcbiAgICovXG4gIGRyb3BtYWlsUmVuZXdMaWZldGltZT86IHN0cmluZztcbiAgLyoqXG4gICAqIOiHquWumuS5iSBmZXRjaCDlh73mlbDvvIznlKjkuo7lrozlhajmjqfliLYgSFRUUCDor7fmsYLooYzkuLpcbiAgICog5b2T6K6+572u5LqGIHByb3h5IOS9hueOr+Wig+S4jeaUr+aMgSB1bmRpY2kg5pe277yM5Y+v6YCa6L+H5q2k6YCJ6aG55Lyg5YWl5pSv5oyB5Luj55CG55qEIGZldGNoIOWunueOsFxuICAgKi9cbiAgY3VzdG9tRmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG4gIC8qKiDkuLogZmFsc2Ug5pe25YWz6Zet5Yy/5ZCN55So6YeP5LiK5oql77yb5pyq6K6+572u5pe26buY6K6k5byA5ZCvICovXG4gIHRlbGVtZXRyeUVuYWJsZWQ/OiBib29sZWFuO1xuICAvKiog6Z2e56m65pe26KaG55uW6buY6K6k5LiK5oqlIFVSTCAqL1xuICB0ZWxlbWV0cnlVcmw/OiBzdHJpbmc7XG59XG5cbi8qKiDku47njq/looPlj5jph4/or7vlj5bpu5jorqTphY3nva4gKi9cbmZ1bmN0aW9uIGxvYWRFbnZDb25maWcoKTogU0RLQ29uZmlnIHtcbiAgY29uc3QgY29uZmlnOiBTREtDb25maWcgPSB7fTtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudikge1xuICAgIGlmIChwcm9jZXNzLmVudi5URU1QTUFJTF9QUk9YWSkge1xuICAgICAgY29uZmlnLnByb3h5ID0gcHJvY2Vzcy5lbnYuVEVNUE1BSUxfUFJPWFk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5URU1QTUFJTF9USU1FT1VUKSB7XG4gICAgICBjb25zdCB0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVEVNUE1BSUxfVElNRU9VVCwgMTApO1xuICAgICAgaWYgKCFpc05hTih0KSAmJiB0ID4gMCkgY29uZmlnLnRpbWVvdXQgPSB0O1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVNUE1BSUxfSU5TRUNVUkUgPT09ICcxJyB8fCBwcm9jZXNzLmVudi5URU1QTUFJTF9JTlNFQ1VSRT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnKSB7XG4gICAgICBjb25maWcuaW5zZWN1cmUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB0ZSA9IHByb2Nlc3MuZW52LlRFTVBNQUlMX1RFTEVNRVRSWV9FTkFCTEVEPy50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodGUgPT09ICdmYWxzZScgfHwgdGUgPT09ICcwJyB8fCB0ZSA9PT0gJ25vJykge1xuICAgICAgY29uZmlnLnRlbGVtZXRyeUVuYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHRlID09PSAndHJ1ZScgfHwgdGUgPT09ICcxJyB8fCB0ZSA9PT0gJ3llcycpIHtcbiAgICAgIGNvbmZpZy50ZWxlbWV0cnlFbmFibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LlRFTVBNQUlMX1RFTEVNRVRSWV9VUkw/LnRyaW0oKSkge1xuICAgICAgY29uZmlnLnRlbGVtZXRyeVVybCA9IHByb2Nlc3MuZW52LlRFTVBNQUlMX1RFTEVNRVRSWV9VUkwudHJpbSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG5sZXQgZ2xvYmFsQ29uZmlnOiBTREtDb25maWcgPSBsb2FkRW52Q29uZmlnKCk7XG5cbi8qKlxuICog6K6+572uIFNESyDlhajlsYDphY3nva5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIOS4gOihjOi3s+i/hyBTU0wg6aqM6K+BXG4gKiBzZXRDb25maWcoeyBpbnNlY3VyZTogdHJ1ZSB9KTtcbiAqXG4gKiAvLyDorr7nva7ku6PnkIblkozotoXml7ZcbiAqIHNldENvbmZpZyh7IHByb3h5OiAnaHR0cDovLzEyNy4wLjAuMTo3ODkwJywgdGltZW91dDogMzAwMDAgfSk7XG4gKlxuICogLy8g5L2/55So6Ieq5a6a5LmJIGZldGNo77yI5aaC5pSv5oyB5Luj55CG55qEIHVuZGljae+8iVxuICogaW1wb3J0IHsgUHJveHlBZ2VudCwgZmV0Y2ggYXMgdW5kaWNpRmV0Y2ggfSBmcm9tICd1bmRpY2knO1xuICogY29uc3QgYWdlbnQgPSBuZXcgUHJveHlBZ2VudCgnaHR0cDovLzEyNy4wLjAuMTo3ODkwJyk7XG4gKiBzZXRDb25maWcoeyBjdXN0b21GZXRjaDogKHVybCwgaW5pdCkgPT4gdW5kaWNpRmV0Y2godXJsLCB7IC4uLmluaXQsIGRpc3BhdGNoZXI6IGFnZW50IH0pIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb25maWcoY29uZmlnOiBTREtDb25maWcpOiB2b2lkIHtcbiAgZ2xvYmFsQ29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgLyogTm9kZS5qcyDnjq/looPkuIsgaW5zZWN1cmUg6Ieq5Yqo6K6+572u546v5aKD5Y+Y6YePICovXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYpIHtcbiAgICBpZiAoY29uZmlnLmluc2VjdXJlKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEID0gJzAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRDtcbiAgICB9XG4gIH1cbn1cblxuLyoqIOiOt+WPluW9k+WJjSBTREsg5YWo5bGA6YWN572uICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IFNES0NvbmZpZyB7XG4gIHJldHVybiBnbG9iYWxDb25maWc7XG59XG4iXX0=
package/dist/index.d.ts CHANGED
@@ -2,9 +2,11 @@ import { Channel, EmailInfo, GetEmailsResult, GenerateEmailOptions, GetEmailsOpt
2
2
  import { setConfig, getConfig } from './config';
3
3
  export { Channel, EmailInfo, Email, EmailAttachment, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
4
4
  export { normalizeEmail } from './normalize';
5
- export { withRetry, fetchWithTimeout, RetryOptions } from './retry';
5
+ export { withRetry, withRetryWithAttempts, fetchWithTimeout, RetryOptions } from './retry';
6
+ export type { RetryWithAttemptsResult, FetchWithTimeoutOptions } from './retry';
6
7
  export { LogLevel, LogHandler, setLogLevel, getLogLevel, setLogger, logger } from './logger';
7
8
  export { SDKConfig, setConfig, getConfig } from './config';
9
+ export { getSdkVersion } from './version';
8
10
  export type { SyntheticBrowserProfile } from './providers/linshi-token';
9
11
  export { deriveLinshiApiPathKey, randomSyntheticLinshiKey, randomBrowserLikeProfile, syntheticVisitorIdFromProfile, } from './providers/linshi-token';
10
12
  /**
package/dist/index.js CHANGED
@@ -33,12 +33,16 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.TempEmailClient = exports.syntheticVisitorIdFromProfile = exports.randomBrowserLikeProfile = exports.randomSyntheticLinshiKey = exports.deriveLinshiApiPathKey = exports.getConfig = exports.setConfig = exports.logger = exports.setLogger = exports.getLogLevel = exports.setLogLevel = exports.LogLevel = exports.fetchWithTimeout = exports.withRetry = exports.normalizeEmail = void 0;
36
+ exports.TempEmailClient = exports.syntheticVisitorIdFromProfile = exports.randomBrowserLikeProfile = exports.randomSyntheticLinshiKey = exports.deriveLinshiApiPathKey = exports.getSdkVersion = exports.getConfig = exports.setConfig = exports.logger = exports.setLogger = exports.getLogLevel = exports.setLogLevel = exports.LogLevel = exports.fetchWithTimeout = exports.withRetryWithAttempts = exports.withRetry = exports.normalizeEmail = void 0;
37
37
  exports.listChannels = listChannels;
38
38
  exports.getChannelInfo = getChannelInfo;
39
39
  exports.generateEmail = generateEmail;
40
40
  exports.getEmails = getEmails;
41
41
  const tempmail = __importStar(require("./providers/tempmail"));
42
+ const tempmailCn = __importStar(require("./providers/tempmail-cn"));
43
+ const tmpmails = __importStar(require("./providers/tmpmails"));
44
+ const taEasy = __importStar(require("./providers/ta-easy"));
45
+ const tenmailWangtz = __importStar(require("./providers/10mail-wangtz"));
42
46
  const linshiEmail = __importStar(require("./providers/linshi-email"));
43
47
  const linshiyou = __importStar(require("./providers/linshiyou"));
44
48
  const mffac = __importStar(require("./providers/mffac"));
@@ -58,7 +62,10 @@ const minmail = __importStar(require("./providers/minmail"));
58
62
  const vip215 = __importStar(require("./providers/vip-215"));
59
63
  const anonbox = __importStar(require("./providers/anonbox"));
60
64
  const fakeLegal = __importStar(require("./providers/fake-legal"));
65
+ const moakt = __importStar(require("./providers/moakt"));
66
+ const tenminuteOne = __importStar(require("./providers/10minute-one"));
61
67
  const retry_1 = require("./retry");
68
+ const telemetry_1 = require("./telemetry");
62
69
  const logger_1 = require("./logger");
63
70
  const config_1 = require("./config");
64
71
  /**
@@ -72,6 +79,7 @@ var normalize_1 = require("./normalize");
72
79
  Object.defineProperty(exports, "normalizeEmail", { enumerable: true, get: function () { return normalize_1.normalizeEmail; } });
73
80
  var retry_2 = require("./retry");
74
81
  Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return retry_2.withRetry; } });
82
+ Object.defineProperty(exports, "withRetryWithAttempts", { enumerable: true, get: function () { return retry_2.withRetryWithAttempts; } });
75
83
  Object.defineProperty(exports, "fetchWithTimeout", { enumerable: true, get: function () { return retry_2.fetchWithTimeout; } });
76
84
  var logger_2 = require("./logger");
77
85
  Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logger_2.LogLevel; } });
@@ -82,16 +90,23 @@ Object.defineProperty(exports, "logger", { enumerable: true, get: function () {
82
90
  var config_2 = require("./config");
83
91
  Object.defineProperty(exports, "setConfig", { enumerable: true, get: function () { return config_2.setConfig; } });
84
92
  Object.defineProperty(exports, "getConfig", { enumerable: true, get: function () { return config_2.getConfig; } });
93
+ var version_1 = require("./version");
94
+ Object.defineProperty(exports, "getSdkVersion", { enumerable: true, get: function () { return version_1.getSdkVersion; } });
85
95
  var linshi_token_1 = require("./providers/linshi-token");
86
96
  Object.defineProperty(exports, "deriveLinshiApiPathKey", { enumerable: true, get: function () { return linshi_token_1.deriveLinshiApiPathKey; } });
87
97
  Object.defineProperty(exports, "randomSyntheticLinshiKey", { enumerable: true, get: function () { return linshi_token_1.randomSyntheticLinshiKey; } });
88
98
  Object.defineProperty(exports, "randomBrowserLikeProfile", { enumerable: true, get: function () { return linshi_token_1.randomBrowserLikeProfile; } });
89
99
  Object.defineProperty(exports, "syntheticVisitorIdFromProfile", { enumerable: true, get: function () { return linshi_token_1.syntheticVisitorIdFromProfile; } });
90
100
  /** 所有支持的渠道列表,用于随机选择和遍历 */
91
- const allChannels = ['tempmail', 'linshi-email', 'linshiyou', 'mffac', 'tempmail-lol', 'chatgpt-org-uk', 'temp-mail-io', 'awamail', 'temporary-email-org', 'mail-tm', 'mail-cx', 'dropmail', 'guerrillamail', 'maildrop', 'smail-pw', 'boomlify', 'minmail', 'vip-215', 'anonbox', 'fake-legal'];
101
+ const allChannels = ['tempmail', 'tempmail-cn', 'tmpmails', 'ta-easy', '10mail-wangtz', '10minute-one', 'linshi-email', 'linshiyou', 'mffac', 'tempmail-lol', 'chatgpt-org-uk', 'temp-mail-io', 'awamail', 'temporary-email-org', 'mail-tm', 'mail-cx', 'dropmail', 'guerrillamail', 'maildrop', 'smail-pw', 'boomlify', 'minmail', 'vip-215', 'anonbox', 'fake-legal', 'moakt'];
92
102
  /** 渠道信息映射表 */
93
103
  const channelInfoMap = {
94
104
  'tempmail': { channel: 'tempmail', name: 'TempMail', website: 'tempmail.ing' },
105
+ 'tempmail-cn': { channel: 'tempmail-cn', name: 'TempMail CN', website: 'tempmail.cn' },
106
+ 'tmpmails': { channel: 'tmpmails', name: 'TmpMails', website: 'tmpmails.com' },
107
+ 'ta-easy': { channel: 'ta-easy', name: 'TA Easy', website: 'ta-easy.com' },
108
+ '10mail-wangtz': { channel: '10mail-wangtz', name: '10mail Wangtz', website: '10mail.wangtz.cn' },
109
+ '10minute-one': { channel: '10minute-one', name: '10 Minute Email', website: '10minutemail.one' },
95
110
  'linshi-email': { channel: 'linshi-email', name: '临时邮箱', website: 'linshi-email.com' },
96
111
  'linshiyou': { channel: 'linshiyou', name: '临时邮', website: 'linshiyou.com' },
97
112
  'tempmail-lol': { channel: 'tempmail-lol', name: 'TempMail LOL', website: 'tempmail.lol' },
@@ -111,6 +126,7 @@ const channelInfoMap = {
111
126
  'vip-215': { channel: 'vip-215', name: 'VIP 215', website: 'vip.215.im' },
112
127
  'anonbox': { channel: 'anonbox', name: 'Anonbox', website: 'anonbox.net' },
113
128
  'fake-legal': { channel: 'fake-legal', name: 'Fake Legal', website: 'fake.legal' },
129
+ 'moakt': { channel: 'moakt', name: 'Moakt', website: 'moakt.com' },
114
130
  };
115
131
  /**
116
132
  * 获取所有支持的渠道列表
@@ -161,11 +177,16 @@ async function generateEmail(options = {}) {
161
177
  */
162
178
  const allowFallback = options.channelFallback !== false;
163
179
  const tryOrder = buildChannelOrder(options.channel, allowFallback);
180
+ let channelsTried = 0;
181
+ let lastErr = '';
164
182
  for (const ch of tryOrder) {
183
+ channelsTried += 1;
165
184
  logger_1.logger.info(`创建临时邮箱, 渠道: ${ch}`);
166
- try {
167
- const internal = await (0, retry_1.withRetry)(() => generateEmailOnce(ch, options), options.retry);
185
+ const r = await (0, retry_1.withRetryWithAttempts)(() => generateEmailOnce(ch, options), options.retry);
186
+ if (r.ok) {
187
+ const internal = r.value;
168
188
  logger_1.logger.info(`邮箱创建成功: ${internal.email} (渠道: ${ch})`);
189
+ (0, telemetry_1.reportTelemetry)('generate_email', ch, true, r.attempts, channelsTried, '');
169
190
  /* 将 token 存入内部存储,不暴露给用户 */
170
191
  const publicInfo = {
171
192
  channel: internal.channel,
@@ -178,11 +199,12 @@ async function generateEmail(options = {}) {
178
199
  }
179
200
  return publicInfo;
180
201
  }
181
- catch (err) {
182
- logger_1.logger.warn(`渠道 ${ch} 不可用: ${err.message || err},尝试下一个渠道`);
183
- }
202
+ const msg = r.error?.message || String(r.error);
203
+ lastErr = msg;
204
+ logger_1.logger.warn(`渠道 ${ch} 不可用: ${msg},尝试下一个渠道`);
184
205
  }
185
206
  logger_1.logger.error('所有渠道均不可用,创建邮箱失败');
207
+ (0, telemetry_1.reportTelemetry)('generate_email', '', false, 0, channelsTried, lastErr);
186
208
  return null;
187
209
  }
188
210
  /**
@@ -209,6 +231,16 @@ async function generateEmailOnce(channel, options) {
209
231
  switch (channel) {
210
232
  case 'tempmail':
211
233
  return tempmail.generateEmail(options.duration || 30);
234
+ case 'tempmail-cn':
235
+ return tempmailCn.generateEmail(options.domain ?? null);
236
+ case 'tmpmails':
237
+ return tmpmails.generateEmail(options.domain ?? null);
238
+ case 'ta-easy':
239
+ return taEasy.generateEmail();
240
+ case '10mail-wangtz':
241
+ return tenmailWangtz.generateEmail(options.domain ?? null);
242
+ case '10minute-one':
243
+ return tenminuteOne.generateEmail(options.domain ?? null);
212
244
  case 'linshi-email':
213
245
  return linshiEmail.generateEmail();
214
246
  case 'linshiyou':
@@ -245,6 +277,8 @@ async function generateEmailOnce(channel, options) {
245
277
  return anonbox.generateEmail();
246
278
  case 'fake-legal':
247
279
  return fakeLegal.generateEmail(options.domain ?? null);
280
+ case 'moakt':
281
+ return moakt.generateEmail(options.domain ?? null);
248
282
  default:
249
283
  throw new Error(`Unknown channel: ${channel}`);
250
284
  }
@@ -273,35 +307,41 @@ async function generateEmailOnce(channel, options) {
273
307
  */
274
308
  async function getEmails(info, options) {
275
309
  if (!info) {
310
+ (0, telemetry_1.reportTelemetry)('get_emails', '', false, 0, 0, 'EmailInfo is required, call generateEmail() first');
276
311
  throw new Error('EmailInfo is required, call generateEmail() first');
277
312
  }
278
313
  const { channel, email } = info;
279
314
  const token = tokenStore.get(info);
280
315
  if (!channel) {
316
+ (0, telemetry_1.reportTelemetry)('get_emails', '', false, 0, 0, 'Channel is required');
281
317
  throw new Error('Channel is required');
282
318
  }
283
319
  if (!email && channel !== 'tempmail-lol') {
320
+ (0, telemetry_1.reportTelemetry)('get_emails', channel, false, 0, 0, 'Email is required');
284
321
  throw new Error('Email is required');
285
322
  }
286
323
  logger_1.logger.debug(`获取邮件, 渠道: ${channel}, 邮箱: ${email}`);
287
- try {
288
- const emails = await (0, retry_1.withRetry)(() => getEmailsOnce(channel, email, token), options?.retry);
324
+ const gr = await (0, retry_1.withRetryWithAttempts)(() => getEmailsOnce(channel, email, token), options?.retry);
325
+ if (gr.ok) {
326
+ const emails = gr.value;
289
327
  if (emails.length > 0) {
290
328
  logger_1.logger.info(`获取到 ${emails.length} 封邮件, 渠道: ${channel}`);
291
329
  }
292
330
  else {
293
331
  logger_1.logger.debug(`暂无邮件, 渠道: ${channel}`);
294
332
  }
333
+ (0, telemetry_1.reportTelemetry)('get_emails', channel, true, gr.attempts, 0, '');
295
334
  return { channel, email, emails, success: true };
296
335
  }
297
- catch (err) {
298
- /*
299
- * 重试耗尽后仍然失败 → 返回空结果而非抛异常
300
- * 这样调用方在轮询场景下不会因为一次网络波动而中断整个流程
301
- */
302
- logger_1.logger.error(`获取邮件失败, 渠道: ${channel}, 错误: ${err.message || err}`);
303
- return { channel, email, emails: [], success: false };
304
- }
336
+ const err = gr.error;
337
+ const errMsg = err?.message || String(err);
338
+ /*
339
+ * 重试耗尽后仍然失败 → 返回空结果而非抛异常
340
+ * 这样调用方在轮询场景下不会因为一次网络波动而中断整个流程
341
+ */
342
+ logger_1.logger.error(`获取邮件失败, 渠道: ${channel}, 错误: ${errMsg}`);
343
+ (0, telemetry_1.reportTelemetry)('get_emails', channel, false, gr.attempts, 0, errMsg);
344
+ return { channel, email, emails: [], success: false };
305
345
  }
306
346
  /**
307
347
  * 单次获取邮件(不含重试逻辑)
@@ -311,6 +351,22 @@ async function getEmailsOnce(channel, email, token) {
311
351
  switch (channel) {
312
352
  case 'tempmail':
313
353
  return tempmail.getEmails(email);
354
+ case 'tempmail-cn':
355
+ return tempmailCn.getEmails(email);
356
+ case 'tmpmails':
357
+ if (!token)
358
+ throw new Error('internal error: token missing for tmpmails');
359
+ return tmpmails.getEmails(email, token);
360
+ case 'ta-easy':
361
+ if (!token)
362
+ throw new Error('internal error: token missing for ta-easy');
363
+ return taEasy.getEmails(email, token);
364
+ case '10mail-wangtz':
365
+ return tenmailWangtz.getEmails(email);
366
+ case '10minute-one':
367
+ if (!token)
368
+ throw new Error('internal error: token missing for 10minute-one');
369
+ return tenminuteOne.getEmails(email, token);
314
370
  case 'linshi-email':
315
371
  if (!token)
316
372
  throw new Error('internal error: token missing for linshi-email');
@@ -379,6 +435,10 @@ async function getEmailsOnce(channel, email, token) {
379
435
  return anonbox.getEmails(token, email);
380
436
  case 'fake-legal':
381
437
  return fakeLegal.getEmails(email);
438
+ case 'moakt':
439
+ if (!token)
440
+ throw new Error('internal error: token missing for moakt');
441
+ return moakt.getEmails(email, token);
382
442
  default:
383
443
  throw new Error(`Unknown channel: ${channel}`);
384
444
  }
@@ -421,6 +481,7 @@ class TempEmailClient {
421
481
  */
422
482
  async getEmails(options) {
423
483
  if (!this.emailInfo) {
484
+ (0, telemetry_1.reportTelemetry)('get_emails', '', false, 0, 0, 'No email generated. Call generate() first.');
424
485
  throw new Error('No email generated. Call generate() first.');
425
486
  }
426
487
  return getEmails(this.emailInfo, options);
@@ -443,4 +504,4 @@ exports.default = {
443
504
  setConfig: config_1.setConfig,
444
505
  getConfig: config_1.getConfig,
445
506
  };
446
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0dBLG9DQUVDO0FBUUQsd0NBRUM7QUFvQkQsc0NBaUNDO0FBMEZELDhCQWdDQztBQTNSRCwrREFBaUQ7QUFDakQsc0VBQXdEO0FBQ3hELGlFQUFtRDtBQUNuRCx5REFBMkM7QUFDM0Msc0VBQXdEO0FBQ3hELHlFQUEyRDtBQUMzRCxxRUFBdUQ7QUFDdkQsNkRBQStDO0FBQy9DLG1GQUFxRTtBQUNyRSw0REFBOEM7QUFDOUMsNERBQThDO0FBQzlDLCtEQUFpRDtBQUNqRCx5RUFBMkQ7QUFDM0QsdUVBQXlEO0FBQ3pELDhEQUFnRDtBQUNoRCwrREFBaUQ7QUFDakQsNkRBQStDO0FBQy9DLDREQUE4QztBQUM5Qyw2REFBK0M7QUFDL0Msa0VBQW9EO0FBRXBELG1DQUFvQztBQUNwQyxxQ0FBa0M7QUFDbEMscUNBQWdEO0FBSWhEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7QUFDcEQseUNBQTZDO0FBQXBDLDJHQUFBLGNBQWMsT0FBQTtBQUN2QixpQ0FBb0U7QUFBM0Qsa0dBQUEsU0FBUyxPQUFBO0FBQUUseUdBQUEsZ0JBQWdCLE9BQUE7QUFDcEMsbUNBQTZGO0FBQXBGLGtHQUFBLFFBQVEsT0FBQTtBQUFjLHFHQUFBLFdBQVcsT0FBQTtBQUFFLHFHQUFBLFdBQVcsT0FBQTtBQUFFLG1HQUFBLFNBQVMsT0FBQTtBQUFFLGdHQUFBLE1BQU0sT0FBQTtBQUMxRSxtQ0FBMkQ7QUFBdkMsbUdBQUEsU0FBUyxPQUFBO0FBQUUsbUdBQUEsU0FBUyxPQUFBO0FBRXhDLHlEQUtrQztBQUpoQyxzSEFBQSxzQkFBc0IsT0FBQTtBQUN0Qix3SEFBQSx3QkFBd0IsT0FBQTtBQUN4Qix3SEFBQSx3QkFBd0IsT0FBQTtBQUN4Qiw2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T0FHRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBbENELDBDQWtDQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7SUFDZixTQUFTLEVBQVQsa0JBQVM7SUFDVCxTQUFTLEVBQVQsa0JBQVM7Q0FDVixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdGVtcG1haWwgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwnO1xuaW1wb3J0ICogYXMgbGluc2hpRW1haWwgZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLWVtYWlsJztcbmltcG9ydCAqIGFzIGxpbnNoaXlvdSBmcm9tICcuL3Byb3ZpZGVycy9saW5zaGl5b3UnO1xuaW1wb3J0ICogYXMgbWZmYWMgZnJvbSAnLi9wcm92aWRlcnMvbWZmYWMnO1xuaW1wb3J0ICogYXMgdGVtcG1haWxMb2wgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwtbG9sJztcbmltcG9ydCAqIGFzIGNoYXRncHRPcmdVayBmcm9tICcuL3Byb3ZpZGVycy9jaGF0Z3B0LW9yZy11ayc7XG5pbXBvcnQgKiBhcyB0ZW1wTWFpbElPIGZyb20gJy4vcHJvdmlkZXJzL3RlbXAtbWFpbC1pbyc7XG5pbXBvcnQgKiBhcyBhd2FtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2F3YW1haWwnO1xuaW1wb3J0ICogYXMgdGVtcG9yYXJ5RW1haWxPcmcgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG9yYXJ5LWVtYWlsLW9yZyc7XG5pbXBvcnQgKiBhcyBtYWlsVG0gZnJvbSAnLi9wcm92aWRlcnMvbWFpbC10bSc7XG5pbXBvcnQgKiBhcyBtYWlsQ3ggZnJvbSAnLi9wcm92aWRlcnMvbWFpbC1jeCc7XG5pbXBvcnQgKiBhcyBkcm9wbWFpbCBmcm9tICcuL3Byb3ZpZGVycy9kcm9wbWFpbCc7XG5pbXBvcnQgKiBhcyBndWVycmlsbGFtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2d1ZXJyaWxsYW1haWwnO1xuaW1wb3J0ICogYXMgbWFpbGRyb3BQcm92aWRlciBmcm9tICcuL3Byb3ZpZGVycy9tYWlsZHJvcCc7XG5pbXBvcnQgKiBhcyBzbWFpbFB3IGZyb20gJy4vcHJvdmlkZXJzL3NtYWlsLXB3JztcbmltcG9ydCAqIGFzIGJvb21saWZ5IGZyb20gJy4vcHJvdmlkZXJzL2Jvb21saWZ5JztcbmltcG9ydCAqIGFzIG1pbm1haWwgZnJvbSAnLi9wcm92aWRlcnMvbWlubWFpbCc7XG5pbXBvcnQgKiBhcyB2aXAyMTUgZnJvbSAnLi9wcm92aWRlcnMvdmlwLTIxNSc7XG5pbXBvcnQgKiBhcyBhbm9uYm94IGZyb20gJy4vcHJvdmlkZXJzL2Fub25ib3gnO1xuaW1wb3J0ICogYXMgZmFrZUxlZ2FsIGZyb20gJy4vcHJvdmlkZXJzL2Zha2UtbGVnYWwnO1xuaW1wb3J0IHsgQ2hhbm5lbCwgRW1haWxJbmZvLCBJbnRlcm5hbEVtYWlsSW5mbywgRW1haWwsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJy4vcmV0cnknO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2V0Q29uZmlnLCBnZXRDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmV4cG9ydCB7IENoYW5uZWwsIEVtYWlsSW5mbywgRW1haWwsIEVtYWlsQXR0YWNobWVudCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNESyDlhoXpg6ggdG9rZW4g5a2Y5YKoXG4gKiDkvb/nlKggV2Vha01hcCDlsIYgRW1haWxJbmZvIOWvueixoeaYoOWwhOWIsOWvueW6lOeahCB0b2tlblxuICog55So5oi35peg5rOV55u05o6l6K6/6ZeuIHRva2Vu77yM55SxIFNESyDoh6rliqjnrqHnkIZcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCB0b2tlblN0b3JlID0gbmV3IFdlYWtNYXA8RW1haWxJbmZvLCBzdHJpbmc+KCk7XG5leHBvcnQgeyBub3JtYWxpemVFbWFpbCB9IGZyb20gJy4vbm9ybWFsaXplJztcbmV4cG9ydCB7IHdpdGhSZXRyeSwgZmV0Y2hXaXRoVGltZW91dCwgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi9yZXRyeSc7XG5leHBvcnQgeyBMb2dMZXZlbCwgTG9nSGFuZGxlciwgc2V0TG9nTGV2ZWwsIGdldExvZ0xldmVsLCBzZXRMb2dnZXIsIGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCB7IFNES0NvbmZpZywgc2V0Q29uZmlnLCBnZXRDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5leHBvcnQgdHlwZSB7IFN5bnRoZXRpY0Jyb3dzZXJQcm9maWxlIH0gZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLXRva2VuJztcbmV4cG9ydCB7XG4gIGRlcml2ZUxpbnNoaUFwaVBhdGhLZXksXG4gIHJhbmRvbVN5bnRoZXRpY0xpbnNoaUtleSxcbiAgcmFuZG9tQnJvd3Nlckxpa2VQcm9maWxlLFxuICBzeW50aGV0aWNWaXNpdG9ySWRGcm9tUHJvZmlsZSxcbn0gZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLXRva2VuJztcblxuLyoqIOaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqO+8jOeUqOS6jumaj+acuumAieaLqeWSjOmBjeWOhiAqL1xuY29uc3QgYWxsQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsndGVtcG1haWwnLCAnbGluc2hpLWVtYWlsJywgJ2xpbnNoaXlvdScsICdtZmZhYycsICd0ZW1wbWFpbC1sb2wnLCAnY2hhdGdwdC1vcmctdWsnLCAndGVtcC1tYWlsLWlvJywgJ2F3YW1haWwnLCAndGVtcG9yYXJ5LWVtYWlsLW9yZycsICdtYWlsLXRtJywgJ21haWwtY3gnLCAnZHJvcG1haWwnLCAnZ3VlcnJpbGxhbWFpbCcsICdtYWlsZHJvcCcsICdzbWFpbC1wdycsICdib29tbGlmeScsICdtaW5tYWlsJywgJ3ZpcC0yMTUnLCAnYW5vbmJveCcsICdmYWtlLWxlZ2FsJ107XG5cbi8qKlxuICog5rig6YGT5L+h5oGv77yM5YyF5ZCr5rig6YGT5qCH6K+G44CB5pi+56S65ZCN56ew5ZKM5a+55bqU572R56uZXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbm5lbEluZm8ge1xuICAvKiog5rig6YGT5qCH6K+GICovXG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIC8qKiDmuKDpgZPmmL7npLrlkI3np7AgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiog5a+55bqU55qE5Li05pe26YKu566x5pyN5Yqh572R56uZICovXG4gIHdlYnNpdGU6IHN0cmluZztcbn1cblxuLyoqIOa4oOmBk+S/oeaBr+aYoOWwhOihqCAqL1xuY29uc3QgY2hhbm5lbEluZm9NYXA6IFJlY29yZDxDaGFubmVsLCBDaGFubmVsSW5mbz4gPSB7XG4gICd0ZW1wbWFpbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsJywgbmFtZTogJ1RlbXBNYWlsJywgd2Vic2l0ZTogJ3RlbXBtYWlsLmluZycgfSxcbiAgJ2xpbnNoaS1lbWFpbCc6IHsgY2hhbm5lbDogJ2xpbnNoaS1lbWFpbCcsIG5hbWU6ICfkuLTml7bpgq7nrrEnLCB3ZWJzaXRlOiAnbGluc2hpLWVtYWlsLmNvbScgfSxcbiAgJ2xpbnNoaXlvdSc6IHsgY2hhbm5lbDogJ2xpbnNoaXlvdScsIG5hbWU6ICfkuLTml7bpgq4nLCB3ZWJzaXRlOiAnbGluc2hpeW91LmNvbScgfSxcbiAgJ3RlbXBtYWlsLWxvbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsLWxvbCcsIG5hbWU6ICdUZW1wTWFpbCBMT0wnLCB3ZWJzaXRlOiAndGVtcG1haWwubG9sJyB9LFxuICAnY2hhdGdwdC1vcmctdWsnOiB7IGNoYW5uZWw6ICdjaGF0Z3B0LW9yZy11aycsIG5hbWU6ICdDaGF0R1BUIE1haWwnLCB3ZWJzaXRlOiAnbWFpbC5jaGF0Z3B0Lm9yZy51aycgfSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycsIG5hbWU6ICdUZW1wIE1haWwgSU8nLCB3ZWJzaXRlOiAndGVtcC1tYWlsLmlvJyB9LFxuICAnYXdhbWFpbCc6IHsgY2hhbm5lbDogJ2F3YW1haWwnLCBuYW1lOiAnQXdhTWFpbCcsIHdlYnNpdGU6ICdhd2FtYWlsLmNvbScgfSxcbiAgJ3RlbXBvcmFyeS1lbWFpbC1vcmcnOiB7IGNoYW5uZWw6ICd0ZW1wb3JhcnktZW1haWwtb3JnJywgbmFtZTogJ1RlbXBvcmFyeSBFbWFpbCcsIHdlYnNpdGU6ICd0ZW1wb3JhcnktZW1haWwub3JnJyB9LFxuICAnbWFpbC10bSc6IHsgY2hhbm5lbDogJ21haWwtdG0nLCBuYW1lOiAnTWFpbC50bScsIHdlYnNpdGU6ICdtYWlsLnRtJyB9LFxuICAnbWFpbC1jeCc6IHsgY2hhbm5lbDogJ21haWwtY3gnLCBuYW1lOiAnTWFpbC5jeCcsIHdlYnNpdGU6ICdtYWlsLmN4JyB9LFxuICAnZHJvcG1haWwnOiB7IGNoYW5uZWw6ICdkcm9wbWFpbCcsIG5hbWU6ICdEcm9wTWFpbCcsIHdlYnNpdGU6ICdkcm9wbWFpbC5tZScgfSxcbiAgJ2d1ZXJyaWxsYW1haWwnOiB7IGNoYW5uZWw6ICdndWVycmlsbGFtYWlsJywgbmFtZTogJ0d1ZXJyaWxsYSBNYWlsJywgd2Vic2l0ZTogJ2d1ZXJyaWxsYW1haWwuY29tJyB9LFxuICAnbWFpbGRyb3AnOiB7IGNoYW5uZWw6ICdtYWlsZHJvcCcsIG5hbWU6ICdNYWlsZHJvcCcsIHdlYnNpdGU6ICdtYWlsZHJvcC5jeCcgfSxcbiAgJ3NtYWlsLXB3JzogeyBjaGFubmVsOiAnc21haWwtcHcnLCBuYW1lOiAnU21haWwucHcnLCB3ZWJzaXRlOiAnc21haWwucHcnIH0sXG4gICdib29tbGlmeSc6IHsgY2hhbm5lbDogJ2Jvb21saWZ5JywgbmFtZTogJ0Jvb21saWZ5Jywgd2Vic2l0ZTogJ2Jvb21saWZ5LmNvbScgfSxcbiAgJ21pbm1haWwnOiB7IGNoYW5uZWw6ICdtaW5tYWlsJywgbmFtZTogJ01pbk1haWwnLCB3ZWJzaXRlOiAnbWlubWFpbC5hcHAnIH0sXG4gICdtZmZhYyc6IHsgY2hhbm5lbDogJ21mZmFjJywgbmFtZTogJ01GRkFDJywgd2Vic2l0ZTogJ21mZmFjLmNvbScgfSxcbiAgJ3ZpcC0yMTUnOiB7IGNoYW5uZWw6ICd2aXAtMjE1JywgbmFtZTogJ1ZJUCAyMTUnLCB3ZWJzaXRlOiAndmlwLjIxNS5pbScgfSxcbiAgJ2Fub25ib3gnOiB7IGNoYW5uZWw6ICdhbm9uYm94JywgbmFtZTogJ0Fub25ib3gnLCB3ZWJzaXRlOiAnYW5vbmJveC5uZXQnIH0sXG4gICdmYWtlLWxlZ2FsJzogeyBjaGFubmVsOiAnZmFrZS1sZWdhbCcsIG5hbWU6ICdGYWtlIExlZ2FsJywgd2Vic2l0ZTogJ2Zha2UubGVnYWwnIH0sXG59O1xuXG4vKipcbiAqIOiOt+WPluaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqFxuICpcbiAqIEByZXR1cm5zIOaJgOaciea4oOmBk+eahOS/oeaBr+aVsOe7hFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgY2hhbm5lbHMgPSBsaXN0Q2hhbm5lbHMoKTtcbiAqIGNoYW5uZWxzLmZvckVhY2goY2ggPT4gY29uc29sZS5sb2coYCR7Y2gubmFtZX0gKCR7Y2gud2Vic2l0ZX0pYCkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Q2hhbm5lbHMoKTogQ2hhbm5lbEluZm9bXSB7XG4gIHJldHVybiBhbGxDaGFubmVscy5tYXAoY2ggPT4gY2hhbm5lbEluZm9NYXBbY2hdKTtcbn1cblxuLyoqXG4gKiDojrflj5bmjIflrprmuKDpgZPnmoTor6bnu4bkv6Hmga9cbiAqXG4gKiBAcGFyYW0gY2hhbm5lbCAtIOa4oOmBk+agh+ivhlxuICogQHJldHVybnMg5rig6YGT5L+h5oGv77yM5LiN5a2Y5Zyo5pe26L+U5ZueIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hhbm5lbEluZm8oY2hhbm5lbDogQ2hhbm5lbCk6IENoYW5uZWxJbmZvIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNoYW5uZWxJbmZvTWFwW2NoYW5uZWxdO1xufVxuXG4vKipcbiAqIOWIm+W7uuS4tOaXtumCrueusVxuICpcbiAqIOmUmeivr+WkhOeQhuetlueVpe+8mlxuICogLSDmjIflrprmuKDpgZPlpLHotKXml7bvvIzpu5jorqToh6rliqjlsJ3or5Xlhbbku5blj6/nlKjmuKDpgZPvvIjmiZPkubHpobrluo/pgJDkuKrlsJ3or5XvvIlcbiAqIC0gYGNoYW5uZWxGYWxsYmFjazogZmFsc2VgIOS4lOaMh+WumuS6hiBgY2hhbm5lbGAg5pe277yM5LuF5bCd6K+V6K+l5rig6YGT77yM5aSx6LSl5Y2z6L+U5ZueIG51bGxcbiAqIC0g5pyq5oyH5a6a5rig6YGT5pe277yM5omT5Lmx5YWo6YOo5rig6YGT6YCQ5Liq5bCd6K+V77yM55u05Yiw5oiQ5YqfXG4gKiAtIOaJgOaciea4oOmBk+Wdh+S4jeWPr+eUqOaXtui/lOWbniBudWxs77yI5LiN5oqb5Ye65byC5bi477yJXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSDliJvlu7rpgInpobnvvIzlj6/mjIflrprmuKDpgZPjgIHmnInmlYjml7bplb/jgIHln5/lkI3nrYlcbiAqIEByZXR1cm5zIOmCrueuseS/oeaBr++8jOaJgOaciea4oOmBk+Wdh+S4jeWPr+eUqOaXtui/lOWbniBudWxsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBlbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycgfSk7XG4gKiBpZiAoZW1haWxJbmZvKSBjb25zb2xlLmxvZyhlbWFpbEluZm8uZW1haWwpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbyB8IG51bGw+IHtcbiAgLypcbiAgICog5p6E5bu65bCd6K+V6aG65bqP77yaXG4gICAqIC0g5oyH5a6a5rig6YGTIOKGkiDkvJjlhYjlsJ3or5Xor6XmuKDpgZPvvIzlpLHotKXlkI7pmo/mnLrlsJ3or5Xlhbbku5bmuKDpgZNcbiAgICogLSDmnKrmjIflrpog4oaSIOaJk+S5seWFqOmDqOa4oOmBk+mAkOS4quWwneivlVxuICAgKi9cbiAgY29uc3QgYWxsb3dGYWxsYmFjayA9IG9wdGlvbnMuY2hhbm5lbEZhbGxiYWNrICE9PSBmYWxzZTtcbiAgY29uc3QgdHJ5T3JkZXIgPSBidWlsZENoYW5uZWxPcmRlcihvcHRpb25zLmNoYW5uZWwsIGFsbG93RmFsbGJhY2spO1xuXG4gIGZvciAoY29uc3QgY2ggb2YgdHJ5T3JkZXIpIHtcbiAgICBsb2dnZXIuaW5mbyhg5Yib5bu65Li05pe26YKu566xLCDmuKDpgZM6ICR7Y2h9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGludGVybmFsOiBJbnRlcm5hbEVtYWlsSW5mbyA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnZW5lcmF0ZUVtYWlsT25jZShjaCwgb3B0aW9ucyksIG9wdGlvbnMucmV0cnkpO1xuICAgICAgbG9nZ2VyLmluZm8oYOmCrueuseWIm+W7uuaIkOWKnzogJHtpbnRlcm5hbC5lbWFpbH0gKOa4oOmBkzogJHtjaH0pYCk7XG5cbiAgICAgIC8qIOWwhiB0b2tlbiDlrZjlhaXlhoXpg6jlrZjlgqjvvIzkuI3mmrTpnLLnu5nnlKjmiLcgKi9cbiAgICAgIGNvbnN0IHB1YmxpY0luZm86IEVtYWlsSW5mbyA9IHtcbiAgICAgICAgY2hhbm5lbDogaW50ZXJuYWwuY2hhbm5lbCxcbiAgICAgICAgZW1haWw6IGludGVybmFsLmVtYWlsLFxuICAgICAgICBleHBpcmVzQXQ6IGludGVybmFsLmV4cGlyZXNBdCxcbiAgICAgICAgY3JlYXRlZEF0OiBpbnRlcm5hbC5jcmVhdGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGludGVybmFsLnRva2VuKSB7XG4gICAgICAgIHRva2VuU3RvcmUuc2V0KHB1YmxpY0luZm8sIGludGVybmFsLnRva2VuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwdWJsaWNJbmZvO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBsb2dnZXIud2Fybihg5rig6YGTICR7Y2h9IOS4jeWPr+eUqDogJHtlcnIubWVzc2FnZSB8fCBlcnJ977yM5bCd6K+V5LiL5LiA5Liq5rig6YGTYCk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmVycm9yKCfmiYDmnInmuKDpgZPlnYfkuI3lj6/nlKjvvIzliJvlu7rpgq7nrrHlpLHotKUnKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICog5p6E5bu65rig6YGT5bCd6K+V6aG65bqPXG4gKiDmjIflrprmuKDpgZPml7bkvJjlhYjlsJ3or5Xor6XmuKDpgZPvvIzlhbbkvZnmuKDpgZPmiZPkubHov73liqBcbiAqIOacquaMh+WumuaXtuaJk+S5seWFqOmDqOa4oOmBk1xuICovXG5mdW5jdGlvbiBidWlsZENoYW5uZWxPcmRlcihwcmVmZXJyZWQ/OiBDaGFubmVsLCBhbGxvd0ZhbGxiYWNrID0gdHJ1ZSk6IENoYW5uZWxbXSB7XG4gIGNvbnN0IHNodWZmbGVkID0gWy4uLmFsbENoYW5uZWxzXS5zb3J0KCgpID0+IE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICBpZiAoIXByZWZlcnJlZCkge1xuICAgIHJldHVybiBzaHVmZmxlZDtcbiAgfVxuICBpZiAoIWFsbG93RmFsbGJhY2spIHtcbiAgICByZXR1cm4gW3ByZWZlcnJlZF07XG4gIH1cbiAgY29uc3QgcmVzdCA9IHNodWZmbGVkLmZpbHRlcihjaCA9PiBjaCAhPT0gcHJlZmVycmVkKTtcbiAgcmV0dXJuIFtwcmVmZXJyZWQsIC4uLnJlc3RdO1xufVxuXG4vKipcbiAqIOWNleasoeWIm+W7uumCrueuse+8iOS4jeWQq+mHjeivlemAu+i+ke+8iVxuICog5qC55o2u5rig6YGT57G75Z6L5YiG5Y+R5Yiw5a+55bqU55qEIHByb3ZpZGVyIOWunueOsFxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYWlsT25jZShjaGFubmVsOiBDaGFubmVsLCBvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxFbWFpbEluZm8+IHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kdXJhdGlvbiB8fCAzMCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnbGluc2hpeW91JzpcbiAgICAgIHJldHVybiBsaW5zaGl5b3UuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxvbCc6XG4gICAgICByZXR1cm4gdGVtcG1haWxMb2wuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiB8fCBudWxsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgcmV0dXJuIGF3YW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBvcmFyeS1lbWFpbC1vcmcnOlxuICAgICAgcmV0dXJuIHRlbXBvcmFyeUVtYWlsT3JnLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtYWlsLXRtJzpcbiAgICAgIHJldHVybiBtYWlsVG0uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIHJldHVybiBkcm9wbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZ3VlcnJpbGxhbWFpbCc6XG4gICAgICByZXR1cm4gZ3VlcnJpbGxhbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnbWFpbGRyb3AnOlxuICAgICAgcmV0dXJuIG1haWxkcm9wUHJvdmlkZXIuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiA/PyBudWxsKTtcbiAgICBjYXNlICdzbWFpbC1wdyc6XG4gICAgICByZXR1cm4gc21haWxQdy5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnYm9vbWxpZnknOlxuICAgICAgcmV0dXJuIGJvb21saWZ5LmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtZmZhYyc6XG4gICAgICByZXR1cm4gbWZmYWMuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21pbm1haWwnOlxuICAgICAgcmV0dXJuIG1pbm1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3ZpcC0yMTUnOlxuICAgICAgcmV0dXJuIHZpcDIxNS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnYW5vbmJveCc6XG4gICAgICByZXR1cm4gYW5vbmJveC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZmFrZS1sZWdhbCc6XG4gICAgICByZXR1cm4gZmFrZUxlZ2FsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kb21haW4gPz8gbnVsbCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqIENoYW5uZWwvRW1haWwvVG9rZW4g562J55SxIFNESyDku44gRW1haWxJbmZvIOS4reiHquWKqOiOt+WPlu+8jOeUqOaIt+aXoOmcgOaJi+WKqOS8oOmAklxuICpcbiAqIOmUmeivr+WkhOeQhuetlueVpe+8mlxuICogLSDnvZHnu5zplJnor6/jgIHotoXml7bjgIE0MjnjgIHmnI3liqHnq68gNXh4IOmUmeivryDihpIg6Ieq5Yqo6YeN6K+V77yI6buY6K6kIDIg5qyh77yJXG4gKiAtIOmHjeivleiAl+WwveWQjui/lOWbniB7IHN1Y2Nlc3M6IGZhbHNlLCBlbWFpbHM6IFtdIH3vvIzkuI3mipvlvILluLhcbiAqIC0g5Y+C5pWw5qCh6aqM6ZSZ6K+v77yI57y65bCRIEVtYWlsSW5mb++8ieebtOaOpeaKm+WHulxuICpcbiAqIEBwYXJhbSBpbmZvIC0gR2VuZXJhdGVFbWFpbCgpIOi/lOWbnueahOmCrueuseS/oeaBr1xuICogQHBhcmFtIG9wdGlvbnMgLSDlj6/pgInphY3nva7vvIjph43or5XnrYnvvIlcbiAqIEByZXR1cm5zIOmCruS7tue7k+aenO+8jOWMheWQqyBzdWNjZXNzIOagh+iusOWSjOmCruS7tuWIl+ihqFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgaW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwoeyBjaGFubmVsOiAnbWFpbC10bScgfSk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRFbWFpbHMoaW5mbyk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmVtYWlscy5sZW5ndGggPiAwKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfmlLbliLDpgq7ku7Y6JywgcmVzdWx0LmVtYWlsc1swXS5zdWJqZWN0KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKGluZm86IEVtYWlsSW5mbywgb3B0aW9ucz86IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBpZiAoIWluZm8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtYWlsSW5mbyBpcyByZXF1aXJlZCwgY2FsbCBnZW5lcmF0ZUVtYWlsKCkgZmlyc3QnKTtcbiAgfVxuXG4gIGNvbnN0IHsgY2hhbm5lbCwgZW1haWwgfSA9IGluZm87XG4gIGNvbnN0IHRva2VuID0gdG9rZW5TdG9yZS5nZXQoaW5mbyk7XG5cbiAgaWYgKCFjaGFubmVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaGFubmVsIGlzIHJlcXVpcmVkJyk7XG4gIH1cbiAgaWYgKCFlbWFpbCAmJiBjaGFubmVsICE9PSAndGVtcG1haWwtbG9sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRW1haWwgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1Zyhg6I635Y+W6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH0sIOmCrueusTogJHtlbWFpbH1gKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbWFpbHMgPSBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZ2V0RW1haWxzT25jZShjaGFubmVsLCBlbWFpbCwgdG9rZW4pLCBvcHRpb25zPy5yZXRyeSk7XG4gICAgaWYgKGVtYWlscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhg6I635Y+W5YiwICR7ZW1haWxzLmxlbmd0aH0g5bCB6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGDmmoLml6Dpgq7ku7YsIOa4oOmBkzogJHtjaGFubmVsfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBjaGFubmVsLCBlbWFpbCwgZW1haWxzLCBzdWNjZXNzOiB0cnVlIH07XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgLypcbiAgICAgKiDph43or5XogJflsL3lkI7ku43nhLblpLHotKUg4oaSIOi/lOWbnuepuue7k+aenOiAjOmdnuaKm+W8guW4uFxuICAgICAqIOi/meagt+iwg+eUqOaWueWcqOi9ruivouWcuuaZr+S4i+S4jeS8muWboOS4uuS4gOasoee9kee7nOazouWKqOiAjOS4reaWreaVtOS4qua1geeoi1xuICAgICAqL1xuICAgIGxvZ2dlci5lcnJvcihg6I635Y+W6YKu5Lu25aSx6LSlLCDmuKDpgZM6ICR7Y2hhbm5lbH0sIOmUmeivrzogJHtlcnIubWVzc2FnZSB8fCBlcnJ9YCk7XG4gICAgcmV0dXJuIHsgY2hhbm5lbCwgZW1haWwsIGVtYWlsczogW10sIHN1Y2Nlc3M6IGZhbHNlIH07XG4gIH1cbn1cblxuLyoqXG4gKiDljZXmrKHojrflj5bpgq7ku7bvvIjkuI3lkKvph43or5XpgLvovpHvvIlcbiAqIOagueaNrua4oOmBk+exu+Wei+WIhuWPkeWIsOWvueW6lOeahCBwcm92aWRlciDlrp7njrDvvIzlubbmoKHpqozlv4XpnIDnmoQgdG9rZW4g5Y+C5pWwXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEVtYWlsc09uY2UoY2hhbm5lbDogQ2hhbm5lbCwgZW1haWw6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEVtYWlsW10+IHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGxpbnNoaS1lbWFpbCcpO1xuICAgICAgcmV0dXJuIGxpbnNoaUVtYWlsLmdldEVtYWlscyhlbWFpbCwgdG9rZW4pO1xuICAgIGNhc2UgJ2xpbnNoaXlvdSc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBsaW5zaGl5b3UnKTtcbiAgICAgIHJldHVybiBsaW5zaGl5b3UuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAndGVtcG1haWwtbG9sJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIHRlbXBtYWlsLWxvbCcpO1xuICAgICAgcmV0dXJuIHRlbXBtYWlsTG9sLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2NoYXRncHQtb3JnLXVrJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGNoYXRncHQtb3JnLXVrJyk7XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ3RlbXAtbWFpbC1pbyc6XG4gICAgICByZXR1cm4gdGVtcE1haWxJTy5nZXRFbWFpbHMoZW1haWwpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgYXdhbWFpbCcpO1xuICAgICAgcmV0dXJuIGF3YW1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAndGVtcG9yYXJ5LWVtYWlsLW9yZyc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciB0ZW1wb3JhcnktZW1haWwtb3JnJyk7XG4gICAgICByZXR1cm4gdGVtcG9yYXJ5RW1haWxPcmcuZ2V0RW1haWxzKGVtYWlsLCB0b2tlbik7XG4gICAgY2FzZSAnbWFpbC10bSc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBtYWlsLXRtJyk7XG4gICAgICByZXR1cm4gbWFpbFRtLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ21haWwtY3gnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgbWFpbC1jeCcpO1xuICAgICAgcmV0dXJuIG1haWxDeC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdkcm9wbWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBkcm9wbWFpbCcpO1xuICAgICAgcmV0dXJuIGRyb3BtYWlsLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2d1ZXJyaWxsYW1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgZ3VlcnJpbGxhbWFpbCcpO1xuICAgICAgcmV0dXJuIGd1ZXJyaWxsYW1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnbWFpbGRyb3AnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgbWFpbGRyb3AnKTtcbiAgICAgIHJldHVybiBtYWlsZHJvcFByb3ZpZGVyLmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ3NtYWlsLXB3JzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIHNtYWlsLXB3Jyk7XG4gICAgICByZXR1cm4gc21haWxQdy5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdib29tbGlmeSc6XG4gICAgICByZXR1cm4gYm9vbWxpZnkuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICdtZmZhYyc6XG4gICAgICByZXR1cm4gbWZmYWMuZ2V0RW1haWxzKGVtYWlsLCB0b2tlbik7XG4gICAgY2FzZSAnbWlubWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBtaW5tYWlsJyk7XG4gICAgICByZXR1cm4gbWlubWFpbC5nZXRFbWFpbHMoZW1haWwsIHRva2VuKTtcbiAgICBjYXNlICd2aXAtMjE1JzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIHZpcC0yMTUnKTtcbiAgICAgIHJldHVybiB2aXAyMTUuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnYW5vbmJveCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBhbm9uYm94Jyk7XG4gICAgICByZXR1cm4gYW5vbmJveC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdmYWtlLWxlZ2FsJzpcbiAgICAgIHJldHVybiBmYWtlTGVnYWwuZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNoYW5uZWw6ICR7Y2hhbm5lbH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIOS4tOaXtumCrueuseWuouaIt+err1xuICog5bCB6KOF5LqG6YKu566x5Yib5bu65ZKM6YKu5Lu26I635Y+W55qE5a6M5pW05rWB56iL77yM6Ieq5Yqo566h55CG6YKu566x5L+h5oGv5ZKM6K6k6K+B5Luk54mMXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBjbGllbnQgPSBuZXcgVGVtcEVtYWlsQ2xpZW50KCk7XG4gKiBjb25zdCBlbWFpbEluZm8gPSBhd2FpdCBjbGllbnQuZ2VuZXJhdGUoeyBjaGFubmVsOiAnbWFpbC10bScgfSk7XG4gKiBjb25zb2xlLmxvZygn6YKu566xOicsIGVtYWlsSW5mby5lbWFpbCk7XG4gKlxuICogLy8g6L2u6K+i6I635Y+W6YKu5Lu2XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuZ2V0RW1haWxzKCk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAqICAgY29uc29sZS5sb2coJ+mCruS7tuaVsDonLCByZXN1bHQuZW1haWxzLmxlbmd0aCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBFbWFpbENsaWVudCB7XG4gIHByaXZhdGUgZW1haWxJbmZvOiBFbWFpbEluZm8gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICog5Yib5bu65Li05pe26YKu566x5bm257yT5a2Y6YKu566x5L+h5oGvXG4gICAqIOWQjue7reiwg+eUqCBnZXRFbWFpbHMoKSDml7boh6rliqjkvb/nlKjmraTpgq7nrrHnmoTmuKDpgZPjgIHlnLDlnYDlkozku6TniYxcbiAgICog5omA5pyJ5rig6YGT5Z2H5LiN5Y+v55So5pe26L+U5ZueIG51bGxcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlKG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zID0ge30pOiBQcm9taXNlPEVtYWlsSW5mbyB8IG51bGw+IHtcbiAgICB0aGlzLmVtYWlsSW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuZW1haWxJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjemCrueuseeahOmCruS7tuWIl+ihqFxuICAgKiDlv4XpobvlhYjosIPnlKggZ2VuZXJhdGUoKSDliJvlu7rpgq7nrrFcbiAgICpcbiAgICogQHRocm93cyDmnKrosIPnlKggZ2VuZXJhdGUoKSDml7bmipvlh7rlvILluLhcbiAgICovXG4gIGFzeW5jIGdldEVtYWlscyhvcHRpb25zPzogR2V0RW1haWxzT3B0aW9ucyk6IFByb21pc2U8R2V0RW1haWxzUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmVtYWlsSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCBnZW5lcmF0ZWQuIENhbGwgZ2VuZXJhdGUoKSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RW1haWxzKHRoaXMuZW1haWxJbmZvLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nvJPlrZjnmoTpgq7nrrHkv6Hmga9cbiAgICog5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe26L+U5ZueIG51bGxcbiAgICovXG4gIGdldEVtYWlsSW5mbygpOiBFbWFpbEluZm8gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbWFpbEluZm87XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBsaXN0Q2hhbm5lbHMsXG4gIGdldENoYW5uZWxJbmZvLFxuICBnZW5lcmF0ZUVtYWlsLFxuICBnZXRFbWFpbHMsXG4gIFRlbXBFbWFpbENsaWVudCxcbiAgc2V0Q29uZmlnLFxuICBnZXRDb25maWcsXG59O1xuIl19
507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0dBLG9DQUVDO0FBUUQsd0NBRUM7QUFvQkQsc0NBd0NDO0FBc0dELDhCQXVDQztBQXBVRCwrREFBaUQ7QUFDakQsb0VBQXNEO0FBQ3RELCtEQUFpRDtBQUNqRCw0REFBOEM7QUFDOUMseUVBQTJEO0FBQzNELHNFQUF3RDtBQUN4RCxpRUFBbUQ7QUFDbkQseURBQTJDO0FBQzNDLHNFQUF3RDtBQUN4RCx5RUFBMkQ7QUFDM0QscUVBQXVEO0FBQ3ZELDZEQUErQztBQUMvQyxtRkFBcUU7QUFDckUsNERBQThDO0FBQzlDLDREQUE4QztBQUM5QywrREFBaUQ7QUFDakQseUVBQTJEO0FBQzNELHVFQUF5RDtBQUN6RCw4REFBZ0Q7QUFDaEQsK0RBQWlEO0FBQ2pELDZEQUErQztBQUMvQyw0REFBOEM7QUFDOUMsNkRBQStDO0FBQy9DLGtFQUFvRDtBQUNwRCx5REFBMkM7QUFDM0MsdUVBQXlEO0FBRXpELG1DQUEyRDtBQUMzRCwyQ0FBOEM7QUFDOUMscUNBQWtDO0FBQ2xDLHFDQUFnRDtBQUloRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxFQUFxQixDQUFDO0FBQ3BELHlDQUE2QztBQUFwQywyR0FBQSxjQUFjLE9BQUE7QUFDdkIsaUNBQTJGO0FBQWxGLGtHQUFBLFNBQVMsT0FBQTtBQUFFLDhHQUFBLHFCQUFxQixPQUFBO0FBQUUseUdBQUEsZ0JBQWdCLE9BQUE7QUFFM0QsbUNBQTZGO0FBQXBGLGtHQUFBLFFBQVEsT0FBQTtBQUFjLHFHQUFBLFdBQVcsT0FBQTtBQUFFLHFHQUFBLFdBQVcsT0FBQTtBQUFFLG1HQUFBLFNBQVMsT0FBQTtBQUFFLGdHQUFBLE1BQU0sT0FBQTtBQUMxRSxtQ0FBMkQ7QUFBdkMsbUdBQUEsU0FBUyxPQUFB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LEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsNENBQTRDLENBQUMsQ0FBQztZQUM3RixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBbkNELDBDQW1DQztBQUVELGtCQUFlO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxhQUFhO0lBQ2IsU0FBUztJQUNULGVBQWU7SUFDZixTQUFTLEVBQVQsa0JBQVM7SUFDVCxTQUFTLEVBQVQsa0JBQVM7Q0FDVixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdGVtcG1haWwgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwnO1xuaW1wb3J0ICogYXMgdGVtcG1haWxDbiBmcm9tICcuL3Byb3ZpZGVycy90ZW1wbWFpbC1jbic7XG5pbXBvcnQgKiBhcyB0bXBtYWlscyBmcm9tICcuL3Byb3ZpZGVycy90bXBtYWlscyc7XG5pbXBvcnQgKiBhcyB0YUVhc3kgZnJvbSAnLi9wcm92aWRlcnMvdGEtZWFzeSc7XG5pbXBvcnQgKiBhcyB0ZW5tYWlsV2FuZ3R6IGZyb20gJy4vcHJvdmlkZXJzLzEwbWFpbC13YW5ndHonO1xuaW1wb3J0ICogYXMgbGluc2hpRW1haWwgZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLWVtYWlsJztcbmltcG9ydCAqIGFzIGxpbnNoaXlvdSBmcm9tICcuL3Byb3ZpZGVycy9saW5zaGl5b3UnO1xuaW1wb3J0ICogYXMgbWZmYWMgZnJvbSAnLi9wcm92aWRlcnMvbWZmYWMnO1xuaW1wb3J0ICogYXMgdGVtcG1haWxMb2wgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG1haWwtbG9sJztcbmltcG9ydCAqIGFzIGNoYXRncHRPcmdVayBmcm9tICcuL3Byb3ZpZGVycy9jaGF0Z3B0LW9yZy11ayc7XG5pbXBvcnQgKiBhcyB0ZW1wTWFpbElPIGZyb20gJy4vcHJvdmlkZXJzL3RlbXAtbWFpbC1pbyc7XG5pbXBvcnQgKiBhcyBhd2FtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2F3YW1haWwnO1xuaW1wb3J0ICogYXMgdGVtcG9yYXJ5RW1haWxPcmcgZnJvbSAnLi9wcm92aWRlcnMvdGVtcG9yYXJ5LWVtYWlsLW9yZyc7XG5pbXBvcnQgKiBhcyBtYWlsVG0gZnJvbSAnLi9wcm92aWRlcnMvbWFpbC10bSc7XG5pbXBvcnQgKiBhcyBtYWlsQ3ggZnJvbSAnLi9wcm92aWRlcnMvbWFpbC1jeCc7XG5pbXBvcnQgKiBhcyBkcm9wbWFpbCBmcm9tICcuL3Byb3ZpZGVycy9kcm9wbWFpbCc7XG5pbXBvcnQgKiBhcyBndWVycmlsbGFtYWlsIGZyb20gJy4vcHJvdmlkZXJzL2d1ZXJyaWxsYW1haWwnO1xuaW1wb3J0ICogYXMgbWFpbGRyb3BQcm92aWRlciBmcm9tICcuL3Byb3ZpZGVycy9tYWlsZHJvcCc7XG5pbXBvcnQgKiBhcyBzbWFpbFB3IGZyb20gJy4vcHJvdmlkZXJzL3NtYWlsLXB3JztcbmltcG9ydCAqIGFzIGJvb21saWZ5IGZyb20gJy4vcHJvdmlkZXJzL2Jvb21saWZ5JztcbmltcG9ydCAqIGFzIG1pbm1haWwgZnJvbSAnLi9wcm92aWRlcnMvbWlubWFpbCc7XG5pbXBvcnQgKiBhcyB2aXAyMTUgZnJvbSAnLi9wcm92aWRlcnMvdmlwLTIxNSc7XG5pbXBvcnQgKiBhcyBhbm9uYm94IGZyb20gJy4vcHJvdmlkZXJzL2Fub25ib3gnO1xuaW1wb3J0ICogYXMgZmFrZUxlZ2FsIGZyb20gJy4vcHJvdmlkZXJzL2Zha2UtbGVnYWwnO1xuaW1wb3J0ICogYXMgbW9ha3QgZnJvbSAnLi9wcm92aWRlcnMvbW9ha3QnO1xuaW1wb3J0ICogYXMgdGVubWludXRlT25lIGZyb20gJy4vcHJvdmlkZXJzLzEwbWludXRlLW9uZSc7XG5pbXBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEludGVybmFsRW1haWxJbmZvLCBFbWFpbCwgR2V0RW1haWxzUmVzdWx0LCBHZW5lcmF0ZUVtYWlsT3B0aW9ucywgR2V0RW1haWxzT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgd2l0aFJldHJ5LCB3aXRoUmV0cnlXaXRoQXR0ZW1wdHMgfSBmcm9tICcuL3JldHJ5JztcbmltcG9ydCB7IHJlcG9ydFRlbGVtZXRyeSB9IGZyb20gJy4vdGVsZW1ldHJ5JztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHNldENvbmZpZywgZ2V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuXG5leHBvcnQgeyBDaGFubmVsLCBFbWFpbEluZm8sIEVtYWlsLCBFbWFpbEF0dGFjaG1lbnQsIEdldEVtYWlsc1Jlc3VsdCwgR2VuZXJhdGVFbWFpbE9wdGlvbnMsIEdldEVtYWlsc09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBTREsg5YaF6YOoIHRva2VuIOWtmOWCqFxuICog5L2/55SoIFdlYWtNYXAg5bCGIEVtYWlsSW5mbyDlr7nosaHmmKDlsITliLDlr7nlupTnmoQgdG9rZW5cbiAqIOeUqOaIt+aXoOazleebtOaOpeiuv+mXriB0b2tlbu+8jOeUsSBTREsg6Ieq5Yqo566h55CGXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgdG9rZW5TdG9yZSA9IG5ldyBXZWFrTWFwPEVtYWlsSW5mbywgc3RyaW5nPigpO1xuZXhwb3J0IHsgbm9ybWFsaXplRW1haWwgfSBmcm9tICcuL25vcm1hbGl6ZSc7XG5leHBvcnQgeyB3aXRoUmV0cnksIHdpdGhSZXRyeVdpdGhBdHRlbXB0cywgZmV0Y2hXaXRoVGltZW91dCwgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi9yZXRyeSc7XG5leHBvcnQgdHlwZSB7IFJldHJ5V2l0aEF0dGVtcHRzUmVzdWx0LCBGZXRjaFdpdGhUaW1lb3V0T3B0aW9ucyB9IGZyb20gJy4vcmV0cnknO1xuZXhwb3J0IHsgTG9nTGV2ZWwsIExvZ0hhbmRsZXIsIHNldExvZ0xldmVsLCBnZXRMb2dMZXZlbCwgc2V0TG9nZ2VyLCBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5leHBvcnQgeyBTREtDb25maWcsIHNldENvbmZpZywgZ2V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuZXhwb3J0IHsgZ2V0U2RrVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5leHBvcnQgdHlwZSB7IFN5bnRoZXRpY0Jyb3dzZXJQcm9maWxlIH0gZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLXRva2VuJztcbmV4cG9ydCB7XG4gIGRlcml2ZUxpbnNoaUFwaVBhdGhLZXksXG4gIHJhbmRvbVN5bnRoZXRpY0xpbnNoaUtleSxcbiAgcmFuZG9tQnJvd3Nlckxpa2VQcm9maWxlLFxuICBzeW50aGV0aWNWaXNpdG9ySWRGcm9tUHJvZmlsZSxcbn0gZnJvbSAnLi9wcm92aWRlcnMvbGluc2hpLXRva2VuJztcblxuLyoqIOaJgOacieaUr+aMgeeahOa4oOmBk+WIl+ihqO+8jOeUqOS6jumaj+acuumAieaLqeWSjOmBjeWOhiAqL1xuY29uc3QgYWxsQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsndGVtcG1haWwnLCAndGVtcG1haWwtY24nLCAndG1wbWFpbHMnLCAndGEtZWFzeScsICcxMG1haWwtd2FuZ3R6JywgJzEwbWludXRlLW9uZScsICdsaW5zaGktZW1haWwnLCAnbGluc2hpeW91JywgJ21mZmFjJywgJ3RlbXBtYWlsLWxvbCcsICdjaGF0Z3B0LW9yZy11aycsICd0ZW1wLW1haWwtaW8nLCAnYXdhbWFpbCcsICd0ZW1wb3JhcnktZW1haWwtb3JnJywgJ21haWwtdG0nLCAnbWFpbC1jeCcsICdkcm9wbWFpbCcsICdndWVycmlsbGFtYWlsJywgJ21haWxkcm9wJywgJ3NtYWlsLXB3JywgJ2Jvb21saWZ5JywgJ21pbm1haWwnLCAndmlwLTIxNScsICdhbm9uYm94JywgJ2Zha2UtbGVnYWwnLCAnbW9ha3QnXTtcblxuLyoqXG4gKiDmuKDpgZPkv6Hmga/vvIzljIXlkKvmuKDpgZPmoIfor4bjgIHmmL7npLrlkI3np7Dlkozlr7nlupTnvZHnq5lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsSW5mbyB7XG4gIC8qKiDmuKDpgZPmoIfor4YgKi9cbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAgLyoqIOa4oOmBk+aYvuekuuWQjeensCAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiDlr7nlupTnmoTkuLTml7bpgq7nrrHmnI3liqHnvZHnq5kgKi9cbiAgd2Vic2l0ZTogc3RyaW5nO1xufVxuXG4vKiog5rig6YGT5L+h5oGv5pig5bCE6KGoICovXG5jb25zdCBjaGFubmVsSW5mb01hcDogUmVjb3JkPENoYW5uZWwsIENoYW5uZWxJbmZvPiA9IHtcbiAgJ3RlbXBtYWlsJzogeyBjaGFubmVsOiAndGVtcG1haWwnLCBuYW1lOiAnVGVtcE1haWwnLCB3ZWJzaXRlOiAndGVtcG1haWwuaW5nJyB9LFxuICAndGVtcG1haWwtY24nOiB7IGNoYW5uZWw6ICd0ZW1wbWFpbC1jbicsIG5hbWU6ICdUZW1wTWFpbCBDTicsIHdlYnNpdGU6ICd0ZW1wbWFpbC5jbicgfSxcbiAgJ3RtcG1haWxzJzogeyBjaGFubmVsOiAndG1wbWFpbHMnLCBuYW1lOiAnVG1wTWFpbHMnLCB3ZWJzaXRlOiAndG1wbWFpbHMuY29tJyB9LFxuICAndGEtZWFzeSc6IHsgY2hhbm5lbDogJ3RhLWVhc3knLCBuYW1lOiAnVEEgRWFzeScsIHdlYnNpdGU6ICd0YS1lYXN5LmNvbScgfSxcbiAgJzEwbWFpbC13YW5ndHonOiB7IGNoYW5uZWw6ICcxMG1haWwtd2FuZ3R6JywgbmFtZTogJzEwbWFpbCBXYW5ndHonLCB3ZWJzaXRlOiAnMTBtYWlsLndhbmd0ei5jbicgfSxcbiAgJzEwbWludXRlLW9uZSc6IHsgY2hhbm5lbDogJzEwbWludXRlLW9uZScsIG5hbWU6ICcxMCBNaW51dGUgRW1haWwnLCB3ZWJzaXRlOiAnMTBtaW51dGVtYWlsLm9uZScgfSxcbiAgJ2xpbnNoaS1lbWFpbCc6IHsgY2hhbm5lbDogJ2xpbnNoaS1lbWFpbCcsIG5hbWU6ICfkuLTml7bpgq7nrrEnLCB3ZWJzaXRlOiAnbGluc2hpLWVtYWlsLmNvbScgfSxcbiAgJ2xpbnNoaXlvdSc6IHsgY2hhbm5lbDogJ2xpbnNoaXlvdScsIG5hbWU6ICfkuLTml7bpgq4nLCB3ZWJzaXRlOiAnbGluc2hpeW91LmNvbScgfSxcbiAgJ3RlbXBtYWlsLWxvbCc6IHsgY2hhbm5lbDogJ3RlbXBtYWlsLWxvbCcsIG5hbWU6ICdUZW1wTWFpbCBMT0wnLCB3ZWJzaXRlOiAndGVtcG1haWwubG9sJyB9LFxuICAnY2hhdGdwdC1vcmctdWsnOiB7IGNoYW5uZWw6ICdjaGF0Z3B0LW9yZy11aycsIG5hbWU6ICdDaGF0R1BUIE1haWwnLCB3ZWJzaXRlOiAnbWFpbC5jaGF0Z3B0Lm9yZy51aycgfSxcbiAgJ3RlbXAtbWFpbC1pbyc6IHsgY2hhbm5lbDogJ3RlbXAtbWFpbC1pbycsIG5hbWU6ICdUZW1wIE1haWwgSU8nLCB3ZWJzaXRlOiAndGVtcC1tYWlsLmlvJyB9LFxuICAnYXdhbWFpbCc6IHsgY2hhbm5lbDogJ2F3YW1haWwnLCBuYW1lOiAnQXdhTWFpbCcsIHdlYnNpdGU6ICdhd2FtYWlsLmNvbScgfSxcbiAgJ3RlbXBvcmFyeS1lbWFpbC1vcmcnOiB7IGNoYW5uZWw6ICd0ZW1wb3JhcnktZW1haWwtb3JnJywgbmFtZTogJ1RlbXBvcmFyeSBFbWFpbCcsIHdlYnNpdGU6ICd0ZW1wb3JhcnktZW1haWwub3JnJyB9LFxuICAnbWFpbC10bSc6IHsgY2hhbm5lbDogJ21haWwtdG0nLCBuYW1lOiAnTWFpbC50bScsIHdlYnNpdGU6ICdtYWlsLnRtJyB9LFxuICAnbWFpbC1jeCc6IHsgY2hhbm5lbDogJ21haWwtY3gnLCBuYW1lOiAnTWFpbC5jeCcsIHdlYnNpdGU6ICdtYWlsLmN4JyB9LFxuICAnZHJvcG1haWwnOiB7IGNoYW5uZWw6ICdkcm9wbWFpbCcsIG5hbWU6ICdEcm9wTWFpbCcsIHdlYnNpdGU6ICdkcm9wbWFpbC5tZScgfSxcbiAgJ2d1ZXJyaWxsYW1haWwnOiB7IGNoYW5uZWw6ICdndWVycmlsbGFtYWlsJywgbmFtZTogJ0d1ZXJyaWxsYSBNYWlsJywgd2Vic2l0ZTogJ2d1ZXJyaWxsYW1haWwuY29tJyB9LFxuICAnbWFpbGRyb3AnOiB7IGNoYW5uZWw6ICdtYWlsZHJvcCcsIG5hbWU6ICdNYWlsZHJvcCcsIHdlYnNpdGU6ICdtYWlsZHJvcC5jeCcgfSxcbiAgJ3NtYWlsLXB3JzogeyBjaGFubmVsOiAnc21haWwtcHcnLCBuYW1lOiAnU21haWwucHcnLCB3ZWJzaXRlOiAnc21haWwucHcnIH0sXG4gICdib29tbGlmeSc6IHsgY2hhbm5lbDogJ2Jvb21saWZ5JywgbmFtZTogJ0Jvb21saWZ5Jywgd2Vic2l0ZTogJ2Jvb21saWZ5LmNvbScgfSxcbiAgJ21pbm1haWwnOiB7IGNoYW5uZWw6ICdtaW5tYWlsJywgbmFtZTogJ01pbk1haWwnLCB3ZWJzaXRlOiAnbWlubWFpbC5hcHAnIH0sXG4gICdtZmZhYyc6IHsgY2hhbm5lbDogJ21mZmFjJywgbmFtZTogJ01GRkFDJywgd2Vic2l0ZTogJ21mZmFjLmNvbScgfSxcbiAgJ3ZpcC0yMTUnOiB7IGNoYW5uZWw6ICd2aXAtMjE1JywgbmFtZTogJ1ZJUCAyMTUnLCB3ZWJzaXRlOiAndmlwLjIxNS5pbScgfSxcbiAgJ2Fub25ib3gnOiB7IGNoYW5uZWw6ICdhbm9uYm94JywgbmFtZTogJ0Fub25ib3gnLCB3ZWJzaXRlOiAnYW5vbmJveC5uZXQnIH0sXG4gICdmYWtlLWxlZ2FsJzogeyBjaGFubmVsOiAnZmFrZS1sZWdhbCcsIG5hbWU6ICdGYWtlIExlZ2FsJywgd2Vic2l0ZTogJ2Zha2UubGVnYWwnIH0sXG4gICdtb2FrdCc6IHsgY2hhbm5lbDogJ21vYWt0JywgbmFtZTogJ01vYWt0Jywgd2Vic2l0ZTogJ21vYWt0LmNvbScgfSxcbn07XG5cbi8qKlxuICog6I635Y+W5omA5pyJ5pSv5oyB55qE5rig6YGT5YiX6KGoXG4gKlxuICogQHJldHVybnMg5omA5pyJ5rig6YGT55qE5L+h5oGv5pWw57uEXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBjaGFubmVscyA9IGxpc3RDaGFubmVscygpO1xuICogY2hhbm5lbHMuZm9yRWFjaChjaCA9PiBjb25zb2xlLmxvZyhgJHtjaC5uYW1lfSAoJHtjaC53ZWJzaXRlfSlgKSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RDaGFubmVscygpOiBDaGFubmVsSW5mb1tdIHtcbiAgcmV0dXJuIGFsbENoYW5uZWxzLm1hcChjaCA9PiBjaGFubmVsSW5mb01hcFtjaF0pO1xufVxuXG4vKipcbiAqIOiOt+WPluaMh+Wumua4oOmBk+eahOivpue7huS/oeaBr1xuICpcbiAqIEBwYXJhbSBjaGFubmVsIC0g5rig6YGT5qCH6K+GXG4gKiBAcmV0dXJucyDmuKDpgZPkv6Hmga/vvIzkuI3lrZjlnKjml7bov5Tlm54gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVsSW5mbyhjaGFubmVsOiBDaGFubmVsKTogQ2hhbm5lbEluZm8gfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2hhbm5lbEluZm9NYXBbY2hhbm5lbF07XG59XG5cbi8qKlxuICog5Yib5bu65Li05pe26YKu566xXG4gKlxuICog6ZSZ6K+v5aSE55CG562W55Wl77yaXG4gKiAtIOaMh+Wumua4oOmBk+Wksei0peaXtu+8jOm7mOiupOiHquWKqOWwneivleWFtuS7luWPr+eUqOa4oOmBk++8iOaJk+S5semhuuW6j+mAkOS4quWwneivle+8iVxuICogLSBgY2hhbm5lbEZhbGxiYWNrOiBmYWxzZWAg5LiU5oyH5a6a5LqGIGBjaGFubmVsYCDml7bvvIzku4XlsJ3or5Xor6XmuKDpgZPvvIzlpLHotKXljbPov5Tlm54gbnVsbFxuICogLSDmnKrmjIflrprmuKDpgZPml7bvvIzmiZPkubHlhajpg6jmuKDpgZPpgJDkuKrlsJ3or5XvvIznm7TliLDmiJDlip9cbiAqIC0g5omA5pyJ5rig6YGT5Z2H5LiN5Y+v55So5pe26L+U5ZueIG51bGzvvIjkuI3mipvlh7rlvILluLjvvIlcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIOWIm+W7uumAiemhue+8jOWPr+aMh+Wumua4oOmBk+OAgeacieaViOaXtumVv+OAgeWfn+WQjeetiVxuICogQHJldHVybnMg6YKu566x5L+h5oGv77yM5omA5pyJ5rig6YGT5Z2H5LiN5Y+v55So5pe26L+U5ZueIG51bGxcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGVtYWlsSW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwoeyBjaGFubmVsOiAndGVtcC1tYWlsLWlvJyB9KTtcbiAqIGlmIChlbWFpbEluZm8pIGNvbnNvbGUubG9nKGVtYWlsSW5mby5lbWFpbCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRW1haWwob3B0aW9uczogR2VuZXJhdGVFbWFpbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8RW1haWxJbmZvIHwgbnVsbD4ge1xuICAvKlxuICAgKiDmnoTlu7rlsJ3or5Xpobrluo/vvJpcbiAgICogLSDmjIflrprmuKDpgZMg4oaSIOS8mOWFiOWwneivleivpea4oOmBk++8jOWksei0peWQjumaj+acuuWwneivleWFtuS7lua4oOmBk1xuICAgKiAtIOacquaMh+WumiDihpIg5omT5Lmx5YWo6YOo5rig6YGT6YCQ5Liq5bCd6K+VXG4gICAqL1xuICBjb25zdCBhbGxvd0ZhbGxiYWNrID0gb3B0aW9ucy5jaGFubmVsRmFsbGJhY2sgIT09IGZhbHNlO1xuICBjb25zdCB0cnlPcmRlciA9IGJ1aWxkQ2hhbm5lbE9yZGVyKG9wdGlvbnMuY2hhbm5lbCwgYWxsb3dGYWxsYmFjayk7XG5cbiAgbGV0IGNoYW5uZWxzVHJpZWQgPSAwO1xuICBsZXQgbGFzdEVyciA9ICcnO1xuICBmb3IgKGNvbnN0IGNoIG9mIHRyeU9yZGVyKSB7XG4gICAgY2hhbm5lbHNUcmllZCArPSAxO1xuICAgIGxvZ2dlci5pbmZvKGDliJvlu7rkuLTml7bpgq7nrrEsIOa4oOmBkzogJHtjaH1gKTtcbiAgICBjb25zdCByID0gYXdhaXQgd2l0aFJldHJ5V2l0aEF0dGVtcHRzKCgpID0+IGdlbmVyYXRlRW1haWxPbmNlKGNoLCBvcHRpb25zKSwgb3B0aW9ucy5yZXRyeSk7XG4gICAgaWYgKHIub2spIHtcbiAgICAgIGNvbnN0IGludGVybmFsID0gci52YWx1ZTtcbiAgICAgIGxvZ2dlci5pbmZvKGDpgq7nrrHliJvlu7rmiJDlip86ICR7aW50ZXJuYWwuZW1haWx9ICjmuKDpgZM6ICR7Y2h9KWApO1xuICAgICAgcmVwb3J0VGVsZW1ldHJ5KCdnZW5lcmF0ZV9lbWFpbCcsIGNoLCB0cnVlLCByLmF0dGVtcHRzLCBjaGFubmVsc1RyaWVkLCAnJyk7XG5cbiAgICAgIC8qIOWwhiB0b2tlbiDlrZjlhaXlhoXpg6jlrZjlgqjvvIzkuI3mmrTpnLLnu5nnlKjmiLcgKi9cbiAgICAgIGNvbnN0IHB1YmxpY0luZm86IEVtYWlsSW5mbyA9IHtcbiAgICAgICAgY2hhbm5lbDogaW50ZXJuYWwuY2hhbm5lbCxcbiAgICAgICAgZW1haWw6IGludGVybmFsLmVtYWlsLFxuICAgICAgICBleHBpcmVzQXQ6IGludGVybmFsLmV4cGlyZXNBdCxcbiAgICAgICAgY3JlYXRlZEF0OiBpbnRlcm5hbC5jcmVhdGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGludGVybmFsLnRva2VuKSB7XG4gICAgICAgIHRva2VuU3RvcmUuc2V0KHB1YmxpY0luZm8sIGludGVybmFsLnRva2VuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwdWJsaWNJbmZvO1xuICAgIH1cbiAgICBjb25zdCBtc2cgPSAoci5lcnJvciBhcyBhbnkpPy5tZXNzYWdlIHx8IFN0cmluZyhyLmVycm9yKTtcbiAgICBsYXN0RXJyID0gbXNnO1xuICAgIGxvZ2dlci53YXJuKGDmuKDpgZMgJHtjaH0g5LiN5Y+v55SoOiAke21zZ33vvIzlsJ3or5XkuIvkuIDkuKrmuKDpgZNgKTtcbiAgfVxuXG4gIGxvZ2dlci5lcnJvcign5omA5pyJ5rig6YGT5Z2H5LiN5Y+v55So77yM5Yib5bu66YKu566x5aSx6LSlJyk7XG4gIHJlcG9ydFRlbGVtZXRyeSgnZ2VuZXJhdGVfZW1haWwnLCAnJywgZmFsc2UsIDAsIGNoYW5uZWxzVHJpZWQsIGxhc3RFcnIpO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiDmnoTlu7rmuKDpgZPlsJ3or5Xpobrluo9cbiAqIOaMh+Wumua4oOmBk+aXtuS8mOWFiOWwneivleivpea4oOmBk++8jOWFtuS9mea4oOmBk+aJk+S5sei/veWKoFxuICog5pyq5oyH5a6a5pe25omT5Lmx5YWo6YOo5rig6YGTXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkQ2hhbm5lbE9yZGVyKHByZWZlcnJlZD86IENoYW5uZWwsIGFsbG93RmFsbGJhY2sgPSB0cnVlKTogQ2hhbm5lbFtdIHtcbiAgY29uc3Qgc2h1ZmZsZWQgPSBbLi4uYWxsQ2hhbm5lbHNdLnNvcnQoKCkgPT4gTWF0aC5yYW5kb20oKSAtIDAuNSk7XG4gIGlmICghcHJlZmVycmVkKSB7XG4gICAgcmV0dXJuIHNodWZmbGVkO1xuICB9XG4gIGlmICghYWxsb3dGYWxsYmFjaykge1xuICAgIHJldHVybiBbcHJlZmVycmVkXTtcbiAgfVxuICBjb25zdCByZXN0ID0gc2h1ZmZsZWQuZmlsdGVyKGNoID0+IGNoICE9PSBwcmVmZXJyZWQpO1xuICByZXR1cm4gW3ByZWZlcnJlZCwgLi4ucmVzdF07XG59XG5cbi8qKlxuICog5Y2V5qyh5Yib5bu66YKu566x77yI5LiN5ZCr6YeN6K+V6YC76L6R77yJXG4gKiDmoLnmja7muKDpgZPnsbvlnovliIblj5HliLDlr7nlupTnmoQgcHJvdmlkZXIg5a6e546wXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRW1haWxPbmNlKGNoYW5uZWw6IENoYW5uZWwsIG9wdGlvbnM6IEdlbmVyYXRlRW1haWxPcHRpb25zKTogUHJvbWlzZTxJbnRlcm5hbEVtYWlsSW5mbz4ge1xuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlICd0ZW1wbWFpbCc6XG4gICAgICByZXR1cm4gdGVtcG1haWwuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmR1cmF0aW9uIHx8IDMwKTtcbiAgICBjYXNlICd0ZW1wbWFpbC1jbic6XG4gICAgICByZXR1cm4gdGVtcG1haWxDbi5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluID8/IG51bGwpO1xuICAgIGNhc2UgJ3RtcG1haWxzJzpcbiAgICAgIHJldHVybiB0bXBtYWlscy5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluID8/IG51bGwpO1xuICAgIGNhc2UgJ3RhLWVhc3knOlxuICAgICAgcmV0dXJuIHRhRWFzeS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnMTBtYWlsLXdhbmd0eic6XG4gICAgICByZXR1cm4gdGVubWFpbFdhbmd0ei5nZW5lcmF0ZUVtYWlsKG9wdGlvbnMuZG9tYWluID8/IG51bGwpO1xuICAgIGNhc2UgJzEwbWludXRlLW9uZSc6XG4gICAgICByZXR1cm4gdGVubWludXRlT25lLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kb21haW4gPz8gbnVsbCk7XG4gICAgY2FzZSAnbGluc2hpLWVtYWlsJzpcbiAgICAgIHJldHVybiBsaW5zaGlFbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnbGluc2hpeW91JzpcbiAgICAgIHJldHVybiBsaW5zaGl5b3UuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBtYWlsLWxvbCc6XG4gICAgICByZXR1cm4gdGVtcG1haWxMb2wuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiB8fCBudWxsKTtcbiAgICBjYXNlICdjaGF0Z3B0LW9yZy11ayc6XG4gICAgICByZXR1cm4gY2hhdGdwdE9yZ1VrLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICd0ZW1wLW1haWwtaW8nOlxuICAgICAgcmV0dXJuIHRlbXBNYWlsSU8uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2F3YW1haWwnOlxuICAgICAgcmV0dXJuIGF3YW1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3RlbXBvcmFyeS1lbWFpbC1vcmcnOlxuICAgICAgcmV0dXJuIHRlbXBvcmFyeUVtYWlsT3JnLmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtYWlsLXRtJzpcbiAgICAgIHJldHVybiBtYWlsVG0uZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIHJldHVybiBkcm9wbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZ3VlcnJpbGxhbWFpbCc6XG4gICAgICByZXR1cm4gZ3VlcnJpbGxhbWFpbC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnbWFpbGRyb3AnOlxuICAgICAgcmV0dXJuIG1haWxkcm9wUHJvdmlkZXIuZ2VuZXJhdGVFbWFpbChvcHRpb25zLmRvbWFpbiA/PyBudWxsKTtcbiAgICBjYXNlICdzbWFpbC1wdyc6XG4gICAgICByZXR1cm4gc21haWxQdy5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnYm9vbWxpZnknOlxuICAgICAgcmV0dXJuIGJvb21saWZ5LmdlbmVyYXRlRW1haWwoKTtcbiAgICBjYXNlICdtZmZhYyc6XG4gICAgICByZXR1cm4gbWZmYWMuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ21pbm1haWwnOlxuICAgICAgcmV0dXJuIG1pbm1haWwuZ2VuZXJhdGVFbWFpbCgpO1xuICAgIGNhc2UgJ3ZpcC0yMTUnOlxuICAgICAgcmV0dXJuIHZpcDIxNS5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnYW5vbmJveCc6XG4gICAgICByZXR1cm4gYW5vbmJveC5nZW5lcmF0ZUVtYWlsKCk7XG4gICAgY2FzZSAnZmFrZS1sZWdhbCc6XG4gICAgICByZXR1cm4gZmFrZUxlZ2FsLmdlbmVyYXRlRW1haWwob3B0aW9ucy5kb21haW4gPz8gbnVsbCk7XG4gICAgY2FzZSAnbW9ha3QnOlxuICAgICAgcmV0dXJuIG1vYWt0LmdlbmVyYXRlRW1haWwob3B0aW9ucy5kb21haW4gPz8gbnVsbCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqIENoYW5uZWwvRW1haWwvVG9rZW4g562J55SxIFNESyDku44gRW1haWxJbmZvIOS4reiHquWKqOiOt+WPlu+8jOeUqOaIt+aXoOmcgOaJi+WKqOS8oOmAklxuICpcbiAqIOmUmeivr+WkhOeQhuetlueVpe+8mlxuICogLSDnvZHnu5zplJnor6/jgIHotoXml7bjgIE0MjnjgIHmnI3liqHnq68gNXh4IOmUmeivryDihpIg6Ieq5Yqo6YeN6K+V77yI6buY6K6kIDIg5qyh77yJXG4gKiAtIOmHjeivleiAl+WwveWQjui/lOWbniB7IHN1Y2Nlc3M6IGZhbHNlLCBlbWFpbHM6IFtdIH3vvIzkuI3mipvlvILluLhcbiAqIC0g5Y+C5pWw5qCh6aqM6ZSZ6K+v77yI57y65bCRIEVtYWlsSW5mb++8ieebtOaOpeaKm+WHulxuICpcbiAqIEBwYXJhbSBpbmZvIC0gR2VuZXJhdGVFbWFpbCgpIOi/lOWbnueahOmCrueuseS/oeaBr1xuICogQHBhcmFtIG9wdGlvbnMgLSDlj6/pgInphY3nva7vvIjph43or5XnrYnvvIlcbiAqIEByZXR1cm5zIOmCruS7tue7k+aenO+8jOWMheWQqyBzdWNjZXNzIOagh+iusOWSjOmCruS7tuWIl+ihqFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgaW5mbyA9IGF3YWl0IGdlbmVyYXRlRW1haWwoeyBjaGFubmVsOiAnbWFpbC10bScgfSk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRFbWFpbHMoaW5mbyk7XG4gKiBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmVtYWlscy5sZW5ndGggPiAwKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfmlLbliLDpgq7ku7Y6JywgcmVzdWx0LmVtYWlsc1swXS5zdWJqZWN0KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKGluZm86IEVtYWlsSW5mbywgb3B0aW9ucz86IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICBpZiAoIWluZm8pIHtcbiAgICByZXBvcnRUZWxlbWV0cnkoJ2dldF9lbWFpbHMnLCAnJywgZmFsc2UsIDAsIDAsICdFbWFpbEluZm8gaXMgcmVxdWlyZWQsIGNhbGwgZ2VuZXJhdGVFbWFpbCgpIGZpcnN0Jyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbWFpbEluZm8gaXMgcmVxdWlyZWQsIGNhbGwgZ2VuZXJhdGVFbWFpbCgpIGZpcnN0Jyk7XG4gIH1cblxuICBjb25zdCB7IGNoYW5uZWwsIGVtYWlsIH0gPSBpbmZvO1xuICBjb25zdCB0b2tlbiA9IHRva2VuU3RvcmUuZ2V0KGluZm8pO1xuXG4gIGlmICghY2hhbm5lbCkge1xuICAgIHJlcG9ydFRlbGVtZXRyeSgnZ2V0X2VtYWlscycsICcnLCBmYWxzZSwgMCwgMCwgJ0NoYW5uZWwgaXMgcmVxdWlyZWQnKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoYW5uZWwgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAoIWVtYWlsICYmIGNoYW5uZWwgIT09ICd0ZW1wbWFpbC1sb2wnKSB7XG4gICAgcmVwb3J0VGVsZW1ldHJ5KCdnZXRfZW1haWxzJywgY2hhbm5lbCwgZmFsc2UsIDAsIDAsICdFbWFpbCBpcyByZXF1aXJlZCcpO1xuICAgIHRocm93IG5ldyBFcnJvcignRW1haWwgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1Zyhg6I635Y+W6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH0sIOmCrueusTogJHtlbWFpbH1gKTtcbiAgY29uc3QgZ3IgPSBhd2FpdCB3aXRoUmV0cnlXaXRoQXR0ZW1wdHMoKCkgPT4gZ2V0RW1haWxzT25jZShjaGFubmVsLCBlbWFpbCwgdG9rZW4pLCBvcHRpb25zPy5yZXRyeSk7XG4gIGlmIChnci5vaykge1xuICAgIGNvbnN0IGVtYWlscyA9IGdyLnZhbHVlO1xuICAgIGlmIChlbWFpbHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYOiOt+WPluWIsCAke2VtYWlscy5sZW5ndGh9IOWwgemCruS7tiwg5rig6YGTOiAke2NoYW5uZWx9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyhg5pqC5peg6YKu5Lu2LCDmuKDpgZM6ICR7Y2hhbm5lbH1gKTtcbiAgICB9XG4gICAgcmVwb3J0VGVsZW1ldHJ5KCdnZXRfZW1haWxzJywgY2hhbm5lbCwgdHJ1ZSwgZ3IuYXR0ZW1wdHMsIDAsICcnKTtcbiAgICByZXR1cm4geyBjaGFubmVsLCBlbWFpbCwgZW1haWxzLCBzdWNjZXNzOiB0cnVlIH07XG4gIH1cbiAgY29uc3QgZXJyID0gZ3IuZXJyb3IgYXMgYW55O1xuICBjb25zdCBlcnJNc2cgPSBlcnI/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycik7XG4gIC8qXG4gICAqIOmHjeivleiAl+WwveWQjuS7jeeEtuWksei0pSDihpIg6L+U5Zue56m657uT5p6c6ICM6Z2e5oqb5byC5bi4XG4gICAqIOi/meagt+iwg+eUqOaWueWcqOi9ruivouWcuuaZr+S4i+S4jeS8muWboOS4uuS4gOasoee9kee7nOazouWKqOiAjOS4reaWreaVtOS4qua1geeoi1xuICAgKi9cbiAgbG9nZ2VyLmVycm9yKGDojrflj5bpgq7ku7blpLHotKUsIOa4oOmBkzogJHtjaGFubmVsfSwg6ZSZ6K+vOiAke2Vyck1zZ31gKTtcbiAgcmVwb3J0VGVsZW1ldHJ5KCdnZXRfZW1haWxzJywgY2hhbm5lbCwgZmFsc2UsIGdyLmF0dGVtcHRzLCAwLCBlcnJNc2cpO1xuICByZXR1cm4geyBjaGFubmVsLCBlbWFpbCwgZW1haWxzOiBbXSwgc3VjY2VzczogZmFsc2UgfTtcbn1cblxuLyoqXG4gKiDljZXmrKHojrflj5bpgq7ku7bvvIjkuI3lkKvph43or5XpgLvovpHvvIlcbiAqIOagueaNrua4oOmBk+exu+Wei+WIhuWPkeWIsOWvueW6lOeahCBwcm92aWRlciDlrp7njrDvvIzlubbmoKHpqozlv4XpnIDnmoQgdG9rZW4g5Y+C5pWwXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEVtYWlsc09uY2UoY2hhbm5lbDogQ2hhbm5lbCwgZW1haWw6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEVtYWlsW10+IHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSAndGVtcG1haWwnOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsLmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAndGVtcG1haWwtY24nOlxuICAgICAgcmV0dXJuIHRlbXBtYWlsQ24uZ2V0RW1haWxzKGVtYWlsKTtcbiAgICBjYXNlICd0bXBtYWlscyc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciB0bXBtYWlscycpO1xuICAgICAgcmV0dXJuIHRtcG1haWxzLmdldEVtYWlscyhlbWFpbCwgdG9rZW4pO1xuICAgIGNhc2UgJ3RhLWVhc3knOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgdGEtZWFzeScpO1xuICAgICAgcmV0dXJuIHRhRWFzeS5nZXRFbWFpbHMoZW1haWwsIHRva2VuKTtcbiAgICBjYXNlICcxMG1haWwtd2FuZ3R6JzpcbiAgICAgIHJldHVybiB0ZW5tYWlsV2FuZ3R6LmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAnMTBtaW51dGUtb25lJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIDEwbWludXRlLW9uZScpO1xuICAgICAgcmV0dXJuIHRlbm1pbnV0ZU9uZS5nZXRFbWFpbHMoZW1haWwsIHRva2VuKTtcbiAgICBjYXNlICdsaW5zaGktZW1haWwnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgbGluc2hpLWVtYWlsJyk7XG4gICAgICByZXR1cm4gbGluc2hpRW1haWwuZ2V0RW1haWxzKGVtYWlsLCB0b2tlbik7XG4gICAgY2FzZSAnbGluc2hpeW91JzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGxpbnNoaXlvdScpO1xuICAgICAgcmV0dXJuIGxpbnNoaXlvdS5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wbWFpbC1sb2wnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgdGVtcG1haWwtbG9sJyk7XG4gICAgICByZXR1cm4gdGVtcG1haWxMb2wuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnY2hhdGdwdC1vcmctdWsnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgY2hhdGdwdC1vcmctdWsnKTtcbiAgICAgIHJldHVybiBjaGF0Z3B0T3JnVWsuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAndGVtcC1tYWlsLWlvJzpcbiAgICAgIHJldHVybiB0ZW1wTWFpbElPLmdldEVtYWlscyhlbWFpbCk7XG4gICAgY2FzZSAnYXdhbWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBhd2FtYWlsJyk7XG4gICAgICByZXR1cm4gYXdhbWFpbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICd0ZW1wb3JhcnktZW1haWwtb3JnJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIHRlbXBvcmFyeS1lbWFpbC1vcmcnKTtcbiAgICAgIHJldHVybiB0ZW1wb3JhcnlFbWFpbE9yZy5nZXRFbWFpbHMoZW1haWwsIHRva2VuKTtcbiAgICBjYXNlICdtYWlsLXRtJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIG1haWwtdG0nKTtcbiAgICAgIHJldHVybiBtYWlsVG0uZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnbWFpbC1jeCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBtYWlsLWN4Jyk7XG4gICAgICByZXR1cm4gbWFpbEN4LmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2Ryb3BtYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGRyb3BtYWlsJyk7XG4gICAgICByZXR1cm4gZHJvcG1haWwuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnZ3VlcnJpbGxhbWFpbCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBndWVycmlsbGFtYWlsJyk7XG4gICAgICByZXR1cm4gZ3VlcnJpbGxhbWFpbC5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdtYWlsZHJvcCc6XG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIGVycm9yOiB0b2tlbiBtaXNzaW5nIGZvciBtYWlsZHJvcCcpO1xuICAgICAgcmV0dXJuIG1haWxkcm9wUHJvdmlkZXIuZ2V0RW1haWxzKHRva2VuLCBlbWFpbCk7XG4gICAgY2FzZSAnc21haWwtcHcnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3Igc21haWwtcHcnKTtcbiAgICAgIHJldHVybiBzbWFpbFB3LmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2Jvb21saWZ5JzpcbiAgICAgIHJldHVybiBib29tbGlmeS5nZXRFbWFpbHMoZW1haWwpO1xuICAgIGNhc2UgJ21mZmFjJzpcbiAgICAgIHJldHVybiBtZmZhYy5nZXRFbWFpbHMoZW1haWwsIHRva2VuKTtcbiAgICBjYXNlICdtaW5tYWlsJzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIG1pbm1haWwnKTtcbiAgICAgIHJldHVybiBtaW5tYWlsLmdldEVtYWlscyhlbWFpbCwgdG9rZW4pO1xuICAgIGNhc2UgJ3ZpcC0yMTUnOlxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBlcnJvcjogdG9rZW4gbWlzc2luZyBmb3IgdmlwLTIxNScpO1xuICAgICAgcmV0dXJuIHZpcDIxNS5nZXRFbWFpbHModG9rZW4sIGVtYWlsKTtcbiAgICBjYXNlICdhbm9uYm94JzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIGFub25ib3gnKTtcbiAgICAgIHJldHVybiBhbm9uYm94LmdldEVtYWlscyh0b2tlbiwgZW1haWwpO1xuICAgIGNhc2UgJ2Zha2UtbGVnYWwnOlxuICAgICAgcmV0dXJuIGZha2VMZWdhbC5nZXRFbWFpbHMoZW1haWwpO1xuICAgIGNhc2UgJ21vYWt0JzpcbiAgICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgZXJyb3I6IHRva2VuIG1pc3NpbmcgZm9yIG1vYWt0Jyk7XG4gICAgICByZXR1cm4gbW9ha3QuZ2V0RW1haWxzKGVtYWlsLCB0b2tlbik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjaGFubmVsOiAke2NoYW5uZWx9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDkuLTml7bpgq7nrrHlrqLmiLfnq69cbiAqIOWwgeijheS6humCrueuseWIm+W7uuWSjOmCruS7tuiOt+WPlueahOWujOaVtOa1geeoi++8jOiHquWKqOeuoeeQhumCrueuseS/oeaBr+WSjOiupOivgeS7pOeJjFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgY2xpZW50ID0gbmV3IFRlbXBFbWFpbENsaWVudCgpO1xuICogY29uc3QgZW1haWxJbmZvID0gYXdhaXQgY2xpZW50LmdlbmVyYXRlKHsgY2hhbm5lbDogJ21haWwtdG0nIH0pO1xuICogY29uc29sZS5sb2coJ+mCrueusTonLCBlbWFpbEluZm8uZW1haWwpO1xuICpcbiAqIC8vIOi9ruivouiOt+WPlumCruS7tlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmdldEVtYWlscygpO1xuICogaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfpgq7ku7bmlbA6JywgcmVzdWx0LmVtYWlscy5sZW5ndGgpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wRW1haWxDbGllbnQge1xuICBwcml2YXRlIGVtYWlsSW5mbzogRW1haWxJbmZvIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIOWIm+W7uuS4tOaXtumCrueuseW5tue8k+WtmOmCrueuseS/oeaBr1xuICAgKiDlkI7nu63osIPnlKggZ2V0RW1haWxzKCkg5pe26Ieq5Yqo5L2/55So5q2k6YKu566x55qE5rig6YGT44CB5Zyw5Z2A5ZKM5Luk54mMXG4gICAqIOaJgOaciea4oOmBk+Wdh+S4jeWPr+eUqOaXtui/lOWbniBudWxsXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZShvcHRpb25zOiBHZW5lcmF0ZUVtYWlsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbWFpbEluZm8gfCBudWxsPiB7XG4gICAgdGhpcy5lbWFpbEluZm8gPSBhd2FpdCBnZW5lcmF0ZUVtYWlsKG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmVtYWlsSW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3pgq7nrrHnmoTpgq7ku7bliJfooahcbiAgICog5b+F6aG75YWI6LCD55SoIGdlbmVyYXRlKCkg5Yib5bu66YKu566xXG4gICAqXG4gICAqIEB0aHJvd3Mg5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe25oqb5Ye65byC5bi4XG4gICAqL1xuICBhc3luYyBnZXRFbWFpbHMob3B0aW9ucz86IEdldEVtYWlsc09wdGlvbnMpOiBQcm9taXNlPEdldEVtYWlsc1Jlc3VsdD4ge1xuICAgIGlmICghdGhpcy5lbWFpbEluZm8pIHtcbiAgICAgIHJlcG9ydFRlbGVtZXRyeSgnZ2V0X2VtYWlscycsICcnLCBmYWxzZSwgMCwgMCwgJ05vIGVtYWlsIGdlbmVyYXRlZC4gQ2FsbCBnZW5lcmF0ZSgpIGZpcnN0LicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCBnZW5lcmF0ZWQuIENhbGwgZ2VuZXJhdGUoKSBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0RW1haWxzKHRoaXMuZW1haWxJbmZvLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nvJPlrZjnmoTpgq7nrrHkv6Hmga9cbiAgICog5pyq6LCD55SoIGdlbmVyYXRlKCkg5pe26L+U5ZueIG51bGxcbiAgICovXG4gIGdldEVtYWlsSW5mbygpOiBFbWFpbEluZm8gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbWFpbEluZm87XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBsaXN0Q2hhbm5lbHMsXG4gIGdldENoYW5uZWxJbmZvLFxuICBnZW5lcmF0ZUVtYWlsLFxuICBnZXRFbWFpbHMsXG4gIFRlbXBFbWFpbENsaWVudCxcbiAgc2V0Q29uZmlnLFxuICBnZXRDb25maWcsXG59O1xuIl19