🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@sendly/cli

Package Overview
Dependencies
Maintainers
1
Versions
63
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sendly/cli - npm Package Compare versions

Comparing version
3.6.0
to
3.6.1
+15
-2
dist/commands/logout.js
import { BaseCommand } from "../lib/base-command.js";
import { logout } from "../lib/auth.js";
import { success, info } from "../lib/output.js";
import { isAuthenticated } from "../lib/config.js";
import { isAuthenticated, getAuthToken } from "../lib/config.js";
import { apiClient } from "../lib/api-client.js";
export default class Logout extends BaseCommand {

@@ -16,2 +17,14 @@ static description = "Log out of Sendly";

}
const token = getAuthToken();
// Revoke token server-side first (if it's a CLI session token)
if (token?.startsWith("cli_")) {
try {
await apiClient.post("/api/cli/auth/logout", {}, true);
}
catch {
// Continue with local logout even if server revocation fails
// This handles offline scenarios and ensures user can always logout
}
}
// Clear local credentials
logout();

@@ -21,2 +34,2 @@ success("Logged out successfully");

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nb3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2xvZ291dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5ELE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTyxTQUFRLFdBQVc7SUFDN0MsTUFBTSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztJQUV6QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUUvQyxNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxXQUFXLENBQUMsU0FBUztLQUN6QixDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sRUFBRSxDQUFDO1FBQ1QsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb21tYW5kIH0gZnJvbSBcIi4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGxvZ291dCB9IGZyb20gXCIuLi9saWIvYXV0aC5qc1wiO1xuaW1wb3J0IHsgc3VjY2VzcywgaW5mbyB9IGZyb20gXCIuLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQgeyBpc0F1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi4vbGliL2NvbmZpZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dvdXQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiTG9nIG91dCBvZiBTZW5kbHlcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXCI8JT0gY29uZmlnLmJpbiAlPiBsb2dvdXRcIl07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkJhc2VDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgaW5mbyhcIk5vdCBjdXJyZW50bHkgbG9nZ2VkIGluXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ291dCgpO1xuICAgIHN1Y2Nlc3MoXCJMb2dnZWQgb3V0IHN1Y2Nlc3NmdWxseVwiKTtcbiAgfVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nb3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2xvZ291dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFRLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsTUFBTSxDQUFDLE9BQU8sT0FBTyxNQUFPLFNBQVEsV0FBVztJQUM3QyxNQUFNLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDO0lBRXpDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLFdBQVcsQ0FBQyxTQUFTO0tBQ3pCLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFFN0IsK0RBQStEO1FBQy9ELElBQUksS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQztnQkFDSCxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsNkRBQTZEO2dCQUM3RCxvRUFBb0U7WUFDdEUsQ0FBQztRQUNILENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxFQUFFLENBQUM7UUFDVCxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvbW1hbmQgfSBmcm9tIFwiLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgbG9nb3V0IH0gZnJvbSBcIi4uL2xpYi9hdXRoLmpzXCI7XG5pbXBvcnQgeyBzdWNjZXNzLCBpbmZvLCB3YXJuIH0gZnJvbSBcIi4uL2xpYi9vdXRwdXQuanNcIjtcbmltcG9ydCB7IGlzQXV0aGVudGljYXRlZCwgZ2V0QXV0aFRva2VuIH0gZnJvbSBcIi4uL2xpYi9jb25maWcuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dvdXQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiTG9nIG91dCBvZiBTZW5kbHlcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXCI8JT0gY29uZmlnLmJpbiAlPiBsb2dvdXRcIl07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkJhc2VDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgaW5mbyhcIk5vdCBjdXJyZW50bHkgbG9nZ2VkIGluXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG5cbiAgICAvLyBSZXZva2UgdG9rZW4gc2VydmVyLXNpZGUgZmlyc3QgKGlmIGl0J3MgYSBDTEkgc2Vzc2lvbiB0b2tlbilcbiAgICBpZiAodG9rZW4/LnN0YXJ0c1dpdGgoXCJjbGlfXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhcGlDbGllbnQucG9zdChcIi9hcGkvY2xpL2F1dGgvbG9nb3V0XCIsIHt9LCB0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDb250aW51ZSB3aXRoIGxvY2FsIGxvZ291dCBldmVuIGlmIHNlcnZlciByZXZvY2F0aW9uIGZhaWxzXG4gICAgICAgIC8vIFRoaXMgaGFuZGxlcyBvZmZsaW5lIHNjZW5hcmlvcyBhbmQgZW5zdXJlcyB1c2VyIGNhbiBhbHdheXMgbG9nb3V0XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgbG9jYWwgY3JlZGVudGlhbHNcbiAgICBsb2dvdXQoKTtcbiAgICBzdWNjZXNzKFwiTG9nZ2VkIG91dCBzdWNjZXNzZnVsbHlcIik7XG4gIH1cbn1cbiJdfQ==
+1
-2

