@sendly/cli 3.3.2 → 3.5.0

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.
@@ -1,9 +1,9 @@
1
1
  import { AuthenticatedCommand } from "../lib/base-command.js";
2
2
  import { apiClient } from "../lib/api-client.js";
3
- import { colors, json, isJsonMode, formatRelativeTime, } from "../lib/output.js";
3
+ import { colors, json, isJsonMode, formatRelativeTime } from "../lib/output.js";
4
4
  import { getConfigValue } from "../lib/config.js";
5
5
  export default class Status extends AuthenticatedCommand {
6
- static description = "Show account status dashboard with credits, usage, and health";
6
+ static description = "Show account status dashboard with credits, usage, and capabilities";
7
7
  static examples = [
8
8
  "<%= config.bin %> status",
9
9
  "<%= config.bin %> status --json",
@@ -12,7 +12,11 @@ export default class Status extends AuthenticatedCommand {
12
12
  ...AuthenticatedCommand.baseFlags,
13
13
  };
14
14
  async run() {
15
- // Fetch all status data in parallel
15
+ // Fetch comprehensive account status
16
+ const status = await apiClient
17
+ .get("/api/cli/account/status")
18
+ .catch(() => null);
19
+ // Fallback data if new endpoint not available
16
20
  const [credits, messages, webhooks, keys] = await Promise.all([
17
21
  apiClient
18
22
  .get("/api/v1/account/credits")
@@ -22,91 +26,164 @@ export default class Status extends AuthenticatedCommand {
22
26
  limit: 5,
23
27
  })
24
28
  .catch(() => ({ messages: [], total: 0 })),
25
- apiClient
26
- .get("/api/v1/webhooks")
27
- .catch(() => []),
29
+ apiClient.get("/api/v1/webhooks").catch(() => []),
28
30
  apiClient
29
31
  .get("/api/v1/account/keys")
30
32
  .catch(() => ({ keys: [] })),
31
33
  ]);
32
- const email = getConfigValue("email") || "Unknown";
34
+ const email = status?.account?.email || getConfigValue("email") || "Unknown";
33
35
  const apiMode = getConfigValue("environment") || "test";
34
36
  if (isJsonMode()) {
35
37
  json({
36
- account: {
37
- email,
38
- apiMode,
39
- },
40
- credits: {
38
+ account: status?.account || { email, tier: "sandbox" },
39
+ verification: status?.verification || null,
40
+ capabilities: status?.capabilities || { regions: ["sandbox"] },
41
+ credits: status?.credits || {
41
42
  balance: credits.balance,
42
- reserved: credits.reservedBalance,
43
- available: credits.availableBalance,
43
+ canSendLive: false,
44
44
  },
45
- usage: {
46
- recentMessages: messages.total,
47
- webhooksConfigured: webhooks.length,
48
- activeApiKeys: keys.keys?.filter((k) => k.isActive).length || 0,
45
+ keys: status?.keys || {
46
+ hasTestKey: false,
47
+ hasLiveKey: false,
48
+ totalActive: keys.keys?.filter((k) => k.isActive).length || 0,
49
49
  },
50
+ nextSteps: status?.nextSteps || [],
50
51
  });
51
52
  return;
52
53
  }
53
54
  // Beautiful dashboard output
54
55
  console.log();
55
- console.log(colors.bold(colors.primary(" Sendly Status Dashboard")));
56
- console.log(colors.dim(" " + "─".repeat(40)));
56
+ console.log(colors.bold(colors.primary(" Sendly Account Status")));
57
+ console.log(colors.dim(" " + "─".repeat(50)));
57
58
  console.log();
58
- // Account Section
59
+ // Account & Tier Section
59
60
  console.log(colors.bold(" Account"));
60
- console.log(` ${colors.dim("Email:")} ${email}`);
61
- console.log(` ${colors.dim("API Mode:")} ${apiMode === "test" ? colors.warning("test") + colors.dim(" (sandbox)") : colors.success("live") + colors.dim(" (production)")}`);
61
+ console.log(` ${colors.dim("Email:")} ${email}`);
62
+ // Show tier with color coding
63
+ const tier = status?.account?.tier || "sandbox";
64
+ const tierDisplay = {
65
+ sandbox: colors.warning("Sandbox") + colors.dim(" (test only)"),
66
+ international: colors.primary("International") + colors.dim(" (48 countries)"),
67
+ domestic: colors.success("US & Canada") + colors.dim(" (toll-free)"),
68
+ global: colors.success("Global") + colors.dim(" (full access)"),
69
+ };
70
+ console.log(` ${colors.dim("Tier:")} ${tierDisplay[tier]}`);
71
+ console.log();
72
+ // Verification Section
73
+ if (status?.verification) {
74
+ console.log(colors.bold(" Verification"));
75
+ const v = status.verification;
76
+ // Status with color
77
+ const statusColors = {
78
+ approved: colors.success,
79
+ verified: colors.success,
80
+ pending: colors.warning,
81
+ in_progress: colors.warning,
82
+ rejected: colors.error,
83
+ };
84
+ const statusColor = statusColors[v.status || ""] || colors.dim;
85
+ console.log(` ${colors.dim("Status:")} ${statusColor(v.status || "unknown")}`);
86
+ // Type
87
+ const typeLabels = {
88
+ toll_free: "Toll-Free (US/CA)",
89
+ international: "International",
90
+ both: "Global (US/CA + Intl)",
91
+ };
92
+ console.log(` ${colors.dim("Type:")} ${typeLabels[v.type || ""] || v.type}`);
93
+ // Show sender ID or toll-free number
94
+ if (v.alphaSenderId) {
95
+ console.log(` ${colors.dim("Sender ID:")} ${colors.primary(v.alphaSenderId)}`);
96
+ }
97
+ if (v.tollFreeNumber) {
98
+ console.log(` ${colors.dim("Toll-Free:")} ${colors.primary(v.tollFreeNumber)}`);
99
+ }
100
+ console.log();
101
+ }
102
+ // Capabilities Section
103
+ console.log(colors.bold(" Send Capabilities"));
104
+ const caps = status?.capabilities || {
105
+ canSendSandbox: true,
106
+ canSendInternational: false,
107
+ canSendDomestic: false,
108
+ };
109
+ // Sandbox
110
+ const sandboxIcon = caps.canSendSandbox
111
+ ? colors.success("✓")
112
+ : colors.dim("○");
113
+ console.log(` ${sandboxIcon} ${colors.dim("Sandbox")} Test numbers only`);
114
+ // International
115
+ const intlIcon = caps.canSendInternational
116
+ ? colors.success("✓")
117
+ : colors.dim("○");
118
+ const intlLabel = caps.canSendInternational
119
+ ? "48 countries"
120
+ : colors.dim("Upgrade to unlock");
121
+ console.log(` ${intlIcon} ${colors.dim("International")} ${intlLabel}`);
122
+ // US & Canada
123
+ const usIcon = caps.canSendDomestic ? colors.success("✓") : colors.dim("○");
124
+ const usLabel = caps.canSendDomestic
125
+ ? "Two-way messaging"
126
+ : colors.dim("Upgrade to unlock");
127
+ console.log(` ${usIcon} ${colors.dim("US & Canada")} ${usLabel}`);
62
128
  console.log();
63
129
  // Credits Section
130
+ const creditBalance = status?.credits?.balance ?? credits.balance ?? 0;
64
131
  console.log(colors.bold(" Credits"));
65
- const available = credits.availableBalance || 0;
66
- const creditColor = available > 100
132
+ const creditColor = creditBalance > 100
67
133
  ? colors.success
68
- : available > 10
134
+ : creditBalance > 10
69
135
  ? colors.warning
70
136
  : colors.error;
71
- console.log(` ${colors.dim("Available:")} ${creditColor(available.toLocaleString())} credits`);
137
+ console.log(` ${colors.dim("Balance:")} ${creditColor(creditBalance.toLocaleString())} credits`);
72
138
  if (credits.reservedBalance > 0) {
73
- console.log(` ${colors.dim("Reserved:")} ${colors.warning(credits.reservedBalance.toLocaleString())} credits`);
139
+ console.log(` ${colors.dim("Reserved:")} ${colors.warning(credits.reservedBalance.toLocaleString())} credits`);
74
140
  }
75
- console.log(` ${colors.dim("Capacity:")} ~${Math.floor(available).toLocaleString()} SMS (US/CA)`);
76
141
  console.log();
77
- // Usage Section
78
- console.log(colors.bold(" Resources"));
79
- const activeKeys = keys.keys?.filter((k) => k.isActive).length || 0;
142
+ // Resources Section
143
+ const activeKeys = status?.keys?.totalActive ??
144
+ keys.keys?.filter((k) => k.isActive).length ??
145
+ 0;
80
146
  const activeWebhooks = webhooks.filter((w) => w.is_active).length;
81
- console.log(` ${colors.dim("API Keys:")} ${activeKeys} active`);
82
- console.log(` ${colors.dim("Webhooks:")} ${activeWebhooks} configured${webhooks.length > activeWebhooks ? colors.dim(` (${webhooks.length - activeWebhooks} paused)`) : ""}`);
147
+ console.log(colors.bold(" Resources"));
148
+ console.log(` ${colors.dim("API Keys:")} ${activeKeys} active`);
149
+ console.log(` ${colors.dim("Webhooks:")} ${activeWebhooks} configured`);
83
150
  console.log();
84
151
  // Recent Activity
85
152
  if (messages.messages && messages.messages.length > 0) {
86
153
  console.log(colors.bold(" Recent Messages"));
87
154
  messages.messages.slice(0, 3).forEach((msg) => {
88
- const status = msg.status || "unknown";
89
- const statusIcon = status === "delivered"
155
+ const msgStatus = msg.status || "unknown";
156
+ const statusIcon = msgStatus === "delivered"
90
157
  ? colors.success("✓")
91
- : status === "sent"
158
+ : msgStatus === "sent"
92
159
  ? colors.primary("→")
93
- : status === "failed"
160
+ : msgStatus === "failed"
94
161
  ? colors.error("✗")
95
162
  : colors.dim("○");
96
163
  const to = msg.to || "Unknown";
97
164
  const time = msg.createdAt
98
165
  ? formatRelativeTime(msg.createdAt)
99
166
  : "recently";
100
- console.log(` ${statusIcon} ${colors.dim(to.slice(-4).padStart(8, "•"))} ${colors.dim(status.padEnd(10))} ${colors.dim(time)}`);
167
+ console.log(` ${statusIcon} ${colors.dim(to.slice(-4).padStart(8, "•"))} ${colors.dim(msgStatus.padEnd(10))} ${colors.dim(time)}`);
168
+ });
169
+ console.log();
170
+ }
171
+ // Next Steps (if any)
172
+ if (status?.nextSteps && status.nextSteps.length > 0) {
173
+ console.log(colors.bold(colors.warning(" Next Steps")));
174
+ status.nextSteps.forEach((step, i) => {
175
+ console.log(` ${colors.warning(`${i + 1}.`)} ${step}`);
101
176
  });
102
177
  console.log();
103
178
  }
104
179
  // Quick Actions
105
180
  console.log(colors.dim(" Quick Actions"));
106
181
  console.log(` ${colors.code("sendly sms send")} Send a message`);
107
- console.log(` ${colors.code("sendly credits balance")} Check credit balance`);
108
- console.log(` ${colors.code("sendly webhooks list")} View webhooks`);
182
+ console.log(` ${colors.code("sendly keys list")} View API keys`);
183
+ if (tier === "sandbox") {
184
+ console.log(` ${colors.code("sendly onboarding")} Upgrade to production`);
185
+ }
109
186
  console.log();
110
187
  }
111
188
  }
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3N0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUdMLE1BQU0sRUFDTixJQUFJLEVBRUosVUFBVSxFQUNWLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQTBCbEQsTUFBTSxDQUFDLE9BQU8sT0FBTyxNQUFPLFNBQVEsb0JBQW9CO0lBQ3RELE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLCtEQUErRCxDQUFDO0lBRWxFLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsMEJBQTBCO1FBQzFCLGlDQUFpQztLQUNsQyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxvQ0FBb0M7UUFDcEMsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM1RCxTQUFTO2lCQUNOLEdBQUcsQ0FJRCx5QkFBeUIsQ0FBQztpQkFDNUIsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RSxTQUFTO2lCQUNOLEdBQUcsQ0FBcUMsa0JBQWtCLEVBQUU7Z0JBQzNELEtBQUssRUFBRSxDQUFDO2FBQ1QsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUMsU0FBUztpQkFDTixHQUFHLENBQVEsa0JBQWtCLENBQUM7aUJBQzlCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEIsU0FBUztpQkFDTixHQUFHLENBQWtCLHNCQUFzQixDQUFDO2lCQUM1QyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQy9CLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQztRQUV4RCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDO2dCQUNILE9BQU8sRUFBRTtvQkFDUCxLQUFLO29CQUNMLE9BQU87aUJBQ1I7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztvQkFDeEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxlQUFlO29CQUNqQyxTQUFTLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtpQkFDcEM7Z0JBQ0QsS0FBSyxFQUFFO29CQUNMLGNBQWMsRUFBRSxRQUFRLENBQUMsS0FBSztvQkFDOUIsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLE1BQU07b0JBQ25DLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDO2lCQUNyRTthQUNGLENBQUMsQ0FBQztZQUNILE9BQU87UUFDVCxDQUFDO1FBRUQsNkJBQTZCO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FDekQsQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWQsa0JBQWtCO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FDdEssQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVkLGtCQUFrQjtRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUNmLFNBQVMsR0FBRyxHQUFHO1lBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQ2hCLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRTtnQkFDZCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsVUFBVSxDQUN4RixDQUFDO1FBQ0YsSUFBSSxPQUFPLENBQUMsZUFBZSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQ1QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQ3pHLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUM1RixDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWQsZ0JBQWdCO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUN6RSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3ZFLE9BQU8sQ0FBQyxHQUFHLENBQ1QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLFVBQVUsU0FBUyxDQUMxRCxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsY0FBYyxjQUFjLFFBQVEsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sR0FBRyxjQUFjLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDeEssQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVkLGtCQUFrQjtRQUNsQixJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDO2dCQUN2QyxNQUFNLFVBQVUsR0FDZCxNQUFNLEtBQUssV0FBVztvQkFDcEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO29CQUNyQixDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07d0JBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQzt3QkFDckIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxRQUFROzRCQUNuQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7NEJBQ25CLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFNBQVM7b0JBQ3hCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO29CQUNuQyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQ1QsT0FBTyxVQUFVLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdEgsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxnQkFBZ0I7UUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsR0FBRyxDQUNULE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FDNUQsQ0FBQztRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQ1QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUNwRSxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQzVELENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgaGVhZGVyLFxuICBrZXlWYWx1ZSxcbiAgY29sb3JzLFxuICBqc29uLFxuICBkaXZpZGVyLFxuICBpc0pzb25Nb2RlLFxuICBmb3JtYXRSZWxhdGl2ZVRpbWUsXG59IGZyb20gXCIuLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQgeyBnZXRDb25maWdWYWx1ZSB9IGZyb20gXCIuLi9saWIvY29uZmlnLmpzXCI7XG5cbmludGVyZmFjZSBTdGF0dXNSZXNwb25zZSB7XG4gIGFjY291bnQ6IHtcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHZlcmlmaWVkOiBib29sZWFuO1xuICB9O1xuICBjcmVkaXRzOiB7XG4gICAgYmFsYW5jZTogbnVtYmVyO1xuICAgIHJlc2VydmVkOiBudW1iZXI7XG4gICAgYXZhaWxhYmxlOiBudW1iZXI7XG4gIH07XG4gIHVzYWdlOiB7XG4gICAgbWVzc2FnZXNTZW50VG9kYXk6IG51bWJlcjtcbiAgICBtZXNzYWdlc1NlbnRUaGlzTW9udGg6IG51bWJlcjtcbiAgICB3ZWJob29rc0NvbmZpZ3VyZWQ6IG51bWJlcjtcbiAgICBhY3RpdmVBcGlLZXlzOiBudW1iZXI7XG4gIH07XG4gIGxpbWl0czoge1xuICAgIGRhaWx5TGltaXQ6IG51bWJlcjtcbiAgICBtb250aGx5TGltaXQ6IG51bWJlcjtcbiAgICByYXRlTGltaXQ6IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHVzIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPVxuICAgIFwiU2hvdyBhY2NvdW50IHN0YXR1cyBkYXNoYm9hcmQgd2l0aCBjcmVkaXRzLCB1c2FnZSwgYW5kIGhlYWx0aFwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHN0YXR1c1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc3RhdHVzIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZldGNoIGFsbCBzdGF0dXMgZGF0YSBpbiBwYXJhbGxlbFxuICAgIGNvbnN0IFtjcmVkaXRzLCBtZXNzYWdlcywgd2ViaG9va3MsIGtleXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgYXBpQ2xpZW50XG4gICAgICAgIC5nZXQ8e1xuICAgICAgICAgIGJhbGFuY2U6IG51bWJlcjtcbiAgICAgICAgICByZXNlcnZlZEJhbGFuY2U6IG51bWJlcjtcbiAgICAgICAgICBhdmFpbGFibGVCYWxhbmNlOiBudW1iZXI7XG4gICAgICAgIH0+KFwiL2FwaS92MS9hY2NvdW50L2NyZWRpdHNcIilcbiAgICAgICAgLmNhdGNoKCgpID0+ICh7IGJhbGFuY2U6IDAsIHJlc2VydmVkQmFsYW5jZTogMCwgYXZhaWxhYmxlQmFsYW5jZTogMCB9KSksXG4gICAgICBhcGlDbGllbnRcbiAgICAgICAgLmdldDx7IG1lc3NhZ2VzOiBhbnlbXTsgdG90YWw6IG51bWJlciB9PihcIi9hcGkvdjEvbWVzc2FnZXNcIiwge1xuICAgICAgICAgIGxpbWl0OiA1LFxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZXM6IFtdLCB0b3RhbDogMCB9KSksXG4gICAgICBhcGlDbGllbnRcbiAgICAgICAgLmdldDxhbnlbXT4oXCIvYXBpL3YxL3dlYmhvb2tzXCIpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBbXSksXG4gICAgICBhcGlDbGllbnRcbiAgICAgICAgLmdldDx7IGtleXM6IGFueVtdIH0+KFwiL2FwaS92MS9hY2NvdW50L2tleXNcIilcbiAgICAgICAgLmNhdGNoKCgpID0+ICh7IGtleXM6IFtdIH0pKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IGVtYWlsID0gZ2V0Q29uZmlnVmFsdWUoXCJlbWFpbFwiKSB8fCBcIlVua25vd25cIjtcbiAgICBjb25zdCBhcGlNb2RlID0gZ2V0Q29uZmlnVmFsdWUoXCJlbnZpcm9ubWVudFwiKSB8fCBcInRlc3RcIjtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oe1xuICAgICAgICBhY2NvdW50OiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgYXBpTW9kZSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGl0czoge1xuICAgICAgICAgIGJhbGFuY2U6IGNyZWRpdHMuYmFsYW5jZSxcbiAgICAgICAgICByZXNlcnZlZDogY3JlZGl0cy5yZXNlcnZlZEJhbGFuY2UsXG4gICAgICAgICAgYXZhaWxhYmxlOiBjcmVkaXRzLmF2YWlsYWJsZUJhbGFuY2UsXG4gICAgICAgIH0sXG4gICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgcmVjZW50TWVzc2FnZXM6IG1lc3NhZ2VzLnRvdGFsLFxuICAgICAgICAgIHdlYmhvb2tzQ29uZmlndXJlZDogd2ViaG9va3MubGVuZ3RoLFxuICAgICAgICAgIGFjdGl2ZUFwaUtleXM6IGtleXMua2V5cz8uZmlsdGVyKChrOiBhbnkpID0+IGsuaXNBY3RpdmUpLmxlbmd0aCB8fCAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQmVhdXRpZnVsIGRhc2hib2FyZCBvdXRwdXRcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY29sb3JzLmJvbGQoY29sb3JzLnByaW1hcnkoXCIgIFNlbmRseSBTdGF0dXMgRGFzaGJvYXJkXCIpKSxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCIgIFwiICsgXCLilIBcIi5yZXBlYXQoNDApKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIC8vIEFjY291bnQgU2VjdGlvblxuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiICBBY2NvdW50XCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICAgICR7Y29sb3JzLmRpbShcIkVtYWlsOlwiKX0gICAgICAgICR7ZW1haWx9YCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAgICR7Y29sb3JzLmRpbShcIkFQSSBNb2RlOlwiKX0gICAgICR7YXBpTW9kZSA9PT0gXCJ0ZXN0XCIgPyBjb2xvcnMud2FybmluZyhcInRlc3RcIikgKyBjb2xvcnMuZGltKFwiIChzYW5kYm94KVwiKSA6IGNvbG9ycy5zdWNjZXNzKFwibGl2ZVwiKSArIGNvbG9ycy5kaW0oXCIgKHByb2R1Y3Rpb24pXCIpfWAsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgLy8gQ3JlZGl0cyBTZWN0aW9uXG4gICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCIgIENyZWRpdHNcIikpO1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGNyZWRpdHMuYXZhaWxhYmxlQmFsYW5jZSB8fCAwO1xuICAgIGNvbnN0IGNyZWRpdENvbG9yID1cbiAgICAgIGF2YWlsYWJsZSA+IDEwMFxuICAgICAgICA/IGNvbG9ycy5zdWNjZXNzXG4gICAgICAgIDogYXZhaWxhYmxlID4gMTBcbiAgICAgICAgICA/IGNvbG9ycy53YXJuaW5nXG4gICAgICAgICAgOiBjb2xvcnMuZXJyb3I7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAgICR7Y29sb3JzLmRpbShcIkF2YWlsYWJsZTpcIil9ICAgICR7Y3JlZGl0Q29sb3IoYXZhaWxhYmxlLnRvTG9jYWxlU3RyaW5nKCkpfSBjcmVkaXRzYCxcbiAgICApO1xuICAgIGlmIChjcmVkaXRzLnJlc2VydmVkQmFsYW5jZSA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgICAgICR7Y29sb3JzLmRpbShcIlJlc2VydmVkOlwiKX0gICAgICR7Y29sb3JzLndhcm5pbmcoY3JlZGl0cy5yZXNlcnZlZEJhbGFuY2UudG9Mb2NhbGVTdHJpbmcoKSl9IGNyZWRpdHNgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAgICR7Y29sb3JzLmRpbShcIkNhcGFjaXR5OlwiKX0gICAgIH4ke01hdGguZmxvb3IoYXZhaWxhYmxlKS50b0xvY2FsZVN0cmluZygpfSBTTVMgKFVTL0NBKWAsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgLy8gVXNhZ2UgU2VjdGlvblxuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiICBSZXNvdXJjZXNcIikpO1xuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSBrZXlzLmtleXM/LmZpbHRlcigoazogYW55KSA9PiBrLmlzQWN0aXZlKS5sZW5ndGggfHwgMDtcbiAgICBjb25zdCBhY3RpdmVXZWJob29rcyA9IHdlYmhvb2tzLmZpbHRlcigodzogYW55KSA9PiB3LmlzX2FjdGl2ZSkubGVuZ3RoO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCAgICAke2NvbG9ycy5kaW0oXCJBUEkgS2V5czpcIil9ICAgICAke2FjdGl2ZUtleXN9IGFjdGl2ZWAsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAgICAgJHtjb2xvcnMuZGltKFwiV2ViaG9va3M6XCIpfSAgICAgJHthY3RpdmVXZWJob29rc30gY29uZmlndXJlZCR7d2ViaG9va3MubGVuZ3RoID4gYWN0aXZlV2ViaG9va3MgPyBjb2xvcnMuZGltKGAgKCR7d2ViaG9va3MubGVuZ3RoIC0gYWN0aXZlV2ViaG9va3N9IHBhdXNlZClgKSA6IFwiXCJ9YCxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICAvLyBSZWNlbnQgQWN0aXZpdHlcbiAgICBpZiAobWVzc2FnZXMubWVzc2FnZXMgJiYgbWVzc2FnZXMubWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCIgIFJlY2VudCBNZXNzYWdlc1wiKSk7XG4gICAgICBtZXNzYWdlcy5tZXNzYWdlcy5zbGljZSgwLCAzKS5mb3JFYWNoKChtc2c6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBtc2cuc3RhdHVzIHx8IFwidW5rbm93blwiO1xuICAgICAgICBjb25zdCBzdGF0dXNJY29uID1cbiAgICAgICAgICBzdGF0dXMgPT09IFwiZGVsaXZlcmVkXCJcbiAgICAgICAgICAgID8gY29sb3JzLnN1Y2Nlc3MoXCLinJNcIilcbiAgICAgICAgICAgIDogc3RhdHVzID09PSBcInNlbnRcIlxuICAgICAgICAgICAgICA/IGNvbG9ycy5wcmltYXJ5KFwi4oaSXCIpXG4gICAgICAgICAgICAgIDogc3RhdHVzID09PSBcImZhaWxlZFwiXG4gICAgICAgICAgICAgICAgPyBjb2xvcnMuZXJyb3IoXCLinJdcIilcbiAgICAgICAgICAgICAgICA6IGNvbG9ycy5kaW0oXCLil4tcIik7XG4gICAgICAgIGNvbnN0IHRvID0gbXNnLnRvIHx8IFwiVW5rbm93blwiO1xuICAgICAgICBjb25zdCB0aW1lID0gbXNnLmNyZWF0ZWRBdFxuICAgICAgICAgID8gZm9ybWF0UmVsYXRpdmVUaW1lKG1zZy5jcmVhdGVkQXQpXG4gICAgICAgICAgOiBcInJlY2VudGx5XCI7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgICAgJHtzdGF0dXNJY29ufSAke2NvbG9ycy5kaW0odG8uc2xpY2UoLTQpLnBhZFN0YXJ0KDgsIFwi4oCiXCIpKX0gJHtjb2xvcnMuZGltKHN0YXR1cy5wYWRFbmQoMTApKX0gJHtjb2xvcnMuZGltKHRpbWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgfVxuXG4gICAgLy8gUXVpY2sgQWN0aW9uc1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCIgIFF1aWNrIEFjdGlvbnNcIikpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCAgICAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHNtcyBzZW5kXCIpfSAgICAgIFNlbmQgYSBtZXNzYWdlYCxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCAgICAke2NvbG9ycy5jb2RlKFwic2VuZGx5IGNyZWRpdHMgYmFsYW5jZVwiKX0gQ2hlY2sgY3JlZGl0IGJhbGFuY2VgLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAgICR7Y29sb3JzLmNvZGUoXCJzZW5kbHkgd2ViaG9va3MgbGlzdFwiKX0gIFZpZXcgd2ViaG9va3NgLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxufVxuIl19
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3N0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBa0NsRCxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU8sU0FBUSxvQkFBb0I7SUFDdEQsTUFBTSxDQUFDLFdBQVcsR0FDaEIscUVBQXFFLENBQUM7SUFFeEUsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiwwQkFBMEI7UUFDMUIsaUNBQWlDO0tBQ2xDLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO0tBQ2xDLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLHFDQUFxQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVM7YUFDM0IsR0FBRyxDQUF3Qix5QkFBeUIsQ0FBQzthQUNyRCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckIsOENBQThDO1FBQzlDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDNUQsU0FBUztpQkFDTixHQUFHLENBSUQseUJBQXlCLENBQUM7aUJBQzVCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENB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aEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEUsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsMkJBQTJCLENBQ25FLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7IGNvbG9ycywganNvbiwgaXNKc29uTW9kZSwgZm9ybWF0UmVsYXRpdmVUaW1lIH0gZnJvbSBcIi4uL2xpYi9vdXRwdXQuanNcIjtcbmltcG9ydCB7IGdldENvbmZpZ1ZhbHVlIH0gZnJvbSBcIi4uL2xpYi9jb25maWcuanNcIjtcblxuaW50ZXJmYWNlIEFjY291bnRTdGF0dXNSZXNwb25zZSB7XG4gIGFjY291bnQ6IHtcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIHRpZXI6IFwic2FuZGJveFwiIHwgXCJpbnRlcm5hdGlvbmFsXCIgfCBcImRvbWVzdGljXCIgfCBcImdsb2JhbFwiO1xuICAgIG9uYm9hcmRpbmdDb21wbGV0ZWQ6IGJvb2xlYW47XG4gIH07XG4gIHZlcmlmaWNhdGlvbjoge1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIGlzVmVyaWZpZWQ6IGJvb2xlYW47XG4gICAgYWxwaGFTZW5kZXJJZDogc3RyaW5nIHwgbnVsbDtcbiAgICB0b2xsRnJlZU51bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICBidXNpbmVzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gIH0gfCBudWxsO1xuICBjYXBhYmlsaXRpZXM6IHtcbiAgICBjYW5TZW5kU2FuZGJveDogYm9vbGVhbjtcbiAgICBjYW5TZW5kSW50ZXJuYXRpb25hbDogYm9vbGVhbjtcbiAgICBjYW5TZW5kRG9tZXN0aWM6IGJvb2xlYW47XG4gICAgcmVnaW9uczogc3RyaW5nW107XG4gIH07XG4gIGNyZWRpdHM6IHtcbiAgICBiYWxhbmNlOiBudW1iZXI7XG4gICAgY2FuU2VuZExpdmU6IGJvb2xlYW47XG4gIH07XG4gIGtleXM6IHtcbiAgICBoYXNUZXN0S2V5OiBib29sZWFuO1xuICAgIGhhc0xpdmVLZXk6IGJvb2xlYW47XG4gICAgdG90YWxBY3RpdmU6IG51bWJlcjtcbiAgfTtcbiAgbmV4dFN0ZXBzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHVzIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPVxuICAgIFwiU2hvdyBhY2NvdW50IHN0YXR1cyBkYXNoYm9hcmQgd2l0aCBjcmVkaXRzLCB1c2FnZSwgYW5kIGNhcGFiaWxpdGllc1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHN0YXR1c1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc3RhdHVzIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZldGNoIGNvbXByZWhlbnNpdmUgYWNjb3VudCBzdGF0dXNcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBhcGlDbGllbnRcbiAgICAgIC5nZXQ8QWNjb3VudFN0YXR1c1Jlc3BvbnNlPihcIi9hcGkvY2xpL2FjY291bnQvc3RhdHVzXCIpXG4gICAgICAuY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICAvLyBGYWxsYmFjayBkYXRhIGlmIG5ldyBlbmRwb2ludCBub3QgYXZhaWxhYmxlXG4gICAgY29uc3QgW2NyZWRpdHMsIG1lc3NhZ2VzLCB3ZWJob29rcywga2V5c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBhcGlDbGllbnRcbiAgICAgICAgLmdldDx7XG4gICAgICAgICAgYmFsYW5jZTogbnVtYmVyO1xuICAgICAgICAgIHJlc2VydmVkQmFsYW5jZTogbnVtYmVyO1xuICAgICAgICAgIGF2YWlsYWJsZUJhbGFuY2U6IG51bWJlcjtcbiAgICAgICAgfT4oXCIvYXBpL3YxL2FjY291bnQvY3JlZGl0c1wiKVxuICAgICAgICAuY2F0Y2goKCkgPT4gKHsgYmFsYW5jZTogMCwgcmVzZXJ2ZWRCYWxhbmNlOiAwLCBhdmFpbGFibGVCYWxhbmNlOiAwIH0pKSxcbiAgICAgIGFwaUNsaWVudFxuICAgICAgICAuZ2V0PHsgbWVzc2FnZXM6IGFueVtdOyB0b3RhbDogbnVtYmVyIH0+KFwiL2FwaS92MS9tZXNzYWdlc1wiLCB7XG4gICAgICAgICAgbGltaXQ6IDUsXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiAoeyBtZXNzYWdlczogW10sIHRvdGFsOiAwIH0pKSxcbiAgICAgIGFwaUNsaWVudC5nZXQ8YW55W10+KFwiL2FwaS92MS93ZWJob29rc1wiKS5jYXRjaCgoKSA9PiBbXSksXG4gICAgICBhcGlDbGllbnRcbiAgICAgICAgLmdldDx7IGtleXM6IGFueVtdIH0+KFwiL2FwaS92MS9hY2NvdW50L2tleXNcIilcbiAgICAgICAgLmNhdGNoKCgpID0+ICh7IGtleXM6IFtdIH0pKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IGVtYWlsID1cbiAgICAgIHN0YXR1cz8uYWNjb3VudD8uZW1haWwgfHwgZ2V0Q29uZmlnVmFsdWUoXCJlbWFpbFwiKSB8fCBcIlVua25vd25cIjtcbiAgICBjb25zdCBhcGlNb2RlID0gZ2V0Q29uZmlnVmFsdWUoXCJlbnZpcm9ubWVudFwiKSB8fCBcInRlc3RcIjtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oe1xuICAgICAgICBhY2NvdW50OiBzdGF0dXM/LmFjY291bnQgfHwgeyBlbWFpbCwgdGllcjogXCJzYW5kYm94XCIgfSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBzdGF0dXM/LnZlcmlmaWNhdGlvbiB8fCBudWxsLFxuICAgICAgICBjYXBhYmlsaXRpZXM6IHN0YXR1cz8uY2FwYWJpbGl0aWVzIHx8IHsgcmVnaW9uczogW1wic2FuZGJveFwiXSB9LFxuICAgICAgICBjcmVkaXRzOiBzdGF0dXM/LmNyZWRpdHMgfHwge1xuICAgICAgICAgIGJhbGFuY2U6IGNyZWRpdHMuYmFsYW5jZSxcbiAgICAgICAgICBjYW5TZW5kTGl2ZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGtleXM6IHN0YXR1cz8ua2V5cyB8fCB7XG4gICAgICAgICAgaGFzVGVzdEtleTogZmFsc2UsXG4gICAgICAgICAgaGFzTGl2ZUtleTogZmFsc2UsXG4gICAgICAgICAgdG90YWxBY3RpdmU6IGtleXMua2V5cz8uZmlsdGVyKChrOiBhbnkpID0+IGsuaXNBY3RpdmUpLmxlbmd0aCB8fCAwLFxuICAgICAgICB9LFxuICAgICAgICBuZXh0U3RlcHM6IHN0YXR1cz8ubmV4dFN0ZXBzIHx8IFtdLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQmVhdXRpZnVsIGRhc2hib2FyZCBvdXRwdXRcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKGNvbG9ycy5wcmltYXJ5KFwiICBTZW5kbHkgQWNjb3VudCBTdGF0dXNcIikpKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiICBcIiArIFwi4pSAXCIucmVwZWF0KDUwKSkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICAvLyBBY2NvdW50ICYgVGllciBTZWN0aW9uXG4gICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCIgIEFjY291bnRcIikpO1xuICAgIGNvbnNvbGUubG9nKGAgICAgJHtjb2xvcnMuZGltKFwiRW1haWw6XCIpfSAgICAgICAgICR7ZW1haWx9YCk7XG5cbiAgICAvLyBTaG93IHRpZXIgd2l0aCBjb2xvciBjb2RpbmdcbiAgICBjb25zdCB0aWVyID0gc3RhdHVzPy5hY2NvdW50Py50aWVyIHx8IFwic2FuZGJveFwiO1xuICAgIGNvbnN0IHRpZXJEaXNwbGF5ID0ge1xuICAgICAgc2FuZGJveDogY29sb3JzLndhcm5pbmcoXCJTYW5kYm94XCIpICsgY29sb3JzLmRpbShcIiAodGVzdCBvbmx5KVwiKSxcbiAgICAgIGludGVybmF0aW9uYWw6XG4gICAgICAgIGNvbG9ycy5wcmltYXJ5KFwiSW50ZXJuYXRpb25hbFwiKSArIGNvbG9ycy5kaW0oXCIgKDQ4IGNvdW50cmllcylcIiksXG4gICAgICBkb21lc3RpYzogY29sb3JzLnN1Y2Nlc3MoXCJVUyAmIENhbmFkYVwiKSArIGNvbG9ycy5kaW0oXCIgKHRvbGwtZnJlZSlcIiksXG4gICAgICBnbG9iYWw6IGNvbG9ycy5zdWNjZXNzKFwiR2xvYmFsXCIpICsgY29sb3JzLmRpbShcIiAoZnVsbCBhY2Nlc3MpXCIpLFxuICAgIH07XG4gICAgY29uc29sZS5sb2coYCAgICAke2NvbG9ycy5kaW0oXCJUaWVyOlwiKX0gICAgICAgICAgJHt0aWVyRGlzcGxheVt0aWVyXX1gKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgLy8gVmVyaWZpY2F0aW9uIFNlY3Rpb25cbiAgICBpZiAoc3RhdHVzPy52ZXJpZmljYXRpb24pIHtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiICBWZXJpZmljYXRpb25cIikpO1xuICAgICAgY29uc3QgdiA9IHN0YXR1cy52ZXJpZmljYXRpb247XG5cbiAgICAgIC8vIFN0YXR1cyB3aXRoIGNvbG9yXG4gICAgICBjb25zdCBzdGF0dXNDb2xvcnM6IFJlY29yZDxzdHJpbmcsIChzOiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gICAgICAgIGFwcHJvdmVkOiBjb2xvcnMuc3VjY2VzcyxcbiAgICAgICAgdmVyaWZpZWQ6IGNvbG9ycy5zdWNjZXNzLFxuICAgICAgICBwZW5kaW5nOiBjb2xvcnMud2FybmluZyxcbiAgICAgICAgaW5fcHJvZ3Jlc3M6IGNvbG9ycy53YXJuaW5nLFxuICAgICAgICByZWplY3RlZDogY29sb3JzLmVycm9yLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YXR1c0NvbG9yID0gc3RhdHVzQ29sb3JzW3Yuc3RhdHVzIHx8IFwiXCJdIHx8IGNvbG9ycy5kaW07XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYCAgICAke2NvbG9ycy5kaW0oXCJTdGF0dXM6XCIpfSAgICAgICAgJHtzdGF0dXNDb2xvcih2LnN0YXR1cyB8fCBcInVua25vd25cIil9YCxcbiAgICAgICk7XG5cbiAgICAgIC8vIFR5cGVcbiAgICAgIGNvbnN0IHR5cGVMYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIHRvbGxfZnJlZTogXCJUb2xsLUZyZWUgKFVTL0NBKVwiLFxuICAgICAgICBpbnRlcm5hdGlvbmFsOiBcIkludGVybmF0aW9uYWxcIixcbiAgICAgICAgYm90aDogXCJHbG9iYWwgKFVTL0NBICsgSW50bClcIixcbiAgICAgIH07XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYCAgICAke2NvbG9ycy5kaW0oXCJUeXBlOlwiKX0gICAgICAgICAgJHt0eXBlTGFiZWxzW3YudHlwZSB8fCBcIlwiXSB8fCB2LnR5cGV9YCxcbiAgICAgICk7XG5cbiAgICAgIC8vIFNob3cgc2VuZGVyIElEIG9yIHRvbGwtZnJlZSBudW1iZXJcbiAgICAgIGlmICh2LmFscGhhU2VuZGVySWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCAgICAke2NvbG9ycy5kaW0oXCJTZW5kZXIgSUQ6XCIpfSAgICAgJHtjb2xvcnMucHJpbWFyeSh2LmFscGhhU2VuZGVySWQpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodi50b2xsRnJlZU51bWJlcikge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgICAgICR7Y29sb3JzLmRpbShcIlRvbGwtRnJlZTpcIil9ICAgICAke2NvbG9ycy5wcmltYXJ5KHYudG9sbEZyZWVOdW1iZXIpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgIH1cblxuICAgIC8vIENhcGFiaWxpdGllcyBTZWN0aW9uXG4gICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCIgIFNlbmQgQ2FwYWJpbGl0aWVzXCIpKTtcbiAgICBjb25zdCBjYXBzID0gc3RhdHVzPy5jYXBhYmlsaXRpZXMgfHwge1xuICAgICAgY2FuU2VuZFNhbmRib3g6IHRydWUsXG4gICAgICBjYW5TZW5kSW50ZXJuYXRpb25hbDogZmFsc2UsXG4gICAgICBjYW5TZW5kRG9tZXN0aWM6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBTYW5kYm94XG4gICAgY29uc3Qgc2FuZGJveEljb24gPSBjYXBzLmNhblNlbmRTYW5kYm94XG4gICAgICA/IGNvbG9ycy5zdWNjZXNzKFwi4pyTXCIpXG4gICAgICA6IGNvbG9ycy5kaW0oXCLil4tcIik7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAgICR7c2FuZGJveEljb259ICR7Y29sb3JzLmRpbShcIlNhbmRib3hcIil9ICAgICAgICBUZXN0IG51bWJlcnMgb25seWAsXG4gICAgKTtcblxuICAgIC8vIEludGVybmF0aW9uYWxcbiAgICBjb25zdCBpbnRsSWNvbiA9IGNhcHMuY2FuU2VuZEludGVybmF0aW9uYWxcbiAgICAgID8gY29sb3JzLnN1Y2Nlc3MoXCLinJNcIilcbiAgICAgIDogY29sb3JzLmRpbShcIuKXi1wiKTtcbiAgICBjb25zdCBpbnRsTGFiZWwgPSBjYXBzLmNhblNlbmRJbnRlcm5hdGlvbmFsXG4gICAgICA/IFwiNDggY291bnRyaWVzXCJcbiAgICAgIDogY29sb3JzLmRpbShcIlVwZ3JhZGUgdG8gdW5sb2NrXCIpO1xuICAgIGNvbnNvbGUubG9nKGAgICAgJHtpbnRsSWNvbn0gJHtjb2xvcnMuZGltKFwiSW50ZXJuYXRpb25hbFwiKX0gICR7aW50bExhYmVsfWApO1xuXG4gICAgLy8gVVMgJiBDYW5hZGFcbiAgICBjb25zdCB1c0ljb24gPSBjYXBzLmNhblNlbmREb21lc3RpYyA/IGNvbG9ycy5zdWNjZXNzKFwi4pyTXCIpIDogY29sb3JzLmRpbShcIuKXi1wiKTtcbiAgICBjb25zdCB1c0xhYmVsID0gY2Fwcy5jYW5TZW5kRG9tZXN0aWNcbiAgICAgID8gXCJUd28td2F5IG1lc3NhZ2luZ1wiXG4gICAgICA6IGNvbG9ycy5kaW0oXCJVcGdyYWRlIHRvIHVubG9ja1wiKTtcbiAgICBjb25zb2xlLmxvZyhgICAgICR7dXNJY29ufSAke2NvbG9ycy5kaW0oXCJVUyAmIENhbmFkYVwiKX0gICAgJHt1c0xhYmVsfWApO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICAvLyBDcmVkaXRzIFNlY3Rpb25cbiAgICBjb25zdCBjcmVkaXRCYWxhbmNlID0gc3RhdHVzPy5jcmVkaXRzPy5iYWxhbmNlID8/IGNyZWRpdHMuYmFsYW5jZSA/PyAwO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiICBDcmVkaXRzXCIpKTtcbiAgICBjb25zdCBjcmVkaXRDb2xvciA9XG4gICAgICBjcmVkaXRCYWxhbmNlID4gMTAwXG4gICAgICAgID8gY29sb3JzLnN1Y2Nlc3NcbiAgICAgICAgOiBjcmVkaXRCYWxhbmNlID4gMTBcbiAgICAgICAgICA/IGNvbG9ycy53YXJuaW5nXG4gICAgICAgICAgOiBjb2xvcnMuZXJyb3I7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICAgICR7Y29sb3JzLmRpbShcIkJhbGFuY2U6XCIpfSAgICAgICAke2NyZWRpdENvbG9yKGNyZWRpdEJhbGFuY2UudG9Mb2NhbGVTdHJpbmcoKSl9IGNyZWRpdHNgLFxuICAgICk7XG4gICAgaWYgKGNyZWRpdHMucmVzZXJ2ZWRCYWxhbmNlID4gMCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGAgICAgJHtjb2xvcnMuZGltKFwiUmVzZXJ2ZWQ6XCIpfSAgICAgICR7Y29sb3JzLndhcm5pbmcoY3JlZGl0cy5yZXNlcnZlZEJhbGFuY2UudG9Mb2NhbGVTdHJpbmcoKSl9IGNyZWRpdHNgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIC8vIFJlc291cmNlcyBTZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlS2V5cyA9XG4gICAgICBzdGF0dXM/LmtleXM/LnRvdGFsQWN0aXZlID8/XG4gICAgICBrZXlzLmtleXM/LmZpbHRlcigoazogYW55KSA9PiBrLmlzQWN0aXZlKS5sZW5ndGggPz9cbiAgICAgIDA7XG4gICAgY29uc3QgYWN0aXZlV2ViaG9va3MgPSB3ZWJob29rcy5maWx0ZXIoKHc6IGFueSkgPT4gdy5pc19hY3RpdmUpLmxlbmd0aDtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChcIiAgUmVzb3VyY2VzXCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICAgICR7Y29sb3JzLmRpbShcIkFQSSBLZXlzOlwiKX0gICAgICAke2FjdGl2ZUtleXN9IGFjdGl2ZWApO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCAgICAke2NvbG9ycy5kaW0oXCJXZWJob29rczpcIil9ICAgICAgJHthY3RpdmVXZWJob29rc30gY29uZmlndXJlZGAsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgLy8gUmVjZW50IEFjdGl2aXR5XG4gICAgaWYgKG1lc3NhZ2VzLm1lc3NhZ2VzICYmIG1lc3NhZ2VzLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiICBSZWNlbnQgTWVzc2FnZXNcIikpO1xuICAgICAgbWVzc2FnZXMubWVzc2FnZXMuc2xpY2UoMCwgMykuZm9yRWFjaCgobXNnOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbXNnU3RhdHVzID0gbXNnLnN0YXR1cyB8fCBcInVua25vd25cIjtcbiAgICAgICAgY29uc3Qgc3RhdHVzSWNvbiA9XG4gICAgICAgICAgbXNnU3RhdHVzID09PSBcImRlbGl2ZXJlZFwiXG4gICAgICAgICAgICA/IGNvbG9ycy5zdWNjZXNzKFwi4pyTXCIpXG4gICAgICAgICAgICA6IG1zZ1N0YXR1cyA9PT0gXCJzZW50XCJcbiAgICAgICAgICAgICAgPyBjb2xvcnMucHJpbWFyeShcIuKGklwiKVxuICAgICAgICAgICAgICA6IG1zZ1N0YXR1cyA9PT0gXCJmYWlsZWRcIlxuICAgICAgICAgICAgICAgID8gY29sb3JzLmVycm9yKFwi4pyXXCIpXG4gICAgICAgICAgICAgICAgOiBjb2xvcnMuZGltKFwi4peLXCIpO1xuICAgICAgICBjb25zdCB0byA9IG1zZy50byB8fCBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgdGltZSA9IG1zZy5jcmVhdGVkQXRcbiAgICAgICAgICA/IGZvcm1hdFJlbGF0aXZlVGltZShtc2cuY3JlYXRlZEF0KVxuICAgICAgICAgIDogXCJyZWNlbnRseVwiO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgICAgICR7c3RhdHVzSWNvbn0gJHtjb2xvcnMuZGltKHRvLnNsaWNlKC00KS5wYWRTdGFydCg4LCBcIuKAolwiKSl9ICR7Y29sb3JzLmRpbShtc2dTdGF0dXMucGFkRW5kKDEwKSl9ICR7Y29sb3JzLmRpbSh0aW1lKX1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgIH1cblxuICAgIC8vIE5leHQgU3RlcHMgKGlmIGFueSlcbiAgICBpZiAoc3RhdHVzPy5uZXh0U3RlcHMgJiYgc3RhdHVzLm5leHRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChjb2xvcnMud2FybmluZyhcIiAgTmV4dCBTdGVwc1wiKSkpO1xuICAgICAgc3RhdHVzLm5leHRTdGVwcy5mb3JFYWNoKChzdGVwLCBpKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtjb2xvcnMud2FybmluZyhgJHtpICsgMX0uYCl9ICR7c3RlcH1gKTtcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICB9XG5cbiAgICAvLyBRdWljayBBY3Rpb25zXG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIiAgUXVpY2sgQWN0aW9uc1wiKSk7XG4gICAgY29uc29sZS5sb2coYCAgICAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHNtcyBzZW5kXCIpfSAgICAgIFNlbmQgYSBtZXNzYWdlYCk7XG4gICAgY29uc29sZS5sb2coYCAgICAke2NvbG9ycy5jb2RlKFwic2VuZGx5IGtleXMgbGlzdFwiKX0gICAgIFZpZXcgQVBJIGtleXNgKTtcbiAgICBpZiAodGllciA9PT0gXCJzYW5kYm94XCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgICAgICR7Y29sb3JzLmNvZGUoXCJzZW5kbHkgb25ib2FyZGluZ1wiKX0gICAgVXBncmFkZSB0byBwcm9kdWN0aW9uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cbn1cbiJdfQ==
@@ -47,6 +47,15 @@ declare class ApiClient {
47
47
  post<T>(path: string, body?: Record<string, unknown>, requireAuth?: boolean): Promise<T>;
48
48
  patch<T>(path: string, body?: Record<string, unknown>, requireAuth?: boolean): Promise<T>;
49
49
  delete<T>(path: string, requireAuth?: boolean): Promise<T>;
50
+ /**
51
+ * Upload a file using multipart/form-data
52
+ * Used for batch CSV uploads to Supabase storage
53
+ */
54
+ uploadFile<T>(path: string, file: {
55
+ buffer: Buffer;
56
+ filename: string;
57
+ mimetype?: string;
58
+ }, requireAuth?: boolean): Promise<T>;
50
59
  }
51
60
  export declare const apiClient: ApiClient;
52
61
  export {};
@@ -175,6 +175,67 @@ class ApiClient {
175
175
  async delete(path, requireAuth = true) {
176
176
  return this.request("DELETE", path, { requireAuth });
177
177
  }
178
+ /**
179
+ * Upload a file using multipart/form-data
180
+ * Used for batch CSV uploads to Supabase storage
181
+ */
182
+ async uploadFile(path, file, requireAuth = true) {
183
+ const maxRetries = getEffectiveValue("maxRetries");
184
+ const timeout = getEffectiveValue("timeout");
185
+ const url = `${this.getBaseUrl()}${path}`;
186
+ // Build multipart form data manually (Node.js compatible)
187
+ const boundary = `----FormBoundary${Date.now()}${Math.random().toString(36).substring(2)}`;
188
+ const mimetype = file.mimetype || "text/csv";
189
+ const header = Buffer.from(`--${boundary}\r\n` +
190
+ `Content-Disposition: form-data; name="file"; filename="${file.filename}"\r\n` +
191
+ `Content-Type: ${mimetype}\r\n\r\n`);
192
+ const footer = Buffer.from(`\r\n--${boundary}--\r\n`);
193
+ const body = Buffer.concat([header, file.buffer, footer]);
194
+ const headers = {
195
+ "Content-Type": `multipart/form-data; boundary=${boundary}`,
196
+ Accept: "application/json",
197
+ "User-Agent": `@sendly/cli/${version}`,
198
+ };
199
+ if (requireAuth) {
200
+ const token = getAuthToken();
201
+ if (!token) {
202
+ throw new AuthenticationError();
203
+ }
204
+ headers["Authorization"] = `Bearer ${token}`;
205
+ }
206
+ let lastError;
207
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
208
+ try {
209
+ const controller = new AbortController();
210
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
211
+ const response = await fetch(url, {
212
+ method: "POST",
213
+ headers,
214
+ body,
215
+ signal: controller.signal,
216
+ });
217
+ clearTimeout(timeoutId);
218
+ this.updateRateLimitInfo(response.headers);
219
+ const data = await response.json().catch(() => ({}));
220
+ if (!response.ok) {
221
+ this.handleError(response.status, data);
222
+ }
223
+ return data;
224
+ }
225
+ catch (error) {
226
+ lastError = error;
227
+ if (!isRetryableError(error)) {
228
+ throw error;
229
+ }
230
+ if (attempt === maxRetries) {
231
+ throw error;
232
+ }
233
+ const backoffMs = Math.min(1000 * Math.pow(2, attempt), 10000);
234
+ await sleep(backoffMs);
235
+ }
236
+ }
237
+ throw lastError || new Error("Upload failed");
238
+ }
178
239
  }
179
240
  export const apiClient = new ApiClient();
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlFLGlDQUFpQztBQUNqQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUF3QixDQUFDO0FBRXpFOztHQUVHO0FBQ0gsU0FBUyxLQUFLLENBQUMsRUFBVTtJQUN2QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLGlCQUFpQjtJQUNqQixJQUFJLEtBQUssWUFBWSxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxvQ0FBb0M7SUFDcEMsSUFBSSxLQUFLLFlBQVksUUFBUSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBaUJELE1BQU0sT0FBTyxRQUFTLFNBQVEsS0FBSztJQUV4QjtJQUVBO0lBQ0E7SUFKVCxZQUNTLElBQVksRUFDbkIsT0FBZSxFQUNSLFVBQWtCLEVBQ2xC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WSxFQUNaLElBQThCLEVBQzlCLGNBQXVCLElBQUk7UUFFM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFJLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBSSxJQUFZLEVBQUUsY0FBdUIsSUFBSTtRQUN2RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUksUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFQSSBDbGllbnQgZm9yIFNlbmRseSBDTElcbiAqIEhhbmRsZXMgYWxsIEhUVFAgcmVxdWVzdHMgdG8gdGhlIFNlbmRseSBBUElcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBnZXRBdXRoVG9rZW4sIGdldENvbmZpZ1ZhbHVlLCBnZXRFZmZlY3RpdmVWYWx1ZSB9IGZyb20gXCIuL2NvbmZpZy5qc1wiO1xuXG4vLyBSZWFkIHZlcnNpb24gZnJvbSBwYWNrYWdlLmpzb25cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCB7IHZlcnNpb24gfSA9IHJlcXVpcmUoXCIuLi8uLi9wYWNrYWdlLmpzb25cIikgYXMgeyB2ZXJzaW9uOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTbGVlcCBmb3IgYSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZXJyb3IgaXMgcmV0cnlhYmxlIChuZXR3b3JrIGVycm9ycyBvciA1eHggc2VydmVyIGVycm9ycylcbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBOZXR3b3JrIGVycm9yc1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImZldGNoXCIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gU2VydmVyIGVycm9ycyAoNXh4KSBhcmUgcmV0cnlhYmxlXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwaUVycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPj0gNTAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVJlc3BvbnNlPFQ+IHtcbiAgZGF0YT86IFQ7XG4gIGVycm9yPzoge1xuICAgIGNvZGU6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGVMaW1pdEluZm8ge1xuICBsaW1pdDogbnVtYmVyO1xuICByZW1haW5pbmc6IG51bWJlcjtcbiAgcmVzZXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29kZTogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHB1YmxpYyBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiQXBpRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRpb25FcnJvciBleHRlbmRzIEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nID0gXCJOb3QgYXV0aGVudGljYXRlZC4gUnVuICdzZW5kbHkgbG9naW4nIGZpcnN0LlwiLFxuICApIHtcbiAgICBzdXBlcihcImF1dGhlbnRpY2F0aW9uX2Vycm9yXCIsIG1lc3NhZ2UsIDQwMSk7XG4gICAgdGhpcy5uYW1lID0gXCJBdXRoZW50aWNhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdEVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmV0cnlBZnRlcjogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IFwiUmF0ZSBsaW1pdCBleGNlZWRlZFwiLFxuICApIHtcbiAgICBzdXBlcihcInJhdGVfbGltaXRfZXhjZWVkZWRcIiwgbWVzc2FnZSwgNDI5KTtcbiAgICB0aGlzLm5hbWUgPSBcIlJhdGVMaW1pdEVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluc3VmZmljaWVudENyZWRpdHNFcnJvciBleHRlbmRzIEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gXCJJbnN1ZmZpY2llbnQgY3JlZGl0c1wiKSB7XG4gICAgc3VwZXIoXCJpbnN1ZmZpY2llbnRfY3JlZGl0c1wiLCBtZXNzYWdlLCA0MDIpO1xuICAgIHRoaXMubmFtZSA9IFwiSW5zdWZmaWNpZW50Q3JlZGl0c0Vycm9yXCI7XG4gIH1cbn1cblxuY2xhc3MgQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByYXRlTGltaXRJbmZvPzogUmF0ZUxpbWl0SW5mbztcblxuICBwcml2YXRlIGdldEJhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q29uZmlnVmFsdWUoXCJiYXNlVXJsXCIpIHx8IFwiaHR0cHM6Ly9zZW5kbHkubGl2ZVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKHJlcXVpcmVBdXRoOiBib29sZWFuID0gdHJ1ZSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBcIlVzZXItQWdlbnRcIjogYEBzZW5kbHkvY2xpLyR7dmVyc2lvbn1gLFxuICAgIH07XG5cbiAgICBpZiAocmVxdWlyZUF1dGgpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKCk7XG4gICAgICB9XG4gICAgICBoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgYXN5bmMgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgYm9keT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgICAgIHJlcXVpcmVBdXRoPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHsgYm9keSwgcXVlcnksIHJlcXVpcmVBdXRoID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBtYXhSZXRyaWVzID0gZ2V0RWZmZWN0aXZlVmFsdWUoXCJtYXhSZXRyaWVzXCIpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBnZXRFZmZlY3RpdmVWYWx1ZShcInRpbWVvdXRcIik7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAke3RoaXMuZ2V0QmFzZVVybCgpfSR7cGF0aH1gKTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHF1ZXJ5KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHJlcXVpcmVBdXRoKSxcbiAgICAgICAgICBib2R5OiBib2R5ID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHJhdGUgbGltaXQgaW5mb1xuICAgICAgICB0aGlzLnVwZGF0ZVJhdGVMaW1pdEluZm8ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUGFyc2UgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZS5zdGF0dXMsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuXG4gICAgICAgIC8vIERvbid0IHJldHJ5IG5vbi1yZXRyeWFibGUgZXJyb3JzICg0eHggY2xpZW50IGVycm9ycylcbiAgICAgICAgaWYgKCFpc1JldHJ5YWJsZUVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgcmV0cnkgb24gbGFzdCBhdHRlbXB0XG4gICAgICAgIGlmIChhdHRlbXB0ID09PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmOiAxcywgMnMsIDRzLCBldGMuXG4gICAgICAgIGNvbnN0IGJhY2tvZmZNcyA9IE1hdGgubWluKDEwMDAgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSwgMTAwMDApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmTXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3VsZCBuZXZlciByZWFjaCBoZXJlLCBidXQgVHlwZVNjcmlwdCBuZWVkcyB0aGlzXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcihcIlJlcXVlc3QgZmFpbGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSYXRlTGltaXRJbmZvKGhlYWRlcnM6IEhlYWRlcnMpOiB2b2lkIHtcbiAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KFwiWC1SYXRlTGltaXQtTGltaXRcIik7XG4gICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoXCJYLVJhdGVMaW1pdC1SZW1haW5pbmdcIik7XG4gICAgY29uc3QgcmVzZXQgPSBoZWFkZXJzLmdldChcIlgtUmF0ZUxpbWl0LVJlc2V0XCIpO1xuXG4gICAgaWYgKGxpbWl0ICYmIHJlbWFpbmluZyAmJiByZXNldCkge1xuICAgICAgdGhpcy5yYXRlTGltaXRJbmZvID0ge1xuICAgICAgICBsaW1pdDogcGFyc2VJbnQobGltaXQsIDEwKSxcbiAgICAgICAgcmVtYWluaW5nOiBwYXJzZUludChyZW1haW5pbmcsIDEwKSxcbiAgICAgICAgcmVzZXQ6IHBhcnNlSW50KHJlc2V0LCAxMCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3Ioc3RhdHVzQ29kZTogbnVtYmVyLCBkYXRhOiBhbnkpOiBuZXZlciB7XG4gICAgY29uc3QgZXJyb3IgPSBkYXRhPy5lcnJvciB8fCBcInVua25vd25fZXJyb3JcIjtcbiAgICBjb25zdCBtZXNzYWdlID0gZGF0YT8ubWVzc2FnZSB8fCBgSFRUUCAke3N0YXR1c0NvZGV9YDtcbiAgICBjb25zdCBkZXRhaWxzID0gZGF0YT8uZGV0YWlscztcblxuICAgIHN3aXRjaCAoc3RhdHVzQ29kZSkge1xuICAgICAgY2FzZSA0MDE6XG4gICAgICBjYXNlIDQwMzpcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgICBjYXNlIDQwMjpcbiAgICAgICAgdGhyb3cgbmV3IEluc3VmZmljaWVudENyZWRpdHNFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgNDI5OlxuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gZGF0YT8ucmV0cnlBZnRlciB8fCA2MDtcbiAgICAgICAgdGhyb3cgbmV3IFJhdGVMaW1pdEVycm9yKHJldHJ5QWZ0ZXIsIG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKGVycm9yLCBtZXNzYWdlLCBzdGF0dXNDb2RlLCBkZXRhaWxzKTtcbiAgICB9XG4gIH1cblxuICBnZXRSYXRlTGltaXRJbmZvKCk6IFJhdGVMaW1pdEluZm8gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJhdGVMaW1pdEluZm87XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSBtZXRob2RzXG4gIGFzeW5jIGdldDxUPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkPixcbiAgICByZXF1aXJlQXV0aDogYm9vbGVhbiA9IHRydWUsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oXCJHRVRcIiwgcGF0aCwgeyBxdWVyeSwgcmVxdWlyZUF1dGggfSk7XG4gIH1cblxuICBhc3luYyBwb3N0PFQ+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcmVxdWlyZUF1dGg6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KFwiUE9TVFwiLCBwYXRoLCB7IGJvZHksIHJlcXVpcmVBdXRoIH0pO1xuICB9XG5cbiAgYXN5bmMgcGF0Y2g8VD4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByZXF1aXJlQXV0aDogYm9vbGVhbiA9IHRydWUsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oXCJQQVRDSFwiLCBwYXRoLCB7IGJvZHksIHJlcXVpcmVBdXRoIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlPFQ+KHBhdGg6IHN0cmluZywgcmVxdWlyZUF1dGg6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihcIkRFTEVURVwiLCBwYXRoLCB7IHJlcXVpcmVBdXRoIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhcGlDbGllbnQgPSBuZXcgQXBpQ2xpZW50KCk7XG4iXX0=
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlFLGlDQUFpQztBQUNqQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUF3QixDQUFDO0FBRXpFOztHQUVHO0FBQ0gsU0FBUyxLQUFLLENBQUMsRUFBVTtJQUN2QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLGlCQUFpQjtJQUNqQixJQUFJLEtBQUssWUFBWSxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxvQ0FBb0M7SUFDcEMsSUFBSSxLQUFLLFlBQVksUUFBUSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBaUJELE1BQU0sT0FBTyxRQUFTLFNBQVEsS0FBSztJQUV4QjtJQUVBO0lBQ0E7SUFKVCxZQUNTLElBQVksRUFDbkIsT0FBZSxFQUNSLFVBQWtCLEVBQ2xC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LENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO2dCQUVELE9BQU8sSUFBUyxDQUFDO1lBQ25CLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLFNBQVMsR0FBRyxLQUFjLENBQUM7Z0JBRTNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3QixNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDO2dCQUVELElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUMzQixNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDO2dCQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxJQUFJLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBUEkgQ2xpZW50IGZvciBTZW5kbHkgQ0xJXG4gKiBIYW5kbGVzIGFsbCBIVFRQIHJlcXVlc3RzIHRvIHRoZSBTZW5kbHkgQVBJXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZ2V0QXV0aFRva2VuLCBnZXRDb25maWdWYWx1ZSwgZ2V0RWZmZWN0aXZlVmFsdWUgfSBmcm9tIFwiLi9jb25maWcuanNcIjtcblxuLy8gUmVhZCB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgeyB2ZXJzaW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpIGFzIHsgdmVyc2lvbjogc3RyaW5nIH07XG5cbi8qKlxuICogU2xlZXAgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGVycm9yIGlzIHJldHJ5YWJsZSAobmV0d29yayBlcnJvcnMgb3IgNXh4IHNlcnZlciBlcnJvcnMpXG4gKi9cbmZ1bmN0aW9uIGlzUmV0cnlhYmxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gTmV0d29yayBlcnJvcnNcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJmZXRjaFwiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFNlcnZlciBlcnJvcnMgKDV4eCkgYXJlIHJldHJ5YWJsZVxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcGlFcnJvciAmJiBlcnJvci5zdGF0dXNDb2RlID49IDUwMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlSZXNwb25zZTxUPiB7XG4gIGRhdGE/OiBUO1xuICBlcnJvcj86IHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYXRlTGltaXRJbmZvIHtcbiAgbGltaXQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIHJlc2V0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvZGU6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHN0YXR1c0NvZGU6IG51bWJlcixcbiAgICBwdWJsaWMgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkFwaUVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uRXJyb3IgZXh0ZW5kcyBBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IFwiTm90IGF1dGhlbnRpY2F0ZWQuIFJ1biAnc2VuZGx5IGxvZ2luJyBmaXJzdC5cIixcbiAgKSB7XG4gICAgc3VwZXIoXCJhdXRoZW50aWNhdGlvbl9lcnJvclwiLCBtZXNzYWdlLCA0MDEpO1xuICAgIHRoaXMubmFtZSA9IFwiQXV0aGVudGljYXRpb25FcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYXRlTGltaXRFcnJvciBleHRlbmRzIEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJldHJ5QWZ0ZXI6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcgPSBcIlJhdGUgbGltaXQgZXhjZWVkZWRcIixcbiAgKSB7XG4gICAgc3VwZXIoXCJyYXRlX2xpbWl0X2V4Y2VlZGVkXCIsIG1lc3NhZ2UsIDQyOSk7XG4gICAgdGhpcy5uYW1lID0gXCJSYXRlTGltaXRFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnN1ZmZpY2llbnRDcmVkaXRzRXJyb3IgZXh0ZW5kcyBBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IFwiSW5zdWZmaWNpZW50IGNyZWRpdHNcIikge1xuICAgIHN1cGVyKFwiaW5zdWZmaWNpZW50X2NyZWRpdHNcIiwgbWVzc2FnZSwgNDAyKTtcbiAgICB0aGlzLm5hbWUgPSBcIkluc3VmZmljaWVudENyZWRpdHNFcnJvclwiO1xuICB9XG59XG5cbmNsYXNzIEFwaUNsaWVudCB7XG4gIHByaXZhdGUgcmF0ZUxpbWl0SW5mbz86IFJhdGVMaW1pdEluZm87XG5cbiAgcHJpdmF0ZSBnZXRCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldENvbmZpZ1ZhbHVlKFwiYmFzZVVybFwiKSB8fCBcImh0dHBzOi8vc2VuZGx5LmxpdmVcIjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SGVhZGVycyhyZXF1aXJlQXV0aDogYm9vbGVhbiA9IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgXCJVc2VyLUFnZW50XCI6IGBAc2VuZGx5L2NsaS8ke3ZlcnNpb259YCxcbiAgICB9O1xuXG4gICAgaWYgKHJlcXVpcmVBdXRoKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGdldEF1dGhUb2tlbigpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcigpO1xuICAgICAgfVxuICAgICAgaGVhZGVyc1tcIkF1dGhvcml6YXRpb25cIl0gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZD47XG4gICAgICByZXF1aXJlQXV0aD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IGJvZHksIHF1ZXJ5LCByZXF1aXJlQXV0aCA9IHRydWUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IGdldEVmZmVjdGl2ZVZhbHVlKFwibWF4UmV0cmllc1wiKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gZ2V0RWZmZWN0aXZlVmFsdWUoXCJ0aW1lb3V0XCIpO1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChgJHt0aGlzLmdldEJhc2VVcmwoKX0ke3BhdGh9YCk7XG4gICAgaWYgKHF1ZXJ5KSB7XG4gICAgICBPYmplY3QuZW50cmllcyhxdWVyeSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXF1aXJlQXV0aCksXG4gICAgICAgICAgYm9keTogYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSByYXRlIGxpbWl0IGluZm9cbiAgICAgICAgdGhpcy51cGRhdGVSYXRlTGltaXRJbmZvKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgICAgIC8vIFBhcnNlIHJlc3BvbnNlXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhIGFzIFQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcblxuICAgICAgICAvLyBEb24ndCByZXRyeSBub24tcmV0cnlhYmxlIGVycm9ycyAoNHh4IGNsaWVudCBlcnJvcnMpXG4gICAgICAgIGlmICghaXNSZXRyeWFibGVFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IHJldHJ5IG9uIGxhc3QgYXR0ZW1wdFxuICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gbWF4UmV0cmllcykge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZjogMXMsIDJzLCA0cywgZXRjLlxuICAgICAgICBjb25zdCBiYWNrb2ZmTXMgPSBNYXRoLm1pbigxMDAwICogTWF0aC5wb3coMiwgYXR0ZW1wdCksIDEwMDAwKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZk1zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSwgYnV0IFR5cGVTY3JpcHQgbmVlZHMgdGhpc1xuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoXCJSZXF1ZXN0IGZhaWxlZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUmF0ZUxpbWl0SW5mbyhoZWFkZXJzOiBIZWFkZXJzKTogdm9pZCB7XG4gICAgY29uc3QgbGltaXQgPSBoZWFkZXJzLmdldChcIlgtUmF0ZUxpbWl0LUxpbWl0XCIpO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGhlYWRlcnMuZ2V0KFwiWC1SYXRlTGltaXQtUmVtYWluaW5nXCIpO1xuICAgIGNvbnN0IHJlc2V0ID0gaGVhZGVycy5nZXQoXCJYLVJhdGVMaW1pdC1SZXNldFwiKTtcblxuICAgIGlmIChsaW1pdCAmJiByZW1haW5pbmcgJiYgcmVzZXQpIHtcbiAgICAgIHRoaXMucmF0ZUxpbWl0SW5mbyA9IHtcbiAgICAgICAgbGltaXQ6IHBhcnNlSW50KGxpbWl0LCAxMCksXG4gICAgICAgIHJlbWFpbmluZzogcGFyc2VJbnQocmVtYWluaW5nLCAxMCksXG4gICAgICAgIHJlc2V0OiBwYXJzZUludChyZXNldCwgMTApLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKHN0YXR1c0NvZGU6IG51bWJlciwgZGF0YTogYW55KTogbmV2ZXIge1xuICAgIGNvbnN0IGVycm9yID0gZGF0YT8uZXJyb3IgfHwgXCJ1bmtub3duX2Vycm9yXCI7XG4gICAgY29uc3QgbWVzc2FnZSA9IGRhdGE/Lm1lc3NhZ2UgfHwgYEhUVFAgJHtzdGF0dXNDb2RlfWA7XG4gICAgY29uc3QgZGV0YWlscyA9IGRhdGE/LmRldGFpbHM7XG5cbiAgICBzd2l0Y2ggKHN0YXR1c0NvZGUpIHtcbiAgICAgIGNhc2UgNDAxOlxuICAgICAgY2FzZSA0MDM6XG4gICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSA0MDI6XG4gICAgICAgIHRocm93IG5ldyBJbnN1ZmZpY2llbnRDcmVkaXRzRXJyb3IobWVzc2FnZSk7XG4gICAgICBjYXNlIDQyOTpcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGRhdGE/LnJldHJ5QWZ0ZXIgfHwgNjA7XG4gICAgICAgIHRocm93IG5ldyBSYXRlTGltaXRFcnJvcihyZXRyeUFmdGVyLCBtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBBcGlFcnJvcihlcnJvciwgbWVzc2FnZSwgc3RhdHVzQ29kZSwgZGV0YWlscyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmF0ZUxpbWl0SW5mbygpOiBSYXRlTGltaXRJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yYXRlTGltaXRJbmZvO1xuICB9XG5cbiAgLy8gQ29udmVuaWVuY2UgbWV0aG9kc1xuICBhc3luYyBnZXQ8VD4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZD4sXG4gICAgcmVxdWlyZUF1dGg6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KFwiR0VUXCIsIHBhdGgsIHsgcXVlcnksIHJlcXVpcmVBdXRoIH0pO1xuICB9XG5cbiAgYXN5bmMgcG9zdDxUPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHJlcXVpcmVBdXRoOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihcIlBPU1RcIiwgcGF0aCwgeyBib2R5LCByZXF1aXJlQXV0aCB9KTtcbiAgfVxuXG4gIGFzeW5jIHBhdGNoPFQ+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcmVxdWlyZUF1dGg6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KFwiUEFUQ0hcIiwgcGF0aCwgeyBib2R5LCByZXF1aXJlQXV0aCB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZTxUPihwYXRoOiBzdHJpbmcsIHJlcXVpcmVBdXRoOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oXCJERUxFVEVcIiwgcGF0aCwgeyByZXF1aXJlQXV0aCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgYSBmaWxlIHVzaW5nIG11bHRpcGFydC9mb3JtLWRhdGFcbiAgICogVXNlZCBmb3IgYmF0Y2ggQ1NWIHVwbG9hZHMgdG8gU3VwYWJhc2Ugc3RvcmFnZVxuICAgKi9cbiAgYXN5bmMgdXBsb2FkRmlsZTxUPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZmlsZToge1xuICAgICAgYnVmZmVyOiBCdWZmZXI7XG4gICAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgICAgbWltZXR5cGU/OiBzdHJpbmc7XG4gICAgfSxcbiAgICByZXF1aXJlQXV0aDogYm9vbGVhbiA9IHRydWUsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IG1heFJldHJpZXMgPSBnZXRFZmZlY3RpdmVWYWx1ZShcIm1heFJldHJpZXNcIik7XG4gICAgY29uc3QgdGltZW91dCA9IGdldEVmZmVjdGl2ZVZhbHVlKFwidGltZW91dFwiKTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhc2VVcmwoKX0ke3BhdGh9YDtcblxuICAgIC8vIEJ1aWxkIG11bHRpcGFydCBmb3JtIGRhdGEgbWFudWFsbHkgKE5vZGUuanMgY29tcGF0aWJsZSlcbiAgICBjb25zdCBib3VuZGFyeSA9IGAtLS0tRm9ybUJvdW5kYXJ5JHtEYXRlLm5vdygpfSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpfWA7XG4gICAgY29uc3QgbWltZXR5cGUgPSBmaWxlLm1pbWV0eXBlIHx8IFwidGV4dC9jc3ZcIjtcblxuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5mcm9tKFxuICAgICAgYC0tJHtib3VuZGFyeX1cXHJcXG5gICtcbiAgICAgICAgYENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpbGVcIjsgZmlsZW5hbWU9XCIke2ZpbGUuZmlsZW5hbWV9XCJcXHJcXG5gICtcbiAgICAgICAgYENvbnRlbnQtVHlwZTogJHttaW1ldHlwZX1cXHJcXG5cXHJcXG5gLFxuICAgICk7XG4gICAgY29uc3QgZm9vdGVyID0gQnVmZmVyLmZyb20oYFxcclxcbi0tJHtib3VuZGFyeX0tLVxcclxcbmApO1xuICAgIGNvbnN0IGJvZHkgPSBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIGZpbGUuYnVmZmVyLCBmb290ZXJdKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtib3VuZGFyeX1gLFxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIFwiVXNlci1BZ2VudFwiOiBgQHNlbmRseS9jbGkvJHt2ZXJzaW9ufWAsXG4gICAgfTtcblxuICAgIGlmIChyZXF1aXJlQXV0aCkge1xuICAgICAgY29uc3QgdG9rZW4gPSBnZXRBdXRoVG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgfVxuXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUmF0ZUxpbWl0SW5mbyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZS5zdGF0dXMsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuXG4gICAgICAgIGlmICghaXNSZXRyeWFibGVFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRlbXB0ID09PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYWNrb2ZmTXMgPSBNYXRoLm1pbigxMDAwICogTWF0aC5wb3coMiwgYXR0ZW1wdCksIDEwMDAwKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZk1zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKFwiVXBsb2FkIGZhaWxlZFwiKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBpQ2xpZW50ID0gbmV3IEFwaUNsaWVudCgpO1xuIl19