ftpd-lite 1.0.8 → 1.0.15

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.
@@ -0,0 +1,54 @@
1
+ import { UserPermissions } from '../types';
2
+ export declare class DatabaseManager {
3
+ private db;
4
+ private dbPath;
5
+ constructor(dbPath?: string);
6
+ getDbPath(): string;
7
+ init(): void;
8
+ close(): void;
9
+ private getDb;
10
+ getAllUsers(): Array<{
11
+ id: number;
12
+ username: string;
13
+ password: string;
14
+ homeDir: string;
15
+ permissions: UserPermissions;
16
+ isActive: boolean;
17
+ }>;
18
+ getUserByUsername(username: string): Array<{
19
+ id: number;
20
+ username: string;
21
+ password: string;
22
+ homeDir: string;
23
+ permissions: UserPermissions;
24
+ isActive: boolean;
25
+ }> | null;
26
+ addUser({ username, password, homeDir, permissions, isActive, }: {
27
+ username: string;
28
+ password: string;
29
+ homeDir: string;
30
+ permissions: UserPermissions;
31
+ isActive?: boolean;
32
+ }): boolean;
33
+ deleteUser(username: string): boolean;
34
+ toggleUserStatus(username: string, isActive: boolean): boolean;
35
+ updatePermissions(username: string, permissions: UserPermissions): boolean;
36
+ changeUsername(oldUsername: string, newUsername: string): boolean;
37
+ changePassword(username: string, newPassword: string): boolean;
38
+ changeHomeDir(username: string, newHomeDir: string): boolean;
39
+ getActiveUsers(): Array<{
40
+ id: number;
41
+ username: string;
42
+ password: string;
43
+ homeDir: string;
44
+ permissions: UserPermissions;
45
+ isActive: boolean;
46
+ }>;
47
+ getUserCount(): number;
48
+ getSetting(key: string): string | null;
49
+ setSetting(key: string, value: string, description?: string): void;
50
+ deleteSetting(key: string): boolean;
51
+ getAllSettings(): Record<string, string>;
52
+ toLinuxString(permissions: UserPermissions | undefined | null): string;
53
+ fromLinuxString(value: string | null | undefined): UserPermissions;
54
+ }
@@ -0,0 +1,252 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DatabaseManager = void 0;
37
+ const node_sqlite_1 = require("node:sqlite");
38
+ const path = __importStar(require("path"));
39
+ class DatabaseManager {
40
+ constructor(dbPath) {
41
+ this.db = null;
42
+ this.dbPath = dbPath ?? path.join(__dirname, '../../ftpd.db');
43
+ }
44
+ getDbPath() {
45
+ return this.dbPath;
46
+ }
47
+ init() {
48
+ this.db = new node_sqlite_1.DatabaseSync(this.dbPath);
49
+ this.db.exec(`
50
+ PRAGMA journal_mode = WAL;
51
+
52
+ CREATE TABLE IF NOT EXISTS users (
53
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
54
+ username TEXT UNIQUE NOT NULL,
55
+ password TEXT NOT NULL,
56
+ homeDir TEXT NOT NULL,
57
+ permissions TEXT NOT NULL DEFAULT '{}',
58
+ isActive INTEGER NOT NULL DEFAULT 1,
59
+ createdAt TEXT NOT NULL DEFAULT (datetime(\'now\')),
60
+ updatedAt TEXT NOT NULL DEFAULT (datetime(\'now\'))
61
+ );
62
+
63
+ CREATE TABLE IF NOT EXISTS settings (
64
+ key TEXT PRIMARY KEY,
65
+ value TEXT NOT NULL,
66
+ description TEXT,
67
+ updatedAt TEXT NOT NULL DEFAULT (datetime(\'now\'))
68
+ );
69
+
70
+ CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
71
+ CREATE INDEX IF NOT EXISTS idx_users_active ON users(isActive);
72
+ `);
73
+ console.log(`[DatabaseManager] SQLite veritabanı hazır: ${this.dbPath}`);
74
+ }
75
+ close() {
76
+ if (this.db) {
77
+ this.db.close();
78
+ this.db = null;
79
+ }
80
+ }
81
+ getDb() {
82
+ if (!this.db) {
83
+ throw new Error('Veritabanı başlatılmamış. Önce init() çağırılmalıdır.');
84
+ }
85
+ return this.db;
86
+ }
87
+ getAllUsers() {
88
+ const rows = this.getDb().prepare('SELECT id, username, password, homeDir, permissions, isActive FROM users').all();
89
+ return rows.map((row) => ({
90
+ id: row.id,
91
+ username: row.username,
92
+ password: row.password,
93
+ homeDir: row.homeDir,
94
+ permissions: this.fromLinuxString(String(row.permissions ?? 'rwxr-xr-x')),
95
+ isActive: row.isActive === 1,
96
+ }));
97
+ }
98
+ getUserByUsername(username) {
99
+ const row = this.getDb().prepare('SELECT id, username, password, homeDir, permissions, isActive FROM users WHERE username = ?').get(username);
100
+ if (!row) {
101
+ return null;
102
+ }
103
+ return [
104
+ {
105
+ id: row.id,
106
+ username: row.username,
107
+ password: row.password,
108
+ homeDir: row.homeDir,
109
+ permissions: this.fromLinuxString(String(row.permissions ?? 'rwxr-xr-x')),
110
+ isActive: row.isActive === 1,
111
+ },
112
+ ];
113
+ }
114
+ addUser({ username, password, homeDir, permissions, isActive = true, }) {
115
+ try {
116
+ const existing = this.getUserByUsername(username);
117
+ if (existing && existing.length > 0) {
118
+ return false;
119
+ }
120
+ this.getDb()
121
+ .prepare(`INSERT INTO users (username, password, homeDir, permissions, isActive)
122
+ VALUES (?, ?, ?, ?, ?)`)
123
+ .run(username, password, homeDir, this.toLinuxString(permissions), isActive ? 1 : 0);
124
+ return true;
125
+ }
126
+ catch (error) {
127
+ console.error('[DatabaseManager] addUser error:', error);
128
+ return false;
129
+ }
130
+ }
131
+ deleteUser(username) {
132
+ const result = this.getDb()
133
+ .prepare('DELETE FROM users WHERE username = ?')
134
+ .run(username);
135
+ return result.changes > 0;
136
+ }
137
+ toggleUserStatus(username, isActive) {
138
+ const result = this.getDb()
139
+ .prepare('UPDATE users SET isActive = ?, updatedAt = datetime(\'now\') WHERE username = ?')
140
+ .run(isActive ? 1 : 0, username);
141
+ return result.changes > 0;
142
+ }
143
+ updatePermissions(username, permissions) {
144
+ const result = this.getDb()
145
+ .prepare('UPDATE users SET permissions = ?, updatedAt = datetime(\'now\') WHERE username = ?')
146
+ .run(this.toLinuxString(permissions), username);
147
+ return result.changes > 0;
148
+ }
149
+ changeUsername(oldUsername, newUsername) {
150
+ const existing = this.getUserByUsername(newUsername);
151
+ if (existing && existing.length > 0) {
152
+ return false;
153
+ }
154
+ const result = this.getDb()
155
+ .prepare('UPDATE users SET username = ?, updatedAt = datetime(\'now\') WHERE username = ?')
156
+ .run(newUsername, oldUsername);
157
+ return result.changes > 0;
158
+ }
159
+ changePassword(username, newPassword) {
160
+ const result = this.getDb()
161
+ .prepare('UPDATE users SET password = ?, updatedAt = datetime(\'now\') WHERE username = ?')
162
+ .run(newPassword, username);
163
+ return result.changes > 0;
164
+ }
165
+ changeHomeDir(username, newHomeDir) {
166
+ const result = this.getDb()
167
+ .prepare('UPDATE users SET homeDir = ?, updatedAt = datetime(\'now\') WHERE username = ?')
168
+ .run(newHomeDir, username);
169
+ return result.changes > 0;
170
+ }
171
+ getActiveUsers() {
172
+ const rows = this.getDb()
173
+ .prepare('SELECT id, username, password, homeDir, permissions, isActive FROM users WHERE isActive = 1')
174
+ .all();
175
+ return rows.map((row) => ({
176
+ id: row.id,
177
+ username: row.username,
178
+ password: row.password,
179
+ homeDir: row.homeDir,
180
+ permissions: this.fromLinuxString(String(row.permissions ?? 'rwxr-xr-x')),
181
+ isActive: row.isActive === 1,
182
+ }));
183
+ }
184
+ getUserCount() {
185
+ const row = this.getDb()
186
+ .prepare('SELECT COUNT(*) AS count FROM users WHERE isActive = 1')
187
+ .get();
188
+ return row.count;
189
+ }
190
+ getSetting(key) {
191
+ const row = this.getDb()
192
+ .prepare('SELECT value FROM settings WHERE key = ?')
193
+ .get(key);
194
+ return row ? row.value : null;
195
+ }
196
+ setSetting(key, value, description) {
197
+ const existing = this.getDb()
198
+ .prepare('SELECT key FROM settings WHERE key = ?')
199
+ .get(key);
200
+ if (existing) {
201
+ this.getDb()
202
+ .prepare('UPDATE settings SET value = ?, description = COALESCE(?, description), updatedAt = datetime(\'now\') WHERE key = ?')
203
+ .run(value, description ?? null, key);
204
+ }
205
+ else {
206
+ this.getDb()
207
+ .prepare('INSERT INTO settings (key, value, description) VALUES (?, ?, ?)')
208
+ .run(key, value, description ?? null);
209
+ }
210
+ }
211
+ deleteSetting(key) {
212
+ const result = this.getDb()
213
+ .prepare('DELETE FROM settings WHERE key = ?')
214
+ .run(key);
215
+ return result.changes > 0;
216
+ }
217
+ getAllSettings() {
218
+ const rows = this.getDb()
219
+ .prepare('SELECT key, value FROM settings')
220
+ .all();
221
+ const result = {};
222
+ for (const row of rows) {
223
+ result[row.key] = row.value;
224
+ }
225
+ return result;
226
+ }
227
+ toLinuxString(permissions) {
228
+ const charFor = (p) => `${p?.read ? 'r' : '-'}${p?.write ? 'w' : '-'}${p?.execute ? 'x' : '-'}`;
229
+ const owner = charFor(permissions?.owner);
230
+ const group = charFor(permissions?.group);
231
+ const others = charFor(permissions?.others);
232
+ return owner + group + others;
233
+ }
234
+ fromLinuxString(value) {
235
+ const str = String(value ?? 'rwxr-xr-x');
236
+ const ownerStr = str.slice(0, 3).padEnd(3, '-');
237
+ const groupStr = str.slice(3, 6).padEnd(3, '-');
238
+ const othersStr = str.slice(6, 9).padEnd(3, '-');
239
+ const parse = (s) => ({
240
+ read: s[0] === 'r',
241
+ write: s[1] === 'w',
242
+ execute: s[2] === 'x',
243
+ });
244
+ return {
245
+ owner: parse(ownerStr),
246
+ group: parse(groupStr),
247
+ others: parse(othersStr),
248
+ };
249
+ }
250
+ }
251
+ exports.DatabaseManager = DatabaseManager;
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJDO0FBQzNDLE1BQVksSUFBSSxpQ0FBYTtBQVU3QjtJQUlFLFlBQVksTUFBZTtRQUhuQixPQUFFLEdBQXdCLElBQUksQ0FBQztRQUlyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBS00sU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBS00sSUFBSTtRQUNULElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSwwQkFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F1QlosQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUtNLEtBQUs7UUFDVixJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFNTSxXQUFXO1FBUWhCLE1B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QUEwRCxFQUFFLENBQUMsQ0FBQztZQUNwRixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7WUFDbEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHO1lBQ25CLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztTQUN0QixDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDdEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDdEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDekIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFiYXNlU3luYyB9IGZyb20gJ25vZGU6c3FsaXRlJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBVc2VyUGVybWlzc2lvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogU1FMaXRlIHZlcml0YWJhbsSxIHnDtm5ldGljaXNpXG4gKlxuICogZnRwZC5kYiBkb3N5YXPEsW5kYSBpa2kgYXlyxLEgdGFibG8gdHV0YXI6XG4gKiAgIC0gdXNlcnMgICA6IGt1bGxhbsSxY8SxIGJpbGdpbGVyaSAoXCJ1c2VyRmlsZVwiIGvEsXNtxLFuxLFuIHRhxZ/EsXnEsWPEsXPEsSlcbiAqICAgLSBzZXR0aW5nczogZnRwIHN1bnVjdSBheWFybGFyxLEgKFwiZnRwIHNldHRpbmdzXCIga8Sxc23EsW7EsW4gdGHFn8SxecSxY8Sxc8SxKVxuICovXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBkYjogRGF0YWJhc2VTeW5jIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGJQYXRoPzogc3RyaW5nKSB7XG4gICAgdGhpcy5kYlBhdGggPSBkYlBhdGggPz8gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z0cGQuZGInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpdGFiYW7EsSBkb3N5YSB5b2x1bnUgZMO2bmTDvHJcbiAgICovXG4gIHB1YmxpYyBnZXREYlBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYlBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVmVyaXRhYmFuxLFuxLEgYmHFn2xhdCB2ZSB0YWJsb2xhcsSxIG9sdcWfdHVyXG4gICAqL1xuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRiID0gbmV3IERhdGFiYXNlU3luYyh0aGlzLmRiUGF0aCk7XG4gICAgdGhpcy5kYi5leGVjKGBcbiAgICAgIFBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7XG5cbiAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHVzZXJzIChcbiAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULFxuICAgICAgICB1c2VybmFtZSBURVhUIFVOSVFVRSBOT1QgTlVMTCxcbiAgICAgICAgcGFzc3dvcmQgVEVYVCBOT1QgTlVMTCxcbiAgICAgICAgaG9tZURpciBURVhUIE5PVCBOVUxMLFxuICAgICAgICBwZXJtaXNzaW9ucyBURVhUIE5PVCBOVUxMIERFRkFVTFQgJ3t9JyxcbiAgICAgICAgaXNBY3RpdmUgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDEsXG4gICAgICAgIGNyZWF0ZWRBdCBURVhUIE5PVCBOVUxMIERFRkFVTFQgKGRhdGV0aW1lKFxcJ25vd1xcJykpLFxuICAgICAgICB1cGRhdGVkQXQgVEVYVCBOT1QgTlVMTCBERUZBVUxUIChkYXRldGltZShcXCdub3dcXCcpKVxuICAgICAgKTtcblxuICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgc2V0dGluZ3MgKFxuICAgICAgICBrZXkgVEVYVCBQUklNQVJZIEtFWSxcbiAgICAgICAgdmFsdWUgVEVYVCBOT1QgTlVMTCxcbiAgICAgICAgZGVzY3JpcHRpb24gVEVYVCxcbiAgICAgICAgdXBkYXRlZEF0IFRFWFQgTk9UIE5VTEwgREVGQVVMVCAoZGF0ZXRpbWUoXFwnbm93XFwnKSlcbiAgICAgICk7XG5cbiAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF91c2Vyc191c2VybmFtZSBPTiB1c2Vycyh1c2VybmFtZSk7XG4gICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfdXNlcnNfYWN0aXZlIE9OIHVzZXJzKGlzQWN0aXZlKTtcbiAgICBgKTtcblxuICAgIGNvbnNvbGUubG9nKGBbRGF0YWJhc2VNYW5hZ2VyXSBTUUxpdGUgdmVyaXRhYmFuxLEgaGF6xLFyOiAke3RoaXMuZGJQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcml0YWJhbsSxIGJhxJ9sYW50xLFzxLFuxLEga2FwYXRcbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYikge1xuICAgICAgdGhpcy5kYi5jbG9zZSgpO1xuICAgICAgdGhpcy5kYiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREYigpOiBEYXRhYmFzZVN5bmMge1xuICAgIGlmICghdGhpcy5kYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWZXJpdGFiYW7EsSBiYcWfbGF0xLFsbWFtxLHFny4gw5ZuY2UgaW5pdCgpIMOnYcSfxLFyxLFsbWFsxLFkxLFyLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYjtcbiAgfVxuXG4gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgVVNFUlMgVEFCTE8gxLDFnkxFTUxFUsSwXG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICBwdWJsaWMgZ2V0QWxsVXNlcnMoKTogQXJyYXk8e1xuICAgIGlkOiBudW1iZXI7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGhvbWVEaXI6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zO1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICB9PiB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0RGIoKS5wcmVwYXJlKFxuICAgICAgJ1NFTEVDVCBpZCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBob21lRGlyLCBwZXJtaXNzaW9ucywgaXNBY3RpdmUgRlJPTSB1c2VycydcbiAgICApLmFsbCgpIGFzIEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICAgIGhvbWVEaXI6IHN0cmluZztcbiAgICAgIHBlcm1pc3Npb25zOiBzdHJpbmc7XG4gICAgICBpc0FjdGl2ZTogbnVtYmVyO1xuICAgIH0+O1xuXG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+ICh7XG4gICAgICBpZDogcm93LmlkLFxuICAgICAgdXNlcm5hbWU6IHJvdy51c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkOiByb3cucGFzc3dvcmQsXG4gICAgICBob21lRGlyOiByb3cuaG9tZURpcixcbiAgICAgIHBlcm1pc3Npb25zOiB0aGlzLmZyb21MaW51eFN0cmluZyhTdHJpbmcocm93LnBlcm1pc3Npb25zID8/ICdyd3hyLXhyLXgnKSksXG4gICAgICBpc0FjdGl2ZTogcm93LmlzQWN0aXZlID09PSAxLFxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVc2VyQnlVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKTogQXJyYXk8e1xuICAgIGlkOiBudW1iZXI7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGhvbWVEaXI6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zO1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICB9PiB8IG51bGwge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0RGIoKS5wcmVwYXJlKFxuICAgICAgJ1NFTEVDVCBpZCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBob21lRGlyLCBwZXJtaXNzaW9ucywgaXNBY3RpdmUgRlJPTSB1c2VycyBXSEVSRSB1c2VybmFtZSA9ID8nXG4gICAgKS5nZXQodXNlcm5hbWUpIGFzXG4gICAgICB8IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICAgICAgICBob21lRGlyOiBzdHJpbmc7XG4gICAgICAgICAgcGVybWlzc2lvbnM6IHN0cmluZztcbiAgICAgICAgICBpc0FjdGl2ZTogbnVtYmVyO1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghcm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICB1c2VybmFtZTogcm93LnVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZDogcm93LnBhc3N3b3JkLFxuICAgICAgICBob21lRGlyOiByb3cuaG9tZURpcixcbiAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMuZnJvbUxpbnV4U3RyaW5nKFN0cmluZyhyb3cucGVybWlzc2lvbnMgPz8gJ3J3eHIteHIteCcpKSxcbiAgICAgICAgaXNBY3RpdmU6IHJvdy5pc0FjdGl2ZSA9PT0gMSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRVc2VyKHtcbiAgICB1c2VybmFtZSxcbiAgICBwYXNzd29yZCxcbiAgICBob21lRGlyLFxuICAgIHBlcm1pc3Npb25zLFxuICAgIGlzQWN0aXZlID0gdHJ1ZSxcbiAgfToge1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICBob21lRGlyOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9ucztcbiAgICBpc0FjdGl2ZT86IGJvb2xlYW47XG4gIH0pOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFVzZXJCeVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gemF0ZW4gdmFyXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShcbiAgICAgICAgICBgSU5TRVJUIElOVE8gdXNlcnMgKHVzZXJuYW1lLCBwYXNzd29yZCwgaG9tZURpciwgcGVybWlzc2lvbnMsIGlzQWN0aXZlKVxuICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8pYFxuICAgICAgICApXG4gICAgICAgIC5ydW4oXG4gICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgaG9tZURpcixcbiAgICAgICAgICB0aGlzLnRvTGludXhTdHJpbmcocGVybWlzc2lvbnMpLFxuICAgICAgICAgIGlzQWN0aXZlID8gMSA6IDBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbRGF0YWJhc2VNYW5hZ2VyXSBhZGRVc2VyIGVycm9yOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlVXNlcih1c2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnREVMRVRFIEZST00gdXNlcnMgV0hFUkUgdXNlcm5hbWUgPSA/JylcbiAgICAgIC5ydW4odXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVVc2VyU3RhdHVzKHVzZXJuYW1lOiBzdHJpbmcsIGlzQWN0aXZlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnVVBEQVRFIHVzZXJzIFNFVCBpc0FjdGl2ZSA9ID8sIHVwZGF0ZWRBdCA9IGRhdGV0aW1lKFxcJ25vd1xcJykgV0hFUkUgdXNlcm5hbWUgPSA/JylcbiAgICAgIC5ydW4oaXNBY3RpdmUgPyAxIDogMCwgdXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQZXJtaXNzaW9ucyhcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnNcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShcbiAgICAgICAgJ1VQREFURSB1c2VycyBTRVQgcGVybWlzc2lvbnMgPSA/LCB1cGRhdGVkQXQgPSBkYXRldGltZShcXCdub3dcXCcpIFdIRVJFIHVzZXJuYW1lID0gPydcbiAgICAgIClcbiAgICAgIC5ydW4odGhpcy50b0xpbnV4U3RyaW5nKHBlcm1pc3Npb25zKSwgdXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VVc2VybmFtZShvbGRVc2VybmFtZTogc3RyaW5nLCBuZXdVc2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFVzZXJCeVVzZXJuYW1lKG5ld1VzZXJuYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgICdVUERBVEUgdXNlcnMgU0VUIHVzZXJuYW1lID0gPywgdXBkYXRlZEF0ID0gZGF0ZXRpbWUoXFwnbm93XFwnKSBXSEVSRSB1c2VybmFtZSA9ID8nXG4gICAgICApXG4gICAgICAucnVuKG5ld1VzZXJuYW1lLCBvbGRVc2VybmFtZSkgYXMgeyBjaGFuZ2VzOiBudW1iZXIgfTtcbiAgICByZXR1cm4gcmVzdWx0LmNoYW5nZXMgPiAwO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhc3N3b3JkKHVzZXJuYW1lOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldERiKClcbiAgICAgIC5wcmVwYXJlKFxuICAgICAgICAnVVBEQVRFIHVzZXJzIFNFVCBwYXNzd29yZCA9ID8sIHVwZGF0ZWRBdCA9IGRhdGV0aW1lKFxcJ25vd1xcJykgV0hFUkUgdXNlcm5hbWUgPSA/J1xuICAgICAgKVxuICAgICAgLnJ1bihuZXdQYXNzd29yZCwgdXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VIb21lRGlyKHVzZXJuYW1lOiBzdHJpbmcsIG5ld0hvbWVEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgICdVUERBVEUgdXNlcnMgU0VUIGhvbWVEaXIgPSA/LCB1cGRhdGVkQXQgPSBkYXRldGltZShcXCdub3dcXCcpIFdIRVJFIHVzZXJuYW1lID0gPydcbiAgICAgIClcbiAgICAgIC5ydW4obmV3SG9tZURpciwgdXNlcm5hbWUpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVVc2VycygpOiBBcnJheTx7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgaG9tZURpcjogc3RyaW5nO1xuICAgIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnM7XG4gICAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShcbiAgICAgICAgJ1NFTEVDVCBpZCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBob21lRGlyLCBwZXJtaXNzaW9ucywgaXNBY3RpdmUgRlJPTSB1c2VycyBXSEVSRSBpc0FjdGl2ZSA9IDEnXG4gICAgICApXG4gICAgICAuYWxsKCkgYXMgQXJyYXk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgICAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgICAgICBob21lRGlyOiBzdHJpbmc7XG4gICAgICAgIHBlcm1pc3Npb25zOiBzdHJpbmc7XG4gICAgICAgIGlzQWN0aXZlOiBudW1iZXI7XG4gICAgICB9PjtcblxuICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiAoe1xuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIHVzZXJuYW1lOiByb3cudXNlcm5hbWUsXG4gICAgICBwYXNzd29yZDogcm93LnBhc3N3b3JkLFxuICAgICAgaG9tZURpcjogcm93LmhvbWVEaXIsXG4gICAgICBwZXJtaXNzaW9uczogdGhpcy5mcm9tTGludXhTdHJpbmcoU3RyaW5nKHJvdy5wZXJtaXNzaW9ucyA/PyAncnd4ci14ci14JykpLFxuICAgICAgaXNBY3RpdmU6IHJvdy5pc0FjdGl2ZSA9PT0gMSxcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VXNlckNvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnU0VMRUNUIENPVU5UKCopIEFTIGNvdW50IEZST00gdXNlcnMgV0hFUkUgaXNBY3RpdmUgPSAxJylcbiAgICAgIC5nZXQoKSBhcyB7IGNvdW50OiBudW1iZXIgfTtcbiAgICByZXR1cm4gcm93LmNvdW50O1xuICB9XG5cbiAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICBTRVRUSU5HUyBUQUJMTyDEsMWeTEVNTEVSxLBcbiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gIHB1YmxpYyBnZXRTZXR0aW5nKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnU0VMRUNUIHZhbHVlIEZST00gc2V0dGluZ3MgV0hFUkUga2V5ID0gPycpXG4gICAgICAuZ2V0KGtleSkgYXMgeyB2YWx1ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJvdyA/IHJvdy52YWx1ZSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgc2V0U2V0dGluZyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoJ1NFTEVDVCBrZXkgRlJPTSBzZXR0aW5ncyBXSEVSRSBrZXkgPSA/JylcbiAgICAgIC5nZXQoa2V5KSBhcyB7IGtleTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShcbiAgICAgICAgICAnVVBEQVRFIHNldHRpbmdzIFNFVCB2YWx1ZSA9ID8sIGRlc2NyaXB0aW9uID0gQ09BTEVTQ0UoPywgZGVzY3JpcHRpb24pLCB1cGRhdGVkQXQgPSBkYXRldGltZShcXCdub3dcXCcpIFdIRVJFIGtleSA9ID8nXG4gICAgICAgIClcbiAgICAgICAgLnJ1bih2YWx1ZSwgZGVzY3JpcHRpb24gPz8gbnVsbCwga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXREYigpXG4gICAgICAgIC5wcmVwYXJlKFxuICAgICAgICAgICdJTlNFUlQgSU5UTyBzZXR0aW5ncyAoa2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pIFZBTFVFUyAoPywgPywgPyknXG4gICAgICAgIClcbiAgICAgICAgLnJ1bihrZXksIHZhbHVlLCBkZXNjcmlwdGlvbiA/PyBudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlU2V0dGluZyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoJ0RFTEVURSBGUk9NIHNldHRpbmdzIFdIRVJFIGtleSA9ID8nKVxuICAgICAgLnJ1bihrZXkpIGFzIHsgY2hhbmdlczogbnVtYmVyIH07XG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxTZXR0aW5ncygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZSgnU0VMRUNUIGtleSwgdmFsdWUgRlJPTSBzZXR0aW5ncycpXG4gICAgICAuYWxsKCkgYXMgQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PjtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICByZXN1bHRbcm93LmtleV0gPSByb3cudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgIFlBUkRJTUNJIEZPTktTSVlPTkxBUiAoTGludXggZmlsZSBwZXJtaXNzaW9uIDwtPiBEQiBzdHJpbmcpXG4gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogVXNlclBlcm1pc3Npb25zIHlhcMSxc8SxbsSxIExpbnV4IHN5bWJvbGljIHBlcm1pc3Npb24gc3RyaW5n4oCZaW5lIMOnZXZpcmlyLlxuICAgKiDDlnJuZWs6IHsgb3duZXI6IHJ3eCwgZ3JvdXA6IHIteCwgb3RoZXJzOiByLXggfSAtPiBcInJ3eHIteHIteFwiXG4gICAqL1xuICBwdWJsaWMgdG9MaW51eFN0cmluZyhwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2hhckZvciA9IChwPzogeyByZWFkPzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyBleGVjdXRlPzogYm9vbGVhbiB9IHwgbnVsbCk6IHN0cmluZyA9PlxuICAgICAgYCR7cD8ucmVhZCA/ICdyJyA6ICctJ30ke3A/LndyaXRlID8gJ3cnIDogJy0nfSR7cD8uZXhlY3V0ZSA/ICd4JyA6ICctJ31gO1xuICAgIGNvbnN0IG93bmVyID0gY2hhckZvcihwZXJtaXNzaW9ucz8ub3duZXIpO1xuICAgIGNvbnN0IGdyb3VwID0gY2hhckZvcihwZXJtaXNzaW9ucz8uZ3JvdXApO1xuICAgIGNvbnN0IG90aGVycyA9IGNoYXJGb3IocGVybWlzc2lvbnM/Lm90aGVycyk7XG4gICAgcmV0dXJuIG93bmVyICsgZ3JvdXAgKyBvdGhlcnM7XG4gIH1cblxuICAvKipcbiAgICogTGludXggc3ltYm9saWMgcGVybWlzc2lvbiBzdHJpbmfigJlpbmkgVXNlclBlcm1pc3Npb25zIHlhcMSxc8SxbmEgw6dldmlyaXIuXG4gICAqIMOWcm5lazogXCJyd3hyLXhyLXhcIiAtPiB7IG93bmVyOiB7cmVhZCx3cml0ZSxleGVjdXRlfSwgZ3JvdXA6IHsuLi59LCBvdGhlcnM6IHsuLi59IH1cbiAgICovXG4gIHB1YmxpYyBmcm9tTGludXhTdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBVc2VyUGVybWlzc2lvbnMge1xuICAgIGNvbnN0IHN0ciA9IFN0cmluZyh2YWx1ZSA/PyAncnd4ci14ci14Jyk7XG4gICAgY29uc3Qgb3duZXJTdHIgPSBzdHIuc2xpY2UoMCwgMykucGFkRW5kKDMsICctJyk7XG4gICAgY29uc3QgZ3JvdXBTdHIgPSBzdHIuc2xpY2UoMywgNikucGFkRW5kKDMsICctJyk7XG4gICAgY29uc3Qgb3RoZXJzU3RyID0gc3RyLnNsaWNlKDYsIDkpLnBhZEVuZCgzLCAnLScpO1xuICAgIGNvbnN0IHBhcnNlID0gKHM6IHN0cmluZyk6IHsgcmVhZD86IGJvb2xlYW47IHdyaXRlPzogYm9vbGVhbjsgZXhlY3V0ZT86IGJvb2xlYW4gfSA9PiAoe1xuICAgICAgcmVhZDogc1swXSA9PT0gJ3InLFxuICAgICAgd3JpdGU6IHNbMV0gPT09ICd3JyxcbiAgICAgIGV4ZWN1dGU6IHNbMl0gPT09ICd4JyxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXI6IHBhcnNlKG93bmVyU3RyKSxcbiAgICAgIGdyb3VwOiBwYXJzZShncm91cFN0ciksXG4gICAgICBvdGhlcnM6IHBhcnNlKG90aGVyc1N0ciksXG4gICAgfTtcbiAgfVxufVxuIl19
package/src/ftpd.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/src/ftpd.js ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const FtpServer_1 = require("./core/FtpServer");
5
+ const repl_1 = require("./cli/repl");
6
+ const server = new FtpServer_1.FtpServer({
7
+ dbPath: './ftpd.db',
8
+ logLevel: 'info',
9
+ banner: '',
10
+ });
11
+ server.start();
12
+ (0, repl_1.startFtpRepl)(server, 21).catch((err) => {
13
+ console.error('[ftpd] REPL error:', err);
14
+ process.exit(1);
15
+ });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnRwZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mdHBkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWFBLGdEQUE2QztBQUM3QyxxQ0FBMEM7QUFFMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBUyxDQUFDO0lBQzNCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLE1BQU0sRUFBRSxFQUFFO0NBQ1gsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRWYsSUFBQSxtQkFBWSxFQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtJQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIEZ0cC1EIEZUUCBzdW51Y3UgZGFlbW9uIChpbnRlcmFrdGlmIHRlcm1pbmFsKVxuICpcbiAqIEtvbXV0bGEgYmHFn2xhdG1hOlxuICogICBucHggZnRkXG4gKiAgIG5vZGUgc3JjL2Z0cGQudHNcbiAqXG4gKiDDh2FsxLHFn8SxcjpcbiAqICAgLSBGdHBTZXJ2ZXIgYmHFn2xhdMSxbMSxciAoU1FMaXRlOiBmdHBkLmRiIC0+IHVzZXJzICsgc2V0dGluZ3MpXG4gKiAgIC0gSW50ZXJha3RpZiBGVFAgdGVybWluYWwgKENMSSBSRVBMKSBiYcWfbGF0xLFsxLFyXG4gKi9cblxuaW1wb3J0IHsgRnRwU2VydmVyIH0gZnJvbSAnLi9jb3JlL0Z0cFNlcnZlcic7XG5pbXBvcnQgeyBzdGFydEZ0cFJlcGwgfSBmcm9tICcuL2NsaS9yZXBsJztcblxuY29uc3Qgc2VydmVyID0gbmV3IEZ0cFNlcnZlcih7XG4gIGRiUGF0aDogJy4vZnRwZC5kYicsXG4gIGxvZ0xldmVsOiAnaW5mbycsXG4gIGJhbm5lcjogJycsXG59KTtcblxuc2VydmVyLnN0YXJ0KCk7XG5cbnN0YXJ0RnRwUmVwbChzZXJ2ZXIsIDIxKS5jYXRjaCgoZXJyKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoJ1tmdHBkXSBSRVBMIGVycm9yOicsIGVycik7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuIl19
package/src/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { FtpServer } from './core/FtpServer';
2
+ export { DatabaseManager } from './db/database';
2
3
  export { UserManager, getUserManager } from './userManager';
