@sendly/cli 3.12.3 → 3.13.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.
Files changed (66) hide show
  1. package/dist/commands/campaigns/cancel.d.ts +13 -0
  2. package/dist/commands/campaigns/cancel.js +34 -0
  3. package/dist/commands/campaigns/clone.d.ts +14 -0
  4. package/dist/commands/campaigns/clone.js +47 -0
  5. package/dist/commands/campaigns/create.d.ts +14 -0
  6. package/dist/commands/campaigns/create.js +64 -0
  7. package/dist/commands/campaigns/delete.d.ts +14 -0
  8. package/dist/commands/campaigns/delete.js +63 -0
  9. package/dist/commands/campaigns/get.d.ts +13 -0
  10. package/dist/commands/campaigns/get.js +101 -0
  11. package/dist/commands/campaigns/list.d.ts +13 -0
  12. package/dist/commands/campaigns/list.js +115 -0
  13. package/dist/commands/campaigns/preview.d.ts +13 -0
  14. package/dist/commands/campaigns/preview.js +71 -0
  15. package/dist/commands/campaigns/schedule.d.ts +15 -0
  16. package/dist/commands/campaigns/schedule.js +61 -0
  17. package/dist/commands/campaigns/send.d.ts +14 -0
  18. package/dist/commands/campaigns/send.js +96 -0
  19. package/dist/commands/campaigns/update.d.ts +17 -0
  20. package/dist/commands/campaigns/update.js +66 -0
  21. package/dist/commands/contacts/create.d.ts +13 -0
  22. package/dist/commands/contacts/create.js +48 -0
  23. package/dist/commands/contacts/delete.d.ts +14 -0
  24. package/dist/commands/contacts/delete.js +52 -0
  25. package/dist/commands/contacts/get.d.ts +13 -0
  26. package/dist/commands/contacts/get.js +51 -0
  27. package/dist/commands/contacts/import.d.ts +14 -0
  28. package/dist/commands/contacts/import.js +132 -0
  29. package/dist/commands/contacts/list.d.ts +14 -0
  30. package/dist/commands/contacts/list.js +101 -0
  31. package/dist/commands/contacts/lists/add.d.ts +14 -0
  32. package/dist/commands/contacts/lists/add.js +40 -0
  33. package/dist/commands/contacts/lists/create.d.ts +12 -0
  34. package/dist/commands/contacts/lists/create.js +40 -0
  35. package/dist/commands/contacts/lists/delete.d.ts +14 -0
  36. package/dist/commands/contacts/lists/delete.js +52 -0
  37. package/dist/commands/contacts/lists/get.d.ts +13 -0
  38. package/dist/commands/contacts/lists/get.js +63 -0
  39. package/dist/commands/contacts/lists/index.d.ts +10 -0
  40. package/dist/commands/contacts/lists/index.js +68 -0
  41. package/dist/commands/contacts/lists/remove.d.ts +14 -0
  42. package/dist/commands/contacts/lists/remove.js +36 -0
  43. package/dist/commands/contacts/lists/update.d.ts +15 -0
  44. package/dist/commands/contacts/lists/update.js +51 -0
  45. package/dist/commands/contacts/update.d.ts +15 -0
  46. package/dist/commands/contacts/update.js +52 -0
  47. package/dist/commands/keys/get.d.ts +13 -0
  48. package/dist/commands/keys/get.js +53 -0
  49. package/dist/commands/keys/rename.d.ts +14 -0
  50. package/dist/commands/keys/rename.js +53 -0
  51. package/dist/commands/keys/rotate.d.ts +15 -0
  52. package/dist/commands/keys/rotate.js +82 -0
  53. package/dist/commands/keys/usage.d.ts +13 -0
  54. package/dist/commands/keys/usage.js +102 -0
  55. package/dist/commands/status.js +3 -3
  56. package/dist/commands/templates/clone.d.ts +14 -0
  57. package/dist/commands/templates/clone.js +45 -0
  58. package/dist/commands/verify/list.d.ts +3 -0
  59. package/dist/commands/verify/list.js +31 -5
  60. package/dist/lib/api-client.d.ts +9 -2
  61. package/dist/lib/api-client.js +31 -7
  62. package/dist/lib/base-command.js +31 -4
  63. package/dist/lib/output.d.ts +4 -2
  64. package/dist/lib/output.js +19 -6
  65. package/oclif.manifest.json +2264 -723
  66. package/package.json +1 -1