@@ -95,3 +95,2 @@ /**

const tokens = (await tokenResponse.json());
spin.succeed("Logged in successfully!");
// Store tokens

@@ -188,2 +187,2 @@ setAuthTokens(tokens.accessToken, tokens.refreshToken, tokens.expiresIn, tokens.userId, tokens.email);

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFFeEIsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUNMLGFBQWEsRUFDYixTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsRUFDZCxlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0I7QUFrQi9DOzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtBQUMzRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxLQUFLLEdBQUcsa0NBQWtDLENBQUMsQ0FBQywwQkFBMEI7SUFDNUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6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RCxDQUFDO0lBRUQsT0FBTztRQUNMLGFBQWEsRUFBRSxJQUFJO1FBQ25CLEtBQUs7UUFDTCxNQUFNO1FBQ04sV0FBVztRQUNYLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEVBQVU7SUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dGhlbnRpY2F0aW9uIHV0aWxpdGllcyBmb3IgQ0xJXG4gKiBIYW5kbGVzIGJyb3dzZXItYmFzZWQgbG9naW4gZmxvdyBhbmQgQVBJIGtleSBhdXRoZW50aWNhdGlvblxuICovXG5cbmltcG9ydCBvcGVuIGZyb20gXCJvcGVuXCI7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7XG4gIHNldEF1dGhUb2tlbnMsXG4gIHNldEFwaUtleSxcbiAgY2xlYXJBdXRoLFxuICBnZXRDb25maWdWYWx1ZSxcbiAgaXNBdXRoZW50aWNhdGVkLFxuICBnZXRBdXRoVG9rZW4sXG59IGZyb20gXCIuL2NvbmZpZy5qc1wiO1xuaW1wb3J0IHsgY29sb3JzLCBzcGlubmVyIH0gZnJvbSBcIi4vb3V0cHV0LmpzXCI7XG5cbmNvbnN0IFVTRVJfQ09ERV9MRU5HVEggPSA4O1xuY29uc3QgUE9MTF9JTlRFUlZBTCA9IDIwMDA7IC8vIDIgc2Vjb25kc1xuY29uc3QgTUFYX1BPTExfQVRURU1QVFMgPSAxNTA7IC8vIDUgbWludXRlcyBtYXhcblxuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VDb2RlUmVzcG9uc2Uge1xuICBkZXZpY2VDb2RlOiBzdHJpbmc7XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHZlcmlmaWNhdGlvblVybDogc3RyaW5nO1xuICBleHBpcmVzSW46IG51bWJlcjtcbiAgaW50ZXJ2YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlc3BvbnNlIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGV4cGlyZXNJbjogbnVtYmVyO1xuICB1c2VySWQ6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGxvbmcgcmFuZG9tIGRldmljZSBjb2RlIGZvciBVUkwgKHNlc3Npb24gaWRlbnRpZmllcilcbiAqIFRoaXMgZ29lcyBpbiB0aGUgVVJMIGFuZCBpZGVudGlmaWVzIHdoaWNoIENMSSBzZXNzaW9uIGlzIHdhaXRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlQ29kZSgpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZyhcImhleFwiKTsgLy8gMzIgY2hhcnMsIG5vdCBndWVzc2FibGVcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHNob3J0IGh1bWFuLXJlYWRhYmxlIHVzZXIgY29kZSBmb3IgdGVybWluYWwgZGlzcGxheVxuICogVGhpcyBpcyB3aGF0IHRoZSB1c2VyIHR5cGVzIHRvIHByb3ZlIHRoZXkgaGF2ZSB0ZXJtaW5hbCBhY2Nlc3NcbiAqIFVzZXMgY2hhcmFjdGVycyB0aGF0IGFyZSBlYXN5IHRvIHJlYWQgYW5kIHR5cGUgKG5vIDAvTywgMS9JL0wgY29uZnVzaW9uKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVVc2VyQ29kZSgpOiBzdHJpbmcge1xuICBjb25zdCBjaGFycyA9IFwiQUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaMjM0NTY3ODlcIjsgLy8gRXhjbHVkZSBjb25mdXNpbmcgY2hhcnNcbiAgbGV0IGNvZGUgPSBcIlwiO1xuICBjb25zdCBieXRlcyA9IGNyeXB0by5yYW5kb21CeXRlcyhVU0VSX0NPREVfTEVOR1RIKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBVU0VSX0NPREVfTEVOR1RIOyBpKyspIHtcbiAgICBjb2RlICs9IGNoYXJzW2J5dGVzW2ldICUgY2hhcnMubGVuZ3RoXTtcbiAgfVxuICByZXR1cm4gY29kZTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgYnJvd3Nlci1iYXNlZCBsb2dpbiBmbG93XG4gKlxuICogU2VjdXJpdHkgbW9kZWw6XG4gKiAtIGRldmljZUNvZGU6IExvbmcgcmFuZG9tIHRva2VuIGluIFVSTCwgaWRlbnRpZmllcyBDTEkgc2Vzc2lvbiAobm90IHNlY3JldClcbiAqIC0gdXNlckNvZGU6IFNob3J0IGNvZGUgc2hvd24gT05MWSBpbiB0ZXJtaW5hbCwgcHJvdmVzIHVzZXIgaGFzIHRlcm1pbmFsIGFjY2Vzc1xuICpcbiAqIFRoZSB1c2VyQ29kZSBpcyBORVZFUiBpbiB0aGUgVVJMIC0gdGhpcyBpcyBjcml0aWNhbCBmb3Igc2VjdXJpdHkuXG4gKiBBbnlvbmUgd2l0aCB0aGUgVVJMIGNhbid0IGF1dGhvcml6ZSB3aXRob3V0IGFsc28gc2VlaW5nIHRoZSB0ZXJtaW5hbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJyb3dzZXJMb2dpbigpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgY29uc3QgYmFzZVVybCA9IGdldENvbmZpZ1ZhbHVlKFwiYmFzZVVybFwiKSB8fCBcImh0dHBzOi8vc2VuZGx5LmxpdmVcIjtcblxuICAvLyBHZW5lcmF0ZSBUV08gU0VQQVJBVEUgY29kZXMgZm9yIHNlY3VyaXR5XG4gIGNvbnN0IGRldmljZUNvZGUgPSBnZW5lcmF0ZURldmljZUNvZGUoKTsgLy8gTG9uZyByYW5kb20sIGdvZXMgaW4gVVJMXG4gIGNvbnN0IHVzZXJDb2RlID0gZ2VuZXJhdGVVc2VyQ29kZSgpOyAvLyBTaG9ydCByZWFkYWJsZSwgc2hvd24gaW4gdGVybWluYWwgb25seVxuXG4gIC8vIFJlcXVlc3QgZGV2aWNlIGNvZGUgcmVnaXN0cmF0aW9uIGZyb20gc2VydmVyXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL2NsaS9hdXRoL2RldmljZS1jb2RlYCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGV2aWNlQ29kZSwgdXNlckNvZGUgfSksIC8vIFNlbmQgYm90aCB0byBzZXJ2ZXJcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGVycm9yID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKSkgYXMge1xuICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICB9O1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGluaXRpYXRlIGxvZ2luXCIpO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIERldmljZUNvZGVSZXNwb25zZTtcblxuICAvLyBGb3JtYXQgdXNlciBjb2RlIHdpdGggaHlwaGVuIGZvciByZWFkYWJpbGl0eSAoZS5nLiwgXCJBQkNELUVGR0hcIilcbiAgY29uc3QgZGlzcGxheVVzZXJDb2RlID0gYCR7dXNlckNvZGUuc2xpY2UoMCwgNCl9LSR7dXNlckNvZGUuc2xpY2UoNCl9YDtcblxuICAvLyBEaXNwbGF5IGluc3RydWN0aW9ucyB0byB1c2VyXG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiTG9naW4gdG8gU2VuZGx5XCIpKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coYE9wZW4gdGhpcyBVUkwgaW4geW91ciBicm93c2VyOmApO1xuICBjb25zb2xlLmxvZyhjb2xvcnMucHJpbWFyeShgICAke2RhdGEudmVyaWZpY2F0aW9uVXJsfWApKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coYEFuZCBlbnRlciB0aGlzIGNvZGU6YCk7XG4gIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKGNvbG9ycy5wcmltYXJ5KGAgICR7ZGlzcGxheVVzZXJDb2RlfWApKSk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgLy8gVHJ5IHRvIG9wZW4gYnJvd3NlciBhdXRvbWF0aWNhbGx5XG4gIHRyeSB7XG4gICAgYXdhaXQgb3BlbihkYXRhLnZlcmlmaWNhdGlvblVybCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIkJyb3dzZXIgb3BlbmVkIGF1dG9tYXRpY2FsbHlcIikpO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiUGxlYXNlIG9wZW4gdGhlIFVSTCBtYW51YWxseVwiKSk7XG4gIH1cblxuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIFBvbGwgZm9yIHRva2VuXG4gIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiV2FpdGluZyBmb3IgYXV0aG9yaXphdGlvbi4uLlwiKTtcbiAgc3Bpbi5zdGFydCgpO1xuXG4gIGxldCBhdHRlbXB0cyA9IDA7XG4gIHdoaWxlIChhdHRlbXB0cyA8IE1BWF9QT0xMX0FUVEVNUFRTKSB7XG4gICAgYXdhaXQgc2xlZXAoZGF0YS5pbnRlcnZhbCAqIDEwMDAgfHwgUE9MTF9JTlRFUlZBTCk7XG4gICAgYXR0ZW1wdHMrKztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL2NsaS9hdXRoL3Rva2VuYCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZGV2aWNlQ29kZSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodG9rZW5SZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSAoYXdhaXQgdG9rZW5SZXNwb25zZS5qc29uKCkpIGFzIFRva2VuUmVzcG9uc2U7XG4gICAgICAgIHNwaW4uc3VjY2VlZChcIkxvZ2dlZCBpbiBzdWNjZXNzZnVsbHkhXCIpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRva2Vuc1xuICAgICAgICBzZXRBdXRoVG9rZW5zKFxuICAgICAgICAgIHRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgIHRva2Vucy5leHBpcmVzSW4sXG4gICAgICAgICAgdG9rZW5zLnVzZXJJZCxcbiAgICAgICAgICB0b2tlbnMuZW1haWwsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbmV3IHVzZXIgbmVlZHMgcXVpY2stc3RhcnQgKG9ubHkgZm9yIENMSSBzZXNzaW9ucylcbiAgICAgICAgaWYgKHRva2Vucy5hY2Nlc3NUb2tlbi5zdGFydHNXaXRoKFwiY2xpX1wiKSkge1xuICAgICAgICAgIGNvbnN0IHsgc2hvdWxkT2ZmZXJRdWlja1N0YXJ0LCBvZmZlclF1aWNrU3RhcnQgfSA9XG4gICAgICAgICAgICBhd2FpdCBpbXBvcnQoXCIuL29uYm9hcmRpbmcuanNcIik7XG5cbiAgICAgICAgICBpZiAoYXdhaXQgc2hvdWxkT2ZmZXJRdWlja1N0YXJ0KCkpIHtcbiAgICAgICAgICAgIGF3YWl0IG9mZmVyUXVpY2tTdGFydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IChhd2FpdCB0b2tlblJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKSkgYXMge1xuICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09IFwiYXV0aG9yaXphdGlvbl9wZW5kaW5nXCIpIHtcbiAgICAgICAgLy8gU3RpbGwgd2FpdGluZywgY29udGludWUgcG9sbGluZ1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yRGF0YS5lcnJvciA9PT0gXCJleHBpcmVkX3Rva2VuXCIpIHtcbiAgICAgICAgc3Bpbi5mYWlsKFwiTG9naW4gcmVxdWVzdCBleHBpcmVkXCIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09IFwiYWNjZXNzX2RlbmllZFwiKSB7XG4gICAgICAgIHNwaW4uZmFpbChcIkxvZ2luIHdhcyBkZW5pZWRcIik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTmV0d29yayBlcnJvciwgY29udGludWUgcG9sbGluZ1xuICAgIH1cbiAgfVxuXG4gIHNwaW4uZmFpbChcIkxvZ2luIHRpbWVkIG91dFwiKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG4vKipcbiAqIExvZ2luIHdpdGggYW4gQVBJIGtleSBkaXJlY3RseVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBpS2V5TG9naW4oYXBpS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFzZVVybCA9IGdldENvbmZpZ1ZhbHVlKFwiYmFzZVVybFwiKSB8fCBcImh0dHBzOi8vc2VuZGx5LmxpdmVcIjtcblxuICAvLyBWYWxpZGF0ZSB0aGUgQVBJIGtleSB3aXRoIHRoZSBzZXJ2ZXJcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9hcGkvY2xpL2F1dGgvdmVyaWZ5LWtleWAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IChhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkpIGFzIHtcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBcIkludmFsaWQgQVBJIGtleVwiKTtcbiAgfVxuXG4gIC8vIFN0b3JlIHRoZSBBUEkga2V5XG4gIHNldEFwaUtleShhcGlLZXkpO1xufVxuXG4vKipcbiAqIExvZ291dCAtIGNsZWFyIGFsbCBzdG9yZWQgY3JlZGVudGlhbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ291dCgpOiB2b2lkIHtcbiAgY2xlYXJBdXRoKCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXV0aCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzQXV0aGVudGljYXRlZCgpO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IGF1dGggaW5mbyBmb3IgZGlzcGxheVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aEluZm8oKTogUHJvbWlzZTx7XG4gIGF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG4gIGVtYWlsPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIGtleVR5cGU/OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gIGNvbnN0IGVtYWlsID0gZ2V0Q29uZmlnVmFsdWUoXCJlbWFpbFwiKTtcbiAgY29uc3QgdXNlcklkID0gZ2V0Q29uZmlnVmFsdWUoXCJ1c2VySWRcIik7XG4gIGNvbnN0IGFwaUtleSA9IGdldENvbmZpZ1ZhbHVlKFwiYXBpS2V5XCIpO1xuICBjb25zdCBlbnZpcm9ubWVudCA9IGdldENvbmZpZ1ZhbHVlKFwiZW52aXJvbm1lbnRcIik7XG5cbiAgaWYgKCF0b2tlbiAmJiAhYXBpS2V5KSB7XG4gICAgcmV0dXJuIHsgYXV0aGVudGljYXRlZDogZmFsc2UsIGVudmlyb25tZW50IH07XG4gIH1cblxuICBsZXQga2V5VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoYXBpS2V5KSB7XG4gICAga2V5VHlwZSA9IGFwaUtleS5zdGFydHNXaXRoKFwic2tfdGVzdF9cIikgPyBcInRlc3RcIiA6IFwibGl2ZVwiO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgIGVtYWlsLFxuICAgIHVzZXJJZCxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBrZXlUeXBlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFFeEIsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUNMLGFBQWEsRUFDYixTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsRUFDZCxlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0I7QUFrQi9DOzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtBQUMzRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxLQUFLLEdBQUcsa0NBQWtDLENBQUMsQ0FBQywwQkFBMEI7SUFDNUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6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QUFLO1FBQ0wsTUFBTTtRQUNOLFdBQVc7UUFDWCxPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxFQUFVO0lBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoZW50aWNhdGlvbiB1dGlsaXRpZXMgZm9yIENMSVxuICogSGFuZGxlcyBicm93c2VyLWJhc2VkIGxvZ2luIGZsb3cgYW5kIEFQSSBrZXkgYXV0aGVudGljYXRpb25cbiAqL1xuXG5pbXBvcnQgb3BlbiBmcm9tIFwib3BlblwiO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQge1xuICBzZXRBdXRoVG9rZW5zLFxuICBzZXRBcGlLZXksXG4gIGNsZWFyQXV0aCxcbiAgZ2V0Q29uZmlnVmFsdWUsXG4gIGlzQXV0aGVudGljYXRlZCxcbiAgZ2V0QXV0aFRva2VuLFxufSBmcm9tIFwiLi9jb25maWcuanNcIjtcbmltcG9ydCB7IGNvbG9ycywgc3Bpbm5lciB9IGZyb20gXCIuL291dHB1dC5qc1wiO1xuXG5jb25zdCBVU0VSX0NPREVfTEVOR1RIID0gODtcbmNvbnN0IFBPTExfSU5URVJWQUwgPSAyMDAwOyAvLyAyIHNlY29uZHNcbmNvbnN0IE1BWF9QT0xMX0FUVEVNUFRTID0gMTUwOyAvLyA1IG1pbnV0ZXMgbWF4XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlQ29kZVJlc3BvbnNlIHtcbiAgZGV2aWNlQ29kZTogc3RyaW5nO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICB2ZXJpZmljYXRpb25Vcmw6IHN0cmluZztcbiAgZXhwaXJlc0luOiBudW1iZXI7XG4gIGludGVydmFsOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXNwb25zZSB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICBleHBpcmVzSW46IG51bWJlcjtcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBsb25nIHJhbmRvbSBkZXZpY2UgY29kZSBmb3IgVVJMIChzZXNzaW9uIGlkZW50aWZpZXIpXG4gKiBUaGlzIGdvZXMgaW4gdGhlIFVSTCBhbmQgaWRlbnRpZmllcyB3aGljaCBDTEkgc2Vzc2lvbiBpcyB3YWl0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZURldmljZUNvZGUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7IC8vIDMyIGNoYXJzLCBub3QgZ3Vlc3NhYmxlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBzaG9ydCBodW1hbi1yZWFkYWJsZSB1c2VyIGNvZGUgZm9yIHRlcm1pbmFsIGRpc3BsYXlcbiAqIFRoaXMgaXMgd2hhdCB0aGUgdXNlciB0eXBlcyB0byBwcm92ZSB0aGV5IGhhdmUgdGVybWluYWwgYWNjZXNzXG4gKiBVc2VzIGNoYXJhY3RlcnMgdGhhdCBhcmUgZWFzeSB0byByZWFkIGFuZCB0eXBlIChubyAwL08sIDEvSS9MIGNvbmZ1c2lvbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVXNlckNvZGUoKTogc3RyaW5nIHtcbiAgY29uc3QgY2hhcnMgPSBcIkFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWjIzNDU2Nzg5XCI7IC8vIEV4Y2x1ZGUgY29uZnVzaW5nIGNoYXJzXG4gIGxldCBjb2RlID0gXCJcIjtcbiAgY29uc3QgYnl0ZXMgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoVVNFUl9DT0RFX0xFTkdUSCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgVVNFUl9DT0RFX0xFTkdUSDsgaSsrKSB7XG4gICAgY29kZSArPSBjaGFyc1tieXRlc1tpXSAlIGNoYXJzLmxlbmd0aF07XG4gIH1cbiAgcmV0dXJuIGNvZGU7XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIGJyb3dzZXItYmFzZWQgbG9naW4gZmxvd1xuICpcbiAqIFNlY3VyaXR5IG1vZGVsOlxuICogLSBkZXZpY2VDb2RlOiBMb25nIHJhbmRvbSB0b2tlbiBpbiBVUkwsIGlkZW50aWZpZXMgQ0xJIHNlc3Npb24gKG5vdCBzZWNyZXQpXG4gKiAtIHVzZXJDb2RlOiBTaG9ydCBjb2RlIHNob3duIE9OTFkgaW4gdGVybWluYWwsIHByb3ZlcyB1c2VyIGhhcyB0ZXJtaW5hbCBhY2Nlc3NcbiAqXG4gKiBUaGUgdXNlckNvZGUgaXMgTkVWRVIgaW4gdGhlIFVSTCAtIHRoaXMgaXMgY3JpdGljYWwgZm9yIHNlY3VyaXR5LlxuICogQW55b25lIHdpdGggdGhlIFVSTCBjYW4ndCBhdXRob3JpemUgd2l0aG91dCBhbHNvIHNlZWluZyB0aGUgdGVybWluYWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBicm93c2VyTG9naW4oKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gIGNvbnN0IGJhc2VVcmwgPSBnZXRDb25maWdWYWx1ZShcImJhc2VVcmxcIikgfHwgXCJodHRwczovL3NlbmRseS5saXZlXCI7XG5cbiAgLy8gR2VuZXJhdGUgVFdPIFNFUEFSQVRFIGNvZGVzIGZvciBzZWN1cml0eVxuICBjb25zdCBkZXZpY2VDb2RlID0gZ2VuZXJhdGVEZXZpY2VDb2RlKCk7IC8vIExvbmcgcmFuZG9tLCBnb2VzIGluIFVSTFxuICBjb25zdCB1c2VyQ29kZSA9IGdlbmVyYXRlVXNlckNvZGUoKTsgLy8gU2hvcnQgcmVhZGFibGUsIHNob3duIGluIHRlcm1pbmFsIG9ubHlcblxuICAvLyBSZXF1ZXN0IGRldmljZSBjb2RlIHJlZ2lzdHJhdGlvbiBmcm9tIHNlcnZlclxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9jbGkvYXV0aC9kZXZpY2UtY29kZWAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRldmljZUNvZGUsIHVzZXJDb2RlIH0pLCAvLyBTZW5kIGJvdGggdG8gc2VydmVyXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IChhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkpIGFzIHtcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBpbml0aWF0ZSBsb2dpblwiKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBEZXZpY2VDb2RlUmVzcG9uc2U7XG5cbiAgLy8gRm9ybWF0IHVzZXIgY29kZSB3aXRoIGh5cGhlbiBmb3IgcmVhZGFiaWxpdHkgKGUuZy4sIFwiQUJDRC1FRkdIXCIpXG4gIGNvbnN0IGRpc3BsYXlVc2VyQ29kZSA9IGAke3VzZXJDb2RlLnNsaWNlKDAsIDQpfS0ke3VzZXJDb2RlLnNsaWNlKDQpfWA7XG5cbiAgLy8gRGlzcGxheSBpbnN0cnVjdGlvbnMgdG8gdXNlclxuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChcIkxvZ2luIHRvIFNlbmRseVwiKSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGBPcGVuIHRoaXMgVVJMIGluIHlvdXIgYnJvd3NlcjpgKTtcbiAgY29uc29sZS5sb2coY29sb3JzLnByaW1hcnkoYCAgJHtkYXRhLnZlcmlmaWNhdGlvblVybH1gKSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGBBbmQgZW50ZXIgdGhpcyBjb2RlOmApO1xuICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChjb2xvcnMucHJpbWFyeShgICAke2Rpc3BsYXlVc2VyQ29kZX1gKSkpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIC8vIFRyeSB0byBvcGVuIGJyb3dzZXIgYXV0b21hdGljYWxseVxuICB0cnkge1xuICAgIGF3YWl0IG9wZW4oZGF0YS52ZXJpZmljYXRpb25VcmwpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJCcm93c2VyIG9wZW5lZCBhdXRvbWF0aWNhbGx5XCIpKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlBsZWFzZSBvcGVuIHRoZSBVUkwgbWFudWFsbHlcIikpO1xuICB9XG5cbiAgY29uc29sZS5sb2coKTtcblxuICAvLyBQb2xsIGZvciB0b2tlblxuICBjb25zdCBzcGluID0gc3Bpbm5lcihcIldhaXRpbmcgZm9yIGF1dGhvcml6YXRpb24uLi5cIik7XG4gIHNwaW4uc3RhcnQoKTtcblxuICBsZXQgYXR0ZW1wdHMgPSAwO1xuICB3aGlsZSAoYXR0ZW1wdHMgPCBNQVhfUE9MTF9BVFRFTVBUUykge1xuICAgIGF3YWl0IHNsZWVwKGRhdGEuaW50ZXJ2YWwgKiAxMDAwIHx8IFBPTExfSU5URVJWQUwpO1xuICAgIGF0dGVtcHRzKys7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9jbGkvYXV0aC90b2tlbmAsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRldmljZUNvZGUgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRva2VuUmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gKGF3YWl0IHRva2VuUmVzcG9uc2UuanNvbigpKSBhcyBUb2tlblJlc3BvbnNlO1xuXG4gICAgICAgIC8vIFN0b3JlIHRva2Vuc1xuICAgICAgICBzZXRBdXRoVG9rZW5zKFxuICAgICAgICAgIHRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgIHRva2Vucy5leHBpcmVzSW4sXG4gICAgICAgICAgdG9rZW5zLnVzZXJJZCxcbiAgICAgICAgICB0b2tlbnMuZW1haWwsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbmV3IHVzZXIgbmVlZHMgcXVpY2stc3RhcnQgKG9ubHkgZm9yIENMSSBzZXNzaW9ucylcbiAgICAgICAgaWYgKHRva2Vucy5hY2Nlc3NUb2tlbi5zdGFydHNXaXRoKFwiY2xpX1wiKSkge1xuICAgICAgICAgIGNvbnN0IHsgc2hvdWxkT2ZmZXJRdWlja1N0YXJ0LCBvZmZlclF1aWNrU3RhcnQgfSA9XG4gICAgICAgICAgICBhd2FpdCBpbXBvcnQoXCIuL29uYm9hcmRpbmcuanNcIik7XG5cbiAgICAgICAgICBpZiAoYXdhaXQgc2hvdWxkT2ZmZXJRdWlja1N0YXJ0KCkpIHtcbiAgICAgICAgICAgIGF3YWl0IG9mZmVyUXVpY2tTdGFydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IChhd2FpdCB0b2tlblJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKSkgYXMge1xuICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09IFwiYXV0aG9yaXphdGlvbl9wZW5kaW5nXCIpIHtcbiAgICAgICAgLy8gU3RpbGwgd2FpdGluZywgY29udGludWUgcG9sbGluZ1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yRGF0YS5lcnJvciA9PT0gXCJleHBpcmVkX3Rva2VuXCIpIHtcbiAgICAgICAgc3Bpbi5mYWlsKFwiTG9naW4gcmVxdWVzdCBleHBpcmVkXCIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09IFwiYWNjZXNzX2RlbmllZFwiKSB7XG4gICAgICAgIHNwaW4uZmFpbChcIkxvZ2luIHdhcyBkZW5pZWRcIik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTmV0d29yayBlcnJvciwgY29udGludWUgcG9sbGluZ1xuICAgIH1cbiAgfVxuXG4gIHNwaW4uZmFpbChcIkxvZ2luIHRpbWVkIG91dFwiKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG4vKipcbiAqIExvZ2luIHdpdGggYW4gQVBJIGtleSBkaXJlY3RseVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBpS2V5TG9naW4oYXBpS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFzZVVybCA9IGdldENvbmZpZ1ZhbHVlKFwiYmFzZVVybFwiKSB8fCBcImh0dHBzOi8vc2VuZGx5LmxpdmVcIjtcblxuICAvLyBWYWxpZGF0ZSB0aGUgQVBJIGtleSB3aXRoIHRoZSBzZXJ2ZXJcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9hcGkvY2xpL2F1dGgvdmVyaWZ5LWtleWAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvciA9IChhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkpIGFzIHtcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBcIkludmFsaWQgQVBJIGtleVwiKTtcbiAgfVxuXG4gIC8vIFN0b3JlIHRoZSBBUEkga2V5XG4gIHNldEFwaUtleShhcGlLZXkpO1xufVxuXG4vKipcbiAqIExvZ291dCAtIGNsZWFyIGFsbCBzdG9yZWQgY3JlZGVudGlhbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ291dCgpOiB2b2lkIHtcbiAgY2xlYXJBdXRoKCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXV0aCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzQXV0aGVudGljYXRlZCgpO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IGF1dGggaW5mbyBmb3IgZGlzcGxheVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aEluZm8oKTogUHJvbWlzZTx7XG4gIGF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG4gIGVtYWlsPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIGtleVR5cGU/OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gIGNvbnN0IGVtYWlsID0gZ2V0Q29uZmlnVmFsdWUoXCJlbWFpbFwiKTtcbiAgY29uc3QgdXNlcklkID0gZ2V0Q29uZmlnVmFsdWUoXCJ1c2VySWRcIik7XG4gIGNvbnN0IGFwaUtleSA9IGdldENvbmZpZ1ZhbHVlKFwiYXBpS2V5XCIpO1xuICBjb25zdCBlbnZpcm9ubWVudCA9IGdldENvbmZpZ1ZhbHVlKFwiZW52aXJvbm1lbnRcIik7XG5cbiAgaWYgKCF0b2tlbiAmJiAhYXBpS2V5KSB7XG4gICAgcmV0dXJuIHsgYXV0aGVudGljYXRlZDogZmFsc2UsIGVudmlyb25tZW50IH07XG4gIH1cblxuICBsZXQga2V5VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoYXBpS2V5KSB7XG4gICAga2V5VHlwZSA9IGFwaUtleS5zdGFydHNXaXRoKFwic2tfdGVzdF9cIikgPyBcInRlc3RcIiA6IFwibGl2ZVwiO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgIGVtYWlsLFxuICAgIHVzZXJJZCxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBrZXlUeXBlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuIl19

@@ -12,2 +12,3 @@ /**

* - SENDLY_MAX_RETRIES: Max retry attempts (default: 3)
* - SENDLY_CONFIG_KEY: Custom encryption key (for CI/CD)
* - CI: Auto-detect CI mode (disables interactive prompts)

@@ -14,0 +15,0 @@ */

