mxroute-cli 0.3.2 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +281 -11
  2. package/dist/commands/accounts-search.d.ts +1 -0
  3. package/dist/commands/accounts-search.js +66 -0
  4. package/dist/commands/accounts-search.js.map +1 -0
  5. package/dist/commands/accounts.js +39 -9
  6. package/dist/commands/accounts.js.map +1 -1
  7. package/dist/commands/aliases-sync.d.ts +1 -0
  8. package/dist/commands/aliases-sync.js +162 -0
  9. package/dist/commands/aliases-sync.js.map +1 -0
  10. package/dist/commands/autoresponder.js +7 -6
  11. package/dist/commands/autoresponder.js.map +1 -1
  12. package/dist/commands/backup.d.ts +1 -0
  13. package/dist/commands/backup.js +170 -0
  14. package/dist/commands/backup.js.map +1 -0
  15. package/dist/commands/bulk.js +52 -9
  16. package/dist/commands/bulk.js.map +1 -1
  17. package/dist/commands/catchall.js +2 -2
  18. package/dist/commands/catchall.js.map +1 -1
  19. package/dist/commands/cleanup.d.ts +1 -0
  20. package/dist/commands/cleanup.js +234 -0
  21. package/dist/commands/cleanup.js.map +1 -0
  22. package/dist/commands/config.js +9 -2
  23. package/dist/commands/config.js.map +1 -1
  24. package/dist/commands/credentials-export.d.ts +13 -0
  25. package/dist/commands/credentials-export.js +142 -0
  26. package/dist/commands/credentials-export.js.map +1 -0
  27. package/dist/commands/deprovision.d.ts +1 -0
  28. package/dist/commands/deprovision.js +125 -0
  29. package/dist/commands/deprovision.js.map +1 -0
  30. package/dist/commands/dns-setup.js +20 -3
  31. package/dist/commands/dns-setup.js.map +1 -1
  32. package/dist/commands/export-import.js +22 -1
  33. package/dist/commands/export-import.js.map +1 -1
  34. package/dist/commands/filters.js +2 -2
  35. package/dist/commands/filters.js.map +1 -1
  36. package/dist/commands/fix.js +1 -1
  37. package/dist/commands/fix.js.map +1 -1
  38. package/dist/commands/forwarders-validate.d.ts +1 -0
  39. package/dist/commands/forwarders-validate.js +190 -0
  40. package/dist/commands/forwarders-validate.js.map +1 -0
  41. package/dist/commands/forwarders.js +6 -5
  42. package/dist/commands/forwarders.js.map +1 -1
  43. package/dist/commands/lists.js +7 -6
  44. package/dist/commands/lists.js.map +1 -1
  45. package/dist/commands/mail.d.ts +15 -0
  46. package/dist/commands/mail.js +998 -0
  47. package/dist/commands/mail.js.map +1 -0
  48. package/dist/commands/migrate.js.map +1 -1
  49. package/dist/commands/onboard.js +11 -4
  50. package/dist/commands/onboard.js.map +1 -1
  51. package/dist/commands/password-audit.d.ts +1 -0
  52. package/dist/commands/password-audit.js +304 -0
  53. package/dist/commands/password-audit.js.map +1 -0
  54. package/dist/commands/password.d.ts +1 -0
  55. package/dist/commands/password.js +96 -0
  56. package/dist/commands/password.js.map +1 -0
  57. package/dist/commands/provision.d.ts +13 -0
  58. package/dist/commands/provision.js +306 -0
  59. package/dist/commands/provision.js.map +1 -0
  60. package/dist/commands/quota-policy.d.ts +3 -0
  61. package/dist/commands/quota-policy.js +192 -0
  62. package/dist/commands/quota-policy.js.map +1 -0
  63. package/dist/commands/quota.js +1 -1
  64. package/dist/commands/quota.js.map +1 -1
  65. package/dist/commands/rate-limit.d.ts +2 -0
  66. package/dist/commands/rate-limit.js +121 -0
  67. package/dist/commands/rate-limit.js.map +1 -0
  68. package/dist/commands/reputation.d.ts +1 -0
  69. package/dist/commands/reputation.js +265 -0
  70. package/dist/commands/reputation.js.map +1 -0
  71. package/dist/commands/schedule.d.ts +3 -0
  72. package/dist/commands/schedule.js +270 -0
  73. package/dist/commands/schedule.js.map +1 -0
  74. package/dist/commands/send.js +2 -1
  75. package/dist/commands/send.js.map +1 -1
  76. package/dist/commands/setup.js +22 -0
  77. package/dist/commands/setup.js.map +1 -1
  78. package/dist/commands/share.js +20 -10
  79. package/dist/commands/share.js.map +1 -1
  80. package/dist/commands/smtp-debug.d.ts +1 -0
  81. package/dist/commands/smtp-debug.js +188 -0
  82. package/dist/commands/smtp-debug.js.map +1 -0
  83. package/dist/commands/spam.js +3 -3
  84. package/dist/commands/spam.js.map +1 -1
  85. package/dist/commands/ssl-check.d.ts +1 -0
  86. package/dist/commands/ssl-check.js +145 -0
  87. package/dist/commands/ssl-check.js.map +1 -0
  88. package/dist/commands/status.js +53 -1
  89. package/dist/commands/status.js.map +1 -1
  90. package/dist/commands/templates.d.ts +4 -0
  91. package/dist/commands/templates.js +310 -0
  92. package/dist/commands/templates.js.map +1 -0
  93. package/dist/commands/test-delivery.d.ts +1 -0
  94. package/dist/commands/test-delivery.js +87 -0
  95. package/dist/commands/test-delivery.js.map +1 -0
  96. package/dist/commands/usage-history.d.ts +1 -0
  97. package/dist/commands/usage-history.js +173 -0
  98. package/dist/commands/usage-history.js.map +1 -0
  99. package/dist/commands/webhook.js +18 -3
  100. package/dist/commands/webhook.js.map +1 -1
  101. package/dist/commands/welcome-send.d.ts +11 -0
  102. package/dist/commands/welcome-send.js +163 -0
  103. package/dist/commands/welcome-send.js.map +1 -0
  104. package/dist/index.js +362 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/mcp.js +1940 -10
  107. package/dist/mcp.js.map +1 -1
  108. package/dist/utils/config.js +1 -1
  109. package/dist/utils/config.js.map +1 -1
  110. package/dist/utils/directadmin.js +23 -2
  111. package/dist/utils/directadmin.js.map +1 -1
  112. package/dist/utils/imap.d.ts +61 -0
  113. package/dist/utils/imap.js +424 -0
  114. package/dist/utils/imap.js.map +1 -0
  115. package/dist/utils/mime.d.ts +50 -0
  116. package/dist/utils/mime.js +369 -0
  117. package/dist/utils/mime.js.map +1 -0
  118. package/dist/utils/shared.d.ts +10 -0
  119. package/dist/utils/shared.js +28 -1
  120. package/dist/utils/shared.js.map +1 -1
  121. package/package.json +1 -1
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.selfServicePasswordChange = selfServicePasswordChange;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const inquirer_1 = __importDefault(require("inquirer"));
10
+ const theme_1 = require("../utils/theme");
11
+ const config_1 = require("../utils/config");
12
+ const directadmin_1 = require("../utils/directadmin");
13
+ const shared_1 = require("../utils/shared");
14
+ const imap_1 = require("../utils/imap");
15
+ async function selfServicePasswordChange() {
16
+ const config = (0, config_1.getConfig)();
17
+ if (!config.username) {
18
+ console.log(theme_1.theme.error('\n No user configured. Run mxroute config setup first.\n'));
19
+ process.exit(1);
20
+ }
21
+ console.log(theme_1.theme.heading('Change Your Password'));
22
+ console.log(theme_1.theme.muted(` Account: ${config.username}\n`));
23
+ const { currentPassword } = await inquirer_1.default.prompt([
24
+ {
25
+ type: 'password',
26
+ name: 'currentPassword',
27
+ message: theme_1.theme.secondary('Current password:'),
28
+ mask: '•',
29
+ validate: (input) => (input.length > 0 ? true : 'Password is required'),
30
+ },
31
+ ]);
32
+ const verifySpinner = (0, ora_1.default)({ text: 'Verifying current password...', spinner: 'dots12', color: 'cyan' }).start();
33
+ try {
34
+ const imap = new imap_1.ImapClient({
35
+ host: `${config.server}.mxrouting.net`,
36
+ port: 993,
37
+ user: config.username,
38
+ password: currentPassword,
39
+ });
40
+ await imap.connect();
41
+ await imap.login();
42
+ await imap.logout();
43
+ imap.disconnect();
44
+ verifySpinner.succeed(chalk_1.default.green('Current password verified'));
45
+ }
46
+ catch (err) {
47
+ verifySpinner.fail(chalk_1.default.red('Authentication failed'));
48
+ console.log(theme_1.theme.error(` Invalid current password. Please try again.\n`));
49
+ process.exit(1);
50
+ }
51
+ const { newPassword } = await inquirer_1.default.prompt([
52
+ {
53
+ type: 'password',
54
+ name: 'newPassword',
55
+ message: theme_1.theme.secondary('New password (min 8 chars, mix of upper/lower/numbers):'),
56
+ mask: '•',
57
+ validate: (input) => {
58
+ if (input.length < 8)
59
+ return 'Password must be at least 8 characters';
60
+ if (!/[A-Z]/.test(input) || !/[a-z]/.test(input) || !/[0-9]/.test(input)) {
61
+ return 'Weak password — use a mix of uppercase, lowercase, and numbers';
62
+ }
63
+ return true;
64
+ },
65
+ },
66
+ ]);
67
+ await inquirer_1.default.prompt([
68
+ {
69
+ type: 'password',
70
+ name: 'confirmPassword',
71
+ message: theme_1.theme.secondary('Confirm new password:'),
72
+ mask: '•',
73
+ validate: (input) => (input === newPassword ? true : 'Passwords do not match'),
74
+ },
75
+ ]);
76
+ const [user, domain] = config.username.split('@');
77
+ const creds = (0, shared_1.getCreds)();
78
+ const updateSpinner = (0, ora_1.default)({ text: 'Updating password...', spinner: 'dots12', color: 'cyan' }).start();
79
+ try {
80
+ const result = await (0, directadmin_1.changeEmailPassword)(creds, domain, user, newPassword);
81
+ if (result.error && result.error !== '0') {
82
+ updateSpinner.fail(chalk_1.default.red('Failed to change password'));
83
+ const msg = result.text || result.details || 'Unknown error — check credentials and try again';
84
+ console.log(theme_1.theme.error(` ${msg}\n`));
85
+ }
86
+ else {
87
+ updateSpinner.succeed(chalk_1.default.green('Password changed successfully'));
88
+ console.log(theme_1.theme.muted(`\n Your password for ${config.username} has been updated.\n`));
89
+ }
90
+ }
91
+ catch (err) {
92
+ updateSpinner.fail(chalk_1.default.red('Failed to change password'));
93
+ console.log(theme_1.theme.error(` ${err.message}\n`));
94
+ }
95
+ }
96
+ //# sourceMappingURL=password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password.js","sourceRoot":"","sources":["../../src/commands/password.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ interface ProvisionResult {
2
+ type: 'account' | 'forwarder';
3
+ domain: string;
4
+ resource: string;
5
+ status: 'created' | 'skipped' | 'failed';
6
+ password?: string;
7
+ error?: string;
8
+ }
9
+ export declare function generatePassword(): string;
10
+ export declare function provisionPlan(manifestPath: string): Promise<void>;
11
+ export declare function provisionExecute(manifestPath: string): Promise<ProvisionResult[]>;
12
+ export declare function provisionGenerate(domain?: string): Promise<void>;
13
+ export {};
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generatePassword = generatePassword;
40
+ exports.provisionPlan = provisionPlan;
41
+ exports.provisionExecute = provisionExecute;
42
+ exports.provisionGenerate = provisionGenerate;
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const ora_1 = __importDefault(require("ora"));
45
+ const inquirer_1 = __importDefault(require("inquirer"));
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const crypto = __importStar(require("crypto"));
49
+ const theme_1 = require("../utils/theme");
50
+ const shared_1 = require("../utils/shared");
51
+ const directadmin_1 = require("../utils/directadmin");
52
+ function generatePassword() {
53
+ const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
54
+ const lower = 'abcdefghijklmnopqrstuvwxyz';
55
+ const digits = '0123456789';
56
+ const special = '!@#$%^&*_+-=';
57
+ const all = upper + lower + digits + special;
58
+ const chars = [
59
+ upper[crypto.randomInt(upper.length)],
60
+ lower[crypto.randomInt(lower.length)],
61
+ digits[crypto.randomInt(digits.length)],
62
+ special[crypto.randomInt(special.length)],
63
+ ];
64
+ for (let i = 4; i < 16; i++) {
65
+ chars.push(all[crypto.randomInt(all.length)]);
66
+ }
67
+ for (let i = chars.length - 1; i > 0; i--) {
68
+ const j = crypto.randomInt(i + 1);
69
+ [chars[i], chars[j]] = [chars[j], chars[i]];
70
+ }
71
+ return chars.join('');
72
+ }
73
+ function loadManifest(manifestPath) {
74
+ const resolved = path.resolve(manifestPath);
75
+ if (!fs.existsSync(resolved)) {
76
+ throw new Error(`Manifest file not found: ${resolved}`);
77
+ }
78
+ const raw = fs.readFileSync(resolved, 'utf-8');
79
+ const manifest = JSON.parse(raw);
80
+ if (!manifest.domains || !Array.isArray(manifest.domains) || manifest.domains.length === 0) {
81
+ throw new Error('Manifest must contain a non-empty "domains" array');
82
+ }
83
+ for (const domain of manifest.domains) {
84
+ if (!domain.name) {
85
+ throw new Error('Each domain entry must have a "name" field');
86
+ }
87
+ }
88
+ return manifest;
89
+ }
90
+ async function provisionPlan(manifestPath) {
91
+ const creds = (0, shared_1.getCreds)();
92
+ const manifest = loadManifest(manifestPath);
93
+ console.log(theme_1.theme.heading(`Provision Plan${manifest.company ? `: ${manifest.company}` : ''}`));
94
+ const spinner = (0, ora_1.default)({ text: 'Analyzing existing resources...', spinner: 'dots12', color: 'cyan' }).start();
95
+ let createCount = 0;
96
+ let skipCount = 0;
97
+ try {
98
+ for (const domain of manifest.domains) {
99
+ const existingAccounts = await (0, directadmin_1.listEmailAccounts)(creds, domain.name);
100
+ const existingForwarders = await (0, directadmin_1.listForwarders)(creds, domain.name);
101
+ spinner.stop();
102
+ console.log(theme_1.theme.subheading(`\n ${domain.name}`));
103
+ if (domain.accounts) {
104
+ for (const acct of domain.accounts) {
105
+ if (existingAccounts.includes(acct.user)) {
106
+ console.log(chalk_1.default.yellow(` SKIP account ${acct.user}@${domain.name} (already exists)`));
107
+ skipCount++;
108
+ }
109
+ else {
110
+ const quota = acct.quota !== undefined ? `${acct.quota}MB` : 'unlimited';
111
+ console.log(chalk_1.default.green(` CREATE account ${acct.user}@${domain.name} (${quota})`));
112
+ createCount++;
113
+ }
114
+ }
115
+ }
116
+ if (domain.forwarders) {
117
+ for (const fwd of domain.forwarders) {
118
+ if (existingForwarders.includes(fwd.from)) {
119
+ console.log(chalk_1.default.yellow(` SKIP fwd ${fwd.from}@${domain.name} (already exists)`));
120
+ skipCount++;
121
+ }
122
+ else {
123
+ console.log(chalk_1.default.green(` CREATE fwd ${fwd.from}@${domain.name} -> ${fwd.to}`));
124
+ createCount++;
125
+ }
126
+ }
127
+ }
128
+ if (domain.catchall) {
129
+ console.log(chalk_1.default.green(` SET catchall ${domain.name} -> ${domain.catchall}`));
130
+ }
131
+ spinner.start();
132
+ }
133
+ spinner.stop();
134
+ console.log(theme_1.theme.muted(`\n Total: ${chalk_1.default.green(`${createCount} to create`)}, ${chalk_1.default.yellow(`${skipCount} to skip`)}\n`));
135
+ }
136
+ catch (err) {
137
+ spinner.fail(chalk_1.default.red('Failed to analyze resources'));
138
+ console.log(theme_1.theme.error(` ${err.message}\n`));
139
+ }
140
+ }
141
+ async function provisionExecute(manifestPath) {
142
+ const creds = (0, shared_1.getCreds)();
143
+ const manifest = loadManifest(manifestPath);
144
+ const results = [];
145
+ console.log(theme_1.theme.heading(`Provisioning${manifest.company ? `: ${manifest.company}` : ''}`));
146
+ const spinner = (0, ora_1.default)({ text: 'Checking existing resources...', spinner: 'dots12', color: 'cyan' }).start();
147
+ try {
148
+ for (const domain of manifest.domains) {
149
+ const existingAccounts = await (0, directadmin_1.listEmailAccounts)(creds, domain.name);
150
+ const existingForwarders = await (0, directadmin_1.listForwarders)(creds, domain.name);
151
+ spinner.stop();
152
+ console.log(theme_1.theme.subheading(`\n ${domain.name}`));
153
+ if (domain.accounts) {
154
+ for (const acct of domain.accounts) {
155
+ if (existingAccounts.includes(acct.user)) {
156
+ console.log(chalk_1.default.yellow(` SKIP ${acct.user}@${domain.name}`));
157
+ results.push({ type: 'account', domain: domain.name, resource: acct.user, status: 'skipped' });
158
+ continue;
159
+ }
160
+ const password = acct.password || generatePassword();
161
+ const acctSpinner = (0, ora_1.default)({
162
+ text: `Creating ${acct.user}@${domain.name}...`,
163
+ spinner: 'dots12',
164
+ color: 'cyan',
165
+ }).start();
166
+ try {
167
+ const result = await (0, directadmin_1.createEmailAccount)(creds, domain.name, acct.user, password, acct.quota || 0);
168
+ if (result.error && result.error !== '0') {
169
+ acctSpinner.fail(`${acct.user}@${domain.name}: ${result.text || 'Failed'}`);
170
+ results.push({
171
+ type: 'account',
172
+ domain: domain.name,
173
+ resource: acct.user,
174
+ status: 'failed',
175
+ error: result.text,
176
+ });
177
+ }
178
+ else {
179
+ if (acct.quota && acct.quota > 0) {
180
+ await (0, directadmin_1.changeEmailQuota)(creds, domain.name, acct.user, acct.quota);
181
+ }
182
+ acctSpinner.succeed(chalk_1.default.green(`${acct.user}@${domain.name}`));
183
+ results.push({ type: 'account', domain: domain.name, resource: acct.user, status: 'created', password });
184
+ }
185
+ }
186
+ catch (err) {
187
+ acctSpinner.fail(`${acct.user}@${domain.name}: ${err.message}`);
188
+ results.push({
189
+ type: 'account',
190
+ domain: domain.name,
191
+ resource: acct.user,
192
+ status: 'failed',
193
+ error: err.message,
194
+ });
195
+ }
196
+ }
197
+ }
198
+ if (domain.forwarders) {
199
+ for (const fwd of domain.forwarders) {
200
+ if (existingForwarders.includes(fwd.from)) {
201
+ console.log(chalk_1.default.yellow(` SKIP ${fwd.from}@${domain.name}`));
202
+ results.push({ type: 'forwarder', domain: domain.name, resource: fwd.from, status: 'skipped' });
203
+ continue;
204
+ }
205
+ const fwdSpinner = (0, ora_1.default)({
206
+ text: `Creating forwarder ${fwd.from}@${domain.name}...`,
207
+ spinner: 'dots12',
208
+ color: 'cyan',
209
+ }).start();
210
+ try {
211
+ const result = await (0, directadmin_1.createForwarder)(creds, domain.name, fwd.from, fwd.to);
212
+ if (result.error && result.error !== '0') {
213
+ fwdSpinner.fail(`${fwd.from}@${domain.name}: ${result.text || 'Failed'}`);
214
+ results.push({
215
+ type: 'forwarder',
216
+ domain: domain.name,
217
+ resource: fwd.from,
218
+ status: 'failed',
219
+ error: result.text,
220
+ });
221
+ }
222
+ else {
223
+ fwdSpinner.succeed(chalk_1.default.green(`${fwd.from}@${domain.name} -> ${fwd.to}`));
224
+ results.push({ type: 'forwarder', domain: domain.name, resource: fwd.from, status: 'created' });
225
+ }
226
+ }
227
+ catch (err) {
228
+ fwdSpinner.fail(`${fwd.from}@${domain.name}: ${err.message}`);
229
+ results.push({
230
+ type: 'forwarder',
231
+ domain: domain.name,
232
+ resource: fwd.from,
233
+ status: 'failed',
234
+ error: err.message,
235
+ });
236
+ }
237
+ }
238
+ }
239
+ spinner.start();
240
+ }
241
+ spinner.stop();
242
+ const created = results.filter((r) => r.status === 'created').length;
243
+ const skipped = results.filter((r) => r.status === 'skipped').length;
244
+ const failed = results.filter((r) => r.status === 'failed').length;
245
+ console.log('');
246
+ console.log(theme_1.theme.success(` ${created} created`));
247
+ if (skipped > 0)
248
+ console.log(theme_1.theme.muted(` ${skipped} skipped`));
249
+ if (failed > 0)
250
+ console.log(theme_1.theme.error(` ${failed} failed`));
251
+ console.log('');
252
+ }
253
+ catch (err) {
254
+ spinner.fail(chalk_1.default.red('Provisioning failed'));
255
+ console.log(theme_1.theme.error(` ${err.message}\n`));
256
+ }
257
+ return results;
258
+ }
259
+ async function provisionGenerate(domain) {
260
+ const creds = (0, shared_1.getCreds)();
261
+ let targetDomain = domain;
262
+ if (!targetDomain) {
263
+ const domains = await (0, directadmin_1.listDomains)(creds);
264
+ if (domains.length === 0) {
265
+ console.log(theme_1.theme.error('\n No domains found.\n'));
266
+ return;
267
+ }
268
+ const answer = await inquirer_1.default.prompt([
269
+ {
270
+ type: 'list',
271
+ name: 'domain',
272
+ message: 'Select domain to generate manifest for:',
273
+ choices: domains,
274
+ },
275
+ ]);
276
+ targetDomain = answer.domain;
277
+ }
278
+ console.log(theme_1.theme.heading(`Generate Manifest: ${targetDomain}`));
279
+ const spinner = (0, ora_1.default)({ text: 'Fetching existing configuration...', spinner: 'dots12', color: 'cyan' }).start();
280
+ try {
281
+ const accounts = await (0, directadmin_1.listEmailAccounts)(creds, targetDomain);
282
+ const forwarders = await (0, directadmin_1.listForwarders)(creds, targetDomain);
283
+ spinner.stop();
284
+ const manifest = {
285
+ domains: [
286
+ {
287
+ name: targetDomain,
288
+ accounts: accounts.map((user) => ({ user })),
289
+ forwarders: forwarders.map((from) => ({ from, to: '' })),
290
+ },
291
+ ],
292
+ };
293
+ const filename = `provision-${targetDomain}.json`;
294
+ const outputPath = path.resolve(filename);
295
+ fs.writeFileSync(outputPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
296
+ console.log(theme_1.theme.success(`\n Manifest written to ${filename}`));
297
+ console.log(theme_1.theme.muted(` ${accounts.length} account(s), ${forwarders.length} forwarder(s)`));
298
+ console.log(theme_1.theme.muted(`\n Note: forwarder destinations and passwords are not exported.`));
299
+ console.log(theme_1.theme.muted(` Edit the file to fill in missing values before re-provisioning.\n`));
300
+ }
301
+ catch (err) {
302
+ spinner.fail(chalk_1.default.red('Failed to generate manifest'));
303
+ console.log(theme_1.theme.error(` ${err.message}\n`));
304
+ }
305
+ }
306
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function matchPattern(email: string, pattern: string): boolean;
2
+ export declare function quotaPolicyApply(domain?: string): Promise<void>;
3
+ export declare function quotaPolicyGenerate(domain?: string): Promise<void>;
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.matchPattern = matchPattern;
40
+ exports.quotaPolicyApply = quotaPolicyApply;
41
+ exports.quotaPolicyGenerate = quotaPolicyGenerate;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const chalk_1 = __importDefault(require("chalk"));
45
+ const ora_1 = __importDefault(require("ora"));
46
+ const inquirer_1 = __importDefault(require("inquirer"));
47
+ const theme_1 = require("../utils/theme");
48
+ const shared_1 = require("../utils/shared");
49
+ const directadmin_1 = require("../utils/directadmin");
50
+ function matchPattern(email, pattern) {
51
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
52
+ return new RegExp(`^${escaped}$`).test(email);
53
+ }
54
+ async function quotaPolicyApply(domain) {
55
+ const creds = (0, shared_1.getCreds)();
56
+ const targetDomain = await (0, shared_1.pickDomain)(creds, domain);
57
+ console.log(theme_1.theme.heading(`Quota Policy: ${targetDomain}`));
58
+ const spinner = (0, ora_1.default)({ text: 'Fetching accounts...', spinner: 'dots12', color: 'cyan' }).start();
59
+ const accounts = await (0, directadmin_1.listEmailAccounts)(creds, targetDomain);
60
+ spinner.stop();
61
+ if (accounts.length === 0) {
62
+ console.log(theme_1.theme.error(`\n ${theme_1.theme.statusIcon('fail')} No email accounts found on ${targetDomain}.\n`));
63
+ return;
64
+ }
65
+ console.log(theme_1.theme.muted(` Found ${accounts.length} account(s)\n`));
66
+ const { approach } = await inquirer_1.default.prompt([
67
+ {
68
+ type: 'list',
69
+ name: 'approach',
70
+ message: 'Policy approach:',
71
+ choices: [
72
+ { name: 'Apply same quota to all', value: 'uniform' },
73
+ { name: 'Apply from policy file', value: 'file' },
74
+ ],
75
+ },
76
+ ]);
77
+ let plan = [];
78
+ if (approach === 'uniform') {
79
+ const { quotaMB } = await inquirer_1.default.prompt([
80
+ {
81
+ type: 'input',
82
+ name: 'quotaMB',
83
+ message: 'Quota for all accounts (MB, 0 = unlimited):',
84
+ validate: (input) => (/^\d+$/.test(input) ? true : 'Enter a number'),
85
+ },
86
+ ]);
87
+ const quota = Number(quotaMB);
88
+ plan = accounts.map((user) => ({ user, quota }));
89
+ }
90
+ else {
91
+ const { filePath } = await inquirer_1.default.prompt([
92
+ {
93
+ type: 'input',
94
+ name: 'filePath',
95
+ message: theme_1.theme.secondary('Policy file path:'),
96
+ validate: (input) => (fs.existsSync(input) ? true : 'File not found'),
97
+ },
98
+ ]);
99
+ let policy;
100
+ try {
101
+ policy = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
102
+ }
103
+ catch {
104
+ console.log(theme_1.theme.error('\n Invalid JSON in policy file.\n'));
105
+ return;
106
+ }
107
+ if (!policy.rules || !Array.isArray(policy.rules)) {
108
+ console.log(theme_1.theme.error('\n Policy file must contain a "rules" array.\n'));
109
+ return;
110
+ }
111
+ for (const user of accounts) {
112
+ const rule = policy.rules.find((r) => matchPattern(user, r.pattern));
113
+ if (rule) {
114
+ plan.push({ user, quota: rule.quota });
115
+ }
116
+ }
117
+ }
118
+ if (plan.length === 0) {
119
+ console.log(theme_1.theme.muted('\n No accounts matched any rules.\n'));
120
+ return;
121
+ }
122
+ console.log(theme_1.theme.subheading('\n Quota Plan:\n'));
123
+ for (const entry of plan) {
124
+ const quotaLabel = entry.quota === 0 ? 'unlimited' : `${entry.quota} MB`;
125
+ console.log(theme_1.theme.muted(` ${entry.user}@${targetDomain} → ${chalk_1.default.white(quotaLabel)}`));
126
+ }
127
+ console.log('');
128
+ const { confirm } = await inquirer_1.default.prompt([
129
+ {
130
+ type: 'confirm',
131
+ name: 'confirm',
132
+ message: `Apply quota to ${plan.length} account(s)?`,
133
+ default: false,
134
+ },
135
+ ]);
136
+ if (!confirm) {
137
+ console.log(theme_1.theme.muted('\n Cancelled.\n'));
138
+ return;
139
+ }
140
+ let success = 0;
141
+ let failed = 0;
142
+ for (let idx = 0; idx < plan.length; idx++) {
143
+ const entry = plan[idx];
144
+ const sp = (0, ora_1.default)({
145
+ text: `[${idx + 1}/${plan.length}] Setting quota for ${entry.user}@${targetDomain}...`,
146
+ spinner: 'dots12',
147
+ color: 'cyan',
148
+ }).start();
149
+ try {
150
+ const result = await (0, directadmin_1.changeEmailQuota)(creds, targetDomain, entry.user, entry.quota);
151
+ if (result.error && result.error !== '0') {
152
+ sp.fail(`${entry.user}: ${result.text || 'Failed'}`);
153
+ failed++;
154
+ }
155
+ else {
156
+ const quotaLabel = entry.quota === 0 ? 'unlimited' : `${entry.quota} MB`;
157
+ sp.succeed(`${entry.user}@${targetDomain} → ${quotaLabel}`);
158
+ success++;
159
+ }
160
+ }
161
+ catch (err) {
162
+ sp.fail(`${entry.user}: ${err.message}`);
163
+ failed++;
164
+ }
165
+ }
166
+ console.log('');
167
+ console.log(theme_1.theme.success(` ${success} updated`));
168
+ if (failed > 0)
169
+ console.log(theme_1.theme.error(` ${failed} failed`));
170
+ console.log('');
171
+ }
172
+ async function quotaPolicyGenerate(domain) {
173
+ const creds = (0, shared_1.getCreds)();
174
+ const targetDomain = await (0, shared_1.pickDomain)(creds, domain);
175
+ console.log(theme_1.theme.heading(`Generate Quota Policy: ${targetDomain}`));
176
+ const spinner = (0, ora_1.default)({ text: 'Fetching accounts...', spinner: 'dots12', color: 'cyan' }).start();
177
+ const accounts = await (0, directadmin_1.listEmailAccounts)(creds, targetDomain);
178
+ spinner.stop();
179
+ if (accounts.length === 0) {
180
+ console.log(theme_1.theme.error(`\n ${theme_1.theme.statusIcon('fail')} No email accounts found on ${targetDomain}.\n`));
181
+ return;
182
+ }
183
+ const policy = {
184
+ rules: accounts.map((user) => ({ pattern: user, quota: 2000 })),
185
+ };
186
+ const fileName = `quota-policy-${targetDomain}.json`;
187
+ const filePath = path.resolve(process.cwd(), fileName);
188
+ fs.writeFileSync(filePath, JSON.stringify(policy, null, 2) + '\n', 'utf-8');
189
+ console.log(theme_1.theme.success(`\n ${theme_1.theme.statusIcon('pass')} Policy file generated with ${accounts.length} account(s)`));
190
+ console.log(theme_1.theme.muted(` ${filePath}\n`));
191
+ }
192
+ //# sourceMappingURL=quota-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-policy.js","sourceRoot":"","sources":["../../src/commands/quota-policy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,oCAGC;AAED,4CAiIC;AAED,kDA2BC;AArLD,uCAAyB;AACzB,2CAA6B;AAC7B,kDAA0B;AAC1B,8CAAsB;AACtB,wDAAgC;AAChC,0CAAuC;AACvC,4CAAuD;AACvD,sDAAgG;AAWhG,SAAgB,YAAY,CAAC,KAAa,EAAE,OAAe;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClF,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,MAAe;IACpD,MAAM,KAAK,GAAG,IAAA,iBAAQ,GAAE,CAAC;IACzB,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAU,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,OAAO,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAChG,MAAM,QAAQ,GAAG,MAAM,IAAA,+BAAiB,EAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,OAAO,aAAK,CAAC,UAAU,CAAC,MAAM,CAAC,+BAA+B,YAAY,KAAK,CAAC,CAAC,CAAC;QAC1G,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,WAAW,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC;IAEpE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACzC;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrD,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE;aAClD;SACF;KACF,CAAC,CAAC;IAEH,IAAI,IAAI,GAA2C,EAAE,CAAC;IAEtD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,6CAA6C;gBACtD,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;aAC7E;SACF,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACzC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,aAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC;gBAC7C,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;aAC9E;SACF,CAAC,CAAC;QAEH,IAAI,MAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACrE,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,YAAY,MAAM,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACxC;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,kBAAkB,IAAI,CAAC,MAAM,cAAc;YACpD,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,IAAA,aAAG,EAAC;YACb,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,uBAAuB,KAAK,CAAC,IAAI,IAAI,YAAY,KAAK;YACtF,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAgB,EAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACpF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBACzC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC;gBACrD,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC;gBACzE,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,YAAY,MAAM,UAAU,EAAE,CAAC,CAAC;gBAC5D,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,OAAO,CAAC,KAAK,OAAO,UAAU,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,MAAe;IACvD,MAAM,KAAK,GAAG,IAAA,iBAAQ,GAAE,CAAC;IACzB,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAU,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,OAAO,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC,CAAC;IAErE,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAChG,MAAM,QAAQ,GAAG,MAAM,IAAA,+BAAiB,EAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,OAAO,aAAK,CAAC,UAAU,CAAC,MAAM,CAAC,+BAA+B,YAAY,KAAK,CAAC,CAAC,CAAC;QAC1G,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAe;QACzB,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;KAChE,CAAC;IAEF,MAAM,QAAQ,GAAG,gBAAgB,YAAY,OAAO,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACvD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAE5E,OAAO,CAAC,GAAG,CACT,aAAK,CAAC,OAAO,CAAC,OAAO,aAAK,CAAC,UAAU,CAAC,MAAM,CAAC,+BAA+B,QAAQ,CAAC,MAAM,aAAa,CAAC,CAC1G,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC"}