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.
- package/README.md +45 -79
- package/package.json +7 -8
- package/src/cli/banner.d.ts +6 -0
- package/src/cli/banner.js +17 -0
- package/src/cli/context.d.ts +10 -0
- package/src/cli/context.js +13 -0
- package/src/cli/registry.d.ts +7 -0
- package/src/cli/registry.js +131 -0
- package/src/cli/repl.d.ts +2 -0
- package/src/cli/repl.js +92 -0
- package/src/core/FtpServer.d.ts +11 -4
- package/src/core/FtpServer.js +155 -27
- package/src/db/database.d.ts +54 -0
- package/src/db/database.js +252 -0
- package/src/ftpd.d.ts +2 -0
- package/src/ftpd.js +16 -0
- package/src/index.d.ts +2 -1
- package/src/index.js +4 -2
- package/src/types.d.ts +14 -27
- package/src/types.js +1 -1
- package/src/userManager.d.ts +9 -8
- package/src/userManager.js +98 -82
package/src/userManager.js
CHANGED
|
@@ -35,45 +35,35 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.UserManager = void 0;
|
|
37
37
|
exports.getUserManager = getUserManager;
|
|
38
|
-
const fs = __importStar(require("fs"));
|
|
39
38
|
const path = __importStar(require("path"));
|
|
39
|
+
const database_1 = require("./db/database");
|
|
40
40
|
const DEFAULT_USERS = [
|
|
41
41
|
{
|
|
42
|
-
username: '
|
|
43
|
-
password: '
|
|
44
|
-
homeDir: path.
|
|
42
|
+
username: 'anonim',
|
|
43
|
+
password: '',
|
|
44
|
+
homeDir: path.resolve('./'),
|
|
45
45
|
permissions: {
|
|
46
|
-
read: true,
|
|
47
|
-
write: true,
|
|
48
|
-
|
|
49
|
-
create: true,
|
|
50
|
-
append: true,
|
|
51
|
-
delete: true,
|
|
52
|
-
chmod: true,
|
|
53
|
-
mkd: true,
|
|
54
|
-
rmdir: true,
|
|
55
|
-
rename: true,
|
|
56
|
-
deletemyfiles: true,
|
|
46
|
+
owner: { read: true, write: false, execute: true },
|
|
47
|
+
group: { read: true, write: false, execute: true },
|
|
48
|
+
others: { read: true, write: false, execute: true },
|
|
57
49
|
},
|
|
58
50
|
isActive: true,
|
|
59
51
|
}
|
|
60
52
|
];
|
|
61
53
|
class UserManager {
|
|
62
|
-
constructor(
|
|
54
|
+
constructor(dbOrData, persist = true) {
|
|
63
55
|
this.users = [];
|
|
64
|
-
if (
|
|
65
|
-
this.
|
|
56
|
+
if (dbOrData instanceof database_1.DatabaseManager) {
|
|
57
|
+
this.db = dbOrData;
|
|
66
58
|
this.persist = true;
|
|
67
59
|
this.load();
|
|
68
60
|
}
|
|
69
61
|
else {
|
|
70
|
-
this.
|
|
62
|
+
this.db = null;
|
|
71
63
|
this.persist = false;
|
|
72
|
-
this.
|
|
73
|
-
this.users = this.data.users || [];
|
|
64
|
+
this.users = this.normalizeData(dbOrData);
|
|
74
65
|
if (!this.users || this.users.length === 0) {
|
|
75
66
|
this.users = DEFAULT_USERS;
|
|
76
|
-
this.data = { users: DEFAULT_USERS, lastUpdated: new Date().toISOString() };
|
|
77
67
|
}
|
|
78
68
|
console.log(`[UserManager] ${this.users.length} users loaded (in-memory)`);
|
|
79
69
|
}
|
|
@@ -81,66 +71,50 @@ class UserManager {
|
|
|
81
71
|
normalizeData(input) {
|
|
82
72
|
try {
|
|
83
73
|
if (input && Array.isArray(input.users)) {
|
|
84
|
-
return
|
|
85
|
-
users: input.users,
|
|
86
|
-
lastUpdated: input.lastUpdated || new Date().toISOString(),
|
|
87
|
-
};
|
|
74
|
+
return input.users;
|
|
88
75
|
}
|
|
89
76
|
if (Array.isArray(input)) {
|
|
90
|
-
return
|
|
91
|
-
users: input,
|
|
92
|
-
lastUpdated: new Date().toISOString(),
|
|
93
|
-
};
|
|
77
|
+
return input;
|
|
94
78
|
}
|
|
95
79
|
if (input && input.data && Array.isArray(input.data.users)) {
|
|
96
|
-
return
|
|
97
|
-
users: input.data.users,
|
|
98
|
-
lastUpdated: input.data.lastUpdated || new Date().toISOString(),
|
|
99
|
-
};
|
|
80
|
+
return input.data.users;
|
|
100
81
|
}
|
|
101
82
|
}
|
|
102
83
|
catch (e) {
|
|
103
84
|
}
|
|
104
|
-
return
|
|
85
|
+
return [...DEFAULT_USERS];
|
|
105
86
|
}
|
|
106
87
|
load() {
|
|
107
88
|
try {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
89
|
+
const db = this.db;
|
|
90
|
+
const dbUsers = db.getAllUsers();
|
|
91
|
+
this.users = dbUsers.map((u) => ({
|
|
92
|
+
username: u.username,
|
|
93
|
+
password: u.password,
|
|
94
|
+
homeDir: u.homeDir,
|
|
95
|
+
permissions: u.permissions,
|
|
96
|
+
isActive: u.isActive,
|
|
97
|
+
}));
|
|
98
|
+
if (this.users.length === 0) {
|
|
99
|
+
for (const defUser of DEFAULT_USERS) {
|
|
100
|
+
db.addUser({
|
|
101
|
+
username: defUser.username,
|
|
102
|
+
password: defUser.password,
|
|
103
|
+
homeDir: defUser.homeDir,
|
|
104
|
+
permissions: defUser.permissions,
|
|
105
|
+
isActive: defUser.isActive,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
this.users = [...DEFAULT_USERS];
|
|
109
|
+
console.log(`[UserManager] Default ${this.users.length} users created in SQLite`);
|
|
113
110
|
}
|
|
114
111
|
else {
|
|
115
|
-
this.
|
|
116
|
-
users: DEFAULT_USERS,
|
|
117
|
-
lastUpdated: new Date().toISOString(),
|
|
118
|
-
};
|
|
119
|
-
this.users = DEFAULT_USERS;
|
|
120
|
-
this.save();
|
|
121
|
-
console.log(`[UserManager] Default ${this.users.length} users created`);
|
|
112
|
+
console.log(`[UserManager] ${this.users.length} users loaded from SQLite`);
|
|
122
113
|
}
|
|
123
114
|
}
|
|
124
115
|
catch (error) {
|
|
125
116
|
console.error(`[UserManager] Load error:`);
|
|
126
|
-
this.users = DEFAULT_USERS;
|
|
127
|
-
this.data = {
|
|
128
|
-
users: DEFAULT_USERS,
|
|
129
|
-
lastUpdated: new Date().toISOString(),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
save() {
|
|
134
|
-
if (!this.persist || !this.userFile) {
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
try {
|
|
138
|
-
this.data.lastUpdated = new Date().toISOString();
|
|
139
|
-
fs.writeFileSync(this.userFile, JSON.stringify(this.data, null, 2));
|
|
140
|
-
console.log(`[UserManager] Data saved`);
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
console.error(`[UserManager] Save error:`, error);
|
|
117
|
+
this.users = [...DEFAULT_USERS];
|
|
144
118
|
}
|
|
145
119
|
}
|
|
146
120
|
findUser(username) {
|
|
@@ -158,8 +132,8 @@ class UserManager {
|
|
|
158
132
|
return user;
|
|
159
133
|
}
|
|
160
134
|
addUser(username, password, homeDir, permissions) {
|
|
161
|
-
if (!username
|
|
162
|
-
console.error(`[UserManager]
|
|
135
|
+
if (!username) {
|
|
136
|
+
console.error(`[UserManager] Invalid username`);
|
|
163
137
|
return false;
|
|
164
138
|
}
|
|
165
139
|
const existing = this.findUser(username);
|
|
@@ -175,7 +149,19 @@ class UserManager {
|
|
|
175
149
|
isActive: true,
|
|
176
150
|
};
|
|
177
151
|
this.users.push(newUser);
|
|
178
|
-
this.
|
|
152
|
+
if (this.persist && this.db) {
|
|
153
|
+
const ok = this.db.addUser({
|
|
154
|
+
username,
|
|
155
|
+
password,
|
|
156
|
+
homeDir: newUser.homeDir,
|
|
157
|
+
permissions: newUser.permissions,
|
|
158
|
+
isActive: true,
|
|
159
|
+
});
|
|
160
|
+
if (!ok) {
|
|
161
|
+
console.error(`[UserManager] Failed to persist user: ${username}`);
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
179
165
|
console.log(`[UserManager] User added: ${username}`);
|
|
180
166
|
return true;
|
|
181
167
|
}
|
|
@@ -186,7 +172,9 @@ class UserManager {
|
|
|
186
172
|
return false;
|
|
187
173
|
}
|
|
188
174
|
this.users = this.users.filter((u) => u.username !== username);
|
|
189
|
-
this.
|
|
175
|
+
if (this.persist && this.db) {
|
|
176
|
+
this.db.deleteUser(username);
|
|
177
|
+
}
|
|
190
178
|
console.log(`[UserManager] User deleted: ${username}`);
|
|
191
179
|
return true;
|
|
192
180
|
}
|
|
@@ -197,7 +185,9 @@ class UserManager {
|
|
|
197
185
|
return false;
|
|
198
186
|
}
|
|
199
187
|
user.isActive = isActive;
|
|
200
|
-
this.
|
|
188
|
+
if (this.persist && this.db) {
|
|
189
|
+
this.db.toggleUserStatus(username, isActive);
|
|
190
|
+
}
|
|
201
191
|
console.log(`[UserManager] User status changed: ${username} (${isActive ? 'active' : 'passive'})`);
|
|
202
192
|
return true;
|
|
203
193
|
}
|
|
@@ -213,7 +203,9 @@ class UserManager {
|
|
|
213
203
|
...permissions,
|
|
214
204
|
};
|
|
215
205
|
user.permissions = newPermissions;
|
|
216
|
-
this.
|
|
206
|
+
if (this.persist && this.db) {
|
|
207
|
+
this.db.updatePermissions(username, newPermissions);
|
|
208
|
+
}
|
|
217
209
|
console.log(`[UserManager] Permissions updated: ${username}`);
|
|
218
210
|
return true;
|
|
219
211
|
}
|
|
@@ -223,7 +215,8 @@ class UserManager {
|
|
|
223
215
|
console.log(`[UserManager] User not found: ${username}`);
|
|
224
216
|
return false;
|
|
225
217
|
}
|
|
226
|
-
const
|
|
218
|
+
const action = UserManager.toLinuxAction(permission);
|
|
219
|
+
const hasPermission = user.permissions?.owner?.[action] === true;
|
|
227
220
|
if (!hasPermission) {
|
|
228
221
|
console.log(`[UserManager] Permission denied: ${username} - ${permission}`);
|
|
229
222
|
}
|
|
@@ -257,7 +250,9 @@ class UserManager {
|
|
|
257
250
|
return false;
|
|
258
251
|
}
|
|
259
252
|
user.username = newUsername;
|
|
260
|
-
this.
|
|
253
|
+
if (this.persist && this.db) {
|
|
254
|
+
this.db.changeUsername(oldUsername, newUsername);
|
|
255
|
+
}
|
|
261
256
|
console.log(`[UserManager] Username changed: ${oldUsername} -> ${newUsername}`);
|
|
262
257
|
return true;
|
|
263
258
|
}
|
|
@@ -268,7 +263,9 @@ class UserManager {
|
|
|
268
263
|
return false;
|
|
269
264
|
}
|
|
270
265
|
user.password = newPassword;
|
|
271
|
-
this.
|
|
266
|
+
if (this.persist && this.db) {
|
|
267
|
+
this.db.changePassword(username, newPassword);
|
|
268
|
+
}
|
|
272
269
|
console.log(`[UserManager] Password changed: ${username}`);
|
|
273
270
|
return true;
|
|
274
271
|
}
|
|
@@ -279,13 +276,31 @@ class UserManager {
|
|
|
279
276
|
return false;
|
|
280
277
|
}
|
|
281
278
|
user.homeDir = path.resolve(newHomeDir);
|
|
282
|
-
this.
|
|
279
|
+
if (this.persist && this.db) {
|
|
280
|
+
this.db.changeHomeDir(username, user.homeDir);
|
|
281
|
+
}
|
|
283
282
|
console.log(`[UserManager] Directory changed: ${username} -> ${user.homeDir}`);
|
|
284
283
|
return true;
|
|
285
284
|
}
|
|
286
|
-
|
|
285
|
+
getDb() {
|
|
286
|
+
return this.db || null;
|
|
287
|
+
}
|
|
288
|
+
static toLinuxAction(permission) {
|
|
289
|
+
const p = permission;
|
|
290
|
+
if (p === 'write' || p === 'create' || p === 'append' || p === 'delete' || p === 'chmod' || p === 'mkd' || p === 'rmdir' || p === 'rename' || p === 'deletemyfiles') {
|
|
291
|
+
return 'write';
|
|
292
|
+
}
|
|
293
|
+
if (p === 'execute') {
|
|
294
|
+
return 'execute';
|
|
295
|
+
}
|
|
296
|
+
if (p === 'list') {
|
|
297
|
+
return 'read';
|
|
298
|
+
}
|
|
299
|
+
return 'read';
|
|
300
|
+
}
|
|
301
|
+
static getInstance(db) {
|
|
287
302
|
if (!UserManager._instance) {
|
|
288
|
-
UserManager._instance = new UserManager(
|
|
303
|
+
UserManager._instance = new UserManager(db);
|
|
289
304
|
}
|
|
290
305
|
return UserManager._instance;
|
|
291
306
|
}
|
|
@@ -294,18 +309,19 @@ exports.UserManager = UserManager;
|
|
|
294
309
|
UserManager._instance = null;
|
|
295
310
|
let userManagerInstance = null;
|
|
296
311
|
let userManagerInitPromise = null;
|
|
297
|
-
async function getUserManager(
|
|
312
|
+
async function getUserManager(db) {
|
|
298
313
|
if (!userManagerInitPromise) {
|
|
299
314
|
userManagerInitPromise = (async () => {
|
|
300
315
|
if (!userManagerInstance) {
|
|
301
|
-
if (!
|
|
302
|
-
|
|
316
|
+
if (!db) {
|
|
317
|
+
db = new database_1.DatabaseManager();
|
|
318
|
+
db.init();
|
|
303
319
|
}
|
|
304
|
-
userManagerInstance = new UserManager(
|
|
320
|
+
userManagerInstance = new UserManager(db);
|
|
305
321
|
}
|
|
306
322
|
return userManagerInstance;
|
|
307
323
|
})();
|
|
308
324
|
}
|
|
309
325
|
return userManagerInitPromise;
|
|
310
326
|
}
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXNlck1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksRUFBRSwrQkFBVztBQUN6QixNQUFZLElBQUksaUNBQWE7QUFNN0IsTUFBTSxhQUFhLEdBQVc7SUFDNUI7UUFDRSxRQUFRLEVBQUUsT0FBTztRQUNqQixRQUFRLEVBQUUsT0FBTztRQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0MsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxJQUFJO1lBQ1osS0FBSyxFQUFFLElBQUk7WUFDWCxHQUFHLEVBQUUsSUFBSTtZQUNULEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsSUFBSTtTQUNwQjtRQUNELFFBQVEsRUFBRSxJQUFJO0tBQ2Y7Q0FDRixDQUFDO0FBS0Y7SUFNRSxZQUFZLFFBQXdDO1FBSDVDLFVBQUssR0FBVyxFQUFFLENBQUM7UUFJekIsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEdB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QztRQUN4QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0UsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS00sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFnQjtRQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNCLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0NBR0Y7O0FBRGdCLHFCQUFTLEdBQXVCLElBQUksQUFBM0IsQ0FBNEI7QUFJdEQsSUFBSSxtQkFBbUIsR0FBdUIsSUFBSSxDQUFDO0FBQ25ELElBQUksc0JBQXNCLEdBQWdDLElBQUksQ0FBQztBQUV4RCxLQUFLLHlCQUF5QixRQUFpQjtJQUNwRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM1QixzQkFBc0IsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ25DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO2dCQUNELG1CQUFtQixHQUFHLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxPQUFPLG1CQUFtQixDQUFDO1FBQzdCLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDO0lBQ0QsT0FBTyxzQkFBc0IsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFVzZXIsIFVzZXJQZXJtaXNzaW9ucywgVXNlck1hbmFnZXJEYXRhLCBQZXJtaXNzaW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRGVmYXVsdCBrdWxsYW7EsWPEsWxhclxuICovXG5jb25zdCBERUZBVUxUX1VTRVJTOiBVc2VyW10gPSBbXG4gIHtcbiAgICB1c2VybmFtZTogJ2FkbWluJyxcbiAgICBwYXNzd29yZDogJ2FkbWluJyxcbiAgICBob21lRGlyOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZmlsZXMvYWRtaW4nKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgcmVhZDogdHJ1ZSxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgbGlzdDogdHJ1ZSxcbiAgICAgIGNyZWF0ZTogdHJ1ZSxcbiAgICAgIGFwcGVuZDogdHJ1ZSxcbiAgICAgIGRlbGV0ZTogdHJ1ZSxcbiAgICAgIGNobW9kOiB0cnVlLFxuICAgICAgbWtkOiB0cnVlLFxuICAgICAgcm1kaXI6IHRydWUsXG4gICAgICByZW5hbWU6IHRydWUsXG4gICAgICBkZWxldGVteWZpbGVzOiB0cnVlLFxuICAgIH0sXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gIH1cbl07XG5cbi8qKlxuICogVXNlck1hbmFnZXIgY2xhc3MgLSBLdWxsYW7EsWPEsSB5w7ZuZXRpbWlcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSB1c2VyRmlsZTogc3RyaW5nIHwgbnVsbDtcbiAgcHJpdmF0ZSBwZXJzaXN0OiBib29sZWFuO1xuICBwcml2YXRlIHVzZXJzOiBVc2VyW10gPSBbXTtcbiAgcHJpdmF0ZSBkYXRhOiBVc2VyTWFuYWdlckRhdGE7XG5cbiAgY29uc3RydWN0b3IodXNlckZpbGU6IHN0cmluZyB8IFVzZXJNYW5hZ2VyRGF0YSB8IGFueSkge1xuICAgIGlmICh0eXBlb2YgdXNlckZpbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnVzZXJGaWxlID0gdXNlckZpbGU7XG4gICAgICB0aGlzLnBlcnNpc3QgPSB0cnVlO1xuICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlckZpbGUgPSBudWxsO1xuICAgICAgdGhpcy5wZXJzaXN0ID0gZmFsc2U7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLm5vcm1hbGl6ZURhdGEodXNlckZpbGUpO1xuICAgICAgdGhpcy51c2VycyA9IHRoaXMuZGF0YS51c2VycyB8fCBbXTtcbiAgICAgIGlmICghdGhpcy51c2VycyB8fCB0aGlzLnVzZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnVzZXJzID0gREVGQVVMVF9VU0VSUztcbiAgICAgICAgdGhpcy5kYXRhID0geyB1c2VyczogREVGQVVMVF9VU0VSUywgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9O1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gJHt0aGlzLnVzZXJzLmxlbmd0aH0gdXNlcnMgbG9hZGVkIChpbi1tZW1vcnkpYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbGVuIHlhcMSxbGFuZMSxcm1hc8SxbsSxIFVzZXJNYW5hZ2VyRGF0YSBiacOnaW1pbmUgbm9ybWFsaXplIGV0XG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZURhdGEoaW5wdXQ6IGFueSk6IFVzZXJNYW5hZ2VyRGF0YSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpbnB1dCAmJiBBcnJheS5pc0FycmF5KGlucHV0LnVzZXJzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJzOiBpbnB1dC51c2VycyxcbiAgICAgICAgICBsYXN0VXBkYXRlZDogaW5wdXQubGFzdFVwZGF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcnM6IGlucHV0IGFzIFVzZXJbXSxcbiAgICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0ICYmIGlucHV0LmRhdGEgJiYgQXJyYXkuaXNBcnJheShpbnB1dC5kYXRhLnVzZXJzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJzOiBpbnB1dC5kYXRhLnVzZXJzLFxuICAgICAgICAgIGxhc3RVcGRhdGVkOiBpbnB1dC5kYXRhLmxhc3RVcGRhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB5b2tzYXlcbiAgICB9XG4gICAgcmV0dXJuIHsgdXNlcnM6IERFRkFVTFRfVVNFUlMsIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSB2ZXJpbGVyaW5pIHnDvGtsZVxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy51c2VyRmlsZSAmJiBmcy5leGlzdHNTeW5jKHRoaXMudXNlckZpbGUpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGhpcy51c2VyRmlsZSwgJ3V0Zi04Jyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgIHRoaXMudXNlcnMgPSB0aGlzLmRhdGEudXNlcnMgfHwgW107XG4gICAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdICR7dGhpcy51c2Vycy5sZW5ndGh9IHVzZXJzIGxvYWRlZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVmFyc2F5xLFsYW4ga3VsbGFuxLFjxLFsYXLEsSBvbHXFn3R1clxuICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgdXNlcnM6IERFRkFVTFRfVVNFUlMsXG4gICAgICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51c2VycyA9IERFRkFVTFRfVVNFUlM7XG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBEZWZhdWx0ICR7dGhpcy51c2Vycy5sZW5ndGh9IHVzZXJzIGNyZWF0ZWRgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW1VzZXJNYW5hZ2VyXSBMb2FkIGVycm9yOmApO1xuICAgICAgdGhpcy51c2VycyA9IERFRkFVTFRfVVNFUlM7XG4gICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgIHVzZXJzOiBERUZBVUxUX1VTRVJTLFxuICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgdmVyaWxlcmluaSBrYXlkZXRcbiAgICovXG4gIHByaXZhdGUgc2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVyc2lzdCB8fCAhdGhpcy51c2VyRmlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5kYXRhLmxhc3RVcGRhdGVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLnVzZXJGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDIpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIERhdGEgc2F2ZWRgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW1VzZXJNYW5hZ2VyXSBTYXZlIGVycm9yOmAsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgYnVsXG4gICAqL1xuICBwdWJsaWMgZmluZFVzZXIodXNlcm5hbWU6IHN0cmluZyk6IFVzZXIgfCBudWxsIHtcbiAgICBpZiAoIXVzZXJuYW1lIHx8IHVzZXJuYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2Vycy5maW5kKFxuICAgICAgKHUpID0+IHUudXNlcm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdXNlcm5hbWUudG9Mb3dlckNhc2UoKSAmJiB1LmlzQWN0aXZlXG4gICAgKSBhcyBVc2VyIHwgbnVsbDtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBFbXB0eSB1c2VybmFtZSBvciBwYXNzd29yZGApO1xuICAgIH1cblxuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGVrbGVcbiAgICovXG4gIHB1YmxpYyBhZGRVc2VyKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGhvbWVEaXI6IHN0cmluZywgcGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9ucyk6IGJvb2xlYW4ge1xuICAgIGlmICghdXNlcm5hbWUgfHwgIXBhc3N3b3JkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIFVzZXIgYWxyZWFkeSBleGlzdHM6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gS3VsbGFuxLFjxLEgYWTEsSB6YXRlbiB2YXJzYSBrb250cm9sIGV0XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtVc2VyTWFuYWdlcl0gVXNlciBhbHJlYWR5IGV4aXN0czogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdVc2VyOiBVc2VyID0ge1xuICAgICAgdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIGhvbWVEaXI6IHBhdGgucmVzb2x2ZShob21lRGlyKSxcbiAgICAgIHBlcm1pc3Npb25zOiB7IC4uLnBlcm1pc3Npb25zIH0sXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy51c2Vycy5wdXNoKG5ld1VzZXIpO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgYWRkZWQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgc2lsXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlVXNlcih1c2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy51c2VycyA9IHRoaXMudXNlcnMuZmlsdGVyKCh1KSA9PiB1LnVzZXJuYW1lICE9PSB1c2VybmFtZSk7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBkZWxldGVkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGFrdGlmL3Bhc2lmIHlhcFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVVzZXJTdGF0dXModXNlcm5hbWU6IHN0cmluZywgaXNBY3RpdmU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIG5vdCBmb3VuZDogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB1c2VyLmlzQWN0aXZlID0gaXNBY3RpdmU7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBzdGF0dXMgY2hhbmdlZDogJHt1c2VybmFtZX0gKCR7aXNBY3RpdmUgPyAnYWN0aXZlJyA6ICdwYXNzaXZlJ30pYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgaXppbmxlcmluaSBnw7xuY2VsbGVcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVQZXJtaXNzaW9ucyh1c2VybmFtZTogc3RyaW5nLCBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTWV2Y3V0IGl6aW5sZXJpIGtvcHlhbGFcbiAgICBjb25zdCBjdXJyZW50UGVybWlzc2lvbnMgPSB1c2VyLnBlcm1pc3Npb25zIHx8IHt9O1xuICAgIFxuICAgIC8vIFllbmkgaXppbmxlcmkgYmlybGXFn3RpciAoeWVuaSBpemluIHZhcnNhIGfDvG5jZWxsZSwgeW9rc2EgbWV2Y3V0IGtvcnUpXG4gICAgY29uc3QgbmV3UGVybWlzc2lvbnMgPSB7XG4gICAgICAuLi5jdXJyZW50UGVybWlzc2lvbnMsXG4gICAgICAuLi5wZXJtaXNzaW9ucyxcbiAgICB9IGFzIFVzZXJQZXJtaXNzaW9ucztcblxuICAgIHVzZXIucGVybWlzc2lvbnMgPSBuZXdQZXJtaXNzaW9ucztcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQZXJtaXNzaW9ucyB1cGRhdGVkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGl6aW5sZXJpbmkga29udHJvbCBldFxuICAgKi9cbiAgcHVibGljIGNoZWNrUGVybWlzc2lvbih1c2VybmFtZTogc3RyaW5nLCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzUGVybWlzc2lvbiA9IHVzZXIucGVybWlzc2lvbnM/LltwZXJtaXNzaW9uXSA9PT0gdHJ1ZTtcblxuICAgIGlmICghaGFzUGVybWlzc2lvbikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gUGVybWlzc2lvbiBkZW5pZWQ6ICR7dXNlcm5hbWV9IC0gJHtwZXJtaXNzaW9ufWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQZXJtaXNzaW9uIGdyYW50ZWQ6ICR7dXNlcm5hbWV9IC0gJHtwZXJtaXNzaW9ufWApO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNQZXJtaXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFTDvG0ga3VsbGFuxLFjxLFsYXLEsSBsaXN0ZWxlXG4gICAqL1xuICBwdWJsaWMgbGlzdFVzZXJzKCk6IFVzZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMudXNlcnMuZmlsdGVyKCh1KSA9PiB1LmlzQWN0aXZlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBpc3RhdGlzdGlrbGVyaVxuICAgKi9cbiAgcHVibGljIGdldFVzZXJTdGF0cygpOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgICBjb25zdCBzdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgdGhpcy51c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBzdGF0cy5zZXQodXNlci51c2VybmFtZSwgT2JqZWN0LmtleXModXNlci5wZXJtaXNzaW9ucyB8fCB7fSkubGVuZ3RoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgc2F5xLFzxLFuxLEgYWxcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy51c2Vycy5maWx0ZXIoKHUpID0+IHUuaXNBY3RpdmUpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBhZMSxbsSxIGRlxJ9pxZ90aXJcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VVc2VybmFtZShvbGRVc2VybmFtZTogc3RyaW5nLCBuZXdVc2VybmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIob2xkVXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7b2xkVXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gWWVuaSBrdWxsYW7EsWPEsSBhZMSxIHphdGVuIHZhcnNhIGtvbnRyb2wgZXRcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZmluZFVzZXIobmV3VXNlcm5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlcm5hbWUgYWxyZWFkeSBleGlzdHM6ICR7bmV3VXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdXNlci51c2VybmFtZSA9IG5ld1VzZXJuYW1lO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXJuYW1lIGNoYW5nZWQ6ICR7b2xkVXNlcm5hbWV9IC0+ICR7bmV3VXNlcm5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogS3VsbGFuxLFjxLEgxZ9pZnJlc2luaSBkZcSfacWfdGlyXG4gICAqL1xuICBwdWJsaWMgY2hhbmdlUGFzc3dvcmQodXNlcm5hbWU6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHVzZXIucGFzc3dvcmQgPSBuZXdQYXNzd29yZDtcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQYXNzd29yZCBjaGFuZ2VkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGRpemluaW5pIGRlxJ9pxZ90aXJcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VIb21lRGlyKHVzZXJuYW1lOiBzdHJpbmcsIG5ld0hvbWVEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHVzZXIuaG9tZURpciA9IHBhdGgucmVzb2x2ZShuZXdIb21lRGlyKTtcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBEaXJlY3RvcnkgY2hhbmdlZDogJHt1c2VybmFtZX0gLT4gJHt1c2VyLmhvbWVEaXJ9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXNlck1hbmFnZXIgw7ZybmXEn2kgb2x1xZ90dXIgKHNpbmdsZXRvbilcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UodXNlckZpbGU6IHN0cmluZyk6IFVzZXJNYW5hZ2VyIHtcbiAgICBpZiAoIVVzZXJNYW5hZ2VyLl9pbnN0YW5jZSkge1xuICAgICAgVXNlck1hbmFnZXIuX2luc3RhbmNlID0gbmV3IFVzZXJNYW5hZ2VyKHVzZXJGaWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIFVzZXJNYW5hZ2VyLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVXNlck1hbmFnZXIgfCBudWxsID0gbnVsbDtcbn1cblxuLy8gU2luZ2xldG9uIGluc3RhbmNlIG9sdcWfdHVybWEgLSBkw7ZuZ8O8IGJhxJ/EsW1sxLFsxLHEn8SxbmRhbiBrYcOnxLFubWFrIGnDp2luXG5sZXQgdXNlck1hbmFnZXJJbnN0YW5jZTogVXNlck1hbmFnZXIgfCBudWxsID0gbnVsbDtcbmxldCB1c2VyTWFuYWdlckluaXRQcm9taXNlOiBQcm9taXNlPFVzZXJNYW5hZ2VyPiB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VXNlck1hbmFnZXIodXNlckZpbGU/OiBzdHJpbmcpOiBQcm9taXNlPFVzZXJNYW5hZ2VyPiB7XG4gIGlmICghdXNlck1hbmFnZXJJbml0UHJvbWlzZSkge1xuICAgIHVzZXJNYW5hZ2VySW5pdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF1c2VyTWFuYWdlckluc3RhbmNlKSB7XG4gICAgICAgIGlmICghdXNlckZpbGUpIHtcbiAgICAgICAgICB1c2VyRmlsZSA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi91c2Vycy5qc29uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdXNlck1hbmFnZXJJbnN0YW5jZSA9IG5ldyBVc2VyTWFuYWdlcih1c2VyRmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXNlck1hbmFnZXJJbnN0YW5jZTtcbiAgICB9KSgpO1xuICB9XG4gIHJldHVybiB1c2VyTWFuYWdlckluaXRQcm9taXNlO1xufVxuIl19
|
|
327
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXNlck1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksSUFBSSxpQ0FBYTtBQUU3Qiw0Q0FBZ0Q7QUFLaEQsTUFBTSxhQUFhLEdBQVc7SUFDNUI7UUFDRSxRQUFRLEVBQUUsUUFBUTtRQUNsQixRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMzQixXQUFXLEVBQUU7WUFDWCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtZQUNsRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtZQUNsRCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtTQUNwRDtRQUNELFFBQVEsRUFBRSxJQUFJO0tBQ2Y7Q0FDRixDQUFDO0FBT0Y7SUFLRSxZQUFZLFFBQStCLEVBQUUsT0FBTyxHQUFZLElBQUk7UUFINUQsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUl6QixJQUFJLFFBQVEsWUFBWSwwQkFBZSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztZQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElB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QUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNCLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0NBR0Y7O0FBRGdCLHFCQUFTLEdBQXVCLElBQUksQUFBM0IsQ0FBNEI7QUFJdEQsSUFBSSxtQkFBbUIsR0FBdUIsSUFBSSxDQUFDO0FBQ25ELElBQUksc0JBQXNCLEdBQWdDLElBQUksQ0FBQztBQUV4RCxLQUFLLHlCQUF5QixFQUFvQjtJQUN2RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM1QixzQkFBc0IsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ25DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ1IsRUFBRSxHQUFHLElBQUksMEJBQWUsRUFBRSxDQUFDO29CQUMzQixFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxtQkFBbUIsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsT0FBTyxtQkFBbUIsQ0FBQztRQUM3QixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsQ0FBQztJQUNELE9BQU8sc0JBQXNCLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBVc2VyLCBVc2VyUGVybWlzc2lvbnMsIFBlcm1pc3Npb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IERhdGFiYXNlTWFuYWdlciB9IGZyb20gJy4vZGIvZGF0YWJhc2UnO1xuXG4vKipcbiAqIERlZmF1bHQga3VsbGFuxLFjxLFsYXIgKHZlcml0YWJhbsSxIGJvxZ8gb2xkdcSfdW5kYSBpbGsgw6dhbMSxxZ90xLFybWFkYSBla2xlbmlyKVxuICovXG5jb25zdCBERUZBVUxUX1VTRVJTOiBVc2VyW10gPSBbXG4gIHtcbiAgICB1c2VybmFtZTogJ2Fub25pbScsXG4gICAgcGFzc3dvcmQ6ICcnLFxuICAgIGhvbWVEaXI6IHBhdGgucmVzb2x2ZSgnLi8nKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgb3duZXI6IHsgcmVhZDogdHJ1ZSwgd3JpdGU6IGZhbHNlLCBleGVjdXRlOiB0cnVlIH0sXG4gICAgICBncm91cDogeyByZWFkOiB0cnVlLCB3cml0ZTogZmFsc2UsIGV4ZWN1dGU6IHRydWUgfSxcbiAgICAgIG90aGVyczogeyByZWFkOiB0cnVlLCB3cml0ZTogZmFsc2UsIGV4ZWN1dGU6IHRydWUgfSxcbiAgICB9LFxuICAgIGlzQWN0aXZlOiB0cnVlLFxuICB9XG5dO1xuXG4vKipcbiAqIFVzZXJNYW5hZ2VyIGNsYXNzIC0gS3VsbGFuxLFjxLEgecO2bmV0aW1pXG4gKlxuICogS3VsbGFuxLFjxLFsYXIgYXJ0xLFrIEpTT04gZG9zeWFzxLEgeWVyaW5lIFNRTGl0ZSAndXNlcnMnIHRhYmxvc3VuZGEgdHV0dWx1ci5cbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBkYjogRGF0YWJhc2VNYW5hZ2VyIHwgbnVsbDtcbiAgcHJpdmF0ZSB1c2VyczogVXNlcltdID0gW107XG4gIHByaXZhdGUgcGVyc2lzdDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihkYk9yRGF0YTogRGF0YWJhc2VNYW5hZ2VyIHwgYW55LCBwZXJzaXN0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChkYk9yRGF0YSBpbnN0YW5jZW9mIERhdGFiYXNlTWFuYWdlcikge1xuICAgICAgdGhpcy5kYiA9IGRiT3JEYXRhO1xuICAgICAgdGhpcy5wZXJzaXN0ID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRiID0gbnVsbDtcbiAgICAgIHRoaXMucGVyc2lzdCA9IGZhbHNlO1xuICAgICAgdGhpcy51c2VycyA9IHRoaXMubm9ybWFsaXplRGF0YShkYk9yRGF0YSk7XG4gICAgICBpZiAoIXRoaXMudXNlcnMgfHwgdGhpcy51c2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy51c2VycyA9IERFRkFVTFRfVVNFUlM7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSAke3RoaXMudXNlcnMubGVuZ3RofSB1c2VycyBsb2FkZWQgKGluLW1lbW9yeSlgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VsZW4geWFwxLFsYW5kxLFybWFzxLFuxLEgVXNlciBkaXppc2luZSBub3JtYWxpemUgZXRcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplRGF0YShpbnB1dDogYW55KTogVXNlcltdIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGlucHV0ICYmIEFycmF5LmlzQXJyYXkoaW5wdXQudXNlcnMpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dC51c2VycyBhcyBVc2VyW107XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGFzIFVzZXJbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dCAmJiBpbnB1dC5kYXRhICYmIEFycmF5LmlzQXJyYXkoaW5wdXQuZGF0YS51c2VycykpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LmRhdGEudXNlcnMgYXMgVXNlcltdO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHlva3NheVxuICAgIH1cbiAgICByZXR1cm4gWy4uLkRFRkFVTFRfVVNFUlNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIHZlcmlsZXJpbmkgU1FMaXRlICd1c2VycycgdGFibG9zdW5kYW4gecO8a2xlXG4gICAqL1xuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRiID0gdGhpcy5kYiE7XG4gICAgICBjb25zdCBkYlVzZXJzID0gZGIuZ2V0QWxsVXNlcnMoKTtcbiAgICAgIHRoaXMudXNlcnMgPSBkYlVzZXJzLm1hcCgodSkgPT4gKHtcbiAgICAgICAgdXNlcm5hbWU6IHUudXNlcm5hbWUsXG4gICAgICAgIHBhc3N3b3JkOiB1LnBhc3N3b3JkLFxuICAgICAgICBob21lRGlyOiB1LmhvbWVEaXIsXG4gICAgICAgIHBlcm1pc3Npb25zOiB1LnBlcm1pc3Npb25zIGFzIFVzZXJQZXJtaXNzaW9ucyxcbiAgICAgICAgaXNBY3RpdmU6IHUuaXNBY3RpdmUsXG4gICAgICB9KSk7XG4gICAgICBpZiAodGhpcy51c2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gVmVyaXRhYmFuxLEgYm/Fn3NhIHZhcnNhecSxbGFuIGt1bGxhbsSxY8SxbGFyxLEgZWtsZVxuICAgICAgICBmb3IgKGNvbnN0IGRlZlVzZXIgb2YgREVGQVVMVF9VU0VSUykge1xuICAgICAgICAgIGRiLmFkZFVzZXIoe1xuICAgICAgICAgICAgdXNlcm5hbWU6IGRlZlVzZXIudXNlcm5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogZGVmVXNlci5wYXNzd29yZCxcbiAgICAgICAgICAgIGhvbWVEaXI6IGRlZlVzZXIuaG9tZURpcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBkZWZVc2VyLnBlcm1pc3Npb25zIGFzIFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuICAgICAgICAgICAgaXNBY3RpdmU6IGRlZlVzZXIuaXNBY3RpdmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VycyA9IFsuLi5ERUZBVUxUX1VTRVJTXTtcbiAgICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gRGVmYXVsdCAke3RoaXMudXNlcnMubGVuZ3RofSB1c2VycyBjcmVhdGVkIGluIFNRTGl0ZWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gJHt0aGlzLnVzZXJzLmxlbmd0aH0gdXNlcnMgbG9hZGVkIGZyb20gU1FMaXRlYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtVc2VyTWFuYWdlcl0gTG9hZCBlcnJvcjpgKTtcbiAgICAgIHRoaXMudXNlcnMgPSBbLi4uREVGQVVMVF9VU0VSU107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGJ1bFxuICAgKi9cbiAgcHVibGljIGZpbmRVc2VyKHVzZXJuYW1lOiBzdHJpbmcpOiBVc2VyIHwgbnVsbCB7XG4gICAgaWYgKCF1c2VybmFtZSB8fCB1c2VybmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcnMuZmluZChcbiAgICAgICh1KSA9PiB1LnVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgJiYgdS5pc0FjdGl2ZVxuICAgICkgYXMgVXNlciB8IG51bGw7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgIH1cblxuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gRW1wdHkgdXNlcm5hbWUgb3IgcGFzc3dvcmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBla2xlXG4gICAqL1xuICBwdWJsaWMgYWRkVXNlcih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBob21lRGlyOiBzdHJpbmcsIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoIXVzZXJuYW1lKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIEludmFsaWQgdXNlcm5hbWVgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBLdWxsYW7EsWPEsSBhZMSxIHphdGVuIHZhcnNhIGtvbnRyb2wgZXRcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgY29uc29sZS5lcnJvcihgW1VzZXJNYW5hZ2VyXSBVc2VyIGFscmVhZHkgZXhpc3RzOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1VzZXI6IFVzZXIgPSB7XG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgaG9tZURpcjogcGF0aC5yZXNvbHZlKGhvbWVEaXIpLFxuICAgICAgcGVybWlzc2lvbnM6IHsgLi4ucGVybWlzc2lvbnMgfSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgIH07XG5cbiAgICB0aGlzLnVzZXJzLnB1c2gobmV3VXNlcik7XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0ICYmIHRoaXMuZGIpIHtcbiAgICAgIGNvbnN0IG9rID0gdGhpcy5kYi5hZGRVc2VyKHtcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICBob21lRGlyOiBuZXdVc2VyLmhvbWVEaXIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBuZXdVc2VyLnBlcm1pc3Npb25zIGFzIFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbVXNlck1hbmFnZXJdIEZhaWxlZCB0byBwZXJzaXN0IHVzZXI6ICR7dXNlcm5hbWV9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIGFkZGVkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIHNpbFxuICAgKi9cbiAgcHVibGljIGRlbGV0ZVVzZXIodXNlcm5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMudXNlcnMgPSB0aGlzLnVzZXJzLmZpbHRlcigodSkgPT4gdS51c2VybmFtZSAhPT0gdXNlcm5hbWUpO1xuXG4gICAgaWYgKHRoaXMucGVyc2lzdCAmJiB0aGlzLmRiKSB7XG4gICAgICB0aGlzLmRiLmRlbGV0ZVVzZXIodXNlcm5hbWUpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgZGVsZXRlZDogJHt1c2VybmFtZX1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBha3RpZi9wYXNpZiB5YXBcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVVc2VyU3RhdHVzKHVzZXJuYW1lOiBzdHJpbmcsIGlzQWN0aXZlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdXNlci5pc0FjdGl2ZSA9IGlzQWN0aXZlO1xuXG4gICAgaWYgKHRoaXMucGVyc2lzdCAmJiB0aGlzLmRiKSB7XG4gICAgICB0aGlzLmRiLnRvZ2dsZVVzZXJTdGF0dXModXNlcm5hbWUsIGlzQWN0aXZlKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIHN0YXR1cyBjaGFuZ2VkOiAke3VzZXJuYW1lfSAoJHtpc0FjdGl2ZSA/ICdhY3RpdmUnIDogJ3Bhc3NpdmUnfSlgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBpemlubGVyaW5pIGfDvG5jZWxsZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVBlcm1pc3Npb25zKHVzZXJuYW1lOiBzdHJpbmcsIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnMpOiBib29sZWFuIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIG5vdCBmb3VuZDogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBNZXZjdXQgaXppbmxlcmkga29weWFsYVxuICAgIGNvbnN0IGN1cnJlbnRQZXJtaXNzaW9ucyA9IHVzZXIucGVybWlzc2lvbnMgfHwge307XG5cbiAgICAvLyBZZW5pIGl6aW5sZXJpIGJpcmxlxZ90aXIgKHllbmkgaXppbiB2YXJzYSBnw7xuY2VsbGUsIHlva3NhIG1ldmN1dCBrb3J1KVxuICAgIGNvbnN0IG5ld1Blcm1pc3Npb25zID0ge1xuICAgICAgLi4uY3VycmVudFBlcm1pc3Npb25zLFxuICAgICAgLi4ucGVybWlzc2lvbnMsXG4gICAgfSBhcyBVc2VyUGVybWlzc2lvbnM7XG5cbiAgICB1c2VyLnBlcm1pc3Npb25zID0gbmV3UGVybWlzc2lvbnM7XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0ICYmIHRoaXMuZGIpIHtcbiAgICAgIHRoaXMuZGIudXBkYXRlUGVybWlzc2lvbnModXNlcm5hbWUsIG5ld1Blcm1pc3Npb25zIGFzIFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+KTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQZXJtaXNzaW9ucyB1cGRhdGVkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGl6aW5sZXJpbmkga29udHJvbCBldFxuICAgKi9cbiAgcHVibGljIGNoZWNrUGVybWlzc2lvbih1c2VybmFtZTogc3RyaW5nLCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gVXNlciBub3QgZm91bmQ6ICR7dXNlcm5hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gVXNlck1hbmFnZXIudG9MaW51eEFjdGlvbihwZXJtaXNzaW9uKTtcbiAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gdXNlci5wZXJtaXNzaW9ucz8ub3duZXI/LlthY3Rpb25dID09PSB0cnVlO1xuXG4gICAgaWYgKCFoYXNQZXJtaXNzaW9uKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQZXJtaXNzaW9uIGRlbmllZDogJHt1c2VybmFtZX0gLSAke3Blcm1pc3Npb259YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFBlcm1pc3Npb24gZ3JhbnRlZDogJHt1c2VybmFtZX0gLSAke3Blcm1pc3Npb259YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc1Blcm1pc3Npb247XG4gIH1cblxuICAvKipcbiAgICogVMO8bSBrdWxsYW7EsWPEsWxhcsSxIGxpc3RlbGVcbiAgICovXG4gIHB1YmxpYyBsaXN0VXNlcnMoKTogVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy51c2Vycy5maWx0ZXIoKHUpID0+IHUuaXNBY3RpdmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGlzdGF0aXN0aWtsZXJpXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlclN0YXRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IHN0YXRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB0aGlzLnVzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcbiAgICAgIHN0YXRzLnNldCh1c2VyLnVzZXJuYW1lLCBPYmplY3Qua2V5cyh1c2VyLnBlcm1pc3Npb25zIHx8IHt9KS5sZW5ndGgpO1xuICAgIH0pO1xuICAgIHJldHVybiBzdGF0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBLdWxsYW7EsWPEsSBzYXnEsXPEsW7EsSBhbFxuICAgKi9cbiAgcHVibGljIGdldFVzZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnVzZXJzLmZpbHRlcigodSkgPT4gdS5pc0FjdGl2ZSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGFkxLFuxLEgZGXEn2nFn3RpclxuICAgKi9cbiAgcHVibGljIGNoYW5nZVVzZXJuYW1lKG9sZFVzZXJuYW1lOiBzdHJpbmcsIG5ld1VzZXJuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcihvbGRVc2VybmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIG5vdCBmb3VuZDogJHtvbGRVc2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBZZW5pIGt1bGxhbsSxY8SxIGFkxLEgemF0ZW4gdmFyc2Ega29udHJvbCBldFxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5maW5kVXNlcihuZXdVc2VybmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VybmFtZSBhbHJlYWR5IGV4aXN0czogJHtuZXdVc2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB1c2VyLnVzZXJuYW1lID0gbmV3VXNlcm5hbWU7XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0ICYmIHRoaXMuZGIpIHtcbiAgICAgIHRoaXMuZGIuY2hhbmdlVXNlcm5hbWUob2xkVXNlcm5hbWUsIG5ld1VzZXJuYW1lKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VybmFtZSBjaGFuZ2VkOiAke29sZFVzZXJuYW1lfSAtPiAke25ld1VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIMWfaWZyZXNpbmkgZGXEn2nFn3RpclxuICAgKi9cbiAgcHVibGljIGNoYW5nZVBhc3N3b3JkKHVzZXJuYW1lOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBVc2VyIG5vdCBmb3VuZDogJHt1c2VybmFtZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB1c2VyLnBhc3N3b3JkID0gbmV3UGFzc3dvcmQ7XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0ICYmIHRoaXMuZGIpIHtcbiAgICAgIHRoaXMuZGIuY2hhbmdlUGFzc3dvcmQodXNlcm5hbWUsIG5ld1Bhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBQYXNzd29yZCBjaGFuZ2VkOiAke3VzZXJuYW1lfWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEt1bGxhbsSxY8SxIGRpemluaW5pIGRlxJ9pxZ90aXJcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VIb21lRGlyKHVzZXJuYW1lOiBzdHJpbmcsIG5ld0hvbWVEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFVzZXIgbm90IGZvdW5kOiAke3VzZXJuYW1lfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHVzZXIuaG9tZURpciA9IHBhdGgucmVzb2x2ZShuZXdIb21lRGlyKTtcblxuICAgIGlmICh0aGlzLnBlcnNpc3QgJiYgdGhpcy5kYikge1xuICAgICAgdGhpcy5kYi5jaGFuZ2VIb21lRGlyKHVzZXJuYW1lLCB1c2VyLmhvbWVEaXIpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIERpcmVjdG9yeSBjaGFuZ2VkOiAke3VzZXJuYW1lfSAtPiAke3VzZXIuaG9tZURpcn1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpdGFiYW7EsSB5w7ZuZXRpY2lzaW5lIGVyacWfaW0gKGF5YXJsYXIgacOnaW4pXG4gICAqL1xuICBwdWJsaWMgZ2V0RGIoKTogRGF0YWJhc2VNYW5hZ2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGIgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGVFAgaXppbiBhbmFodGFyxLFuxLEgTGludXggZG9zeWEgaXppbiBleWxlbWluZSDDp2V2aXJpci5cbiAgICogS3VsbGFuxLFjxLEga2VuZGkgaG9tZSBkaXppbmluZSAob3duZXIpIHNhaGlwdGlyOyBGVFAgc2V2aXllc2kgaXppbmxlcmlcbiAgICogTGludXggb3duZXIgcGVybWlzc2lvbnMgbWFudMSxxJ/EsXlsYSBkZcSfZXJsZW5kaXJpbGlyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0b0xpbnV4QWN0aW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiAncmVhZCcgfCAnd3JpdGUnIHwgJ2V4ZWN1dGUnIHtcbiAgICBjb25zdCBwID0gcGVybWlzc2lvbiBhcyB1bmtub3duIGFzIHN0cmluZztcbiAgICBpZiAocCA9PT0gJ3dyaXRlJyB8fCBwID09PSAnY3JlYXRlJyB8fCBwID09PSAnYXBwZW5kJyB8fCBwID09PSAnZGVsZXRlJyB8fCBwID09PSAnY2htb2QnIHx8IHAgPT09ICdta2QnIHx8IHAgPT09ICdybWRpcicgfHwgcCA9PT0gJ3JlbmFtZScgfHwgcCA9PT0gJ2RlbGV0ZW15ZmlsZXMnKSB7XG4gICAgICByZXR1cm4gJ3dyaXRlJztcbiAgICB9XG4gICAgaWYgKHAgPT09ICdleGVjdXRlJykge1xuICAgICAgcmV0dXJuICdleGVjdXRlJztcbiAgICB9XG4gICAgaWYgKHAgPT09ICdsaXN0Jykge1xuICAgICAgcmV0dXJuICdyZWFkJztcbiAgICB9XG4gICAgcmV0dXJuICdyZWFkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VyTWFuYWdlciDDtnJuZcSfaSBvbHXFn3R1ciAoc2luZ2xldG9uKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZShkYjogRGF0YWJhc2VNYW5hZ2VyKTogVXNlck1hbmFnZXIge1xuICAgIGlmICghVXNlck1hbmFnZXIuX2luc3RhbmNlKSB7XG4gICAgICBVc2VyTWFuYWdlci5faW5zdGFuY2UgPSBuZXcgVXNlck1hbmFnZXIoZGIpO1xuICAgIH1cbiAgICByZXR1cm4gVXNlck1hbmFnZXIuX2luc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBVc2VyTWFuYWdlciB8IG51bGwgPSBudWxsO1xufVxuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2Ugb2x1xZ90dXJtYSAtIGTDtm5nw7wgYmHEn8SxbWzEsWzEscSfxLFuZGFuIGthw6fEsW5tYWsgacOnaW5cbmxldCB1c2VyTWFuYWdlckluc3RhbmNlOiBVc2VyTWFuYWdlciB8IG51bGwgPSBudWxsO1xubGV0IHVzZXJNYW5hZ2VySW5pdFByb21pc2U6IFByb21pc2U8VXNlck1hbmFnZXI+IHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVc2VyTWFuYWdlcihkYj86IERhdGFiYXNlTWFuYWdlcik6IFByb21pc2U8VXNlck1hbmFnZXI+IHtcbiAgaWYgKCF1c2VyTWFuYWdlckluaXRQcm9taXNlKSB7XG4gICAgdXNlck1hbmFnZXJJbml0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXVzZXJNYW5hZ2VySW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKCFkYikge1xuICAgICAgICAgIGRiID0gbmV3IERhdGFiYXNlTWFuYWdlcigpO1xuICAgICAgICAgIGRiLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VyTWFuYWdlckluc3RhbmNlID0gbmV3IFVzZXJNYW5hZ2VyKGRiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1c2VyTWFuYWdlckluc3RhbmNlO1xuICAgIH0pKCk7XG4gIH1cbiAgcmV0dXJuIHVzZXJNYW5hZ2VySW5pdFByb21pc2U7XG59XG4iXX0=
|