3
4
  export { Logger, LogLevel } from './utils/logger';
4
5
  export { ReplyCode } from './types';
5
- export type { ServerConfig, FtpConnection, User, UserPermissions, Permission, CommandResult, } from './types';
6
+ export type { ServerConfig, FtpConnection, User, UserPermissions, LinuxPermissionAccess, Permission, CommandResult, } from './types';
6
7
  export { buildDirectoryListing } from './commands/ListCommand';
package/src/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildDirectoryListing = exports.ReplyCode = exports.LogLevel = exports.Logger = exports.getUserManager = exports.UserManager = exports.FtpServer = void 0;
3
+ exports.buildDirectoryListing = exports.ReplyCode = exports.LogLevel = exports.Logger = exports.getUserManager = exports.UserManager = exports.DatabaseManager = exports.FtpServer = void 0;
4
4
  var FtpServer_1 = require("./core/FtpServer");
5
5
  Object.defineProperty(exports, "FtpServer", { enumerable: true, get: function () { return FtpServer_1.FtpServer; } });
6
+ var database_1 = require("./db/database");
7
+ Object.defineProperty(exports, "DatabaseManager", { enumerable: true, get: function () { return database_1.DatabaseManager; } });
6
8
  var userManager_1 = require("./userManager");
7
9
  Object.defineProperty(exports, "UserManager", { enumerable: true, get: function () { return userManager_1.UserManager; } });