@@ -31,17 +31,19 @@ export class ApiError extends Error {
31
31
  code;
32
32
  statusCode;
33
33
  details;
34
- constructor(code, message, statusCode, details) {
34
+ hint;
35
+ constructor(code, message, statusCode, details, hint) {
35
36
  super(message);
36
37
  this.code = code;
37
38
  this.statusCode = statusCode;
38
39
  this.details = details;
39
40
  this.name = "ApiError";
41
+ this.hint = hint;
40
42
  }
41
43
  }
42
44
  export class AuthenticationError extends ApiError {
43
- constructor(message = "Not authenticated. Run 'sendly login' first.") {
44
- super("authentication_error", message, 401);
45
+ constructor(message = "Authentication failed", hint = "Run 'sendly login' to authenticate, or check your API key with 'sendly config show'") {
46
+ super("authentication_error", message, 401, undefined, hint);
45
47
  this.name = "AuthenticationError";
46
48
  }
47
49
  }
@@ -56,17 +58,32 @@ export class ApiKeyRequiredError extends ApiError {
56
58
  export class RateLimitError extends ApiError {
57
59
  retryAfter;
58
60
  constructor(retryAfter, message = "Rate limit exceeded") {
59
- super("rate_limit_exceeded", message, 429);
61
+ const hint = `Wait ${retryAfter} seconds before retrying, or upgrade your plan for higher limits`;
62
+ super("rate_limit_exceeded", message, 429, undefined, hint);
60
63
  this.retryAfter = retryAfter;
61
64
  this.name = "RateLimitError";
62
65
  }
63
66
  }
64
67
  export class InsufficientCreditsError extends ApiError {
65
68
  constructor(message = "Insufficient credits") {
66
- super("insufficient_credits", message, 402);
69
+ const hint = "Check your balance with 'sendly credits', or add credits at https://sendly.live/dashboard/billing";
70
+ super("insufficient_credits", message, 402, undefined, hint);
67
71
  this.name = "InsufficientCreditsError";
68
72
  }
69
73
  }
74
+ export class NotFoundError extends ApiError {
75
+ constructor(message = "Resource not found", hint = "Verify the ID is correct, or use a list command to see available resources") {
76
+ super("not_found", message, 404, undefined, hint);
77
+ this.name = "NotFoundError";
78
+ }
79
+ }
80
+ export class ValidationError extends ApiError {
81
+ constructor(message = "Validation failed", details) {
82
+ const hint = "Check the command help with --help for valid options and formats";
83
+ super("validation_error", message, 400, details, hint);
84
+ this.name = "ValidationError";
85
+ }
86
+ }
70
87
  class ApiClient {
71
88
  rateLimitInfo;
72
89
  getBaseUrl() {
@@ -164,13 +181,20 @@ class ApiClient {
164
181
  throw new ApiKeyRequiredError("API key required for sending messages", "Set SENDLY_API_KEY environment variable or create a key with:\n sendly keys create --type test");
165
182
  }
166
183
  throw new AuthenticationError(message);
184
+ case 400:
185
+ throw new ValidationError(message, details);
167
186
  case 402:
168
187
  throw new InsufficientCreditsError(message);
188
+ case 404:
189
+ throw new NotFoundError(message);
169
190
  case 429:
170
191
  const retryAfter = data?.retryAfter || 60;
171
192
  throw new RateLimitError(retryAfter, message);
172
193
  default:
173
- throw new ApiError(error, message, statusCode, details);
194
+ const defaultHint = statusCode >= 500
195
+ ? "This is a server error. Try again later or check https://status.sendly.live"
196
+ : undefined;
197
+ throw new ApiError(error, message, statusCode, details, defaultHint);
174
198
  }
175
199
  }
176
200
  getRateLimitInfo() {
@@ -252,4 +276,4 @@ class ApiClient {
252
276
  }
253
277
  }
254
278
  export const apiClient = new ApiClient();
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlFLGlDQUFpQztBQUNqQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUF3QixDQUFDO0FBRXpFOztHQUVHO0FBQ0gsU0FBUyxLQUFLLENBQUMsRUFBVTtJQUN2QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLGlCQUFpQjtJQUNqQixJQUFJLEtBQUssWUFBWSxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxvQ0FBb0M7SUFDcEMsSUFBSSxLQUFLLFlBQVksUUFBUSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBaUJELE1BQU0sT0FBTyxRQUFTLFNBQVEsS0FBSztJQUV4QjtJQUVBO0lBQ0E7SUFKVCxZQUNTLElBQVksRUFDbkIsT0FBZSxFQUNSLFVBQWtCLEVBQ2xC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T0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxTQUFTLElBQUksSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFQSSBDbGllbnQgZm9yIFNlbmRseSBDTElcbiAqIEhhbmRsZXMgYWxsIEhUVFAgcmVxdWVzdHMgdG8gdGhlIFNlbmRseSBBUElcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBnZXRBdXRoVG9rZW4sIGdldENvbmZpZ1ZhbHVlLCBnZXRFZmZlY3RpdmVWYWx1ZSB9IGZyb20gXCIuL2NvbmZpZy5qc1wiO1xuXG4vLyBSZWFkIHZlcnNpb24gZnJvbSBwYWNrYWdlLmpzb25cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCB7IHZlcnNpb24gfSA9IHJlcXVpcmUoXCIuLi8uLi9wYWNrYWdlLmpzb25cIikgYXMgeyB2ZXJzaW9uOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTbGVlcCBmb3IgYSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZXJyb3IgaXMgcmV0cnlhYmxlIChuZXR3b3JrIGVycm9ycyBvciA1eHggc2VydmVyIGVycm9ycylcbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBOZXR3b3JrIGVycm9yc1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImZldGNoXCIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gU2VydmVyIGVycm9ycyAoNXh4KSBhcmUgcmV0cnlhYmxlXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwaUVycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPj0gNTAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVJlc3BvbnNlPFQ+IHtcbiAgZGF0YT86IFQ7XG4gIGVycm9yPzoge1xuICAgIGNvZGU6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGVMaW1pdEluZm8ge1xuICBsaW1pdDogbnVtYmVyO1xuICByZW1haW5pbmc6IG51bWJlcjtcbiAgcmVzZXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29kZTogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHB1YmxpYyBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiQXBpRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRpb25FcnJvciBleHRlbmRzIEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nID0gXCJOb3QgYXV0aGVudGljYXRlZC4gUnVuICdzZW5kbHkgbG9naW4nIGZpcnN0LlwiLFxuICApIHtcbiAgICBzdXBlcihcImF1dGhlbnRpY2F0aW9uX2Vycm9yXCIsIG1lc3NhZ2UsIDQwMSk7XG4gICAgdGhpcy5uYW1lID0gXCJBdXRoZW50aWNhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFwaUtleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IFwiQVBJIGtleSByZXF1aXJlZCBmb3IgdGhpcyBvcGVyYXRpb24uXCIsXG4gICAgcHVibGljIGhpbnQ6IHN0cmluZyA9IFwiU2V0IFNFTkRMWV9BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGNyZWF0ZSBhIGtleSB3aXRoOiBzZW5kbHkga2V5cyBjcmVhdGUgLS10eXBlIHRlc3RcIixcbiAgKSB7XG4gICAgc3VwZXIoXCJhcGlfa2V5X3JlcXVpcmVkXCIsIG1lc3NhZ2UsIDQwMSk7XG4gICAgdGhpcy5uYW1lID0gXCJBcGlLZXlSZXF1aXJlZEVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdEVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmV0cnlBZnRlcjogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IFwiUmF0ZSBsaW1pdCBleGNlZWRlZFwiLFxuICApIHtcbiAgICBzdXBlcihcInJhdGVfbGltaXRfZXhjZWVkZWRcIiwgbWVzc2FnZSwgNDI5KTtcbiAgICB0aGlzLm5hbWUgPSBcIlJhdGVMaW1pdEVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluc3VmZmljaWVudENyZWRpdHNFcnJvciBleHRlbmRzIEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gXCJJbnN1ZmZpY2llbnQgY3JlZGl0c1wiKSB7XG4gICAgc3VwZXIoXCJpbnN1ZmZpY2llbnRfY3JlZGl0c1wiLCBtZXNzYWdlLCA0MDIpO1xuICAgIHRoaXMubmFtZSA9IFwiSW5zdWZmaWNpZW50Q3JlZGl0c0Vycm9yXCI7XG4gIH1cbn1cblxuY2xhc3MgQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByYXRlTGltaXRJbmZvPzogUmF0ZUxpbWl0SW5mbztcblxuICBwcml2YXRlIGdldEJhc2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q29uZmlnVmFsdWUoXCJiYXNlVXJsXCIpIHx8IFwiaHR0cHM6Ly9zZW5kbHkubGl2ZVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKHJlcXVpcmVBdXRoOiBib29sZWFuID0gdHJ1ZSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBcIlVzZXItQWdlbnRcIjogYEBzZW5kbHkvY2xpLyR7dmVyc2lvbn1gLFxuICAgIH07XG5cbiAgICBpZiAocmVxdWlyZUF1dGgpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKCk7XG4gICAgICB9XG4gICAgICBoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgYXN5bmMgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgYm9keT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgICAgIHJlcXVpcmVBdXRoPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHsgYm9keSwgcXVlcnksIHJlcXVpcmVBdXRoID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBtYXhSZXRyaWVzID0gZ2V0RWZmZWN0aXZlVmFsdWUoXCJtYXhSZXRyaWVzXCIpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBnZXRFZmZlY3RpdmVWYWx1ZShcInRpbWVvdXRcIik7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAke3RoaXMuZ2V0QmFzZVVybCgpfSR7cGF0aH1gKTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHF1ZXJ5KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHJlcXVpcmVBdXRoKSxcbiAgICAgICAgICBib2R5OiBib2R5ID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHJhdGUgbGltaXQgaW5mb1xuICAgICAgICB0aGlzLnVwZGF0ZVJhdGVMaW1pdEluZm8ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUGFyc2UgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZS5zdGF0dXMsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEgYXMgVDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuXG4gICAgICAgIC8vIERvbid0IHJldHJ5IG5vbi1yZXRyeWFibGUgZXJyb3JzICg0eHggY2xpZW50IGVycm9ycylcbiAgICAgICAgaWYgKCFpc1JldHJ5YWJsZUVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgcmV0cnkgb24gbGFzdCBhdHRlbXB0XG4gICAgICAgIGlmIChhdHRlbXB0ID09PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmOiAxcywgMnMsIDRzLCBldGMuXG4gICAgICAgIGNvbnN0IGJhY2tvZmZNcyA9IE1hdGgubWluKDEwMDAgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSwgMTAwMDApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmTXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3VsZCBuZXZlciByZWFjaCBoZXJlLCBidXQgVHlwZVNjcmlwdCBuZWVkcyB0aGlzXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcihcIlJlcXVlc3QgZmFpbGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSYXRlTGltaXRJbmZvKGhlYWRlcnM6IEhlYWRlcnMpOiB2b2lkIHtcbiAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KFwiWC1SYXRlTGltaXQtTGltaXRcIik7XG4gICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoXCJYLVJhdGVMaW1pdC1SZW1haW5pbmdcIik7XG4gICAgY29uc3QgcmVzZXQgPSBoZWFkZXJzLmdldChcIlgtUmF0ZUxpbWl0LVJlc2V0XCIpO1xuXG4gICAgaWYgKGxpbWl0ICYmIHJlbWFpbmluZyAmJiByZXNldCkge1xuICAgICAgdGhpcy5yYXRlTGltaXRJbmZvID0ge1xuICAgICAgICBsaW1pdDogcGFyc2VJbnQobGltaXQsIDEwKSxcbiAgICAgICAgcmVtYWluaW5nOiBwYXJzZUludChyZW1haW5pbmcsIDEwKSxcbiAgICAgICAgcmVzZXQ6IHBhcnNlSW50KHJlc2V0LCAxMCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3Ioc3RhdHVzQ29kZTogbnVtYmVyLCBkYXRhOiBhbnkpOiBuZXZlciB7XG4gICAgY29uc3QgZXJyb3IgPSBkYXRhPy5lcnJvciB8fCBcInVua25vd25fZXJyb3JcIjtcbiAgICBjb25zdCBtZXNzYWdlID0gZGF0YT8ubWVzc2FnZSB8fCBgSFRUUCAke3N0YXR1c0NvZGV9YDtcbiAgICBjb25zdCBkZXRhaWxzID0gZGF0YT8uZGV0YWlscztcblxuICAgIHN3aXRjaCAoc3RhdHVzQ29kZSkge1xuICAgICAgY2FzZSA0MDE6XG4gICAgICBjYXNlIDQwMzpcbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoaXMgaXMgYW4gQVBJIGtleSByZXF1aXJlZCBlcnJvciB2cyBnZW5lcmFsIGF1dGggZXJyb3JcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVycm9yID09PSBcImludmFsaWRfYXBpX2tleVwiIHx8XG4gICAgICAgICAgZXJyb3IgPT09IFwiYXBpX2tleV9yZXF1aXJlZFwiIHx8XG4gICAgICAgICAgbWVzc2FnZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImFwaSBrZXlcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFwaUtleVJlcXVpcmVkRXJyb3IoXG4gICAgICAgICAgICBcIkFQSSBrZXkgcmVxdWlyZWQgZm9yIHNlbmRpbmcgbWVzc2FnZXNcIixcbiAgICAgICAgICAgIFwiU2V0IFNFTkRMWV9BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGNyZWF0ZSBhIGtleSB3aXRoOlxcbiAgc2VuZGx5IGtleXMgY3JlYXRlIC0tdHlwZSB0ZXN0XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgNDAyOlxuICAgICAgICB0aHJvdyBuZXcgSW5zdWZmaWNpZW50Q3JlZGl0c0Vycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSA0Mjk6XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBkYXRhPy5yZXRyeUFmdGVyIHx8IDYwO1xuICAgICAgICB0aHJvdyBuZXcgUmF0ZUxpbWl0RXJyb3IocmV0cnlBZnRlciwgbWVzc2FnZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGRldGFpbHMpO1xuICAgIH1cbiAgfVxuXG4gIGdldFJhdGVMaW1pdEluZm8oKTogUmF0ZUxpbWl0SW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmF0ZUxpbWl0SW5mbztcbiAgfVxuXG4gIC8vIENvbnZlbmllbmNlIG1ldGhvZHNcbiAgYXN5bmMgZ2V0PFQ+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQ+LFxuICAgIHJlcXVpcmVBdXRoOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihcIkdFVFwiLCBwYXRoLCB7IHF1ZXJ5LCByZXF1aXJlQXV0aCB9KTtcbiAgfVxuXG4gIGFzeW5jIHBvc3Q8VD4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByZXF1aXJlQXV0aDogYm9vbGVhbiA9IHRydWUsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oXCJQT1NUXCIsIHBhdGgsIHsgYm9keSwgcmVxdWlyZUF1dGggfSk7XG4gIH1cblxuICBhc3luYyBwYXRjaDxUPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHJlcXVpcmVBdXRoOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihcIlBBVENIXCIsIHBhdGgsIHsgYm9keSwgcmVxdWlyZUF1dGggfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGU8VD4ocGF0aDogc3RyaW5nLCByZXF1aXJlQXV0aDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KFwiREVMRVRFXCIsIHBhdGgsIHsgcmVxdWlyZUF1dGggfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIGEgZmlsZSB1c2luZyBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAqIFVzZWQgZm9yIGJhdGNoIENTViB1cGxvYWRzIHRvIFN1cGFiYXNlIHN0b3JhZ2VcbiAgICovXG4gIGFzeW5jIHVwbG9hZEZpbGU8VD4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGU6IHtcbiAgICAgIGJ1ZmZlcjogQnVmZmVyO1xuICAgICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICAgIG1pbWV0eXBlPzogc3RyaW5nO1xuICAgIH0sXG4gICAgcmVxdWlyZUF1dGg6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBtYXhSZXRyaWVzID0gZ2V0RWZmZWN0aXZlVmFsdWUoXCJtYXhSZXRyaWVzXCIpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBnZXRFZmZlY3RpdmVWYWx1ZShcInRpbWVvdXRcIik7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYXNlVXJsKCl9JHtwYXRofWA7XG5cbiAgICAvLyBCdWlsZCBtdWx0aXBhcnQgZm9ybSBkYXRhIG1hbnVhbGx5IChOb2RlLmpzIGNvbXBhdGlibGUpXG4gICAgY29uc3QgYm91bmRhcnkgPSBgLS0tLUZvcm1Cb3VuZGFyeSR7RGF0ZS5ub3coKX0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKX1gO1xuICAgIGNvbnN0IG1pbWV0eXBlID0gZmlsZS5taW1ldHlwZSB8fCBcInRleHQvY3N2XCI7XG5cbiAgICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuZnJvbShcbiAgICAgIGAtLSR7Ym91bmRhcnl9XFxyXFxuYCArXG4gICAgICAgIGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWxlXCI7IGZpbGVuYW1lPVwiJHtmaWxlLmZpbGVuYW1lfVwiXFxyXFxuYCArXG4gICAgICAgIGBDb250ZW50LVR5cGU6ICR7bWltZXR5cGV9XFxyXFxuXFxyXFxuYCxcbiAgICApO1xuICAgIGNvbnN0IGZvb3RlciA9IEJ1ZmZlci5mcm9tKGBcXHJcXG4tLSR7Ym91bmRhcnl9LS1cXHJcXG5gKTtcbiAgICBjb25zdCBib2R5ID0gQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBmaWxlLmJ1ZmZlciwgZm9vdGVyXSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogYG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSR7Ym91bmRhcnl9YCxcbiAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBcIlVzZXItQWdlbnRcIjogYEBzZW5kbHkvY2xpLyR7dmVyc2lvbn1gLFxuICAgIH07XG5cbiAgICBpZiAocmVxdWlyZUF1dGgpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKCk7XG4gICAgICB9XG4gICAgICBoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICAgIH1cblxuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICB9KTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVJhdGVMaW1pdEluZm8ocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhIGFzIFQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcblxuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gbWF4UmV0cmllcykge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFja29mZk1zID0gTWF0aC5taW4oMTAwMCAqIE1hdGgucG93KDIsIGF0dGVtcHQpLCAxMDAwMCk7XG4gICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmZNcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcihcIlVwbG9hZCBmYWlsZWRcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwaUNsaWVudCA9IG5ldyBBcGlDbGllbnQoKTtcbiJdfQ==
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlFLGlDQUFpQztBQUNqQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUF3QixDQUFDO0FBRXpFOztHQUVHO0FBQ0gsU0FBUyxLQUFLLENBQUMsRUFBVTtJQUN2QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLGlCQUFpQjtJQUNqQixJQUFJLEtBQUssWUFBWSxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxvQ0FBb0M7SUFDcEMsSUFBSSxLQUFLLFlBQVksUUFBUSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBaUJELE1BQU0sT0FBTyxRQUFTLFNBQVEsS0FBSztJQUl4QjtJQUVBO0lBQ0E7SUFORixJQUFJLENBQVU7SUFFckIsWUFDUyxJQUFZLEVBQ25CLE9BQWUs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LEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxJQUFJLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBUEkgQ2xpZW50IGZvciBTZW5kbHkgQ0xJXG4gKiBIYW5kbGVzIGFsbCBIVFRQIHJlcXVlc3RzIHRvIHRoZSBTZW5kbHkgQVBJXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZ2V0QXV0aFRva2VuLCBnZXRDb25maWdWYWx1ZSwgZ2V0RWZmZWN0aXZlVmFsdWUgfSBmcm9tIFwiLi9jb25maWcuanNcIjtcblxuLy8gUmVhZCB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgeyB2ZXJzaW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpIGFzIHsgdmVyc2lvbjogc3RyaW5nIH07XG5cbi8qKlxuICogU2xlZXAgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGVycm9yIGlzIHJldHJ5YWJsZSAobmV0d29yayBlcnJvcnMgb3IgNXh4IHNlcnZlciBlcnJvcnMpXG4gKi9cbmZ1bmN0aW9uIGlzUmV0cnlhYmxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gTmV0d29yayBlcnJvcnNcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJmZXRjaFwiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFNlcnZlciBlcnJvcnMgKDV4eCkgYXJlIHJldHJ5YWJsZVxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcGlFcnJvciAmJiBlcnJvci5zdGF0dXNDb2RlID49IDUwMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlSZXNwb25zZTxUPiB7XG4gIGRhdGE/OiBUO1xuICBlcnJvcj86IHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYXRlTGltaXRJbmZvIHtcbiAgbGltaXQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIHJlc2V0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGhpbnQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvZGU6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHN0YXR1c0NvZGU6IG51bWJlcixcbiAgICBwdWJsaWMgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGhpbnQ/OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiQXBpRXJyb3JcIjtcbiAgICB0aGlzLmhpbnQgPSBoaW50O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvbkVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgPSBcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZFwiLFxuICAgIGhpbnQ6IHN0cmluZyA9IFwiUnVuICdzZW5kbHkgbG9naW4nIHRvIGF1dGhlbnRpY2F0ZSwgb3IgY2hlY2sgeW91ciBBUEkga2V5IHdpdGggJ3NlbmRseSBjb25maWcgc2hvdydcIixcbiAgKSB7XG4gICAgc3VwZXIoXCJhdXRoZW50aWNhdGlvbl9lcnJvclwiLCBtZXNzYWdlLCA0MDEsIHVuZGVmaW5lZCwgaGludCk7XG4gICAgdGhpcy5uYW1lID0gXCJBdXRoZW50aWNhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFwaUtleVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IFwiQVBJIGtleSByZXF1aXJlZCBmb3IgdGhpcyBvcGVyYXRpb24uXCIsXG4gICAgcHVibGljIGhpbnQ6IHN0cmluZyA9IFwiU2V0IFNFTkRMWV9BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGNyZWF0ZSBhIGtleSB3aXRoOiBzZW5kbHkga2V5cyBjcmVhdGUgLS10eXBlIHRlc3RcIixcbiAgKSB7XG4gICAgc3VwZXIoXCJhcGlfa2V5X3JlcXVpcmVkXCIsIG1lc3NhZ2UsIDQwMSk7XG4gICAgdGhpcy5uYW1lID0gXCJBcGlLZXlSZXF1aXJlZEVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdEVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmV0cnlBZnRlcjogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IFwiUmF0ZSBsaW1pdCBleGNlZWRlZFwiLFxuICApIHtcbiAgICBjb25zdCBoaW50ID0gYFdhaXQgJHtyZXRyeUFmdGVyfSBzZWNvbmRzIGJlZm9yZSByZXRyeWluZywgb3IgdXBncmFkZSB5b3VyIHBsYW4gZm9yIGhpZ2hlciBsaW1pdHNgO1xuICAgIHN1cGVyKFwicmF0ZV9saW1pdF9leGNlZWRlZFwiLCBtZXNzYWdlLCA0MjksIHVuZGVmaW5lZCwgaGludCk7XG4gICAgdGhpcy5uYW1lID0gXCJSYXRlTGltaXRFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnN1ZmZpY2llbnRDcmVkaXRzRXJyb3IgZXh0ZW5kcyBBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IFwiSW5zdWZmaWNpZW50IGNyZWRpdHNcIikge1xuICAgIGNvbnN0IGhpbnQgPVxuICAgICAgXCJDaGVjayB5b3VyIGJhbGFuY2Ugd2l0aCAnc2VuZGx5IGNyZWRpdHMnLCBvciBhZGQgY3JlZGl0cyBhdCBodHRwczovL3NlbmRseS5saXZlL2Rhc2hib2FyZC9iaWxsaW5nXCI7XG4gICAgc3VwZXIoXCJpbnN1ZmZpY2llbnRfY3JlZGl0c1wiLCBtZXNzYWdlLCA0MDIsIHVuZGVmaW5lZCwgaGludCk7XG4gICAgdGhpcy5uYW1lID0gXCJJbnN1ZmZpY2llbnRDcmVkaXRzRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nID0gXCJSZXNvdXJjZSBub3QgZm91bmRcIixcbiAgICBoaW50OiBzdHJpbmcgPSBcIlZlcmlmeSB0aGUgSUQgaXMgY29ycmVjdCwgb3IgdXNlIGEgbGlzdCBjb21tYW5kIHRvIHNlZSBhdmFpbGFibGUgcmVzb3VyY2VzXCIsXG4gICkge1xuICAgIHN1cGVyKFwibm90X2ZvdW5kXCIsIG1lc3NhZ2UsIDQwNCwgdW5kZWZpbmVkLCBoaW50KTtcbiAgICB0aGlzLm5hbWUgPSBcIk5vdEZvdW5kRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgPSBcIlZhbGlkYXRpb24gZmFpbGVkXCIsXG4gICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApIHtcbiAgICBjb25zdCBoaW50ID0gXCJDaGVjayB0aGUgY29tbWFuZCBoZWxwIHdpdGggLS1oZWxwIGZvciB2YWxpZCBvcHRpb25zIGFuZCBmb3JtYXRzXCI7XG4gICAgc3VwZXIoXCJ2YWxpZGF0aW9uX2Vycm9yXCIsIG1lc3NhZ2UsIDQwMCwgZGV0YWlscywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gXCJWYWxpZGF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG5jbGFzcyBBcGlDbGllbnQge1xuICBwcml2YXRlIHJhdGVMaW1pdEluZm8/OiBSYXRlTGltaXRJbmZvO1xuXG4gIHByaXZhdGUgZ2V0QmFzZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRDb25maWdWYWx1ZShcImJhc2VVcmxcIikgfHwgXCJodHRwczovL3NlbmRseS5saXZlXCI7XG4gIH1cblxuICBwcml2YXRlIGdldEhlYWRlcnMocmVxdWlyZUF1dGg6IGJvb2xlYW4gPSB0cnVlKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIFwiVXNlci1BZ2VudFwiOiBgQHNlbmRseS9jbGkvJHt2ZXJzaW9ufWAsXG4gICAgfTtcblxuICAgIGlmIChyZXF1aXJlQXV0aCkge1xuICAgICAgY29uc3QgdG9rZW4gPSBnZXRBdXRoVG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBib2R5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQ+O1xuICAgICAgcmVxdWlyZUF1dGg/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgeyBib2R5LCBxdWVyeSwgcmVxdWlyZUF1dGggPSB0cnVlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG1heFJldHJpZXMgPSBnZXRFZmZlY3RpdmVWYWx1ZShcIm1heFJldHJpZXNcIik7XG4gICAgY29uc3QgdGltZW91dCA9IGdldEVmZmVjdGl2ZVZhbHVlKFwidGltZW91dFwiKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7dGhpcy5nZXRCYXNlVXJsKCl9JHtwYXRofWApO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgT2JqZWN0LmVudHJpZXMocXVlcnkpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwudG9TdHJpbmcoKSwge1xuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmVxdWlyZUF1dGgpLFxuICAgICAgICAgIGJvZHk6IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICB9KTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICAvLyBVcGRhdGUgcmF0ZSBsaW1pdCBpbmZvXG4gICAgICAgIHRoaXMudXBkYXRlUmF0ZUxpbWl0SW5mbyhyZXNwb25zZS5oZWFkZXJzKTtcblxuICAgICAgICAvLyBQYXJzZSByZXNwb25zZVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlLnN0YXR1cywgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YSBhcyBUO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG5cbiAgICAgICAgLy8gRG9uJ3QgcmV0cnkgbm9uLXJldHJ5YWJsZSBlcnJvcnMgKDR4eCBjbGllbnQgZXJyb3JzKVxuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEb24ndCByZXRyeSBvbiBsYXN0IGF0dGVtcHRcbiAgICAgICAgaWYgKGF0dGVtcHQgPT09IG1heFJldHJpZXMpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmY6IDFzLCAycywgNHMsIGV0Yy5cbiAgICAgICAgY29uc3QgYmFja29mZk1zID0gTWF0aC5taW4oMTAwMCAqIE1hdGgucG93KDIsIGF0dGVtcHQpLCAxMDAwMCk7XG4gICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmZNcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUsIGJ1dCBUeXBlU2NyaXB0IG5lZWRzIHRoaXNcbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKFwiUmVxdWVzdCBmYWlsZWRcIik7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVJhdGVMaW1pdEluZm8oaGVhZGVyczogSGVhZGVycyk6IHZvaWQge1xuICAgIGNvbnN0IGxpbWl0ID0gaGVhZGVycy5nZXQoXCJYLVJhdGVMaW1pdC1MaW1pdFwiKTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzLmdldChcIlgtUmF0ZUxpbWl0LVJlbWFpbmluZ1wiKTtcbiAgICBjb25zdCByZXNldCA9IGhlYWRlcnMuZ2V0KFwiWC1SYXRlTGltaXQtUmVzZXRcIik7XG5cbiAgICBpZiAobGltaXQgJiYgcmVtYWluaW5nICYmIHJlc2V0KSB7XG4gICAgICB0aGlzLnJhdGVMaW1pdEluZm8gPSB7XG4gICAgICAgIGxpbWl0OiBwYXJzZUludChsaW1pdCwgMTApLFxuICAgICAgICByZW1haW5pbmc6IHBhcnNlSW50KHJlbWFpbmluZywgMTApLFxuICAgICAgICByZXNldDogcGFyc2VJbnQocmVzZXQsIDEwKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihzdGF0dXNDb2RlOiBudW1iZXIsIGRhdGE6IGFueSk6IG5ldmVyIHtcbiAgICBjb25zdCBlcnJvciA9IGRhdGE/LmVycm9yIHx8IFwidW5rbm93bl9lcnJvclwiO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBkYXRhPy5tZXNzYWdlIHx8IGBIVFRQICR7c3RhdHVzQ29kZX1gO1xuICAgIGNvbnN0IGRldGFpbHMgPSBkYXRhPy5kZXRhaWxzO1xuXG4gICAgc3dpdGNoIChzdGF0dXNDb2RlKSB7XG4gICAgICBjYXNlIDQwMTpcbiAgICAgIGNhc2UgNDAzOlxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhpcyBpcyBhbiBBUEkga2V5IHJlcXVpcmVkIGVycm9yIHZzIGdlbmVyYWwgYXV0aCBlcnJvclxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgPT09IFwiaW52YWxpZF9hcGlfa2V5XCIgfHxcbiAgICAgICAgICBlcnJvciA9PT0gXCJhcGlfa2V5X3JlcXVpcmVkXCIgfHxcbiAgICAgICAgICBtZXNzYWdlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpIGtleVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXBpS2V5UmVxdWlyZWRFcnJvcihcbiAgICAgICAgICAgIFwiQVBJIGtleSByZXF1aXJlZCBmb3Igc2VuZGluZyBtZXNzYWdlc1wiLFxuICAgICAgICAgICAgXCJTZXQgU0VORExZX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgY3JlYXRlIGEga2V5IHdpdGg6XFxuICBzZW5kbHkga2V5cyBjcmVhdGUgLS10eXBlIHRlc3RcIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSA0MDA6XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSwgZGV0YWlscyk7XG4gICAgICBjYXNlIDQwMjpcbiAgICAgICAgdGhyb3cgbmV3IEluc3VmZmljaWVudENyZWRpdHNFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgNDA0OlxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgNDI5OlxuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gZGF0YT8ucmV0cnlBZnRlciB8fCA2MDtcbiAgICAgICAgdGhyb3cgbmV3IFJhdGVMaW1pdEVycm9yKHJldHJ5QWZ0ZXIsIG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgZGVmYXVsdEhpbnQgPVxuICAgICAgICAgIHN0YXR1c0NvZGUgPj0gNTAwXG4gICAgICAgICAgICA/IFwiVGhpcyBpcyBhIHNlcnZlciBlcnJvci4gVHJ5IGFnYWluIGxhdGVyIG9yIGNoZWNrIGh0dHBzOi8vc3RhdHVzLnNlbmRseS5saXZlXCJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGRldGFpbHMsIGRlZmF1bHRIaW50KTtcbiAgICB9XG4gIH1cblxuICBnZXRSYXRlTGltaXRJbmZvKCk6IFJhdGVMaW1pdEluZm8gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJhdGVMaW1pdEluZm87XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSBtZXRob2RzXG4gIGFzeW5jIGdldDxUPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkPixcbiAgICByZXF1aXJlQXV0aDogYm9vbGVhbiA9IHRydWUsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oXCJHRVRcIiwgcGF0aCwgeyBxdWVyeSwgcmVxdWlyZUF1dGggfSk7XG4gIH1cblxuICBhc3luYyBwb3N0PFQ+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcmVxdWlyZUF1dGg6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KFwiUE9TVFwiLCBwYXRoLCB7IGJvZHksIHJlcXVpcmVBdXRoIH0pO1xuICB9XG5cbiAgYXN5bmMgcGF0Y2g8VD4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByZXF1aXJlQXV0aDogYm9vbGVhbiA9IHRydWUsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oXCJQQVRDSFwiLCBwYXRoLCB7IGJvZHksIHJlcXVpcmVBdXRoIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlPFQ+KHBhdGg6IHN0cmluZywgcmVxdWlyZUF1dGg6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihcIkRFTEVURVwiLCBwYXRoLCB7IHJlcXVpcmVBdXRoIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBhIGZpbGUgdXNpbmcgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgKiBVc2VkIGZvciBiYXRjaCBDU1YgdXBsb2FkcyB0byBTdXBhYmFzZSBzdG9yYWdlXG4gICAqL1xuICBhc3luYyB1cGxvYWRGaWxlPFQ+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBmaWxlOiB7XG4gICAgICBidWZmZXI6IEJ1ZmZlcjtcbiAgICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICBtaW1ldHlwZT86IHN0cmluZztcbiAgICB9LFxuICAgIHJlcXVpcmVBdXRoOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IGdldEVmZmVjdGl2ZVZhbHVlKFwibWF4UmV0cmllc1wiKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gZ2V0RWZmZWN0aXZlVmFsdWUoXCJ0aW1lb3V0XCIpO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QmFzZVVybCgpfSR7cGF0aH1gO1xuXG4gICAgLy8gQnVpbGQgbXVsdGlwYXJ0IGZvcm0gZGF0YSBtYW51YWxseSAoTm9kZS5qcyBjb21wYXRpYmxlKVxuICAgIGNvbnN0IGJvdW5kYXJ5ID0gYC0tLS1Gb3JtQm91bmRhcnkke0RhdGUubm93KCl9JHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMil9YDtcbiAgICBjb25zdCBtaW1ldHlwZSA9IGZpbGUubWltZXR5cGUgfHwgXCJ0ZXh0L2NzdlwiO1xuXG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmZyb20oXG4gICAgICBgLS0ke2JvdW5kYXJ5fVxcclxcbmAgK1xuICAgICAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmlsZVwiOyBmaWxlbmFtZT1cIiR7ZmlsZS5maWxlbmFtZX1cIlxcclxcbmAgK1xuICAgICAgICBgQ29udGVudC1UeXBlOiAke21pbWV0eXBlfVxcclxcblxcclxcbmAsXG4gICAgKTtcbiAgICBjb25zdCBmb290ZXIgPSBCdWZmZXIuZnJvbShgXFxyXFxuLS0ke2JvdW5kYXJ5fS0tXFxyXFxuYCk7XG4gICAgY29uc3QgYm9keSA9IEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgZmlsZS5idWZmZXIsIGZvb3Rlcl0pO1xuXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke2JvdW5kYXJ5fWAsXG4gICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgXCJVc2VyLUFnZW50XCI6IGBAc2VuZGx5L2NsaS8ke3ZlcnNpb259YCxcbiAgICB9O1xuXG4gICAgaWYgKHJlcXVpcmVBdXRoKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGdldEF1dGhUb2tlbigpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcigpO1xuICAgICAgfVxuICAgICAgaGVhZGVyc1tcIkF1dGhvcml6YXRpb25cIl0gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgICB9XG5cbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVSYXRlTGltaXRJbmZvKHJlc3BvbnNlLmhlYWRlcnMpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlLnN0YXR1cywgZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YSBhcyBUO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG5cbiAgICAgICAgaWYgKCFpc1JldHJ5YWJsZUVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF0dGVtcHQgPT09IG1heFJldHJpZXMpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhY2tvZmZNcyA9IE1hdGgubWluKDEwMDAgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSwgMTAwMDApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmTXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoXCJVcGxvYWQgZmFpbGVkXCIpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhcGlDbGllbnQgPSBuZXcgQXBpQ2xpZW50KCk7XG4iXX0=
@@ -5,7 +5,7 @@
5
5
  import { Command, Flags } from "@oclif/core";
6
6
  import { setOutputFormat, setQuietMode, error } from "./output.js";
7
7
  import { isAuthenticated } from "./config.js";
8
- import { ApiError, AuthenticationError, ApiKeyRequiredError, } from "./api-client.js";
8
+ import { ApiError, AuthenticationError, ApiKeyRequiredError, RateLimitError, InsufficientCreditsError, NotFoundError, ValidationError, } from "./api-client.js";
9
9
  export class BaseCommand extends Command {
10
10
  static baseFlags = {
11
11
  json: Flags.boolean({
@@ -36,14 +36,41 @@ export class BaseCommand extends Command {
36
36
  this.exit(1);
37
37
  }
38
38
  if (err instanceof AuthenticationError) {
39
- error("Not authenticated", {
40
- hint: "Run 'sendly login' to authenticate",
39
+ error(err.message, {
40
+ hint: err.hint,
41
+ });
42
+ this.exit(1);
43
+ }
44
+ if (err instanceof RateLimitError) {
45
+ error(err.message, {
46
+ "Retry after": `${err.retryAfter} seconds`,
47
+ hint: err.hint,
48
+ });
49
+ this.exit(1);
50
+ }
51
+ if (err instanceof InsufficientCreditsError) {
52
+ error(err.message, {
53
+ hint: err.hint,
54
+ });
55
+ this.exit(1);
56
+ }
57
+ if (err instanceof NotFoundError) {
58
+ error(err.message, {
59
+ hint: err.hint,
60
+ });
61
+ this.exit(1);
62
+ }
63
+ if (err instanceof ValidationError) {
64
+ error(err.message, {
65
+ hint: err.hint,
66
+ ...(err.details || {}),
41
67
  });
42
68
  this.exit(1);
43
69
  }
44
70
  if (err instanceof ApiError) {
45
71
  error(err.message, {
46
72
  code: err.code,
73
+ ...(err.hint && { hint: err.hint }),
47
74
  ...(err.details || {}),
48
75
  });
49
76
  this.exit(1);
@@ -63,4 +90,4 @@ export class AuthenticatedCommand extends BaseCommand {
63
90
  this.requireAuth();
64
91
  }
65
92
  }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb21tYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9iYXNlLWNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUNMLFFBQVEsRUFDUixtQkFBbUIsRUFDbkIsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsTUFBTSxPQUFnQixXQUFZLFNBQVEsT0FBTztJQUMvQyxNQUFNLENBQUMsU0FBUyxHQUFHO1FBQ2pCLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2xCLFdBQVcsRUFBRSx1QkFBdUI7WUFDcEMsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO1FBQ0YsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDbkIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsZ0JBQWdCO1lBQzdCLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNsQixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFpQyxDQUFDLENBQUM7UUFFM0UsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVTLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBVTtRQUM5QixJQUFJLEdBQUcsWUFBWSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNqQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7YUFDZixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksR0FBRyxZQUFZLG1CQUFtQixFQUFFLENBQUM7WUFDdkMsS0FBSyxDQUFDLG1CQUFtQixFQUFFO2dCQUN6QixJQUFJLEVBQUUsb0NBQW9DO2FBQzNDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxHQUFHLFlBQVksUUFBUSxFQUFFLENBQUM7WUFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDZCxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7UUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRVMsV0FBVztRQUNuQixJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQzs7QUFHSCxNQUFNLE9BQWdCLG9CQUFxQixTQUFRLFdBQVc7SUFDbEQsS0FBSyxDQUFDLElBQUk7UUFDbEIsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZSBDb21tYW5kIGNsYXNzIGZvciBhbGwgU2VuZGx5IENMSSBjb21tYW5kc1xuICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgYW5kIGZsYWdzXG4gKi9cblxuaW1wb3J0IHsgQ29tbWFuZCwgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IHNldE91dHB1dEZvcm1hdCwgc2V0UXVpZXRNb2RlLCBlcnJvciB9IGZyb20gXCIuL291dHB1dC5qc1wiO1xuaW1wb3J0IHsgaXNBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4vY29uZmlnLmpzXCI7XG5pbXBvcnQge1xuICBBcGlFcnJvcixcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbiAgQXBpS2V5UmVxdWlyZWRFcnJvcixcbn0gZnJvbSBcIi4vYXBpLWNsaWVudC5qc1wiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIGJhc2VGbGFncyA9IHtcbiAgICBqc29uOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk91dHB1dCBpbiBKU09OIGZvcm1hdFwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gICAgcXVpZXQ6IEZsYWdzLmJvb2xlYW4oe1xuICAgICAgY2hhcjogXCJxXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJNaW5pbWFsIG91dHB1dFwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gIH07XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuaW5pdCgpO1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUNvbW1hbmQpO1xuXG4gICAgaWYgKGZsYWdzLmpzb24pIHtcbiAgICAgIHNldE91dHB1dEZvcm1hdChcImpzb25cIik7XG4gICAgfVxuICAgIGlmIChmbGFncy5xdWlldCkge1xuICAgICAgc2V0UXVpZXRNb2RlKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjYXRjaChlcnI6IEVycm9yKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEFwaUtleVJlcXVpcmVkRXJyb3IpIHtcbiAgICAgIGVycm9yKGVyci5tZXNzYWdlLCB7XG4gICAgICAgIGhpbnQ6IGVyci5oaW50LFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0aW9uRXJyb3IpIHtcbiAgICAgIGVycm9yKFwiTm90IGF1dGhlbnRpY2F0ZWRcIiwge1xuICAgICAgICBoaW50OiBcIlJ1biAnc2VuZGx5IGxvZ2luJyB0byBhdXRoZW50aWNhdGVcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBcGlFcnJvcikge1xuICAgICAgZXJyb3IoZXJyLm1lc3NhZ2UsIHtcbiAgICAgICAgY29kZTogZXJyLmNvZGUsXG4gICAgICAgIC4uLihlcnIuZGV0YWlscyB8fCB7fSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBlcnJvcihlcnIubWVzc2FnZSk7XG4gICAgdGhpcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVBdXRoKCk6IHZvaWQge1xuICAgIGlmICghaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdXRoZW50aWNhdGVkQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgcHJvdGVjdGVkIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuaW5pdCgpO1xuICAgIHRoaXMucmVxdWlyZUF1dGgoKTtcbiAgfVxufVxuIl19
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb21tYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9iYXNlLWNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUNMLFFBQVEsRUFDUixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsYUFBYSxFQUNiLGVBQWUsR0FDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLE9BQWdCLFdBQVksU0FBUSxPQUFPO0lBQy9DLE1BQU0sQ0FBQyxTQUFTLEdBQUc7UUFDakIsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDbEIsV0FBVyxFQUFFLHVCQUF1QjtZQUNwQyxPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7UUFDRixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNuQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSxnQkFBZ0I7WUFDN0IsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2xCLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQWlDLENBQUMsQ0FBQztRQUUzRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMs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LENBQUM7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlIENvbW1hbmQgY2xhc3MgZm9yIGFsbCBTZW5kbHkgQ0xJIGNvbW1hbmRzXG4gKiBQcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eSBhbmQgZmxhZ3NcbiAqL1xuXG5pbXBvcnQgeyBDb21tYW5kLCBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgc2V0T3V0cHV0Rm9ybWF0LCBzZXRRdWlldE1vZGUsIGVycm9yIH0gZnJvbSBcIi4vb3V0cHV0LmpzXCI7XG5pbXBvcnQgeyBpc0F1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi9jb25maWcuanNcIjtcbmltcG9ydCB7XG4gIEFwaUVycm9yLFxuICBBdXRoZW50aWNhdGlvbkVycm9yLFxuICBBcGlLZXlSZXF1aXJlZEVycm9yLFxuICBSYXRlTGltaXRFcnJvcixcbiAgSW5zdWZmaWNpZW50Q3JlZGl0c0Vycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCIuL2FwaS1jbGllbnQuanNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBiYXNlRmxhZ3MgPSB7XG4gICAganNvbjogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBkZXNjcmlwdGlvbjogXCJPdXRwdXQgaW4gSlNPTiBmb3JtYXRcIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0pLFxuICAgIHF1aWV0OiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwicVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiTWluaW1hbCBvdXRwdXRcIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0pLFxuICB9O1xuXG4gIHByb3RlY3RlZCBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmluaXQoKTtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJhc2VDb21tYW5kKTtcblxuICAgIGlmIChmbGFncy5qc29uKSB7XG4gICAgICBzZXRPdXRwdXRGb3JtYXQoXCJqc29uXCIpO1xuICAgIH1cbiAgICBpZiAoZmxhZ3MucXVpZXQpIHtcbiAgICAgIHNldFF1aWV0TW9kZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2F0Y2goZXJyOiBFcnJvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBcGlLZXlSZXF1aXJlZEVycm9yKSB7XG4gICAgICBlcnJvcihlcnIubWVzc2FnZSwge1xuICAgICAgICBoaW50OiBlcnIuaGludCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBdXRoZW50aWNhdGlvbkVycm9yKSB7XG4gICAgICBlcnJvcihlcnIubWVzc2FnZSwge1xuICAgICAgICBoaW50OiBlcnIuaGludCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBSYXRlTGltaXRFcnJvcikge1xuICAgICAgZXJyb3IoZXJyLm1lc3NhZ2UsIHtcbiAgICAgICAgXCJSZXRyeSBhZnRlclwiOiBgJHtlcnIucmV0cnlBZnRlcn0gc2Vjb25kc2AsXG4gICAgICAgIGhpbnQ6IGVyci5oaW50LFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEluc3VmZmljaWVudENyZWRpdHNFcnJvcikge1xuICAgICAgZXJyb3IoZXJyLm1lc3NhZ2UsIHtcbiAgICAgICAgaGludDogZXJyLmhpbnQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikge1xuICAgICAgZXJyb3IoZXJyLm1lc3NhZ2UsIHtcbiAgICAgICAgaGludDogZXJyLmhpbnQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICBlcnJvcihlcnIubWVzc2FnZSwge1xuICAgICAgICBoaW50OiBlcnIuaGludCxcbiAgICAgICAgLi4uKGVyci5kZXRhaWxzIHx8IHt9KSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBcGlFcnJvcikge1xuICAgICAgZXJyb3IoZXJyLm1lc3NhZ2UsIHtcbiAgICAgICAgY29kZTogZXJyLmNvZGUsXG4gICAgICAgIC4uLihlcnIuaGludCAmJiB7IGhpbnQ6IGVyci5oaW50IH0pLFxuICAgICAgICAuLi4oZXJyLmRldGFpbHMgfHwge30pLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgIHRoaXMuZXhpdCgxKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlQXV0aCgpOiB2b2lkIHtcbiAgICBpZiAoIWlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcigpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXV0aGVudGljYXRlZENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHByb3RlY3RlZCBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmluaXQoKTtcbiAgICB0aGlzLnJlcXVpcmVBdXRoKCk7XG4gIH1cbn1cbiJdfQ==
@@ -18,6 +18,7 @@ export declare const colors: {
18
18
  dim: import("chalk").ChalkInstance;
19
19
  bold: import("chalk").ChalkInstance;
20
20
  code: import("chalk").ChalkInstance;
21
+ highlight: import("chalk").ChalkInstance;
21
22
  };
22
23
  export declare function success(message: string, data?: Record<string, unknown>): void;
23
24
  export declare function error(message: string, details?: Record<string, unknown>): void;
@@ -28,7 +29,7 @@ export interface TableColumn {
28
29
  header: string;
29
30
  key: string;
30
31
  width?: number;
31
- formatter?: (value: unknown) => string;
32
+ formatter?: (value: unknown, row?: Record<string, any>) => string;
32
33
  }
33
34
  export declare function table(data: Array<Record<string, any>>, columns: TableColumn[]): void;
34
35
  export declare function spinner(text: string): Ora;
@@ -39,5 +40,6 @@ export declare function formatCredits(credits: number): string;
39
40
  export declare function formatPhone(phone: string): string;
40
41
  export declare function header(title: string): void;
41
42
  export declare function divider(): void;
42
- export declare function keyValue(data: Record<string, unknown>): void;
43
+ export declare function keyValue(data: Record<string, unknown> | Array<[string, string | number]>): void;
44
+ export declare function detail(title: string, data: Record<string, unknown>): void;
43
45
  export declare function codeBlock(code: string, language?: string): void;
@@ -32,6 +32,7 @@ export const colors = {
32
32
  dim: chalk.dim,
33
33
  bold: chalk.bold,
34
34
  code: chalk.cyan,
35
+ highlight: chalk.bold.hex("#F59E0B"),
35
36
  };
36
37
  // Success output
37
38
  export function success(message, data) {
@@ -105,7 +106,7 @@ export function table(data, columns) {
105
106
  t.push(columns.map((col) => {
106
107
  const value = row[col.key];
107
108
  if (col.formatter) {
108
- return col.formatter(value);
109
+ return col.formatter(value, row);
109
110
  }
110
111
  return String(value ?? "-");
111
112
  }));
@@ -195,18 +196,30 @@ export function divider() {
195
196
  return;
196
197
  console.log();
197
198
  }
198
- // Key-value display
199
+ // Key-value display - accepts Record or array of [key, value] tuples
199
200
  export function keyValue(data) {
201
+ const entries = Array.isArray(data) ? data : Object.entries(data);
200
202
  if (isJsonMode()) {
201
- console.log(JSON.stringify(data, null, 2));
203
+ const obj = Array.isArray(data) ? Object.fromEntries(data) : data;
204
+ console.log(JSON.stringify(obj, null, 2));
202
205
  return;
203
206
  }
204
- const maxKeyLength = Math.max(...Object.keys(data).map((k) => k.length));
205
- Object.entries(data).forEach(([key, value]) => {
207
+ const maxKeyLength = Math.max(...entries.map(([k]) => k.length));
208
+ entries.forEach(([key, value]) => {
206
209
  const paddedKey = key.padEnd(maxKeyLength);
207
210
  console.log(` ${colors.dim(paddedKey)} ${value}`);
208
211
  });
209
212
  }
213
+ // Detail view with title and key-value pairs
214
+ export function detail(title, data) {
215
+ if (isJsonMode()) {
216
+ console.log(JSON.stringify({ title, ...data }, null, 2));
217
+ return;
218
+ }
219
+ console.log(colors.bold(title));
220
+ console.log();
221
+ keyValue(data);
222
+ }
210
223
  // Code block
211
224
  export function codeBlock(code, language) {
212
225
  if (isJsonMode()) {
@@ -219,4 +232,4 @@ export function codeBlock(code, language) {
219
232
  console.log(colors.dim("```"));
220
233
  console.log();
221
234
  }
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9vdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEdBQWlCLE1BQU0sS0FBSyxDQUFDO0FBS3BDLElBQUksYUFBYSxHQUFpQixPQUFPLENBQUM7QUFDMUMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBRXRCLE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBb0I7SUFDbEQsYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlO0lBQzdCLE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVTtJQUN4QixPQUFPLGFBQWEsS0FBSyxNQUFNLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXO0lBQ3pCLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTO0FBQ1QsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ3BCLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLDhCQUE4QjtJQUM3RCxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUs7SUFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHO0lBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTTtJQUNyQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7SUFDaEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO0lBQ2QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO0lBQ2hCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtDQUNqQixD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LEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPdXRwdXQgRm9ybWF0dGluZyBVdGlsaXRpZXNcbiAqIEhhbmRsZXMgaHVtYW4tcmVhZGFibGUgYW5kIEpTT04gb3V0cHV0IG1vZGVzXG4gKi9cblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCJjbGktdGFibGUzXCI7XG5pbXBvcnQgb3JhLCB7IHR5cGUgT3JhIH0gZnJvbSBcIm9yYVwiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnVmFsdWUgfSBmcm9tIFwiLi9jb25maWcuanNcIjtcblxuZXhwb3J0IHR5cGUgT3V0cHV0Rm9ybWF0ID0gXCJodW1hblwiIHwgXCJqc29uXCI7XG5cbmxldCBjdXJyZW50Rm9ybWF0OiBPdXRwdXRGb3JtYXQgPSBcImh1bWFuXCI7XG5sZXQgcXVpZXRNb2RlID0gZmFsc2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRPdXRwdXRGb3JtYXQoZm9ybWF0OiBPdXRwdXRGb3JtYXQpOiB2b2lkIHtcbiAgY3VycmVudEZvcm1hdCA9IGZvcm1hdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFF1aWV0TW9kZShxdWlldDogYm9vbGVhbik6IHZvaWQge1xuICBxdWlldE1vZGUgPSBxdWlldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE91dHB1dEZvcm1hdCgpOiBPdXRwdXRGb3JtYXQge1xuICByZXR1cm4gY3VycmVudEZvcm1hdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSnNvbk1vZGUoKTogYm9vbGVhbiB7XG4gIHJldHVybiBjdXJyZW50Rm9ybWF0ID09PSBcImpzb25cIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUXVpZXRNb2RlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcXVpZXRNb2RlO1xufVxuXG4vLyBDb2xvcnNcbmV4cG9ydCBjb25zdCBjb2xvcnMgPSB7XG4gIHByaW1hcnk6IGNoYWxrLmhleChcIiNGNTlFMEJcIiksIC8vIEFtYmVyL09yYW5nZSAtIFNlbmRseSBicmFuZFxuICBzdWNjZXNzOiBjaGFsay5ncmVlbixcbiAgZXJyb3I6IGNoYWxrLnJlZCxcbiAgd2FybmluZzogY2hhbGsueWVsbG93LFxuICBpbmZvOiBjaGFsay5ibHVlLFxuICBkaW06IGNoYWxrLmRpbSxcbiAgYm9sZDogY2hhbGsuYm9sZCxcbiAgY29kZTogY2hhbGsuY3lhbixcbn07XG5cbi8vIFN1Y2Nlc3Mgb3V0cHV0XG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiB0cnVlLCBtZXNzYWdlLCAuLi5kYXRhIH0sIG51bGwsIDIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocXVpZXRNb2RlKSB7XG4gICAgaWYgKGRhdGE/LmlkKSBjb25zb2xlLmxvZyhkYXRhLmlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLmxvZyhgJHtjb2xvcnMuc3VjY2VzcyhcIuKck1wiKX0gJHttZXNzYWdlfWApO1xuICBpZiAoZGF0YSkge1xuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtjb2xvcnMuZGltKGtleSArIFwiOlwiKX0gJHt2YWx1ZX1gKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBFcnJvciBvdXRwdXRcbmV4cG9ydCBmdW5jdGlvbiBlcnJvcihcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiB2b2lkIHtcbiAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IGVycm9yOiB0cnVlLCBtZXNzYWdlLCAuLi5kZXRhaWxzIH0sIG51bGwsIDIpLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc29sZS5lcnJvcihgJHtjb2xvcnMuZXJyb3IoXCLinJdcIil9ICR7bWVzc2FnZX1gKTtcbiAgaWYgKGRldGFpbHMgJiYgIXF1aWV0TW9kZSkge1xuICAgIE9iamVjdC5lbnRyaWVzKGRldGFpbHMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke2NvbG9ycy5kaW0oa2V5ICsgXCI6XCIpfSAke3ZhbHVlfWApO1xuICAgIH0pO1xuICB9XG59XG5cbi8vIFdhcm5pbmcgb3V0cHV0XG5leHBvcnQgZnVuY3Rpb24gd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGlzSnNvbk1vZGUoKSkgcmV0dXJuO1xuICBpZiAocXVpZXRNb2RlKSByZXR1cm47XG4gIGNvbnNvbGUubG9nKGAke2NvbG9ycy53YXJuaW5nKFwi4pqgXCIpfSAke21lc3NhZ2V9YCk7XG59XG5cbi8vIEluZm8gb3V0cHV0XG5leHBvcnQgZnVuY3Rpb24gaW5mbyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGlzSnNvbk1vZGUoKSkgcmV0dXJuO1xuICBpZiAocXVpZXRNb2RlKSByZXR1cm47XG4gIGNvbnNvbGUubG9nKGAke2NvbG9ycy5pbmZvKFwi4oS5XCIpfSAke21lc3NhZ2V9YCk7XG59XG5cbi8vIFByaW50IHJhdyBKU09OXG5leHBvcnQgZnVuY3Rpb24ganNvbihkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpKTtcbn1cblxuLy8gUHJpbnQgYSB0YWJsZVxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbHVtbiB7XG4gIGhlYWRlcjogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGZvcm1hdHRlcj86ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFibGUoXG4gIGRhdGE6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICBjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuKTogdm9pZCB7XG4gIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgaW5mbyhcIk5vIGRhdGEgdG8gZGlzcGxheVwiKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ID0gbmV3IFRhYmxlKHtcbiAgICBoZWFkOiBjb2x1bW5zLm1hcCgoYykgPT4gY29sb3JzLmJvbGQoYy5oZWFkZXIpKSxcbiAgICBzdHlsZToge1xuICAgICAgaGVhZDogW10sXG4gICAgICBib3JkZXI6IFtdLFxuICAgIH0sXG4gICAgY29sV2lkdGhzOiBjb2x1bW5zLm1hcCgoYykgPT4gYy53aWR0aCA/PyBudWxsKSxcbiAgfSk7XG5cbiAgZGF0YS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICB0LnB1c2goXG4gICAgICBjb2x1bW5zLm1hcCgoY29sKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbC5rZXldO1xuICAgICAgICBpZiAoY29sLmZvcm1hdHRlcikge1xuICAgICAgICAgIHJldHVybiBjb2wuZm9ybWF0dGVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlID8/IFwiLVwiKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH0pO1xuXG4gIGNvbnNvbGUubG9nKHQudG9TdHJpbmcoKSk7XG59XG5cbi8vIFNwaW5uZXIgZm9yIGxvbmcgb3BlcmF0aW9uc1xuZXhwb3J0IGZ1bmN0aW9uIHNwaW5uZXIodGV4dDogc3RyaW5nKTogT3JhIHtcbiAgaWYgKGlzSnNvbk1vZGUoKSB8fCBxdWlldE1vZGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6ICgpID0+ICh7IHN0b3A6ICgpID0+IHt9LCBzdWNjZWVkOiAoKSA9PiB7fSwgZmFpbDogKCkgPT4ge30gfSksXG4gICAgICBzdG9wOiAoKSA9PiB7fSxcbiAgICAgIHN1Y2NlZWQ6ICgpID0+IHt9LFxuICAgICAgZmFpbDogKCkgPT4ge30sXG4gICAgfSBhcyB1bmtub3duIGFzIE9yYTtcbiAgfVxuXG4gIHJldHVybiBvcmEoe1xuICAgIHRleHQsXG4gICAgY29sb3I6IFwieWVsbG93XCIsXG4gICAgc3Bpbm5lcjogXCJkb3RzXCIsXG4gIH0pO1xufVxuXG4vLyBTdGF0dXMgZm9ybWF0dGVyc1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAoc3RhdHVzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlIFwiZGVsaXZlcmVkXCI6XG4gICAgY2FzZSBcInN1Y2Nlc3NcIjpcbiAgICBjYXNlIFwiYWN0aXZlXCI6XG4gICAgY2FzZSBcInZlcmlmaWVkXCI6XG4gICAgICByZXR1cm4gY29sb3JzLnN1Y2Nlc3Moc3RhdHVzKTtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgY2FzZSBcImVycm9yXCI6XG4gICAgY2FzZSBcInJldm9rZWRcIjpcbiAgICBjYXNlIFwicmVqZWN0ZWRcIjpcbiAgICAgIHJldHVybiBjb2xvcnMuZXJyb3Ioc3RhdHVzKTtcbiAgICBjYXNlIFwicXVldWVkXCI6XG4gICAgY2FzZSBcInBlbmRpbmdcIjpcbiAgICBjYXNlIFwicHJvY2Vzc2luZ1wiOlxuICAgICAgcmV0dXJuIGNvbG9ycy53YXJuaW5nKHN0YXR1cyk7XG4gICAgY2FzZSBcInNlbnRcIjpcbiAgICAgIHJldHVybiBjb2xvcnMuaW5mbyhzdGF0dXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICB9XG59XG5cbi8vIEZvcm1hdCBkYXRlXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpO1xufVxuXG4vLyBGb3JtYXQgcmVsYXRpdmUgdGltZVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZShkYXRlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCBkaWZmID0gbm93LmdldFRpbWUoKSAtIGQuZ2V0VGltZSgpO1xuXG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLmZsb29yKGRpZmYgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKG1pbnV0ZXMgLyA2MCk7XG4gIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKGhvdXJzIC8gMjQpO1xuXG4gIGlmIChkYXlzID4gMCkgcmV0dXJuIGAke2RheXN9ZCBhZ29gO1xuICBpZiAoaG91cnMgPiAwKSByZXR1cm4gYCR7aG91cnN9aCBhZ29gO1xuICBpZiAobWludXRlcyA+IDApIHJldHVybiBgJHttaW51dGVzfW0gYWdvYDtcbiAgcmV0dXJuIGAke3NlY29uZHN9cyBhZ29gO1xufVxuXG4vLyBGb3JtYXQgY3JlZGl0c1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENyZWRpdHMoY3JlZGl0czogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NyZWRpdHMudG9Mb2NhbGVTdHJpbmcoKX0gY3JlZGl0c2A7XG59XG5cbi8vIEZvcm1hdCBwaG9uZSBudW1iZXJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQaG9uZShwaG9uZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbG9ycy5jb2RlKHBob25lKTtcbn1cblxuLy8gSGVhZGVyIGZvciBjb21tYW5kc1xuZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcih0aXRsZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChpc0pzb25Nb2RlKCkgfHwgcXVpZXRNb2RlKSByZXR1cm47XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKGNvbG9ycy5wcmltYXJ5KHRpdGxlKSkpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwi4pSAXCIucmVwZWF0KDQwKSkpO1xufVxuXG4vLyBEaXZpZGVyXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlcigpOiB2b2lkIHtcbiAgaWYgKGlzSnNvbk1vZGUoKSB8fCBxdWlldE1vZGUpIHJldHVybjtcbiAgY29uc29sZS5sb2coKTtcbn1cblxuLy8gS2V5LXZhbHVlIGRpc3BsYXlcbmV4cG9ydCBmdW5jdGlvbiBrZXlWYWx1ZShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1heEtleUxlbmd0aCA9IE1hdGgubWF4KC4uLk9iamVjdC5rZXlzKGRhdGEpLm1hcCgoaykgPT4gay5sZW5ndGgpKTtcblxuICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBwYWRkZWRLZXkgPSBrZXkucGFkRW5kKG1heEtleUxlbmd0aCk7XG4gICAgY29uc29sZS5sb2coYCAgJHtjb2xvcnMuZGltKHBhZGRlZEtleSl9ICAke3ZhbHVlfWApO1xuICB9KTtcbn1cblxuLy8gQ29kZSBibG9ja1xuZXhwb3J0IGZ1bmN0aW9uIGNvZGVCbG9jayhjb2RlOiBzdHJpbmcsIGxhbmd1YWdlPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGNvZGUsIGxhbmd1YWdlIH0sIG51bGwsIDIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiYGBgXCIgKyAobGFuZ3VhZ2UgfHwgXCJcIikpKTtcbiAgY29uc29sZS5sb2coY29sb3JzLmNvZGUoY29kZSkpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiYGBgXCIpKTtcbiAgY29uc29sZS5sb2coKTtcbn1cbiJdfQ==
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9vdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEdBQWlCLE1BQU0sS0FBSyxDQUFDO0FBS3BDLElBQUksYUFBYSxHQUFpQixPQUFPLENBQUM7QUFDMUMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBRXRCLE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBb0I7SUFDbEQsYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlO0lBQzdCLE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVTtJQUN4QixPQUFPLGFBQWEsS0FBSyxNQUFNLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXO0lBQ3pCLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTO0FBQ1QsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ3BCLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLDhCQUE4QjtJQUM3RCxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUs7SUFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHO0lBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTTtJQUNyQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7SUFDaEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO0lBQ2QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO0lBQ2hCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtJQUNoQixT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QUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPO0lBQ1QsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqQixDQUFDO0FBRUQsYUFBYTtBQUNiLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFBWSxFQUFFLFFBQWlCO0lBQ3ZELElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsT0FBTztJQUNULENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMvQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3V0cHV0IEZvcm1hdHRpbmcgVXRpbGl0aWVzXG4gKiBIYW5kbGVzIGh1bWFuLXJlYWRhYmxlIGFuZCBKU09OIG91dHB1dCBtb2Rlc1xuICovXG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwiY2xpLXRhYmxlM1wiO1xuaW1wb3J0IG9yYSwgeyB0eXBlIE9yYSB9IGZyb20gXCJvcmFcIjtcbmltcG9ydCB7IGdldENvbmZpZ1ZhbHVlIH0gZnJvbSBcIi4vY29uZmlnLmpzXCI7XG5cbmV4cG9ydCB0eXBlIE91dHB1dEZvcm1hdCA9IFwiaHVtYW5cIiB8IFwianNvblwiO1xuXG5sZXQgY3VycmVudEZvcm1hdDogT3V0cHV0Rm9ybWF0ID0gXCJodW1hblwiO1xubGV0IHF1aWV0TW9kZSA9IGZhbHNlO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0T3V0cHV0Rm9ybWF0KGZvcm1hdDogT3V0cHV0Rm9ybWF0KTogdm9pZCB7XG4gIGN1cnJlbnRGb3JtYXQgPSBmb3JtYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRRdWlldE1vZGUocXVpZXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgcXVpZXRNb2RlID0gcXVpZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRGb3JtYXQoKTogT3V0cHV0Rm9ybWF0IHtcbiAgcmV0dXJuIGN1cnJlbnRGb3JtYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0pzb25Nb2RlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY3VycmVudEZvcm1hdCA9PT0gXCJqc29uXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1F1aWV0TW9kZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHF1aWV0TW9kZTtcbn1cblxuLy8gQ29sb3JzXG5leHBvcnQgY29uc3QgY29sb3JzID0ge1xuICBwcmltYXJ5OiBjaGFsay5oZXgoXCIjRjU5RTBCXCIpLCAvLyBBbWJlci9PcmFuZ2UgLSBTZW5kbHkgYnJhbmRcbiAgc3VjY2VzczogY2hhbGsuZ3JlZW4sXG4gIGVycm9yOiBjaGFsay5yZWQsXG4gIHdhcm5pbmc6IGNoYWxrLnllbGxvdyxcbiAgaW5mbzogY2hhbGsuYmx1ZSxcbiAgZGltOiBjaGFsay5kaW0sXG4gIGJvbGQ6IGNoYWxrLmJvbGQsXG4gIGNvZGU6IGNoYWxrLmN5YW4sXG4gIGhpZ2hsaWdodDogY2hhbGsuYm9sZC5oZXgoXCIjRjU5RTBCXCIpLFxufTtcblxuLy8gU3VjY2VzcyBvdXRwdXRcbmV4cG9ydCBmdW5jdGlvbiBzdWNjZXNzKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIG1lc3NhZ2UsIC4uLmRhdGEgfSwgbnVsbCwgMikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChxdWlldE1vZGUpIHtcbiAgICBpZiAoZGF0YT8uaWQpIGNvbnNvbGUubG9nKGRhdGEuaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGAke2NvbG9ycy5zdWNjZXNzKFwi4pyTXCIpfSAke21lc3NhZ2V9YCk7XG4gIGlmIChkYXRhKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2NvbG9ycy5kaW0oa2V5ICsgXCI6XCIpfSAke3ZhbHVlfWApO1xuICAgIH0pO1xuICB9XG59XG5cbi8vIEVycm9yIG91dHB1dFxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yKFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IHZvaWQge1xuICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IHRydWUsIG1lc3NhZ2UsIC4uLmRldGFpbHMgfSwgbnVsbCwgMiksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGAke2NvbG9ycy5lcnJvcihcIuKcl1wiKX0gJHttZXNzYWdlfWApO1xuICBpZiAoZGV0YWlscyAmJiAhcXVpZXRNb2RlKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoZGV0YWlscykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGAgICR7Y29sb3JzLmRpbShrZXkgKyBcIjpcIil9ICR7dmFsdWV9YCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLy8gV2FybmluZyBvdXRwdXRcbmV4cG9ydCBmdW5jdGlvbiB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoaXNKc29uTW9kZSgpKSByZXR1cm47XG4gIGlmIChxdWlldE1vZGUpIHJldHVybjtcbiAgY29uc29sZS5sb2coYCR7Y29sb3JzLndhcm5pbmcoXCLimqBcIil9ICR7bWVzc2FnZX1gKTtcbn1cblxuLy8gSW5mbyBvdXRwdXRcbmV4cG9ydCBmdW5jdGlvbiBpbmZvKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoaXNKc29uTW9kZSgpKSByZXR1cm47XG4gIGlmIChxdWlldE1vZGUpIHJldHVybjtcbiAgY29uc29sZS5sb2coYCR7Y29sb3JzLmluZm8oXCLihLlcIil9ICR7bWVzc2FnZX1gKTtcbn1cblxuLy8gUHJpbnQgcmF3IEpTT05cbmV4cG9ydCBmdW5jdGlvbiBqc29uKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikpO1xufVxuXG4vLyBQcmludCBhIHRhYmxlXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQ29sdW1uIHtcbiAgaGVhZGVyOiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICB3aWR0aD86IG51bWJlcjtcbiAgZm9ybWF0dGVyPzogKHZhbHVlOiB1bmtub3duLCByb3c/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZShcbiAgZGF0YTogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4sXG4gIGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG4pOiB2b2lkIHtcbiAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICBpbmZvKFwiTm8gZGF0YSB0byBkaXNwbGF5XCIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHQgPSBuZXcgVGFibGUoe1xuICAgIGhlYWQ6IGNvbHVtbnMubWFwKChjKSA9PiBjb2xvcnMuYm9sZChjLmhlYWRlcikpLFxuICAgIHN0eWxlOiB7XG4gICAgICBoZWFkOiBbXSxcbiAgICAgIGJvcmRlcjogW10sXG4gICAgfSxcbiAgICBjb2xXaWR0aHM6IGNvbHVtbnMubWFwKChjKSA9PiBjLndpZHRoID8/IG51bGwpLFxuICB9KTtcblxuICBkYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgIHQucHVzaChcbiAgICAgIGNvbHVtbnMubWFwKChjb2wpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbY29sLmtleV07XG4gICAgICAgIGlmIChjb2wuZm9ybWF0dGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbC5mb3JtYXR0ZXIodmFsdWUsIHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSA/PyBcIi1cIik7XG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuICBjb25zb2xlLmxvZyh0LnRvU3RyaW5nKCkpO1xufVxuXG4vLyBTcGlubmVyIGZvciBsb25nIG9wZXJhdGlvbnNcbmV4cG9ydCBmdW5jdGlvbiBzcGlubmVyKHRleHQ6IHN0cmluZyk6IE9yYSB7XG4gIGlmIChpc0pzb25Nb2RlKCkgfHwgcXVpZXRNb2RlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiAoKSA9PiAoeyBzdG9wOiAoKSA9PiB7fSwgc3VjY2VlZDogKCkgPT4ge30sIGZhaWw6ICgpID0+IHt9IH0pLFxuICAgICAgc3RvcDogKCkgPT4ge30sXG4gICAgICBzdWNjZWVkOiAoKSA9PiB7fSxcbiAgICAgIGZhaWw6ICgpID0+IHt9LFxuICAgIH0gYXMgdW5rbm93biBhcyBPcmE7XG4gIH1cblxuICByZXR1cm4gb3JhKHtcbiAgICB0ZXh0LFxuICAgIGNvbG9yOiBcInllbGxvd1wiLFxuICAgIHNwaW5uZXI6IFwiZG90c1wiLFxuICB9KTtcbn1cblxuLy8gU3RhdHVzIGZvcm1hdHRlcnNcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdGF0dXMoc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHN0YXR1cy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSBcImRlbGl2ZXJlZFwiOlxuICAgIGNhc2UgXCJzdWNjZXNzXCI6XG4gICAgY2FzZSBcImFjdGl2ZVwiOlxuICAgIGNhc2UgXCJ2ZXJpZmllZFwiOlxuICAgICAgcmV0dXJuIGNvbG9ycy5zdWNjZXNzKHN0YXR1cyk7XG4gICAgY2FzZSBcImZhaWxlZFwiOlxuICAgIGNhc2UgXCJlcnJvclwiOlxuICAgIGNhc2UgXCJyZXZva2VkXCI6XG4gICAgY2FzZSBcInJlamVjdGVkXCI6XG4gICAgICByZXR1cm4gY29sb3JzLmVycm9yKHN0YXR1cyk7XG4gICAgY2FzZSBcInF1ZXVlZFwiOlxuICAgIGNhc2UgXCJwZW5kaW5nXCI6XG4gICAgY2FzZSBcInByb2Nlc3NpbmdcIjpcbiAgICAgIHJldHVybiBjb2xvcnMud2FybmluZyhzdGF0dXMpO1xuICAgIGNhc2UgXCJzZW50XCI6XG4gICAgICByZXR1cm4gY29sb3JzLmluZm8oc3RhdHVzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgfVxufVxuXG4vLyBGb3JtYXQgZGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTtcbn1cblxuLy8gRm9ybWF0IHJlbGF0aXZlIHRpbWVcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZVRpbWUoZGF0ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgY29uc3QgZGlmZiA9IG5vdy5nZXRUaW1lKCkgLSBkLmdldFRpbWUoKTtcblxuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihkaWZmIC8gMTAwMCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihtaW51dGVzIC8gNjApO1xuICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcihob3VycyAvIDI0KTtcblxuICBpZiAoZGF5cyA+IDApIHJldHVybiBgJHtkYXlzfWQgYWdvYDtcbiAgaWYgKGhvdXJzID4gMCkgcmV0dXJuIGAke2hvdXJzfWggYWdvYDtcbiAgaWYgKG1pbnV0ZXMgPiAwKSByZXR1cm4gYCR7bWludXRlc31tIGFnb2A7XG4gIHJldHVybiBgJHtzZWNvbmRzfXMgYWdvYDtcbn1cblxuLy8gRm9ybWF0IGNyZWRpdHNcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDcmVkaXRzKGNyZWRpdHM6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjcmVkaXRzLnRvTG9jYWxlU3RyaW5nKCl9IGNyZWRpdHNgO1xufVxuXG4vLyBGb3JtYXQgcGhvbmUgbnVtYmVyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGhvbmUocGhvbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb2xvcnMuY29kZShwaG9uZSk7XG59XG5cbi8vIEhlYWRlciBmb3IgY29tbWFuZHNcbmV4cG9ydCBmdW5jdGlvbiBoZWFkZXIodGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoaXNKc29uTW9kZSgpIHx8IHF1aWV0TW9kZSkgcmV0dXJuO1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChjb2xvcnMucHJpbWFyeSh0aXRsZSkpKTtcbiAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIuKUgFwiLnJlcGVhdCg0MCkpKTtcbn1cblxuLy8gRGl2aWRlclxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZXIoKTogdm9pZCB7XG4gIGlmIChpc0pzb25Nb2RlKCkgfHwgcXVpZXRNb2RlKSByZXR1cm47XG4gIGNvbnNvbGUubG9nKCk7XG59XG5cbi8vIEtleS12YWx1ZSBkaXNwbGF5IC0gYWNjZXB0cyBSZWNvcmQgb3IgYXJyYXkgb2YgW2tleSwgdmFsdWVdIHR1cGxlc1xuZXhwb3J0IGZ1bmN0aW9uIGtleVZhbHVlKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgQXJyYXk8W3N0cmluZywgc3RyaW5nIHwgbnVtYmVyXT4pOiB2b2lkIHtcbiAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogT2JqZWN0LmVudHJpZXMoZGF0YSk7XG5cbiAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgIGNvbnN0IG9iaiA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBPYmplY3QuZnJvbUVudHJpZXMoZGF0YSkgOiBkYXRhO1xuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1heEtleUxlbmd0aCA9IE1hdGgubWF4KC4uLmVudHJpZXMubWFwKChba10pID0+IGsubGVuZ3RoKSk7XG5cbiAgZW50cmllcy5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBwYWRkZWRLZXkgPSBrZXkucGFkRW5kKG1heEtleUxlbmd0aCk7XG4gICAgY29uc29sZS5sb2coYCAgJHtjb2xvcnMuZGltKHBhZGRlZEtleSl9ICAke3ZhbHVlfWApO1xuICB9KTtcbn1cblxuLy8gRGV0YWlsIHZpZXcgd2l0aCB0aXRsZSBhbmQga2V5LXZhbHVlIHBhaXJzXG5leHBvcnQgZnVuY3Rpb24gZGV0YWlsKHRpdGxlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IHRpdGxlLCAuLi5kYXRhIH0sIG51bGwsIDIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZCh0aXRsZSkpO1xuICBjb25zb2xlLmxvZygpO1xuICBrZXlWYWx1ZShkYXRhKTtcbn1cblxuLy8gQ29kZSBibG9ja1xuZXhwb3J0IGZ1bmN0aW9uIGNvZGVCbG9jayhjb2RlOiBzdHJpbmcsIGxhbmd1YWdlPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGNvZGUsIGxhbmd1YWdlIH0sIG51bGwsIDIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiYGBgXCIgKyAobGFuZ3VhZ2UgfHwgXCJcIikpKTtcbiAgY29uc29sZS5sb2coY29sb3JzLmNvZGUoY29kZSkpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiYGBgXCIpKTtcbiAgY29uc29sZS5sb2coKTtcbn1cbiJdfQ==