@sendly/cli 3.2.0 → 3.3.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
@@ -91,11 +91,23 @@ sendly sms get msg_abc123
91
91
  #### Send Batch Messages
92
92
 
93
93
  ```bash
94
- # From a CSV file
95
- sendly sms batch --file recipients.csv --text "Hello {name}!"
94
+ # From a JSON file
95
+ sendly sms batch --file messages.json
96
+
97
+ # From a CSV file (phone-only with shared text)
98
+ sendly sms batch --file phones.csv --text "Your order is ready!"
96
99
 
97
100
  # Multiple recipients inline
98
101
  sendly sms batch --to "+15551234567,+15559876543" --text "Hello everyone!"
102
+
103
+ # Preview before sending (dry run) - validates without sending
104
+ sendly sms batch --file messages.json --dry-run
105
+
106
+ # Dry run output includes:
107
+ # - Per-country breakdown with credit costs
108
+ # - Blocked messages and reasons
109
+ # - Your messaging access (domestic/international)
110
+ # - Credit balance check
99
111
  ```
100
112
 
101
113
  #### Schedule a Message
@@ -7,6 +7,7 @@ export default class SmsBatch extends AuthenticatedCommand {
7
7
  to: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
8
  text: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
9
  from: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ "dry-run": import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
11
  json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
12
  quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
13
  };
@@ -8,8 +8,10 @@ export default class SmsBatch extends AuthenticatedCommand {
8
8
  static examples = [
9
9
  "<%= config.bin %> sms batch --file recipients.json",
10
10
  '<%= config.bin %> sms batch --to +15551234567,+15559876543 --text "Hello everyone!"',
11
+ '<%= config.bin %> sms batch --file phones.csv --text "Your order is ready!"',
11
12
  '<%= config.bin %> sms batch --file recipients.csv --from "Sendly"',
12
13
  "<%= config.bin %> sms batch --file messages.json --json",
14
+ '<%= config.bin %> sms batch --file phones.csv --text "Hi" --dry-run',
13
15
  ];
14
16
  static flags = {
15
17
  ...AuthenticatedCommand.baseFlags,
@@ -25,12 +27,17 @@ export default class SmsBatch extends AuthenticatedCommand {
25
27
  }),
26
28
  text: Flags.string({
27
29
  char: "m",
28
- description: "Message text (used with --to flag)",
30
+ description: "Message text (works with --to or --file for phone-only lists)",
29
31
  }),
30
32
  from: Flags.string({
31
33
  char: "f",
32
34
  description: "Sender ID or phone number for all messages",
33
35
  }),
36
+ "dry-run": Flags.boolean({
37
+ char: "d",
38
+ description: "Preview batch without sending (validates access, shows cost breakdown)",
39
+ default: false,
40
+ }),
34
41
  };