8
10
  Object.defineProperty(exports, "getUserManager", { enumerable: true, get: function () { return userManager_1.getUserManager; } });
@@ -13,4 +15,4 @@ var types_1 = require("./types");
13
15
  Object.defineProperty(exports, "ReplyCode", { enumerable: true, get: function () { return types_1.ReplyCode; } });
14
16
  var ListCommand_1 = require("./commands/ListCommand");
15
17
  Object.defineProperty(exports, "buildDirectoryListing", { enumerable: true, get: function () { return ListCommand_1.buildDirectoryListing; } });
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUEsOENBQTZDO0FBQXBDLHNHQUFBLFNBQVMsT0FBQTtBQUdsQiw2Q0FBNEQ7QUFBbkQsMEdBQUEsV0FBVyxPQUFBO0FBQUUsNkdBQUEsY0FBYyxPQUFBO0FBR3BDLHlDQUFrRDtBQUF6QyxnR0FBQSxNQUFNLE9BQUE7QUFBRSxrR0FBQSxRQUFRLE9BQUE7QUFHekIsaUNBQW9DO0FBQTNCLGtHQUFBLFNBQVMsT0FBQTtBQWFsQixzREFBK0Q7QUFBdEQsb0hBQUEscUJBQXFCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZ0cC1EIC0gbW9kw7xsIGdpcmnFn2lcbiAqXG4gKiBCdSBkb3N5YSB5YWxuxLF6Y2EgZMSxxZ9hIGFrdGFyxLFtIHlhcGFyOyBpbXBvcnQgZWRpbGRpxJ9pbmRlIHN1bnVjdSBiYcWfbGF0xLFsbWF6LFxuICogZG9zeWEgb2x1xZ90dXJ1bG1heiwgcG9ydCBkaW5sZW5tZXouXG4gKlxuICogS3VsbGFuxLFtOlxuICogICBjb25zdCB7IEZ0cFNlcnZlciB9ID0gcmVxdWlyZSgnZnRwLWQnKTtcbiAqICAgY29uc3Qgc2VydmVyID0gbmV3IEZ0cFNlcnZlcih7IHBvcnQ6IDIxLCB1c2VyRmlsZTogJy4vdXNlcnMuanNvbicgfSk7XG4gKiAgIHNlcnZlci5zdGFydCgpO1xuICovXG5cbi8vIEFuYSBzxLFuxLFmXG5leHBvcnQgeyBGdHBTZXJ2ZXIgfSBmcm9tICcuL2NvcmUvRnRwU2VydmVyJztcblxuLy8gS3VsbGFuxLFjxLEgdmUgaXppbiB5w7ZuZXRpbWlcbmV4cG9ydCB7IFVzZXJNYW5hZ2VyLCBnZXRVc2VyTWFuYWdlciB9IGZyb20gJy4vdXNlck1hbmFnZXInO1xuXG4vLyBMb2dsYW1hXG5leHBvcnQgeyBMb2dnZXIsIExvZ0xldmVsIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuXG4vLyBSRkMgOTU5IHlhbsSxdCBrb2RsYXLEsVxuZXhwb3J0IHsgUmVwbHlDb2RlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIFRpcCBha3RhcsSxbWxhcsSxIChUUyBrdWxsYW7EsWPEsWxhcsSxIGnDp2luKVxuZXhwb3J0IHR5cGUge1xuICBTZXJ2ZXJDb25maWcsXG4gIEZ0cENvbm5lY3Rpb24sXG4gIFVzZXIsXG4gIFVzZXJQZXJtaXNzaW9ucyxcbiAgUGVybWlzc2lvbixcbiAgQ29tbWFuZFJlc3VsdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIExJU1Qgw6fEsWt0xLFzxLFuxLEga2VuZGkgZW5kcG9pbnQnaW5kZSBrdWxsYW5tYWsgaXN0ZXllbmxlciBpw6dpblxuZXhwb3J0IHsgYnVpbGREaXJlY3RvcnlMaXN0aW5nIH0gZnJvbSAnLi9jb21tYW5kcy9MaXN0Q29tbWFuZCc7XG4iXX0=
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUEsOENBQTZDO0FBQXBDLHNHQUFBLFNBQVMsT0FBQTtBQUdsQiwwQ0FBZ0Q7QUFBdkMsMkdBQUEsZUFBZSxPQUFBO0FBR3hCLDZDQUE0RDtBQUFuRCwwR0FBQSxXQUFXLE9BQUE7QUFBRSw2R0FBQSxjQUFjLE9BQUE7QUFHcEMseUNBQWtEO0FBQXpDLGdHQUFBLE1BQU0sT0FBQTtBQUFFLGtHQUFBLFFBQVEsT0FBQTtBQUd6QixpQ0FBb0M7QUFBM0Isa0dBQUEsU0FBUyxPQUFBO0FBY2xCLHNEQUErRDtBQUF0RCxvSEFBQSxxQkFBcUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRnRwLUQgLSBtb2TDvGwgZ2lyacWfaVxuICpcbiAqIEJ1IGRvc3lhIHlhbG7EsXpjYSBkxLHFn2EgYWt0YXLEsW0geWFwYXI7IGltcG9ydCBlZGlsZGnEn2luZGUgc3VudWN1IGJhxZ9sYXTEsWxtYXosXG4gKiBkb3N5YSBvbHXFn3R1cnVsbWF6LCBwb3J0IGRpbmxlbm1lei5cbiAqXG4gKiBLdWxsYW7EsW06XG4gKiAgIGNvbnN0IHsgRnRwU2VydmVyIH0gPSByZXF1aXJlKCdmdHAtZCcpO1xuICogICBjb25zdCBzZXJ2ZXIgPSBuZXcgRnRwU2VydmVyKHsgcG9ydDogMjEsIGRiUGF0aDogJy4vZnRwZC5kYicgfSk7XG4gKiAgIHNlcnZlci5zdGFydCgpO1xuICovXG5cbi8vIEFuYSBzxLFuxLFmXG5leHBvcnQgeyBGdHBTZXJ2ZXIgfSBmcm9tICcuL2NvcmUvRnRwU2VydmVyJztcblxuLy8gVmVyaXRhYmFuxLEgecO2bmV0aW1pIChTUUxpdGU6IHVzZXJzICsgc2V0dGluZ3MgdGFibG9sYXLEsSlcbmV4cG9ydCB7IERhdGFiYXNlTWFuYWdlciB9IGZyb20gJy4vZGIvZGF0YWJhc2UnO1xuXG4vLyBLdWxsYW7EsWPEsSB2ZSBpemluIHnDtm5ldGltaVxuZXhwb3J0IHsgVXNlck1hbmFnZXIsIGdldFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi91c2VyTWFuYWdlcic7XG5cbi8vIExvZ2xhbWFcbmV4cG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbi8vIFJGQyA5NTkgeWFuxLF0IGtvZGxhcsSxXG5leHBvcnQgeyBSZXBseUNvZGUgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gVGlwIGFrdGFyxLFtbGFyxLEgKFRTIGt1bGxhbsSxY8SxbGFyxLEgacOnaW4pXG5leHBvcnQgdHlwZSB7XG4gIFNlcnZlckNvbmZpZyxcbiAgRnRwQ29ubmVjdGlvbixcbiAgVXNlcixcbiAgVXNlclBlcm1pc3Npb25zLFxuICBMaW51eFBlcm1pc3Npb25BY2Nlc3MsXG4gIFBlcm1pc3Npb24sXG4gIENvbW1hbmRSZXN1bHQsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBMSVNUIMOnxLFrdMSxc8SxbsSxIGtlbmRpIGVuZHBvaW50J2luZGUga3VsbGFubWFrIGlzdGV5ZW5sZXIgacOnaW5cbmV4cG9ydCB7IGJ1aWxkRGlyZWN0b3J5TGlzdGluZyB9IGZyb20gJy4vY29tbWFuZHMvTGlzdENvbW1hbmQnO1xuIl19
package/src/types.d.ts CHANGED
@@ -50,24 +50,15 @@ export declare enum ReplyCode {
50
50
  SERVICE_NOT_AVAILABLE = 421
51
51
  }