@@ -12,2 +12,3 @@ /**

* - SENDLY_MAX_RETRIES: Max retry attempts (default: 3)
* - SENDLY_CONFIG_KEY: Custom encryption key (for CI/CD)
* - CI: Auto-detect CI mode (disables interactive prompts)

@@ -19,2 +20,3 @@ */

import * as os from "node:os";
import * as crypto from "node:crypto";
/**

@@ -42,22 +44,113 @@ * Check if running in CI environment

const CONFIG_FILE = "config.json";
// Ensure config directory exists
// Old default key - used for migration only
const OLD_DEFAULT_KEY = "sendly-cli-default-key-v1";
/**
* Derive a machine-specific encryption key.
* This ensures each installation has a unique key that can't be easily guessed.
*
* The key is derived from machine-specific identifiers that are:
* - Unique per machine
* - Stable across sessions
* - Not publicly known
*/
function deriveEncryptionKey() {
const machineId = [os.hostname(), os.userInfo().username, os.homedir()].join(":");
return crypto
.createHash("sha256")
.update(`sendly:${machineId}:v2`)
.digest("hex");
}
/**
* Get the encryption key to use for config.
* Priority: SENDLY_CONFIG_KEY env var > machine-derived key
*/
function getEncryptionKey() {
// Explicit key takes precedence (for CI/CD, testing, advanced users)
if (process.env.SENDLY_CONFIG_KEY) {
return process.env.SENDLY_CONFIG_KEY;
}
return deriveEncryptionKey();
}
// Ensure config directory exists with secure permissions
if (!fs.existsSync(CONFIG_DIR)) {
fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
}
const config = new Conf({
projectName: "sendly",
cwd: CONFIG_DIR,
configName: "config",
defaults: {
environment: "test",
baseUrl: "https://sendly.live",
defaultFormat: "human",
colorEnabled: true,
timeout: 30000,
maxRetries: 3,
},
// Encrypt sensitive data
encryptionKey: process.env.SENDLY_CONFIG_KEY || "sendly-cli-default-key-v1",
});
const DEFAULT_CONFIG = {
environment: "test",
baseUrl: "https://sendly.live",
defaultFormat: "human",
colorEnabled: true,
timeout: 30000,
maxRetries: 3,
};
/**
* Initialize config with automatic migration from old encryption key.
* This ensures existing users don't lose their credentials.
*/
function initializeConfig() {
const newKey = getEncryptionKey();
// Try to initialize with new key first
try {
const newConfig = new Conf({
projectName: "sendly",
cwd: CONFIG_DIR,
configName: "config",
defaults: DEFAULT_CONFIG,
encryptionKey: newKey,
});
// Try to read a value to verify decryption works
newConfig.get("environment");
return newConfig;
}
catch {
// New key didn't work - try migration from old key
}
// Migration: Try to read with old default key
try {
const oldConfig = new Conf({
projectName: "sendly",
cwd: CONFIG_DIR,
configName: "config",
defaults: DEFAULT_CONFIG,
encryptionKey: OLD_DEFAULT_KEY,
});
// Read all data with old key
const oldData = { ...oldConfig.store };
const hasData = Object.keys(oldData).some((k) => !Object.keys(DEFAULT_CONFIG).includes(k) ||
oldData[k] !==
DEFAULT_CONFIG[k]);
if (hasData) {
// Clear old config file
oldConfig.clear();
// Create new config with new key
const newConfig = new Conf({
projectName: "sendly",
cwd: CONFIG_DIR,
configName: "config",
defaults: DEFAULT_CONFIG,
encryptionKey: newKey,
});
// Restore data with new encryption
for (const [key, value] of Object.entries(oldData)) {
if (value !== undefined) {
newConfig.set(key, value);
}
}
return newConfig;
}
}
catch {
// Old key also didn't work - corrupted or fresh install
}
// Fresh install or corrupted - start with new key
return new Conf({
projectName: "sendly",
cwd: CONFIG_DIR,
configName: "config",
defaults: DEFAULT_CONFIG,
encryptionKey: newKey,
});
}
const config = initializeConfig();
/**
* Get effective config value with environment variable override

@@ -185,2 +278,2 @@ * Priority: env var > config file > default

export { config };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBd0I5Qjs7R0FFRztBQUNILE1BQU0sVUFBVSxJQUFJO0lBQ2xCLE9BQU8sQ0FBQyxDQUFDLENBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0I7UUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO1FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUztRQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxDQUFDLENBQUMsQ0FDUCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWU7UUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FDNUIsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN0RCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFFbEMsaUNBQWlDO0FBQ2pDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUs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QztJQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhO0lBQzNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZO0lBQzFCLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENMSSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnRcbiAqIFN0b3JlcyB1c2VyIHByZWZlcmVuY2VzIGFuZCBjcmVkZW50aWFscyBpbiB+Ly5zZW5kbHkvXG4gKlxuICogRW52aXJvbm1lbnQgVmFyaWFibGVzICh0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb25maWcgZmlsZSk6XG4gKiAtIFNFTkRMWV9BUElfS0VZOiBBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvblxuICogLSBTRU5ETFlfQkFTRV9VUkw6IEN1c3RvbSBBUEkgZW5kcG9pbnRcbiAqIC0gU0VORExZX09VVFBVVF9GT1JNQVQ6IERlZmF1bHQgb3V0cHV0IGZvcm1hdCAoaHVtYW4vanNvbilcbiAqIC0gU0VORExZX05PX0NPTE9SOiBEaXNhYmxlIGNvbG9yZWQgb3V0cHV0IChhbnkgdmFsdWUpXG4gKiAtIFNFTkRMWV9USU1FT1VUOiBSZXF1ZXN0IHRpbWVvdXQgaW4gbXMgKGRlZmF1bHQ6IDMwMDAwKVxuICogLSBTRU5ETFlfTUFYX1JFVFJJRVM6IE1heCByZXRyeSBhdHRlbXB0cyAoZGVmYXVsdDogMylcbiAqIC0gQ0k6IEF1dG8tZGV0ZWN0IENJIG1vZGUgKGRpc2FibGVzIGludGVyYWN0aXZlIHByb21wdHMpXG4gKi9cblxuaW1wb3J0IENvbmYgZnJvbSBcImNvbmZcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZGx5Q29uZmlnIHtcbiAgLy8gQXV0aGVudGljYXRpb25cbiAgYXBpS2V5Pzogc3RyaW5nO1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nO1xuICB0b2tlbkV4cGlyZXNBdD86IG51bWJlcjtcbiAgdXNlcklkPzogc3RyaW5nO1xuICBlbWFpbD86IHN0cmluZztcblxuICAvLyBFbnZpcm9ubWVudFxuICBlbnZpcm9ubWVudDogXCJ0ZXN0XCIgfCBcImxpdmVcIjtcbiAgYmFzZVVybDogc3RyaW5nO1xuXG4gIC8vIFByZWZlcmVuY2VzXG4gIGRlZmF1bHRGb3JtYXQ6IFwiaHVtYW5cIiB8IFwianNvblwiO1xuICBjb2xvckVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgLy8gTmV0d29ya1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIG1heFJldHJpZXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBydW5uaW5nIGluIENJIGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NJKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEoXG4gICAgcHJvY2Vzcy5lbnYuQ0kgfHxcbiAgICBwcm9jZXNzLmVudi5DT05USU5VT1VTX0lOVEVHUkFUSU9OIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX0FDVElPTlMgfHxcbiAgICBwcm9jZXNzLmVudi5HSVRMQUJfQ0kgfHxcbiAgICBwcm9jZXNzLmVudi5DSVJDTEVDSSB8fFxuICAgIHByb2Nlc3MuZW52LlRSQVZJUyB8fFxuICAgIHByb2Nlc3MuZW52LkJVSUxES0lURVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGNvbG9yIG91dHB1dCBpcyBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xvckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEoXG4gICAgcHJvY2Vzcy5lbnYuU0VORExZX05PX0NPTE9SIHx8XG4gICAgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgfHxcbiAgICBwcm9jZXNzLmVudi5URVJNID09PSBcImR1bWJcIlxuICApO1xufVxuXG5jb25zdCBDT05GSUdfRElSID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgXCIuc2VuZGx5XCIpO1xuY29uc3QgQ09ORklHX0ZJTEUgPSBcImNvbmZpZy5qc29uXCI7XG5cbi8vIEVuc3VyZSBjb25maWcgZGlyZWN0b3J5IGV4aXN0c1xuaWYgKCFmcy5leGlzdHNTeW5jKENPTkZJR19ESVIpKSB7XG4gIGZzLm1rZGlyU3luYyhDT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgbW9kZTogMG83MDAgfSk7XG59XG5cbmNvbnN0IGNvbmZpZyA9IG5ldyBDb25mPFNlbmRseUNvbmZpZz4oe1xuICBwcm9qZWN0TmFtZTogXCJzZW5kbHlcIixcbiAgY3dkOiBDT05GSUdfRElSLFxuICBjb25maWdOYW1lOiBcImNvbmZpZ1wiLFxuICBkZWZhdWx0czoge1xuICAgIGVudmlyb25tZW50OiBcInRlc3RcIixcbiAgICBiYXNlVXJsOiBcImh0dHBzOi8vc2VuZGx5LmxpdmVcIixcbiAgICBkZWZhdWx0Rm9ybWF0OiBcImh1bWFuXCIsXG4gICAgY29sb3JFbmFibGVkOiB0cnVlLFxuICAgIHRpbWVvdXQ6IDMwMDAwLFxuICAgIG1heFJldHJpZXM6IDMsXG4gIH0sXG4gIC8vIEVuY3J5cHQgc2Vuc2l0aXZlIGRhdGFcbiAgZW5jcnlwdGlvbktleTogcHJvY2Vzcy5lbnYuU0VORExZX0NPTkZJR19LRVkgfHwgXCJzZW5kbHktY2xpLWRlZmF1bHQta2V5LXYxXCIsXG59KTtcblxuLyoqXG4gKiBHZXQgZWZmZWN0aXZlIGNvbmZpZyB2YWx1ZSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlXG4gKiBQcmlvcml0eTogZW52IHZhciA+IGNvbmZpZyBmaWxlID4gZGVmYXVsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWZmZWN0aXZlVmFsdWU8SyBleHRlbmRzIGtleW9mIFNlbmRseUNvbmZpZz4oXG4gIGtleTogSyxcbik6IFNlbmRseUNvbmZpZ1tLXSB7XG4gIC8vIEVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlc1xuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgXCJhcGlLZXlcIjpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VORExZX0FQSV9LRVkgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImJhc2VVcmxcIjpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQkFTRV9VUkwpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlNFTkRMWV9CQVNFX1VSTCBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiZGVmYXVsdEZvcm1hdFwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9PVVRQVVRfRk9STUFUKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHByb2Nlc3MuZW52LlNFTkRMWV9PVVRQVVRfRk9STUFULnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwianNvblwiIHx8IGZvcm1hdCA9PT0gXCJodW1hblwiKSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdCBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjb2xvckVuYWJsZWRcIjpcbiAgICAgIGlmIChpc0NvbG9yRGlzYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2UgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRpbWVvdXRcIjpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfVElNRU9VVCkge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuU0VORExZX1RJTUVPVVQsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTih0aW1lb3V0KSAmJiB0aW1lb3V0ID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aW1lb3V0IGFzIFNlbmRseUNvbmZpZ1tLXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm1heFJldHJpZXNcIjpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgY29uc3QgcmV0cmllcyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LlNFTkRMWV9NQVhfUkVUUklFUywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHJldHJpZXMpICYmIHJldHJpZXMgPj0gMCkge1xuICAgICAgICAgIHJldHVybiByZXRyaWVzIGFzIFNlbmRseUNvbmZpZ1tLXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gY29uZmlnIGZpbGUgdmFsdWVcbiAgcmV0dXJuIGNvbmZpZy5nZXQoa2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZygpOiBTZW5kbHlDb25maWcge1xuICByZXR1cm4gY29uZmlnLnN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29uZmlnPEsgZXh0ZW5kcyBrZXlvZiBTZW5kbHlDb25maWc+KFxuICBrZXk6IEssXG4gIHZhbHVlOiBTZW5kbHlDb25maWdbS10sXG4pOiB2b2lkIHtcbiAgY29uZmlnLnNldChrZXksIHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ1ZhbHVlPEsgZXh0ZW5kcyBrZXlvZiBTZW5kbHlDb25maWc+KFxuICBrZXk6IEssXG4pOiBTZW5kbHlDb25maWdbS10ge1xuICByZXR1cm4gY29uZmlnLmdldChrZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWcoKTogdm9pZCB7XG4gIGNvbmZpZy5jbGVhcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJBdXRoKCk6IHZvaWQge1xuICBjb25maWcuZGVsZXRlKFwiYXBpS2V5XCIpO1xuICBjb25maWcuZGVsZXRlKFwiYWNjZXNzVG9rZW5cIik7XG4gIGNvbmZpZy5kZWxldGUoXCJyZWZyZXNoVG9rZW5cIik7XG4gIGNvbmZpZy5kZWxldGUoXCJ0b2tlbkV4cGlyZXNBdFwiKTtcbiAgY29uZmlnLmRlbGV0ZShcInVzZXJJZFwiKTtcbiAgY29uZmlnLmRlbGV0ZShcImVtYWlsXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAvLyBDaGVjayBlbnYgdmFyIGZpcnN0XG4gIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3QgYXBpS2V5ID0gY29uZmlnLmdldChcImFwaUtleVwiKTtcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBjb25maWcuZ2V0KFwiYWNjZXNzVG9rZW5cIik7XG4gIHJldHVybiAhIShhcGlLZXkgfHwgYWNjZXNzVG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXV0aFRva2VuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIEVudmlyb25tZW50IHZhcmlhYmxlIHRha2VzIGhpZ2hlc3QgcHJlY2VkZW5jZVxuICBpZiAocHJvY2Vzcy5lbnYuU0VORExZX0FQSV9LRVkpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VORExZX0FQSV9LRVk7XG4gIH1cblxuICAvLyBUaGVuIHN0b3JlZCBBUEkga2V5XG4gIGNvbnN0IGFwaUtleSA9IGNvbmZpZy5nZXQoXCJhcGlLZXlcIik7XG4gIGlmIChhcGlLZXkpIHJldHVybiBhcGlLZXk7XG5cbiAgLy8gRmluYWxseSwgYWNjZXNzIHRva2VuIChpZiBub3QgZXhwaXJlZClcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBjb25maWcuZ2V0KFwiYWNjZXNzVG9rZW5cIik7XG4gIGNvbnN0IGV4cGlyZXNBdCA9IGNvbmZpZy5nZXQoXCJ0b2tlbkV4cGlyZXNBdFwiKTtcblxuICBpZiAoYWNjZXNzVG9rZW4gJiYgZXhwaXJlc0F0ICYmIERhdGUubm93KCkgPCBleHBpcmVzQXQpIHtcbiAgICByZXR1cm4gYWNjZXNzVG9rZW47XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXBpS2V5KGFwaUtleTogc3RyaW5nKTogdm9pZCB7XG4gIC8vIFZhbGlkYXRlIEFQSSBrZXkgZm9ybWF0XG4gIGlmICghL15za18odGVzdHxsaXZlKV92MV9bYS16QS1aMC05Xy1dKyQvLnRlc3QoYXBpS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiSW52YWxpZCBBUEkga2V5IGZvcm1hdC4gRXhwZWN0ZWQgc2tfdGVzdF92MV94eHggb3Igc2tfbGl2ZV92MV94eHhcIixcbiAgICApO1xuICB9XG5cbiAgY29uZmlnLnNldChcImFwaUtleVwiLCBhcGlLZXkpO1xuXG4gIC8vIFNldCBlbnZpcm9ubWVudCBiYXNlZCBvbiBrZXkgdHlwZVxuICBpZiAoYXBpS2V5LnN0YXJ0c1dpdGgoXCJza190ZXN0X1wiKSkge1xuICAgIGNvbmZpZy5zZXQoXCJlbnZpcm9ubWVudFwiLCBcInRlc3RcIik7XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnLnNldChcImVudmlyb25tZW50XCIsIFwibGl2ZVwiKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXV0aFRva2VucyhcbiAgYWNjZXNzVG9rZW46IHN0cmluZyxcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gIGV4cGlyZXNJbjogbnVtYmVyLFxuICB1c2VySWQ6IHN0cmluZyxcbiAgZW1haWw6IHN0cmluZyxcbik6IHZvaWQge1xuICBjb25maWcuc2V0KFwiYWNjZXNzVG9rZW5cIiwgYWNjZXNzVG9rZW4pO1xuICBjb25maWcuc2V0KFwicmVmcmVzaFRva2VuXCIsIHJlZnJlc2hUb2tlbik7XG4gIGNvbmZpZy5zZXQoXCJ0b2tlbkV4cGlyZXNBdFwiLCBEYXRlLm5vdygpICsgZXhwaXJlc0luICogMTAwMCk7XG4gIGNvbmZpZy5zZXQoXCJ1c2VySWRcIiwgdXNlcklkKTtcbiAgY29uZmlnLnNldChcImVtYWlsXCIsIGVtYWlsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ1BhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihDT05GSUdfRElSLCBDT05GSUdfRklMRSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdEaXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIENPTkZJR19ESVI7XG59XG5cbmV4cG9ydCB7IGNvbmZpZyB9O1xuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVILE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQXdCdEM7O0dBRUc7QUFDSCxNQUFNLFVBQVUsSUFBSTtJQUNsQixPQUFPLENBQUMsQ0FBQyxDQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCO1FBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztRQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVM7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTtRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDdEIsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlO0lBQzdCLE9BQU8sQ0FBQyxDQUFDLENBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlO1FBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxNQUFNLENBQzVCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdEQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDO0FBRWxDLDRDQUE0QztBQUM1QyxNQUFNLGVBQWUsR0FBRywyQkFBMkIsQ0FBQztBQUVwRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsbUJBQW1CO0lBQzFCLE1BQU0sU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUMxRSxHQUFHLENBQ0osQ0FBQztJQUVGLE9BQU8sTUFBTTtTQUNWLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDcEIsTUFBTSxDQUFDLFVBQVUsU0FBUyxLQUFLLENBQUM7U0FDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQjtJQUN2QixxRUFBcUU7SUFDckUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLG1CQUFtQixFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVELHlEQUF5RDtBQUN6RCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO0lBQy9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxjQUFjLEdBQWlCO0lBQ25DLFdBQVcsRUFBRSxNQUFNO0lBQ25CLE9BQU8sRUFBRSxxQkFBcUI7SUFDOUIsYUFBYSxFQUFFLE9BQU87SUFDdEIsWUFBWSxFQUFFLElBQUk7SUFDbEIsT0FBTyxFQUFFLEtBQUs7SUFDZCxVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQjtJQUN2QixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBRWxDLHVDQUF1QztJQUN2QyxJQUFJLENBQUM7UUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBZTtZQUN2QyxXQUFXLEVBQUUsUUFBUTtZQUNyQixHQUFHLEVBQUUsVUFBVTtZQUNmLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLGFBQWEsRUFBRSxNQUFNO1NBQ3RCLENBQUMsQ0FBQztRQUVILGlEQUFpRDtRQUNqRCxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxtREFBbUQ7SUFDckQsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxJQUFJLENBQUM7UUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBZTtZQUN2QyxXQUFXLEVBQUUsUUFBUTtZQUNyQixHQUFHLEVBQUUsVUFBVTtZQUNmLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLGFBQWEsRUFBRSxlQUFlO1NBQy9CLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUN2QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDeEMsT0FBTyxDQUFDLENBQXVCLENBQUM7Z0JBQzlCLGNBQWMsQ0FBQyxDQUF1QixDQUFDLENBQzVDLENBQUM7UUFFRixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osd0JBQXdCO1lBQ3hCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVsQixpQ0FBaUM7WUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQWU7Z0JBQ3ZDLFdBQVcsRUFBRSxRQUFRO2dCQUNyQixHQUFHLEVBQUUsVUFBVTtnQkFDZixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGFBQWEsRUFBRSxNQUFNO2FBQ3RCLENBQUMsQ0FBQztZQUVILG1DQUFtQztZQUNuQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDeEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asd0RBQXdEO0lBQzFELENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsT0FBTyxJQUFJLElBQUksQ0FBZTtRQUM1QixXQUFXLEVBQUUsUUFBUTtRQUNyQixHQUFHLEVBQUUsVUFBVTtRQUNmLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFFBQVEsRUFBRSxjQUFjO1FBQ3hCLGFBQWEsRUFBRSxNQUFNO0tBQ3RCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBRWxDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsR0FBTTtJQUVOLGlDQUFpQztJQUNqQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ1osS0FBSyxRQUFRO1lBQ1gsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBaUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0QsTUFBTTtRQUNSLEtBQUssU0FBUztZQUNaLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWtDLENBQUM7WUFDeEQsQ0FBQztZQUNELE1BQU07UUFDUixLQUFLLGVBQWU7WUFDbEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlELElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQzVDLE9BQU8sTUFBeUIsQ0FBQztnQkFDbkMsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNO1FBQ1IsS0FBSyxjQUFjO1lBQ2pCLElBQUksZUFBZSxFQUFFLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxLQUF3QixDQUFDO1lBQ2xDLENBQUM7WUFDRCxNQUFNO1FBQ1IsS0FBSyxTQUFTO1lBQ1osSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNuQyxPQUFPLE9BQTBCLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTTtRQUNSLEtBQUssWUFBWTtZQUNmLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLE9BQU8sT0FBMEIsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNO0lBQ1YsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTO0lBQ3ZCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsR0FBTSxFQUNOLEtBQXNCO0lBRXRCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUM1QixHQUFNO0lBRU4sT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVztJQUN6QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDakIsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTO0lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlO0lBQzdCLHNCQUFzQjtJQUN0QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVk7SUFDMUIsZ0RBQWdEO0lBQ2hELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUUxQix5Q0FBeUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFL0MsSUFBSSxXQUFXLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUN2RCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBYztJQUN0QywwQkFBMEI7SUFDMUIsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQ2IsbUVBQW1FLENBQ3BFLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFN0Isb0NBQW9DO0lBQ3BDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUMzQixXQUFtQixFQUNuQixZQUFvQixFQUNwQixTQUFpQixFQUNqQixNQUFjLEVBQ2QsS0FBYTtJQUViLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWE7SUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVk7SUFDMUIsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ0xJIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudFxuICogU3RvcmVzIHVzZXIgcHJlZmVyZW5jZXMgYW5kIGNyZWRlbnRpYWxzIGluIH4vLnNlbmRseS9cbiAqXG4gKiBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZyBmaWxlKTpcbiAqIC0gU0VORExZX0FQSV9LRVk6IEFQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uXG4gKiAtIFNFTkRMWV9CQVNFX1VSTDogQ3VzdG9tIEFQSSBlbmRwb2ludFxuICogLSBTRU5ETFlfT1VUUFVUX0ZPUk1BVDogRGVmYXVsdCBvdXRwdXQgZm9ybWF0IChodW1hbi9qc29uKVxuICogLSBTRU5ETFlfTk9fQ09MT1I6IERpc2FibGUgY29sb3JlZCBvdXRwdXQgKGFueSB2YWx1ZSlcbiAqIC0gU0VORExZX1RJTUVPVVQ6IFJlcXVlc3QgdGltZW91dCBpbiBtcyAoZGVmYXVsdDogMzAwMDApXG4gKiAtIFNFTkRMWV9NQVhfUkVUUklFUzogTWF4IHJldHJ5IGF0dGVtcHRzIChkZWZhdWx0OiAzKVxuICogLSBTRU5ETFlfQ09ORklHX0tFWTogQ3VzdG9tIGVuY3J5cHRpb24ga2V5IChmb3IgQ0kvQ0QpXG4gKiAtIENJOiBBdXRvLWRldGVjdCBDSSBtb2RlIChkaXNhYmxlcyBpbnRlcmFjdGl2ZSBwcm9tcHRzKVxuICovXG5cbmltcG9ydCBDb25mIGZyb20gXCJjb25mXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRseUNvbmZpZyB7XG4gIC8vIEF1dGhlbnRpY2F0aW9uXG4gIGFwaUtleT86IHN0cmluZztcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZztcbiAgdG9rZW5FeHBpcmVzQXQ/OiBudW1iZXI7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG5cbiAgLy8gRW52aXJvbm1lbnRcbiAgZW52aXJvbm1lbnQ6IFwidGVzdFwiIHwgXCJsaXZlXCI7XG4gIGJhc2VVcmw6IHN0cmluZztcblxuICAvLyBQcmVmZXJlbmNlc1xuICBkZWZhdWx0Rm9ybWF0OiBcImh1bWFuXCIgfCBcImpzb25cIjtcbiAgY29sb3JFbmFibGVkOiBib29sZWFuO1xuXG4gIC8vIE5ldHdvcmtcbiAgdGltZW91dDogbnVtYmVyO1xuICBtYXhSZXRyaWVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgcnVubmluZyBpbiBDSSBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDSSgpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhKFxuICAgIHByb2Nlc3MuZW52LkNJIHx8XG4gICAgcHJvY2Vzcy5lbnYuQ09OVElOVU9VU19JTlRFR1JBVElPTiB8fFxuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9BQ1RJT05TIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUTEFCX0NJIHx8XG4gICAgcHJvY2Vzcy5lbnYuQ0lSQ0xFQ0kgfHxcbiAgICBwcm9jZXNzLmVudi5UUkFWSVMgfHxcbiAgICBwcm9jZXNzLmVudi5CVUlMREtJVEVcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBjb2xvciBvdXRwdXQgaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sb3JEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhKFxuICAgIHByb2Nlc3MuZW52LlNFTkRMWV9OT19DT0xPUiB8fFxuICAgIHByb2Nlc3MuZW52Lk5PX0NPTE9SIHx8XG4gICAgcHJvY2Vzcy5lbnYuVEVSTSA9PT0gXCJkdW1iXCJcbiAgKTtcbn1cblxuY29uc3QgQ09ORklHX0RJUiA9IHBhdGguam9pbihvcy5ob21lZGlyKCksIFwiLnNlbmRseVwiKTtcbmNvbnN0IENPTkZJR19GSUxFID0gXCJjb25maWcuanNvblwiO1xuXG4vLyBPbGQgZGVmYXVsdCBrZXkgLSB1c2VkIGZvciBtaWdyYXRpb24gb25seVxuY29uc3QgT0xEX0RFRkFVTFRfS0VZID0gXCJzZW5kbHktY2xpLWRlZmF1bHQta2V5LXYxXCI7XG5cbi8qKlxuICogRGVyaXZlIGEgbWFjaGluZS1zcGVjaWZpYyBlbmNyeXB0aW9uIGtleS5cbiAqIFRoaXMgZW5zdXJlcyBlYWNoIGluc3RhbGxhdGlvbiBoYXMgYSB1bmlxdWUga2V5IHRoYXQgY2FuJ3QgYmUgZWFzaWx5IGd1ZXNzZWQuXG4gKlxuICogVGhlIGtleSBpcyBkZXJpdmVkIGZyb20gbWFjaGluZS1zcGVjaWZpYyBpZGVudGlmaWVycyB0aGF0IGFyZTpcbiAqIC0gVW5pcXVlIHBlciBtYWNoaW5lXG4gKiAtIFN0YWJsZSBhY3Jvc3Mgc2Vzc2lvbnNcbiAqIC0gTm90IHB1YmxpY2x5IGtub3duXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZUVuY3J5cHRpb25LZXkoKTogc3RyaW5nIHtcbiAgY29uc3QgbWFjaGluZUlkID0gW29zLmhvc3RuYW1lKCksIG9zLnVzZXJJbmZvKCkudXNlcm5hbWUsIG9zLmhvbWVkaXIoKV0uam9pbihcbiAgICBcIjpcIixcbiAgKTtcblxuICByZXR1cm4gY3J5cHRvXG4gICAgLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKGBzZW5kbHk6JHttYWNoaW5lSWR9OnYyYClcbiAgICAuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZW5jcnlwdGlvbiBrZXkgdG8gdXNlIGZvciBjb25maWcuXG4gKiBQcmlvcml0eTogU0VORExZX0NPTkZJR19LRVkgZW52IHZhciA+IG1hY2hpbmUtZGVyaXZlZCBrZXlcbiAqL1xuZnVuY3Rpb24gZ2V0RW5jcnlwdGlvbktleSgpOiBzdHJpbmcge1xuICAvLyBFeHBsaWNpdCBrZXkgdGFrZXMgcHJlY2VkZW5jZSAoZm9yIENJL0NELCB0ZXN0aW5nLCBhZHZhbmNlZCB1c2VycylcbiAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9DT05GSUdfS0VZKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlNFTkRMWV9DT05GSUdfS0VZO1xuICB9XG4gIHJldHVybiBkZXJpdmVFbmNyeXB0aW9uS2V5KCk7XG59XG5cbi8vIEVuc3VyZSBjb25maWcgZGlyZWN0b3J5IGV4aXN0cyB3aXRoIHNlY3VyZSBwZXJtaXNzaW9uc1xuaWYgKCFmcy5leGlzdHNTeW5jKENPTkZJR19ESVIpKSB7XG4gIGZzLm1rZGlyU3luYyhDT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgbW9kZTogMG83MDAgfSk7XG59XG5cbmNvbnN0IERFRkFVTFRfQ09ORklHOiBTZW5kbHlDb25maWcgPSB7XG4gIGVudmlyb25tZW50OiBcInRlc3RcIixcbiAgYmFzZVVybDogXCJodHRwczovL3NlbmRseS5saXZlXCIsXG4gIGRlZmF1bHRGb3JtYXQ6IFwiaHVtYW5cIixcbiAgY29sb3JFbmFibGVkOiB0cnVlLFxuICB0aW1lb3V0OiAzMDAwMCxcbiAgbWF4UmV0cmllczogMyxcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBjb25maWcgd2l0aCBhdXRvbWF0aWMgbWlncmF0aW9uIGZyb20gb2xkIGVuY3J5cHRpb24ga2V5LlxuICogVGhpcyBlbnN1cmVzIGV4aXN0aW5nIHVzZXJzIGRvbid0IGxvc2UgdGhlaXIgY3JlZGVudGlhbHMuXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVDb25maWcoKTogQ29uZjxTZW5kbHlDb25maWc+IHtcbiAgY29uc3QgbmV3S2V5ID0gZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gIC8vIFRyeSB0byBpbml0aWFsaXplIHdpdGggbmV3IGtleSBmaXJzdFxuICB0cnkge1xuICAgIGNvbnN0IG5ld0NvbmZpZyA9IG5ldyBDb25mPFNlbmRseUNvbmZpZz4oe1xuICAgICAgcHJvamVjdE5hbWU6IFwic2VuZGx5XCIsXG4gICAgICBjd2Q6IENPTkZJR19ESVIsXG4gICAgICBjb25maWdOYW1lOiBcImNvbmZpZ1wiLFxuICAgICAgZGVmYXVsdHM6IERFRkFVTFRfQ09ORklHLFxuICAgICAgZW5jcnlwdGlvbktleTogbmV3S2V5LFxuICAgIH0pO1xuXG4gICAgLy8gVHJ5IHRvIHJlYWQgYSB2YWx1ZSB0byB2ZXJpZnkgZGVjcnlwdGlvbiB3b3Jrc1xuICAgIG5ld0NvbmZpZy5nZXQoXCJlbnZpcm9ubWVudFwiKTtcbiAgICByZXR1cm4gbmV3Q29uZmlnO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOZXcga2V5IGRpZG4ndCB3b3JrIC0gdHJ5IG1pZ3JhdGlvbiBmcm9tIG9sZCBrZXlcbiAgfVxuXG4gIC8vIE1pZ3JhdGlvbjogVHJ5IHRvIHJlYWQgd2l0aCBvbGQgZGVmYXVsdCBrZXlcbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb25maWcgPSBuZXcgQ29uZjxTZW5kbHlDb25maWc+KHtcbiAgICAgIHByb2plY3ROYW1lOiBcInNlbmRseVwiLFxuICAgICAgY3dkOiBDT05GSUdfRElSLFxuICAgICAgY29uZmlnTmFtZTogXCJjb25maWdcIixcbiAgICAgIGRlZmF1bHRzOiBERUZBVUxUX0NPTkZJRyxcbiAgICAgIGVuY3J5cHRpb25LZXk6IE9MRF9ERUZBVUxUX0tFWSxcbiAgICB9KTtcblxuICAgIC8vIFJlYWQgYWxsIGRhdGEgd2l0aCBvbGQga2V5XG4gICAgY29uc3Qgb2xkRGF0YSA9IHsgLi4ub2xkQ29uZmlnLnN0b3JlIH07XG4gICAgY29uc3QgaGFzRGF0YSA9IE9iamVjdC5rZXlzKG9sZERhdGEpLnNvbWUoXG4gICAgICAoaykgPT5cbiAgICAgICAgIU9iamVjdC5rZXlzKERFRkFVTFRfQ09ORklHKS5pbmNsdWRlcyhrKSB8fFxuICAgICAgICBvbGREYXRhW2sgYXMga2V5b2YgU2VuZGx5Q29uZmlnXSAhPT1cbiAgICAgICAgICBERUZBVUxUX0NPTkZJR1trIGFzIGtleW9mIFNlbmRseUNvbmZpZ10sXG4gICAgKTtcblxuICAgIGlmIChoYXNEYXRhKSB7XG4gICAgICAvLyBDbGVhciBvbGQgY29uZmlnIGZpbGVcbiAgICAgIG9sZENvbmZpZy5jbGVhcigpO1xuXG4gICAgICAvLyBDcmVhdGUgbmV3IGNvbmZpZyB3aXRoIG5ldyBrZXlcbiAgICAgIGNvbnN0IG5ld0NvbmZpZyA9IG5ldyBDb25mPFNlbmRseUNvbmZpZz4oe1xuICAgICAgICBwcm9qZWN0TmFtZTogXCJzZW5kbHlcIixcbiAgICAgICAgY3dkOiBDT05GSUdfRElSLFxuICAgICAgICBjb25maWdOYW1lOiBcImNvbmZpZ1wiLFxuICAgICAgICBkZWZhdWx0czogREVGQVVMVF9DT05GSUcsXG4gICAgICAgIGVuY3J5cHRpb25LZXk6IG5ld0tleSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZXN0b3JlIGRhdGEgd2l0aCBuZXcgZW5jcnlwdGlvblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2xkRGF0YSkpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdDb25maWcuc2V0KGtleSBhcyBrZXlvZiBTZW5kbHlDb25maWcsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3Q29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gT2xkIGtleSBhbHNvIGRpZG4ndCB3b3JrIC0gY29ycnVwdGVkIG9yIGZyZXNoIGluc3RhbGxcbiAgfVxuXG4gIC8vIEZyZXNoIGluc3RhbGwgb3IgY29ycnVwdGVkIC0gc3RhcnQgd2l0aCBuZXcga2V5XG4gIHJldHVybiBuZXcgQ29uZjxTZW5kbHlDb25maWc+KHtcbiAgICBwcm9qZWN0TmFtZTogXCJzZW5kbHlcIixcbiAgICBjd2Q6IENPTkZJR19ESVIsXG4gICAgY29uZmlnTmFtZTogXCJjb25maWdcIixcbiAgICBkZWZhdWx0czogREVGQVVMVF9DT05GSUcsXG4gICAgZW5jcnlwdGlvbktleTogbmV3S2V5LFxuICB9KTtcbn1cblxuY29uc3QgY29uZmlnID0gaW5pdGlhbGl6ZUNvbmZpZygpO1xuXG4vKipcbiAqIEdldCBlZmZlY3RpdmUgY29uZmlnIHZhbHVlIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcnJpZGVcbiAqIFByaW9yaXR5OiBlbnYgdmFyID4gY29uZmlnIGZpbGUgPiBkZWZhdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZmZlY3RpdmVWYWx1ZTxLIGV4dGVuZHMga2V5b2YgU2VuZGx5Q29uZmlnPihcbiAga2V5OiBLLFxuKTogU2VuZGx5Q29uZmlnW0tdIHtcbiAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcnJpZGVzXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBcImFwaUtleVwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9BUElfS0VZKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWSBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYmFzZVVybFwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9CQVNFX1VSTCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VORExZX0JBU0VfVVJMIGFzIFNlbmRseUNvbmZpZ1tLXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJkZWZhdWx0Rm9ybWF0XCI6XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuU0VORExZX09VVFBVVF9GT1JNQVQpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gcHJvY2Vzcy5lbnYuU0VORExZX09VVFBVVF9GT1JNQVQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJqc29uXCIgfHwgZm9ybWF0ID09PSBcImh1bWFuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0IGFzIFNlbmRseUNvbmZpZ1tLXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImNvbG9yRW5hYmxlZFwiOlxuICAgICAgaWYgKGlzQ29sb3JEaXNhYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZSBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidGltZW91dFwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9USU1FT1VUKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBwYXJzZUludChwcm9jZXNzLmVudi5TRU5ETFlfVElNRU9VVCwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHRpbWVvdXQpICYmIHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRpbWVvdXQgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibWF4UmV0cmllc1wiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9NQVhfUkVUUklFUykge1xuICAgICAgICBjb25zdCByZXRyaWVzID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuU0VORExZX01BWF9SRVRSSUVTLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocmV0cmllcykgJiYgcmV0cmllcyA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJldHJpZXMgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byBjb25maWcgZmlsZSB2YWx1ZVxuICByZXR1cm4gY29uZmlnLmdldChrZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IFNlbmRseUNvbmZpZyB7XG4gIHJldHVybiBjb25maWcuc3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb25maWc8SyBleHRlbmRzIGtleW9mIFNlbmRseUNvbmZpZz4oXG4gIGtleTogSyxcbiAgdmFsdWU6IFNlbmRseUNvbmZpZ1tLXSxcbik6IHZvaWQge1xuICBjb25maWcuc2V0KGtleSwgdmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnVmFsdWU8SyBleHRlbmRzIGtleW9mIFNlbmRseUNvbmZpZz4oXG4gIGtleTogSyxcbik6IFNlbmRseUNvbmZpZ1tLXSB7XG4gIHJldHVybiBjb25maWcuZ2V0KGtleSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbmZpZygpOiB2b2lkIHtcbiAgY29uZmlnLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckF1dGgoKTogdm9pZCB7XG4gIGNvbmZpZy5kZWxldGUoXCJhcGlLZXlcIik7XG4gIGNvbmZpZy5kZWxldGUoXCJhY2Nlc3NUb2tlblwiKTtcbiAgY29uZmlnLmRlbGV0ZShcInJlZnJlc2hUb2tlblwiKTtcbiAgY29uZmlnLmRlbGV0ZShcInRva2VuRXhwaXJlc0F0XCIpO1xuICBjb25maWcuZGVsZXRlKFwidXNlcklkXCIpO1xuICBjb25maWcuZGVsZXRlKFwiZW1haWxcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gIC8vIENoZWNrIGVudiB2YXIgZmlyc3RcbiAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9BUElfS0VZKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCBhcGlLZXkgPSBjb25maWcuZ2V0KFwiYXBpS2V5XCIpO1xuICBjb25zdCBhY2Nlc3NUb2tlbiA9IGNvbmZpZy5nZXQoXCJhY2Nlc3NUb2tlblwiKTtcbiAgcmV0dXJuICEhKGFwaUtleSB8fCBhY2Nlc3NUb2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXRoVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdGFrZXMgaGlnaGVzdCBwcmVjZWRlbmNlXG4gIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWSkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWTtcbiAgfVxuXG4gIC8vIFRoZW4gc3RvcmVkIEFQSSBrZXlcbiAgY29uc3QgYXBpS2V5ID0gY29uZmlnLmdldChcImFwaUtleVwiKTtcbiAgaWYgKGFwaUtleSkgcmV0dXJuIGFwaUtleTtcblxuICAvLyBGaW5hbGx5LCBhY2Nlc3MgdG9rZW4gKGlmIG5vdCBleHBpcmVkKVxuICBjb25zdCBhY2Nlc3NUb2tlbiA9IGNvbmZpZy5nZXQoXCJhY2Nlc3NUb2tlblwiKTtcbiAgY29uc3QgZXhwaXJlc0F0ID0gY29uZmlnLmdldChcInRva2VuRXhwaXJlc0F0XCIpO1xuXG4gIGlmIChhY2Nlc3NUb2tlbiAmJiBleHBpcmVzQXQgJiYgRGF0ZS5ub3coKSA8IGV4cGlyZXNBdCkge1xuICAgIHJldHVybiBhY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBcGlLZXkoYXBpS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gVmFsaWRhdGUgQVBJIGtleSBmb3JtYXRcbiAgaWYgKCEvXnNrXyh0ZXN0fGxpdmUpX3YxX1thLXpBLVowLTlfLV0rJC8udGVzdChhcGlLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJJbnZhbGlkIEFQSSBrZXkgZm9ybWF0LiBFeHBlY3RlZCBza190ZXN0X3YxX3h4eCBvciBza19saXZlX3YxX3h4eFwiLFxuICAgICk7XG4gIH1cblxuICBjb25maWcuc2V0KFwiYXBpS2V5XCIsIGFwaUtleSk7XG5cbiAgLy8gU2V0IGVudmlyb25tZW50IGJhc2VkIG9uIGtleSB0eXBlXG4gIGlmIChhcGlLZXkuc3RhcnRzV2l0aChcInNrX3Rlc3RfXCIpKSB7XG4gICAgY29uZmlnLnNldChcImVudmlyb25tZW50XCIsIFwidGVzdFwiKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcuc2V0KFwiZW52aXJvbm1lbnRcIiwgXCJsaXZlXCIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBdXRoVG9rZW5zKFxuICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxuICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgZXhwaXJlc0luOiBudW1iZXIsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBlbWFpbDogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbmZpZy5zZXQoXCJhY2Nlc3NUb2tlblwiLCBhY2Nlc3NUb2tlbik7XG4gIGNvbmZpZy5zZXQoXCJyZWZyZXNoVG9rZW5cIiwgcmVmcmVzaFRva2VuKTtcbiAgY29uZmlnLnNldChcInRva2VuRXhwaXJlc0F0XCIsIERhdGUubm93KCkgKyBleHBpcmVzSW4gKiAxMDAwKTtcbiAgY29uZmlnLnNldChcInVzZXJJZFwiLCB1c2VySWQpO1xuICBjb25maWcuc2V0KFwiZW1haWxcIiwgZW1haWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKENPTkZJR19ESVIsIENPTkZJR19GSUxFKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ0RpcigpOiBzdHJpbmcge1xuICByZXR1cm4gQ09ORklHX0RJUjtcbn1cblxuZXhwb3J0IHsgY29uZmlnIH07XG4iXX0=

@@ -799,14 +799,10 @@ {

},
"sms:batch": {
"webhooks:create": {
"aliases": [],
"args": {},
"description": "Send batch SMS messages (uploads CSV to cloud for audit trail)",
"description": "Create a webhook",
"examples": [
"<%= config.bin %> sms batch --file recipients.csv",
"<%= config.bin %> sms batch --file phones.csv --text \"Hello everyone!\"",
"<%= config.bin %> sms batch --to +15551234567,+15559876543 --text \"Hello!\"",
"<%= config.bin %> sms batch --file recipients.csv --dry-run",
"<%= config.bin %> sms batch --file phones.csv --text \"Code: 123\" --type transactional",
"<%= config.bin %> sms batch --reuse abc123-def456",
"<%= config.bin %> sms batch --history"
"<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered",
"<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered,message.failed --description \"Production webhook\"",
"<%= config.bin %> webhooks create --url https://webhook.site/abc123 --events message.sent --json"
],

@@ -827,11 +823,7 @@ "flags": {

},
"file": {
"char": "F",
"description": "CSV file with phone numbers (and optional message text)",
"exclusive": [
"to",
"reuse",
"history"
],
"name": "file",
"url": {
"char": "u",
"description": "Webhook URL (must be HTTPS)",
"name": "url",
"required": true,
"hasDynamicHelp": false,

@@ -841,11 +833,7 @@ "multiple": false,

},
"to": {
"char": "t",
"description": "Comma-separated recipient phone numbers (E.164 format)",
"exclusive": [
"file",
"reuse",
"history"
],
"name": "to",
"events": {
"char": "e",
"description": "Comma-separated list of events to listen for",
"name": "events",
"required": true,
"hasDynamicHelp": false,

@@ -855,6 +843,6 @@ "multiple": false,

},
"text": {
"char": "m",
"description": "Message text (required with --to, optional with --file if CSV has text column)",
"name": "text",
"description": {
"char": "d",
"description": "Description for the webhook",
"name": "description",
"hasDynamicHelp": false,

@@ -864,49 +852,65 @@ "multiple": false,

},
"from": {
"char": "f",
"description": "Sender ID or phone number for all messages",
"name": "from",
"mode": {
"char": "m",
"description": "Event mode filter: all (default), test (sandbox only), live (production only)",
"name": "mode",
"default": "all",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"type": {
"description": "Message type: marketing (default) or transactional. Transactional bypasses quiet hours.",
"name": "type",
"default": "marketing",
"hasDynamicHelp": false,
"multiple": false,
"options": [
"marketing",
"transactional"
"all",
"test",
"live"
],
"type": "option"
}
},
"hasDynamicHelp": false,
"hiddenAliases": [],
"id": "webhooks:create",
"pluginAlias": "@sendly/cli",
"pluginName": "@sendly/cli",
"pluginType": "core",
"strict": true,
"isESM": true,
"relativePath": [
"dist",
"commands",
"webhooks",
"create.js"
]
},
"webhooks:delete": {
"aliases": [],
"args": {
"id": {
"description": "Webhook ID to delete",
"name": "id",
"required": true
}
},
"description": "Delete a webhook",
"examples": [
"<%= config.bin %> webhooks delete whk_abc123",
"<%= config.bin %> webhooks delete whk_abc123 --yes",
"<%= config.bin %> webhooks delete whk_abc123 --json"
],
"flags": {
"json": {
"description": "Output in JSON format",
"name": "json",
"allowNo": false,
"type": "boolean"
},
"dry-run": {
"char": "d",
"description": "Preview batch without sending (validates access, shows cost and compliance breakdown)",
"name": "dry-run",
"quiet": {
"char": "q",
"description": "Minimal output",
"name": "quiet",
"allowNo": false,
"type": "boolean"
},
"reuse": {
"description": "Re-use a previous batch upload by ID (see --history)",
"exclusive": [
"file",
"to",
"history"
],
"name": "reuse",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"history": {
"description": "Show recent batch upload history",
"exclusive": [
"file",
"to",
"reuse"
],
"name": "history",
"yes": {
"char": "y",
"description": "Skip confirmation prompt",
"name": "yes",
"allowNo": false,

@@ -918,3 +922,3 @@ "type": "boolean"

"hiddenAliases": [],
"id": "sms:batch",
"id": "webhooks:delete",
"pluginAlias": "@sendly/cli",

@@ -928,11 +932,11 @@ "pluginName": "@sendly/cli",

"commands",
"sms",
"batch.js"
"webhooks",
"delete.js"
]
},
"sms:cancel": {
"webhooks:deliveries": {
"aliases": [],
"args": {
"id": {
"description": "Scheduled message ID to cancel",
"description": "Webhook ID",
"name": "id",

@@ -942,6 +946,8 @@ "required": true

},
"description": "Cancel a scheduled message",
"description": "View webhook delivery history",
"examples": [
"<%= config.bin %> sms cancel sched_abc123",
"<%= config.bin %> sms cancel sched_abc123 --json"
"<%= config.bin %> webhooks deliveries whk_abc123",
"<%= config.bin %> webhooks deliveries whk_abc123 --limit 20",
"<%= config.bin %> webhooks deliveries whk_abc123 --failed-only",
"<%= config.bin %> webhooks deliveries whk_abc123 --json"
],

@@ -961,2 +967,17 @@ "flags": {

"type": "boolean"
},
"limit": {
"char": "l",
"description": "Number of deliveries to show",
"name": "limit",
"default": 10,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"failed-only": {
"description": "Show only failed deliveries",
"name": "failed-only",
"allowNo": false,
"type": "boolean"
}

@@ -966,3 +987,3 @@ },

"hiddenAliases": [],
"id": "sms:cancel",
"id": "webhooks:deliveries",
"pluginAlias": "@sendly/cli",

@@ -976,11 +997,11 @@ "pluginName": "@sendly/cli",

"commands",
"sms",
"cancel.js"
"webhooks",
"deliveries.js"
]
},
"sms:get": {
"webhooks:get": {
"aliases": [],
"args": {
"id": {
"description": "Message ID",
"description": "Webhook ID",
"name": "id",

@@ -990,6 +1011,6 @@ "required": true

},
"description": "Get details of a specific message",
"description": "Get webhook details",
"examples": [
"<%= config.bin %> sms get msg_abc123",
"<%= config.bin %> sms get msg_abc123 --json"
"<%= config.bin %> webhooks get whk_abc123",
"<%= config.bin %> webhooks get whk_abc123 --json"
],

@@ -1013,3 +1034,3 @@ "flags": {

"hiddenAliases": [],
"id": "sms:get",
"id": "webhooks:get",
"pluginAlias": "@sendly/cli",

@@ -1023,17 +1044,13 @@ "pluginName": "@sendly/cli",

"commands",
"sms",
"webhooks",
"get.js"
]
},
"sms:list": {
"webhooks:list": {
"aliases": [],
"args": {},
"description": "List sent messages",
"description": "List configured webhooks",
"examples": [
"<%= config.bin %> sms list",
"<%= config.bin %> sms list --limit 10",
"<%= config.bin %> sms list --page 2",
"<%= config.bin %> sms list --status delivered",
"<%= config.bin %> sms list --sandbox",
"<%= config.bin %> sms list --json"
"<%= config.bin %> webhooks list",
"<%= config.bin %> webhooks list --json"
],

@@ -1053,40 +1070,2 @@ "flags": {

"type": "boolean"
},
"limit": {
"char": "l",
"description": "Number of messages per page",
"name": "limit",
"default": 20,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"page": {
"char": "p",
"description": "Page number (starts at 1)",
"name": "page",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"offset": {
"description": "Offset from start (alternative to --page)",
"name": "offset",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"status": {
"char": "s",
"description": "Filter by status (queued, sent, delivered, failed)",
"name": "status",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"sandbox": {
"description": "Show sandbox/test messages (live keys only)",
"name": "sandbox",
"allowNo": false,
"type": "boolean"
}

@@ -1096,3 +1075,3 @@ },

"hiddenAliases": [],
"id": "sms:list",
"id": "webhooks:list",
"pluginAlias": "@sendly/cli",

@@ -1106,15 +1085,14 @@ "pluginName": "@sendly/cli",

"commands",
"sms",
"webhooks",
"list.js"
]
},
"sms:schedule": {
"webhooks:listen": {
"aliases": [],
"args": {},
"description": "Schedule an SMS message for future delivery",
"description": "Listen for webhooks locally. Receives events in real-time via WebSocket and forwards them to your local server.",
"examples": [
"<%= config.bin %> sms schedule --to +15551234567 --text \"Reminder!\" --at \"2025-01-20T10:00:00Z\"",
"<%= config.bin %> sms schedule --to +15551234567 --text \"Meeting in 1 hour\" --at \"2025-01-15T14:00:00Z\" --from \"Sendly\"",
"<%= config.bin %> sms schedule --to +15551234567 --text \"Your code: 123456\" --at \"2025-01-20T10:00:00Z\" --type transactional",
"<%= config.bin %> sms schedule --to +15551234567 --text \"Hello!\" --at \"2025-01-20T10:00:00Z\" --json"
"<%= config.bin %> webhooks listen",
"<%= config.bin %> webhooks listen --forward http://localhost:3000/webhook",
"<%= config.bin %> webhooks listen --events message.delivered,message.failed"
],

@@ -1135,33 +1113,7 @@ "flags": {

},
"to": {
"char": "t",
"description": "Recipient phone number (E.164 format)",
"name": "to",
"required": true,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"text": {
"char": "m",
"description": "Message text",
"name": "text",
"required": true,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"at": {
"char": "a",
"description": "Scheduled time (ISO 8601 format, e.g., 2025-01-20T10:00:00Z)",
"name": "at",
"required": true,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"from": {
"forward": {
"char": "f",
"description": "Sender ID or phone number",
"name": "from",
"description": "Local URL to forward events to",
"name": "forward",
"default": "http://localhost:3000/webhook",
"hasDynamicHelp": false,

@@ -1171,12 +1123,9 @@ "multiple": false,

},
"type": {
"description": "Message type: marketing (default) or transactional. Transactional messages bypass quiet hours.",
"name": "type",
"default": "marketing",
"events": {
"char": "e",
"description": "Comma-separated list of events to listen for",
"name": "events",
"default": "message.sent,message.delivered,message.failed,message.bounced",
"hasDynamicHelp": false,
"multiple": false,
"options": [
"marketing",
"transactional"
],
"type": "option"

@@ -1187,3 +1136,3 @@ }

"hiddenAliases": [],
"id": "sms:schedule",
"id": "webhooks:listen",
"pluginAlias": "@sendly/cli",

@@ -1197,15 +1146,20 @@ "pluginName": "@sendly/cli",

"commands",
"sms",
"schedule.js"
"webhooks",
"listen.js"
]
},
"sms:scheduled": {
"webhooks:rotate-secret": {
"aliases": [],
"args": {},
"description": "List scheduled messages",
"args": {
"id": {
"description": "Webhook ID",
"name": "id",
"required": true
}
},
"description": "Rotate webhook secret",
"examples": [
"<%= config.bin %> sms scheduled",
"<%= config.bin %> sms scheduled --limit 10",
"<%= config.bin %> sms scheduled --status scheduled",
"<%= config.bin %> sms scheduled --json"
"<%= config.bin %> webhooks rotate-secret whk_abc123",
"<%= config.bin %> webhooks rotate-secret whk_abc123 --yes",
"<%= config.bin %> webhooks rotate-secret whk_abc123 --json"
],

@@ -1226,18 +1180,8 @@ "flags": {

},
"limit": {
"char": "l",
"description": "Number of messages to show",
"name": "limit",
"default": 20,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"status": {
"char": "s",
"description": "Filter by status (scheduled, sent, cancelled, failed)",
"name": "status",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
"yes": {
"char": "y",
"description": "Skip confirmation prompt",
"name": "yes",
"allowNo": false,
"type": "boolean"
}

@@ -1247,3 +1191,3 @@ },

"hiddenAliases": [],
"id": "sms:scheduled",
"id": "webhooks:rotate-secret",
"pluginAlias": "@sendly/cli",

@@ -1257,15 +1201,19 @@ "pluginName": "@sendly/cli",

"commands",
"sms",
"scheduled.js"
"webhooks",
"rotate-secret.js"
]
},
"sms:send": {
"webhooks:test": {
"aliases": [],
"args": {},
"description": "Send an SMS message",
"args": {
"id": {
"description": "Webhook ID to test",
"name": "id",
"required": true
}
},
"description": "Send a test event to a webhook",
"examples": [
"<%= config.bin %> sms send --to +15551234567 --text \"Hello!\"",
"<%= config.bin %> sms send --to +15551234567 --text \"Hello!\" --from \"Sendly\"",
"<%= config.bin %> sms send --to +15551234567 --text \"Hello!\" --type transactional",
"<%= config.bin %> sms send --to +15551234567 --text \"Hello!\" --json"
"<%= config.bin %> webhooks test whk_abc123",
"<%= config.bin %> webhooks test whk_abc123 --json"
],

@@ -1285,40 +1233,2 @@ "flags": {

"type": "boolean"
},
"to": {
"char": "t",
"description": "Recipient phone number (E.164 format)",
"name": "to",
"required": true,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"text": {
"char": "m",
"description": "Message text",
"name": "text",
"required": true,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"from": {
"char": "f",
"description": "Sender ID or phone number",
"name": "from",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"type": {
"description": "Message type: marketing (default) or transactional",
"name": "type",
"default": "marketing",
"hasDynamicHelp": false,
"multiple": false,
"options": [
"marketing",
"transactional"
],
"type": "option"
}

@@ -1328,3 +1238,3 @@ },

"hiddenAliases": [],
"id": "sms:send",
"id": "webhooks:test",
"pluginAlias": "@sendly/cli",

@@ -1338,14 +1248,22 @@ "pluginName": "@sendly/cli",

"commands",
"sms",
"send.js"
"webhooks",
"test.js"
]
},
"webhooks:create": {
"webhooks:update": {
"aliases": [],
"args": {},
"description": "Create a webhook",
"args": {
"id": {
"description": "Webhook ID to update",
"name": "id",
"required": true
}
},
"description": "Update a webhook",
"examples": [
"<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered",
"<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered,message.failed --description \"Production webhook\"",
"<%= config.bin %> webhooks create --url https://webhook.site/abc123 --events message.sent --json"
"<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook",
"<%= config.bin %> webhooks update whk_abc123 --events message.delivered,message.failed",
"<%= config.bin %> webhooks update whk_abc123 --description \"Updated production webhook\"",
"<%= config.bin %> webhooks update whk_abc123 --active false",
"<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook --events message.sent --json"
],

@@ -1368,5 +1286,4 @@ "flags": {

"char": "u",
"description": "Webhook URL (must be HTTPS)",
"description": "Update webhook URL (must be HTTPS)",
"name": "url",
"required": true,
"hasDynamicHelp": false,

@@ -1378,5 +1295,4 @@ "multiple": false,

"char": "e",
"description": "Comma-separated list of events to listen for",
"description": "Update events list (comma-separated)",
"name": "events",
"required": true,
"hasDynamicHelp": false,

@@ -1388,3 +1304,3 @@ "multiple": false,

"char": "d",
"description": "Description for the webhook",
"description": "Update description",
"name": "description",

@@ -1395,7 +1311,13 @@ "hasDynamicHelp": false,

},
"active": {
"char": "a",
"description": "Enable or disable the webhook",
"name": "active",
"allowNo": true,
"type": "boolean"
},
"mode": {
"char": "m",
"description": "Event mode filter: all (default), test (sandbox only), live (production only)",
"description": "Update event mode filter: all, test (sandbox only), live (production only)",
"name": "mode",
"default": "all",
"hasDynamicHelp": false,

@@ -1413,3 +1335,3 @@ "multiple": false,

"hiddenAliases": [],
"id": "webhooks:create",
"id": "webhooks:update",
"pluginAlias": "@sendly/cli",

@@ -1424,19 +1346,17 @@ "pluginName": "@sendly/cli",

"webhooks",
"create.js"
"update.js"
]
},
"webhooks:delete": {
"sms:batch": {
"aliases": [],
"args": {
"id": {
"description": "Webhook ID to delete",
"name": "id",
"required": true
}
},
"description": "Delete a webhook",
"args": {},
"description": "Send batch SMS messages (uploads CSV to cloud for audit trail)",
"examples": [
"<%= config.bin %> webhooks delete whk_abc123",
"<%= config.bin %> webhooks delete whk_abc123 --yes",
"<%= config.bin %> webhooks delete whk_abc123 --json"
"<%= config.bin %> sms batch --file recipients.csv",
"<%= config.bin %> sms batch --file phones.csv --text \"Hello everyone!\"",
"<%= config.bin %> sms batch --to +15551234567,+15559876543 --text \"Hello!\"",
"<%= config.bin %> sms batch --file recipients.csv --dry-run",
"<%= config.bin %> sms batch --file phones.csv --text \"Code: 123\" --type transactional",
"<%= config.bin %> sms batch --reuse abc123-def456",
"<%= config.bin %> sms batch --history"
],

@@ -1457,8 +1377,85 @@ "flags": {

},
"yes": {
"char": "y",
"description": "Skip confirmation prompt",
"name": "yes",
"file": {
"char": "F",
"description": "CSV file with phone numbers (and optional message text)",
"exclusive": [
"to",
"reuse",
"history"
],
"name": "file",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"to": {
"char": "t",
"description": "Comma-separated recipient phone numbers (E.164 format)",
"exclusive": [
"file",
"reuse",
"history"
],
"name": "to",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"text": {
"char": "m",
"description": "Message text (required with --to, optional with --file if CSV has text column)",
"name": "text",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"from": {
"char": "f",
"description": "Sender ID or phone number for all messages",
"name": "from",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"type": {
"description": "Message type: marketing (default) or transactional. Transactional bypasses quiet hours.",
"name": "type",
"default": "marketing",
"hasDynamicHelp": false,
"multiple": false,
"options": [
"marketing",
"transactional"
],
"type": "option"
},
"dry-run": {
"char": "d",
"description": "Preview batch without sending (validates access, shows cost and compliance breakdown)",
"name": "dry-run",
"allowNo": false,
"type": "boolean"
},
"reuse": {
"description": "Re-use a previous batch upload by ID (see --history)",
"exclusive": [
"file",
"to",
"history"
],
"name": "reuse",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"history": {
"description": "Show recent batch upload history",
"exclusive": [
"file",
"to",
"reuse"
],
"name": "history",
"allowNo": false,
"type": "boolean"
}

@@ -1468,3 +1465,3 @@ },

"hiddenAliases": [],
"id": "webhooks:delete",
"id": "sms:batch",
"pluginAlias": "@sendly/cli",

@@ -1478,11 +1475,11 @@ "pluginName": "@sendly/cli",

"commands",
"webhooks",
"delete.js"
"sms",
"batch.js"
]
},
"webhooks:deliveries": {
"sms:cancel": {
"aliases": [],
"args": {
"id": {
"description": "Webhook ID",
"description": "Scheduled message ID to cancel",
"name": "id",

@@ -1492,8 +1489,6 @@ "required": true

},
"description": "View webhook delivery history",
"description": "Cancel a scheduled message",
"examples": [
"<%= config.bin %> webhooks deliveries whk_abc123",
"<%= config.bin %> webhooks deliveries whk_abc123 --limit 20",
"<%= config.bin %> webhooks deliveries whk_abc123 --failed-only",
"<%= config.bin %> webhooks deliveries whk_abc123 --json"
"<%= config.bin %> sms cancel sched_abc123",
"<%= config.bin %> sms cancel sched_abc123 --json"
],

@@ -1513,17 +1508,2 @@ "flags": {

"type": "boolean"
},
"limit": {
"char": "l",
"description": "Number of deliveries to show",
"name": "limit",
"default": 10,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"failed-only": {
"description": "Show only failed deliveries",
"name": "failed-only",
"allowNo": false,
"type": "boolean"
}

@@ -1533,3 +1513,3 @@ },

"hiddenAliases": [],
"id": "webhooks:deliveries",
"id": "sms:cancel",
"pluginAlias": "@sendly/cli",

@@ -1543,11 +1523,11 @@ "pluginName": "@sendly/cli",

"commands",
"webhooks",
"deliveries.js"
"sms",
"cancel.js"
]
},
"webhooks:get": {
"sms:get": {
"aliases": [],
"args": {
"id": {
"description": "Webhook ID",
"description": "Message ID",
"name": "id",

@@ -1557,6 +1537,6 @@ "required": true

},
"description": "Get webhook details",
"description": "Get details of a specific message",
"examples": [
"<%= config.bin %> webhooks get whk_abc123",
"<%= config.bin %> webhooks get whk_abc123 --json"
"<%= config.bin %> sms get msg_abc123",
"<%= config.bin %> sms get msg_abc123 --json"
],

@@ -1580,3 +1560,3 @@ "flags": {

"hiddenAliases": [],
"id": "webhooks:get",
"id": "sms:get",
"pluginAlias": "@sendly/cli",

@@ -1590,13 +1570,17 @@ "pluginName": "@sendly/cli",

"commands",
"webhooks",
"sms",
"get.js"
]
},
"webhooks:list": {
"sms:list": {
"aliases": [],
"args": {},
"description": "List configured webhooks",
"description": "List sent messages",
"examples": [
"<%= config.bin %> webhooks list",
"<%= config.bin %> webhooks list --json"
"<%= config.bin %> sms list",
"<%= config.bin %> sms list --limit 10",
"<%= config.bin %> sms list --page 2",
"<%= config.bin %> sms list --status delivered",
"<%= config.bin %> sms list --sandbox",
"<%= config.bin %> sms list --json"
],

@@ -1616,2 +1600,40 @@ "flags": {

"type": "boolean"
},
"limit": {
"char": "l",
"description": "Number of messages per page",
"name": "limit",
"default": 20,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"page": {
"char": "p",
"description": "Page number (starts at 1)",
"name": "page",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"offset": {
"description": "Offset from start (alternative to --page)",
"name": "offset",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"status": {
"char": "s",
"description": "Filter by status (queued, sent, delivered, failed)",
"name": "status",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"sandbox": {
"description": "Show sandbox/test messages (live keys only)",
"name": "sandbox",
"allowNo": false,
"type": "boolean"
}

@@ -1621,3 +1643,3 @@ },

"hiddenAliases": [],
"id": "webhooks:list",
"id": "sms:list",
"pluginAlias": "@sendly/cli",

@@ -1631,14 +1653,15 @@ "pluginName": "@sendly/cli",

"commands",
"webhooks",
"sms",
"list.js"
]
},
"webhooks:listen": {
"sms:schedule": {
"aliases": [],
"args": {},
"description": "Listen for webhooks locally. Receives events in real-time via WebSocket and forwards them to your local server.",
"description": "Schedule an SMS message for future delivery",
"examples": [
"<%= config.bin %> webhooks listen",
"<%= config.bin %> webhooks listen --forward http://localhost:3000/webhook",
"<%= config.bin %> webhooks listen --events message.delivered,message.failed"
"<%= config.bin %> sms schedule --to +15551234567 --text \"Reminder!\" --at \"2025-01-20T10:00:00Z\"",
"<%= config.bin %> sms schedule --to +15551234567 --text \"Meeting in 1 hour\" --at \"2025-01-15T14:00:00Z\" --from \"Sendly\"",
"<%= config.bin %> sms schedule --to +15551234567 --text \"Your code: 123456\" --at \"2025-01-20T10:00:00Z\" --type transactional",
"<%= config.bin %> sms schedule --to +15551234567 --text \"Hello!\" --at \"2025-01-20T10:00:00Z\" --json"
],

@@ -1659,7 +1682,33 @@ "flags": {

},
"forward": {
"to": {
"char": "t",
"description": "Recipient phone number (E.164 format)",
"name": "to",
"required": true,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"text": {
"char": "m",
"description": "Message text",
"name": "text",
"required": true,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"at": {
"char": "a",
"description": "Scheduled time (ISO 8601 format, e.g., 2025-01-20T10:00:00Z)",
"name": "at",
"required": true,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"from": {
"char": "f",
"description": "Local URL to forward events to",
"name": "forward",
"default": "http://localhost:3000/webhook",
"description": "Sender ID or phone number",
"name": "from",
"hasDynamicHelp": false,

@@ -1669,9 +1718,12 @@ "multiple": false,

},
"events": {
"char": "e",
"description": "Comma-separated list of events to listen for",
"name": "events",
"default": "message.sent,message.delivered,message.failed,message.bounced",
"type": {
"description": "Message type: marketing (default) or transactional. Transactional messages bypass quiet hours.",
"name": "type",
"default": "marketing",
"hasDynamicHelp": false,
"multiple": false,
"options": [
"marketing",
"transactional"
],
"type": "option"

@@ -1682,3 +1734,3 @@ }

"hiddenAliases": [],
"id": "webhooks:listen",
"id": "sms:schedule",
"pluginAlias": "@sendly/cli",

@@ -1692,20 +1744,15 @@ "pluginName": "@sendly/cli",

"commands",
"webhooks",
"listen.js"
"sms",
"schedule.js"
]
},
"webhooks:rotate-secret": {
"sms:scheduled": {
"aliases": [],
"args": {
"id": {
"description": "Webhook ID",
"name": "id",
"required": true
}
},
"description": "Rotate webhook secret",
"args": {},
"description": "List scheduled messages",
"examples": [
"<%= config.bin %> webhooks rotate-secret whk_abc123",
"<%= config.bin %> webhooks rotate-secret whk_abc123 --yes",
"<%= config.bin %> webhooks rotate-secret whk_abc123 --json"
"<%= config.bin %> sms scheduled",
"<%= config.bin %> sms scheduled --limit 10",
"<%= config.bin %> sms scheduled --status scheduled",
"<%= config.bin %> sms scheduled --json"
],

@@ -1726,52 +1773,18 @@ "flags": {

},
"yes": {
"char": "y",
"description": "Skip confirmation prompt",
"name": "yes",
"allowNo": false,
"type": "boolean"
}
},
"hasDynamicHelp": false,
"hiddenAliases": [],
"id": "webhooks:rotate-secret",
"pluginAlias": "@sendly/cli",
"pluginName": "@sendly/cli",
"pluginType": "core",
"strict": true,
"isESM": true,
"relativePath": [
"dist",
"commands",
"webhooks",
"rotate-secret.js"
]
},
"webhooks:test": {
"aliases": [],
"args": {
"id": {
"description": "Webhook ID to test",
"name": "id",
"required": true
}
},
"description": "Send a test event to a webhook",
"examples": [
"<%= config.bin %> webhooks test whk_abc123",
"<%= config.bin %> webhooks test whk_abc123 --json"
],
"flags": {
"json": {
"description": "Output in JSON format",
"name": "json",
"allowNo": false,
"type": "boolean"
"limit": {
"char": "l",
"description": "Number of messages to show",
"name": "limit",
"default": 20,
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
},
"quiet": {
"char": "q",
"description": "Minimal output",
"name": "quiet",
"allowNo": false,
"type": "boolean"
"status": {
"char": "s",
"description": "Filter by status (scheduled, sent, cancelled, failed)",
"name": "status",
"hasDynamicHelp": false,
"multiple": false,
"type": "option"
}

@@ -1781,3 +1794,3 @@ },

"hiddenAliases": [],
"id": "webhooks:test",
"id": "sms:scheduled",
"pluginAlias": "@sendly/cli",

@@ -1791,22 +1804,15 @@ "pluginName": "@sendly/cli",

"commands",
"webhooks",
"test.js"
"sms",
"scheduled.js"
]
},
"webhooks:update": {
"sms:send": {
"aliases": [],
"args": {
"id": {
"description": "Webhook ID to update",
"name": "id",
"required": true
}
},
"description": "Update a webhook",
"args": {},
"description": "Send an SMS message",
"examples": [
"<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook",
"<%= config.bin %> webhooks update whk_abc123 --events message.delivered,message.failed",
"<%= config.bin %> webhooks update whk_abc123 --description \"Updated production webhook\"",
"<%= config.bin %> webhooks update whk_abc123 --active false",
"<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook --events message.sent --json"
"<%= config.bin %> sms send --to +15551234567 --text \"Hello!\"",
"<%= config.bin %> sms send --to +15551234567 --text \"Hello!\" --from \"Sendly\"",
"<%= config.bin %> sms send --to +15551234567 --text \"Hello!\" --type transactional",
"<%= config.bin %> sms send --to +15551234567 --text \"Hello!\" --json"
],

@@ -1827,6 +1833,7 @@ "flags": {

},
"url": {
"char": "u",
"description": "Update webhook URL (must be HTTPS)",
"name": "url",
"to": {
"char": "t",
"description": "Recipient phone number (E.164 format)",
"name": "to",
"required": true,
"hasDynamicHelp": false,

@@ -1836,6 +1843,7 @@ "multiple": false,

},
"events": {
"char": "e",
"description": "Update events list (comma-separated)",
"name": "events",
"text": {
"char": "m",
"description": "Message text",
"name": "text",
"required": true,
"hasDynamicHelp": false,

@@ -1845,6 +1853,6 @@ "multiple": false,

},
"description": {
"char": "d",
"description": "Update description",
"name": "description",
"from": {
"char": "f",
"description": "Sender ID or phone number",
"name": "from",
"hasDynamicHelp": false,

@@ -1854,19 +1862,11 @@ "multiple": false,

},
"active": {
"char": "a",
"description": "Enable or disable the webhook",
"name": "active",
"allowNo": true,
"type": "boolean"
},
"mode": {
"char": "m",
"description": "Update event mode filter: all, test (sandbox only), live (production only)",
"name": "mode",
"type": {
"description": "Message type: marketing (default) or transactional",
"name": "type",
"default": "marketing",
"hasDynamicHelp": false,
"multiple": false,
"options": [
"all",
"test",
"live"
"marketing",
"transactional"
],

@@ -1878,3 +1878,3 @@ "type": "option"

"hiddenAliases": [],
"id": "webhooks:update",
"id": "sms:send",
"pluginAlias": "@sendly/cli",

@@ -1888,8 +1888,8 @@ "pluginName": "@sendly/cli",

"commands",
"webhooks",
"update.js"
"sms",
"send.js"
]
}
},
"version": "3.6.0"
"version": "3.6.1"
}
{
"name": "@sendly/cli",
"version": "3.6.0",
"version": "3.6.1",
"type": "module",

@@ -5,0 +5,0 @@ "description": "Sendly CLI - Send SMS from your terminal",

@@ -224,3 +224,3 @@ # @sendly/cli

```bash
sendly config set baseUrl https://api.sendly.live
sendly config set baseUrl https://sendly.live
```

@@ -227,0 +227,0 @@