35
42
  async run() {
36
43
  const { flags } = await this.parse(SmsBatch);
@@ -50,6 +57,13 @@ export default class SmsBatch extends AuthenticatedCommand {
50
57
  error("Either --file or --to is required");
51
58
  this.exit(1);
52
59
  }
60
+ // Apply shared text from --text flag to messages without text
61
+ if (flags.text) {
62
+ messages = messages.map((msg) => ({
63
+ to: msg.to,
64
+ text: msg.text || flags.text,
65
+ }));
66
+ }
53
67
  // Validate messages
54
68
  if (messages.length === 0) {
55
69
  error("No messages to send");
@@ -70,10 +84,81 @@ export default class SmsBatch extends AuthenticatedCommand {
70
84
  this.exit(1);
71
85
  }
72
86
  if (!msg.text?.trim()) {
73
- error(`Empty message text for ${msg.to}`);
87
+ error(`Empty message text for ${msg.to}`, {
88
+ hint: "Use --text to provide a shared message for all recipients",
89
+ });
74
90
  this.exit(1);
75
91
  }
76
92
  }
93
+ // Handle dry-run mode
94
+ if (flags["dry-run"]) {
95
+ const spin = spinner("Analyzing batch...").start();
96
+ try {
97
+ const preview = await apiClient.post("/api/v1/messages/batch/preview", { messages, text: flags.text });
98
+ spin.stop();
99
+ if (isJsonMode()) {
100
+ json(preview);
101
+ return;
102
+ }
103
+ // Show comprehensive preview
104
+ console.log(colors.bold("\nšŸ“Š Batch Preview (Dry Run)\n"));
105
+ // Summary table
106
+ console.log(colors.dim("─".repeat(50)));
107
+ console.log(`Total messages: ${preview.total}`);
108
+ console.log(`Sendable: ${colors.success(String(preview.sendable))}`);
109
+ console.log(`Blocked: ${preview.blocked > 0 ? colors.error(String(preview.blocked)) : "0"}`);
110
+ console.log(`Duplicates removed: ${preview.duplicates}`);
111
+ console.log(colors.dim("─".repeat(50)));
112
+ // Credits
113
+ console.log(`\nCredits needed: ${preview.creditsNeeded}`);
114
+ console.log(`Your balance: ${preview.creditBalance}`);
115
+ if (!preview.hasSufficientCredits) {
116
+ console.log(colors.error(`āš ļø Insufficient credits! Need ${preview.creditsNeeded - preview.creditBalance} more.`));
117
+ }
118
+ // Access info
119
+ console.log(`\nAPI Key type: ${preview.keyType.toUpperCase()}`);
120
+ console.log(`Write access: ${preview.hasWriteScope ? "āœ“" : "āœ—"}`);
121
+ console.log(`Domestic (US/CA): ${preview.messagingProfile.canSendDomestic ? "āœ“" : "āœ—"}`);
122
+ console.log(`International: ${preview.messagingProfile.canSendInternational ? "āœ“" : "āœ—"}`);
123
+ // Country breakdown
124
+ const countries = Object.entries(preview.byCountry);
125
+ if (countries.length > 0) {
126
+ console.log(colors.bold("\nšŸ“ By Country:\n"));
127
+ for (const [country, data] of countries) {
128
+ const status = data.allowed
129
+ ? colors.success("āœ“")
130
+ : colors.error("āœ—");
131
+ console.log(` ${status} ${country}: ${data.count} msgs, ${data.credits} credits (${data.tier})`);
132
+ if (!data.allowed && data.blockedReason) {
133
+ console.log(colors.dim(` └─ ${data.blockedReason}`));
134
+ }
135
+ }
136
+ }
137
+ // Warnings
138
+ if (preview.warnings.length > 0) {
139
+ console.log(colors.warning("\nāš ļø Warnings:"));
140
+ for (const w of preview.warnings) {
141
+ console.log(` • ${w}`);
142
+ }
143
+ }
144
+ // Blocked messages (first 5)
145
+ if (preview.blockedMessages.length > 0) {
146
+ console.log(colors.error(`\nāŒ Blocked Messages (${preview.blockedMessages.length} total):`));
147
+ for (const b of preview.blockedMessages.slice(0, 5)) {
148
+ console.log(` ${b.to}: ${b.reason}`);
149
+ }
150
+ if (preview.blockedMessages.length > 5) {
151
+ console.log(colors.dim(` ... and ${preview.blockedMessages.length - 5} more`));
152
+ }
153
+ }
154
+ console.log("\n" + colors.dim("No messages were sent. Remove --dry-run to send."));
155
+ return;
156
+ }
157
+ catch (err) {
158
+ spin.stop();
159
+ throw err;
160
+ }
161
+ }
77
162
  const spin = spinner(`Sending ${messages.length} messages...`);
78
163
  spin.start();
79
164
  try {
@@ -86,14 +171,47 @@ export default class SmsBatch extends AuthenticatedCommand {
86
171
  json(response);
87
172
  return;
88
173
  }
89
- success("Batch sent", {
90
- "Batch ID": response.batchId,
91
- Total: response.total,
92
- Queued: colors.success(String(response.queued ?? 0)),
93
- Failed: response.failed > 0 ? colors.error(String(response.failed)) : "0",
94
- "Credits Used": response.creditsUsed,
95
- Status: response.status,
96
- });
174
+ // Determine success level
175
+ const allSucceeded = response.failed === 0;
176
+ const allFailed = response.sent === 0 && response.failed > 0;
177
+ const partialSuccess = response.sent > 0 && response.failed > 0;
178
+ if (allSucceeded) {
179
+ success("Batch sent successfully", {
180
+ "Batch ID": response.batchId,
181
+ Total: response.total,
182
+ Sent: colors.success(String(response.sent)),
183
+ "Credits Used": response.creditsUsed,
184
+ });
185
+ }
186
+ else if (allFailed) {
187
+ error("Batch failed", {
188
+ hint: `All ${response.failed} messages failed to send`,
189
+ });
190
+ console.log(colors.dim(` Batch ID: ${response.batchId}`));
191
+ console.log(colors.dim(` Credits Refunded: ${response.creditsRefunded}`));
192
+ }
193
+ else if (partialSuccess) {
194
+ console.log(colors.warning("\nāš ļø Batch completed with errors\n"));
195
+ console.log(` Batch ID: ${response.batchId}`);
196
+ console.log(` Total: ${response.total}`);
197
+ console.log(` Sent: ${colors.success(String(response.sent))}`);
198
+ console.log(` Failed: ${colors.error(String(response.failed))}`);
199
+ console.log(` Credits Used: ${response.creditsUsed}`);
200
+ console.log(` Credits Refunded: ${response.creditsRefunded}`);
201
+ // Show failed messages if available
202
+ if (response.messages) {
203
+ const failedMsgs = response.messages.filter((m) => m.status === "failed");
204
+ if (failedMsgs.length > 0 && failedMsgs.length <= 5) {
205
+ console.log(colors.dim("\n Failed messages:"));
206
+ for (const msg of failedMsgs) {
207
+ console.log(colors.dim(` ${msg.to}: ${msg.error || "Unknown error"}`));
208
+ }
209
+ }
210
+ else if (failedMsgs.length > 5) {
211
+ console.log(colors.dim(`\n ${failedMsgs.length} messages failed. Use --json for details.`));
212
+ }
213
+ }
214
+ }
97
215
  }
98
216
  catch (err) {
99
217
  spin.stop();
@@ -124,15 +242,35 @@ export default class SmsBatch extends AuthenticatedCommand {
124
242
  if (filePath.endsWith(".csv")) {
125
243
  const lines = content.trim().split("\n");
126
244
  const messages = [];
127
- // Skip header if present
128
- const startIndex = lines[0].toLowerCase().includes("to") ? 1 : 0;
245
+ // Improved header detection - check for common header patterns
246
+ const headerPatterns = [
247
+ "to",
248
+ "phone",
249
+ "number",
250
+ "recipient",
251
+ "mobile",
252
+ "cell",
253
+ ];
254
+ const firstLine = lines[0].toLowerCase();
255
+ const hasHeader = headerPatterns.some((p) => firstLine.includes(p));
256
+ const startIndex = hasHeader ? 1 : 0;
129
257
  for (let i = startIndex; i < lines.length; i++) {
130
- const parts = lines[i].split(",");
131
- if (parts.length >= 2) {
132
- messages.push({
133
- to: parts[0].trim().replace(/"/g, ""),
134
- text: parts.slice(1).join(",").trim().replace(/"/g, ""),
135
- });
258
+ const line = lines[i].trim();
259
+ if (!line)
260
+ continue; // Skip empty lines
261
+ const parts = line.split(",");
262
+ if (parts.length >= 1) {
263
+ const phone = parts[0].trim().replace(/"/g, "");
264
+ // Only add if phone looks valid (starts with + or digit)
265
+ if (phone && (phone.startsWith("+") || /^\d/.test(phone))) {
266
+ messages.push({
267
+ to: phone.startsWith("+") ? phone : `+${phone}`,
268
+ text: parts.length >= 2
269
+ ? parts.slice(1).join(",").trim().replace(/"/g, "") ||
270
+ undefined
271
+ : undefined,
272
+ });
273
+ }
136
274
  }
137
275
  }
138
276
  return messages;
@@ -160,4 +298,4 @@ export default class SmsBatch extends AuthenticatedCommand {
160
298
  return phones.map((phone) => ({ to: phone, text }));
161
299
  }
162
300
  }
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc21zL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEVBQ0osVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFnQjdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUyxTQUFRLG9CQUFvQjtJQUN4RCxNQUFNLENBQUMsV0FBVyxHQUFHLHlCQUF5QixDQUFDO0lBRS9DLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsb0RBQW9EO1FBQ3BELHFGQUFxRjtRQUNyRixtRUFBbUU7UUFDbkUseURBQXlEO0tBQzFELENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLGlEQUFpRDtZQUM5RCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbEIsQ0FBQztRQUNGLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2YsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsd0RBQXdEO1lBQ3JFLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztTQUNwQixDQUFDO1FBQ0YsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7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QUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIHNwaW5uZXIsXG4gIGNvbG9ycyxcbiAganNvbixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEJhdGNoTWVzc2FnZSB7XG4gIHRvOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEJhdGNoUmVzcG9uc2Uge1xuICBiYXRjaElkOiBzdHJpbmc7XG4gIHRvdGFsOiBudW1iZXI7XG4gIHF1ZXVlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY3JlZGl0c1VzZWQ6IG51bWJlcjtcbiAgc3RhdHVzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNtc0JhdGNoIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIlNlbmQgYmF0Y2ggU01TIG1lc3NhZ2VzXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSByZWNpcGllbnRzLmpzb25cIixcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tdG8gKzE1NTUxMjM0NTY3LCsxNTU1OTg3NjU0MyAtLXRleHQgXCJIZWxsbyBldmVyeW9uZSFcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcmVjaXBpZW50cy5jc3YgLS1mcm9tIFwiU2VuZGx5XCInLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSBtZXNzYWdlcy5qc29uIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgZmlsZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwiRlwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSlNPTiBmaWxlIHdpdGggbWVzc2FnZXMgYXJyYXkgW3t0bywgdGV4dH0sIC4uLl1cIixcbiAgICAgIGV4Y2x1c2l2ZTogW1widG9cIl0sXG4gICAgfSksXG4gICAgdG86IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbW1hLXNlcGFyYXRlZCByZWNpcGllbnQgcGhvbmUgbnVtYmVycyAoRS4xNjQgZm9ybWF0KVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJmaWxlXCJdLFxuICAgIH0pLFxuICAgIHRleHQ6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIm1cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk1lc3NhZ2UgdGV4dCAodXNlZCB3aXRoIC0tdG8gZmxhZylcIixcbiAgICB9KSxcbiAgICBmcm9tOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJmXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTZW5kZXIgSUQgb3IgcGhvbmUgbnVtYmVyIGZvciBhbGwgbWVzc2FnZXNcIixcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShTbXNCYXRjaCk7XG5cbiAgICBsZXQgbWVzc2FnZXM6IEJhdGNoTWVzc2FnZVtdID0gW107XG5cbiAgICAvLyBQYXJzZSBtZXNzYWdlcyBmcm9tIGZpbGUgb3IgZmxhZ3NcbiAgICBpZiAoZmxhZ3MuZmlsZSkge1xuICAgICAgbWVzc2FnZXMgPSB0aGlzLnBhcnNlTWVzc2FnZXNGcm9tRmlsZShmbGFncy5maWxlKTtcbiAgICB9IGVsc2UgaWYgKGZsYWdzLnRvKSB7XG4gICAgICBpZiAoIWZsYWdzLnRleHQpIHtcbiAgICAgICAgZXJyb3IoXCItLXRleHQgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyAtLXRvXCIpO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBtZXNzYWdlcyA9IHRoaXMucGFyc2VNZXNzYWdlc0Zyb21GbGFncyhmbGFncy50bywgZmxhZ3MudGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKFwiRWl0aGVyIC0tZmlsZSBvciAtLXRvIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1lc3NhZ2VzXG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3IoXCJObyBtZXNzYWdlcyB0byBzZW5kXCIpO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiAxMDAwKSB7XG4gICAgICBlcnJvcihcIkJhdGNoIHNpemUgY2Fubm90IGV4Y2VlZCAxMDAwIG1lc3NhZ2VzXCIsIHtcbiAgICAgICAgaGludDogXCJTcGxpdCB5b3VyIG1lc3NhZ2VzIGludG8gc21hbGxlciBiYXRjaGVzXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIG1lc3NhZ2VcbiAgICBmb3IgKGNvbnN0IG1zZyBvZiBtZXNzYWdlcykge1xuICAgICAgaWYgKCEvXlxcK1sxLTldXFxkezEsMTR9JC8udGVzdChtc2cudG8pKSB7XG4gICAgICAgIGVycm9yKGBJbnZhbGlkIHBob25lIG51bWJlcjogJHttc2cudG99YCwge1xuICAgICAgICAgIGhpbnQ6IFwiVXNlIEUuMTY0IGZvcm1hdDogKzE1NTUxMjM0NTY3XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBpZiAoIW1zZy50ZXh0Py50cmltKCkpIHtcbiAgICAgICAgZXJyb3IoYEVtcHR5IG1lc3NhZ2UgdGV4dCBmb3IgJHttc2cudG99YCk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzcGluID0gc3Bpbm5lcihgU2VuZGluZyAke21lc3NhZ2VzLmxlbmd0aH0gbWVzc2FnZXMuLi5gKTtcbiAgICBzcGluLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxCYXRjaFJlc3BvbnNlPihcbiAgICAgICAgXCIvYXBpL3YxL21lc3NhZ2VzL2JhdGNoXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgICAuLi4oZmxhZ3MuZnJvbSAmJiB7IGZyb206IGZsYWdzLmZyb20gfSksXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBzcGluLnN0b3AoKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdWNjZXNzKFwiQmF0Y2ggc2VudFwiLCB7XG4gICAgICAgIFwiQmF0Y2ggSURcIjogcmVzcG9uc2UuYmF0Y2hJZCxcbiAgICAgICAgVG90YWw6IHJlc3BvbnNlLnRvdGFsLFxuICAgICAgICBRdWV1ZWQ6IGNvbG9ycy5zdWNjZXNzKFN0cmluZyhyZXNwb25zZS5xdWV1ZWQgPz8gMCkpLFxuICAgICAgICBGYWlsZWQ6XG4gICAgICAgICAgcmVzcG9uc2UuZmFpbGVkID4gMCA/IGNvbG9ycy5lcnJvcihTdHJpbmcocmVzcG9uc2UuZmFpbGVkKSkgOiBcIjBcIixcbiAgICAgICAgXCJDcmVkaXRzIFVzZWRcIjogcmVzcG9uc2UuY3JlZGl0c1VzZWQsXG4gICAgICAgIFN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzcGluLnN0b3AoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTWVzc2FnZXNGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKTogQmF0Y2hNZXNzYWdlW10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgICAvLyBUcnkgSlNPTiBmaXJzdFxuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgdG86IGl0ZW0udG8sXG4gICAgICAgICAgICB0ZXh0OiBpdGVtLnRleHQsXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLm1lc3NhZ2VzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5tZXNzYWdlcykpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5tZXNzYWdlcztcbiAgICAgICAgfVxuICAgICAgICBlcnJvcihcIkludmFsaWQgSlNPTiBmb3JtYXRcIiwge1xuICAgICAgICAgIGhpbnQ6IFwiRXhwZWN0ZWQgYXJyYXkgb2Yge3RvLCB0ZXh0fSBvYmplY3RzIG9yIHttZXNzYWdlczogWy4uLl19XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyeSBDU1ZcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aChcIi5jc3ZcIikpIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnRyaW0oKS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IEJhdGNoTWVzc2FnZVtdID0gW107XG5cbiAgICAgICAgLy8gU2tpcCBoZWFkZXIgaWYgcHJlc2VudFxuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gbGluZXNbMF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcInRvXCIpID8gMSA6IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbGluZXNbaV0uc3BsaXQoXCIsXCIpO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgIHRvOiBwYXJ0c1swXS50cmltKCkucmVwbGFjZSgvXCIvZywgXCJcIiksXG4gICAgICAgICAgICAgIHRleHQ6IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIsXCIpLnRyaW0oKS5yZXBsYWNlKC9cIi9nLCBcIlwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKFwiVW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXRcIiwge1xuICAgICAgICBoaW50OiBcIlVzZSAuanNvbiBvciAuY3N2IGZpbGVcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKChlcnIgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIGVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgZXJyb3IoXCJJbnZhbGlkIEpTT04gaW4gZmlsZVwiLCB7IGhpbnQ6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VNZXNzYWdlc0Zyb21GbGFncyh0bzogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBCYXRjaE1lc3NhZ2VbXSB7XG4gICAgY29uc3QgcGhvbmVzID0gdG8uc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuICAgIHJldHVybiBwaG9uZXMubWFwKChwaG9uZSkgPT4gKHsgdG86IHBob25lLCB0ZXh0IH0pKTtcbiAgfVxufVxuIl19
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc21zL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEVBQ0osVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUE2RDdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUyxTQUFRLG9CQUFvQjtJQUN4RCxNQUFNLENBQUMsV0FBVyxHQUFHLHlCQUF5QixDQUFDO0lBRS9DLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsb0RBQW9EO1FBQ3BELHFGQUFxRjtRQUNyRiw2RUFBNkU7UUFDN0UsbUVBQW1FO1FBQ25FLHlEQUF5RDtRQUN6RCxxRUFBcUU7S0FDdEUsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsaURBQWlEO1lBQzlELFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQztTQUNsQixDQUFDO1FBQ0YsRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDZixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSx3REFBd0Q7WUFDckUsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1NBQ3BCLENBQUM7UUFDRixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0s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LENBQUM7WUFDbEIsQ0FBQztZQUVELEtBQUssQ0FBQyx5QkFBeUIsRUFBRTtnQkFDL0IsSUFBSSxFQUFFLHdCQUF3QjthQUMvQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFLLEdBQTZCLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyRCxLQUFLLENBQUMsbUJBQW1CLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxFQUFVLEVBQUUsSUFBWTtRQUNyRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIHNwaW5uZXIsXG4gIGNvbG9ycyxcbiAganNvbixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEJhdGNoTWVzc2FnZSB7XG4gIHRvOiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIC0gY2FuIGJlIHByb3ZpZGVkIHZpYSAtLXRleHQgZmxhZ1xufVxuXG5pbnRlcmZhY2UgQmF0Y2hSZXNwb25zZSB7XG4gIGJhdGNoSWQ6IHN0cmluZztcbiAgdG90YWw6IG51bWJlcjtcbiAgc2VudDogbnVtYmVyO1xuICBxdWV1ZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNyZWRpdHNVc2VkOiBudW1iZXI7XG4gIGNyZWRpdHNSZWZ1bmRlZDogbnVtYmVyO1xuICBzdGF0dXM6IHN0cmluZztcbiAgbWVzc2FnZXM/OiBBcnJheTx7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgQmF0Y2hQcmV2aWV3UmVzcG9uc2Uge1xuICB0b3RhbDogbnVtYmVyO1xuICBzZW5kYWJsZTogbnVtYmVyO1xuICBibG9ja2VkOiBudW1iZXI7XG4gIGR1cGxpY2F0ZXM6IG51bWJlcjtcbiAgY3JlZGl0c05lZWRlZDogbnVtYmVyO1xuICBjcmVkaXRCYWxhbmNlOiBudW1iZXI7XG4gIGhhc1N1ZmZpY2llbnRDcmVkaXRzOiBib29sZWFuO1xuICBrZXlUeXBlOiBcInRlc3RcIiB8IFwibGl2ZVwiO1xuICBrZXlTY29wZXM6IHN0cmluZ1tdO1xuICBoYXNXcml0ZVNjb3BlOiBib29sZWFuO1xuICBtZXNzYWdpbmdQcm9maWxlOiB7XG4gICAgaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgY2FuU2VuZERvbWVzdGljOiBib29sZWFuO1xuICAgIGNhblNlbmRJbnRlcm5hdGlvbmFsOiBib29sZWFuO1xuICAgIHZlcmlmaWNhdGlvblN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICB2ZXJpZmljYXRpb25UeXBlOiBzdHJpbmcgfCBudWxsO1xuICB9O1xuICBieUNvdW50cnk6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgY291bnQ6IG51bWJlcjtcbiAgICAgIGNyZWRpdHM6IG51bWJlcjtcbiAgICAgIHRpZXI6IHN0cmluZztcbiAgICAgIGFsbG93ZWQ6IGJvb2xlYW47XG4gICAgICBibG9ja2VkUmVhc29uPzogc3RyaW5nO1xuICAgIH1cbiAgPjtcbiAgYmxvY2tlZE1lc3NhZ2VzOiBBcnJheTx7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB0bzogc3RyaW5nO1xuICAgIHJlYXNvbjogc3RyaW5nO1xuICB9PjtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbXNCYXRjaCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJTZW5kIGJhdGNoIFNNUyBtZXNzYWdlc1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcmVjaXBpZW50cy5qc29uXCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLXRvICsxNTU1MTIzNDU2NywrMTU1NTk4NzY1NDMgLS10ZXh0IFwiSGVsbG8gZXZlcnlvbmUhXCInLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHBob25lcy5jc3YgLS10ZXh0IFwiWW91ciBvcmRlciBpcyByZWFkeSFcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcmVjaXBpZW50cy5jc3YgLS1mcm9tIFwiU2VuZGx5XCInLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSBtZXNzYWdlcy5qc29uIC0tanNvblwiLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHBob25lcy5jc3YgLS10ZXh0IFwiSGlcIiAtLWRyeS1ydW4nLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgZmlsZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwiRlwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSlNPTiBmaWxlIHdpdGggbWVzc2FnZXMgYXJyYXkgW3t0bywgdGV4dH0sIC4uLl1cIixcbiAgICAgIGV4Y2x1c2l2ZTogW1widG9cIl0sXG4gICAgfSksXG4gICAgdG86IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbW1hLXNlcGFyYXRlZCByZWNpcGllbnQgcGhvbmUgbnVtYmVycyAoRS4xNjQgZm9ybWF0KVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJmaWxlXCJdLFxuICAgIH0pLFxuICAgIHRleHQ6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIm1cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk1lc3NhZ2UgdGV4dCAod29ya3Mgd2l0aCAtLXRvIG9yIC0tZmlsZSBmb3IgcGhvbmUtb25seSBsaXN0cylcIixcbiAgICB9KSxcbiAgICBmcm9tOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJmXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTZW5kZXIgSUQgb3IgcGhvbmUgbnVtYmVyIGZvciBhbGwgbWVzc2FnZXNcIixcbiAgICB9KSxcbiAgICBcImRyeS1ydW5cIjogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBjaGFyOiBcImRcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByZXZpZXcgYmF0Y2ggd2l0aG91dCBzZW5kaW5nICh2YWxpZGF0ZXMgYWNjZXNzLCBzaG93cyBjb3N0IGJyZWFrZG93bilcIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFNtc0JhdGNoKTtcblxuICAgIGxldCBtZXNzYWdlczogQmF0Y2hNZXNzYWdlW10gPSBbXTtcblxuICAgIC8vIFBhcnNlIG1lc3NhZ2VzIGZyb20gZmlsZSBvciBmbGFnc1xuICAgIGlmIChmbGFncy5maWxlKSB7XG4gICAgICBtZXNzYWdlcyA9IHRoaXMucGFyc2VNZXNzYWdlc0Zyb21GaWxlKGZsYWdzLmZpbGUpO1xuICAgIH0gZWxzZSBpZiAoZmxhZ3MudG8pIHtcbiAgICAgIGlmICghZmxhZ3MudGV4dCkge1xuICAgICAgICBlcnJvcihcIi0tdGV4dCBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIC0tdG9cIik7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIG1lc3NhZ2VzID0gdGhpcy5wYXJzZU1lc3NhZ2VzRnJvbUZsYWdzKGZsYWdzLnRvLCBmbGFncy50ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoXCJFaXRoZXIgLS1maWxlIG9yIC0tdG8gaXMgcmVxdWlyZWRcIik7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgc2hhcmVkIHRleHQgZnJvbSAtLXRleHQgZmxhZyB0byBtZXNzYWdlcyB3aXRob3V0IHRleHRcbiAgICBpZiAoZmxhZ3MudGV4dCkge1xuICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlcy5tYXAoKG1zZykgPT4gKHtcbiAgICAgICAgdG86IG1zZy50byxcbiAgICAgICAgdGV4dDogbXNnLnRleHQgfHwgZmxhZ3MudGV4dCxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZXNzYWdlc1xuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVycm9yKFwiTm8gbWVzc2FnZXMgdG8gc2VuZFwiKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZXMubGVuZ3RoID4gMTAwMCkge1xuICAgICAgZXJyb3IoXCJCYXRjaCBzaXplIGNhbm5vdCBleGNlZWQgMTAwMCBtZXNzYWdlc1wiLCB7XG4gICAgICAgIGhpbnQ6IFwiU3BsaXQgeW91ciBtZXNzYWdlcyBpbnRvIHNtYWxsZXIgYmF0Y2hlc1wiLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZWFjaCBtZXNzYWdlXG4gICAgZm9yIChjb25zdCBtc2cgb2YgbWVzc2FnZXMpIHtcbiAgICAgIGlmICghL15cXCtbMS05XVxcZHsxLDE0fSQvLnRlc3QobXNnLnRvKSkge1xuICAgICAgICBlcnJvcihgSW52YWxpZCBwaG9uZSBudW1iZXI6ICR7bXNnLnRvfWAsIHtcbiAgICAgICAgICBoaW50OiBcIlVzZSBFLjE2NCBmb3JtYXQ6ICsxNTU1MTIzNDU2N1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFtc2cudGV4dD8udHJpbSgpKSB7XG4gICAgICAgIGVycm9yKGBFbXB0eSBtZXNzYWdlIHRleHQgZm9yICR7bXNnLnRvfWAsIHtcbiAgICAgICAgICBoaW50OiBcIlVzZSAtLXRleHQgdG8gcHJvdmlkZSBhIHNoYXJlZCBtZXNzYWdlIGZvciBhbGwgcmVjaXBpZW50c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkcnktcnVuIG1vZGVcbiAgICBpZiAoZmxhZ3NbXCJkcnktcnVuXCJdKSB7XG4gICAgICBjb25zdCBzcGluID0gc3Bpbm5lcihcIkFuYWx5emluZyBiYXRjaC4uLlwiKS5zdGFydCgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcmV2aWV3ID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8QmF0Y2hQcmV2aWV3UmVzcG9uc2U+KFxuICAgICAgICAgIFwiL2FwaS92MS9tZXNzYWdlcy9iYXRjaC9wcmV2aWV3XCIsXG4gICAgICAgICAgeyBtZXNzYWdlcywgdGV4dDogZmxhZ3MudGV4dCB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAgICBqc29uKHByZXZpZXcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgY29tcHJlaGVuc2l2ZSBwcmV2aWV3XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TiiBCYXRjaCBQcmV2aWV3IChEcnkgUnVuKVxcblwiKSk7XG5cbiAgICAgICAgLy8gU3VtbWFyeSB0YWJsZVxuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwi4pSAXCIucmVwZWF0KDUwKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhgVG90YWwgbWVzc2FnZXM6ICAgICAke3ByZXZpZXcudG90YWx9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBTZW5kYWJsZTogICAgICAgICAgICR7Y29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHByZXZpZXcuc2VuZGFibGUpKX1gLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgQmxvY2tlZDogICAgICAgICAgICAke3ByZXZpZXcuYmxvY2tlZCA+IDAgPyBjb2xvcnMuZXJyb3IoU3RyaW5nKHByZXZpZXcuYmxvY2tlZCkpIDogXCIwXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coYER1cGxpY2F0ZXMgcmVtb3ZlZDogJHtwcmV2aWV3LmR1cGxpY2F0ZXN9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCLilIBcIi5yZXBlYXQoNTApKSk7XG5cbiAgICAgICAgLy8gQ3JlZGl0c1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuQ3JlZGl0cyBuZWVkZWQ6ICAgICAke3ByZXZpZXcuY3JlZGl0c05lZWRlZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYFlvdXIgYmFsYW5jZTogICAgICAgJHtwcmV2aWV3LmNyZWRpdEJhbGFuY2V9YCk7XG4gICAgICAgIGlmICghcHJldmlldy5oYXNTdWZmaWNpZW50Q3JlZGl0cykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY29sb3JzLmVycm9yKFxuICAgICAgICAgICAgICBg4pqg77iPICBJbnN1ZmZpY2llbnQgY3JlZGl0cyEgTmVlZCAke3ByZXZpZXcuY3JlZGl0c05lZWRlZCAtIHByZXZpZXcuY3JlZGl0QmFsYW5jZX0gbW9yZS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWNjZXNzIGluZm9cbiAgICAgICAgY29uc29sZS5sb2coYFxcbkFQSSBLZXkgdHlwZTogICAgICAgJHtwcmV2aWV3LmtleVR5cGUudG9VcHBlckNhc2UoKX1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIGFjY2VzczogICAgICAgJHtwcmV2aWV3Lmhhc1dyaXRlU2NvcGUgPyBcIuKck1wiIDogXCLinJdcIn1gKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYERvbWVzdGljIChVUy9DQSk6ICAgJHtwcmV2aWV3Lm1lc3NhZ2luZ1Byb2ZpbGUuY2FuU2VuZERvbWVzdGljID8gXCLinJNcIiA6IFwi4pyXXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYEludGVybmF0aW9uYWw6ICAgICAgJHtwcmV2aWV3Lm1lc3NhZ2luZ1Byb2ZpbGUuY2FuU2VuZEludGVybmF0aW9uYWwgPyBcIuKck1wiIDogXCLinJdcIn1gLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENvdW50cnkgYnJlYWtkb3duXG4gICAgICAgIGNvbnN0IGNvdW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHByZXZpZXcuYnlDb3VudHJ5KTtcbiAgICAgICAgaWYgKGNvdW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCJcXG7wn5ONIEJ5IENvdW50cnk6XFxuXCIpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtjb3VudHJ5LCBkYXRhXSBvZiBjb3VudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGRhdGEuYWxsb3dlZFxuICAgICAgICAgICAgICA/IGNvbG9ycy5zdWNjZXNzKFwi4pyTXCIpXG4gICAgICAgICAgICAgIDogY29sb3JzLmVycm9yKFwi4pyXXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGAgICR7c3RhdHVzfSAke2NvdW50cnl9OiAke2RhdGEuY291bnR9IG1zZ3MsICR7ZGF0YS5jcmVkaXRzfSBjcmVkaXRzICgke2RhdGEudGllcn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWRhdGEuYWxsb3dlZCAmJiBkYXRhLmJsb2NrZWRSZWFzb24pIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgICAgICDilJTilIAgJHtkYXRhLmJsb2NrZWRSZWFzb259YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdhcm5pbmdzXG4gICAgICAgIGlmIChwcmV2aWV3Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMud2FybmluZyhcIlxcbuKaoO+4jyAgV2FybmluZ3M6XCIpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHcgb2YgcHJldmlldy53YXJuaW5ncykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgIOKAoiAke3d9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmxvY2tlZCBtZXNzYWdlcyAoZmlyc3QgNSlcbiAgICAgICAgaWYgKHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNvbG9ycy5lcnJvcihcbiAgICAgICAgICAgICAgYFxcbuKdjCBCbG9ja2VkIE1lc3NhZ2VzICgke3ByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aH0gdG90YWwpOmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZm9yIChjb25zdCBiIG9mIHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLnNsaWNlKDAsIDUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgJHtiLnRvfTogJHtiLnJlYXNvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICAgIGAgICAuLi4gYW5kICR7cHJldmlldy5ibG9ja2VkTWVzc2FnZXMubGVuZ3RoIC0gNX0gbW9yZWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIFwiXFxuXCIgKyBjb2xvcnMuZGltKFwiTm8gbWVzc2FnZXMgd2VyZSBzZW50LiBSZW1vdmUgLS1kcnktcnVuIHRvIHNlbmQuXCIpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3Bpbi5zdG9wKCk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzcGluID0gc3Bpbm5lcihgU2VuZGluZyAke21lc3NhZ2VzLmxlbmd0aH0gbWVzc2FnZXMuLi5gKTtcbiAgICBzcGluLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxCYXRjaFJlc3BvbnNlPihcbiAgICAgICAgXCIvYXBpL3YxL21lc3NhZ2VzL2JhdGNoXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgICAuLi4oZmxhZ3MuZnJvbSAmJiB7IGZyb206IGZsYWdzLmZyb20gfSksXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBzcGluLnN0b3AoKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgc3VjY2VzcyBsZXZlbFxuICAgICAgY29uc3QgYWxsU3VjY2VlZGVkID0gcmVzcG9uc2UuZmFpbGVkID09PSAwO1xuICAgICAgY29uc3QgYWxsRmFpbGVkID0gcmVzcG9uc2Uuc2VudCA9PT0gMCAmJiByZXNwb25zZS5mYWlsZWQgPiAwO1xuICAgICAgY29uc3QgcGFydGlhbFN1Y2Nlc3MgPSByZXNwb25zZS5zZW50ID4gMCAmJiByZXNwb25zZS5mYWlsZWQgPiAwO1xuXG4gICAgICBpZiAoYWxsU3VjY2VlZGVkKSB7XG4gICAgICAgIHN1Y2Nlc3MoXCJCYXRjaCBzZW50IHN1Y2Nlc3NmdWxseVwiLCB7XG4gICAgICAgICAgXCJCYXRjaCBJRFwiOiByZXNwb25zZS5iYXRjaElkLFxuICAgICAgICAgIFRvdGFsOiByZXNwb25zZS50b3RhbCxcbiAgICAgICAgICBTZW50OiBjb2xvcnMuc3VjY2VzcyhTdHJpbmcocmVzcG9uc2Uuc2VudCkpLFxuICAgICAgICAgIFwiQ3JlZGl0cyBVc2VkXCI6IHJlc3BvbnNlLmNyZWRpdHNVc2VkLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoYWxsRmFpbGVkKSB7XG4gICAgICAgIGVycm9yKFwiQmF0Y2ggZmFpbGVkXCIsIHtcbiAgICAgICAgICBoaW50OiBgQWxsICR7cmVzcG9uc2UuZmFpbGVkfSBtZXNzYWdlcyBmYWlsZWQgdG8gc2VuZGAsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKGAgIEJhdGNoIElEOiAke3Jlc3BvbnNlLmJhdGNoSWR9YCkpO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjb2xvcnMuZGltKGAgIENyZWRpdHMgUmVmdW5kZWQ6ICR7cmVzcG9uc2UuY3JlZGl0c1JlZnVuZGVkfWApLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0aWFsU3VjY2Vzcykge1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMud2FybmluZyhcIlxcbuKaoO+4jyAgQmF0Y2ggY29tcGxldGVkIHdpdGggZXJyb3JzXFxuXCIpKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgQmF0Y2ggSUQ6ICAgICAgICAgJHtyZXNwb25zZS5iYXRjaElkfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgICBUb3RhbDogICAgICAgICAgICAke3Jlc3BvbnNlLnRvdGFsfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgICBTZW50OiAgICAgICAgICAgICAke2NvbG9ycy5zdWNjZXNzKFN0cmluZyhyZXNwb25zZS5zZW50KSl9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCAgRmFpbGVkOiAgICAgICAgICAgJHtjb2xvcnMuZXJyb3IoU3RyaW5nKHJlc3BvbnNlLmZhaWxlZCkpfWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIENyZWRpdHMgVXNlZDogICAgICR7cmVzcG9uc2UuY3JlZGl0c1VzZWR9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIENyZWRpdHMgUmVmdW5kZWQ6ICR7cmVzcG9uc2UuY3JlZGl0c1JlZnVuZGVkfWApO1xuXG4gICAgICAgIC8vIFNob3cgZmFpbGVkIG1lc3NhZ2VzIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAocmVzcG9uc2UubWVzc2FnZXMpIHtcbiAgICAgICAgICBjb25zdCBmYWlsZWRNc2dzID0gcmVzcG9uc2UubWVzc2FnZXMuZmlsdGVyKFxuICAgICAgICAgICAgKG0pID0+IG0uc3RhdHVzID09PSBcImZhaWxlZFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGZhaWxlZE1zZ3MubGVuZ3RoID4gMCAmJiBmYWlsZWRNc2dzLmxlbmd0aCA8PSA1KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiXFxuICBGYWlsZWQgbWVzc2FnZXM6XCIpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbXNnIG9mIGZhaWxlZE1zZ3MpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLmRpbShgICAgICR7bXNnLnRvfTogJHttc2cuZXJyb3IgfHwgXCJVbmtub3duIGVycm9yXCJ9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmYWlsZWRNc2dzLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICAgIGBcXG4gICR7ZmFpbGVkTXNncy5sZW5ndGh9IG1lc3NhZ2VzIGZhaWxlZC4gVXNlIC0tanNvbiBmb3IgZGV0YWlscy5gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNwaW4uc3RvcCgpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VNZXNzYWdlc0Zyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBCYXRjaE1lc3NhZ2VbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG5cbiAgICAgIC8vIFRyeSBKU09OIGZpcnN0XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICB0bzogaXRlbS50byxcbiAgICAgICAgICAgIHRleHQ6IGl0ZW0udGV4dCxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEubWVzc2FnZXMgJiYgQXJyYXkuaXNBcnJheShkYXRhLm1lc3NhZ2VzKSkge1xuICAgICAgICAgIHJldHVybiBkYXRhLm1lc3NhZ2VzO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yKFwiSW52YWxpZCBKU09OIGZvcm1hdFwiLCB7XG4gICAgICAgICAgaGludDogXCJFeHBlY3RlZCBhcnJheSBvZiB7dG8sIHRleHR9IG9iamVjdHMgb3Ige21lc3NhZ2VzOiBbLi4uXX1cIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IENTVlxuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmNzdlwiKSkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQudHJpbSgpLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICBjb25zdCBtZXNzYWdlczogQmF0Y2hNZXNzYWdlW10gPSBbXTtcblxuICAgICAgICAvLyBJbXByb3ZlZCBoZWFkZXIgZGV0ZWN0aW9uIC0gY2hlY2sgZm9yIGNvbW1vbiBoZWFkZXIgcGF0dGVybnNcbiAgICAgICAgY29uc3QgaGVhZGVyUGF0dGVybnMgPSBbXG4gICAgICAgICAgXCJ0b1wiLFxuICAgICAgICAgIFwicGhvbmVcIixcbiAgICAgICAgICBcIm51bWJlclwiLFxuICAgICAgICAgIFwicmVjaXBpZW50XCIsXG4gICAgICAgICAgXCJtb2JpbGVcIixcbiAgICAgICAgICBcImNlbGxcIixcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gbGluZXNbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgaGFzSGVhZGVyID0gaGVhZGVyUGF0dGVybnMuc29tZSgocCkgPT4gZmlyc3RMaW5lLmluY2x1ZGVzKHApKTtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGhhc0hlYWRlciA/IDEgOiAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV0udHJpbSgpO1xuICAgICAgICAgIGlmICghbGluZSkgY29udGludWU7IC8vIFNraXAgZW1wdHkgbGluZXNcblxuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBwaG9uZSA9IHBhcnRzWzBdLnRyaW0oKS5yZXBsYWNlKC9cIi9nLCBcIlwiKTtcbiAgICAgICAgICAgIC8vIE9ubHkgYWRkIGlmIHBob25lIGxvb2tzIHZhbGlkIChzdGFydHMgd2l0aCArIG9yIGRpZ2l0KVxuICAgICAgICAgICAgaWYgKHBob25lICYmIChwaG9uZS5zdGFydHNXaXRoKFwiK1wiKSB8fCAvXlxcZC8udGVzdChwaG9uZSkpKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRvOiBwaG9uZS5zdGFydHNXaXRoKFwiK1wiKSA/IHBob25lIDogYCske3Bob25lfWAsXG4gICAgICAgICAgICAgICAgdGV4dDpcbiAgICAgICAgICAgICAgICAgIHBhcnRzLmxlbmd0aCA+PSAyXG4gICAgICAgICAgICAgICAgICAgID8gcGFydHMuc2xpY2UoMSkuam9pbihcIixcIikudHJpbSgpLnJlcGxhY2UoL1wiL2csIFwiXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzO1xuICAgICAgfVxuXG4gICAgICBlcnJvcihcIlVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0XCIsIHtcbiAgICAgICAgaGludDogXCJVc2UgLmpzb24gb3IgLmNzdiBmaWxlXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICgoZXJyIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIikge1xuICAgICAgICBlcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgIGVycm9yKFwiSW52YWxpZCBKU09OIGluIGZpbGVcIiwgeyBoaW50OiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTWVzc2FnZXNGcm9tRmxhZ3ModG86IHN0cmluZywgdGV4dDogc3RyaW5nKTogQmF0Y2hNZXNzYWdlW10ge1xuICAgIGNvbnN0IHBob25lcyA9IHRvLnNwbGl0KFwiLFwiKS5tYXAoKHApID0+IHAudHJpbSgpKTtcbiAgICByZXR1cm4gcGhvbmVzLm1hcCgocGhvbmUpID0+ICh7IHRvOiBwaG9uZSwgdGV4dCB9KSk7XG4gIH1cbn1cbiJdfQ==
@@ -59,19 +59,24 @@ export default class WebhooksTest extends AuthenticatedCommand {
59
59
  }
60
60
  catch (err) {
61
61
  testSpinner.stop();
62
- if (err instanceof Error && err.message.includes("404")) {
63
- error(`Webhook not found: ${args.id}`);
64
- }
65
- else {
66
- if (err instanceof Error) {
67
- error(`Failed to send test event: ${err.message}`);
62
+ // Check if it's a "webhook not found" error (API returns 404 status)
63
+ // vs a "target URL returned 404" error (API returns 400 with message)
64
+ if (err instanceof Error) {
65
+ const msg = err.message;
66
+ // Only show "not found" if the API itself returned 404 (webhook doesn't exist)
67
+ // Not if the webhook target URL returned 404
68
+ if (msg.includes("404") && !msg.includes("HTTP 404")) {
69
+ error(`Webhook not found: ${args.id}`);
68
70
  }
69
71
  else {
70
- error(`Failed to send test event: ${String(err)}`);
72
+ error(`Failed to send test event: ${msg}`);
71
73
  }
72
74
  }
75
+ else {
76
+ error(`Failed to send test event: ${String(err)}`);
77
+ }
73
78
  this.exit(1);
74
79
  }
75
80
  }
76
81
  }
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLE9BQU8sRUFDUCxJQUFJLEVBQ0osTUFBTSxFQUVOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBcUI3QixNQUFNLENBQUMsT0FBTyxPQUFPLFlBQWEsU0FBUSxvQkFBb0I7SUFDNUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxnQ0FBZ0MsQ0FBQztJQUV0RCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDRDQUE0QztRQUM1QyxtREFBbUQ7S0FDcEQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxvQkFBb0I7WUFDakMsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7S0FDbEMsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUNqQyxvQkFBb0IsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUNuQyxDQUFDO1lBRUYsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRW5CLElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNiLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUVqQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTtvQkFDOUIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxXQUFXO29CQUNuQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFdBQVc7b0JBQ25DLFlBQVksRUFBRSxRQUFRLENBQUMsVUFBVTtvQkFDakMsZUFBZSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsSUFBSTtvQkFDOUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO29CQUMzQyxjQUFjLEVBQUUsUUFBUSxDQUFDLFlBQVksSUFBSSxVQUFVO2lCQUNwRCxDQUFDLENBQUM7Z0JBRUgsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO29CQUMxQyxPQUFPLENBQUMsR0FBRyxDQUNULFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7d0JBQ3RDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNyRCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLG1CQUFtQixFQUFFO29CQUN6QixhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsSUFBSSxLQUFLO29CQUM3QyxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsSUFBSSxLQUFLO29CQUM3QyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxRQUFRO29CQUNwQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLGVBQWU7b0JBQzNELEdBQUcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxJQUFJO3dCQUMzQixhQUFhLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7cUJBQzVDLENBQUM7aUJBQ0gsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRW5CLElBQUksR0FBRyxZQUFZLEtBQUssSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLEdBQUcsWUFBWSxLQUFLLEVBQUUsQ0FBQztvQkFDekIsS0FBSyxDQUFDLDhCQUE4QixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDckQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckQsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHN1Y2Nlc3MsXG4gIGVycm9yLFxuICBzcGlubmVyLFxuICBqc29uLFxuICBjb2xvcnMsXG4gIGtleVZhbHVlLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgVGVzdERlbGl2ZXJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgZGVsaXZlcnlfaWQ6IHN0cmluZztcbiAgd2ViaG9va191cmw6IHN0cmluZztcbiAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgcmVzcG9uc2VfdGltZTogbnVtYmVyO1xuICBzdGF0dXNfY29kZT86IG51bWJlcjtcbiAgcmVzcG9uc2VfYm9keT86IHN0cmluZztcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIGRlbGl2ZXJlZF9hdD86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRlc3RXZWJob29rUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRlbGl2ZXJ5PzogVGVzdERlbGl2ZXJ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc1Rlc3QgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiU2VuZCBhIHRlc3QgZXZlbnQgdG8gYSB3ZWJob29rXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgdGVzdCB3aGtfYWJjMTIzXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyB0ZXN0IHdoa19hYmMxMjMgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldlYmhvb2sgSUQgdG8gdGVzdFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFdlYmhvb2tzVGVzdCk7XG5cbiAgICBjb25zdCB0ZXN0U3Bpbm5lciA9IHNwaW5uZXIoXCJTZW5kaW5nIHRlc3QgZXZlbnQuLi5cIik7XG4gICAgdGVzdFNwaW5uZXIuc3RhcnQoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxUZXN0V2ViaG9va1Jlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfS90ZXN0YCxcbiAgICAgICk7XG5cbiAgICAgIHRlc3RTcGlubmVyLnN0b3AoKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVsaXZlcnkgPSByZXN1bHQuZGVsaXZlcnk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiBkZWxpdmVyeSkge1xuICAgICAgICBzdWNjZXNzKFwiVGVzdCBldmVudCBkZWxpdmVyZWRcIiwge1xuICAgICAgICAgIFwiRGVsaXZlcnkgSURcIjogZGVsaXZlcnkuZGVsaXZlcnlfaWQsXG4gICAgICAgICAgXCJXZWJob29rIFVSTFwiOiBkZWxpdmVyeS53ZWJob29rX3VybCxcbiAgICAgICAgICBcIkV2ZW50IFR5cGVcIjogZGVsaXZlcnkuZXZlbnRfdHlwZSxcbiAgICAgICAgICBcIlJlc3BvbnNlIFRpbWVcIjogYCR7ZGVsaXZlcnkucmVzcG9uc2VfdGltZX1tc2AsXG4gICAgICAgICAgXCJTdGF0dXMgQ29kZVwiOiBTdHJpbmcoZGVsaXZlcnkuc3RhdHVzX2NvZGUpLFxuICAgICAgICAgIFwiRGVsaXZlcmVkIEF0XCI6IGRlbGl2ZXJ5LmRlbGl2ZXJlZF9hdCB8fCBcIkp1c3Qgbm93XCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZWxpdmVyeS5yZXNwb25zZV9ib2R5KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiUmVzcG9uc2UgQm9keTpcIikpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgZGVsaXZlcnkucmVzcG9uc2VfYm9keS5zdWJzdHJpbmcoMCwgMjAwKSArXG4gICAgICAgICAgICAgIChkZWxpdmVyeS5yZXNwb25zZV9ib2R5Lmxlbmd0aCA+IDIwMCA/IFwiLi4uXCIgOiBcIlwiKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcihcIlRlc3QgZXZlbnQgZmFpbGVkXCIsIHtcbiAgICAgICAgICBcIkRlbGl2ZXJ5IElEXCI6IGRlbGl2ZXJ5Py5kZWxpdmVyeV9pZCB8fCBcIk4vQVwiLFxuICAgICAgICAgIFwiV2ViaG9vayBVUkxcIjogZGVsaXZlcnk/LndlYmhvb2tfdXJsIHx8IFwiTi9BXCIsXG4gICAgICAgICAgU3RhdHVzOiBkZWxpdmVyeT8uc3RhdHVzIHx8IFwiZmFpbGVkXCIsXG4gICAgICAgICAgRXJyb3I6IGRlbGl2ZXJ5Py5lcnJvciB8fCByZXN1bHQubWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgICAuLi4oZGVsaXZlcnk/LnN0YXR1c19jb2RlICYmIHtcbiAgICAgICAgICAgIFwiU3RhdHVzIENvZGVcIjogU3RyaW5nKGRlbGl2ZXJ5LnN0YXR1c19jb2RlKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0ZXN0U3Bpbm5lci5zdG9wKCk7XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubWVzc2FnZS5pbmNsdWRlcyhcIjQwNFwiKSkge1xuICAgICAgICBlcnJvcihgV2ViaG9vayBub3QgZm91bmQ6ICR7YXJncy5pZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGVycm9yKGBGYWlsZWQgdG8gc2VuZCB0ZXN0IGV2ZW50OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yKGBGYWlsZWQgdG8gc2VuZCB0ZXN0IGV2ZW50OiAke1N0cmluZyhlcnIpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG4iXX0=
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLE9BQU8sRUFDUCxJQUFJLEVBQ0osTUFBTSxFQUVOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBcUI3QixNQUFNLENBQUMsT0FBTyxPQUFPLFlBQWEsU0FBUSxvQkFBb0I7SUFDNUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxnQ0FBZ0MsQ0FBQztJQUV0RCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDRDQUE0QztRQUM1QyxtREFBbUQ7S0FDcEQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxvQkFBb0I7WUFDakMsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7S0FDbEMsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxD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eyBBcmdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHN1Y2Nlc3MsXG4gIGVycm9yLFxuICBzcGlubmVyLFxuICBqc29uLFxuICBjb2xvcnMsXG4gIGtleVZhbHVlLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgVGVzdERlbGl2ZXJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgZGVsaXZlcnlfaWQ6IHN0cmluZztcbiAgd2ViaG9va191cmw6IHN0cmluZztcbiAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgcmVzcG9uc2VfdGltZTogbnVtYmVyO1xuICBzdGF0dXNfY29kZT86IG51bWJlcjtcbiAgcmVzcG9uc2VfYm9keT86IHN0cmluZztcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIGRlbGl2ZXJlZF9hdD86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRlc3RXZWJob29rUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRlbGl2ZXJ5PzogVGVzdERlbGl2ZXJ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc1Rlc3QgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiU2VuZCBhIHRlc3QgZXZlbnQgdG8gYSB3ZWJob29rXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgdGVzdCB3aGtfYWJjMTIzXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyB0ZXN0IHdoa19hYmMxMjMgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldlYmhvb2sgSUQgdG8gdGVzdFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFdlYmhvb2tzVGVzdCk7XG5cbiAgICBjb25zdCB0ZXN0U3Bpbm5lciA9IHNwaW5uZXIoXCJTZW5kaW5nIHRlc3QgZXZlbnQuLi5cIik7XG4gICAgdGVzdFNwaW5uZXIuc3RhcnQoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxUZXN0V2ViaG9va1Jlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfS90ZXN0YCxcbiAgICAgICk7XG5cbiAgICAgIHRlc3RTcGlubmVyLnN0b3AoKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVsaXZlcnkgPSByZXN1bHQuZGVsaXZlcnk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiBkZWxpdmVyeSkge1xuICAgICAgICBzdWNjZXNzKFwiVGVzdCBldmVudCBkZWxpdmVyZWRcIiwge1xuICAgICAgICAgIFwiRGVsaXZlcnkgSURcIjogZGVsaXZlcnkuZGVsaXZlcnlfaWQsXG4gICAgICAgICAgXCJXZWJob29rIFVSTFwiOiBkZWxpdmVyeS53ZWJob29rX3VybCxcbiAgICAgICAgICBcIkV2ZW50IFR5cGVcIjogZGVsaXZlcnkuZXZlbnRfdHlwZSxcbiAgICAgICAgICBcIlJlc3BvbnNlIFRpbWVcIjogYCR7ZGVsaXZlcnkucmVzcG9uc2VfdGltZX1tc2AsXG4gICAgICAgICAgXCJTdGF0dXMgQ29kZVwiOiBTdHJpbmcoZGVsaXZlcnkuc3RhdHVzX2NvZGUpLFxuICAgICAgICAgIFwiRGVsaXZlcmVkIEF0XCI6IGRlbGl2ZXJ5LmRlbGl2ZXJlZF9hdCB8fCBcIkp1c3Qgbm93XCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZWxpdmVyeS5yZXNwb25zZV9ib2R5KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiUmVzcG9uc2UgQm9keTpcIikpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgZGVsaXZlcnkucmVzcG9uc2VfYm9keS5zdWJzdHJpbmcoMCwgMjAwKSArXG4gICAgICAgICAgICAgIChkZWxpdmVyeS5yZXNwb25zZV9ib2R5Lmxlbmd0aCA+IDIwMCA/IFwiLi4uXCIgOiBcIlwiKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcihcIlRlc3QgZXZlbnQgZmFpbGVkXCIsIHtcbiAgICAgICAgICBcIkRlbGl2ZXJ5IElEXCI6IGRlbGl2ZXJ5Py5kZWxpdmVyeV9pZCB8fCBcIk4vQVwiLFxuICAgICAgICAgIFwiV2ViaG9vayBVUkxcIjogZGVsaXZlcnk/LndlYmhvb2tfdXJsIHx8IFwiTi9BXCIsXG4gICAgICAgICAgU3RhdHVzOiBkZWxpdmVyeT8uc3RhdHVzIHx8IFwiZmFpbGVkXCIsXG4gICAgICAgICAgRXJyb3I6IGRlbGl2ZXJ5Py5lcnJvciB8fCByZXN1bHQubWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgICAuLi4oZGVsaXZlcnk/LnN0YXR1c19jb2RlICYmIHtcbiAgICAgICAgICAgIFwiU3RhdHVzIENvZGVcIjogU3RyaW5nKGRlbGl2ZXJ5LnN0YXR1c19jb2RlKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0ZXN0U3Bpbm5lci5zdG9wKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBcIndlYmhvb2sgbm90IGZvdW5kXCIgZXJyb3IgKEFQSSByZXR1cm5zIDQwNCBzdGF0dXMpXG4gICAgICAvLyB2cyBhIFwidGFyZ2V0IFVSTCByZXR1cm5lZCA0MDRcIiBlcnJvciAoQVBJIHJldHVybnMgNDAwIHdpdGggbWVzc2FnZSlcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgLy8gT25seSBzaG93IFwibm90IGZvdW5kXCIgaWYgdGhlIEFQSSBpdHNlbGYgcmV0dXJuZWQgNDA0ICh3ZWJob29rIGRvZXNuJ3QgZXhpc3QpXG4gICAgICAgIC8vIE5vdCBpZiB0aGUgd2ViaG9vayB0YXJnZXQgVVJMIHJldHVybmVkIDQwNFxuICAgICAgICBpZiAobXNnLmluY2x1ZGVzKFwiNDA0XCIpICYmICFtc2cuaW5jbHVkZXMoXCJIVFRQIDQwNFwiKSkge1xuICAgICAgICAgIGVycm9yKGBXZWJob29rIG5vdCBmb3VuZDogJHthcmdzLmlkfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yKGBGYWlsZWQgdG8gc2VuZCB0ZXN0IGV2ZW50OiAke21zZ31gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoYEZhaWxlZCB0byBzZW5kIHRlc3QgZXZlbnQ6ICR7U3RyaW5nKGVycil9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -752,8 +752,10 @@
752
752
  "examples": [
753
753
  "<%= config.bin %> sms batch --file recipients.json",
754
754
  "<%= config.bin %> sms batch --to +15551234567,+15559876543 --text \"Hello everyone!\"",
755
+ "<%= config.bin %> sms batch --file phones.csv --text \"Your order is ready!\"",
755
756
  "<%= config.bin %> sms batch --file recipients.csv --from \"Sendly\"",
756
- "<%= config.bin %> sms batch --file messages.json --json"
757
+ "<%= config.bin %> sms batch --file messages.json --json",
758
+ "<%= config.bin %> sms batch --file phones.csv --text \"Hi\" --dry-run"
757
759
  ],
758
760
  "flags": {
759
761
  "json": {
@@ -793,7 +795,7 @@
793
795
  },
794
796
  "text": {
795
797
  "char": "m",
796
- "description": "Message text (used with --to flag)",
798
+ "description": "Message text (works with --to or --file for phone-only lists)",
797
799
  "name": "text",
798
800
  "hasDynamicHelp": false,
799
801
  "multiple": false,
@@ -806,6 +808,13 @@
806
808
  "hasDynamicHelp": false,
807
809
  "multiple": false,
808
810
  "type": "option"
811
+ },
812
+ "dry-run": {
813
+ "char": "d",
814
+ "description": "Preview batch without sending (validates access, shows cost breakdown)",
815
+ "name": "dry-run",
816
+ "allowNo": false,
817
+ "type": "boolean"
809
818
  }
810
819
  },
811
820
  "hasDynamicHelp": false,
@@ -1714,5 +1723,5 @@
1714
1723
  ]
1715
1724
  }
1716
1725
  },
1717
- "version": "3.2.0"
1726
+ "version": "3.3.1"
1718
1727
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendly/cli",
3
- "version": "3.2.0",
3
+ "version": "3.3.1",
4
4
  "type": "module",
5
5
  "description": "Sendly CLI - Send SMS from your terminal",
6
6
  "author": "Sendly <support@sendly.live>",