52
52
  export type Permission = 'read' | 'write' | 'list' | 'create' | 'append' | 'delete' | 'chmod' | 'mkd' | 'rmdir' | 'rename' | 'deletemyfiles' | 'nopasswd' | 'passive' | 'port' | 'nonlocalbind' | 'private' | 'tls';
53
- export interface UserPermissions {
53
+ export interface LinuxPermissionAccess {
54
54
  read?: boolean;
55
55
  write?: boolean;
56
- list?: boolean;
57
- create?: boolean;
58
- append?: boolean;
59
- delete?: boolean;
60
- chmod?: boolean;
61
- mkd?: boolean;
62
- rmdir?: boolean;
63
- rename?: boolean;
64
- deletemyfiles?: boolean;
65
- nopasswd?: boolean;
66
- passive?: boolean;
67
- port?: boolean;
68
- nonlocalbind?: boolean;
69
- private?: boolean;
70
- tls?: boolean;
56
+ execute?: boolean;
57
+ }
58
+ export interface UserPermissions {
59
+ owner?: LinuxPermissionAccess;
60
+ group?: LinuxPermissionAccess;
61
+ others?: LinuxPermissionAccess;
71
62
  }
72
63
  export interface FtpConnection {
73
64
  socket: net.Socket;
@@ -111,17 +102,13 @@ export interface CommandResult {
111
102
  }
112
103
  export type CommandHandler = (conn: FtpConnection, args: string) => Promise<CommandResult>;
113
104
  export interface ServerConfig {
114
- port: number;
115
- dataPort: number;
116
- userFile: string | UserManagerData;
117
- maxConnections: number;
118
- logLevel: 'debug' | 'info' | 'warn' | 'error';
119
- banner: string;
120
- passivePortRange: {
121
- min: number;
122
- max: number;
123
- };
124
- passiveIp?: string;
105
+ dbPath?: string;
106
+ banner?: string;
107
+ logLevel?: 'debug' | 'info' | 'warn' | 'error';
108
+ }
109
+ export interface UserManagerData {
110
+ users: User[];
111
+ lastUpdated: string;
125
112
  }
126
113
  export interface TransferStatus {
127
114
  file: string;
package/src/types.js CHANGED
@@ -52,4 +52,4 @@ var ReplyCode;
52
52
  ReplyCode[ReplyCode["TIMEOUT"] = 421] = "TIMEOUT";
53
53
  ReplyCode[ReplyCode["SERVICE_NOT_AVAILABLE"] = 421] = "SERVICE_NOT_AVAILABLE";
54
54
  })(ReplyCode || (exports.ReplyCode = ReplyCode = {}));
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsSUFBWSxTQTBEWDtBQTFERCxXQUFZLFNBQVM7SUFFbkIsbURBQWMsQ0FBQTtJQUNkLDJEQUFrQixDQUFBO0lBR2xCLHVDQUFRLENBQUE7SUFDUixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxtREFBYyxDQUFBO0lBQ2QsaURBQWEsQ0FBQTtJQUNiLGlEQUFhLENBQUE7SUFDYixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUdiLHFEQUFlLENBQUE7SUFDZixtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLG1EQUFjLENBQUE7SUFHZCxtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLGlEQUFhLENBQUE7SUFDYix1REFBZ0IsQ0FBQTtJQUNoQixxREFBZSxDQUFBO0lBQ2YsaURBQWEsQ0FBQTtJQUNiLDJEQUFrQixDQUFBO0lBQ2xCLHVEQUFnQixDQUFBO0lBQ2hCLDZEQUFtQixDQUFBO0lBQ25CLG1FQUFzQixDQUFBO0lBQ3RCLG1FQUFzQixDQUFBO0lBR3RCLDJEQUFrQixDQUFBO0lBQ2xCLGlEQUFhLENBQUE7SUFDYixtREFBYyxDQUFBO0lBQ2QseURBQWlCLENBQUE7SUFDakIsK0RBQW9CLENBQUE7SUFDcEIseURBQWlCLENBQUE7SUFDakIsNkRBQW1CLENBQUE7SUFDbkIsbUVBQXNCLENBQUE7SUFDdEIseURBQWlCLENBQUE7SUFDakIsaURBQWEsQ0FBQTtJQUNiLHlEQUFpQixDQUFBO0lBQ2pCLGlEQUFhLENBQUE7SUFDYiw2RUFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBMURXLFNBQVMsYUFBVCxTQUFTLEdBQVQsU0FBUyxRQTBEcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcblxuLyoqXG4gKiBSRkMgOTU5IEZUUCBQcm90b2NvbCBUeXBlc1xuICogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvaW5mby9yZmM5NTlcbiAqL1xuXG4vKipcbiAqIEZUUCBZYW7EsXQgS29kbGFyxLEgKFJGQyA5NTkpXG4gKi9cbmV4cG9ydCBlbnVtIFJlcGx5Q29kZSB7XG4gIC8qKiAxMDAtMTk5OiDEsMWfbGVtIHRhbWFtbGFubWFkxLEsIGJpbGdpIG1lc2FqxLEgKi9cbiAgQ09OVElOVUUgPSAxMjUsXG4gIERBVEFfQ09OTkVDVCA9IDE1MCxcbiAgXG4gIC8qKiAyMDAtMjk5OiBCYcWfYXLEsWzEsSAqL1xuICBPSyA9IDIwMCxcbiAgVVNFUl9PSyA9IDIzMCxcbiAgUEFTU19PSyA9IDIzMCxcbiAgU1lTX05BTUUgPSAyMTEsXG4gIFNZU19UWVBFID0gMjE1LFxuICBGRUFUX09LID0gMjExLFxuICBSRVRSX09LID0gMjI2LFxuICBTVE9SX09LID0gMjI2LFxuICBERUxFX09LID0gMjUwLFxuICBSTURfT0sgPSAyNTAsXG4gIE1LRF9PSyA9IDI1NyxcbiAgTElTVF9PSyA9IDE1MCxcbiAgTElTVF9FTkQgPSAyMjYsXG4gIE5PT1BfT0sgPSAyMDAsXG4gIFFVSVRfT0sgPSAyMjEsXG4gIENXRF9PSyA9IDI1MCxcbiAgUFdEX09LID0gMjU3LFxuICBSRVNUX09LID0gMzUwLFxuICBcbiAgLyoqIDMwMC0zOTk6IEJla2xleWVuIGJpbGdpICovXG4gIFVTRVJfUEFTUyA9IDMzMSxcbiAgUEFTU19BQ0MgPSAzMzIsXG4gIFVTRVJfQUNDID0gMzMyLFxuICBSRVNUX05FVyA9IDM1MCxcbiAgXG4gIC8qKiA0MDAtNDk5OiBHZcOnaWNpIGhhdGEgKi9cbiAgVVNFUl9FUlIgPSA1MDMsXG4gIFBBU1NfRVJSID0gNTAzLFxuICBDTURfRVJSID0gNTAwLFxuICBTWU5UQVhfRVJSID0gNTAxLFxuICBQQVJBTV9FUlIgPSA1MDIsXG4gIEJBRF9TRVEgPSA1MDMsXG4gIE5PX1NVQ0hfVVNFUiA9IDUzMCxcbiAgTk9UX0xPR0dFRCA9IDUzMCxcbiAgV1JJVEVfUFJPVEVDVCA9IDQ1MSxcbiAgQ0FOTk9UX09QRU5fREFUQSA9IDQyNSxcbiAgVFJBTlNGRVJfQUJPUlRFRCA9IDQyNixcbiAgXG4gIC8qKiA1MDAtNTk5OiBLYWzEsWPEsSBoYXRhICovXG4gIElOVEVSTkFMX0VSUiA9IDUwMCxcbiAgQkFEX0NNRCA9IDUwMixcbiAgQkFEX1VTRVIgPSA1MzAsXG4gIE5PVF9BTExPV0VEID0gNTUwLFxuICBGSUxFX05PVF9GT1VORCA9IDU1MCxcbiAgUEFUSF9FWElTVFMgPSA1NTAsXG4gIE5PX1BFUk1JU1NJT04gPSA1NTAsXG4gIERJUkVDVE9SWV9FWElTVFMgPSA1NTAsXG4gIEZJTEVfRVhJU1RTID0gNTUwLFxuICBTWVNUX09LID0gMjE1LFxuICBCQURfQUREUkVTUyA9IDQyMSxcbiAgVElNRU9VVCA9IDQyMSxcbiAgU0VSVklDRV9OT1RfQVZBSUxBQkxFID0gNDIxLFxufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIGl6aW4gdMO8cmxlcmlcbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IFxuICB8ICdyZWFkJyAgICAgICAgICAgLy8gRG9zeWEgb2t1bWFcbiAgfCAnd3JpdGUnICAgICAgICAgIC8vIERvc3lhIHlhem1hXG4gIHwgJ2xpc3QnICAgICAgICAgICAvLyBEaXppbiBsaXN0ZWxlbWVcbiAgfCAnY3JlYXRlJyAgICAgICAgIC8vIERvc3lhL2RpemluIG9sdcWfdHVybWFcbiAgfCAnYXBwZW5kJyAgICAgICAgIC8vIERvc3lhIGVrbGVtZVxuICB8ICdkZWxldGUnICAgICAgICAgLy8gRG9zeWEgc2lsbWVcbiAgfCAnY2htb2QnICAgICAgICAgIC8vIERvc3lhIGl6aW5sZXJpIGRlxJ9pxZ90aXJtZVxuICB8ICdta2QnICAgICAgICAgICAgLy8gRGl6aW4gb2x1xZ90dXJtYVxuICB8ICdybWRpcicgICAgICAgICAgLy8gRGl6aW4gc2lsbWVcbiAgfCAncmVuYW1lJyAgICAgICAgIC8vIERvc3lhIHllbmlkZW4gYWRsYW5kxLFybWFcbiAgfCAnZGVsZXRlbXlmaWxlcycgIC8vIEtlbmRpIGRvc3lhbGFyxLFuxLEgc2lsbWVcbiAgfCAnbm9wYXNzd2QnICAgICAgIC8vIMWeaWZyZXNpeiBnaXJpxZ9cbiAgfCAncGFzc2l2ZScgICAgICAgIC8vIFBhc2lmIG1vZCAoUEFTVilcbiAgfCAncG9ydCcgICAgICAgICAgIC8vIEFrdGlmIG1vZCAoUE9SVClcbiAgfCAnbm9ubG9jYWxiaW5kJyAgIC8vIFllcmVsIG9sbWF5YW4gYmHEn2xhbm1hXG4gIHwgJ3ByaXZhdGUnICAgICAgICAvLyDDlnplbCBrb211dGxhclxuICB8ICd0bHMnOyAgICAgICAgICAgIC8vIFRMUy9TU0xcblxuLyoqXG4gKiBLdWxsYW7EsWPEsSBpemluIG9iamVzaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQZXJtaXNzaW9ucyB7XG4gIHJlYWQ/OiBib29sZWFuO1xuICB3cml0ZT86IGJvb2xlYW47XG4gIGxpc3Q/OiBib29sZWFuO1xuICBjcmVhdGU/OiBib29sZWFuO1xuICBhcHBlbmQ/OiBib29sZWFuO1xuICBkZWxldGU/OiBib29sZWFuO1xuICBjaG1vZD86IGJvb2xlYW47XG4gIG1rZD86IGJvb2xlYW47XG4gIHJtZGlyPzogYm9vbGVhbjtcbiAgcmVuYW1lPzogYm9vbGVhbjtcbiAgZGVsZXRlbXlmaWxlcz86IGJvb2xlYW47XG4gIG5vcGFzc3dkPzogYm9vbGVhbjtcbiAgcGFzc2l2ZT86IGJvb2xlYW47XG4gIHBvcnQ/OiBib29sZWFuO1xuICBub25sb2NhbGJpbmQ/OiBib29sZWFuO1xuICBwcml2YXRlPzogYm9vbGVhbjtcbiAgdGxzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGVFAgQmHEn2xhbnTEsSBiaWxnaWxlcmlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdHBDb25uZWN0aW9uIHtcbiAgc29ja2V0OiBuZXQuU29ja2V0O1xuICB1c2VyOiBzdHJpbmcgfCBudWxsO1xuICBwYXNzOiBzdHJpbmcgfCBudWxsO1xuICBob21lRGlyOiBzdHJpbmc7XG4gIGN1cnJlbnREaXI6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9ucztcbiAgdHJhbnNmZXJNb2RlOiAnYXNjaWknIHwgJ2JpbmFyeScgfCBudWxsO1xuICB0cmFuc2ZlclNpemU6IG51bWJlcjtcbiAgbGFzdFJlcGx5OiBudW1iZXI7XG4gIGxhc3RNZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBSTkZSIGlsZSBiZWxpcmxlbmVuIHllbmlkZW4gYWRsYW5kxLFybWEga2F5bmHEn8SxICovXG4gIHJuZnJQYXRoPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFZlcmkgYmFnbGFudGkgbW9kdTogUEFTViAocGFzaWYpIHZleWEgUE9SVCAoYWt0aWYpICovXG4gIGRhdGFNb2RlPzogJ3Bhc3NpdmUnIHwgJ2FjdGl2ZSc7XG4gIC8qKiBBa3RpZiBtb2RkYSAoUE9SVCkgaXN0ZW1jaW5pbiBkaW5sZWRpZ2kgYWRyZXMgKi9cbiAgYWN0aXZlRGF0YVRhcmdldD86IHsgaXA6IHN0cmluZzsgcG9ydDogbnVtYmVyIH07XG59XG5cbi8qKlxuICogS3VsbGFuxLFjxLEgYmlsZ2lsZXJpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlciB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG4gIGhvbWVEaXI6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9ucztcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogS3VsbGFuxLFjxLEgecO2bmV0aW1pIHZlcml0YWJhbsSxXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1hbmFnZXJEYXRhIHtcbiAgdXNlcnM6IFVzZXJbXTtcbiAgbGFzdFVwZGF0ZWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBWZXJpIGJhxJ9sYW50xLFzxLEgYmlsZ2lsZXJpIChQT1JUL1BBU1YpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUNvbm5lY3Rpb24ge1xuICBzb2NrZXQ6IG5ldC5Tb2NrZXQ7XG4gIHBhc3NpdmU6IGJvb2xlYW47XG4gIGxvY2FsUG9ydDogbnVtYmVyO1xuICBzdGF0ZTogJ2xpc3RlbmluZycgfCAnY29ubmVjdGluZycgfCAnY29ubmVjdGVkJyB8ICdjbG9zaW5nJyB8ICdjbG9zZWQnO1xufVxuXG4vKipcbiAqIEtvbXV0IHNvbnXDpyBvYmplc2lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzdWx0IHtcbiAgY29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRhdGE/OiB1bmtub3duO1xufVxuXG4vKipcbiAqIEtvbXV0IGnFn2xldmkgdGlwIHRhbsSxbWxhbWFzxLFcbiAqL1xuZXhwb3J0IHR5cGUgQ29tbWFuZEhhbmRsZXIgPSAoY29ubjogRnRwQ29ubmVjdGlvbiwgYXJnczogc3RyaW5nKSA9PiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+O1xuXG4vKipcbiAqIFNlcnZlciBheWFybGFyxLFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJDb25maWcge1xuICBwb3J0OiBudW1iZXI7XG4gIGRhdGFQb3J0OiBudW1iZXI7XG4gIHVzZXJGaWxlOiBzdHJpbmcgfCBVc2VyTWFuYWdlckRhdGE7XG4gIG1heENvbm5lY3Rpb25zOiBudW1iZXI7XG4gIGxvZ0xldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJztcbiAgLyoqIDIyMCBrYXJzaWxhbWEgKGJhbm5lcikgbWVzYWppOyBib3MgYmlyYWtpbGlyc2EgXCI8cG9ydD4gRlRQIFNlcnZlciBSZWFkeVwiIGt1bGxhbmlsaXIgKi9cbiAgYmFubmVyOiBzdHJpbmc7XG4gIC8qKiBQQVNWIHZlcmkgYmFnbGFudGkgcG9ydGxhcmkgYnUgYXJhbGlrdGFuIHNlY2lsaXIgKi9cbiAgcGFzc2l2ZVBvcnRSYW5nZTogeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfTtcbiAgLyoqIFBBU1YgeWFuaXRpbmRhIGt1bGxhbmlsYWNhayBzdW51Y3UgSVAgYWRyZXNpIChvcHNpeW9uZWw7IHZlcmlsbWV6c2Ugb3RvbWF0aWsgdGVzcGl0IGVkaWxpcikgKi9cbiAgcGFzc2l2ZUlwPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERvc3lhIHRyYW5zZmVyIGR1cnVtdVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3RhdHVzIHtcbiAgZmlsZTogc3RyaW5nO1xuICBzdGF0ZTogJ3BlbmRpbmcnIHwgJ3RyYW5zZmVycmluZycgfCAnY29tcGxldGUnIHwgJ2ZhaWxlZCc7XG4gIHNpemU6IG51bWJlcjtcbiAgdHJhbnNmZXJyZWQ6IG51bWJlcjtcbiAgbW9kZTogJ2FzY2lpJyB8ICdiaW5hcnknO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbn1cblxuIl19
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsSUFBWSxTQTBEWDtBQTFERCxXQUFZLFNBQVM7SUFFbkIsbURBQWMsQ0FBQTtJQUNkLDJEQUFrQixDQUFBO0lBR2xCLHVDQUFRLENBQUE7SUFDUixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxtREFBYyxDQUFBO0lBQ2QsaURBQWEsQ0FBQTtJQUNiLGlEQUFhLENBQUE7SUFDYixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUdiLHFEQUFlLENBQUE7SUFDZixtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLG1EQUFjLENBQUE7SUFHZCxtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLGlEQUFhLENBQUE7SUFDYix1REFBZ0IsQ0FBQTtJQUNoQixxREFBZSxDQUFBO0lBQ2YsaURBQWEsQ0FBQTtJQUNiLDJEQUFrQixDQUFBO0lBQ2xCLHVEQUFnQixDQUFBO0lBQ2hCLDZEQUFtQixDQUFBO0lBQ25CLG1FQUFzQixDQUFBO0lBQ3RCLG1FQUFzQixDQUFBO0lBR3RCLDJEQUFrQixDQUFBO0lBQ2xCLGlEQUFhLENBQUE7SUFDYixtREFBYyxDQUFBO0lBQ2QseURBQWlCLENBQUE7SUFDakIsK0RBQW9CLENBQUE7SUFDcEIseURBQWlCLENBQUE7SUFDakIsNkRBQW1CLENBQUE7SUFDbkIsbUVBQXNCLENBQUE7SUFDdEIseURBQWlCLENBQUE7SUFDakIsaURBQWEsQ0FBQTtJQUNiLHlEQUFpQixDQUFBO0lBQ2pCLGlEQUFhLENBQUE7SUFDYiw2RUFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBMURXLFNBQVMsYUFBVCxTQUFTLEdBQVQsU0FBUyxRQTBEcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcblxuLyoqXG4gKiBSRkMgOTU5IEZUUCBQcm90b2NvbCBUeXBlc1xuICogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvaW5mby9yZmM5NTlcbiAqL1xuXG4vKipcbiAqIEZUUCBZYW7EsXQgS29kbGFyxLEgKFJGQyA5NTkpXG4gKi9cbmV4cG9ydCBlbnVtIFJlcGx5Q29kZSB7XG4gIC8qKiAxMDAtMTk5OiDEsMWfbGVtIHRhbWFtbGFubWFkxLEsIGJpbGdpIG1lc2FqxLEgKi9cbiAgQ09OVElOVUUgPSAxMjUsXG4gIERBVEFfQ09OTkVDVCA9IDE1MCxcbiAgXG4gIC8qKiAyMDAtMjk5OiBCYcWfYXLEsWzEsSAqL1xuICBPSyA9IDIwMCxcbiAgVVNFUl9PSyA9IDIzMCxcbiAgUEFTU19PSyA9IDIzMCxcbiAgU1lTX05BTUUgPSAyMTEsXG4gIFNZU19UWVBFID0gMjE1LFxuICBGRUFUX09LID0gMjExLFxuICBSRVRSX09LID0gMjI2LFxuICBTVE9SX09LID0gMjI2LFxuICBERUxFX09LID0gMjUwLFxuICBSTURfT0sgPSAyNTAsXG4gIE1LRF9PSyA9IDI1NyxcbiAgTElTVF9PSyA9IDE1MCxcbiAgTElTVF9FTkQgPSAyMjYsXG4gIE5PT1BfT0sgPSAyMDAsXG4gIFFVSVRfT0sgPSAyMjEsXG4gIENXRF9PSyA9IDI1MCxcbiAgUFdEX09LID0gMjU3LFxuICBSRVNUX09LID0gMzUwLFxuICBcbiAgLyoqIDMwMC0zOTk6IEJla2xleWVuIGJpbGdpICovXG4gIFVTRVJfUEFTUyA9IDMzMSxcbiAgUEFTU19BQ0MgPSAzMzIsXG4gIFVTRVJfQUNDID0gMzMyLFxuICBSRVNUX05FVyA9IDM1MCxcbiAgXG4gIC8qKiA0MDAtNDk5OiBHZcOnaWNpIGhhdGEgKi9cbiAgVVNFUl9FUlIgPSA1MDMsXG4gIFBBU1NfRVJSID0gNTAzLFxuICBDTURfRVJSID0gNTAwLFxuICBTWU5UQVhfRVJSID0gNTAxLFxuICBQQVJBTV9FUlIgPSA1MDIsXG4gIEJBRF9TRVEgPSA1MDMsXG4gIE5PX1NVQ0hfVVNFUiA9IDUzMCxcbiAgTk9UX0xPR0dFRCA9IDUzMCxcbiAgV1JJVEVfUFJPVEVDVCA9IDQ1MSxcbiAgQ0FOTk9UX09QRU5fREFUQSA9IDQyNSxcbiAgVFJBTlNGRVJfQUJPUlRFRCA9IDQyNixcbiAgXG4gIC8qKiA1MDAtNTk5OiBLYWzEsWPEsSBoYXRhICovXG4gIElOVEVSTkFMX0VSUiA9IDUwMCxcbiAgQkFEX0NNRCA9IDUwMixcbiAgQkFEX1VTRVIgPSA1MzAsXG4gIE5PVF9BTExPV0VEID0gNTUwLFxuICBGSUxFX05PVF9GT1VORCA9IDU1MCxcbiAgUEFUSF9FWElTVFMgPSA1NTAsXG4gIE5PX1BFUk1JU1NJT04gPSA1NTAsXG4gIERJUkVDVE9SWV9FWElTVFMgPSA1NTAsXG4gIEZJTEVfRVhJU1RTID0gNTUwLFxuICBTWVNUX09LID0gMjE1LFxuICBCQURfQUREUkVTUyA9IDQyMSxcbiAgVElNRU9VVCA9IDQyMSxcbiAgU0VSVklDRV9OT1RfQVZBSUxBQkxFID0gNDIxLFxufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIGl6aW4gdMO8cmxlcmlcbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IFxuICB8ICdyZWFkJyAgICAgICAgICAgLy8gRG9zeWEgb2t1bWFcbiAgfCAnd3JpdGUnICAgICAgICAgIC8vIERvc3lhIHlhem1hXG4gIHwgJ2xpc3QnICAgICAgICAgICAvLyBEaXppbiBsaXN0ZWxlbWVcbiAgfCAnY3JlYXRlJyAgICAgICAgIC8vIERvc3lhL2RpemluIG9sdcWfdHVybWFcbiAgfCAnYXBwZW5kJyAgICAgICAgIC8vIERvc3lhIGVrbGVtZVxuICB8ICdkZWxldGUnICAgICAgICAgLy8gRG9zeWEgc2lsbWVcbiAgfCAnY2htb2QnICAgICAgICAgIC8vIERvc3lhIGl6aW5sZXJpIGRlxJ9pxZ90aXJtZVxuICB8ICdta2QnICAgICAgICAgICAgLy8gRGl6aW4gb2x1xZ90dXJtYVxuICB8ICdybWRpcicgICAgICAgICAgLy8gRGl6aW4gc2lsbWVcbiAgfCAncmVuYW1lJyAgICAgICAgIC8vIERvc3lhIHllbmlkZW4gYWRsYW5kxLFybWFcbiAgfCAnZGVsZXRlbXlmaWxlcycgIC8vIEtlbmRpIGRvc3lhbGFyxLFuxLEgc2lsbWVcbiAgfCAnbm9wYXNzd2QnICAgICAgIC8vIMWeaWZyZXNpeiBnaXJpxZ9cbiAgfCAncGFzc2l2ZScgICAgICAgIC8vIFBhc2lmIG1vZCAoUEFTVilcbiAgfCAncG9ydCcgICAgICAgICAgIC8vIEFrdGlmIG1vZCAoUE9SVClcbiAgfCAnbm9ubG9jYWxiaW5kJyAgIC8vIFllcmVsIG9sbWF5YW4gYmHEn2xhbm1hXG4gIHwgJ3ByaXZhdGUnICAgICAgICAvLyDDlnplbCBrb211dGxhclxuICB8ICd0bHMnOyAgICAgICAgICAgIC8vIFRMUy9TU0xcblxuLyoqXG4gKiBMaW51eCBkb3N5YSBpemluIGVyacWfaW1pIChvd25lciAvIGdyb3VwIC8gb3RoZXJzIC0+IHJ3eClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW51eFBlcm1pc3Npb25BY2Nlc3Mge1xuICByZWFkPzogYm9vbGVhbjtcbiAgd3JpdGU/OiBib29sZWFuO1xuICBleGVjdXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBLdWxsYW7EsWPEsSBpemluIG9iamVzaSAoTGludXggZmlsZSBwZXJtaXNzaW9uczogb3duZXIsIGdyb3VwLCBvdGhlcnMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25zIHtcbiAgb3duZXI/OiBMaW51eFBlcm1pc3Npb25BY2Nlc3M7XG4gIGdyb3VwPzogTGludXhQZXJtaXNzaW9uQWNjZXNzO1xuICBvdGhlcnM/OiBMaW51eFBlcm1pc3Npb25BY2Nlc3M7XG59XG5cbi8qKlxuICogRlRQIEJhxJ9sYW50xLEgYmlsZ2lsZXJpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnRwQ29ubmVjdGlvbiB7XG4gIHNvY2tldDogbmV0LlNvY2tldDtcbiAgdXNlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGFzczogc3RyaW5nIHwgbnVsbDtcbiAgaG9tZURpcjogc3RyaW5nO1xuICBjdXJyZW50RGlyOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnM7XG4gIHRyYW5zZmVyTW9kZTogJ2FzY2lpJyB8ICdiaW5hcnknIHwgbnVsbDtcbiAgdHJhbnNmZXJTaXplOiBudW1iZXI7XG4gIGxhc3RSZXBseTogbnVtYmVyO1xuICBsYXN0TWVzc2FnZTogc3RyaW5nO1xuICAvKiogUk5GUiBpbGUgYmVsaXJsZW5lbiB5ZW5pZGVuIGFkbGFuZMSxcm1hIGtheW5hxJ/EsSAqL1xuICBybmZyUGF0aD86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBWZXJpIGJhZ2xhbnRpIG1vZHU6IFBBU1YgKHBhc2lmKSB2ZXlhIFBPUlQgKGFrdGlmKSAqL1xuICBkYXRhTW9kZT86ICdwYXNzaXZlJyB8ICdhY3RpdmUnO1xuICAvKiogQWt0aWYgbW9kZGEgKFBPUlQpIGlzdGVtY2luaW4gZGlubGVkaWdpIGFkcmVzICovXG4gIGFjdGl2ZURhdGFUYXJnZXQ/OiB7IGlwOiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9O1xufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIGJpbGdpbGVyaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIge1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBob21lRGlyOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnM7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIHnDtm5ldGltaSB2ZXJpdGFiYW7EsVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNYW5hZ2VyRGF0YSB7XG4gIHVzZXJzOiBVc2VyW107XG4gIGxhc3RVcGRhdGVkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVmVyaSBiYcSfbGFudMSxc8SxIGJpbGdpbGVyaSAoUE9SVC9QQVNWKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFDb25uZWN0aW9uIHtcbiAgc29ja2V0OiBuZXQuU29ja2V0O1xuICBwYXNzaXZlOiBib29sZWFuO1xuICBsb2NhbFBvcnQ6IG51bWJlcjtcbiAgc3RhdGU6ICdsaXN0ZW5pbmcnIHwgJ2Nvbm5lY3RpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnY2xvc2luZycgfCAnY2xvc2VkJztcbn1cblxuLyoqXG4gKiBLb211dCBzb251w6cgb2JqZXNpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJlc3VsdCB7XG4gIGNvZGU6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBLb211dCBpxZ9sZXZpIHRpcCB0YW7EsW1sYW1hc8SxXG4gKi9cbmV4cG9ydCB0eXBlIENvbW1hbmRIYW5kbGVyID0gKGNvbm46IEZ0cENvbm5lY3Rpb24sIGFyZ3M6IHN0cmluZykgPT4gUHJvbWlzZTxDb21tYW5kUmVzdWx0PjtcblxuLyoqXG4gKiBTZXJ2ZXIgYXlhcmxhcsSxIChTUUxpdGUgc2V0dGluZ3MgdGFibG9zdW5kYW4gecO8a2xlbmlyIC8gc2FrbGFuxLFyKVxuICogUHVibGljIGNvbmZpZzogeWFsbsSxemNhIGRiUGF0aCwgYmFubmVyIHZlIGxvZ0xldmVsIGnDp2VyaXIuXG4gKiBEacSfZXIgYXlhcmxhciAocG9ydCwgZGF0YVBvcnQsIG1heENvbm5lY3Rpb25zLCBwYXNzaXZlUG9ydFJhbmdlKSBkYXRhYmFzZSdkZW4gb2t1bnVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlckNvbmZpZyB7XG4gIC8qKiBTUUxpdGUgdmVyaXRhYmFuxLEgZG9zeWEgeW9sdSAodmFyc2F5xLFsYW46IGZ0cGQuZGIpICovXG4gIGRiUGF0aD86IHN0cmluZztcbiAgLyoqIDIyMCBrYXJzaWxhbWEgKGJhbm5lcikgbWVzYWppOyBib3MgYmlyYWtpbGlyc2EgXCI8cG9ydD4gRlRQIFNlcnZlciBSZWFkeVwiIGt1bGxhbmlsaXIgKi9cbiAgYmFubmVyPzogc3RyaW5nO1xuICBsb2dMZXZlbD86ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIHnDtm5ldGltaSB2ZXJpdGFiYW7EsSAoZ2VyaXllIGTDtm7DvGsgdXl1bWx1bHVrIGnDp2luIHR1dHVsbXXFn3R1cilcbiAqIEt1bGxhbsSxY8SxbGFyIGFydMSxayBTUUxpdGUgJ3VzZXJzJyB0YWJsb3N1bmRhIHR1dHVsdXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1hbmFnZXJEYXRhIHtcbiAgdXNlcnM6IFVzZXJbXTtcbiAgbGFzdFVwZGF0ZWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEb3N5YSB0cmFuc2ZlciBkdXJ1bXVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN0YXR1cyB7XG4gIGZpbGU6IHN0cmluZztcbiAgc3RhdGU6ICdwZW5kaW5nJyB8ICd0cmFuc2ZlcnJpbmcnIHwgJ2NvbXBsZXRlJyB8ICdmYWlsZWQnO1xuICBzaXplOiBudW1iZXI7XG4gIHRyYW5zZmVycmVkOiBudW1iZXI7XG4gIG1vZGU6ICdhc2NpaScgfCAnYmluYXJ5JztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG5cbiJdfQ==
@@ -1,13 +1,12 @@
1
- import { User, UserPermissions, UserManagerData, Permission } from './types';
1
+ import { User, UserPermissions, Permission } from './types';
2
+ import { DatabaseManager } from './db/database';
2
3
  export declare class UserManager {
3
- private userFile;
4
- private persist;
4
+ private db;
5
5
  private users;
6
- private data;
7
- constructor(userFile: string | UserManagerData | any);
6
+ private persist;
7
+ constructor(dbOrData: DatabaseManager | any, persist?: boolean);
8
8
  private normalizeData;
9
9
  private load;
10
- private save;
11
10
  findUser(username: string): User | null;
12
11
  addUser(username: string, password: string, homeDir: string, permissions: UserPermissions): boolean;
13
12
  deleteUser(username: string): boolean;
@@ -20,7 +19,9 @@ export declare class UserManager {
20
19
  changeUsername(oldUsername: string, newUsername: string): boolean;
21
20
  changePassword(username: string, newPassword: string): boolean;
22
21
  changeHomeDir(username: string, newHomeDir: string): boolean;
23
- static getInstance(userFile: string): UserManager;
22
+ getDb(): DatabaseManager | null;
23
+ static toLinuxAction(permission: Permission): 'read' | 'write' | 'execute';
24
+ static getInstance(db: DatabaseManager): UserManager;
24
25
  private static _instance;
25
26
  }
26
- export declare function getUserManager(userFile?: string): Promise<UserManager>;
27
+ export declare function getUserManager(db?: DatabaseManager): Promise<UserManager>;