@secrecy/lib 1.0.0-dev.53 → 1.0.0-dev.56
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/dist/BaseClient.d.ts +10 -142
- package/dist/BaseClient.js +35 -584
- package/dist/client/SecrecyAppClient.d.ts +17 -0
- package/dist/client/SecrecyAppClient.js +258 -0
- package/dist/client/SecrecyCloudClient.d.ts +89 -0
- package/dist/client/SecrecyCloudClient.js +1637 -0
- package/dist/client/SecrecyDbClient.d.ts +21 -0
- package/dist/client/SecrecyDbClient.js +198 -0
- package/dist/client/SecrecyMailClient.d.ts +42 -0
- package/dist/client/SecrecyMailClient.js +1189 -0
- package/dist/client/convert/mail.d.ts +2 -2
- package/dist/client/convert/mail.js +7 -5
- package/dist/client/index.d.ts +9 -142
- package/dist/client/index.js +12 -3171
- package/dist/client/types/index.d.ts +6 -34
- package/dist/client/types/index.js +1 -1
- package/dist/client/types/selectors.d.ts +4 -4
- package/dist/client/types/selectors.js +13 -5
- package/dist/index.d.ts +4 -5
- package/dist/index.js +3 -4
- package/dist/zeus/const.js +41 -1
- package/dist/zeus/index.d.ts +193 -1
- package/dist/zeus/index.js +13 -1
- package/package.json +13 -12
- package/dist/client/admin/index.d.ts +0 -11
- package/dist/client/admin/index.js +0 -110
- package/dist/worker/__mock__/sodium.worker.d.ts +0 -19
- package/dist/worker/__mock__/sodium.worker.js +0 -49
package/dist/client/index.js
CHANGED
|
@@ -1,35 +1,16 @@
|
|
|
1
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
1
|
import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
|
|
3
2
|
import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
|
|
4
3
|
|
|
5
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
6
|
-
|
|
7
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
8
|
-
|
|
9
4
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
10
|
-
import ky from "ky";
|
|
11
|
-
import axios from "axios";
|
|
12
5
|
import { BaseClient } from "../BaseClient.js";
|
|
13
|
-
import {
|
|
14
|
-
import { secretstreamKeygen, encryptSecretstream } from "../crypto/file.js";
|
|
15
|
-
import { compress, uncompress } from "../minify/index.js";
|
|
16
|
-
import { gqlNodeFullToInternalFull, gqlNodeToExternal, gqlNodeToExternalNodeFull, internalNodeToNode } from "./convert/node.js";
|
|
17
|
-
import { gqlFileToExternal } from "./convert/file.js";
|
|
6
|
+
import { encryptSecretstream } from "../crypto/file.js";
|
|
18
7
|
import { sodium } from "../sodium.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
import { convertInternalMailToExternal } from "./convert/mail.js";
|
|
26
|
-
import { getStorage } from "./storage.js";
|
|
27
|
-
import { decode } from "jsonwebtoken"; // import { md5 } from "../worker/index.js";
|
|
28
|
-
// import { firstValueFrom, of } from "rxjs";
|
|
29
|
-
|
|
30
|
-
import { serialize } from "bson";
|
|
31
|
-
|
|
32
|
-
const encryptName = async (name, nameKey) => {
|
|
8
|
+
import { SecrecyCloudClient } from "./SecrecyCloudClient.js";
|
|
9
|
+
import { SecrecyMailClient } from "./SecrecyMailClient.js";
|
|
10
|
+
import { SecrecyAppClient } from "./SecrecyAppClient.js";
|
|
11
|
+
import { nodesCache, filesCache } from "../cache.js";
|
|
12
|
+
import { SecrecyDbClient } from "./SecrecyDbClient.js";
|
|
13
|
+
export const encryptName = async (name, nameKey) => {
|
|
33
14
|
const {
|
|
34
15
|
data
|
|
35
16
|
} = await encryptSecretstream(sodium.from_hex(nameKey), sodium.from_string(name));
|
|
@@ -46,3162 +27,22 @@ export class SecrecyClient extends BaseClient {
|
|
|
46
27
|
writable: true,
|
|
47
28
|
value: void 0
|
|
48
29
|
});
|
|
49
|
-
|
|
50
|
-
this.perNode = async (nodeId, publicKey) => {
|
|
51
|
-
var _node$access;
|
|
52
|
-
|
|
53
|
-
let node = nodesCache.get(nodeId);
|
|
54
|
-
|
|
55
|
-
if (!node) {
|
|
56
|
-
await this.node({
|
|
57
|
-
id: nodeId
|
|
58
|
-
});
|
|
59
|
-
node = nodesCache.get(nodeId);
|
|
60
|
-
|
|
61
|
-
if (!node) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const nameKey = (_node$access = node.access) == null ? void 0 : _node$access.nameKey;
|
|
67
|
-
|
|
68
|
-
if (!nameKey) {
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
id: node.id,
|
|
74
|
-
nameKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(nameKey), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
75
|
-
files: "history" in node ? node.history.map(f => ({
|
|
76
|
-
id: f.id,
|
|
77
|
-
key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(f.key), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
|
|
78
|
-
})) : []
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
this._eachUser = async (files, subject, body, idOrMail) => {
|
|
83
|
-
let u = usersCache.get(idOrMail);
|
|
84
|
-
|
|
85
|
-
if (!u || !("publicKey" in u)) {
|
|
86
|
-
try {
|
|
87
|
-
const req = await this.user({
|
|
88
|
-
userId: idOrMail,
|
|
89
|
-
withPublicKey: true
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
if (!req) {
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (req.__typename !== "SuccessResponse") {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
u = req.data;
|
|
101
|
-
} catch {
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (!u) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (!("publicKey" in u)) {
|
|
111
|
-
throw new Error("User " + idOrMail + " have no public key");
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const recipientsFiles = new Array();
|
|
115
|
-
|
|
116
|
-
for (const f of files) {
|
|
117
|
-
let fileInHistory = filesCache.get(f.id);
|
|
118
|
-
|
|
119
|
-
if (!fileInHistory) {
|
|
120
|
-
await this.file({
|
|
121
|
-
id: f.id
|
|
122
|
-
});
|
|
123
|
-
fileInHistory = filesCache.get(f.id);
|
|
124
|
-
|
|
125
|
-
if (!fileInHistory) {
|
|
126
|
-
throw new Error("File " + f.name + " (" + f.id + ") does not exists");
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const key = fileInHistory.key;
|
|
131
|
-
recipientsFiles.push({
|
|
132
|
-
id: f.id,
|
|
133
|
-
name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
134
|
-
fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
return {
|
|
139
|
-
recipientId: u.id,
|
|
140
|
-
body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
141
|
-
subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
142
|
-
files: recipientsFiles
|
|
143
|
-
};
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
this.jwt = uaJwt;
|
|
147
|
-
this.jwtDecoded = decode(uaJwt);
|
|
148
30
|
_classPrivateFieldLooseBase(this, _keys)[_keys] = uaKeys;
|
|
31
|
+
this.cloud = new SecrecyCloudClient(this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
|
|
32
|
+
this.mail = new SecrecyMailClient(this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
|
|
33
|
+
this.app = new SecrecyAppClient(uaJwt, this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
|
|
34
|
+
this.db = new SecrecyDbClient(this, _classPrivateFieldLooseBase(this, _keys)[_keys], this.thunder);
|
|
149
35
|
}
|
|
150
36
|
|
|
151
37
|
get publicKey() {
|
|
152
38
|
return _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
153
39
|
}
|
|
154
40
|
|
|
155
|
-
get appUserId() {
|
|
156
|
-
var _this$jwtDecoded$sub;
|
|
157
|
-
|
|
158
|
-
return (_this$jwtDecoded$sub = this.jwtDecoded.sub) != null ? _this$jwtDecoded$sub : "";
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
async addFileToHistory(_ref) {
|
|
162
|
-
let {
|
|
163
|
-
fileId,
|
|
164
|
-
nodeId
|
|
165
|
-
} = _ref;
|
|
166
|
-
const {
|
|
167
|
-
addFileToHistory
|
|
168
|
-
} = await this.client("mutation")({
|
|
169
|
-
addFileToHistory: [{
|
|
170
|
-
fileId,
|
|
171
|
-
nodeId
|
|
172
|
-
}, {
|
|
173
|
-
"...on ErrorAccessDenied": {
|
|
174
|
-
__typename: true,
|
|
175
|
-
message: true
|
|
176
|
-
},
|
|
177
|
-
"...on ErrorNotExist": {
|
|
178
|
-
__typename: true,
|
|
179
|
-
message: true
|
|
180
|
-
},
|
|
181
|
-
"...on AddFileToHistoryResponse": {
|
|
182
|
-
__typename: true,
|
|
183
|
-
addFileToHistory: nodeFullSelector
|
|
184
|
-
}
|
|
185
|
-
}]
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
if (!addFileToHistory) {
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (addFileToHistory.__typename === "ErrorAccessDenied") {
|
|
193
|
-
return addFileToHistory;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
if (addFileToHistory.__typename === "ErrorNotExist") {
|
|
197
|
-
return addFileToHistory;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const node = await gqlNodeFullToInternalFull(addFileToHistory.addFileToHistory, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
201
|
-
const file = node.history.find(f => f.id === fileId);
|
|
202
|
-
|
|
203
|
-
if (file) {
|
|
204
|
-
const users = node.users.filter(_ref2 => {
|
|
205
|
-
let [u] = _ref2;
|
|
206
|
-
return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
207
|
-
});
|
|
208
|
-
const input = {
|
|
209
|
-
fileId: file.id,
|
|
210
|
-
users: users.map(_ref3 => {
|
|
211
|
-
let [u] = _ref3;
|
|
212
|
-
return {
|
|
213
|
-
id: u.id,
|
|
214
|
-
key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
|
|
215
|
-
};
|
|
216
|
-
})
|
|
217
|
-
};
|
|
218
|
-
await this.client("mutation")({
|
|
219
|
-
shareFileInHistory: [{
|
|
220
|
-
input,
|
|
221
|
-
nodeId
|
|
222
|
-
}, {
|
|
223
|
-
"...on ErrorAccessDenied": {
|
|
224
|
-
__typename: true,
|
|
225
|
-
message: true
|
|
226
|
-
},
|
|
227
|
-
"...on ErrorNotFound": {
|
|
228
|
-
__typename: true,
|
|
229
|
-
message: true
|
|
230
|
-
},
|
|
231
|
-
"...on ShareFileInHistoryResponse": {
|
|
232
|
-
__typename: true,
|
|
233
|
-
shareFileInHistory: true
|
|
234
|
-
}
|
|
235
|
-
}]
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
const result = internalNodeToNode(node);
|
|
240
|
-
return {
|
|
241
|
-
__typename: "SuccessResponse",
|
|
242
|
-
data: result
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
async uploadFile(_ref4) {
|
|
247
|
-
let {
|
|
248
|
-
file,
|
|
249
|
-
encryptProgress,
|
|
250
|
-
uploadProgress,
|
|
251
|
-
signal
|
|
252
|
-
} = _ref4;
|
|
253
|
-
const fileKey = secretstreamKeygen();
|
|
254
|
-
const fileBuffer = file instanceof File ? new Uint8Array(await file.arrayBuffer()) : file;
|
|
255
|
-
const compressed = compress(fileBuffer);
|
|
256
|
-
const {
|
|
257
|
-
data: encryptedFile,
|
|
258
|
-
md5: md5File,
|
|
259
|
-
md5Encrypted
|
|
260
|
-
} = await encrypt(fileKey, compressed, encryptProgress, signal);
|
|
261
|
-
const encryptedFileKey = encryptCryptoBox(fileKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
|
|
262
|
-
const {
|
|
263
|
-
uploadFile
|
|
264
|
-
} = await this.client("mutation", {
|
|
265
|
-
scalars: {
|
|
266
|
-
Json: {
|
|
267
|
-
encode: e => JSON.stringify(e),
|
|
268
|
-
decode: e => JSON.parse(e)
|
|
269
|
-
},
|
|
270
|
-
DateTime: {
|
|
271
|
-
decode: e => new Date(e),
|
|
272
|
-
encode: e => e.toISOString()
|
|
273
|
-
},
|
|
274
|
-
BigInt: {
|
|
275
|
-
decode: e => BigInt(e),
|
|
276
|
-
encode: e => e.toString()
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
})({
|
|
280
|
-
uploadFile: [{
|
|
281
|
-
fileSize: encryptedFile.byteLength,
|
|
282
|
-
fileSizeBefore: fileBuffer.byteLength,
|
|
283
|
-
fileKey: sodium.to_hex(encryptedFileKey),
|
|
284
|
-
md5Encrypted,
|
|
285
|
-
md5: md5File
|
|
286
|
-
}, {
|
|
287
|
-
"...on ErrorAccessDenied": {
|
|
288
|
-
__typename: true,
|
|
289
|
-
message: true
|
|
290
|
-
},
|
|
291
|
-
"...on ErrorLimit": {
|
|
292
|
-
__typename: true,
|
|
293
|
-
message: true
|
|
294
|
-
},
|
|
295
|
-
"...on ErrorNotFound": {
|
|
296
|
-
__typename: true,
|
|
297
|
-
message: true
|
|
298
|
-
},
|
|
299
|
-
"...on UploadFileResponse": {
|
|
300
|
-
__typename: true,
|
|
301
|
-
uploadFile: {
|
|
302
|
-
fileId: true,
|
|
303
|
-
filePartSize: true,
|
|
304
|
-
parts: {
|
|
305
|
-
fields: true,
|
|
306
|
-
order: true,
|
|
307
|
-
url: true
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}]
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
if (!uploadFile) {
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
if (uploadFile.__typename === "ErrorAccessDenied") {
|
|
319
|
-
return uploadFile;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
if (uploadFile.__typename === "ErrorLimit") {
|
|
323
|
-
return uploadFile;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if (uploadFile.__typename === "ErrorNotFound") {
|
|
327
|
-
return uploadFile;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
if (!uploadFile.uploadFile) {
|
|
331
|
-
return null;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
uploadProgress == null ? void 0 : uploadProgress({
|
|
335
|
-
total: encryptedFile.byteLength,
|
|
336
|
-
current: 0,
|
|
337
|
-
percent: 0
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
if (uploadFile.uploadFile.parts.length === 0) {
|
|
341
|
-
uploadProgress == null ? void 0 : uploadProgress({
|
|
342
|
-
total: encryptedFile.byteLength,
|
|
343
|
-
current: encryptedFile.byteLength,
|
|
344
|
-
percent: 1
|
|
345
|
-
});
|
|
346
|
-
return {
|
|
347
|
-
__typename: "SuccessResponse",
|
|
348
|
-
data: uploadFile.uploadFile.fileId
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
const uploadPartEnded = async (md5, order) => {
|
|
353
|
-
if (!uploadFile.uploadFile) {
|
|
354
|
-
return null;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
const {
|
|
358
|
-
uploadFilePartEnd
|
|
359
|
-
} = await this.client("mutation")({
|
|
360
|
-
uploadFilePartEnd: [{
|
|
361
|
-
fileId: uploadFile.uploadFile.fileId,
|
|
362
|
-
md5,
|
|
363
|
-
order
|
|
364
|
-
}, {
|
|
365
|
-
"...on ErrorAccessDenied": {
|
|
366
|
-
__typename: true,
|
|
367
|
-
message: true
|
|
368
|
-
},
|
|
369
|
-
"...on UploadFilePartEndResponse": {
|
|
370
|
-
__typename: true,
|
|
371
|
-
uploadFilePartEnd: true
|
|
372
|
-
}
|
|
373
|
-
}]
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
if (!uploadFilePartEnd) {
|
|
377
|
-
return null;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
if (uploadFilePartEnd.__typename === "ErrorAccessDenied") {
|
|
381
|
-
return uploadFilePartEnd;
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
return {
|
|
385
|
-
__typename: "SuccessResponse",
|
|
386
|
-
data: uploadFilePartEnd.uploadFilePartEnd
|
|
387
|
-
};
|
|
388
|
-
};
|
|
389
|
-
|
|
390
|
-
const uploadEnded = async () => {
|
|
391
|
-
if (!uploadFile.uploadFile) {
|
|
392
|
-
return null;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
const {
|
|
396
|
-
uploadFileEnd
|
|
397
|
-
} = await this.client("mutation")({
|
|
398
|
-
uploadFileEnd: [{
|
|
399
|
-
fileId: uploadFile.uploadFile.fileId
|
|
400
|
-
}, {
|
|
401
|
-
"...on ErrorAccessDenied": {
|
|
402
|
-
__typename: true,
|
|
403
|
-
message: true
|
|
404
|
-
},
|
|
405
|
-
"...on ErrorNotFound": {
|
|
406
|
-
__typename: true,
|
|
407
|
-
message: true
|
|
408
|
-
},
|
|
409
|
-
"...on UploadFileEndResponse": {
|
|
410
|
-
__typename: true,
|
|
411
|
-
uploadFileEnd: true
|
|
412
|
-
}
|
|
413
|
-
}]
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
if (!uploadFileEnd) {
|
|
417
|
-
return null;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
if (uploadFileEnd.__typename === "ErrorAccessDenied") {
|
|
421
|
-
return uploadFileEnd;
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if (uploadFileEnd.__typename === "ErrorNotFound") {
|
|
425
|
-
return uploadFileEnd;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
if (!uploadFileEnd.uploadFileEnd) {
|
|
429
|
-
return null;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
return {
|
|
433
|
-
__typename: "SuccessResponse",
|
|
434
|
-
data: uploadFileEnd.uploadFileEnd
|
|
435
|
-
};
|
|
436
|
-
};
|
|
437
|
-
|
|
438
|
-
const chunkParts = new Array();
|
|
439
|
-
|
|
440
|
-
for (const [index, chunk] of enumerate(chunks(encryptedFile, Number(uploadFile.uploadFile.filePartSize)))) {
|
|
441
|
-
chunkParts.push({
|
|
442
|
-
order: index + 1,
|
|
443
|
-
data: chunk,
|
|
444
|
-
md5: await md5(chunk)
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
const progressParts = {};
|
|
449
|
-
|
|
450
|
-
const onProgress = (part, progressEvent) => {
|
|
451
|
-
progressParts[part] = progressEvent;
|
|
452
|
-
const current = Object.values(progressParts).reduce((prv, cur) => prv + cur.loaded, 0);
|
|
453
|
-
uploadProgress == null ? void 0 : uploadProgress({
|
|
454
|
-
percent: current / encryptedFile.byteLength,
|
|
455
|
-
total: encryptedFile.byteLength,
|
|
456
|
-
current
|
|
457
|
-
});
|
|
458
|
-
};
|
|
459
|
-
|
|
460
|
-
const byPart = async part => {
|
|
461
|
-
if (!uploadFile.uploadFile) {
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
const formData = new FormData();
|
|
466
|
-
const chunk = chunkParts.find(p => p.order === part.order);
|
|
467
|
-
|
|
468
|
-
if (!chunk) {
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
for (const [key, value] of Object.entries(part.fields)) {
|
|
473
|
-
formData.append(key, value);
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
formData.append("file", new Blob([chunk.data]), uploadFile.uploadFile.fileId + "-" + chunk.order);
|
|
477
|
-
await axios.post(part.url, formData, {
|
|
478
|
-
onUploadProgress: progressEvent => onProgress(part.order, progressEvent),
|
|
479
|
-
signal
|
|
480
|
-
});
|
|
481
|
-
await uploadPartEnded(chunk.md5, chunk.order); // if ((e as any).response.status === 0) {
|
|
482
|
-
// // TODO https://github.com/sindresorhus/ky/issues/305
|
|
483
|
-
// } else {
|
|
484
|
-
// throw e;
|
|
485
|
-
// }
|
|
486
|
-
};
|
|
487
|
-
|
|
488
|
-
if (!uploadFile.uploadFile) {
|
|
489
|
-
return null;
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
await promiseAllLimit(3, uploadFile.uploadFile.parts.map(p => () => byPart(p)));
|
|
493
|
-
const result = await uploadEnded();
|
|
494
|
-
|
|
495
|
-
if (!result) {
|
|
496
|
-
return null;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
if (result.__typename === "ErrorAccessDenied") {
|
|
500
|
-
return result;
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
if (result.__typename === "ErrorNotFound") {
|
|
504
|
-
return result;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
return {
|
|
508
|
-
__typename: "SuccessResponse",
|
|
509
|
-
data: result.data
|
|
510
|
-
};
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
async uploadFileInCloud(_ref5) {
|
|
514
|
-
let {
|
|
515
|
-
file,
|
|
516
|
-
name,
|
|
517
|
-
nodeId,
|
|
518
|
-
encryptProgress,
|
|
519
|
-
uploadProgress,
|
|
520
|
-
signal
|
|
521
|
-
} = _ref5;
|
|
522
|
-
const fileId = await this.uploadFile({
|
|
523
|
-
file,
|
|
524
|
-
encryptProgress,
|
|
525
|
-
uploadProgress,
|
|
526
|
-
signal
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
if (!fileId) {
|
|
530
|
-
return null;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
if (fileId.__typename === "ErrorAccessDenied") {
|
|
534
|
-
return fileId;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
if (fileId.__typename === "ErrorLimit") {
|
|
538
|
-
return fileId;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
if (fileId.__typename === "ErrorNotFound") {
|
|
542
|
-
return fileId;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
const result = await this.saveInCloud({
|
|
546
|
-
fileId: fileId.data,
|
|
547
|
-
name,
|
|
548
|
-
nodeId
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
if (!result) {
|
|
552
|
-
return null;
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
if (result.__typename === "ErrorAccessDenied") {
|
|
556
|
-
return result;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
if (result.__typename === "ErrorBasic") {
|
|
560
|
-
return result;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
if (result.__typename === "ErrorLimit") {
|
|
564
|
-
return result;
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
if (result.__typename === "ErrorNotFound") {
|
|
568
|
-
return result;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
if (result.__typename === "ErrorNotExist") {
|
|
572
|
-
return result;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
return {
|
|
576
|
-
__typename: "SuccessResponse",
|
|
577
|
-
data: result.data
|
|
578
|
-
};
|
|
579
|
-
}
|
|
580
|
-
|
|
581
41
|
async logout(sessionId) {
|
|
582
42
|
nodesCache.clear();
|
|
583
43
|
filesCache.clear();
|
|
584
44
|
await super.logout(sessionId);
|
|
585
45
|
}
|
|
586
46
|
|
|
587
|
-
async createFolder(_ref6) {
|
|
588
|
-
var _folder$parent$users$, _folder$parent, _folder$parent$users;
|
|
589
|
-
|
|
590
|
-
let {
|
|
591
|
-
name,
|
|
592
|
-
parentFolderId
|
|
593
|
-
} = _ref6;
|
|
594
|
-
const key = secretstreamKeygen();
|
|
595
|
-
const encryptedName = await encryptName(name, sodium.to_hex(key));
|
|
596
|
-
const encryptedKey = encryptCryptoBox(key, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
|
|
597
|
-
const {
|
|
598
|
-
createFolder
|
|
599
|
-
} = await this.client("mutation")({
|
|
600
|
-
createFolder: [{
|
|
601
|
-
name: encryptedName,
|
|
602
|
-
parentFolderId,
|
|
603
|
-
key: sodium.to_hex(encryptedKey)
|
|
604
|
-
}, {
|
|
605
|
-
"...on ErrorAccessDenied": {
|
|
606
|
-
__typename: true,
|
|
607
|
-
message: true
|
|
608
|
-
},
|
|
609
|
-
"...on ErrorNotExist": {
|
|
610
|
-
__typename: true,
|
|
611
|
-
message: true
|
|
612
|
-
},
|
|
613
|
-
"...on CreateFolderResponse": {
|
|
614
|
-
__typename: true,
|
|
615
|
-
createFolder: nodeFullSelector
|
|
616
|
-
}
|
|
617
|
-
}]
|
|
618
|
-
});
|
|
619
|
-
|
|
620
|
-
if (!createFolder) {
|
|
621
|
-
//throw new Error(`Can't create folder`);
|
|
622
|
-
return null;
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
if (createFolder.__typename === "ErrorAccessDenied") {
|
|
626
|
-
return createFolder;
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
if (createFolder.__typename === "ErrorNotExist") {
|
|
630
|
-
return createFolder;
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
if (!createFolder.createFolder) {
|
|
634
|
-
return null;
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
const folder = await gqlNodeToExternalNodeFull(createFolder.createFolder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
638
|
-
const users = (_folder$parent$users$ = (_folder$parent = folder.parent) == null ? void 0 : (_folder$parent$users = _folder$parent.users) == null ? void 0 : _folder$parent$users.filter(_ref7 => {
|
|
639
|
-
let [u] = _ref7;
|
|
640
|
-
return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
641
|
-
})) != null ? _folder$parent$users$ : [];
|
|
642
|
-
|
|
643
|
-
if (users.length) {
|
|
644
|
-
await Promise.all(users.map(_ref8 => {
|
|
645
|
-
let [u, rights] = _ref8;
|
|
646
|
-
return this.shareNode({
|
|
647
|
-
nodeId: folder.id,
|
|
648
|
-
rights,
|
|
649
|
-
userId: u.id
|
|
650
|
-
});
|
|
651
|
-
}));
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
return {
|
|
655
|
-
__typename: "SuccessResponse",
|
|
656
|
-
data: folder
|
|
657
|
-
};
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
async node(_temp) {
|
|
661
|
-
let {
|
|
662
|
-
id,
|
|
663
|
-
deleted
|
|
664
|
-
} = _temp === void 0 ? {} : _temp;
|
|
665
|
-
const {
|
|
666
|
-
node
|
|
667
|
-
} = await this.client("query")({
|
|
668
|
-
node: [{
|
|
669
|
-
deleted,
|
|
670
|
-
id
|
|
671
|
-
}, {
|
|
672
|
-
"...on ErrorAccessDenied": {
|
|
673
|
-
__typename: true,
|
|
674
|
-
message: true
|
|
675
|
-
},
|
|
676
|
-
"...on NodeResponse": {
|
|
677
|
-
__typename: true,
|
|
678
|
-
node: nodeFullSelector
|
|
679
|
-
}
|
|
680
|
-
}]
|
|
681
|
-
});
|
|
682
|
-
|
|
683
|
-
if (!node) {
|
|
684
|
-
return null;
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
if (node.__typename === "ErrorAccessDenied") {
|
|
688
|
-
return node;
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
if (!node.node) {
|
|
692
|
-
return null;
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
const result = await gqlNodeToExternalNodeFull(node.node, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
696
|
-
return {
|
|
697
|
-
__typename: "SuccessResponse",
|
|
698
|
-
data: result
|
|
699
|
-
};
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
async file(_ref9) {
|
|
703
|
-
let {
|
|
704
|
-
id
|
|
705
|
-
} = _ref9;
|
|
706
|
-
const {
|
|
707
|
-
file
|
|
708
|
-
} = await this.client("query")({
|
|
709
|
-
file: [{
|
|
710
|
-
id
|
|
711
|
-
}, {
|
|
712
|
-
"...on ErrorAccessDenied": {
|
|
713
|
-
__typename: true,
|
|
714
|
-
message: true
|
|
715
|
-
},
|
|
716
|
-
"...on FileQueryResponse": {
|
|
717
|
-
__typename: true,
|
|
718
|
-
file: fileSelector
|
|
719
|
-
}
|
|
720
|
-
}]
|
|
721
|
-
});
|
|
722
|
-
|
|
723
|
-
if (!file) {
|
|
724
|
-
return null;
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
if (file.__typename === "ErrorAccessDenied") {
|
|
728
|
-
return file;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
if (!file.file) {
|
|
732
|
-
return null;
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
const result = gqlFileToExternal(file.file, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
736
|
-
return {
|
|
737
|
-
__typename: "SuccessResponse",
|
|
738
|
-
data: result
|
|
739
|
-
};
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
async mail(_ref10) {
|
|
743
|
-
let {
|
|
744
|
-
id
|
|
745
|
-
} = _ref10;
|
|
746
|
-
const {
|
|
747
|
-
mail
|
|
748
|
-
} = await this.client("query", {
|
|
749
|
-
scalars: {
|
|
750
|
-
DateTime: {
|
|
751
|
-
decode: e => new Date(e),
|
|
752
|
-
encode: e => e.toISOString()
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
})({
|
|
756
|
-
mail: [{
|
|
757
|
-
id
|
|
758
|
-
}, {
|
|
759
|
-
"...on ErrorAccessDenied": {
|
|
760
|
-
__typename: true,
|
|
761
|
-
message: true
|
|
762
|
-
},
|
|
763
|
-
"...on QueryMailResponse": {
|
|
764
|
-
__typename: true,
|
|
765
|
-
mail: mailSelector
|
|
766
|
-
}
|
|
767
|
-
}]
|
|
768
|
-
});
|
|
769
|
-
|
|
770
|
-
if (!mail) {
|
|
771
|
-
return null;
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
if (mail.__typename === "ErrorAccessDenied") {
|
|
775
|
-
return mail;
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
if (!mail.mail) {
|
|
779
|
-
return null;
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
const result = convertInternalMailToExternal(mail.mail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
783
|
-
|
|
784
|
-
if (!result) {
|
|
785
|
-
return null;
|
|
786
|
-
}
|
|
787
|
-
|
|
788
|
-
return {
|
|
789
|
-
__typename: "SuccessResponse",
|
|
790
|
-
data: result
|
|
791
|
-
};
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
async deletedNodes() {
|
|
795
|
-
const {
|
|
796
|
-
deletedNodes
|
|
797
|
-
} = await this.client("query")({
|
|
798
|
-
deletedNodes: {
|
|
799
|
-
"...on ErrorAccessDenied": {
|
|
800
|
-
__typename: true,
|
|
801
|
-
message: true
|
|
802
|
-
},
|
|
803
|
-
"...on DeletedNodesResponse": {
|
|
804
|
-
__typename: true,
|
|
805
|
-
deletedNodes: nodeSelector
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
});
|
|
809
|
-
|
|
810
|
-
if (!deletedNodes) {
|
|
811
|
-
return null;
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
if (deletedNodes.__typename === "ErrorAccessDenied") {
|
|
815
|
-
return deletedNodes;
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
const nodes = new Array();
|
|
819
|
-
|
|
820
|
-
for (const node of deletedNodes.deletedNodes) {
|
|
821
|
-
nodes.push(await gqlNodeToExternal(node, _classPrivateFieldLooseBase(this, _keys)[_keys]));
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
return {
|
|
825
|
-
__typename: "SuccessResponse",
|
|
826
|
-
data: nodes
|
|
827
|
-
};
|
|
828
|
-
}
|
|
829
|
-
|
|
830
|
-
async sharedNodes() {
|
|
831
|
-
const {
|
|
832
|
-
sharedNodes
|
|
833
|
-
} = await this.client("query")({
|
|
834
|
-
sharedNodes: {
|
|
835
|
-
"...on ErrorAccessDenied": {
|
|
836
|
-
__typename: true,
|
|
837
|
-
message: true
|
|
838
|
-
},
|
|
839
|
-
"...on SharedNodesResponse": {
|
|
840
|
-
__typename: true,
|
|
841
|
-
sharedNodes: nodeSelector
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
});
|
|
845
|
-
|
|
846
|
-
if (!sharedNodes) {
|
|
847
|
-
return null;
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
if (sharedNodes.__typename === "ErrorAccessDenied") {
|
|
851
|
-
return sharedNodes;
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
const nodes = new Array();
|
|
855
|
-
|
|
856
|
-
for (const folder of sharedNodes.sharedNodes) {
|
|
857
|
-
nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
|
|
858
|
-
}
|
|
859
|
-
|
|
860
|
-
return {
|
|
861
|
-
__typename: "SuccessResponse",
|
|
862
|
-
data: nodes
|
|
863
|
-
};
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
async nodesSharedWithMe(type) {
|
|
867
|
-
const {
|
|
868
|
-
nodesSharedWithMe
|
|
869
|
-
} = await this.client("query")({
|
|
870
|
-
nodesSharedWithMe: [{
|
|
871
|
-
type
|
|
872
|
-
}, {
|
|
873
|
-
"...on ErrorAccessDenied": {
|
|
874
|
-
__typename: true,
|
|
875
|
-
message: true
|
|
876
|
-
},
|
|
877
|
-
"...on NodesSharedWithMeResponse": {
|
|
878
|
-
__typename: true,
|
|
879
|
-
nodesSharedWithMe: nodeSelector
|
|
880
|
-
}
|
|
881
|
-
}]
|
|
882
|
-
});
|
|
883
|
-
|
|
884
|
-
if (!nodesSharedWithMe) {
|
|
885
|
-
return null;
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
if (nodesSharedWithMe.__typename === "ErrorAccessDenied") {
|
|
889
|
-
return nodesSharedWithMe;
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
const nodes = new Array();
|
|
893
|
-
|
|
894
|
-
for (const folder of nodesSharedWithMe.nodesSharedWithMe) {
|
|
895
|
-
nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
return {
|
|
899
|
-
__typename: "SuccessResponse",
|
|
900
|
-
data: nodes
|
|
901
|
-
};
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
async deleteNodeSharing(_ref11) {
|
|
905
|
-
let {
|
|
906
|
-
nodeId,
|
|
907
|
-
userId
|
|
908
|
-
} = _ref11;
|
|
909
|
-
const {
|
|
910
|
-
deleteNodeSharing
|
|
911
|
-
} = await this.client("mutation")({
|
|
912
|
-
deleteNodeSharing: [{
|
|
913
|
-
nodeId,
|
|
914
|
-
userId
|
|
915
|
-
}, {
|
|
916
|
-
"...on ErrorAccessDenied": {
|
|
917
|
-
__typename: true,
|
|
918
|
-
message: true
|
|
919
|
-
},
|
|
920
|
-
"...on DeleteNodeSharingResponse": {
|
|
921
|
-
__typename: true,
|
|
922
|
-
deleteNodeSharing: true
|
|
923
|
-
}
|
|
924
|
-
}]
|
|
925
|
-
});
|
|
926
|
-
|
|
927
|
-
if (!deleteNodeSharing) {
|
|
928
|
-
return null;
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
if (deleteNodeSharing.__typename === "ErrorAccessDenied") {
|
|
932
|
-
return deleteNodeSharing;
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
return {
|
|
936
|
-
__typename: "SuccessResponse",
|
|
937
|
-
data: deleteNodeSharing.deleteNodeSharing
|
|
938
|
-
};
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
async duplicateNode(_ref12) {
|
|
942
|
-
var _node$access2;
|
|
943
|
-
|
|
944
|
-
let {
|
|
945
|
-
nodeId,
|
|
946
|
-
folderId,
|
|
947
|
-
customName
|
|
948
|
-
} = _ref12;
|
|
949
|
-
let node = nodesCache.get(nodeId);
|
|
950
|
-
|
|
951
|
-
if (!node) {
|
|
952
|
-
await this.node({
|
|
953
|
-
id: nodeId
|
|
954
|
-
});
|
|
955
|
-
node = nodesCache.get(nodeId);
|
|
956
|
-
|
|
957
|
-
if (!node) {
|
|
958
|
-
throw new Error("Node (" + nodeId + ") does not exists");
|
|
959
|
-
}
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
if (!((_node$access2 = node.access) != null && _node$access2.nameKey)) {
|
|
963
|
-
throw new Error("Can't have access to node " + nodeId);
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
customName = customName ? await encryptName(customName, node.access.nameKey) : null;
|
|
967
|
-
const {
|
|
968
|
-
duplicateNode
|
|
969
|
-
} = await this.client("mutation")({
|
|
970
|
-
duplicateNode: [{
|
|
971
|
-
nodeId,
|
|
972
|
-
folderId,
|
|
973
|
-
customName
|
|
974
|
-
}, {
|
|
975
|
-
"...on ErrorAccessDenied": {
|
|
976
|
-
__typename: true,
|
|
977
|
-
message: true
|
|
978
|
-
},
|
|
979
|
-
"...on ErrorNotFound": {
|
|
980
|
-
__typename: true,
|
|
981
|
-
message: true
|
|
982
|
-
},
|
|
983
|
-
"...on DuplicateNodeResponse": {
|
|
984
|
-
__typename: true,
|
|
985
|
-
duplicateNode: true
|
|
986
|
-
}
|
|
987
|
-
}]
|
|
988
|
-
});
|
|
989
|
-
|
|
990
|
-
if (!duplicateNode) {
|
|
991
|
-
return null;
|
|
992
|
-
}
|
|
993
|
-
|
|
994
|
-
if (duplicateNode.__typename === "ErrorAccessDenied") {
|
|
995
|
-
return duplicateNode;
|
|
996
|
-
}
|
|
997
|
-
|
|
998
|
-
if (duplicateNode.__typename === "ErrorNotFound") {
|
|
999
|
-
return duplicateNode;
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
return {
|
|
1003
|
-
__typename: "SuccessResponse",
|
|
1004
|
-
data: duplicateNode.duplicateNode
|
|
1005
|
-
};
|
|
1006
|
-
}
|
|
1007
|
-
|
|
1008
|
-
async deleteNodeCloudTrash(_ref13) {
|
|
1009
|
-
var _deleteNodeCloudTrash;
|
|
1010
|
-
|
|
1011
|
-
let {
|
|
1012
|
-
ids
|
|
1013
|
-
} = _ref13;
|
|
1014
|
-
const {
|
|
1015
|
-
deleteNodeCloudTrash
|
|
1016
|
-
} = await this.client("mutation")({
|
|
1017
|
-
deleteNodeCloudTrash: [{
|
|
1018
|
-
ids
|
|
1019
|
-
}, {
|
|
1020
|
-
"...on ErrorAccessDenied": {
|
|
1021
|
-
__typename: true,
|
|
1022
|
-
message: true
|
|
1023
|
-
},
|
|
1024
|
-
"...on DeleteNodeCloudTrashResponse": {
|
|
1025
|
-
__typename: true,
|
|
1026
|
-
deleteNodeCloudTrash: true
|
|
1027
|
-
}
|
|
1028
|
-
}]
|
|
1029
|
-
});
|
|
1030
|
-
|
|
1031
|
-
if (!deleteNodeCloudTrash) {
|
|
1032
|
-
return null;
|
|
1033
|
-
}
|
|
1034
|
-
|
|
1035
|
-
if (deleteNodeCloudTrash.__typename === "ErrorAccessDenied") {
|
|
1036
|
-
return deleteNodeCloudTrash;
|
|
1037
|
-
}
|
|
1038
|
-
|
|
1039
|
-
return {
|
|
1040
|
-
__typename: "SuccessResponse",
|
|
1041
|
-
data: (_deleteNodeCloudTrash = deleteNodeCloudTrash.deleteNodeCloudTrash) != null ? _deleteNodeCloudTrash : false
|
|
1042
|
-
};
|
|
1043
|
-
}
|
|
1044
|
-
|
|
1045
|
-
async shareNode(_ref14) {
|
|
1046
|
-
var _shareNodeFinish$shar;
|
|
1047
|
-
|
|
1048
|
-
let {
|
|
1049
|
-
nodeId,
|
|
1050
|
-
userId,
|
|
1051
|
-
rights
|
|
1052
|
-
} = _ref14;
|
|
1053
|
-
const user = await this.user({
|
|
1054
|
-
userId,
|
|
1055
|
-
withPublicKey: true
|
|
1056
|
-
});
|
|
1057
|
-
|
|
1058
|
-
if (!user) {
|
|
1059
|
-
return user;
|
|
1060
|
-
}
|
|
1061
|
-
|
|
1062
|
-
if (user.__typename === "ErrorNotFound") {
|
|
1063
|
-
return user;
|
|
1064
|
-
}
|
|
1065
|
-
|
|
1066
|
-
const {
|
|
1067
|
-
shareNode
|
|
1068
|
-
} = await this.client("mutation")({
|
|
1069
|
-
shareNode: [{
|
|
1070
|
-
nodeId,
|
|
1071
|
-
userId
|
|
1072
|
-
}, {
|
|
1073
|
-
"...on ErrorAccessDenied": {
|
|
1074
|
-
__typename: true,
|
|
1075
|
-
message: true
|
|
1076
|
-
},
|
|
1077
|
-
"...on ErrorNotFound": {
|
|
1078
|
-
__typename: true,
|
|
1079
|
-
message: true
|
|
1080
|
-
},
|
|
1081
|
-
"...on ShareNodeResponse": {
|
|
1082
|
-
__typename: true,
|
|
1083
|
-
nodes: true
|
|
1084
|
-
}
|
|
1085
|
-
}]
|
|
1086
|
-
});
|
|
1087
|
-
|
|
1088
|
-
if (!shareNode) {
|
|
1089
|
-
return null;
|
|
1090
|
-
}
|
|
1091
|
-
|
|
1092
|
-
if (shareNode.__typename === "ErrorAccessDenied") {
|
|
1093
|
-
return shareNode;
|
|
1094
|
-
}
|
|
1095
|
-
|
|
1096
|
-
if (shareNode.__typename === "ErrorNotFound") {
|
|
1097
|
-
return shareNode;
|
|
1098
|
-
}
|
|
1099
|
-
|
|
1100
|
-
const shareNodes = {
|
|
1101
|
-
nodes: []
|
|
1102
|
-
};
|
|
1103
|
-
|
|
1104
|
-
for (const id of shareNode.nodes) {
|
|
1105
|
-
const nameKey = await this.perNode(id, user.data.publicKey);
|
|
1106
|
-
|
|
1107
|
-
if (nameKey) {
|
|
1108
|
-
shareNodes.nodes.push(nameKey);
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
const {
|
|
1113
|
-
shareNodeFinish
|
|
1114
|
-
} = await this.client("mutation")({
|
|
1115
|
-
shareNodeFinish: [{
|
|
1116
|
-
rights,
|
|
1117
|
-
userId,
|
|
1118
|
-
shareNodes
|
|
1119
|
-
}, {
|
|
1120
|
-
"...on ErrorAccessDenied": {
|
|
1121
|
-
__typename: true,
|
|
1122
|
-
message: true
|
|
1123
|
-
},
|
|
1124
|
-
"...on ErrorNotFound": {
|
|
1125
|
-
__typename: true,
|
|
1126
|
-
message: true
|
|
1127
|
-
},
|
|
1128
|
-
"...on ShareNodeFinishResponse": {
|
|
1129
|
-
__typename: true,
|
|
1130
|
-
shareNodeFinish: true
|
|
1131
|
-
}
|
|
1132
|
-
}]
|
|
1133
|
-
});
|
|
1134
|
-
|
|
1135
|
-
if (!shareNodeFinish) {
|
|
1136
|
-
return null;
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
if (shareNodeFinish.__typename === "ErrorAccessDenied") {
|
|
1140
|
-
return shareNodeFinish;
|
|
1141
|
-
}
|
|
1142
|
-
|
|
1143
|
-
if (shareNodeFinish.__typename === "ErrorNotFound") {
|
|
1144
|
-
return shareNodeFinish;
|
|
1145
|
-
}
|
|
1146
|
-
|
|
1147
|
-
return {
|
|
1148
|
-
__typename: "SuccessResponse",
|
|
1149
|
-
data: (_shareNodeFinish$shar = shareNodeFinish.shareNodeFinish) != null ? _shareNodeFinish$shar : false
|
|
1150
|
-
};
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
async updateNode(_ref15) {
|
|
1154
|
-
var _node$access3, _node$access4;
|
|
1155
|
-
|
|
1156
|
-
let {
|
|
1157
|
-
nodeId,
|
|
1158
|
-
name,
|
|
1159
|
-
isFavorite,
|
|
1160
|
-
deletedAt
|
|
1161
|
-
} = _ref15;
|
|
1162
|
-
let node = nodesCache.get(nodeId);
|
|
1163
|
-
|
|
1164
|
-
if (!node) {
|
|
1165
|
-
await this.node({
|
|
1166
|
-
id: nodeId
|
|
1167
|
-
});
|
|
1168
|
-
node = nodesCache.get(nodeId);
|
|
1169
|
-
|
|
1170
|
-
if (!node) {
|
|
1171
|
-
throw "Can't find Node " + nodeId;
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
|
|
1175
|
-
if (!((_node$access3 = node.access) != null && _node$access3.nameKey)) {
|
|
1176
|
-
throw new Error("Can't have access to node " + nodeId);
|
|
1177
|
-
}
|
|
1178
|
-
|
|
1179
|
-
name = name ? (_node$access4 = node.access) != null && _node$access4.nameKey ? await encryptName(name, node.access.nameKey) : name : null;
|
|
1180
|
-
const {
|
|
1181
|
-
updateNode
|
|
1182
|
-
} = await this.client("mutation")({
|
|
1183
|
-
updateNode: [{
|
|
1184
|
-
nodeId,
|
|
1185
|
-
name,
|
|
1186
|
-
isFavorite,
|
|
1187
|
-
deletedAt
|
|
1188
|
-
}, {
|
|
1189
|
-
"...on ErrorAccessDenied": {
|
|
1190
|
-
__typename: true,
|
|
1191
|
-
message: true
|
|
1192
|
-
},
|
|
1193
|
-
"...on ErrorNotExist": {
|
|
1194
|
-
__typename: true,
|
|
1195
|
-
message: true
|
|
1196
|
-
},
|
|
1197
|
-
"...on UpdateNodeResponse": {
|
|
1198
|
-
__typename: true,
|
|
1199
|
-
updateNode: nodeFullSelector
|
|
1200
|
-
}
|
|
1201
|
-
}]
|
|
1202
|
-
});
|
|
1203
|
-
|
|
1204
|
-
if (!updateNode) {
|
|
1205
|
-
return null;
|
|
1206
|
-
}
|
|
1207
|
-
|
|
1208
|
-
if (updateNode.__typename === "ErrorAccessDenied") {
|
|
1209
|
-
return updateNode;
|
|
1210
|
-
}
|
|
1211
|
-
|
|
1212
|
-
if (updateNode.__typename === "ErrorNotExist") {
|
|
1213
|
-
return updateNode;
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
if (!updateNode.updateNode) {
|
|
1217
|
-
return null;
|
|
1218
|
-
}
|
|
1219
|
-
|
|
1220
|
-
const result = await gqlNodeToExternalNodeFull(updateNode.updateNode, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
1221
|
-
return {
|
|
1222
|
-
__typename: "SuccessResponse",
|
|
1223
|
-
data: result
|
|
1224
|
-
};
|
|
1225
|
-
}
|
|
1226
|
-
|
|
1227
|
-
async deletedMails(_ref16) {
|
|
1228
|
-
let {
|
|
1229
|
-
mailType
|
|
1230
|
-
} = _ref16;
|
|
1231
|
-
const {
|
|
1232
|
-
deletedMails
|
|
1233
|
-
} = await this.client("query", {
|
|
1234
|
-
scalars: {
|
|
1235
|
-
DateTime: {
|
|
1236
|
-
decode: e => new Date(e),
|
|
1237
|
-
encode: e => e.toISOString()
|
|
1238
|
-
}
|
|
1239
|
-
}
|
|
1240
|
-
})({
|
|
1241
|
-
deletedMails: [{
|
|
1242
|
-
mailType
|
|
1243
|
-
}, {
|
|
1244
|
-
"...on ErrorAccessDenied": {
|
|
1245
|
-
__typename: true,
|
|
1246
|
-
message: true
|
|
1247
|
-
},
|
|
1248
|
-
"...on DeletedMailsResponse": {
|
|
1249
|
-
__typename: true,
|
|
1250
|
-
deletedMails: mailSelector
|
|
1251
|
-
}
|
|
1252
|
-
}]
|
|
1253
|
-
});
|
|
1254
|
-
|
|
1255
|
-
if (!deletedMails) {
|
|
1256
|
-
return null;
|
|
1257
|
-
}
|
|
1258
|
-
|
|
1259
|
-
if (deletedMails.__typename === "ErrorAccessDenied") {
|
|
1260
|
-
return deletedMails;
|
|
1261
|
-
}
|
|
1262
|
-
|
|
1263
|
-
const mails = new Array();
|
|
1264
|
-
|
|
1265
|
-
for (const m of deletedMails.deletedMails) {
|
|
1266
|
-
const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
1267
|
-
|
|
1268
|
-
if (mail) {
|
|
1269
|
-
mails.push(mail);
|
|
1270
|
-
}
|
|
1271
|
-
}
|
|
1272
|
-
|
|
1273
|
-
return {
|
|
1274
|
-
__typename: "SuccessResponse",
|
|
1275
|
-
data: mails
|
|
1276
|
-
};
|
|
1277
|
-
}
|
|
1278
|
-
|
|
1279
|
-
async updateAppNotifications(notifications) {
|
|
1280
|
-
const {
|
|
1281
|
-
updateAppNotifications
|
|
1282
|
-
} = await this.client("mutation", {
|
|
1283
|
-
scalars: {
|
|
1284
|
-
DateTime: {
|
|
1285
|
-
decode: e => new Date(e),
|
|
1286
|
-
encode: e => e.toISOString()
|
|
1287
|
-
}
|
|
1288
|
-
}
|
|
1289
|
-
})({
|
|
1290
|
-
updateAppNotifications: [notifications, {
|
|
1291
|
-
"...on ErrorAccessDenied": {
|
|
1292
|
-
__typename: true,
|
|
1293
|
-
message: true
|
|
1294
|
-
},
|
|
1295
|
-
"...on UpdateAppNotificationsResponse": {
|
|
1296
|
-
__typename: true,
|
|
1297
|
-
updateAppNotifications: {
|
|
1298
|
-
enableAll: true,
|
|
1299
|
-
mail: true,
|
|
1300
|
-
cloud: true,
|
|
1301
|
-
disableAllUntil: true
|
|
1302
|
-
}
|
|
1303
|
-
}
|
|
1304
|
-
}]
|
|
1305
|
-
});
|
|
1306
|
-
|
|
1307
|
-
if (!updateAppNotifications) {
|
|
1308
|
-
return null;
|
|
1309
|
-
}
|
|
1310
|
-
|
|
1311
|
-
if (updateAppNotifications.__typename === "ErrorAccessDenied") {
|
|
1312
|
-
return updateAppNotifications;
|
|
1313
|
-
}
|
|
1314
|
-
|
|
1315
|
-
if (!updateAppNotifications.updateAppNotifications) {
|
|
1316
|
-
return null;
|
|
1317
|
-
}
|
|
1318
|
-
|
|
1319
|
-
return {
|
|
1320
|
-
__typename: "SuccessResponse",
|
|
1321
|
-
data: updateAppNotifications.updateAppNotifications
|
|
1322
|
-
};
|
|
1323
|
-
}
|
|
1324
|
-
|
|
1325
|
-
async appNotifications() {
|
|
1326
|
-
const {
|
|
1327
|
-
appNotifications
|
|
1328
|
-
} = await this.client("query", {
|
|
1329
|
-
scalars: {
|
|
1330
|
-
DateTime: {
|
|
1331
|
-
decode: e => new Date(e),
|
|
1332
|
-
encode: e => e.toISOString()
|
|
1333
|
-
}
|
|
1334
|
-
}
|
|
1335
|
-
})({
|
|
1336
|
-
appNotifications: {
|
|
1337
|
-
"...on ErrorAccessDenied": {
|
|
1338
|
-
__typename: true,
|
|
1339
|
-
message: true
|
|
1340
|
-
},
|
|
1341
|
-
"...on ErrorNotFound": {
|
|
1342
|
-
__typename: true,
|
|
1343
|
-
message: true
|
|
1344
|
-
},
|
|
1345
|
-
"...on UserAppNotifications": {
|
|
1346
|
-
__typename: true,
|
|
1347
|
-
enableAll: true,
|
|
1348
|
-
mail: true,
|
|
1349
|
-
cloud: true,
|
|
1350
|
-
disableAllUntil: true
|
|
1351
|
-
}
|
|
1352
|
-
}
|
|
1353
|
-
});
|
|
1354
|
-
|
|
1355
|
-
if (!appNotifications) {
|
|
1356
|
-
return null;
|
|
1357
|
-
}
|
|
1358
|
-
|
|
1359
|
-
if (appNotifications.__typename === "ErrorAccessDenied") {
|
|
1360
|
-
return appNotifications;
|
|
1361
|
-
}
|
|
1362
|
-
|
|
1363
|
-
if (appNotifications.__typename === "ErrorNotFound") {
|
|
1364
|
-
return appNotifications;
|
|
1365
|
-
}
|
|
1366
|
-
|
|
1367
|
-
return {
|
|
1368
|
-
__typename: "SuccessResponse",
|
|
1369
|
-
data: appNotifications
|
|
1370
|
-
};
|
|
1371
|
-
}
|
|
1372
|
-
|
|
1373
|
-
async createMail(data, customMessage) {
|
|
1374
|
-
const mail = await this.createDraftMail(data);
|
|
1375
|
-
|
|
1376
|
-
if (!mail) {
|
|
1377
|
-
return {
|
|
1378
|
-
__typename: "SuccessResponse",
|
|
1379
|
-
data: false
|
|
1380
|
-
};
|
|
1381
|
-
}
|
|
1382
|
-
|
|
1383
|
-
if (mail.__typename === "ErrorBasic") {
|
|
1384
|
-
return mail;
|
|
1385
|
-
}
|
|
1386
|
-
|
|
1387
|
-
if (mail.__typename === "ErrorAccessDenied") {
|
|
1388
|
-
return mail;
|
|
1389
|
-
}
|
|
1390
|
-
|
|
1391
|
-
const result = await this.sendDraftMail(mail.data.mailIntegrityId, customMessage);
|
|
1392
|
-
|
|
1393
|
-
if (!result) {
|
|
1394
|
-
return null;
|
|
1395
|
-
}
|
|
1396
|
-
|
|
1397
|
-
if (result.__typename === "ErrorAccessDenied") {
|
|
1398
|
-
return result;
|
|
1399
|
-
}
|
|
1400
|
-
|
|
1401
|
-
if (result.__typename === "ErrorBasic") {
|
|
1402
|
-
return result;
|
|
1403
|
-
}
|
|
1404
|
-
|
|
1405
|
-
return {
|
|
1406
|
-
__typename: "SuccessResponse",
|
|
1407
|
-
data: result.data
|
|
1408
|
-
};
|
|
1409
|
-
}
|
|
1410
|
-
|
|
1411
|
-
async waitingReceivedMails() {
|
|
1412
|
-
const {
|
|
1413
|
-
user
|
|
1414
|
-
} = await this.client("query")({
|
|
1415
|
-
user: [{}, {
|
|
1416
|
-
"...on ErrorNotFound": {
|
|
1417
|
-
__typename: true,
|
|
1418
|
-
message: true
|
|
1419
|
-
},
|
|
1420
|
-
"...on UserResponse": {
|
|
1421
|
-
__typename: true,
|
|
1422
|
-
user: {
|
|
1423
|
-
waitingReceivedMails: {
|
|
1424
|
-
date: true,
|
|
1425
|
-
attachmentsCount: true,
|
|
1426
|
-
sender: {
|
|
1427
|
-
id: true,
|
|
1428
|
-
firstname: true,
|
|
1429
|
-
lastname: true,
|
|
1430
|
-
email: true,
|
|
1431
|
-
publicKey: true
|
|
1432
|
-
},
|
|
1433
|
-
recipients: {
|
|
1434
|
-
id: true,
|
|
1435
|
-
firstname: true,
|
|
1436
|
-
lastname: true,
|
|
1437
|
-
email: true,
|
|
1438
|
-
publicKey: true
|
|
1439
|
-
},
|
|
1440
|
-
temporaryRecipients: {
|
|
1441
|
-
email: true
|
|
1442
|
-
}
|
|
1443
|
-
}
|
|
1444
|
-
}
|
|
1445
|
-
}
|
|
1446
|
-
}]
|
|
1447
|
-
});
|
|
1448
|
-
|
|
1449
|
-
if (!user) {
|
|
1450
|
-
return null;
|
|
1451
|
-
}
|
|
1452
|
-
|
|
1453
|
-
if (user.__typename === "ErrorNotFound") {
|
|
1454
|
-
return user;
|
|
1455
|
-
}
|
|
1456
|
-
|
|
1457
|
-
if (!user.user) {
|
|
1458
|
-
return null;
|
|
1459
|
-
}
|
|
1460
|
-
|
|
1461
|
-
const result = user.user.waitingReceivedMails.map(m => _objectSpread(_objectSpread({
|
|
1462
|
-
id: generate()
|
|
1463
|
-
}, m), {}, {
|
|
1464
|
-
date: new Date(m.date)
|
|
1465
|
-
}));
|
|
1466
|
-
return {
|
|
1467
|
-
__typename: "SuccessResponse",
|
|
1468
|
-
data: result
|
|
1469
|
-
};
|
|
1470
|
-
}
|
|
1471
|
-
|
|
1472
|
-
async updateDraftMail(draftId, _ref17) {
|
|
1473
|
-
let {
|
|
1474
|
-
body,
|
|
1475
|
-
subject,
|
|
1476
|
-
files,
|
|
1477
|
-
recipientsIds,
|
|
1478
|
-
replyTo
|
|
1479
|
-
} = _ref17;
|
|
1480
|
-
const drafts = await this.draftMails();
|
|
1481
|
-
|
|
1482
|
-
if (!drafts) {
|
|
1483
|
-
return null;
|
|
1484
|
-
}
|
|
1485
|
-
|
|
1486
|
-
if (drafts.__typename !== "SuccessResponse") {
|
|
1487
|
-
return drafts;
|
|
1488
|
-
}
|
|
1489
|
-
|
|
1490
|
-
const draft = drafts.data.find(d => d.mailIntegrityId === draftId);
|
|
1491
|
-
|
|
1492
|
-
if (!draft) {
|
|
1493
|
-
throw new Error("Invalid draft " + draftId);
|
|
1494
|
-
}
|
|
1495
|
-
|
|
1496
|
-
let hashKey = null;
|
|
1497
|
-
let hash = null;
|
|
1498
|
-
|
|
1499
|
-
if (body || subject) {
|
|
1500
|
-
hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
|
|
1501
|
-
hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
|
|
1502
|
-
body,
|
|
1503
|
-
subject
|
|
1504
|
-
}), hashKey, "hex");
|
|
1505
|
-
}
|
|
1506
|
-
|
|
1507
|
-
const senderFiles = new Array();
|
|
1508
|
-
|
|
1509
|
-
if (files) {
|
|
1510
|
-
for (const f of files) {
|
|
1511
|
-
let file = filesCache.get(f.id);
|
|
1512
|
-
|
|
1513
|
-
if (!file) {
|
|
1514
|
-
await this.file({
|
|
1515
|
-
id: f.id
|
|
1516
|
-
});
|
|
1517
|
-
file = filesCache.get(f.id);
|
|
1518
|
-
|
|
1519
|
-
if (!file) {
|
|
1520
|
-
throw new Error("File " + f.name + " (" + f.id + ") does not exists");
|
|
1521
|
-
}
|
|
1522
|
-
}
|
|
1523
|
-
|
|
1524
|
-
senderFiles.push({
|
|
1525
|
-
id: file.id,
|
|
1526
|
-
fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
1527
|
-
name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
|
|
1528
|
-
});
|
|
1529
|
-
}
|
|
1530
|
-
}
|
|
1531
|
-
|
|
1532
|
-
const {
|
|
1533
|
-
updateDraftMail
|
|
1534
|
-
} = await this.client("mutation", {
|
|
1535
|
-
scalars: {
|
|
1536
|
-
Json: {
|
|
1537
|
-
encode: e => JSON.stringify(e),
|
|
1538
|
-
decode: e => JSON.parse(e)
|
|
1539
|
-
},
|
|
1540
|
-
DateTime: {
|
|
1541
|
-
decode: e => new Date(e),
|
|
1542
|
-
encode: e => e.toISOString()
|
|
1543
|
-
},
|
|
1544
|
-
BigInt: {
|
|
1545
|
-
decode: e => BigInt(e),
|
|
1546
|
-
encode: e => e.toString()
|
|
1547
|
-
}
|
|
1548
|
-
}
|
|
1549
|
-
})({
|
|
1550
|
-
updateDraftMail: [{
|
|
1551
|
-
draftId,
|
|
1552
|
-
recipients: recipientsIds,
|
|
1553
|
-
replyTo,
|
|
1554
|
-
body: body ? sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
|
|
1555
|
-
subject: subject ? sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
|
|
1556
|
-
senderFiles,
|
|
1557
|
-
hash,
|
|
1558
|
-
hashKey
|
|
1559
|
-
}, {
|
|
1560
|
-
"...on ErrorAccessDenied": {
|
|
1561
|
-
__typename: true,
|
|
1562
|
-
message: true
|
|
1563
|
-
},
|
|
1564
|
-
"...on ErrorBasic": {
|
|
1565
|
-
__typename: true,
|
|
1566
|
-
message: true
|
|
1567
|
-
},
|
|
1568
|
-
"...on UpdateDraftMailResponse": {
|
|
1569
|
-
__typename: true,
|
|
1570
|
-
updateDraftMail: mailSelector
|
|
1571
|
-
}
|
|
1572
|
-
}]
|
|
1573
|
-
});
|
|
1574
|
-
|
|
1575
|
-
if (!updateDraftMail) {
|
|
1576
|
-
return null;
|
|
1577
|
-
}
|
|
1578
|
-
|
|
1579
|
-
if (updateDraftMail.__typename === "ErrorAccessDenied") {
|
|
1580
|
-
return updateDraftMail;
|
|
1581
|
-
}
|
|
1582
|
-
|
|
1583
|
-
if (updateDraftMail.__typename === "ErrorBasic") {
|
|
1584
|
-
return updateDraftMail;
|
|
1585
|
-
}
|
|
1586
|
-
|
|
1587
|
-
if (!updateDraftMail.updateDraftMail) {
|
|
1588
|
-
return null;
|
|
1589
|
-
}
|
|
1590
|
-
|
|
1591
|
-
const result = convertInternalMailToExternal(updateDraftMail.updateDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
1592
|
-
return {
|
|
1593
|
-
__typename: "SuccessResponse",
|
|
1594
|
-
data: result
|
|
1595
|
-
};
|
|
1596
|
-
}
|
|
1597
|
-
|
|
1598
|
-
async deleteDraftMail(draftId) {
|
|
1599
|
-
var _deleteDraftMail$dele;
|
|
1600
|
-
|
|
1601
|
-
const {
|
|
1602
|
-
deleteDraftMail
|
|
1603
|
-
} = await this.client("mutation")({
|
|
1604
|
-
deleteDraftMail: [{
|
|
1605
|
-
draftId
|
|
1606
|
-
}, {
|
|
1607
|
-
"...on ErrorAccessDenied": {
|
|
1608
|
-
__typename: true,
|
|
1609
|
-
message: true
|
|
1610
|
-
},
|
|
1611
|
-
"...on DeleteDraftMailResponse": {
|
|
1612
|
-
__typename: true,
|
|
1613
|
-
deleteDraftMail: true
|
|
1614
|
-
}
|
|
1615
|
-
}]
|
|
1616
|
-
});
|
|
1617
|
-
|
|
1618
|
-
if (!deleteDraftMail) {
|
|
1619
|
-
return null;
|
|
1620
|
-
}
|
|
1621
|
-
|
|
1622
|
-
if (deleteDraftMail.__typename === "ErrorAccessDenied") {
|
|
1623
|
-
return deleteDraftMail;
|
|
1624
|
-
}
|
|
1625
|
-
|
|
1626
|
-
if (!deleteDraftMail.deleteDraftMail) {
|
|
1627
|
-
return null;
|
|
1628
|
-
}
|
|
1629
|
-
|
|
1630
|
-
return {
|
|
1631
|
-
__typename: "SuccessResponse",
|
|
1632
|
-
data: (_deleteDraftMail$dele = deleteDraftMail.deleteDraftMail) != null ? _deleteDraftMail$dele : false
|
|
1633
|
-
};
|
|
1634
|
-
}
|
|
1635
|
-
|
|
1636
|
-
async deleteMailTrash(_ref18) {
|
|
1637
|
-
let {
|
|
1638
|
-
ids
|
|
1639
|
-
} = _ref18;
|
|
1640
|
-
const {
|
|
1641
|
-
deleteMailTrash
|
|
1642
|
-
} = await this.client("mutation")({
|
|
1643
|
-
deleteMailTrash: [{
|
|
1644
|
-
ids
|
|
1645
|
-
}, {
|
|
1646
|
-
"...on ErrorAccessDenied": {
|
|
1647
|
-
__typename: true,
|
|
1648
|
-
message: true
|
|
1649
|
-
},
|
|
1650
|
-
"...on DeleteMailTrashResponse": {
|
|
1651
|
-
__typename: true,
|
|
1652
|
-
deleteMailTrash: true
|
|
1653
|
-
}
|
|
1654
|
-
}]
|
|
1655
|
-
});
|
|
1656
|
-
|
|
1657
|
-
if (!deleteMailTrash) {
|
|
1658
|
-
return null;
|
|
1659
|
-
}
|
|
1660
|
-
|
|
1661
|
-
if (deleteMailTrash.__typename === "ErrorAccessDenied") {
|
|
1662
|
-
return deleteMailTrash;
|
|
1663
|
-
}
|
|
1664
|
-
|
|
1665
|
-
if (!deleteMailTrash.deleteMailTrash) {
|
|
1666
|
-
return null;
|
|
1667
|
-
}
|
|
1668
|
-
|
|
1669
|
-
return {
|
|
1670
|
-
__typename: "SuccessResponse",
|
|
1671
|
-
data: deleteMailTrash.deleteMailTrash
|
|
1672
|
-
};
|
|
1673
|
-
}
|
|
1674
|
-
|
|
1675
|
-
async emptyMailTrash() {
|
|
1676
|
-
const {
|
|
1677
|
-
emptyMailTrash
|
|
1678
|
-
} = await this.client("mutation")({
|
|
1679
|
-
emptyMailTrash: {
|
|
1680
|
-
"...on ErrorAccessDenied": {
|
|
1681
|
-
__typename: true,
|
|
1682
|
-
message: true
|
|
1683
|
-
},
|
|
1684
|
-
"...on EmptyMailTrashResponse": {
|
|
1685
|
-
__typename: true,
|
|
1686
|
-
emptyMailTrash: true
|
|
1687
|
-
}
|
|
1688
|
-
}
|
|
1689
|
-
});
|
|
1690
|
-
|
|
1691
|
-
if (!emptyMailTrash) {
|
|
1692
|
-
return null;
|
|
1693
|
-
}
|
|
1694
|
-
|
|
1695
|
-
if (emptyMailTrash.__typename === "ErrorAccessDenied") {
|
|
1696
|
-
return emptyMailTrash;
|
|
1697
|
-
}
|
|
1698
|
-
|
|
1699
|
-
if (!emptyMailTrash.emptyMailTrash) {
|
|
1700
|
-
return null;
|
|
1701
|
-
}
|
|
1702
|
-
|
|
1703
|
-
return {
|
|
1704
|
-
__typename: "SuccessResponse",
|
|
1705
|
-
data: emptyMailTrash.emptyMailTrash
|
|
1706
|
-
};
|
|
1707
|
-
}
|
|
1708
|
-
|
|
1709
|
-
async emptyCloudTrash() {
|
|
1710
|
-
const {
|
|
1711
|
-
emptyCloudTrash
|
|
1712
|
-
} = await this.client("mutation")({
|
|
1713
|
-
emptyCloudTrash: {
|
|
1714
|
-
"...on ErrorAccessDenied": {
|
|
1715
|
-
__typename: true,
|
|
1716
|
-
message: true
|
|
1717
|
-
},
|
|
1718
|
-
"...on EmptyCloudTrashResponse": {
|
|
1719
|
-
__typename: true,
|
|
1720
|
-
emptyCloudTrash: true
|
|
1721
|
-
}
|
|
1722
|
-
}
|
|
1723
|
-
});
|
|
1724
|
-
|
|
1725
|
-
if (!emptyCloudTrash) {
|
|
1726
|
-
return null;
|
|
1727
|
-
}
|
|
1728
|
-
|
|
1729
|
-
if (emptyCloudTrash.__typename === "ErrorAccessDenied") {
|
|
1730
|
-
return emptyCloudTrash;
|
|
1731
|
-
}
|
|
1732
|
-
|
|
1733
|
-
if (!emptyCloudTrash.emptyCloudTrash) {
|
|
1734
|
-
return null;
|
|
1735
|
-
}
|
|
1736
|
-
|
|
1737
|
-
return {
|
|
1738
|
-
__typename: "SuccessResponse",
|
|
1739
|
-
data: emptyCloudTrash.emptyCloudTrash
|
|
1740
|
-
};
|
|
1741
|
-
}
|
|
1742
|
-
|
|
1743
|
-
async recoverNode(id) {
|
|
1744
|
-
var _recoverNode$recoverN;
|
|
1745
|
-
|
|
1746
|
-
const {
|
|
1747
|
-
recoverNode
|
|
1748
|
-
} = await this.client("mutation")({
|
|
1749
|
-
recoverNode: [{
|
|
1750
|
-
id
|
|
1751
|
-
}, {
|
|
1752
|
-
"...on ErrorAccessDenied": {
|
|
1753
|
-
__typename: true,
|
|
1754
|
-
message: true
|
|
1755
|
-
},
|
|
1756
|
-
"...on ErrorNotExist": {
|
|
1757
|
-
__typename: true,
|
|
1758
|
-
message: true
|
|
1759
|
-
},
|
|
1760
|
-
"...on RecoverNodeResponse": {
|
|
1761
|
-
__typename: true,
|
|
1762
|
-
recoverNode: true
|
|
1763
|
-
}
|
|
1764
|
-
}]
|
|
1765
|
-
});
|
|
1766
|
-
|
|
1767
|
-
if (!recoverNode) {
|
|
1768
|
-
return null;
|
|
1769
|
-
}
|
|
1770
|
-
|
|
1771
|
-
if (recoverNode.__typename === "ErrorAccessDenied") {
|
|
1772
|
-
return recoverNode;
|
|
1773
|
-
}
|
|
1774
|
-
|
|
1775
|
-
if (recoverNode.__typename === "ErrorNotExist") {
|
|
1776
|
-
return recoverNode;
|
|
1777
|
-
}
|
|
1778
|
-
|
|
1779
|
-
return {
|
|
1780
|
-
__typename: "SuccessResponse",
|
|
1781
|
-
data: (_recoverNode$recoverN = recoverNode.recoverNode) != null ? _recoverNode$recoverN : false
|
|
1782
|
-
};
|
|
1783
|
-
}
|
|
1784
|
-
|
|
1785
|
-
async recoverMail(_ref19) {
|
|
1786
|
-
let {
|
|
1787
|
-
mailId
|
|
1788
|
-
} = _ref19;
|
|
1789
|
-
const {
|
|
1790
|
-
recoverMail
|
|
1791
|
-
} = await this.client("mutation")({
|
|
1792
|
-
recoverMail: [{
|
|
1793
|
-
mailId
|
|
1794
|
-
}, {
|
|
1795
|
-
"...on ErrorAccessDenied": {
|
|
1796
|
-
__typename: true,
|
|
1797
|
-
message: true
|
|
1798
|
-
},
|
|
1799
|
-
"...on ErrorBasic": {
|
|
1800
|
-
__typename: true,
|
|
1801
|
-
message: true
|
|
1802
|
-
},
|
|
1803
|
-
"...on RecoverMailResponse": {
|
|
1804
|
-
__typename: true,
|
|
1805
|
-
recoverMail: true
|
|
1806
|
-
}
|
|
1807
|
-
}]
|
|
1808
|
-
});
|
|
1809
|
-
|
|
1810
|
-
if (!recoverMail) {
|
|
1811
|
-
return null;
|
|
1812
|
-
}
|
|
1813
|
-
|
|
1814
|
-
if (recoverMail.__typename === "ErrorAccessDenied") {
|
|
1815
|
-
return recoverMail;
|
|
1816
|
-
}
|
|
1817
|
-
|
|
1818
|
-
if (recoverMail.__typename === "ErrorBasic") {
|
|
1819
|
-
return recoverMail;
|
|
1820
|
-
}
|
|
1821
|
-
|
|
1822
|
-
return {
|
|
1823
|
-
__typename: "SuccessResponse",
|
|
1824
|
-
data: recoverMail.recoverMail
|
|
1825
|
-
};
|
|
1826
|
-
}
|
|
1827
|
-
|
|
1828
|
-
async deleteFile(_ref20) {
|
|
1829
|
-
let {
|
|
1830
|
-
fileId,
|
|
1831
|
-
nodeId
|
|
1832
|
-
} = _ref20;
|
|
1833
|
-
const {
|
|
1834
|
-
deleteFile
|
|
1835
|
-
} = await this.client("mutation")({
|
|
1836
|
-
deleteFile: [{
|
|
1837
|
-
fileId,
|
|
1838
|
-
nodeId
|
|
1839
|
-
}, {
|
|
1840
|
-
"...on ErrorAccessDenied": {
|
|
1841
|
-
__typename: true,
|
|
1842
|
-
message: true
|
|
1843
|
-
},
|
|
1844
|
-
"...on ErrorNotExist": {
|
|
1845
|
-
__typename: true,
|
|
1846
|
-
message: true
|
|
1847
|
-
},
|
|
1848
|
-
"...on DeleteFileResponse": {
|
|
1849
|
-
__typename: true,
|
|
1850
|
-
deleteFile: true
|
|
1851
|
-
}
|
|
1852
|
-
}]
|
|
1853
|
-
});
|
|
1854
|
-
|
|
1855
|
-
if (!deleteFile) {
|
|
1856
|
-
return null;
|
|
1857
|
-
}
|
|
1858
|
-
|
|
1859
|
-
if (deleteFile.__typename === "ErrorAccessDenied") {
|
|
1860
|
-
return deleteFile;
|
|
1861
|
-
}
|
|
1862
|
-
|
|
1863
|
-
if (deleteFile.__typename === "ErrorNotExist") {
|
|
1864
|
-
return deleteFile;
|
|
1865
|
-
}
|
|
1866
|
-
|
|
1867
|
-
return {
|
|
1868
|
-
__typename: "SuccessResponse",
|
|
1869
|
-
data: deleteFile.deleteFile
|
|
1870
|
-
};
|
|
1871
|
-
}
|
|
1872
|
-
|
|
1873
|
-
async deleteNode(_ref21) {
|
|
1874
|
-
let {
|
|
1875
|
-
nodeId
|
|
1876
|
-
} = _ref21;
|
|
1877
|
-
const {
|
|
1878
|
-
deleteNode
|
|
1879
|
-
} = await this.client("mutation")({
|
|
1880
|
-
deleteNode: [{
|
|
1881
|
-
id: nodeId
|
|
1882
|
-
}, {
|
|
1883
|
-
"...on ErrorAccessDenied": {
|
|
1884
|
-
__typename: true,
|
|
1885
|
-
message: true
|
|
1886
|
-
},
|
|
1887
|
-
"...on DeleteNodeResponse": {
|
|
1888
|
-
__typename: true,
|
|
1889
|
-
deleteNode: true
|
|
1890
|
-
}
|
|
1891
|
-
}]
|
|
1892
|
-
});
|
|
1893
|
-
|
|
1894
|
-
if (!deleteNode) {
|
|
1895
|
-
return null;
|
|
1896
|
-
}
|
|
1897
|
-
|
|
1898
|
-
if (deleteNode.__typename === "ErrorAccessDenied") {
|
|
1899
|
-
return deleteNode;
|
|
1900
|
-
}
|
|
1901
|
-
|
|
1902
|
-
return {
|
|
1903
|
-
__typename: "SuccessResponse",
|
|
1904
|
-
data: deleteNode.deleteNode
|
|
1905
|
-
};
|
|
1906
|
-
}
|
|
1907
|
-
|
|
1908
|
-
async moveNodes(_ref22) {
|
|
1909
|
-
var _moveNodes$moveNodes;
|
|
1910
|
-
|
|
1911
|
-
let {
|
|
1912
|
-
nodeIds,
|
|
1913
|
-
parentNodeId
|
|
1914
|
-
} = _ref22;
|
|
1915
|
-
const {
|
|
1916
|
-
moveNodes
|
|
1917
|
-
} = await this.client("mutation")({
|
|
1918
|
-
moveNodes: [{
|
|
1919
|
-
nodeIds,
|
|
1920
|
-
parentNodeId
|
|
1921
|
-
}, {
|
|
1922
|
-
"...on ErrorAccessDenied": {
|
|
1923
|
-
__typename: true,
|
|
1924
|
-
message: true
|
|
1925
|
-
},
|
|
1926
|
-
"...on MoveNodesResponse": {
|
|
1927
|
-
__typename: true,
|
|
1928
|
-
moveNodes: true
|
|
1929
|
-
}
|
|
1930
|
-
}]
|
|
1931
|
-
});
|
|
1932
|
-
|
|
1933
|
-
if (!moveNodes) {
|
|
1934
|
-
return null;
|
|
1935
|
-
}
|
|
1936
|
-
|
|
1937
|
-
if (moveNodes.__typename === "ErrorAccessDenied") {
|
|
1938
|
-
return moveNodes;
|
|
1939
|
-
}
|
|
1940
|
-
|
|
1941
|
-
return {
|
|
1942
|
-
__typename: "SuccessResponse",
|
|
1943
|
-
data: (_moveNodes$moveNodes = moveNodes.moveNodes) != null ? _moveNodes$moveNodes : false
|
|
1944
|
-
};
|
|
1945
|
-
}
|
|
1946
|
-
|
|
1947
|
-
async deleteMail(_ref23) {
|
|
1948
|
-
let {
|
|
1949
|
-
mailId
|
|
1950
|
-
} = _ref23;
|
|
1951
|
-
const {
|
|
1952
|
-
deleteMail
|
|
1953
|
-
} = await this.client("mutation")({
|
|
1954
|
-
deleteMail: [{
|
|
1955
|
-
mailId
|
|
1956
|
-
}, {
|
|
1957
|
-
"...on ErrorAccessDenied": {
|
|
1958
|
-
__typename: true,
|
|
1959
|
-
message: true
|
|
1960
|
-
},
|
|
1961
|
-
"...on DeleteMailResponse": {
|
|
1962
|
-
__typename: true,
|
|
1963
|
-
deleteMail: true
|
|
1964
|
-
}
|
|
1965
|
-
}]
|
|
1966
|
-
});
|
|
1967
|
-
|
|
1968
|
-
if (!deleteMail) {
|
|
1969
|
-
return null;
|
|
1970
|
-
}
|
|
1971
|
-
|
|
1972
|
-
if (deleteMail.__typename === "ErrorAccessDenied") {
|
|
1973
|
-
return deleteMail;
|
|
1974
|
-
}
|
|
1975
|
-
|
|
1976
|
-
return {
|
|
1977
|
-
__typename: "SuccessResponse",
|
|
1978
|
-
data: deleteMail.deleteMail
|
|
1979
|
-
};
|
|
1980
|
-
}
|
|
1981
|
-
|
|
1982
|
-
async saveInCloud(_ref24) {
|
|
1983
|
-
var _node$parent;
|
|
1984
|
-
|
|
1985
|
-
let {
|
|
1986
|
-
fileId,
|
|
1987
|
-
name,
|
|
1988
|
-
nodeId
|
|
1989
|
-
} = _ref24;
|
|
1990
|
-
|
|
1991
|
-
if (nodeId && !nodesCache.has(nodeId)) {
|
|
1992
|
-
await this.node({
|
|
1993
|
-
id: nodeId
|
|
1994
|
-
});
|
|
1995
|
-
|
|
1996
|
-
if (!nodesCache.has(nodeId)) {
|
|
1997
|
-
return {
|
|
1998
|
-
__typename: "ErrorBasic",
|
|
1999
|
-
message: "The node " + nodeId + " does not exists"
|
|
2000
|
-
};
|
|
2001
|
-
}
|
|
2002
|
-
}
|
|
2003
|
-
|
|
2004
|
-
let key = "";
|
|
2005
|
-
const file = filesCache.get(fileId);
|
|
2006
|
-
|
|
2007
|
-
if (!file) {
|
|
2008
|
-
var _filesCache$get;
|
|
2009
|
-
|
|
2010
|
-
await this.file({
|
|
2011
|
-
id: fileId
|
|
2012
|
-
});
|
|
2013
|
-
const file = (_filesCache$get = filesCache.get(fileId)) != null ? _filesCache$get : null;
|
|
2014
|
-
|
|
2015
|
-
if (!file) {
|
|
2016
|
-
const receivedMails = await this.receivedMails();
|
|
2017
|
-
|
|
2018
|
-
if (!receivedMails) {
|
|
2019
|
-
return null;
|
|
2020
|
-
}
|
|
2021
|
-
|
|
2022
|
-
if (receivedMails.__typename !== "SuccessResponse") {
|
|
2023
|
-
return null;
|
|
2024
|
-
}
|
|
2025
|
-
|
|
2026
|
-
const mail = receivedMails.data.find(m => m.files.some(f => f.id === fileId));
|
|
2027
|
-
|
|
2028
|
-
if (!mail) {
|
|
2029
|
-
return {
|
|
2030
|
-
__typename: "ErrorBasic",
|
|
2031
|
-
message: "Can't find mail with the file " + fileId
|
|
2032
|
-
};
|
|
2033
|
-
}
|
|
2034
|
-
|
|
2035
|
-
const fileMail = mail.files.find(f => f.id === fileId);
|
|
2036
|
-
|
|
2037
|
-
if (!fileMail) {
|
|
2038
|
-
return {
|
|
2039
|
-
__typename: "ErrorBasic",
|
|
2040
|
-
message: "Can't find mail with the file " + fileId
|
|
2041
|
-
};
|
|
2042
|
-
}
|
|
2043
|
-
|
|
2044
|
-
const fileKey = decryptCryptoBox(sodium.from_hex(fileMail.key), mail.sender.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
|
|
2045
|
-
key = sodium.to_hex(fileKey);
|
|
2046
|
-
} else {
|
|
2047
|
-
key = file.key;
|
|
2048
|
-
}
|
|
2049
|
-
} else {
|
|
2050
|
-
key = file.key;
|
|
2051
|
-
}
|
|
2052
|
-
|
|
2053
|
-
if (key === "") {
|
|
2054
|
-
return {
|
|
2055
|
-
__typename: "ErrorBasic",
|
|
2056
|
-
message: "Unexpected error 3"
|
|
2057
|
-
};
|
|
2058
|
-
}
|
|
2059
|
-
|
|
2060
|
-
key = sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
|
|
2061
|
-
const nameKey = secretstreamKeygen();
|
|
2062
|
-
const encryptedName = await encryptName(name, sodium.to_hex(nameKey));
|
|
2063
|
-
const encryptedNameKey = sodium.to_hex(encryptCryptoBox(nameKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
|
|
2064
|
-
const {
|
|
2065
|
-
saveInCloud
|
|
2066
|
-
} = await this.client("mutation")({
|
|
2067
|
-
saveInCloud: [{
|
|
2068
|
-
fileId,
|
|
2069
|
-
key,
|
|
2070
|
-
nodeId,
|
|
2071
|
-
filename: encryptedName,
|
|
2072
|
-
nameKey: encryptedNameKey
|
|
2073
|
-
}, {
|
|
2074
|
-
"...on ErrorAccessDenied": {
|
|
2075
|
-
__typename: true,
|
|
2076
|
-
message: true
|
|
2077
|
-
},
|
|
2078
|
-
"...on ErrorNotFound": {
|
|
2079
|
-
__typename: true,
|
|
2080
|
-
message: true
|
|
2081
|
-
},
|
|
2082
|
-
"...on ErrorLimit": {
|
|
2083
|
-
__typename: true,
|
|
2084
|
-
message: true
|
|
2085
|
-
},
|
|
2086
|
-
"...on ErrorBasic": {
|
|
2087
|
-
__typename: true,
|
|
2088
|
-
message: true
|
|
2089
|
-
},
|
|
2090
|
-
"...on ErrorNotExist": {
|
|
2091
|
-
__typename: true,
|
|
2092
|
-
message: true
|
|
2093
|
-
},
|
|
2094
|
-
"...on SaveInCloudResponse": {
|
|
2095
|
-
__typename: true,
|
|
2096
|
-
saveInCloud: nodeFullSelector
|
|
2097
|
-
}
|
|
2098
|
-
}]
|
|
2099
|
-
});
|
|
2100
|
-
|
|
2101
|
-
if (!saveInCloud) {
|
|
2102
|
-
return null;
|
|
2103
|
-
}
|
|
2104
|
-
|
|
2105
|
-
if (saveInCloud.__typename === "ErrorAccessDenied") {
|
|
2106
|
-
return saveInCloud;
|
|
2107
|
-
}
|
|
2108
|
-
|
|
2109
|
-
if (saveInCloud.__typename === "ErrorNotFound") {
|
|
2110
|
-
return saveInCloud;
|
|
2111
|
-
}
|
|
2112
|
-
|
|
2113
|
-
if (saveInCloud.__typename === "ErrorLimit") {
|
|
2114
|
-
return saveInCloud;
|
|
2115
|
-
}
|
|
2116
|
-
|
|
2117
|
-
if (saveInCloud.__typename === "ErrorBasic") {
|
|
2118
|
-
return saveInCloud;
|
|
2119
|
-
}
|
|
2120
|
-
|
|
2121
|
-
if (saveInCloud.__typename === "ErrorNotExist") {
|
|
2122
|
-
return saveInCloud;
|
|
2123
|
-
}
|
|
2124
|
-
|
|
2125
|
-
if (!saveInCloud.saveInCloud) {
|
|
2126
|
-
return null;
|
|
2127
|
-
}
|
|
2128
|
-
|
|
2129
|
-
const node = await gqlNodeToExternalNodeFull(saveInCloud.saveInCloud, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
2130
|
-
const me = (_node$parent = node.parent) == null ? void 0 : _node$parent.users.find(_ref25 => {
|
|
2131
|
-
let [u] = _ref25;
|
|
2132
|
-
return u.publicKey === _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
2133
|
-
});
|
|
2134
|
-
|
|
2135
|
-
if (me && ["admin", "write"].includes(me[1])) {
|
|
2136
|
-
var _node$parent$users$fi, _node$parent2;
|
|
2137
|
-
|
|
2138
|
-
const others = (_node$parent$users$fi = (_node$parent2 = node.parent) == null ? void 0 : _node$parent2.users.filter(_ref26 => {
|
|
2139
|
-
let [u] = _ref26;
|
|
2140
|
-
return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
|
|
2141
|
-
})) != null ? _node$parent$users$fi : [];
|
|
2142
|
-
await Promise.all(others.map(_ref27 => {
|
|
2143
|
-
let [u, rights] = _ref27;
|
|
2144
|
-
return this.shareNode({
|
|
2145
|
-
nodeId: node.id,
|
|
2146
|
-
rights,
|
|
2147
|
-
userId: u.id
|
|
2148
|
-
});
|
|
2149
|
-
}));
|
|
2150
|
-
}
|
|
2151
|
-
|
|
2152
|
-
return {
|
|
2153
|
-
__typename: "SuccessResponse",
|
|
2154
|
-
data: node
|
|
2155
|
-
};
|
|
2156
|
-
}
|
|
2157
|
-
|
|
2158
|
-
async dbGet(_ref28) {
|
|
2159
|
-
let {
|
|
2160
|
-
field,
|
|
2161
|
-
userId
|
|
2162
|
-
} = _ref28;
|
|
2163
|
-
const {
|
|
2164
|
-
dbGet
|
|
2165
|
-
} = await this.client("query")({
|
|
2166
|
-
dbGet: [{
|
|
2167
|
-
field,
|
|
2168
|
-
userId
|
|
2169
|
-
}, {
|
|
2170
|
-
"...on ErrorAccessDenied": {
|
|
2171
|
-
__typename: true,
|
|
2172
|
-
message: true
|
|
2173
|
-
},
|
|
2174
|
-
"...on ErrorNotExist": {
|
|
2175
|
-
__typename: true,
|
|
2176
|
-
message: true
|
|
2177
|
-
},
|
|
2178
|
-
"...on ErrorNotFound": {
|
|
2179
|
-
__typename: true,
|
|
2180
|
-
message: true
|
|
2181
|
-
},
|
|
2182
|
-
"...on DbGetResponse": {
|
|
2183
|
-
__typename: true,
|
|
2184
|
-
json: true
|
|
2185
|
-
}
|
|
2186
|
-
}]
|
|
2187
|
-
});
|
|
2188
|
-
|
|
2189
|
-
if (!dbGet) {
|
|
2190
|
-
return null;
|
|
2191
|
-
}
|
|
2192
|
-
|
|
2193
|
-
if (dbGet.__typename === "ErrorAccessDenied") {
|
|
2194
|
-
return dbGet;
|
|
2195
|
-
}
|
|
2196
|
-
|
|
2197
|
-
if (dbGet.__typename === "ErrorNotExist") {
|
|
2198
|
-
return dbGet;
|
|
2199
|
-
}
|
|
2200
|
-
|
|
2201
|
-
if (dbGet.__typename === "ErrorNotFound") {
|
|
2202
|
-
return dbGet;
|
|
2203
|
-
}
|
|
2204
|
-
|
|
2205
|
-
return {
|
|
2206
|
-
__typename: "SuccessResponse",
|
|
2207
|
-
data: dbGet.json.res
|
|
2208
|
-
};
|
|
2209
|
-
}
|
|
2210
|
-
|
|
2211
|
-
async dbSet(_ref29) {
|
|
2212
|
-
let {
|
|
2213
|
-
value,
|
|
2214
|
-
userId
|
|
2215
|
-
} = _ref29;
|
|
2216
|
-
|
|
2217
|
-
if (typeof value !== "object") {
|
|
2218
|
-
throw new Error("value should be an object including fields you want to update.");
|
|
2219
|
-
}
|
|
2220
|
-
|
|
2221
|
-
const {
|
|
2222
|
-
dbSet
|
|
2223
|
-
} = await this.client("mutation")({
|
|
2224
|
-
dbSet: [{
|
|
2225
|
-
userId,
|
|
2226
|
-
value: serialize(value).toString("base64")
|
|
2227
|
-
}, {
|
|
2228
|
-
"...on ErrorAccessDenied": {
|
|
2229
|
-
__typename: true,
|
|
2230
|
-
message: true
|
|
2231
|
-
},
|
|
2232
|
-
"...on ErrorNotFound": {
|
|
2233
|
-
__typename: true,
|
|
2234
|
-
message: true
|
|
2235
|
-
},
|
|
2236
|
-
"...on DbSetResponse": {
|
|
2237
|
-
__typename: true,
|
|
2238
|
-
dbSet: true
|
|
2239
|
-
}
|
|
2240
|
-
}]
|
|
2241
|
-
});
|
|
2242
|
-
|
|
2243
|
-
if (!dbSet) {
|
|
2244
|
-
return null;
|
|
2245
|
-
}
|
|
2246
|
-
|
|
2247
|
-
if (dbSet.__typename === "ErrorAccessDenied") {
|
|
2248
|
-
return dbSet;
|
|
2249
|
-
}
|
|
2250
|
-
|
|
2251
|
-
if (dbSet.__typename === "ErrorNotFound") {
|
|
2252
|
-
return dbSet;
|
|
2253
|
-
}
|
|
2254
|
-
|
|
2255
|
-
if (!dbSet.dbSet) {
|
|
2256
|
-
return null;
|
|
2257
|
-
}
|
|
2258
|
-
|
|
2259
|
-
return {
|
|
2260
|
-
__typename: "SuccessResponse",
|
|
2261
|
-
data: dbSet.dbSet.res
|
|
2262
|
-
};
|
|
2263
|
-
}
|
|
2264
|
-
|
|
2265
|
-
async dbSearch(_ref30) {
|
|
2266
|
-
let {
|
|
2267
|
-
search,
|
|
2268
|
-
field
|
|
2269
|
-
} = _ref30;
|
|
2270
|
-
const {
|
|
2271
|
-
dbSearch
|
|
2272
|
-
} = await this.client("query", {
|
|
2273
|
-
scalars: {
|
|
2274
|
-
Json: {
|
|
2275
|
-
encode: e => JSON.stringify(e),
|
|
2276
|
-
decode: e => JSON.parse(e)
|
|
2277
|
-
},
|
|
2278
|
-
DateTime: {
|
|
2279
|
-
decode: e => new Date(e),
|
|
2280
|
-
encode: e => e.toISOString()
|
|
2281
|
-
},
|
|
2282
|
-
BigInt: {
|
|
2283
|
-
decode: e => BigInt(e),
|
|
2284
|
-
encode: e => e.toString()
|
|
2285
|
-
}
|
|
2286
|
-
}
|
|
2287
|
-
})({
|
|
2288
|
-
dbSearch: [{
|
|
2289
|
-
search,
|
|
2290
|
-
field
|
|
2291
|
-
}, {
|
|
2292
|
-
"...on ErrorAccessDenied": {
|
|
2293
|
-
__typename: true,
|
|
2294
|
-
message: true
|
|
2295
|
-
},
|
|
2296
|
-
"...on ErrorBasic": {
|
|
2297
|
-
__typename: true,
|
|
2298
|
-
message: true
|
|
2299
|
-
},
|
|
2300
|
-
"...on ErrorNotExist": {
|
|
2301
|
-
__typename: true,
|
|
2302
|
-
message: true
|
|
2303
|
-
},
|
|
2304
|
-
"...on DbSearchResponse": {
|
|
2305
|
-
__typename: true,
|
|
2306
|
-
json: true
|
|
2307
|
-
}
|
|
2308
|
-
}]
|
|
2309
|
-
});
|
|
2310
|
-
|
|
2311
|
-
if (!dbSearch) {
|
|
2312
|
-
return null;
|
|
2313
|
-
}
|
|
2314
|
-
|
|
2315
|
-
if (dbSearch.__typename === "ErrorAccessDenied") {
|
|
2316
|
-
return dbSearch;
|
|
2317
|
-
}
|
|
2318
|
-
|
|
2319
|
-
if (dbSearch.__typename === "ErrorBasic") {
|
|
2320
|
-
return dbSearch;
|
|
2321
|
-
}
|
|
2322
|
-
|
|
2323
|
-
if (dbSearch.__typename === "ErrorNotExist") {
|
|
2324
|
-
return dbSearch;
|
|
2325
|
-
}
|
|
2326
|
-
|
|
2327
|
-
return {
|
|
2328
|
-
__typename: "SuccessResponse",
|
|
2329
|
-
data: dbSearch.json
|
|
2330
|
-
};
|
|
2331
|
-
}
|
|
2332
|
-
|
|
2333
|
-
async sendDraftMail(draftId, customMessage) {
|
|
2334
|
-
const drafts = await this.draftMails();
|
|
2335
|
-
|
|
2336
|
-
if (!drafts) {
|
|
2337
|
-
return {
|
|
2338
|
-
__typename: "SuccessResponse",
|
|
2339
|
-
data: false
|
|
2340
|
-
};
|
|
2341
|
-
}
|
|
2342
|
-
|
|
2343
|
-
if (drafts.__typename !== "SuccessResponse") {
|
|
2344
|
-
return {
|
|
2345
|
-
__typename: "SuccessResponse",
|
|
2346
|
-
data: false
|
|
2347
|
-
};
|
|
2348
|
-
}
|
|
2349
|
-
|
|
2350
|
-
const draft = drafts.data.find(d => d.mailIntegrityId === draftId);
|
|
2351
|
-
|
|
2352
|
-
if (!draft) {
|
|
2353
|
-
return {
|
|
2354
|
-
__typename: "SuccessResponse",
|
|
2355
|
-
data: false
|
|
2356
|
-
};
|
|
2357
|
-
}
|
|
2358
|
-
|
|
2359
|
-
const recipients = new Array();
|
|
2360
|
-
const temporaryRecipients = new Array();
|
|
2361
|
-
|
|
2362
|
-
for (const {
|
|
2363
|
-
email
|
|
2364
|
-
} of draft.temporaryRecipients) {
|
|
2365
|
-
if (!email) {
|
|
2366
|
-
continue;
|
|
2367
|
-
}
|
|
2368
|
-
|
|
2369
|
-
const input = await this._eachUser(draft.files, draft.subject, draft.body, email);
|
|
2370
|
-
|
|
2371
|
-
if (!input) {
|
|
2372
|
-
temporaryRecipients.push(email);
|
|
2373
|
-
} else {
|
|
2374
|
-
recipients.push(input);
|
|
2375
|
-
}
|
|
2376
|
-
}
|
|
2377
|
-
|
|
2378
|
-
for (const {
|
|
2379
|
-
id
|
|
2380
|
-
} of draft.recipients) {
|
|
2381
|
-
const input = await this._eachUser(draft.files, draft.subject, draft.body, id);
|
|
2382
|
-
|
|
2383
|
-
if (!input) {
|
|
2384
|
-
temporaryRecipients.push(id);
|
|
2385
|
-
} else {
|
|
2386
|
-
recipients.push(input);
|
|
2387
|
-
}
|
|
2388
|
-
}
|
|
2389
|
-
|
|
2390
|
-
const {
|
|
2391
|
-
sendDraftMail
|
|
2392
|
-
} = await this.client("mutation")({
|
|
2393
|
-
sendDraftMail: [{
|
|
2394
|
-
temporaryRecipients,
|
|
2395
|
-
recipients,
|
|
2396
|
-
draftMailId: draft.mailIntegrityId,
|
|
2397
|
-
customMessage
|
|
2398
|
-
}, {
|
|
2399
|
-
"...on ErrorAccessDenied": {
|
|
2400
|
-
__typename: true,
|
|
2401
|
-
message: true
|
|
2402
|
-
},
|
|
2403
|
-
"...on ErrorBasic": {
|
|
2404
|
-
__typename: true,
|
|
2405
|
-
message: true
|
|
2406
|
-
},
|
|
2407
|
-
"...on SendDraftMailResponse": {
|
|
2408
|
-
__typename: true,
|
|
2409
|
-
sendDraftMail: true
|
|
2410
|
-
}
|
|
2411
|
-
}]
|
|
2412
|
-
});
|
|
2413
|
-
|
|
2414
|
-
if (!sendDraftMail) {
|
|
2415
|
-
return null;
|
|
2416
|
-
}
|
|
2417
|
-
|
|
2418
|
-
if (sendDraftMail.__typename === "ErrorAccessDenied") {
|
|
2419
|
-
return sendDraftMail;
|
|
2420
|
-
}
|
|
2421
|
-
|
|
2422
|
-
if (sendDraftMail.__typename === "ErrorBasic") {
|
|
2423
|
-
return sendDraftMail;
|
|
2424
|
-
}
|
|
2425
|
-
|
|
2426
|
-
if (!sendDraftMail.sendDraftMail) {
|
|
2427
|
-
return null;
|
|
2428
|
-
}
|
|
2429
|
-
|
|
2430
|
-
return {
|
|
2431
|
-
__typename: "SuccessResponse",
|
|
2432
|
-
data: sendDraftMail.sendDraftMail
|
|
2433
|
-
};
|
|
2434
|
-
}
|
|
2435
|
-
|
|
2436
|
-
async sendWaitingEmails() {
|
|
2437
|
-
// TODO opti this
|
|
2438
|
-
const mails = await this.sentMails();
|
|
2439
|
-
|
|
2440
|
-
if (!mails) {
|
|
2441
|
-
return {
|
|
2442
|
-
__typename: "SuccessResponse",
|
|
2443
|
-
data: false
|
|
2444
|
-
};
|
|
2445
|
-
}
|
|
2446
|
-
|
|
2447
|
-
if (mails.__typename !== "SuccessResponse") {
|
|
2448
|
-
return {
|
|
2449
|
-
__typename: "SuccessResponse",
|
|
2450
|
-
data: false
|
|
2451
|
-
};
|
|
2452
|
-
}
|
|
2453
|
-
|
|
2454
|
-
const filtered = mails.data.filter(m => m.temporaryRecipients.length > 0);
|
|
2455
|
-
|
|
2456
|
-
for (const mail of filtered) {
|
|
2457
|
-
for (const {
|
|
2458
|
-
email
|
|
2459
|
-
} of mail.temporaryRecipients) {
|
|
2460
|
-
if (!email) {
|
|
2461
|
-
continue;
|
|
2462
|
-
}
|
|
2463
|
-
|
|
2464
|
-
try {
|
|
2465
|
-
const input = await this._eachUser(mail.files, mail.subject, mail.body, email);
|
|
2466
|
-
|
|
2467
|
-
if (!input) {
|
|
2468
|
-
continue;
|
|
2469
|
-
}
|
|
2470
|
-
|
|
2471
|
-
await this.client("mutation")({
|
|
2472
|
-
sendOneMail: [{
|
|
2473
|
-
mailIntegrityId: mail.mailIntegrityId,
|
|
2474
|
-
recipient: input
|
|
2475
|
-
}, {
|
|
2476
|
-
"...on ErrorAccessDenied": {
|
|
2477
|
-
__typename: true,
|
|
2478
|
-
message: true
|
|
2479
|
-
},
|
|
2480
|
-
"...on ErrorBasic": {
|
|
2481
|
-
__typename: true,
|
|
2482
|
-
message: true
|
|
2483
|
-
},
|
|
2484
|
-
"...on RecoverNodeResponse": {
|
|
2485
|
-
__typename: true,
|
|
2486
|
-
recoverNode: true
|
|
2487
|
-
}
|
|
2488
|
-
}]
|
|
2489
|
-
});
|
|
2490
|
-
} catch {
|
|
2491
|
-
continue;
|
|
2492
|
-
}
|
|
2493
|
-
}
|
|
2494
|
-
}
|
|
2495
|
-
|
|
2496
|
-
return {
|
|
2497
|
-
__typename: "SuccessResponse",
|
|
2498
|
-
data: false
|
|
2499
|
-
};
|
|
2500
|
-
}
|
|
2501
|
-
|
|
2502
|
-
async createDraftMail(_ref31) {
|
|
2503
|
-
let {
|
|
2504
|
-
body,
|
|
2505
|
-
subject,
|
|
2506
|
-
files,
|
|
2507
|
-
recipientsIds,
|
|
2508
|
-
replyTo
|
|
2509
|
-
} = _ref31;
|
|
2510
|
-
const hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
|
|
2511
|
-
const hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
|
|
2512
|
-
body,
|
|
2513
|
-
subject
|
|
2514
|
-
}), hashKey, "hex");
|
|
2515
|
-
const senderFiles = new Array();
|
|
2516
|
-
|
|
2517
|
-
for (const f of files) {
|
|
2518
|
-
let file = filesCache.get(f.id);
|
|
2519
|
-
|
|
2520
|
-
if (!file) {
|
|
2521
|
-
await this.file({
|
|
2522
|
-
id: f.id
|
|
2523
|
-
});
|
|
2524
|
-
file = filesCache.get(f.id);
|
|
2525
|
-
|
|
2526
|
-
if (!file) {
|
|
2527
|
-
throw new Error("File " + f.name + " (" + f.id + ") does not exists");
|
|
2528
|
-
}
|
|
2529
|
-
}
|
|
2530
|
-
|
|
2531
|
-
senderFiles.push({
|
|
2532
|
-
id: file.id,
|
|
2533
|
-
fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
2534
|
-
name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
|
|
2535
|
-
});
|
|
2536
|
-
}
|
|
2537
|
-
|
|
2538
|
-
const {
|
|
2539
|
-
createDraftMail
|
|
2540
|
-
} = await this.client("mutation", {
|
|
2541
|
-
scalars: {
|
|
2542
|
-
DateTime: {
|
|
2543
|
-
decode: e => new Date(e),
|
|
2544
|
-
encode: e => e.toISOString()
|
|
2545
|
-
}
|
|
2546
|
-
}
|
|
2547
|
-
})({
|
|
2548
|
-
createDraftMail: [{
|
|
2549
|
-
recipients: recipientsIds,
|
|
2550
|
-
replyTo,
|
|
2551
|
-
body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
2552
|
-
subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
|
|
2553
|
-
senderFiles,
|
|
2554
|
-
hash,
|
|
2555
|
-
hashKey
|
|
2556
|
-
}, {
|
|
2557
|
-
"...on ErrorAccessDenied": {
|
|
2558
|
-
__typename: true,
|
|
2559
|
-
message: true
|
|
2560
|
-
},
|
|
2561
|
-
"...on ErrorBasic": {
|
|
2562
|
-
__typename: true,
|
|
2563
|
-
message: true
|
|
2564
|
-
},
|
|
2565
|
-
"...on CreateDraftMailResponse": {
|
|
2566
|
-
__typename: true,
|
|
2567
|
-
createDraftMail: mailSelector
|
|
2568
|
-
}
|
|
2569
|
-
}]
|
|
2570
|
-
});
|
|
2571
|
-
|
|
2572
|
-
if (!createDraftMail) {
|
|
2573
|
-
return null;
|
|
2574
|
-
}
|
|
2575
|
-
|
|
2576
|
-
if (createDraftMail.__typename === "ErrorAccessDenied") {
|
|
2577
|
-
return createDraftMail;
|
|
2578
|
-
}
|
|
2579
|
-
|
|
2580
|
-
if (createDraftMail.__typename === "ErrorBasic") {
|
|
2581
|
-
return createDraftMail;
|
|
2582
|
-
}
|
|
2583
|
-
|
|
2584
|
-
if (!createDraftMail.createDraftMail) {
|
|
2585
|
-
return null;
|
|
2586
|
-
}
|
|
2587
|
-
|
|
2588
|
-
const result = convertInternalMailToExternal(createDraftMail.createDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
2589
|
-
return {
|
|
2590
|
-
__typename: "SuccessResponse",
|
|
2591
|
-
data: result
|
|
2592
|
-
};
|
|
2593
|
-
}
|
|
2594
|
-
|
|
2595
|
-
async fileContent(_ref32) {
|
|
2596
|
-
let {
|
|
2597
|
-
fileId,
|
|
2598
|
-
onDownloadProgress,
|
|
2599
|
-
progressDecrypt,
|
|
2600
|
-
signal
|
|
2601
|
-
} = _ref32;
|
|
2602
|
-
const {
|
|
2603
|
-
fileContent
|
|
2604
|
-
} = await this.client("query", {
|
|
2605
|
-
scalars: {
|
|
2606
|
-
Bytes: {
|
|
2607
|
-
decode: e => {
|
|
2608
|
-
console.log(e, typeof e);
|
|
2609
|
-
return Uint8Array.from([1, 2, 3]);
|
|
2610
|
-
},
|
|
2611
|
-
encode: e => e.toString()
|
|
2612
|
-
}
|
|
2613
|
-
}
|
|
2614
|
-
})({
|
|
2615
|
-
fileContent: [{
|
|
2616
|
-
fileId
|
|
2617
|
-
}, {
|
|
2618
|
-
"...on ErrorAccessDenied": {
|
|
2619
|
-
__typename: true,
|
|
2620
|
-
message: true
|
|
2621
|
-
},
|
|
2622
|
-
"...on ErrorBasic": {
|
|
2623
|
-
__typename: true,
|
|
2624
|
-
message: true
|
|
2625
|
-
},
|
|
2626
|
-
"...on FileContentResponse": {
|
|
2627
|
-
__typename: true,
|
|
2628
|
-
file: {
|
|
2629
|
-
"...on FileContentCloud": {
|
|
2630
|
-
__typename: true,
|
|
2631
|
-
parts: {
|
|
2632
|
-
contentUrl: true,
|
|
2633
|
-
order: true,
|
|
2634
|
-
md5: true
|
|
2635
|
-
},
|
|
2636
|
-
key: true,
|
|
2637
|
-
publicKey: true,
|
|
2638
|
-
totalSize: true,
|
|
2639
|
-
md5: true,
|
|
2640
|
-
md5Encrypted: true
|
|
2641
|
-
},
|
|
2642
|
-
"...on FileContentLite": {
|
|
2643
|
-
__typename: true,
|
|
2644
|
-
content: true,
|
|
2645
|
-
id: true,
|
|
2646
|
-
key: true,
|
|
2647
|
-
publicKey: true,
|
|
2648
|
-
md5: true,
|
|
2649
|
-
md5Encrypted: true,
|
|
2650
|
-
totalSize: true
|
|
2651
|
-
},
|
|
2652
|
-
"...on FileContentReceivedMail": {
|
|
2653
|
-
__typename: true,
|
|
2654
|
-
maybeParts: {
|
|
2655
|
-
contentUrl: true,
|
|
2656
|
-
order: true,
|
|
2657
|
-
md5: true
|
|
2658
|
-
},
|
|
2659
|
-
maybeContent: true,
|
|
2660
|
-
key: true,
|
|
2661
|
-
senderPublicKey: true,
|
|
2662
|
-
totalSize: true,
|
|
2663
|
-
md5: true,
|
|
2664
|
-
md5Encrypted: true
|
|
2665
|
-
},
|
|
2666
|
-
"...on FileContentSentMail": {
|
|
2667
|
-
__typename: true,
|
|
2668
|
-
maybeParts: {
|
|
2669
|
-
contentUrl: true,
|
|
2670
|
-
order: true,
|
|
2671
|
-
md5: true
|
|
2672
|
-
},
|
|
2673
|
-
maybeContent: true,
|
|
2674
|
-
key: true,
|
|
2675
|
-
totalSize: true,
|
|
2676
|
-
md5: true,
|
|
2677
|
-
md5Encrypted: true
|
|
2678
|
-
}
|
|
2679
|
-
}
|
|
2680
|
-
}
|
|
2681
|
-
}]
|
|
2682
|
-
});
|
|
2683
|
-
|
|
2684
|
-
if (!fileContent) {
|
|
2685
|
-
return null;
|
|
2686
|
-
}
|
|
2687
|
-
|
|
2688
|
-
if (fileContent.__typename === "ErrorAccessDenied") {
|
|
2689
|
-
return fileContent;
|
|
2690
|
-
}
|
|
2691
|
-
|
|
2692
|
-
if (fileContent.__typename === "ErrorBasic") {
|
|
2693
|
-
return fileContent;
|
|
2694
|
-
}
|
|
2695
|
-
|
|
2696
|
-
const file = fileContent.file;
|
|
2697
|
-
|
|
2698
|
-
if (!file) {
|
|
2699
|
-
return null;
|
|
2700
|
-
}
|
|
2701
|
-
|
|
2702
|
-
const progressParts = {};
|
|
2703
|
-
|
|
2704
|
-
const onProgress = (part, progressEvent) => {
|
|
2705
|
-
progressParts[part] = progressEvent;
|
|
2706
|
-
const transferredBytes = Object.values(progressParts).reduce((prv, cur) => prv + cur.transferredBytes, 0);
|
|
2707
|
-
const totalBytes = Number(file.totalSize);
|
|
2708
|
-
onDownloadProgress == null ? void 0 : onDownloadProgress({
|
|
2709
|
-
percent: transferredBytes / totalBytes,
|
|
2710
|
-
totalBytes,
|
|
2711
|
-
transferredBytes
|
|
2712
|
-
});
|
|
2713
|
-
};
|
|
2714
|
-
|
|
2715
|
-
const encryptedContentFromParts = async fileParts => {
|
|
2716
|
-
const parts = new Array();
|
|
2717
|
-
|
|
2718
|
-
const byPart = async part => {
|
|
2719
|
-
const buf = new Uint8Array(await ky.get(part.contentUrl, {
|
|
2720
|
-
timeout: false,
|
|
2721
|
-
onDownloadProgress: pr => onProgress(part.order, pr),
|
|
2722
|
-
signal: signal
|
|
2723
|
-
}).arrayBuffer());
|
|
2724
|
-
const md5Part = await md5(buf);
|
|
2725
|
-
|
|
2726
|
-
if (md5Part !== part.md5) {
|
|
2727
|
-
throw new Error("Invalid md5 for part " + part.order + " of file " + fileId);
|
|
2728
|
-
}
|
|
2729
|
-
|
|
2730
|
-
parts.push({
|
|
2731
|
-
data: buf,
|
|
2732
|
-
order: part.order
|
|
2733
|
-
});
|
|
2734
|
-
};
|
|
2735
|
-
|
|
2736
|
-
await promiseAllLimit(3, fileParts.map(p => () => byPart(p)));
|
|
2737
|
-
return concatenate(...parts.sort((a, b) => a.order - b.order).map(p => p.data));
|
|
2738
|
-
};
|
|
2739
|
-
|
|
2740
|
-
const finalize = async encryptedContent => {
|
|
2741
|
-
// const md5Encrypted = await firstValueFrom(md5(of(encryptedContent)));
|
|
2742
|
-
const md5Encrypted = await md5(encryptedContent);
|
|
2743
|
-
|
|
2744
|
-
if (md5Encrypted !== file.md5Encrypted) {
|
|
2745
|
-
throw new Error("Encrypted content does not match");
|
|
2746
|
-
}
|
|
2747
|
-
|
|
2748
|
-
const key = decryptCryptoBox(sodium.from_hex(file.key), file.__typename === "FileContentReceivedMail" ? file.senderPublicKey : file.__typename === "FileContentCloud" ? file.publicKey : _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
|
|
2749
|
-
const src = await decrypt(key, encryptedContent, progressDecrypt, signal); // const md5Content = await firstValueFrom(md5(of(src)));
|
|
2750
|
-
|
|
2751
|
-
const md5Content = await md5(src);
|
|
2752
|
-
|
|
2753
|
-
if (md5Content !== file.md5) {
|
|
2754
|
-
throw new Error("Content does not match");
|
|
2755
|
-
}
|
|
2756
|
-
|
|
2757
|
-
return uncompress(src);
|
|
2758
|
-
};
|
|
2759
|
-
|
|
2760
|
-
const encryptedContent = file.__typename === "FileContentLite" ? file.content : file.__typename === "FileContentCloud" ? await encryptedContentFromParts(file.parts) : file.maybeContent ? file.maybeContent : file.maybeParts ? await encryptedContentFromParts(file.maybeParts) : null;
|
|
2761
|
-
|
|
2762
|
-
if (!encryptedContent) {
|
|
2763
|
-
return null;
|
|
2764
|
-
}
|
|
2765
|
-
|
|
2766
|
-
return {
|
|
2767
|
-
__typename: "SuccessResponse",
|
|
2768
|
-
data: await finalize(encryptedContent)
|
|
2769
|
-
};
|
|
2770
|
-
}
|
|
2771
|
-
|
|
2772
|
-
async readMail(_ref33) {
|
|
2773
|
-
let {
|
|
2774
|
-
mailId
|
|
2775
|
-
} = _ref33;
|
|
2776
|
-
const {
|
|
2777
|
-
readMail
|
|
2778
|
-
} = await this.client("mutation")({
|
|
2779
|
-
readMail: [{
|
|
2780
|
-
mailId
|
|
2781
|
-
}, {
|
|
2782
|
-
"...on ErrorAccessDenied": {
|
|
2783
|
-
__typename: true,
|
|
2784
|
-
message: true
|
|
2785
|
-
},
|
|
2786
|
-
"...on ErrorBasic": {
|
|
2787
|
-
__typename: true,
|
|
2788
|
-
message: true
|
|
2789
|
-
},
|
|
2790
|
-
"...on ErrorNotFound": {
|
|
2791
|
-
__typename: true,
|
|
2792
|
-
message: true
|
|
2793
|
-
},
|
|
2794
|
-
"...on ReadMailResponse": {
|
|
2795
|
-
__typename: true,
|
|
2796
|
-
readMail: true
|
|
2797
|
-
}
|
|
2798
|
-
}]
|
|
2799
|
-
});
|
|
2800
|
-
|
|
2801
|
-
if (!readMail) {
|
|
2802
|
-
return null;
|
|
2803
|
-
}
|
|
2804
|
-
|
|
2805
|
-
if (readMail.__typename === "ErrorAccessDenied") {
|
|
2806
|
-
return readMail;
|
|
2807
|
-
}
|
|
2808
|
-
|
|
2809
|
-
if (readMail.__typename === "ErrorBasic") {
|
|
2810
|
-
return readMail;
|
|
2811
|
-
}
|
|
2812
|
-
|
|
2813
|
-
if (readMail.__typename === "ErrorNotFound") {
|
|
2814
|
-
return readMail;
|
|
2815
|
-
}
|
|
2816
|
-
|
|
2817
|
-
if (!readMail.readMail) {
|
|
2818
|
-
return null;
|
|
2819
|
-
}
|
|
2820
|
-
|
|
2821
|
-
return {
|
|
2822
|
-
__typename: "SuccessResponse",
|
|
2823
|
-
data: readMail.readMail
|
|
2824
|
-
};
|
|
2825
|
-
}
|
|
2826
|
-
|
|
2827
|
-
async unreadMail(_ref34) {
|
|
2828
|
-
let {
|
|
2829
|
-
mailId
|
|
2830
|
-
} = _ref34;
|
|
2831
|
-
const {
|
|
2832
|
-
unreadMail
|
|
2833
|
-
} = await this.client("mutation")({
|
|
2834
|
-
unreadMail: [{
|
|
2835
|
-
mailId
|
|
2836
|
-
}, {
|
|
2837
|
-
"...on ErrorAccessDenied": {
|
|
2838
|
-
__typename: true,
|
|
2839
|
-
message: true
|
|
2840
|
-
},
|
|
2841
|
-
"...on ErrorBasic": {
|
|
2842
|
-
__typename: true,
|
|
2843
|
-
message: true
|
|
2844
|
-
},
|
|
2845
|
-
"...on ErrorNotFound": {
|
|
2846
|
-
__typename: true,
|
|
2847
|
-
message: true
|
|
2848
|
-
},
|
|
2849
|
-
"...on UnreadMailResponse": {
|
|
2850
|
-
__typename: true,
|
|
2851
|
-
unreadMail: true
|
|
2852
|
-
}
|
|
2853
|
-
}]
|
|
2854
|
-
});
|
|
2855
|
-
|
|
2856
|
-
if (!unreadMail) {
|
|
2857
|
-
return null;
|
|
2858
|
-
}
|
|
2859
|
-
|
|
2860
|
-
if (unreadMail.__typename === "ErrorAccessDenied") {
|
|
2861
|
-
return unreadMail;
|
|
2862
|
-
}
|
|
2863
|
-
|
|
2864
|
-
if (unreadMail.__typename === "ErrorBasic") {
|
|
2865
|
-
return unreadMail;
|
|
2866
|
-
}
|
|
2867
|
-
|
|
2868
|
-
if (unreadMail.__typename === "ErrorNotFound") {
|
|
2869
|
-
return unreadMail;
|
|
2870
|
-
}
|
|
2871
|
-
|
|
2872
|
-
if (!unreadMail.unreadMail) {
|
|
2873
|
-
return null;
|
|
2874
|
-
}
|
|
2875
|
-
|
|
2876
|
-
return {
|
|
2877
|
-
__typename: "SuccessResponse",
|
|
2878
|
-
data: unreadMail.unreadMail
|
|
2879
|
-
};
|
|
2880
|
-
}
|
|
2881
|
-
|
|
2882
|
-
async appSettings() {
|
|
2883
|
-
var _user$user;
|
|
2884
|
-
|
|
2885
|
-
const {
|
|
2886
|
-
user
|
|
2887
|
-
} = await this.client("query")({
|
|
2888
|
-
user: [{}, {
|
|
2889
|
-
"...on ErrorNotFound": {
|
|
2890
|
-
__typename: true,
|
|
2891
|
-
message: true
|
|
2892
|
-
},
|
|
2893
|
-
"...on UserResponse": {
|
|
2894
|
-
__typename: true,
|
|
2895
|
-
user: {
|
|
2896
|
-
appSettings: {
|
|
2897
|
-
cloudNodeDaysForDelete: true,
|
|
2898
|
-
historyFileDaysForDelete: true,
|
|
2899
|
-
historyMaxFileCount: true
|
|
2900
|
-
}
|
|
2901
|
-
}
|
|
2902
|
-
}
|
|
2903
|
-
}]
|
|
2904
|
-
});
|
|
2905
|
-
|
|
2906
|
-
if (!user) {
|
|
2907
|
-
return null;
|
|
2908
|
-
}
|
|
2909
|
-
|
|
2910
|
-
if (user.__typename === "ErrorNotFound") {
|
|
2911
|
-
return user;
|
|
2912
|
-
}
|
|
2913
|
-
|
|
2914
|
-
if (!((_user$user = user.user) != null && _user$user.appSettings)) {
|
|
2915
|
-
return null;
|
|
2916
|
-
}
|
|
2917
|
-
|
|
2918
|
-
return {
|
|
2919
|
-
__typename: "SuccessResponse",
|
|
2920
|
-
data: user.user.appSettings
|
|
2921
|
-
};
|
|
2922
|
-
}
|
|
2923
|
-
|
|
2924
|
-
async getJwt() {
|
|
2925
|
-
// TODO useful?
|
|
2926
|
-
// if (this.jwtDecoded.exp && this.jwtDecoded.exp * 1000 < Date.now()) {
|
|
2927
|
-
// return this.jwt;
|
|
2928
|
-
// }
|
|
2929
|
-
const {
|
|
2930
|
-
getJwt
|
|
2931
|
-
} = await this.client("query")({
|
|
2932
|
-
getJwt: [{
|
|
2933
|
-
includeEmail: !!this.jwtDecoded.email
|
|
2934
|
-
}, {
|
|
2935
|
-
"...on ErrorAccessDenied": {
|
|
2936
|
-
__typename: true,
|
|
2937
|
-
message: true
|
|
2938
|
-
},
|
|
2939
|
-
"...on JwtResponse": {
|
|
2940
|
-
__typename: true,
|
|
2941
|
-
jwt: true
|
|
2942
|
-
}
|
|
2943
|
-
}]
|
|
2944
|
-
});
|
|
2945
|
-
|
|
2946
|
-
if (!getJwt) {
|
|
2947
|
-
return this.jwt;
|
|
2948
|
-
}
|
|
2949
|
-
|
|
2950
|
-
if (getJwt.__typename === "ErrorAccessDenied") {
|
|
2951
|
-
throw new Error(getJwt.message);
|
|
2952
|
-
}
|
|
2953
|
-
|
|
2954
|
-
this.jwt = getJwt.jwt;
|
|
2955
|
-
this.jwtDecoded = decode(getJwt.jwt);
|
|
2956
|
-
const sessionStorage = getStorage(true);
|
|
2957
|
-
const localStorage = getStorage(false);
|
|
2958
|
-
const sessionJwt = sessionStorage.jwt.load();
|
|
2959
|
-
const localJwt = localStorage.jwt.load();
|
|
2960
|
-
|
|
2961
|
-
if (sessionJwt) {
|
|
2962
|
-
sessionStorage.jwt.save(getJwt.jwt);
|
|
2963
|
-
}
|
|
2964
|
-
|
|
2965
|
-
if (localJwt) {
|
|
2966
|
-
localStorage.jwt.save(getJwt.jwt);
|
|
2967
|
-
}
|
|
2968
|
-
|
|
2969
|
-
return getJwt.jwt;
|
|
2970
|
-
}
|
|
2971
|
-
|
|
2972
|
-
async updateAppSettings(settings) {
|
|
2973
|
-
const {
|
|
2974
|
-
updateAppSettings
|
|
2975
|
-
} = await this.client("mutation")({
|
|
2976
|
-
updateAppSettings: [settings, {
|
|
2977
|
-
"...on ErrorAccessDenied": {
|
|
2978
|
-
__typename: true,
|
|
2979
|
-
message: true
|
|
2980
|
-
},
|
|
2981
|
-
"...on ErrorBasic": {
|
|
2982
|
-
__typename: true,
|
|
2983
|
-
message: true
|
|
2984
|
-
},
|
|
2985
|
-
"...on UpdateAppSettingsResponse": {
|
|
2986
|
-
__typename: true,
|
|
2987
|
-
updateAppSettings: {
|
|
2988
|
-
cloudNodeDaysForDelete: true,
|
|
2989
|
-
historyFileDaysForDelete: true,
|
|
2990
|
-
historyMaxFileCount: true
|
|
2991
|
-
}
|
|
2992
|
-
}
|
|
2993
|
-
}]
|
|
2994
|
-
});
|
|
2995
|
-
|
|
2996
|
-
if (!updateAppSettings) {
|
|
2997
|
-
return null;
|
|
2998
|
-
}
|
|
2999
|
-
|
|
3000
|
-
if (updateAppSettings.__typename === "ErrorAccessDenied") {
|
|
3001
|
-
return updateAppSettings;
|
|
3002
|
-
}
|
|
3003
|
-
|
|
3004
|
-
if (updateAppSettings.__typename === "ErrorBasic") {
|
|
3005
|
-
return updateAppSettings;
|
|
3006
|
-
}
|
|
3007
|
-
|
|
3008
|
-
return {
|
|
3009
|
-
__typename: "SuccessResponse",
|
|
3010
|
-
data: updateAppSettings.updateAppSettings
|
|
3011
|
-
};
|
|
3012
|
-
}
|
|
3013
|
-
|
|
3014
|
-
async receivedMails() {
|
|
3015
|
-
const {
|
|
3016
|
-
user
|
|
3017
|
-
} = await this.client("query", {
|
|
3018
|
-
scalars: {
|
|
3019
|
-
DateTime: {
|
|
3020
|
-
decode: e => new Date(e),
|
|
3021
|
-
encode: e => e.toISOString()
|
|
3022
|
-
}
|
|
3023
|
-
}
|
|
3024
|
-
})({
|
|
3025
|
-
user: [{}, {
|
|
3026
|
-
"...on ErrorNotFound": {
|
|
3027
|
-
__typename: true,
|
|
3028
|
-
message: true
|
|
3029
|
-
},
|
|
3030
|
-
"...on UserResponse": {
|
|
3031
|
-
__typename: true,
|
|
3032
|
-
user: {
|
|
3033
|
-
receivedMails: mailSelector
|
|
3034
|
-
}
|
|
3035
|
-
}
|
|
3036
|
-
}]
|
|
3037
|
-
});
|
|
3038
|
-
|
|
3039
|
-
if (!user) {
|
|
3040
|
-
return null;
|
|
3041
|
-
}
|
|
3042
|
-
|
|
3043
|
-
if (user.__typename === "ErrorNotFound") {
|
|
3044
|
-
return user;
|
|
3045
|
-
}
|
|
3046
|
-
|
|
3047
|
-
if (!user.user) {
|
|
3048
|
-
return null;
|
|
3049
|
-
} // TODO get actual mails on this app only
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
const receivedMails = new Array();
|
|
3053
|
-
|
|
3054
|
-
for (const m of user.user.receivedMails) {
|
|
3055
|
-
const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
3056
|
-
|
|
3057
|
-
if (mail) {
|
|
3058
|
-
receivedMails.push(mail);
|
|
3059
|
-
}
|
|
3060
|
-
}
|
|
3061
|
-
|
|
3062
|
-
return {
|
|
3063
|
-
__typename: "SuccessResponse",
|
|
3064
|
-
data: receivedMails
|
|
3065
|
-
};
|
|
3066
|
-
}
|
|
3067
|
-
|
|
3068
|
-
async sentMails() {
|
|
3069
|
-
const {
|
|
3070
|
-
user
|
|
3071
|
-
} = await this.client("query", {
|
|
3072
|
-
scalars: {
|
|
3073
|
-
DateTime: {
|
|
3074
|
-
decode: e => new Date(e),
|
|
3075
|
-
encode: e => e.toISOString()
|
|
3076
|
-
}
|
|
3077
|
-
}
|
|
3078
|
-
})({
|
|
3079
|
-
user: [{}, {
|
|
3080
|
-
"...on ErrorNotFound": {
|
|
3081
|
-
__typename: true,
|
|
3082
|
-
message: true
|
|
3083
|
-
},
|
|
3084
|
-
"...on UserResponse": {
|
|
3085
|
-
__typename: true,
|
|
3086
|
-
user: {
|
|
3087
|
-
sentMails: mailSelector
|
|
3088
|
-
}
|
|
3089
|
-
}
|
|
3090
|
-
}]
|
|
3091
|
-
});
|
|
3092
|
-
|
|
3093
|
-
if (!user) {
|
|
3094
|
-
return null;
|
|
3095
|
-
}
|
|
3096
|
-
|
|
3097
|
-
if (user.__typename === "ErrorNotFound") {
|
|
3098
|
-
return user;
|
|
3099
|
-
}
|
|
3100
|
-
|
|
3101
|
-
if (!user.user) {
|
|
3102
|
-
return null;
|
|
3103
|
-
} // TODO get actual mails on this app only
|
|
3104
|
-
|
|
3105
|
-
|
|
3106
|
-
const sentMails = new Array();
|
|
3107
|
-
|
|
3108
|
-
for (const m of user.user.sentMails) {
|
|
3109
|
-
const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
3110
|
-
|
|
3111
|
-
if (mail) {
|
|
3112
|
-
sentMails.push(mail);
|
|
3113
|
-
}
|
|
3114
|
-
}
|
|
3115
|
-
|
|
3116
|
-
return {
|
|
3117
|
-
__typename: "SuccessResponse",
|
|
3118
|
-
data: sentMails
|
|
3119
|
-
};
|
|
3120
|
-
}
|
|
3121
|
-
|
|
3122
|
-
async draftMails() {
|
|
3123
|
-
const {
|
|
3124
|
-
user
|
|
3125
|
-
} = await this.client("query", {
|
|
3126
|
-
scalars: {
|
|
3127
|
-
DateTime: {
|
|
3128
|
-
decode: e => new Date(e),
|
|
3129
|
-
encode: e => e.toISOString()
|
|
3130
|
-
}
|
|
3131
|
-
}
|
|
3132
|
-
})({
|
|
3133
|
-
user: [{}, {
|
|
3134
|
-
"...on ErrorNotFound": {
|
|
3135
|
-
__typename: true,
|
|
3136
|
-
message: true
|
|
3137
|
-
},
|
|
3138
|
-
"...on UserResponse": {
|
|
3139
|
-
__typename: true,
|
|
3140
|
-
user: {
|
|
3141
|
-
draftMails: mailSelector
|
|
3142
|
-
}
|
|
3143
|
-
}
|
|
3144
|
-
}]
|
|
3145
|
-
});
|
|
3146
|
-
|
|
3147
|
-
if (!user) {
|
|
3148
|
-
return null;
|
|
3149
|
-
}
|
|
3150
|
-
|
|
3151
|
-
if (user.__typename === "ErrorNotFound") {
|
|
3152
|
-
return user;
|
|
3153
|
-
}
|
|
3154
|
-
|
|
3155
|
-
if (!user.user) {
|
|
3156
|
-
return null;
|
|
3157
|
-
} // TODO get actual mails on this app only
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
const draftMails = new Array();
|
|
3161
|
-
|
|
3162
|
-
for (const m of user.user.draftMails) {
|
|
3163
|
-
const draft = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
|
|
3164
|
-
|
|
3165
|
-
if (draft) {
|
|
3166
|
-
draftMails.push(draft);
|
|
3167
|
-
}
|
|
3168
|
-
}
|
|
3169
|
-
|
|
3170
|
-
return {
|
|
3171
|
-
__typename: "SuccessResponse",
|
|
3172
|
-
data: draftMails
|
|
3173
|
-
};
|
|
3174
|
-
}
|
|
3175
|
-
|
|
3176
|
-
async unreadReceivedMailsCount() {
|
|
3177
|
-
const {
|
|
3178
|
-
unreadReceivedMailsCount
|
|
3179
|
-
} = await this.client("query")({
|
|
3180
|
-
unreadReceivedMailsCount: {
|
|
3181
|
-
"...on ErrorAccessDenied": {
|
|
3182
|
-
__typename: true,
|
|
3183
|
-
message: true
|
|
3184
|
-
},
|
|
3185
|
-
"...on UnreadReceivedMailsCountResponse": {
|
|
3186
|
-
__typename: true,
|
|
3187
|
-
count: true
|
|
3188
|
-
}
|
|
3189
|
-
}
|
|
3190
|
-
});
|
|
3191
|
-
|
|
3192
|
-
if (!unreadReceivedMailsCount) {
|
|
3193
|
-
return null;
|
|
3194
|
-
}
|
|
3195
|
-
|
|
3196
|
-
if (unreadReceivedMailsCount.__typename === "ErrorAccessDenied") {
|
|
3197
|
-
return unreadReceivedMailsCount;
|
|
3198
|
-
}
|
|
3199
|
-
|
|
3200
|
-
return {
|
|
3201
|
-
__typename: "SuccessResponse",
|
|
3202
|
-
data: unreadReceivedMailsCount.count
|
|
3203
|
-
};
|
|
3204
|
-
}
|
|
3205
|
-
|
|
3206
47
|
}
|
|
3207
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJreSIsImF4aW9zIiwiQmFzZUNsaWVudCIsIm5vZGVzQ2FjaGUiLCJmaWxlc0NhY2hlIiwidXNlcnNDYWNoZSIsInNlY3JldHN0cmVhbUtleWdlbiIsImVuY3J5cHRTZWNyZXRzdHJlYW0iLCJjb21wcmVzcyIsInVuY29tcHJlc3MiLCJncWxOb2RlRnVsbFRvSW50ZXJuYWxGdWxsIiwiZ3FsTm9kZVRvRXh0ZXJuYWwiLCJncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsIiwiaW50ZXJuYWxOb2RlVG9Ob2RlIiwiZ3FsRmlsZVRvRXh0ZXJuYWwiLCJzb2RpdW0iLCJkZWNyeXB0Q3J5cHRvQm94IiwiZW5jcnlwdENyeXB0b0JveCIsImdlbmVyYXRlIiwibWQ1IiwiZW5jcnlwdCIsImRlY3J5cHQiLCJjaHVua3MiLCJjb25jYXRlbmF0ZSIsImVudW1lcmF0ZSIsInByb21pc2VBbGxMaW1pdCIsImZpbGVTZWxlY3RvciIsIm1haWxTZWxlY3RvciIsIm5vZGVGdWxsU2VsZWN0b3IiLCJub2RlU2VsZWN0b3IiLCJjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbCIsImdldFN0b3JhZ2UiLCJkZWNvZGUiLCJzZXJpYWxpemUiLCJlbmNyeXB0TmFtZSIsIm5hbWUiLCJuYW1lS2V5IiwiZGF0YSIsImZyb21faGV4IiwiZnJvbV9zdHJpbmciLCJuYW1lRW5jcnlwdGVkIiwidG9faGV4IiwiU2VjcmVjeUNsaWVudCIsImNvbnN0cnVjdG9yIiwidWFTZXNzaW9uIiwidWFLZXlzIiwidWFKd3QiLCJlbnYiLCJwZXJOb2RlIiwibm9kZUlkIiwicHVibGljS2V5Iiwibm9kZSIsImdldCIsImlkIiwiYWNjZXNzIiwicHJpdmF0ZUtleSIsImZpbGVzIiwiaGlzdG9yeSIsIm1hcCIsImYiLCJrZXkiLCJfZWFjaFVzZXIiLCJzdWJqZWN0IiwiYm9keSIsImlkT3JNYWlsIiwidSIsInJlcSIsInVzZXIiLCJ1c2VySWQiLCJ3aXRoUHVibGljS2V5IiwiX190eXBlbmFtZSIsIkVycm9yIiwicmVjaXBpZW50c0ZpbGVzIiwiQXJyYXkiLCJmaWxlSW5IaXN0b3J5IiwiZmlsZSIsInB1c2giLCJmaWxlS2V5IiwicmVjaXBpZW50SWQiLCJqd3QiLCJqd3REZWNvZGVkIiwiYXBwVXNlcklkIiwic3ViIiwiYWRkRmlsZVRvSGlzdG9yeSIsImZpbGVJZCIsImNsaWVudCIsIm1lc3NhZ2UiLCJmaW5kIiwidXNlcnMiLCJmaWx0ZXIiLCJpbnB1dCIsInNoYXJlRmlsZUluSGlzdG9yeSIsInJlc3VsdCIsInVwbG9hZEZpbGUiLCJlbmNyeXB0UHJvZ3Jlc3MiLCJ1cGxvYWRQcm9ncmVzcyIsInNpZ25hbCIsImZpbGVCdWZmZXIiLCJGaWxlIiwiVWludDhBcnJheSIsImFycmF5QnVmZmVyIiwiY29tcHJlc3NlZCIsImVuY3J5cHRlZEZpbGUiLCJtZDVGaWxlIiwibWQ1RW5jcnlwdGVkIiwiZW5jcnlwdGVkRmlsZUtleSIsInNjYWxhcnMiLCJKc29uIiwiZW5jb2RlIiwiZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZSIsIkRhdGVUaW1lIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiQmlnSW50IiwidG9TdHJpbmciLCJmaWxlU2l6ZSIsImJ5dGVMZW5ndGgiLCJmaWxlU2l6ZUJlZm9yZSIsImZpbGVQYXJ0U2l6ZSIsInBhcnRzIiwiZmllbGRzIiwib3JkZXIiLCJ1cmwiLCJ0b3RhbCIsImN1cnJlbnQiLCJwZXJjZW50IiwibGVuZ3RoIiwidXBsb2FkUGFydEVuZGVkIiwidXBsb2FkRmlsZVBhcnRFbmQiLCJ1cGxvYWRFbmRlZCIsInVwbG9hZEZpbGVFbmQiLCJjaHVua1BhcnRzIiwiaW5kZXgiLCJjaHVuayIsIk51bWJlciIsInByb2dyZXNzUGFydHMiLCJvblByb2dyZXNzIiwicGFydCIsInByb2dyZXNzRXZlbnQiLCJPYmplY3QiLCJ2YWx1ZXMiLCJyZWR1Y2UiLCJwcnYiLCJjdXIiLCJsb2FkZWQiLCJieVBhcnQiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwicCIsInZhbHVlIiwiZW50cmllcyIsImFwcGVuZCIsIkJsb2IiLCJwb3N0Iiwib25VcGxvYWRQcm9ncmVzcyIsInVwbG9hZEZpbGVJbkNsb3VkIiwic2F2ZUluQ2xvdWQiLCJsb2dvdXQiLCJzZXNzaW9uSWQiLCJjbGVhciIsImNyZWF0ZUZvbGRlciIsInBhcmVudEZvbGRlcklkIiwiZW5jcnlwdGVkTmFtZSIsImVuY3J5cHRlZEtleSIsImZvbGRlciIsInBhcmVudCIsIlByb21pc2UiLCJhbGwiLCJyaWdodHMiLCJzaGFyZU5vZGUiLCJkZWxldGVkIiwibWFpbCIsImRlbGV0ZWROb2RlcyIsIm5vZGVzIiwic2hhcmVkTm9kZXMiLCJub2Rlc1NoYXJlZFdpdGhNZSIsInR5cGUiLCJkZWxldGVOb2RlU2hhcmluZyIsImR1cGxpY2F0ZU5vZGUiLCJmb2xkZXJJZCIsImN1c3RvbU5hbWUiLCJkZWxldGVOb2RlQ2xvdWRUcmFzaCIsImlkcyIsInNoYXJlTm9kZXMiLCJzaGFyZU5vZGVGaW5pc2giLCJ1cGRhdGVOb2RlIiwiaXNGYXZvcml0ZSIsImRlbGV0ZWRBdCIsImRlbGV0ZWRNYWlscyIsIm1haWxUeXBlIiwibWFpbHMiLCJtIiwidXBkYXRlQXBwTm90aWZpY2F0aW9ucyIsIm5vdGlmaWNhdGlvbnMiLCJlbmFibGVBbGwiLCJjbG91ZCIsImRpc2FibGVBbGxVbnRpbCIsImFwcE5vdGlmaWNhdGlvbnMiLCJjcmVhdGVNYWlsIiwiY3VzdG9tTWVzc2FnZSIsImNyZWF0ZURyYWZ0TWFpbCIsInNlbmREcmFmdE1haWwiLCJtYWlsSW50ZWdyaXR5SWQiLCJ3YWl0aW5nUmVjZWl2ZWRNYWlscyIsImRhdGUiLCJhdHRhY2htZW50c0NvdW50Iiwic2VuZGVyIiwiZmlyc3RuYW1lIiwibGFzdG5hbWUiLCJlbWFpbCIsInJlY2lwaWVudHMiLCJ0ZW1wb3JhcnlSZWNpcGllbnRzIiwidXBkYXRlRHJhZnRNYWlsIiwiZHJhZnRJZCIsInJlY2lwaWVudHNJZHMiLCJyZXBseVRvIiwiZHJhZnRzIiwiZHJhZnRNYWlscyIsImRyYWZ0IiwiZCIsImhhc2hLZXkiLCJoYXNoIiwicmFuZG9tYnl0ZXNfYnVmIiwiY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTIiwiY3J5cHRvX2dlbmVyaWNoYXNoIiwiY3J5cHRvX2dlbmVyaWNoYXNoX0JZVEVTIiwic2VuZGVyRmlsZXMiLCJkZWxldGVEcmFmdE1haWwiLCJkZWxldGVNYWlsVHJhc2giLCJlbXB0eU1haWxUcmFzaCIsImVtcHR5Q2xvdWRUcmFzaCIsInJlY292ZXJOb2RlIiwicmVjb3Zlck1haWwiLCJtYWlsSWQiLCJkZWxldGVGaWxlIiwiZGVsZXRlTm9kZSIsIm1vdmVOb2RlcyIsIm5vZGVJZHMiLCJwYXJlbnROb2RlSWQiLCJkZWxldGVNYWlsIiwiaGFzIiwicmVjZWl2ZWRNYWlscyIsInNvbWUiLCJmaWxlTWFpbCIsImVuY3J5cHRlZE5hbWVLZXkiLCJmaWxlbmFtZSIsIm1lIiwiaW5jbHVkZXMiLCJvdGhlcnMiLCJkYkdldCIsImZpZWxkIiwianNvbiIsInJlcyIsImRiU2V0IiwiZGJTZWFyY2giLCJzZWFyY2giLCJkcmFmdE1haWxJZCIsInNlbmRXYWl0aW5nRW1haWxzIiwic2VudE1haWxzIiwiZmlsdGVyZWQiLCJzZW5kT25lTWFpbCIsInJlY2lwaWVudCIsImZpbGVDb250ZW50Iiwib25Eb3dubG9hZFByb2dyZXNzIiwicHJvZ3Jlc3NEZWNyeXB0IiwiQnl0ZXMiLCJjb25zb2xlIiwibG9nIiwiZnJvbSIsImNvbnRlbnRVcmwiLCJ0b3RhbFNpemUiLCJjb250ZW50IiwibWF5YmVQYXJ0cyIsIm1heWJlQ29udGVudCIsInNlbmRlclB1YmxpY0tleSIsInRyYW5zZmVycmVkQnl0ZXMiLCJ0b3RhbEJ5dGVzIiwiZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyIsImZpbGVQYXJ0cyIsImJ1ZiIsInRpbWVvdXQiLCJwciIsIm1kNVBhcnQiLCJzb3J0IiwiYSIsImIiLCJmaW5hbGl6ZSIsImVuY3J5cHRlZENvbnRlbnQiLCJzcmMiLCJtZDVDb250ZW50IiwicmVhZE1haWwiLCJ1bnJlYWRNYWlsIiwiYXBwU2V0dGluZ3MiLCJjbG91ZE5vZGVEYXlzRm9yRGVsZXRlIiwiaGlzdG9yeUZpbGVEYXlzRm9yRGVsZXRlIiwiaGlzdG9yeU1heEZpbGVDb3VudCIsImdldEp3dCIsImluY2x1ZGVFbWFpbCIsInNlc3Npb25TdG9yYWdlIiwibG9jYWxTdG9yYWdlIiwic2Vzc2lvbkp3dCIsImxvYWQiLCJsb2NhbEp3dCIsInNhdmUiLCJ1cGRhdGVBcHBTZXR0aW5ncyIsInNldHRpbmdzIiwidW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50IiwiY291bnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuaW1wb3J0IHR5cGUgeyBNYWlsVHlwZSwgTm9kZVR5cGUgfSBmcm9tIFwiLi8uLi96ZXVzL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IERvd25sb2FkUHJvZ3Jlc3MgfSBmcm9tIFwia3lcIjtcbmltcG9ydCBreSBmcm9tIFwia3lcIjtcbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB0eXBlIHsgU3VjY2Vzc1Jlc3BvbnNlLCBVc2VyRGF0YSB9IGZyb20gXCIuLi9CYXNlQ2xpZW50LmpzXCI7XG5pbXBvcnQgeyBCYXNlQ2xpZW50IH0gZnJvbSBcIi4uL0Jhc2VDbGllbnQuanNcIjtcbmltcG9ydCB7IG5vZGVzQ2FjaGUsIGZpbGVzQ2FjaGUsIHVzZXJzQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGUuanNcIjtcbmltcG9ydCB0eXBlIHsgUHJvZ3Jlc3MgfSBmcm9tIFwiLi4vY3J5cHRvL2ZpbGUuanNcIjtcbmltcG9ydCB7IHNlY3JldHN0cmVhbUtleWdlbiwgZW5jcnlwdFNlY3JldHN0cmVhbSB9IGZyb20gXCIuLi9jcnlwdG8vZmlsZS5qc1wiO1xuaW1wb3J0IHsgY29tcHJlc3MsIHVuY29tcHJlc3MgfSBmcm9tIFwiLi4vbWluaWZ5L2luZGV4LmpzXCI7XG5pbXBvcnQge1xuICBncWxOb2RlRnVsbFRvSW50ZXJuYWxGdWxsLFxuICBncWxOb2RlVG9FeHRlcm5hbCxcbiAgZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbCxcbiAgaW50ZXJuYWxOb2RlVG9Ob2RlXG59IGZyb20gXCIuL2NvbnZlcnQvbm9kZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBNYWlsRmlsZUlucHV0LFxuICBSZWNlaXZlZE1haWwsXG4gIFNlbnRNYWlsLFxuICBOb2RlLFxuICBOb2RlRnVsbCxcbiAgVXNlckFwcFNldHRpbmdzLFxuICBVc2VyQXBwTm90aWZpY2F0aW9ucyxcbiAgRmlsZU1ldGFkYXRhIGFzIFNlY3JlY3lGaWxlLFxuICBXYWl0aW5nUmVjZWl2ZWRNYWlsLFxuICBEcmFmdE1haWwsXG4gIE1haWxSZWNpcGllbnRJbnB1dCxcbiAgU2hhcmVOb2Rlc0lucHV0LFxuICBOYW1lS2V5SW5wdXQsXG4gIE1haWwsXG4gIFNoYXJlRmlsZUluSGlzdG9yeUlucHV0LFxuICBGaWxlUGFydFJlc3BvbnNlLFxuICBGaWxlQ29udGVudFBhcnRcbn0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IGdxbEZpbGVUb0V4dGVybmFsIH0gZnJvbSBcIi4vY29udmVydC9maWxlLmpzXCI7XG5pbXBvcnQgeyBzb2RpdW0gfSBmcm9tIFwiLi4vc29kaXVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleVBhaXIgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWNyeXB0Q3J5cHRvQm94LCBlbmNyeXB0Q3J5cHRvQm94IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZWNyZWN5RW52IH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2hvcnRpZFwiO1xuaW1wb3J0IHsgbWQ1IH0gZnJvbSBcIi4uL3dvcmtlci9tZDUuanNcIjtcbmltcG9ydCB7IGVuY3J5cHQsIGRlY3J5cHQgfSBmcm9tIFwiLi4vd29ya2VyL3NvZGl1bS5qc1wiO1xuaW1wb3J0IHtcbiAgY2h1bmtzLFxuICBjb25jYXRlbmF0ZSxcbiAgZW51bWVyYXRlLFxuICBwcm9taXNlQWxsTGltaXRcbn0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBmaWxlU2VsZWN0b3IsXG4gIG1haWxTZWxlY3RvcixcbiAgbm9kZUZ1bGxTZWxlY3RvcixcbiAgbm9kZVNlbGVjdG9yXG59IGZyb20gXCIuL3R5cGVzL3NlbGVjdG9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSaWdodHMgfSBmcm9tIFwiLi4vemV1cy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwgfSBmcm9tIFwiLi9jb252ZXJ0L21haWwuanNcIjtcbmltcG9ydCB0eXBlIHsgSnd0UGF5bG9hZCB9IGZyb20gXCJqc29ud2VidG9rZW5cIjtcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tIFwianNvbndlYnRva2VuXCI7XG4vLyBpbXBvcnQgeyBtZDUgfSBmcm9tIFwiLi4vd29ya2VyL2luZGV4LmpzXCI7XG4vLyBpbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgb2YgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFcnJvckFjY2Vzc0RlbmllZCxcbiAgRXJyb3JOb3RGb3VuZCxcbiAgRXJyb3JCYXNpYyxcbiAgRXJyb3JOb3RFeGlzdCxcbiAgRXJyb3JMaW1pdFxufSBmcm9tIFwiLi4vZXJyb3IuanNcIjtcbmltcG9ydCB0eXBlIHsgRG9jdW1lbnQgfSBmcm9tIFwiYnNvblwiO1xuaW1wb3J0IHsgc2VyaWFsaXplIH0gZnJvbSBcImJzb25cIjtcblxuZXhwb3J0IHR5cGUgTmV3TWFpbCA9IHtcbiAgYm9keTogc3RyaW5nO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGZpbGVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W107XG4gIHJlY2lwaWVudHNJZHM6IHN0cmluZ1tdO1xuICByZXBseVRvPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKHByb2dyZXNzOiBQcm9ncmVzcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuY29uc3QgZW5jcnlwdE5hbWUgPSBhc3luYyAobmFtZTogc3RyaW5nLCBuYW1lS2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGVuY3J5cHRTZWNyZXRzdHJlYW0oXG4gICAgc29kaXVtLmZyb21faGV4KG5hbWVLZXkpLFxuICAgIHNvZGl1bS5mcm9tX3N0cmluZyhuYW1lKVxuICApO1xuICBjb25zdCBuYW1lRW5jcnlwdGVkID0gc29kaXVtLnRvX2hleChkYXRhKTtcbiAgcmV0dXJuIG5hbWVFbmNyeXB0ZWQ7XG59O1xuXG5leHBvcnQgY2xhc3MgU2VjcmVjeUNsaWVudCBleHRlbmRzIEJhc2VDbGllbnQge1xuICBqd3Q6IHN0cmluZztcblxuICBqd3REZWNvZGVkOiBKd3RQYXlsb2FkO1xuXG4gICNrZXlzOiBLZXlQYWlyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHVhU2Vzc2lvbjogc3RyaW5nLFxuICAgIHVhS2V5czogS2V5UGFpcixcbiAgICB1YUp3dDogc3RyaW5nLFxuICAgIGVudjogU2VjcmVjeUVudlxuICApIHtcbiAgICBzdXBlcih1YVNlc3Npb24sIGVudik7XG4gICAgdGhpcy5qd3QgPSB1YUp3dDtcbiAgICB0aGlzLmp3dERlY29kZWQgPSBkZWNvZGUodWFKd3QpIGFzIEp3dFBheWxvYWQ7XG4gICAgdGhpcy4ja2V5cyA9IHVhS2V5cztcbiAgfVxuXG4gIGdldCBwdWJsaWNLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4ja2V5cy5wdWJsaWNLZXk7XG4gIH1cblxuICBnZXQgYXBwVXNlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuand0RGVjb2RlZC5zdWIgPz8gXCJcIjtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpbGVUb0hpc3Rvcnkoe1xuICAgIGZpbGVJZCxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgYWRkRmlsZVRvSGlzdG9yeSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBhZGRGaWxlVG9IaXN0b3J5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQWRkRmlsZVRvSGlzdG9yeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBhZGRGaWxlVG9IaXN0b3J5OiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZEZpbGVUb0hpc3RvcnkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChhZGRGaWxlVG9IaXN0b3J5Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGFkZEZpbGVUb0hpc3Rvcnk7XG4gICAgfVxuXG4gICAgaWYgKGFkZEZpbGVUb0hpc3RvcnkuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBhZGRGaWxlVG9IaXN0b3J5O1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBncWxOb2RlRnVsbFRvSW50ZXJuYWxGdWxsKFxuICAgICAgYWRkRmlsZVRvSGlzdG9yeS5hZGRGaWxlVG9IaXN0b3J5LFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG4gICAgY29uc3QgZmlsZSA9IG5vZGUuaGlzdG9yeS5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgY29uc3QgdXNlcnMgPSBub2RlLnVzZXJzLmZpbHRlcihcbiAgICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgIT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgICApO1xuICAgICAgY29uc3QgaW5wdXQ6IFNoYXJlRmlsZUluSGlzdG9yeUlucHV0ID0ge1xuICAgICAgICBmaWxlSWQ6IGZpbGUuaWQsXG4gICAgICAgIHVzZXJzOiB1c2Vycy5tYXAoKFt1XSkgPT4gKHtcbiAgICAgICAgICBpZDogdS5pZCxcbiAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZmlsZS5rZXkpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9KSlcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgICBzaGFyZUZpbGVJbkhpc3Rvcnk6IFtcbiAgICAgICAgICB7IGlucHV0LCBub2RlSWQgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIFNoYXJlRmlsZUluSGlzdG9yeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgc2hhcmVGaWxlSW5IaXN0b3J5OiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gaW50ZXJuYWxOb2RlVG9Ob2RlKG5vZGUpO1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGUoe1xuICAgIGZpbGUsXG4gICAgZW5jcnlwdFByb2dyZXNzLFxuICAgIHVwbG9hZFByb2dyZXNzLFxuICAgIHNpZ25hbFxuICB9OiB7XG4gICAgZmlsZTogZ2xvYmFsVGhpcy5GaWxlIHwgVWludDhBcnJheTtcbiAgICBlbmNyeXB0UHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHVwbG9hZFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8c3RyaW5nPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yTGltaXRcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgZmlsZUtleSA9IHNlY3JldHN0cmVhbUtleWdlbigpO1xuICAgIGNvbnN0IGZpbGVCdWZmZXIgPVxuICAgICAgZmlsZSBpbnN0YW5jZW9mIEZpbGUgPyBuZXcgVWludDhBcnJheShhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCkpIDogZmlsZTtcbiAgICBjb25zdCBjb21wcmVzc2VkID0gY29tcHJlc3MoZmlsZUJ1ZmZlcik7XG5cbiAgICBjb25zdCB7XG4gICAgICBkYXRhOiBlbmNyeXB0ZWRGaWxlLFxuICAgICAgbWQ1OiBtZDVGaWxlLFxuICAgICAgbWQ1RW5jcnlwdGVkXG4gICAgfSA9IGF3YWl0IGVuY3J5cHQoZmlsZUtleSwgY29tcHJlc3NlZCwgZW5jcnlwdFByb2dyZXNzLCBzaWduYWwpO1xuXG4gICAgY29uc3QgZW5jcnlwdGVkRmlsZUtleSA9IGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICBmaWxlS2V5LFxuICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICApO1xuXG4gICAgY29uc3QgeyB1cGxvYWRGaWxlIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgSnNvbjoge1xuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IEpTT04uc3RyaW5naWZ5KGUpLFxuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEpTT04ucGFyc2UoZSBhcyBzdHJpbmcpXG4gICAgICAgIH0sXG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfSxcbiAgICAgICAgQmlnSW50OiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gQmlnSW50KGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBiaWdpbnQpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVwbG9hZEZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVTaXplOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgZmlsZVNpemVCZWZvcmU6IGZpbGVCdWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KGVuY3J5cHRlZEZpbGVLZXkpLFxuICAgICAgICAgIG1kNUVuY3J5cHRlZCxcbiAgICAgICAgICBtZDU6IG1kNUZpbGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JMaW1pdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVwbG9hZEZpbGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXBsb2FkRmlsZToge1xuICAgICAgICAgICAgICBmaWxlSWQ6IHRydWUsXG4gICAgICAgICAgICAgIGZpbGVQYXJ0U2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHRydWUsXG4gICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgdXJsOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXBsb2FkRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwbG9hZEZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdXBsb2FkRmlsZTtcbiAgICB9XG5cbiAgICBpZiAodXBsb2FkRmlsZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIHVwbG9hZEZpbGU7XG4gICAgfVxuXG4gICAgaWYgKHVwbG9hZEZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1cGxvYWRGaWxlO1xuICAgIH1cblxuICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB1cGxvYWRQcm9ncmVzcz8uKHtcbiAgICAgIHRvdGFsOiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICBjdXJyZW50OiAwLFxuICAgICAgcGVyY2VudDogMFxuICAgIH0pO1xuXG4gICAgaWYgKHVwbG9hZEZpbGUudXBsb2FkRmlsZS5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBjdXJyZW50OiBlbmNyeXB0ZWRGaWxlLmJ5dGVMZW5ndGgsXG4gICAgICAgIHBlcmNlbnQ6IDFcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiB1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZUlkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVwbG9hZFBhcnRFbmRlZCA9IGFzeW5jIChcbiAgICAgIG1kNTogc3RyaW5nLFxuICAgICAgb3JkZXI6IG51bWJlclxuICAgICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiA9PiB7XG4gICAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXBsb2FkRmlsZVBhcnRFbmQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgICB1cGxvYWRGaWxlUGFydEVuZDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZCxcbiAgICAgICAgICAgIG1kNSxcbiAgICAgICAgICAgIG9yZGVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gVXBsb2FkRmlsZVBhcnRFbmRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIHVwbG9hZEZpbGVQYXJ0RW5kOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1cGxvYWRGaWxlUGFydEVuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwbG9hZEZpbGVQYXJ0RW5kLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgICByZXR1cm4gdXBsb2FkRmlsZVBhcnRFbmQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IHVwbG9hZEZpbGVQYXJ0RW5kLnVwbG9hZEZpbGVQYXJ0RW5kXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCB1cGxvYWRFbmRlZCA9IGFzeW5jICgpOiBQcm9taXNlPFxuICAgICAgU3VjY2Vzc1Jlc3BvbnNlPHN0cmluZz4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gICAgPiA9PiB7XG4gICAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXBsb2FkRmlsZUVuZCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgIHVwbG9hZEZpbGVFbmQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWxlSWQ6IHVwbG9hZEZpbGUudXBsb2FkRmlsZS5maWxlSWRcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gVXBsb2FkRmlsZUVuZFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgdXBsb2FkRmlsZUVuZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghdXBsb2FkRmlsZUVuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwbG9hZEZpbGVFbmQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICAgIHJldHVybiB1cGxvYWRGaWxlRW5kO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBsb2FkRmlsZUVuZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgICByZXR1cm4gdXBsb2FkRmlsZUVuZDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1cGxvYWRGaWxlRW5kLnVwbG9hZEZpbGVFbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IHVwbG9hZEZpbGVFbmQudXBsb2FkRmlsZUVuZFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgY2h1bmtQYXJ0cyA9IG5ldyBBcnJheTx7XG4gICAgICBvcmRlcjogbnVtYmVyO1xuICAgICAgZGF0YTogVWludDhBcnJheTtcbiAgICAgIG1kNTogc3RyaW5nO1xuICAgIH0+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY2h1bmtdIG9mIGVudW1lcmF0ZShcbiAgICAgIGNodW5rcyhlbmNyeXB0ZWRGaWxlLCBOdW1iZXIodXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVQYXJ0U2l6ZSkpXG4gICAgKSkge1xuICAgICAgY2h1bmtQYXJ0cy5wdXNoKHtcbiAgICAgICAgb3JkZXI6IGluZGV4ICsgMSxcbiAgICAgICAgZGF0YTogY2h1bmssXG4gICAgICAgIG1kNTogYXdhaXQgbWQ1KGNodW5rKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3Jlc3NQYXJ0czogUmVjb3JkPG51bWJlciwgUHJvZ3Jlc3NFdmVudD4gPSB7fTtcbiAgICBjb25zdCBvblByb2dyZXNzID0gKHBhcnQ6IG51bWJlciwgcHJvZ3Jlc3NFdmVudDogUHJvZ3Jlc3NFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgcHJvZ3Jlc3NQYXJ0c1twYXJ0XSA9IHByb2dyZXNzRXZlbnQ7XG4gICAgICBjb25zdCBjdXJyZW50ID0gT2JqZWN0LnZhbHVlcyhwcm9ncmVzc1BhcnRzKS5yZWR1Y2UoXG4gICAgICAgIChwcnYsIGN1cikgPT4gcHJ2ICsgY3VyLmxvYWRlZCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgICBwZXJjZW50OiBjdXJyZW50IC8gZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBjdXJyZW50XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnlQYXJ0ID0gYXN5bmMgKHBhcnQ6IEZpbGVQYXJ0UmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBjb25zdCBjaHVuayA9IGNodW5rUGFydHMuZmluZChwID0+IHAub3JkZXIgPT09IHBhcnQub3JkZXIpO1xuICAgICAgaWYgKCFjaHVuaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJ0LmZpZWxkcykpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICBcImZpbGVcIixcbiAgICAgICAgbmV3IEJsb2IoW2NodW5rLmRhdGFdKSxcbiAgICAgICAgYCR7dXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZH0tJHtjaHVuay5vcmRlcn1gXG4gICAgICApO1xuXG4gICAgICBhd2FpdCBheGlvcy5wb3N0KHBhcnQudXJsLCBmb3JtRGF0YSwge1xuICAgICAgICBvblVwbG9hZFByb2dyZXNzOiBwcm9ncmVzc0V2ZW50ID0+XG4gICAgICAgICAgb25Qcm9ncmVzcyhwYXJ0Lm9yZGVyLCBwcm9ncmVzc0V2ZW50KSxcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdXBsb2FkUGFydEVuZGVkKGNodW5rLm1kNSwgY2h1bmsub3JkZXIpO1xuICAgICAgLy8gaWYgKChlIGFzIGFueSkucmVzcG9uc2Uuc3RhdHVzID09PSAwKSB7XG4gICAgICAvLyAgIC8vIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9reS9pc3N1ZXMvMzA1XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aHJvdyBlO1xuICAgICAgLy8gfVxuICAgIH07XG5cbiAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZUFsbExpbWl0KFxuICAgICAgMyxcbiAgICAgIHVwbG9hZEZpbGUudXBsb2FkRmlsZS5wYXJ0cy5tYXAocCA9PiAoKTogUHJvbWlzZTx2b2lkPiA9PiBieVBhcnQocCkpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwbG9hZEVuZGVkKCk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGVJbkNsb3VkKHtcbiAgICBmaWxlLFxuICAgIG5hbWUsXG4gICAgbm9kZUlkLFxuICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGU6IGdsb2JhbFRoaXMuRmlsZSB8IFVpbnQ4QXJyYXk7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG5vZGVJZD86IHN0cmluZztcbiAgICBlbmNyeXB0UHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHVwbG9hZFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+XG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JMaW1pdFxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgRXJyb3JCYXNpY1xuICAgIHwgRXJyb3JOb3RFeGlzdFxuICAgIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBmaWxlSWQgPSBhd2FpdCB0aGlzLnVwbG9hZEZpbGUoe1xuICAgICAgZmlsZSxcbiAgICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICAgIHVwbG9hZFByb2dyZXNzLFxuICAgICAgc2lnbmFsXG4gICAgfSk7XG5cbiAgICBpZiAoIWZpbGVJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVJZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBmaWxlSWQ7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVJZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIGZpbGVJZDtcbiAgICB9XG5cbiAgICBpZiAoZmlsZUlkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gZmlsZUlkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2F2ZUluQ2xvdWQoe1xuICAgICAgZmlsZUlkOiBmaWxlSWQuZGF0YSxcbiAgICAgIG5hbWUsXG4gICAgICBub2RlSWRcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0LmRhdGFcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBub2Rlc0NhY2hlLmNsZWFyKCk7XG4gICAgZmlsZXNDYWNoZS5jbGVhcigpO1xuICAgIGF3YWl0IHN1cGVyLmxvZ291dChzZXNzaW9uSWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRm9sZGVyKHtcbiAgICBuYW1lLFxuICAgIHBhcmVudEZvbGRlcklkXG4gIH06IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcGFyZW50Rm9sZGVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBrZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChrZXkpKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRLZXkgPSBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAga2V5LFxuICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICApO1xuICAgIGNvbnN0IHsgY3JlYXRlRm9sZGVyIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGNyZWF0ZUZvbGRlcjogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogZW5jcnlwdGVkTmFtZSxcbiAgICAgICAgICBwYXJlbnRGb2xkZXJJZCxcbiAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoZW5jcnlwdGVkS2V5KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIENyZWF0ZUZvbGRlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGVGb2xkZXI6IG5vZGVGdWxsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIWNyZWF0ZUZvbGRlcikge1xuICAgICAgLy90aHJvdyBuZXcgRXJyb3IoYENhbid0IGNyZWF0ZSBmb2xkZXJgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVGb2xkZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRm9sZGVyO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVGb2xkZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGb2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKCFjcmVhdGVGb2xkZXIuY3JlYXRlRm9sZGVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgY3JlYXRlRm9sZGVyLmNyZWF0ZUZvbGRlcixcbiAgICAgIHRoaXMuI2tleXNcbiAgICApO1xuXG4gICAgY29uc3QgdXNlcnMgPVxuICAgICAgZm9sZGVyLnBhcmVudD8udXNlcnM/LmZpbHRlcihcbiAgICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgIT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgICApID8/IFtdO1xuXG4gICAgaWYgKHVzZXJzLmxlbmd0aCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHVzZXJzLm1hcCgoW3UsIHJpZ2h0c10pID0+XG4gICAgICAgICAgdGhpcy5zaGFyZU5vZGUoe1xuICAgICAgICAgICAgbm9kZUlkOiBmb2xkZXIuaWQsXG4gICAgICAgICAgICByaWdodHMsXG4gICAgICAgICAgICB1c2VySWQ6IHUuaWRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZm9sZGVyXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG5vZGUoe1xuICAgIGlkLFxuICAgIGRlbGV0ZWRcbiAgfToge1xuICAgIGlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBkZWxldGVkPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0gPSB7fSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbm9kZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiKSh7XG4gICAgICBub2RlOiBbXG4gICAgICAgIHsgZGVsZXRlZCwgaWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBub2RlOiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBpZiAoIW5vZGUubm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbChub2RlLm5vZGUsIHRoaXMuI2tleXMpO1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZpbGUoe1xuICAgIGlkXG4gIH06IHtcbiAgICBpZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8U2VjcmVjeUZpbGU+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIpKHtcbiAgICAgIGZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEZpbGVRdWVyeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBmaWxlOiBmaWxlU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChmaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgaWYgKCFmaWxlLmZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGdxbEZpbGVUb0V4dGVybmFsKGZpbGUuZmlsZSwgdGhpcy4ja2V5cyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyBtYWlsKHtcbiAgICBpZFxuICB9OiB7XG4gICAgaWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPE1haWw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBtYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgRGF0ZVRpbWU6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBuZXcgRGF0ZShlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgbWFpbDogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gUXVlcnlNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1haWw6IG1haWxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFtYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBtYWlsO1xuICAgIH1cblxuICAgIGlmICghbWFpbC5tYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtYWlsLm1haWwsIHRoaXMuI2tleXMpO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZWROb2RlcygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZGVsZXRlZE5vZGVzIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIpKHtcbiAgICAgIGRlbGV0ZWROb2Rlczoge1xuICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCIuLi5vbiBEZWxldGVkTm9kZXNSZXNwb25zZVwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBkZWxldGVkTm9kZXM6IG5vZGVTZWxlY3RvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZWROb2Rlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZWROb2Rlcy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVkTm9kZXM7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBuZXcgQXJyYXk8Tm9kZT4oKTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBkZWxldGVkTm9kZXMuZGVsZXRlZE5vZGVzKSB7XG4gICAgICBub2Rlcy5wdXNoKGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsKG5vZGUsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNoYXJlZE5vZGVzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVbXT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBzaGFyZWROb2RlcyB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiKSh7XG4gICAgICBzaGFyZWROb2Rlczoge1xuICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCIuLi5vbiBTaGFyZWROb2Rlc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIHNoYXJlZE5vZGVzOiBub2RlU2VsZWN0b3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFzaGFyZWROb2Rlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlZE5vZGVzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlZE5vZGVzO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5PE5vZGU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBzaGFyZWROb2Rlcy5zaGFyZWROb2Rlcykge1xuICAgICAgbm9kZXMucHVzaChhd2FpdCBncWxOb2RlVG9FeHRlcm5hbChmb2xkZXIsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG5vZGVzU2hhcmVkV2l0aE1lKFxuICAgIHR5cGU/OiBOb2RlVHlwZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Tm9kZVtdPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbm9kZXNTaGFyZWRXaXRoTWUgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgbm9kZXNTaGFyZWRXaXRoTWU6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gTm9kZXNTaGFyZWRXaXRoTWVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbm9kZXNTaGFyZWRXaXRoTWU6IG5vZGVTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFub2Rlc1NoYXJlZFdpdGhNZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVzU2hhcmVkV2l0aE1lLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG5vZGVzU2hhcmVkV2l0aE1lO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5PE5vZGU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBub2Rlc1NoYXJlZFdpdGhNZS5ub2Rlc1NoYXJlZFdpdGhNZSkge1xuICAgICAgbm9kZXMucHVzaChhd2FpdCBncWxOb2RlVG9FeHRlcm5hbChmb2xkZXIsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU5vZGVTaGFyaW5nKHtcbiAgICBub2RlSWQsXG4gICAgdXNlcklkXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVOb2RlU2hhcmluZyB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVOb2RlU2hhcmluZzogW1xuICAgICAgICB7XG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIHVzZXJJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVOb2RlU2hhcmluZ1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVOb2RlU2hhcmluZzogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVOb2RlU2hhcmluZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZU5vZGVTaGFyaW5nLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU5vZGVTaGFyaW5nO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTm9kZVNoYXJpbmcuZGVsZXRlTm9kZVNoYXJpbmdcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZHVwbGljYXRlTm9kZSh7XG4gICAgbm9kZUlkLFxuICAgIGZvbGRlcklkLFxuICAgIGN1c3RvbU5hbWVcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIGZvbGRlcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBjdXN0b21OYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBsZXQgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBhd2FpdCB0aGlzLm5vZGUoeyBpZDogbm9kZUlkIH0pO1xuICAgICAgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlICgke25vZGVJZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW5vZGUuYWNjZXNzPy5uYW1lS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGhhdmUgYWNjZXNzIHRvIG5vZGUgJHtub2RlSWR9YCk7XG4gICAgfVxuICAgIGN1c3RvbU5hbWUgPSBjdXN0b21OYW1lXG4gICAgICA/IGF3YWl0IGVuY3J5cHROYW1lKGN1c3RvbU5hbWUsIG5vZGUuYWNjZXNzLm5hbWVLZXkpXG4gICAgICA6IG51bGw7XG5cbiAgICBjb25zdCB7IGR1cGxpY2F0ZU5vZGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZHVwbGljYXRlTm9kZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIGZvbGRlcklkLFxuICAgICAgICAgIGN1c3RvbU5hbWVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEdXBsaWNhdGVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGR1cGxpY2F0ZU5vZGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZHVwbGljYXRlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGR1cGxpY2F0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZHVwbGljYXRlTm9kZTtcbiAgICB9XG5cbiAgICBpZiAoZHVwbGljYXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIGR1cGxpY2F0ZU5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkdXBsaWNhdGVOb2RlLmR1cGxpY2F0ZU5vZGVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTm9kZUNsb3VkVHJhc2goe1xuICAgIGlkc1xuICB9OiB7XG4gICAgaWRzOiBBcnJheTxzdHJpbmc+O1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU5vZGVDbG91ZFRyYXNoIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGVDbG91ZFRyYXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTm9kZUNsb3VkVHJhc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTm9kZUNsb3VkVHJhc2g6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlTm9kZUNsb3VkVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVOb2RlQ2xvdWRUcmFzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVOb2RlQ2xvdWRUcmFzaDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRlbGV0ZU5vZGVDbG91ZFRyYXNoLmRlbGV0ZU5vZGVDbG91ZFRyYXNoID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNoYXJlTm9kZSh7XG4gICAgbm9kZUlkLFxuICAgIHVzZXJJZCxcbiAgICByaWdodHNcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHJpZ2h0czogUmlnaHRzO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVzZXIoeyB1c2VySWQsIHdpdGhQdWJsaWNLZXk6IHRydWUgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNoYXJlTm9kZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzaGFyZU5vZGU6IFtcbiAgICAgICAgeyBub2RlSWQsIHVzZXJJZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFNoYXJlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBub2RlczogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFzaGFyZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzaGFyZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gc2hhcmVOb2RlO1xuICAgIH1cblxuICAgIGlmIChzaGFyZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmVOb2RlczogU2hhcmVOb2Rlc0lucHV0ID0ge1xuICAgICAgbm9kZXM6IFtdXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgaWQgb2Ygc2hhcmVOb2RlLm5vZGVzKSB7XG4gICAgICBjb25zdCBuYW1lS2V5ID0gYXdhaXQgdGhpcy5wZXJOb2RlKGlkLCB1c2VyLmRhdGEucHVibGljS2V5KTtcbiAgICAgIGlmIChuYW1lS2V5KSB7XG4gICAgICAgIHNoYXJlTm9kZXMubm9kZXMucHVzaChuYW1lS2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IHNoYXJlTm9kZUZpbmlzaCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzaGFyZU5vZGVGaW5pc2g6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2hhcmVOb2Rlc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFNoYXJlTm9kZUZpbmlzaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzaGFyZU5vZGVGaW5pc2g6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghc2hhcmVOb2RlRmluaXNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmVOb2RlRmluaXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlTm9kZUZpbmlzaDtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmVOb2RlRmluaXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gc2hhcmVOb2RlRmluaXNoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogc2hhcmVOb2RlRmluaXNoLnNoYXJlTm9kZUZpbmlzaCA/PyBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGRhdGVOb2RlKHtcbiAgICBub2RlSWQsXG4gICAgbmFtZSxcbiAgICBpc0Zhdm9yaXRlLFxuICAgIGRlbGV0ZWRBdFxuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgaXNGYXZvcml0ZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGRlbGV0ZWRBdD86IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBsZXQgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBhd2FpdCB0aGlzLm5vZGUoeyBpZDogbm9kZUlkIH0pO1xuICAgICAgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgYENhbid0IGZpbmQgTm9kZSAke25vZGVJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbm9kZS5hY2Nlc3M/Lm5hbWVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgaGF2ZSBhY2Nlc3MgdG8gbm9kZSAke25vZGVJZH1gKTtcbiAgICB9XG5cbiAgICBuYW1lID0gbmFtZVxuICAgICAgPyBub2RlLmFjY2Vzcz8ubmFtZUtleVxuICAgICAgICA/IGF3YWl0IGVuY3J5cHROYW1lKG5hbWUsIG5vZGUuYWNjZXNzLm5hbWVLZXkpXG4gICAgICAgIDogbmFtZVxuICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgeyB1cGRhdGVOb2RlIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIHVwZGF0ZU5vZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGlzRmF2b3JpdGUsXG4gICAgICAgICAgZGVsZXRlZEF0XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBkYXRlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1cGRhdGVOb2RlOiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwZGF0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVOb2RlO1xuICAgIH1cblxuICAgIGlmICghdXBkYXRlTm9kZS51cGRhdGVOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgdXBkYXRlTm9kZS51cGRhdGVOb2RlLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVkTWFpbHMoe1xuICAgIG1haWxUeXBlXG4gIH06IHtcbiAgICBtYWlsVHlwZTogTWFpbFR5cGU7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxNYWlsW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVkTWFpbHMgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBkZWxldGVkTWFpbHM6IFtcbiAgICAgICAgeyBtYWlsVHlwZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVkTWFpbHNSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlZE1haWxzOiBtYWlsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlZE1haWxzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlZE1haWxzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZWRNYWlscztcbiAgICB9XG5cbiAgICBjb25zdCBtYWlscyA9IG5ldyBBcnJheTxNYWlsPigpO1xuXG4gICAgZm9yIChjb25zdCBtIG9mIGRlbGV0ZWRNYWlscy5kZWxldGVkTWFpbHMpIHtcbiAgICAgIGNvbnN0IG1haWwgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtLCB0aGlzLiNrZXlzKTtcbiAgICAgIGlmIChtYWlsKSB7XG4gICAgICAgIG1haWxzLnB1c2gobWFpbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBtYWlsc1xuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGRhdGVBcHBOb3RpZmljYXRpb25zKFxuICAgIG5vdGlmaWNhdGlvbnM6IFBhcnRpYWw8VXNlckFwcE5vdGlmaWNhdGlvbnM+XG4gICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPFVzZXJBcHBOb3RpZmljYXRpb25zPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgdXBkYXRlQXBwTm90aWZpY2F0aW9ucyB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVwZGF0ZUFwcE5vdGlmaWNhdGlvbnM6IFtcbiAgICAgICAgbm90aWZpY2F0aW9ucyxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBkYXRlQXBwTm90aWZpY2F0aW9uc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1cGRhdGVBcHBOb3RpZmljYXRpb25zOiB7XG4gICAgICAgICAgICAgIGVuYWJsZUFsbDogdHJ1ZSxcbiAgICAgICAgICAgICAgbWFpbDogdHJ1ZSxcbiAgICAgICAgICAgICAgY2xvdWQ6IHRydWUsXG4gICAgICAgICAgICAgIGRpc2FibGVBbGxVbnRpbDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1cGRhdGVBcHBOb3RpZmljYXRpb25zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlQXBwTm90aWZpY2F0aW9ucy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVBcHBOb3RpZmljYXRpb25zO1xuICAgIH1cblxuICAgIGlmICghdXBkYXRlQXBwTm90aWZpY2F0aW9ucy51cGRhdGVBcHBOb3RpZmljYXRpb25zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHVwZGF0ZUFwcE5vdGlmaWNhdGlvbnMudXBkYXRlQXBwTm90aWZpY2F0aW9uc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBhcHBOb3RpZmljYXRpb25zKCk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8VXNlckFwcE5vdGlmaWNhdGlvbnM+XG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGFwcE5vdGlmaWNhdGlvbnMgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBhcHBOb3RpZmljYXRpb25zOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIFVzZXJBcHBOb3RpZmljYXRpb25zXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIGVuYWJsZUFsbDogdHJ1ZSxcbiAgICAgICAgICBtYWlsOiB0cnVlLFxuICAgICAgICAgIGNsb3VkOiB0cnVlLFxuICAgICAgICAgIGRpc2FibGVBbGxVbnRpbDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWFwcE5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChhcHBOb3RpZmljYXRpb25zLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGFwcE5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKGFwcE5vdGlmaWNhdGlvbnMuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiBhcHBOb3RpZmljYXRpb25zO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogYXBwTm90aWZpY2F0aW9uc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVNYWlsKFxuICAgIGRhdGE6IE5ld01haWwsXG4gICAgY3VzdG9tTWVzc2FnZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckJhc2ljIHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgbWFpbCA9IGF3YWl0IHRoaXMuY3JlYXRlRHJhZnRNYWlsKGRhdGEpO1xuICAgIGlmICghbWFpbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBtYWlsO1xuICAgIH1cblxuICAgIGlmIChtYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG1haWw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kRHJhZnRNYWlsKFxuICAgICAgbWFpbC5kYXRhLm1haWxJbnRlZ3JpdHlJZCxcbiAgICAgIGN1c3RvbU1lc3NhZ2VcbiAgICApO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHQuZGF0YVxuICAgIH07XG4gIH1cblxuICBhc3luYyB3YWl0aW5nUmVjZWl2ZWRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxXYWl0aW5nUmVjZWl2ZWRNYWlsW10+IHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1c2VyIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIpKHtcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXNlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIHdhaXRpbmdSZWNlaXZlZE1haWxzOiB7XG4gICAgICAgICAgICAgICAgZGF0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50c0NvdW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlbmRlcjoge1xuICAgICAgICAgICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBmaXJzdG5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBsYXN0bmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgcHVibGljS2V5OiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZWNpcGllbnRzOiB7XG4gICAgICAgICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGZpcnN0bmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGxhc3RuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZW1haWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRlbXBvcmFyeVJlY2lwaWVudHM6IHtcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXIudXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdXNlci51c2VyLndhaXRpbmdSZWNlaXZlZE1haWxzLm1hcChtID0+ICh7XG4gICAgICBpZDogZ2VuZXJhdGUoKSxcbiAgICAgIC4uLm0sXG4gICAgICBkYXRlOiBuZXcgRGF0ZShtLmRhdGUgYXMgc3RyaW5nKVxuICAgIH0pKTtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURyYWZ0TWFpbChcbiAgICBkcmFmdElkOiBzdHJpbmcsXG4gICAgeyBib2R5LCBzdWJqZWN0LCBmaWxlcywgcmVjaXBpZW50c0lkcywgcmVwbHlUbyB9OiBQYXJ0aWFsPE5ld01haWw+XG4gICk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8RHJhZnRNYWlsPlxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgZHJhZnRzID0gYXdhaXQgdGhpcy5kcmFmdE1haWxzKCk7XG4gICAgaWYgKCFkcmFmdHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkcmFmdHMuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgcmV0dXJuIGRyYWZ0cztcbiAgICB9XG4gICAgY29uc3QgZHJhZnQgPSBkcmFmdHMuZGF0YS5maW5kKGQgPT4gZC5tYWlsSW50ZWdyaXR5SWQgPT09IGRyYWZ0SWQpO1xuICAgIGlmICghZHJhZnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkcmFmdCAke2RyYWZ0SWR9YCk7XG4gICAgfVxuICAgIGxldCBoYXNoS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzaDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGJvZHkgfHwgc3ViamVjdCkge1xuICAgICAgaGFzaEtleSA9IHNvZGl1bS5yYW5kb21ieXRlc19idWYoXG4gICAgICAgIHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2hfS0VZQllURVMsXG4gICAgICAgIFwiaGV4XCJcbiAgICAgICk7XG4gICAgICBoYXNoID0gc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaChcbiAgICAgICAgc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaF9CWVRFUyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBib2R5LCBzdWJqZWN0IH0pLFxuICAgICAgICBoYXNoS2V5LFxuICAgICAgICBcImhleFwiXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZW5kZXJGaWxlcyA9IG5ldyBBcnJheTxNYWlsRmlsZUlucHV0PigpO1xuICAgIGlmIChmaWxlcykge1xuICAgICAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZSh7IGlkOiBmLmlkIH0pO1xuICAgICAgICAgIGZpbGUgPSBmaWxlc0NhY2hlLmdldChmLmlkKTtcbiAgICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2YubmFtZX0gKCR7Zi5pZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZW5kZXJGaWxlcy5wdXNoKHtcbiAgICAgICAgICBpZDogZmlsZS5pZCxcbiAgICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGZpbGUua2V5KSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgbmFtZTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IHVwZGF0ZURyYWZ0TWFpbCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEpzb246IHtcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnN0cmluZ2lmeShlKSxcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnBhcnNlKGUgYXMgc3RyaW5nKVxuICAgICAgICB9LFxuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH0sXG4gICAgICAgIEJpZ0ludDoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEJpZ0ludChlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgYmlnaW50KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1cGRhdGVEcmFmdE1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRyYWZ0SWQsXG4gICAgICAgICAgcmVjaXBpZW50czogcmVjaXBpZW50c0lkcyxcbiAgICAgICAgICByZXBseVRvLFxuICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgID8gc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICAgICAgICA/IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhzdWJqZWN0KSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2VuZGVyRmlsZXMsXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBoYXNoS2V5XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBkYXRlRHJhZnRNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVwZGF0ZURyYWZ0TWFpbDogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwZGF0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVEcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZURyYWZ0TWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIXVwZGF0ZURyYWZ0TWFpbC51cGRhdGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKFxuICAgICAgdXBkYXRlRHJhZnRNYWlsLnVwZGF0ZURyYWZ0TWFpbCxcbiAgICAgIHRoaXMuI2tleXNcbiAgICApIGFzIERyYWZ0TWFpbDtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZURyYWZ0TWFpbChcbiAgICBkcmFmdElkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZURyYWZ0TWFpbCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVEcmFmdE1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRyYWZ0SWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlRHJhZnRNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZURyYWZ0TWFpbDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVEcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlRHJhZnRNYWlsO1xuICAgIH1cblxuICAgIGlmICghZGVsZXRlRHJhZnRNYWlsLmRlbGV0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVEcmFmdE1haWwuZGVsZXRlRHJhZnRNYWlsID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU1haWxUcmFzaCh7XG4gICAgaWRzXG4gIH06IHtcbiAgICBpZHM6IEFycmF5PHN0cmluZz47XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlTWFpbFRyYXNoIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU1haWxUcmFzaDogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZU1haWxUcmFzaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVNYWlsVHJhc2g6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlTWFpbFRyYXNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlTWFpbFRyYXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU1haWxUcmFzaDtcbiAgICB9XG5cbiAgICBpZiAoIWRlbGV0ZU1haWxUcmFzaC5kZWxldGVNYWlsVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTWFpbFRyYXNoLmRlbGV0ZU1haWxUcmFzaFxuICAgIH07XG4gIH1cblxuICBhc3luYyBlbXB0eU1haWxUcmFzaCgpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGVtcHR5TWFpbFRyYXNoIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGVtcHR5TWFpbFRyYXNoOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIEVtcHR5TWFpbFRyYXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgZW1wdHlNYWlsVHJhc2g6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFlbXB0eU1haWxUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVtcHR5TWFpbFRyYXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGVtcHR5TWFpbFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZW1wdHlNYWlsVHJhc2guZW1wdHlNYWlsVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZW1wdHlNYWlsVHJhc2guZW1wdHlNYWlsVHJhc2hcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZW1wdHlDbG91ZFRyYXNoKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZW1wdHlDbG91ZFRyYXNoIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIGVtcHR5Q2xvdWRUcmFzaDoge1xuICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCIuLi5vbiBFbXB0eUNsb3VkVHJhc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBlbXB0eUNsb3VkVHJhc2g6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFlbXB0eUNsb3VkVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbXB0eUNsb3VkVHJhc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZW1wdHlDbG91ZFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZW1wdHlDbG91ZFRyYXNoLmVtcHR5Q2xvdWRUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBlbXB0eUNsb3VkVHJhc2guZW1wdHlDbG91ZFRyYXNoXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlY292ZXJOb2RlKFxuICAgIGlkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgcmVjb3Zlck5vZGUgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgcmVjb3Zlck5vZGU6IFtcbiAgICAgICAgeyBpZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFJlY292ZXJOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlY292ZXJOb2RlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlY292ZXJOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVjb3Zlck5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVjb3Zlck5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHJlY292ZXJOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gcmVjb3Zlck5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZWNvdmVyTm9kZS5yZWNvdmVyTm9kZSA/PyBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWNvdmVyTWFpbCh7XG4gICAgbWFpbElkXG4gIH06IHtcbiAgICBtYWlsSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHJlY292ZXJNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIHJlY292ZXJNYWlsOiBbXG4gICAgICAgIHsgbWFpbElkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gUmVjb3Zlck1haWxSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgcmVjb3Zlck1haWw6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghcmVjb3Zlck1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZWNvdmVyTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZWNvdmVyTWFpbDtcbiAgICB9XG5cbiAgICBpZiAocmVjb3Zlck1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiByZWNvdmVyTWFpbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlY292ZXJNYWlsLnJlY292ZXJNYWlsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZpbGUoe1xuICAgIGZpbGVJZCxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZGVsZXRlRmlsZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVGaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlRmlsZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVGaWxlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZUZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZUZpbGU7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZUZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVGaWxlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlRmlsZS5kZWxldGVGaWxlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU5vZGUoe1xuICAgIG5vZGVJZFxuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlTm9kZSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVOb2RlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZU5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTm9kZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVOb2RlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTm9kZS5kZWxldGVOb2RlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVOb2Rlcyh7XG4gICAgbm9kZUlkcyxcbiAgICBwYXJlbnROb2RlSWRcbiAgfToge1xuICAgIG5vZGVJZHM6IHN0cmluZ1tdO1xuICAgIHBhcmVudE5vZGVJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbW92ZU5vZGVzIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIG1vdmVOb2RlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgICBwYXJlbnROb2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gTW92ZU5vZGVzUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1vdmVOb2RlczogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFtb3ZlTm9kZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChtb3ZlTm9kZXMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbW92ZU5vZGVzO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbW92ZU5vZGVzLm1vdmVOb2RlcyA/PyBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVNYWlsKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTWFpbDogW1xuICAgICAgICB7XG4gICAgICAgICAgbWFpbElkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZU1haWxSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTWFpbDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVNYWlsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTWFpbC5kZWxldGVNYWlsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVJbkNsb3VkKHtcbiAgICBmaWxlSWQsXG4gICAgbmFtZSxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub2RlSWQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTGltaXRcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IEVycm9yTm90RXhpc3RcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgaWYgKG5vZGVJZCAmJiAhbm9kZXNDYWNoZS5oYXMobm9kZUlkKSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIGlmICghbm9kZXNDYWNoZS5oYXMobm9kZUlkKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgbm9kZSAke25vZGVJZH0gZG9lcyBub3QgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBrZXkgPSBcIlwiO1xuXG4gICAgY29uc3QgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGZpbGVJZCk7XG5cbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZSh7IGlkOiBmaWxlSWQgfSk7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZmlsZUlkKSA/PyBudWxsO1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVkTWFpbHMgPSBhd2FpdCB0aGlzLnJlY2VpdmVkTWFpbHMoKTtcbiAgICAgICAgaWYgKCFyZWNlaXZlZE1haWxzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY2VpdmVkTWFpbHMuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1haWwgPSByZWNlaXZlZE1haWxzLmRhdGEuZmluZChtID0+XG4gICAgICAgICAgbS5maWxlcy5zb21lKGYgPT4gZi5pZCA9PT0gZmlsZUlkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghbWFpbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiBcIkVycm9yQmFzaWNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW4ndCBmaW5kIG1haWwgd2l0aCB0aGUgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVNYWlsID0gbWFpbC5maWxlcy5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcblxuICAgICAgICBpZiAoIWZpbGVNYWlsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogYENhbid0IGZpbmQgbWFpbCB3aXRoIHRoZSBmaWxlICR7ZmlsZUlkfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21faGV4KGZpbGVNYWlsLmtleSksXG4gICAgICAgICAgbWFpbC5zZW5kZXIucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApO1xuXG4gICAgICAgIGtleSA9IHNvZGl1bS50b19oZXgoZmlsZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkgPSBmaWxlLmtleTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gZmlsZS5rZXk7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJFcnJvckJhc2ljXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiVW5leHBlY3RlZCBlcnJvciAzXCJcbiAgICAgIH07XG4gICAgfVxuXG4gICAga2V5ID0gc29kaXVtLnRvX2hleChcbiAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWVLZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChuYW1lS2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZUtleSA9IHNvZGl1bS50b19oZXgoXG4gICAgICBlbmNyeXB0Q3J5cHRvQm94KG5hbWVLZXksIHRoaXMuI2tleXMucHVibGljS2V5LCB0aGlzLiNrZXlzLnByaXZhdGVLZXkpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2F2ZUluQ2xvdWQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgc2F2ZUluQ2xvdWQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIGZpbGVuYW1lOiBlbmNyeXB0ZWROYW1lLFxuICAgICAgICAgIG5hbWVLZXk6IGVuY3J5cHRlZE5hbWVLZXlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckxpbWl0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBTYXZlSW5DbG91ZFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzYXZlSW5DbG91ZDogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFzYXZlSW5DbG91ZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNhdmVJbkNsb3VkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBzYXZlSW5DbG91ZDtcbiAgICB9XG5cbiAgICBpZiAoIXNhdmVJbkNsb3VkLnNhdmVJbkNsb3VkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gYXdhaXQgZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbChcbiAgICAgIHNhdmVJbkNsb3VkLnNhdmVJbkNsb3VkLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICBjb25zdCBtZSA9IG5vZGUucGFyZW50Py51c2Vycy5maW5kKFxuICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgPT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgKTtcblxuICAgIGlmIChtZSAmJiBbXCJhZG1pblwiLCBcIndyaXRlXCJdLmluY2x1ZGVzKG1lWzFdKSkge1xuICAgICAgY29uc3Qgb3RoZXJzID1cbiAgICAgICAgbm9kZS5wYXJlbnQ/LnVzZXJzLmZpbHRlcihcbiAgICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICAgKSA/PyBbXTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG90aGVycy5tYXAoKFt1LCByaWdodHNdKSA9PlxuICAgICAgICAgIHRoaXMuc2hhcmVOb2RlKHtcbiAgICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICAgIHVzZXJJZDogdS5pZFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBub2RlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRiR2V0PFU+KHtcbiAgICBmaWVsZCxcbiAgICB1c2VySWRcbiAgfToge1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgdXNlcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8VT5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvck5vdEV4aXN0XG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZGJHZXQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgZGJHZXQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHVzZXJJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGJHZXRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAganNvbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkYkdldCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRiR2V0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRiR2V0O1xuICAgIH1cblxuICAgIGlmIChkYkdldC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGRiR2V0O1xuICAgIH1cblxuICAgIGlmIChkYkdldC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIGRiR2V0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogKGRiR2V0Lmpzb24gYXMgeyByZXM6IFUgfSkucmVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRiU2V0PFQgZXh0ZW5kcyBVc2VyRGF0YSwgVSBleHRlbmRzIERvY3VtZW50Pih7XG4gICAgdmFsdWUsXG4gICAgdXNlcklkXG4gIH06IHtcbiAgICB2YWx1ZTogVTtcbiAgICB1c2VySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8VD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsPiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmFsdWUgc2hvdWxkIGJlIGFuIG9iamVjdCBpbmNsdWRpbmcgZmllbGRzIHlvdSB3YW50IHRvIHVwZGF0ZS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGJTZXQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgZGJTZXQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICB2YWx1ZTogc2VyaWFsaXplKHZhbHVlKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERiU2V0UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRiU2V0OiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRiU2V0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGJTZXQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGJTZXQ7XG4gICAgfVxuXG4gICAgaWYgKGRiU2V0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gZGJTZXQ7XG4gICAgfVxuXG4gICAgaWYgKCFkYlNldC5kYlNldCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiAoZGJTZXQuZGJTZXQgYXMgeyByZXM6IFQgfSkucmVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRiU2VhcmNoPFQ+KHtcbiAgICBzZWFyY2gsXG4gICAgZmllbGRcbiAgfToge1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxUW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBkYlNlYXJjaCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEpzb246IHtcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnN0cmluZ2lmeShlKSxcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnBhcnNlKGUgYXMgc3RyaW5nKVxuICAgICAgICB9LFxuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH0sXG4gICAgICAgIEJpZ0ludDoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEJpZ0ludChlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgYmlnaW50KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBkYlNlYXJjaDogW1xuICAgICAgICB7XG4gICAgICAgICAgc2VhcmNoLFxuICAgICAgICAgIGZpZWxkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RFeGlzdFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEYlNlYXJjaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBqc29uOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRiU2VhcmNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGJTZWFyY2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGJTZWFyY2g7XG4gICAgfVxuXG4gICAgaWYgKGRiU2VhcmNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gZGJTZWFyY2g7XG4gICAgfVxuXG4gICAgaWYgKGRiU2VhcmNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gZGJTZWFyY2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkYlNlYXJjaC5qc29uIGFzIHVua25vd24gYXMgVFtdXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNlbmREcmFmdE1haWwoXG4gICAgZHJhZnRJZDogc3RyaW5nLFxuICAgIGN1c3RvbU1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgbnVsbD4ge1xuICAgIGNvbnN0IGRyYWZ0cyA9IGF3YWl0IHRoaXMuZHJhZnRNYWlscygpO1xuXG4gICAgaWYgKCFkcmFmdHMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoZHJhZnRzLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRyYWZ0ID0gZHJhZnRzLmRhdGEuZmluZChkID0+IGQubWFpbEludGVncml0eUlkID09PSBkcmFmdElkKTtcbiAgICBpZiAoIWRyYWZ0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IG5ldyBBcnJheTxNYWlsUmVjaXBpZW50SW5wdXQ+KCk7XG5cbiAgICBjb25zdCB0ZW1wb3JhcnlSZWNpcGllbnRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgeyBlbWFpbCB9IG9mIGRyYWZ0LnRlbXBvcmFyeVJlY2lwaWVudHMpIHtcbiAgICAgIGlmICghZW1haWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMuX2VhY2hVc2VyKFxuICAgICAgICBkcmFmdC5maWxlcyxcbiAgICAgICAgZHJhZnQuc3ViamVjdCxcbiAgICAgICAgZHJhZnQuYm9keSxcbiAgICAgICAgZW1haWxcbiAgICAgICk7XG5cbiAgICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgdGVtcG9yYXJ5UmVjaXBpZW50cy5wdXNoKGVtYWlsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY2lwaWVudHMucHVzaChpbnB1dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGlkIH0gb2YgZHJhZnQucmVjaXBpZW50cykge1xuICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgZHJhZnQuZmlsZXMsXG4gICAgICAgIGRyYWZ0LnN1YmplY3QsXG4gICAgICAgIGRyYWZ0LmJvZHksXG4gICAgICAgIGlkXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIHRlbXBvcmFyeVJlY2lwaWVudHMucHVzaChpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNpcGllbnRzLnB1c2goaW5wdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2VuZERyYWZ0TWFpbCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzZW5kRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzLFxuICAgICAgICAgIHJlY2lwaWVudHMsXG4gICAgICAgICAgZHJhZnRNYWlsSWQ6IGRyYWZ0Lm1haWxJbnRlZ3JpdHlJZCxcbiAgICAgICAgICBjdXN0b21NZXNzYWdlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2VuZERyYWZ0TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzZW5kRHJhZnRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNlbmREcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzZW5kRHJhZnRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNlbmREcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHNlbmREcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBzZW5kRHJhZnRNYWlsO1xuICAgIH1cblxuICAgIGlmICghc2VuZERyYWZ0TWFpbC5zZW5kRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHNlbmREcmFmdE1haWwuc2VuZERyYWZ0TWFpbFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzZW5kV2FpdGluZ0VtYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGxcbiAgPiB7XG4gICAgLy8gVE9ETyBvcHRpIHRoaXNcbiAgICBjb25zdCBtYWlscyA9IGF3YWl0IHRoaXMuc2VudE1haWxzKCk7XG5cbiAgICBpZiAoIW1haWxzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1haWxzLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZCA9IG1haWxzLmRhdGEuZmlsdGVyKG0gPT4gbS50ZW1wb3JhcnlSZWNpcGllbnRzLmxlbmd0aCA+IDApO1xuXG4gICAgZm9yIChjb25zdCBtYWlsIG9mIGZpbHRlcmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgZW1haWwgfSBvZiBtYWlsLnRlbXBvcmFyeVJlY2lwaWVudHMpIHtcbiAgICAgICAgaWYgKCFlbWFpbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgICAgIG1haWwuZmlsZXMsXG4gICAgICAgICAgICBtYWlsLnN1YmplY3QsXG4gICAgICAgICAgICBtYWlsLmJvZHksXG4gICAgICAgICAgICBlbWFpbFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgICAgICBzZW5kT25lTWFpbDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFpbEludGVncml0eUlkOiBtYWlsLm1haWxJbnRlZ3JpdHlJZCxcbiAgICAgICAgICAgICAgICByZWNpcGllbnQ6IGlucHV0XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiLi4ub24gUmVjb3Zlck5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgcmVjb3Zlck5vZGU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVEcmFmdE1haWwoe1xuICAgIGJvZHksXG4gICAgc3ViamVjdCxcbiAgICBmaWxlcyxcbiAgICByZWNpcGllbnRzSWRzLFxuICAgIHJlcGx5VG9cbiAgfTogTmV3TWFpbCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPERyYWZ0TWFpbD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IGhhc2hLZXkgPSBzb2RpdW0ucmFuZG9tYnl0ZXNfYnVmKFxuICAgICAgc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaF9LRVlCWVRFUyxcbiAgICAgIFwiaGV4XCJcbiAgICApO1xuICAgIGNvbnN0IGhhc2ggPSBzb2RpdW0uY3J5cHRvX2dlbmVyaWNoYXNoKFxuICAgICAgc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaF9CWVRFUyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgYm9keSwgc3ViamVjdCB9KSxcbiAgICAgIGhhc2hLZXksXG4gICAgICBcImhleFwiXG4gICAgKTtcbiAgICBjb25zdCBzZW5kZXJGaWxlcyA9IG5ldyBBcnJheTxNYWlsRmlsZUlucHV0PigpO1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgICAgbGV0IGZpbGUgPSBmaWxlc0NhY2hlLmdldChmLmlkKTtcbiAgICAgIGlmICghZmlsZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGUoeyBpZDogZi5pZCB9KTtcbiAgICAgICAgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmLm5hbWV9ICgke2YuaWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2VuZGVyRmlsZXMucHVzaCh7XG4gICAgICAgIGlkOiBmaWxlLmlkLFxuICAgICAgICBmaWxlS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoZmlsZS5rZXkpLFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY3JlYXRlRHJhZnRNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgRGF0ZVRpbWU6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBuZXcgRGF0ZShlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgY3JlYXRlRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByZWNpcGllbnRzOiByZWNpcGllbnRzSWRzLFxuICAgICAgICAgIHJlcGx5VG8sXG4gICAgICAgICAgYm9keTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhib2R5KSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgc3ViamVjdDogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhzdWJqZWN0KSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgc2VuZGVyRmlsZXMsXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBoYXNoS2V5XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQ3JlYXRlRHJhZnRNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZURyYWZ0TWFpbDogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWNyZWF0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVEcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIGNyZWF0ZURyYWZ0TWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIWNyZWF0ZURyYWZ0TWFpbC5jcmVhdGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKFxuICAgICAgY3JlYXRlRHJhZnRNYWlsLmNyZWF0ZURyYWZ0TWFpbCxcbiAgICAgIHRoaXMuI2tleXNcbiAgICApIGFzIERyYWZ0TWFpbDtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZpbGVDb250ZW50KHtcbiAgICBmaWxlSWQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIHByb2dyZXNzRGVjcnlwdCxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG9uRG93bmxvYWRQcm9ncmVzcz86IChwcm9ncmVzczogRG93bmxvYWRQcm9ncmVzcykgPT4gdm9pZDtcbiAgICBwcm9ncmVzc0RlY3J5cHQ/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8VWludDhBcnJheT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgZmlsZUNvbnRlbnQgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBCeXRlczoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUsIHR5cGVvZiBlKTtcbiAgICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oWzEsIDIsIDNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIFVpbnQ4QXJyYXkpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGZpbGVDb250ZW50OiBbXG4gICAgICAgIHsgZmlsZUlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZmlsZToge1xuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50Q2xvdWRcIjoge1xuICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1kNTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAga2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50TGl0ZVwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXliZVBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heWJlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VuZGVyUHVibGljS2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1RW5jcnlwdGVkOiB0cnVlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRTZW50TWFpbFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXliZVBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heWJlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgdG90YWxTaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDVFbmNyeXB0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWxlQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVDb250ZW50Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZpbGVDb250ZW50O1xuICAgIH1cblxuICAgIGlmIChmaWxlQ29udGVudC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIGZpbGVDb250ZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGUgPSBmaWxlQ29udGVudC5maWxlO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3Jlc3NQYXJ0czogUmVjb3JkPG51bWJlciwgRG93bmxvYWRQcm9ncmVzcz4gPSB7fTtcbiAgICBjb25zdCBvblByb2dyZXNzID0gKFxuICAgICAgcGFydDogbnVtYmVyLFxuICAgICAgcHJvZ3Jlc3NFdmVudDogRG93bmxvYWRQcm9ncmVzc1xuICAgICk6IHZvaWQgPT4ge1xuICAgICAgcHJvZ3Jlc3NQYXJ0c1twYXJ0XSA9IHByb2dyZXNzRXZlbnQ7XG4gICAgICBjb25zdCB0cmFuc2ZlcnJlZEJ5dGVzID0gT2JqZWN0LnZhbHVlcyhwcm9ncmVzc1BhcnRzKS5yZWR1Y2UoXG4gICAgICAgIChwcnYsIGN1cikgPT4gcHJ2ICsgY3VyLnRyYW5zZmVycmVkQnl0ZXMsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICBjb25zdCB0b3RhbEJ5dGVzID0gTnVtYmVyKGZpbGUudG90YWxTaXplKTtcbiAgICAgIG9uRG93bmxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgcGVyY2VudDogdHJhbnNmZXJyZWRCeXRlcyAvIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRyYW5zZmVycmVkQnl0ZXNcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRDb250ZW50RnJvbVBhcnRzID0gYXN5bmMgKFxuICAgICAgZmlsZVBhcnRzOiBGaWxlQ29udGVudFBhcnRbXVxuICAgICk6IFByb21pc2U8VWludDhBcnJheT4gPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBuZXcgQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyBvcmRlcjogbnVtYmVyIH0+KCk7XG5cbiAgICAgIGNvbnN0IGJ5UGFydCA9IGFzeW5jIChwYXJ0OiBGaWxlQ29udGVudFBhcnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgICAgYXdhaXQga3lcbiAgICAgICAgICAgIC5nZXQocGFydC5jb250ZW50VXJsLCB7XG4gICAgICAgICAgICAgIHRpbWVvdXQ6IGZhbHNlLFxuICAgICAgICAgICAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IHByID0+IG9uUHJvZ3Jlc3MocGFydC5vcmRlciwgcHIpLFxuICAgICAgICAgICAgICBzaWduYWw6IHNpZ25hbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1kNVBhcnQgPSBhd2FpdCBtZDUoYnVmKTtcbiAgICAgICAgaWYgKG1kNVBhcnQgIT09IHBhcnQubWQ1KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgbWQ1IGZvciBwYXJ0ICR7cGFydC5vcmRlcn0gb2YgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICBkYXRhOiBidWYsXG4gICAgICAgICAgb3JkZXI6IHBhcnQub3JkZXJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBwcm9taXNlQWxsTGltaXQoXG4gICAgICAgIDMsXG4gICAgICAgIGZpbGVQYXJ0cy5tYXAocCA9PiAoKTogUHJvbWlzZTx2b2lkPiA9PiBieVBhcnQocCkpXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gY29uY2F0ZW5hdGUoXG4gICAgICAgIC4uLnBhcnRzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKS5tYXAocCA9PiBwLmRhdGEpXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBmaW5hbGl6ZSA9IGFzeW5jIChcbiAgICAgIGVuY3J5cHRlZENvbnRlbnQ6IFVpbnQ4QXJyYXlcbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICAgIC8vIGNvbnN0IG1kNUVuY3J5cHRlZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1kNShvZihlbmNyeXB0ZWRDb250ZW50KSkpO1xuICAgICAgY29uc3QgbWQ1RW5jcnlwdGVkID0gYXdhaXQgbWQ1KGVuY3J5cHRlZENvbnRlbnQpO1xuXG4gICAgICBpZiAobWQ1RW5jcnlwdGVkICE9PSBmaWxlLm1kNUVuY3J5cHRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuY3J5cHRlZCBjb250ZW50IGRvZXMgbm90IG1hdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlLmtleSksXG4gICAgICAgIGZpbGUuX190eXBlbmFtZSA9PT0gXCJGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiXG4gICAgICAgICAgPyBmaWxlLnNlbmRlclB1YmxpY0tleVxuICAgICAgICAgIDogZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICAgID8gZmlsZS5wdWJsaWNLZXlcbiAgICAgICAgICA6IHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNyYyA9IGF3YWl0IGRlY3J5cHQoa2V5LCBlbmNyeXB0ZWRDb250ZW50LCBwcm9ncmVzc0RlY3J5cHQsIHNpZ25hbCk7XG5cbiAgICAgIC8vIGNvbnN0IG1kNUNvbnRlbnQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShtZDUob2Yoc3JjKSkpO1xuICAgICAgY29uc3QgbWQ1Q29udGVudCA9IGF3YWl0IG1kNShzcmMpO1xuXG4gICAgICBpZiAobWQ1Q29udGVudCAhPT0gZmlsZS5tZDUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb250ZW50IGRvZXMgbm90IG1hdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmNvbXByZXNzKHNyYyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZENvbnRlbnQgPVxuICAgICAgZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50TGl0ZVwiXG4gICAgICAgID8gZmlsZS5jb250ZW50XG4gICAgICAgIDogZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICA/IGF3YWl0IGVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMoZmlsZS5wYXJ0cylcbiAgICAgICAgOiBmaWxlLm1heWJlQ29udGVudFxuICAgICAgICA/IGZpbGUubWF5YmVDb250ZW50XG4gICAgICAgIDogZmlsZS5tYXliZVBhcnRzXG4gICAgICAgID8gYXdhaXQgZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyhmaWxlLm1heWJlUGFydHMpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmICghZW5jcnlwdGVkQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBhd2FpdCBmaW5hbGl6ZShlbmNyeXB0ZWRDb250ZW50KVxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWFkTWFpbCh7XG4gICAgbWFpbElkXG4gIH06IHtcbiAgICBtYWlsSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj5cbiAgICB8IEVycm9yQWNjZXNzRGVuaWVkXG4gICAgfCBFcnJvckJhc2ljXG4gICAgfCBFcnJvck5vdEZvdW5kXG4gICAgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgcmVhZE1haWwgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgcmVhZE1haWw6IFtcbiAgICAgICAgeyBtYWlsSWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFJlYWRNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlYWRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVhZE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gcmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gcmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFkTWFpbC5yZWFkTWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZWFkTWFpbC5yZWFkTWFpbFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1bnJlYWRNYWlsKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1bnJlYWRNYWlsIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcIm11dGF0aW9uXCIpKHtcbiAgICAgIHVucmVhZE1haWw6IFtcbiAgICAgICAgeyBtYWlsSWQgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVucmVhZE1haWxSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdW5yZWFkTWFpbDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1bnJlYWRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodW5yZWFkTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1bnJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gdW5yZWFkTWFpbDtcbiAgICB9XG5cbiAgICBpZiAodW5yZWFkTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVucmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKCF1bnJlYWRNYWlsLnVucmVhZE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdW5yZWFkTWFpbC51bnJlYWRNYWlsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGFwcFNldHRpbmdzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFVzZXJBcHBTZXR0aW5ncz4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgdXNlcjogW1xuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVc2VyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgYXBwU2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgICBjbG91ZE5vZGVEYXlzRm9yRGVsZXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGhpc3RvcnlGaWxlRGF5c0ZvckRlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBoaXN0b3J5TWF4RmlsZUNvdW50OiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVzZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmICghdXNlci51c2VyPy5hcHBTZXR0aW5ncykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiB1c2VyLnVzZXIuYXBwU2V0dGluZ3NcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0Snd0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gVE9ETyB1c2VmdWw/XG4gICAgLy8gaWYgKHRoaXMuand0RGVjb2RlZC5leHAgJiYgdGhpcy5qd3REZWNvZGVkLmV4cCAqIDEwMDAgPCBEYXRlLm5vdygpKSB7XG4gICAgLy8gICByZXR1cm4gdGhpcy5qd3Q7XG4gICAgLy8gfVxuXG4gICAgY29uc3QgeyBnZXRKd3QgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgZ2V0Snd0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpbmNsdWRlRW1haWw6ICEhdGhpcy5qd3REZWNvZGVkLmVtYWlsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEp3dFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBqd3Q6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZ2V0Snd0KSB7XG4gICAgICByZXR1cm4gdGhpcy5qd3Q7XG4gICAgfVxuXG4gICAgaWYgKGdldEp3dC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihnZXRKd3QubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdGhpcy5qd3QgPSBnZXRKd3Quand0O1xuICAgIHRoaXMuand0RGVjb2RlZCA9IGRlY29kZShnZXRKd3Quand0KSBhcyBKd3RQYXlsb2FkO1xuXG4gICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBnZXRTdG9yYWdlKHRydWUpO1xuICAgIGNvbnN0IGxvY2FsU3RvcmFnZSA9IGdldFN0b3JhZ2UoZmFsc2UpO1xuXG4gICAgY29uc3Qgc2Vzc2lvbkp3dCA9IHNlc3Npb25TdG9yYWdlLmp3dC5sb2FkKCk7XG4gICAgY29uc3QgbG9jYWxKd3QgPSBsb2NhbFN0b3JhZ2Uuand0LmxvYWQoKTtcblxuICAgIGlmIChzZXNzaW9uSnd0KSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5qd3Quc2F2ZShnZXRKd3Quand0KTtcbiAgICB9XG5cbiAgICBpZiAobG9jYWxKd3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5qd3Quc2F2ZShnZXRKd3Quand0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0Snd0Lmp3dDtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFwcFNldHRpbmdzKFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFVzZXJBcHBTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8VXNlckFwcFNldHRpbmdzPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1cGRhdGVBcHBTZXR0aW5ncyB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICB1cGRhdGVBcHBTZXR0aW5nczogW1xuICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVcGRhdGVBcHBTZXR0aW5nc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1cGRhdGVBcHBTZXR0aW5nczoge1xuICAgICAgICAgICAgICBjbG91ZE5vZGVEYXlzRm9yRGVsZXRlOiB0cnVlLFxuICAgICAgICAgICAgICBoaXN0b3J5RmlsZURheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgICAgIGhpc3RvcnlNYXhGaWxlQ291bnQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXBkYXRlQXBwU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVBcHBTZXR0aW5ncy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVBcHBTZXR0aW5ncztcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlQXBwU2V0dGluZ3MuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVBcHBTZXR0aW5ncztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHVwZGF0ZUFwcFNldHRpbmdzLnVwZGF0ZUFwcFNldHRpbmdzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlY2VpdmVkTWFpbHMoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8UmVjZWl2ZWRNYWlsW10+IHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1c2VyIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgRGF0ZVRpbWU6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBuZXcgRGF0ZShlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgdXNlcjogW1xuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVc2VyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgcmVjZWl2ZWRNYWlsczogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXIudXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVE9ETyBnZXQgYWN0dWFsIG1haWxzIG9uIHRoaXMgYXBwIG9ubHlcblxuICAgIGNvbnN0IHJlY2VpdmVkTWFpbHMgPSBuZXcgQXJyYXk8UmVjZWl2ZWRNYWlsPigpO1xuXG4gICAgZm9yIChjb25zdCBtIG9mIHVzZXIudXNlci5yZWNlaXZlZE1haWxzKSB7XG4gICAgICBjb25zdCBtYWlsID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobSwgdGhpcy4ja2V5cyk7XG4gICAgICBpZiAobWFpbCkge1xuICAgICAgICByZWNlaXZlZE1haWxzLnB1c2gobWFpbCBhcyBSZWNlaXZlZE1haWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVjZWl2ZWRNYWlsc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBzZW50TWFpbHMoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8U2VudE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBzZW50TWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCBzZW50TWFpbHMgPSBuZXcgQXJyYXk8U2VudE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgdXNlci51c2VyLnNlbnRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgc2VudE1haWxzLnB1c2gobWFpbCBhcyBTZW50TWFpbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBzZW50TWFpbHNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZHJhZnRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxEcmFmdE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBkcmFmdE1haWxzOiBtYWlsU2VsZWN0b3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVzZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmICghdXNlci51c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUT0RPIGdldCBhY3R1YWwgbWFpbHMgb24gdGhpcyBhcHAgb25seVxuXG4gICAgY29uc3QgZHJhZnRNYWlscyA9IG5ldyBBcnJheTxEcmFmdE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgdXNlci51c2VyLmRyYWZ0TWFpbHMpIHtcbiAgICAgIGNvbnN0IGRyYWZ0ID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobSwgdGhpcy4ja2V5cykgYXMgRHJhZnRNYWlsO1xuICAgICAgaWYgKGRyYWZ0KSB7XG4gICAgICAgIGRyYWZ0TWFpbHMucHVzaChkcmFmdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkcmFmdE1haWxzXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyTm9kZSA9IGFzeW5jIChcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBwdWJsaWNLZXk6IHN0cmluZ1xuICApOiBQcm9taXNlPE5hbWVLZXlJbnB1dCB8IG51bGw+ID0+IHtcbiAgICBsZXQgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG5cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcblxuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWVLZXkgPSBub2RlLmFjY2Vzcz8ubmFtZUtleTtcblxuICAgIGlmICghbmFtZUtleSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBub2RlLmlkLFxuICAgICAgbmFtZUtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgobmFtZUtleSksXG4gICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgZmlsZXM6XG4gICAgICAgIFwiaGlzdG9yeVwiIGluIG5vZGVcbiAgICAgICAgICA/IG5vZGUuaGlzdG9yeS5tYXAoZiA9PiAoe1xuICAgICAgICAgICAgICBpZDogZi5pZCxcbiAgICAgICAgICAgICAga2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZi5rZXkpLFxuICAgICAgICAgICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICA6IFtdXG4gICAgfTtcbiAgfTtcblxuICBhc3luYyB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8bnVtYmVyPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVucmVhZFJlY2VpdmVkTWFpbHNDb3VudCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiKSh7XG4gICAgICB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQ6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gVW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50UmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgY291bnQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCF1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50LmNvdW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VhY2hVc2VyID0gYXN5bmMgKFxuICAgIGZpbGVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10sXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBpZE9yTWFpbDogc3RyaW5nXG4gICk6IFByb21pc2U8TWFpbFJlY2lwaWVudElucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCB1ID0gdXNlcnNDYWNoZS5nZXQoaWRPck1haWwpO1xuXG4gICAgaWYgKCF1IHx8ICEoXCJwdWJsaWNLZXlcIiBpbiB1KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVxID0gYXdhaXQgdGhpcy51c2VyKHtcbiAgICAgICAgICB1c2VySWQ6IGlkT3JNYWlsLFxuICAgICAgICAgIHdpdGhQdWJsaWNLZXk6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVxKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcS5fX3R5cGVuYW1lICE9PSBcIlN1Y2Nlc3NSZXNwb25zZVwiKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdSA9IHJlcS5kYXRhO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCEoXCJwdWJsaWNLZXlcIiBpbiB1KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2VyICR7aWRPck1haWx9IGhhdmUgbm8gcHVibGljIGtleWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudHNGaWxlcyA9IG5ldyBBcnJheTxNYWlsRmlsZUlucHV0PigpO1xuXG4gICAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgICBsZXQgZmlsZUluSGlzdG9yeSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgaWYgKCFmaWxlSW5IaXN0b3J5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZSh7IGlkOiBmLmlkIH0pO1xuICAgICAgICBmaWxlSW5IaXN0b3J5ID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZUluSGlzdG9yeSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2YubmFtZX0gKCR7Zi5pZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSBmaWxlSW5IaXN0b3J5LmtleTtcbiAgICAgIHJlY2lwaWVudHNGaWxlcy5wdXNoKHtcbiAgICAgICAgaWQ6IGYuaWQsXG4gICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNpcGllbnRJZDogdS5pZCxcbiAgICAgIGJvZHk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgIHUucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgc3ViamVjdDogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoc3ViamVjdCksXG4gICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczogcmVjaXBpZW50c0ZpbGVzXG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUdBLE9BQU9BLEVBQVAsTUFBZSxJQUFmO0FBQ0EsT0FBT0MsS0FBUCxNQUFrQixPQUFsQjtBQUVBLFNBQVNDLFVBQVQsUUFBMkIsa0JBQTNCO0FBQ0EsU0FBU0MsVUFBVCxFQUFxQkMsVUFBckIsRUFBaUNDLFVBQWpDLFFBQW1ELGFBQW5EO0FBRUEsU0FBU0Msa0JBQVQsRUFBNkJDLG1CQUE3QixRQUF3RCxtQkFBeEQ7QUFDQSxTQUFTQyxRQUFULEVBQW1CQyxVQUFuQixRQUFxQyxvQkFBckM7QUFDQSxTQUNFQyx5QkFERixFQUVFQyxpQkFGRixFQUdFQyx5QkFIRixFQUlFQyxrQkFKRixRQUtPLG1CQUxQO0FBeUJBLFNBQVNDLGlCQUFULFFBQWtDLG1CQUFsQztBQUNBLFNBQVNDLE1BQVQsUUFBdUIsY0FBdkI7QUFFQSxTQUFTQyxnQkFBVCxFQUEyQkMsZ0JBQTNCLFFBQW1ELG9CQUFuRDtBQUVBLFNBQVNDLFFBQVQsUUFBeUIsU0FBekI7QUFDQSxTQUFTQyxHQUFULFFBQW9CLGtCQUFwQjtBQUNBLFNBQVNDLE9BQVQsRUFBa0JDLE9BQWxCLFFBQWlDLHFCQUFqQztBQUNBLFNBQ0VDLE1BREYsRUFFRUMsV0FGRixFQUdFQyxTQUhGLEVBSUVDLGVBSkYsUUFLTyxtQkFMUDtBQU1BLFNBQ0VDLFlBREYsRUFFRUMsWUFGRixFQUdFQyxnQkFIRixFQUlFQyxZQUpGLFFBS08sc0JBTFA7QUFPQSxTQUFTQyw2QkFBVCxRQUE4QyxtQkFBOUM7QUFFQSxTQUFTQyxVQUFULFFBQTJCLGNBQTNCO0FBQ0EsU0FBU0MsTUFBVCxR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
|
|
48
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCYXNlQ2xpZW50IiwiZW5jcnlwdFNlY3JldHN0cmVhbSIsInNvZGl1bSIsIlNlY3JlY3lDbG91ZENsaWVudCIsIlNlY3JlY3lNYWlsQ2xpZW50IiwiU2VjcmVjeUFwcENsaWVudCIsIm5vZGVzQ2FjaGUiLCJmaWxlc0NhY2hlIiwiU2VjcmVjeURiQ2xpZW50IiwiZW5jcnlwdE5hbWUiLCJuYW1lIiwibmFtZUtleSIsImRhdGEiLCJmcm9tX2hleCIsImZyb21fc3RyaW5nIiwibmFtZUVuY3J5cHRlZCIsInRvX2hleCIsIlNlY3JlY3lDbGllbnQiLCJjb25zdHJ1Y3RvciIsInVhU2Vzc2lvbiIsInVhS2V5cyIsInVhSnd0IiwiZW52IiwiY2xvdWQiLCJ0aHVuZGVyIiwibWFpbCIsImFwcCIsImRiIiwicHVibGljS2V5IiwibG9nb3V0Iiwic2Vzc2lvbklkIiwiY2xlYXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuaW1wb3J0IHsgQmFzZUNsaWVudCB9IGZyb20gXCIuLi9CYXNlQ2xpZW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2dyZXNzIH0gZnJvbSBcIi4uL2NyeXB0by9maWxlLmpzXCI7XG5pbXBvcnQgeyBlbmNyeXB0U2VjcmV0c3RyZWFtIH0gZnJvbSBcIi4uL2NyeXB0by9maWxlLmpzXCI7XG5pbXBvcnQgeyBzb2RpdW0gfSBmcm9tIFwiLi4vc29kaXVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleVBhaXIgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNlY3JlY3lFbnYgfSBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5pbXBvcnQgeyBTZWNyZWN5Q2xvdWRDbGllbnQgfSBmcm9tIFwiLi9TZWNyZWN5Q2xvdWRDbGllbnQuanNcIjtcbmltcG9ydCB7IFNlY3JlY3lNYWlsQ2xpZW50IH0gZnJvbSBcIi4vU2VjcmVjeU1haWxDbGllbnQuanNcIjtcbmltcG9ydCB7IFNlY3JlY3lBcHBDbGllbnQgfSBmcm9tIFwiLi9TZWNyZWN5QXBwQ2xpZW50LmpzXCI7XG5pbXBvcnQgeyBub2Rlc0NhY2hlLCBmaWxlc0NhY2hlIH0gZnJvbSBcIi4uL2NhY2hlLmpzXCI7XG5pbXBvcnQgeyBTZWNyZWN5RGJDbGllbnQgfSBmcm9tIFwiLi9TZWNyZWN5RGJDbGllbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgTmV3TWFpbCA9IHtcbiAgYm9keTogc3RyaW5nO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGZpbGVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W107XG4gIHJlY2lwaWVudHNJZHM6IHN0cmluZ1tdO1xuICByZXBseVRvPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKHByb2dyZXNzOiBQcm9ncmVzcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGNvbnN0IGVuY3J5cHROYW1lID0gYXN5bmMgKFxuICBuYW1lOiBzdHJpbmcsXG4gIG5hbWVLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBlbmNyeXB0U2VjcmV0c3RyZWFtKFxuICAgIHNvZGl1bS5mcm9tX2hleChuYW1lS2V5KSxcbiAgICBzb2RpdW0uZnJvbV9zdHJpbmcobmFtZSlcbiAgKTtcbiAgY29uc3QgbmFtZUVuY3J5cHRlZCA9IHNvZGl1bS50b19oZXgoZGF0YSk7XG4gIHJldHVybiBuYW1lRW5jcnlwdGVkO1xufTtcblxuZXhwb3J0IGNsYXNzIFNlY3JlY3lDbGllbnQgZXh0ZW5kcyBCYXNlQ2xpZW50IHtcbiAgI2tleXM6IEtleVBhaXI7XG5cbiAgY2xvdWQ6IFNlY3JlY3lDbG91ZENsaWVudDtcblxuICBtYWlsOiBTZWNyZWN5TWFpbENsaWVudDtcblxuICBhcHA6IFNlY3JlY3lBcHBDbGllbnQ7XG5cbiAgZGI6IFNlY3JlY3lEYkNsaWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB1YVNlc3Npb246IHN0cmluZyxcbiAgICB1YUtleXM6IEtleVBhaXIsXG4gICAgdWFKd3Q6IHN0cmluZyxcbiAgICBlbnY6IFNlY3JlY3lFbnZcbiAgKSB7XG4gICAgc3VwZXIodWFTZXNzaW9uLCBlbnYpO1xuICAgIHRoaXMuI2tleXMgPSB1YUtleXM7XG4gICAgdGhpcy5jbG91ZCA9IG5ldyBTZWNyZWN5Q2xvdWRDbGllbnQodGhpcywgdGhpcy4ja2V5cywgdGhpcy50aHVuZGVyKTtcbiAgICB0aGlzLm1haWwgPSBuZXcgU2VjcmVjeU1haWxDbGllbnQodGhpcywgdGhpcy4ja2V5cywgdGhpcy50aHVuZGVyKTtcbiAgICB0aGlzLmFwcCA9IG5ldyBTZWNyZWN5QXBwQ2xpZW50KHVhSnd0LCB0aGlzLCB0aGlzLiNrZXlzLCB0aGlzLnRodW5kZXIpO1xuICAgIHRoaXMuZGIgPSBuZXcgU2VjcmVjeURiQ2xpZW50KHRoaXMsIHRoaXMuI2tleXMsIHRoaXMudGh1bmRlcik7XG4gIH1cblxuICBnZXQgcHVibGljS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI2tleXMucHVibGljS2V5O1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBub2Rlc0NhY2hlLmNsZWFyKCk7XG4gICAgZmlsZXNDYWNoZS5jbGVhcigpO1xuICAgIGF3YWl0IHN1cGVyLmxvZ291dChzZXNzaW9uSWQpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBO0FBQ0EsU0FBU0EsVUFBVCxRQUEyQixrQkFBM0I7QUFFQSxTQUFTQyxtQkFBVCxRQUFvQyxtQkFBcEM7QUFDQSxTQUFTQyxNQUFULFFBQXVCLGNBQXZCO0FBR0EsU0FBU0Msa0JBQVQsUUFBbUMseUJBQW5DO0FBQ0EsU0FBU0MsaUJBQVQsUUFBa0Msd0JBQWxDO0FBQ0EsU0FBU0MsZ0JBQVQsUUFBaUMsdUJBQWpDO0FBQ0EsU0FBU0MsVUFBVCxFQUFxQkMsVUFBckIsUUFBdUMsYUFBdkM7QUFDQSxTQUFTQyxlQUFULFFBQWdDLHNCQUFoQztBQVdBLE9BQU8sTUFBTUMsV0FBVyxHQUFHLE9BQ3pCQyxJQUR5QixFQUV6QkMsT0FGeUIsS0FHTDtFQUNwQixNQUFNO0lBQUVDO0VBQUYsSUFBVyxNQUFNWCxtQkFBbUIsQ0FDeENDLE1BQU0sQ0FBQ1csUUFBUCxDQUFnQkYsT0FBaEIsQ0FEd0MsRUFFeENULE1BQU0sQ0FBQ1ksV0FBUCxDQUFtQkosSUFBbkIsQ0FGd0MsQ0FBMUM7RUFJQSxNQUFNSyxhQUFhLEdBQUdiLE1BQU0sQ0FBQ2MsTUFBUCxDQUFjSixJQUFkLENBQXRCO0VBQ0EsT0FBT0csYUFBUDtBQUNELENBVk07Ozs7QUFZUCxPQUFPLE1BQU1FLGFBQU4sU0FBNEJqQixVQUE1QixDQUF1QztFQVc1Q2tCLFdBQVcsQ0FDVEMsU0FEUyxFQUVUQyxNQUZTLEVBR1RDLEtBSFMsRUFJVEMsR0FKUyxFQUtUO0lBQ0EsTUFBTUgsU0FBTixFQUFpQkcsR0FBakI7SUFEQTtNQUFBO01BQUE7SUFBQTtJQUVBLGtEQUFhRixNQUFiO0lBQ0EsS0FBS0csS0FBTCxHQUFhLElBQUlwQixrQkFBSixDQUF1QixJQUF2Qiw4QkFBNkIsSUFBN0IsaUJBQXlDLEtBQUtxQixPQUE5QyxDQUFiO0lBQ0EsS0FBS0MsSUFBTCxHQUFZLElBQUlyQixpQkFBSixDQUFzQixJQUF0Qiw4QkFBNEIsSUFBNUIsaUJBQXdDLEtBQUtvQixPQUE3QyxDQUFaO0lBQ0EsS0FBS0UsR0FBTCxHQUFXLElBQUlyQixnQkFBSixDQUFxQmdCLEtBQXJCLEVBQTRCLElBQTVCLDhCQUFrQyxJQUFsQyxpQkFBOEMsS0FBS0csT0FBbkQsQ0FBWDtJQUNBLEtBQUtHLEVBQUwsR0FBVSxJQUFJbkIsZUFBSixDQUFvQixJQUFwQiw4QkFBMEIsSUFBMUIsaUJBQXNDLEtBQUtnQixPQUEzQyxDQUFWO0VBQ0Q7O0VBRVksSUFBVEksU0FBUyxHQUFXO0lBQ3RCLE9BQU8sZ0RBQVdBLFNBQWxCO0VBQ0Q7O0VBRVcsTUFBTkMsTUFBTSxDQUFDQyxTQUFELEVBQXVEO0lBQ2pFeEIsVUFBVSxDQUFDeUIsS0FBWDtJQUNBeEIsVUFBVSxDQUFDd0IsS0FBWDtJQUNBLE1BQU0sTUFBTUYsTUFBTixDQUFhQyxTQUFiLENBQU47RUFDRDs7QUFqQzJDIn0=
|