@secrecy/lib 1.0.0-dev.5 → 1.0.0-dev.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +1 -1
  2. package/{lib → dist}/BaseClient.d.ts +62 -73
  3. package/dist/BaseClient.js +1124 -0
  4. package/{lib → dist}/PopupTools.d.ts +1 -1
  5. package/dist/PopupTools.js +212 -0
  6. package/{lib → dist}/ZeusThunder.d.ts +0 -0
  7. package/dist/ZeusThunder.js +79 -0
  8. package/dist/cache.d.ts +6 -0
  9. package/dist/cache.js +4 -0
  10. package/dist/client/admin/index.d.ts +11 -0
  11. package/dist/client/admin/index.js +110 -0
  12. package/{lib → dist}/client/convert/file.d.ts +3 -3
  13. package/dist/client/convert/file.js +34 -0
  14. package/{lib → dist}/client/convert/mail.d.ts +0 -0
  15. package/dist/client/convert/mail.js +46 -0
  16. package/dist/client/convert/node.d.ts +9 -0
  17. package/dist/client/convert/node.js +102 -0
  18. package/{lib → dist}/client/helpers.d.ts +1 -1
  19. package/dist/client/helpers.js +114 -0
  20. package/dist/client/index.d.ts +163 -0
  21. package/dist/client/index.js +3209 -0
  22. package/{lib → dist}/client/storage.d.ts +0 -0
  23. package/dist/client/storage.js +12 -0
  24. package/dist/client/types/File.d.ts +14 -0
  25. package/dist/client/types/File.js +3 -0
  26. package/{lib → dist}/client/types/Inputs.d.ts +2 -7
  27. package/dist/client/types/Inputs.js +3 -0
  28. package/dist/client/types/Node.d.ts +56 -0
  29. package/dist/client/types/Node.js +3 -0
  30. package/dist/client/types/UserAppNotifications.d.ts +6 -0
  31. package/dist/client/types/UserAppNotifications.js +3 -0
  32. package/{lib → dist}/client/types/UserAppSettings.d.ts +0 -1
  33. package/dist/client/types/UserAppSettings.js +3 -0
  34. package/{lib → dist}/client/types/index.d.ts +8 -13
  35. package/dist/client/types/index.js +8 -0
  36. package/dist/client/types/selectors.d.ts +400 -0
  37. package/dist/client/types/selectors.js +130 -0
  38. package/{lib → dist}/crypto/file.d.ts +0 -0
  39. package/dist/crypto/file.js +210 -0
  40. package/{lib → dist}/crypto/index.d.ts +0 -0
  41. package/dist/crypto/index.js +47 -0
  42. package/dist/error.d.ts +30 -0
  43. package/dist/error.js +3 -0
  44. package/dist/index.d.ts +12 -0
  45. package/dist/index.js +10 -0
  46. package/{lib → dist}/minify/index.d.ts +0 -0
  47. package/dist/minify/index.js +28 -0
  48. package/{lib → dist}/minify/lz4.d.ts +0 -0
  49. package/dist/minify/lz4.js +627 -0
  50. package/{lib → dist}/sodium.d.ts +0 -0
  51. package/dist/sodium.js +6 -0
  52. package/{lib → dist}/utils/store-buddy.d.ts +0 -0
  53. package/dist/utils/store-buddy.js +65 -0
  54. package/{lib → dist}/utils/time.d.ts +0 -0
  55. package/dist/utils/time.js +14 -0
  56. package/{lib → dist/utils}/utils.d.ts +0 -0
  57. package/dist/utils/utils.js +57 -0
  58. package/{lib → dist}/worker/__mock__/sodium.worker.d.ts +0 -0
  59. package/dist/worker/__mock__/sodium.worker.js +49 -0
  60. package/{lib → dist}/worker/md5.d.ts +0 -0
  61. package/dist/worker/md5.js +25 -0
  62. package/dist/worker/sodium.d.ts +3 -0
  63. package/dist/worker/sodium.js +120 -0
  64. package/{lib → dist}/worker/workerCodes.d.ts +0 -0
  65. package/dist/worker/workerCodes.js +3 -0
  66. package/{lib → dist}/zeus/const.d.ts +5 -0
  67. package/dist/zeus/const.js +1234 -0
  68. package/dist/zeus/index.d.ts +5893 -0
  69. package/dist/zeus/index.js +681 -0
  70. package/package.json +58 -51
  71. package/lib/BaseClient.js +0 -1332
  72. package/lib/PopupTools.js +0 -213
  73. package/lib/ZeusThunder.js +0 -112
  74. package/lib/cache.d.ts +0 -7
  75. package/lib/cache.js +0 -5
  76. package/lib/client/convert/file.js +0 -39
  77. package/lib/client/convert/folder.d.ts +0 -8
  78. package/lib/client/convert/folder.js +0 -264
  79. package/lib/client/convert/mail.js +0 -46
  80. package/lib/client/convert/vFile.d.ts +0 -5
  81. package/lib/client/convert/vFile.js +0 -164
  82. package/lib/client/helpers.js +0 -116
  83. package/lib/client/index.d.ts +0 -167
  84. package/lib/client/index.js +0 -3699
  85. package/lib/client/storage.js +0 -12
  86. package/lib/client/types/File.d.ts +0 -21
  87. package/lib/client/types/File.js +0 -2
  88. package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
  89. package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
  90. package/lib/client/types/Folder.d.ts +0 -68
  91. package/lib/client/types/Folder.js +0 -7
  92. package/lib/client/types/Inputs.js +0 -2
  93. package/lib/client/types/UserAppSettings.js +0 -2
  94. package/lib/client/types/VFile.d.ts +0 -62
  95. package/lib/client/types/VFile.js +0 -4
  96. package/lib/client/types/index.js +0 -8
  97. package/lib/client/types/queries.d.ts +0 -535
  98. package/lib/client/types/queries.js +0 -192
  99. package/lib/crypto/file.js +0 -291
  100. package/lib/crypto/index.js +0 -37
  101. package/lib/index.d.ts +0 -11
  102. package/lib/index.js +0 -40
  103. package/lib/minify/index.js +0 -28
  104. package/lib/minify/lz4.js +0 -633
  105. package/lib/sodium.js +0 -28
  106. package/lib/utils/store-buddy.js +0 -69
  107. package/lib/utils/time.js +0 -22
  108. package/lib/utils.js +0 -188
  109. package/lib/worker/__mock__/sodium.worker.js +0 -57
  110. package/lib/worker/md5.js +0 -43
  111. package/lib/worker/sodium.d.ts +0 -3
  112. package/lib/worker/sodium.js +0 -141
  113. package/lib/worker/workerCodes.js +0 -3
  114. package/lib/zeus/const.js +0 -1609
  115. package/lib/zeus/index.d.ts +0 -26113
  116. package/lib/zeus/index.js +0 -552
@@ -0,0 +1,3209 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
3
+ import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
4
+
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
+ /* eslint-disable @typescript-eslint/naming-convention */
10
+ import ky from "ky";
11
+ import axios from "axios";
12
+ import { BaseClient } from "../BaseClient.js";
13
+ import { nodesCache, filesCache, usersCache } from "../cache.js";
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";
18
+ import { sodium } from "../sodium.js";
19
+ import { decryptCryptoBox, encryptCryptoBox } from "../crypto/index.js";
20
+ import { generate } from "shortid";
21
+ import { md5 } from "../worker/md5.js";
22
+ import { encrypt, decrypt } from "../worker/sodium.js";
23
+ import { chunks, concatenate, enumerate, promiseAllLimit } from "../utils/utils.js";
24
+ import { fileSelector, mailSelector, nodeFullSelector, nodeSelector } from "./types/selectors.js";
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) => {
33
+ const {
34
+ data
35
+ } = await encryptSecretstream(sodium.from_hex(nameKey), sodium.from_string(name));
36
+ const nameEncrypted = sodium.to_hex(data);
37
+ return nameEncrypted;
38
+ };
39
+
40
+ var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
41
+
42
+ export class SecrecyClient extends BaseClient {
43
+ constructor(uaSession, uaKeys, uaJwt, env) {
44
+ super(uaSession, env);
45
+ Object.defineProperty(this, _keys, {
46
+ writable: true,
47
+ value: void 0
48
+ });
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
+ _classPrivateFieldLooseBase(this, _keys)[_keys] = uaKeys;
149
+ }
150
+
151
+ get publicKey() {
152
+ return _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
153
+ }
154
+
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
+ async logout(sessionId) {
582
+ nodesCache.clear();
583
+ filesCache.clear();
584
+ await super.logout(sessionId);
585
+ }
586
+
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
+ cloudFileDaysForDelete: true,
2898
+ cloudFolderDaysForDelete: true,
2899
+ historyFileDaysForDelete: true,
2900
+ historyMaxFileCount: true
2901
+ }
2902
+ }
2903
+ }
2904
+ }]
2905
+ });
2906
+
2907
+ if (!user) {
2908
+ return null;
2909
+ }
2910
+
2911
+ if (user.__typename === "ErrorNotFound") {
2912
+ return user;
2913
+ }
2914
+
2915
+ if (!((_user$user = user.user) != null && _user$user.appSettings)) {
2916
+ return null;
2917
+ }
2918
+
2919
+ return {
2920
+ __typename: "SuccessResponse",
2921
+ data: user.user.appSettings
2922
+ };
2923
+ }
2924
+
2925
+ async getJwt() {
2926
+ if (this.jwtDecoded.exp && this.jwtDecoded.exp * 1000 < Date.now()) {
2927
+ return this.jwt;
2928
+ }
2929
+
2930
+ const {
2931
+ getJwt
2932
+ } = await this.client("query")({
2933
+ getJwt: [{
2934
+ includeEmail: !!this.jwtDecoded.email
2935
+ }, {
2936
+ "...on ErrorAccessDenied": {
2937
+ __typename: true,
2938
+ message: true
2939
+ },
2940
+ "...on JwtResponse": {
2941
+ __typename: true,
2942
+ jwt: true
2943
+ }
2944
+ }]
2945
+ });
2946
+
2947
+ if (!getJwt) {
2948
+ return this.jwt;
2949
+ }
2950
+
2951
+ if (getJwt.__typename === "ErrorAccessDenied") {
2952
+ throw new Error(getJwt.message);
2953
+ }
2954
+
2955
+ this.jwt = getJwt.jwt;
2956
+ this.jwtDecoded = decode(getJwt.jwt);
2957
+ const sessionStorage = getStorage(true);
2958
+ const localStorage = getStorage(false);
2959
+ const sessionJwt = sessionStorage.jwt.load();
2960
+ const localJwt = localStorage.jwt.load();
2961
+
2962
+ if (sessionJwt) {
2963
+ sessionStorage.jwt.save(getJwt.jwt);
2964
+ }
2965
+
2966
+ if (localJwt) {
2967
+ localStorage.jwt.save(getJwt.jwt);
2968
+ }
2969
+
2970
+ return getJwt.jwt;
2971
+ }
2972
+
2973
+ async updateAppSettings(settings) {
2974
+ const {
2975
+ updateAppSettings
2976
+ } = await this.client("mutation")({
2977
+ updateAppSettings: [settings, {
2978
+ "...on ErrorAccessDenied": {
2979
+ __typename: true,
2980
+ message: true
2981
+ },
2982
+ "...on ErrorBasic": {
2983
+ __typename: true,
2984
+ message: true
2985
+ },
2986
+ "...on UpdateAppSettingsResponse": {
2987
+ __typename: true,
2988
+ updateAppSettings: {
2989
+ cloudFileDaysForDelete: true,
2990
+ cloudFolderDaysForDelete: true,
2991
+ historyFileDaysForDelete: true,
2992
+ historyMaxFileCount: true
2993
+ }
2994
+ }
2995
+ }]
2996
+ });
2997
+
2998
+ if (!updateAppSettings) {
2999
+ return null;
3000
+ }
3001
+
3002
+ if (updateAppSettings.__typename === "ErrorAccessDenied") {
3003
+ return updateAppSettings;
3004
+ }
3005
+
3006
+ if (updateAppSettings.__typename === "ErrorBasic") {
3007
+ return updateAppSettings;
3008
+ }
3009
+
3010
+ return {
3011
+ __typename: "SuccessResponse",
3012
+ data: updateAppSettings.updateAppSettings
3013
+ };
3014
+ }
3015
+
3016
+ async receivedMails() {
3017
+ const {
3018
+ user
3019
+ } = await this.client("query", {
3020
+ scalars: {
3021
+ DateTime: {
3022
+ decode: e => new Date(e),
3023
+ encode: e => e.toISOString()
3024
+ }
3025
+ }
3026
+ })({
3027
+ user: [{}, {
3028
+ "...on ErrorNotFound": {
3029
+ __typename: true,
3030
+ message: true
3031
+ },
3032
+ "...on UserResponse": {
3033
+ __typename: true,
3034
+ user: {
3035
+ receivedMails: mailSelector
3036
+ }
3037
+ }
3038
+ }]
3039
+ });
3040
+
3041
+ if (!user) {
3042
+ return null;
3043
+ }
3044
+
3045
+ if (user.__typename === "ErrorNotFound") {
3046
+ return user;
3047
+ }
3048
+
3049
+ if (!user.user) {
3050
+ return null;
3051
+ } // TODO get actual mails on this app only
3052
+
3053
+
3054
+ const receivedMails = new Array();
3055
+
3056
+ for (const m of user.user.receivedMails) {
3057
+ const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3058
+
3059
+ if (mail) {
3060
+ receivedMails.push(mail);
3061
+ }
3062
+ }
3063
+
3064
+ return {
3065
+ __typename: "SuccessResponse",
3066
+ data: receivedMails
3067
+ };
3068
+ }
3069
+
3070
+ async sentMails() {
3071
+ const {
3072
+ user
3073
+ } = await this.client("query", {
3074
+ scalars: {
3075
+ DateTime: {
3076
+ decode: e => new Date(e),
3077
+ encode: e => e.toISOString()
3078
+ }
3079
+ }
3080
+ })({
3081
+ user: [{}, {
3082
+ "...on ErrorNotFound": {
3083
+ __typename: true,
3084
+ message: true
3085
+ },
3086
+ "...on UserResponse": {
3087
+ __typename: true,
3088
+ user: {
3089
+ sentMails: mailSelector
3090
+ }
3091
+ }
3092
+ }]
3093
+ });
3094
+
3095
+ if (!user) {
3096
+ return null;
3097
+ }
3098
+
3099
+ if (user.__typename === "ErrorNotFound") {
3100
+ return user;
3101
+ }
3102
+
3103
+ if (!user.user) {
3104
+ return null;
3105
+ } // TODO get actual mails on this app only
3106
+
3107
+
3108
+ const sentMails = new Array();
3109
+
3110
+ for (const m of user.user.sentMails) {
3111
+ const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3112
+
3113
+ if (mail) {
3114
+ sentMails.push(mail);
3115
+ }
3116
+ }
3117
+
3118
+ return {
3119
+ __typename: "SuccessResponse",
3120
+ data: sentMails
3121
+ };
3122
+ }
3123
+
3124
+ async draftMails() {
3125
+ const {
3126
+ user
3127
+ } = await this.client("query", {
3128
+ scalars: {
3129
+ DateTime: {
3130
+ decode: e => new Date(e),
3131
+ encode: e => e.toISOString()
3132
+ }
3133
+ }
3134
+ })({
3135
+ user: [{}, {
3136
+ "...on ErrorNotFound": {
3137
+ __typename: true,
3138
+ message: true
3139
+ },
3140
+ "...on UserResponse": {
3141
+ __typename: true,
3142
+ user: {
3143
+ draftMails: mailSelector
3144
+ }
3145
+ }
3146
+ }]
3147
+ });
3148
+
3149
+ if (!user) {
3150
+ return null;
3151
+ }
3152
+
3153
+ if (user.__typename === "ErrorNotFound") {
3154
+ return user;
3155
+ }
3156
+
3157
+ if (!user.user) {
3158
+ return null;
3159
+ } // TODO get actual mails on this app only
3160
+
3161
+
3162
+ const draftMails = new Array();
3163
+
3164
+ for (const m of user.user.draftMails) {
3165
+ const draft = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
3166
+
3167
+ if (draft) {
3168
+ draftMails.push(draft);
3169
+ }
3170
+ }
3171
+
3172
+ return {
3173
+ __typename: "SuccessResponse",
3174
+ data: draftMails
3175
+ };
3176
+ }
3177
+
3178
+ async unreadReceivedMailsCount() {
3179
+ const {
3180
+ unreadReceivedMailsCount
3181
+ } = await this.client("query")({
3182
+ unreadReceivedMailsCount: {
3183
+ "...on ErrorAccessDenied": {
3184
+ __typename: true,
3185
+ message: true
3186
+ },
3187
+ "...on UnreadReceivedMailsCountResponse": {
3188
+ __typename: true,
3189
+ count: true
3190
+ }
3191
+ }
3192
+ });
3193
+
3194
+ if (!unreadReceivedMailsCount) {
3195
+ return null;
3196
+ }
3197
+
3198
+ if (unreadReceivedMailsCount.__typename === "ErrorAccessDenied") {
3199
+ return unreadReceivedMailsCount;
3200
+ }
3201
+
3202
+ return {
3203
+ __typename: "SuccessResponse",
3204
+ data: unreadReceivedMailsCount.count
3205
+ };
3206
+ }
3207
+
3208
+ }
3209
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJreSIsImF4aW9zIiwiQmFzZUNsaWVudCIsIm5vZGVzQ2FjaGUiLCJmaWxlc0NhY2hlIiwidXNlcnNDYWNoZSIsInNlY3JldHN0cmVhbUtleWdlbiIsImVuY3J5cHRTZWNyZXRzdHJlYW0iLCJjb21wcmVzcyIsInVuY29tcHJlc3MiLCJncWxOb2RlRnVsbFRvSW50ZXJuYWxGdWxsIiwiZ3FsTm9kZVRvRXh0ZXJuYWwiLCJncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsIiwiaW50ZXJuYWxOb2RlVG9Ob2RlIiwiZ3FsRmlsZVRvRXh0ZXJuYWwiLCJzb2RpdW0iLCJkZWNyeXB0Q3J5cHRvQm94IiwiZW5jcnlwdENyeXB0b0JveCIsImdlbmVyYXRlIiwibWQ1IiwiZW5jcnlwdCIsImRlY3J5cHQiLCJjaHVua3MiLCJjb25jYXRlbmF0ZSIsImVudW1lcmF0ZSIsInByb21pc2VBbGxMaW1pdCIsImZpbGVTZWxlY3RvciIsIm1haWxTZWxlY3RvciIsIm5vZGVGdWxsU2VsZWN0b3IiLCJub2RlU2VsZWN0b3IiLCJjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbCIsImdldFN0b3JhZ2UiLCJkZWNvZGUiLCJzZXJpYWxpemUiLCJlbmNyeXB0TmFtZSIsIm5hbWUiLCJuYW1lS2V5IiwiZGF0YSIsImZyb21faGV4IiwiZnJvbV9zdHJpbmciLCJuYW1lRW5jcnlwdGVkIiwidG9faGV4IiwiU2VjcmVjeUNsaWVudCIsImNvbnN0cnVjdG9yIiwidWFTZXNzaW9uIiwidWFLZXlzIiwidWFKd3QiLCJlbnYiLCJwZXJOb2RlIiwibm9kZUlkIiwicHVibGljS2V5Iiwibm9kZSIsImdldCIsImlkIiwiYWNjZXNzIiwicHJpdmF0ZUtleSIsImZpbGVzIiwiaGlzdG9yeSIsIm1hcCIsImYiLCJrZXkiLCJfZWFjaFVzZXIiLCJzdWJqZWN0IiwiYm9keSIsImlkT3JNYWlsIiwidSIsInJlcSIsInVzZXIiLCJ1c2VySWQiLCJ3aXRoUHVibGljS2V5IiwiX190eXBlbmFtZSIsIkVycm9yIiwicmVjaXBpZW50c0ZpbGVzIiwiQXJyYXkiLCJmaWxlSW5IaXN0b3J5IiwiZmlsZSIsInB1c2giLCJmaWxlS2V5IiwicmVjaXBpZW50SWQiLCJqd3QiLCJqd3REZWNvZGVkIiwiYXBwVXNlcklkIiwic3ViIiwiYWRkRmlsZVRvSGlzdG9yeSIsImZpbGVJZCIsImNsaWVudCIsIm1lc3NhZ2UiLCJmaW5kIiwidXNlcnMiLCJmaWx0ZXIiLCJpbnB1dCIsInNoYXJlRmlsZUluSGlzdG9yeSIsInJlc3VsdCIsInVwbG9hZEZpbGUiLCJlbmNyeXB0UHJvZ3Jlc3MiLCJ1cGxvYWRQcm9ncmVzcyIsInNpZ25hbCIsImZpbGVCdWZmZXIiLCJGaWxlIiwiVWludDhBcnJheSIsImFycmF5QnVmZmVyIiwiY29tcHJlc3NlZCIsImVuY3J5cHRlZEZpbGUiLCJtZDVGaWxlIiwibWQ1RW5jcnlwdGVkIiwiZW5jcnlwdGVkRmlsZUtleSIsInNjYWxhcnMiLCJKc29uIiwiZW5jb2RlIiwiZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZSIsIkRhdGVUaW1lIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiQmlnSW50IiwidG9TdHJpbmciLCJmaWxlU2l6ZSIsImJ5dGVMZW5ndGgiLCJmaWxlU2l6ZUJlZm9yZSIsImZpbGVQYXJ0U2l6ZSIsInBhcnRzIiwiZmllbGRzIiwib3JkZXIiLCJ1cmwiLCJ0b3RhbCIsImN1cnJlbnQiLCJwZXJjZW50IiwibGVuZ3RoIiwidXBsb2FkUGFydEVuZGVkIiwidXBsb2FkRmlsZVBhcnRFbmQiLCJ1cGxvYWRFbmRlZCIsInVwbG9hZEZpbGVFbmQiLCJjaHVua1BhcnRzIiwiaW5kZXgiLCJjaHVuayIsIk51bWJlciIsInByb2dyZXNzUGFydHMiLCJvblByb2dyZXNzIiwicGFydCIsInByb2dyZXNzRXZlbnQiLCJPYmplY3QiLCJ2YWx1ZXMiLCJyZWR1Y2UiLCJwcnYiLCJjdXIiLCJsb2FkZWQiLCJieVBhcnQiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwicCIsInZhbHVlIiwiZW50cmllcyIsImFwcGVuZCIsIkJsb2IiLCJwb3N0Iiwib25VcGxvYWRQcm9ncmVzcyIsInVwbG9hZEZpbGVJbkNsb3VkIiwic2F2ZUluQ2xvdWQiLCJsb2dvdXQiLCJzZXNzaW9uSWQiLCJjbGVhciIsImNyZWF0ZUZvbGRlciIsInBhcmVudEZvbGRlcklkIiwiZW5jcnlwdGVkTmFtZSIsImVuY3J5cHRlZEtleSIsImZvbGRlciIsInBhcmVudCIsIlByb21pc2UiLCJhbGwiLCJyaWdodHMiLCJzaGFyZU5vZGUiLCJkZWxldGVkIiwibWFpbCIsImRlbGV0ZWROb2RlcyIsIm5vZGVzIiwic2hhcmVkTm9kZXMiLCJub2Rlc1NoYXJlZFdpdGhNZSIsInR5cGUiLCJkZWxldGVOb2RlU2hhcmluZyIsImR1cGxpY2F0ZU5vZGUiLCJmb2xkZXJJZCIsImN1c3RvbU5hbWUiLCJkZWxldGVOb2RlQ2xvdWRUcmFzaCIsImlkcyIsInNoYXJlTm9kZXMiLCJzaGFyZU5vZGVGaW5pc2giLCJ1cGRhdGVOb2RlIiwiaXNGYXZvcml0ZSIsImRlbGV0ZWRBdCIsImRlbGV0ZWRNYWlscyIsIm1haWxUeXBlIiwibWFpbHMiLCJtIiwidXBkYXRlQXBwTm90aWZpY2F0aW9ucyIsIm5vdGlmaWNhdGlvbnMiLCJlbmFibGVBbGwiLCJjbG91ZCIsImRpc2FibGVBbGxVbnRpbCIsImFwcE5vdGlmaWNhdGlvbnMiLCJjcmVhdGVNYWlsIiwiY3VzdG9tTWVzc2FnZSIsImNyZWF0ZURyYWZ0TWFpbCIsInNlbmREcmFmdE1haWwiLCJtYWlsSW50ZWdyaXR5SWQiLCJ3YWl0aW5nUmVjZWl2ZWRNYWlscyIsImRhdGUiLCJhdHRhY2htZW50c0NvdW50Iiwic2VuZGVyIiwiZmlyc3RuYW1lIiwibGFzdG5hbWUiLCJlbWFpbCIsInJlY2lwaWVudHMiLCJ0ZW1wb3JhcnlSZWNpcGllbnRzIiwidXBkYXRlRHJhZnRNYWlsIiwiZHJhZnRJZCIsInJlY2lwaWVudHNJZHMiLCJyZXBseVRvIiwiZHJhZnRzIiwiZHJhZnRNYWlscyIsImRyYWZ0IiwiZCIsImhhc2hLZXkiLCJoYXNoIiwicmFuZG9tYnl0ZXNfYnVmIiwiY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTIiwiY3J5cHRvX2dlbmVyaWNoYXNoIiwiY3J5cHRvX2dlbmVyaWNoYXNoX0JZVEVTIiwic2VuZGVyRmlsZXMiLCJkZWxldGVEcmFmdE1haWwiLCJkZWxldGVNYWlsVHJhc2giLCJlbXB0eU1haWxUcmFzaCIsImVtcHR5Q2xvdWRUcmFzaCIsInJlY292ZXJOb2RlIiwicmVjb3Zlck1haWwiLCJtYWlsSWQiLCJkZWxldGVGaWxlIiwiZGVsZXRlTm9kZSIsIm1vdmVOb2RlcyIsIm5vZGVJZHMiLCJwYXJlbnROb2RlSWQiLCJkZWxldGVNYWlsIiwiaGFzIiwicmVjZWl2ZWRNYWlscyIsInNvbWUiLCJmaWxlTWFpbCIsImVuY3J5cHRlZE5hbWVLZXkiLCJmaWxlbmFtZSIsIm1lIiwiaW5jbHVkZXMiLCJvdGhlcnMiLCJkYkdldCIsImZpZWxkIiwianNvbiIsInJlcyIsImRiU2V0IiwiZGJTZWFyY2giLCJzZWFyY2giLCJkcmFmdE1haWxJZCIsInNlbmRXYWl0aW5nRW1haWxzIiwic2VudE1haWxzIiwiZmlsdGVyZWQiLCJzZW5kT25lTWFpbCIsInJlY2lwaWVudCIsImZpbGVDb250ZW50Iiwib25Eb3dubG9hZFByb2dyZXNzIiwicHJvZ3Jlc3NEZWNyeXB0IiwiQnl0ZXMiLCJjb25zb2xlIiwibG9nIiwiZnJvbSIsImNvbnRlbnRVcmwiLCJ0b3RhbFNpemUiLCJjb250ZW50IiwibWF5YmVQYXJ0cyIsIm1heWJlQ29udGVudCIsInNlbmRlclB1YmxpY0tleSIsInRyYW5zZmVycmVkQnl0ZXMiLCJ0b3RhbEJ5dGVzIiwiZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyIsImZpbGVQYXJ0cyIsImJ1ZiIsInRpbWVvdXQiLCJwciIsIm1kNVBhcnQiLCJzb3J0IiwiYSIsImIiLCJmaW5hbGl6ZSIsImVuY3J5cHRlZENvbnRlbnQiLCJzcmMiLCJtZDVDb250ZW50IiwicmVhZE1haWwiLCJ1bnJlYWRNYWlsIiwiYXBwU2V0dGluZ3MiLCJjbG91ZEZpbGVEYXlzRm9yRGVsZXRlIiwiY2xvdWRGb2xkZXJEYXlzRm9yRGVsZXRlIiwiaGlzdG9yeUZpbGVEYXlzRm9yRGVsZXRlIiwiaGlzdG9yeU1heEZpbGVDb3VudCIsImdldEp3dCIsImV4cCIsIm5vdyIsImluY2x1ZGVFbWFpbCIsInNlc3Npb25TdG9yYWdlIiwibG9jYWxTdG9yYWdlIiwic2Vzc2lvbkp3dCIsImxvYWQiLCJsb2NhbEp3dCIsInNhdmUiLCJ1cGRhdGVBcHBTZXR0aW5ncyIsInNldHRpbmdzIiwidW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50IiwiY291bnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuaW1wb3J0IHR5cGUgeyBNYWlsVHlwZSwgTm9kZVR5cGUgfSBmcm9tIFwiLi8uLi96ZXVzL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IERvd25sb2FkUHJvZ3Jlc3MgfSBmcm9tIFwia3lcIjtcbmltcG9ydCBreSBmcm9tIFwia3lcIjtcbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB0eXBlIHsgU3VjY2Vzc1Jlc3BvbnNlLCBVc2VyRGF0YSB9IGZyb20gXCIuLi9CYXNlQ2xpZW50LmpzXCI7XG5pbXBvcnQgeyBCYXNlQ2xpZW50IH0gZnJvbSBcIi4uL0Jhc2VDbGllbnQuanNcIjtcbmltcG9ydCB7IG5vZGVzQ2FjaGUsIGZpbGVzQ2FjaGUsIHVzZXJzQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGUuanNcIjtcbmltcG9ydCB0eXBlIHsgUHJvZ3Jlc3MgfSBmcm9tIFwiLi4vY3J5cHRvL2ZpbGUuanNcIjtcbmltcG9ydCB7IHNlY3JldHN0cmVhbUtleWdlbiwgZW5jcnlwdFNlY3JldHN0cmVhbSB9IGZyb20gXCIuLi9jcnlwdG8vZmlsZS5qc1wiO1xuaW1wb3J0IHsgY29tcHJlc3MsIHVuY29tcHJlc3MgfSBmcm9tIFwiLi4vbWluaWZ5L2luZGV4LmpzXCI7XG5pbXBvcnQge1xuICBncWxOb2RlRnVsbFRvSW50ZXJuYWxGdWxsLFxuICBncWxOb2RlVG9FeHRlcm5hbCxcbiAgZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbCxcbiAgaW50ZXJuYWxOb2RlVG9Ob2RlXG59IGZyb20gXCIuL2NvbnZlcnQvbm9kZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBNYWlsRmlsZUlucHV0LFxuICBSZWNlaXZlZE1haWwsXG4gIFNlbnRNYWlsLFxuICBOb2RlLFxuICBOb2RlRnVsbCxcbiAgVXNlckFwcFNldHRpbmdzLFxuICBVc2VyQXBwTm90aWZpY2F0aW9ucyxcbiAgRmlsZU1ldGFkYXRhIGFzIFNlY3JlY3lGaWxlLFxuICBXYWl0aW5nUmVjZWl2ZWRNYWlsLFxuICBEcmFmdE1haWwsXG4gIE1haWxSZWNpcGllbnRJbnB1dCxcbiAgU2hhcmVOb2Rlc0lucHV0LFxuICBOYW1lS2V5SW5wdXQsXG4gIE1haWwsXG4gIFNoYXJlRmlsZUluSGlzdG9yeUlucHV0LFxuICBGaWxlUGFydFJlc3BvbnNlLFxuICBGaWxlQ29udGVudFBhcnRcbn0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IGdxbEZpbGVUb0V4dGVybmFsIH0gZnJvbSBcIi4vY29udmVydC9maWxlLmpzXCI7XG5pbXBvcnQgeyBzb2RpdW0gfSBmcm9tIFwiLi4vc29kaXVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleVBhaXIgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWNyeXB0Q3J5cHRvQm94LCBlbmNyeXB0Q3J5cHRvQm94IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZWNyZWN5RW52IH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2hvcnRpZFwiO1xuaW1wb3J0IHsgbWQ1IH0gZnJvbSBcIi4uL3dvcmtlci9tZDUuanNcIjtcbmltcG9ydCB7IGVuY3J5cHQsIGRlY3J5cHQgfSBmcm9tIFwiLi4vd29ya2VyL3NvZGl1bS5qc1wiO1xuaW1wb3J0IHtcbiAgY2h1bmtzLFxuICBjb25jYXRlbmF0ZSxcbiAgZW51bWVyYXRlLFxuICBwcm9taXNlQWxsTGltaXRcbn0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBmaWxlU2VsZWN0b3IsXG4gIG1haWxTZWxlY3RvcixcbiAgbm9kZUZ1bGxTZWxlY3RvcixcbiAgbm9kZVNlbGVjdG9yXG59IGZyb20gXCIuL3R5cGVzL3NlbGVjdG9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSaWdodHMgfSBmcm9tIFwiLi4vemV1cy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwgfSBmcm9tIFwiLi9jb252ZXJ0L21haWwuanNcIjtcbmltcG9ydCB0eXBlIHsgSnd0UGF5bG9hZCB9IGZyb20gXCJqc29ud2VidG9rZW5cIjtcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tIFwianNvbndlYnRva2VuXCI7XG4vLyBpbXBvcnQgeyBtZDUgfSBmcm9tIFwiLi4vd29ya2VyL2luZGV4LmpzXCI7XG4vLyBpbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgb2YgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFcnJvckFjY2Vzc0RlbmllZCxcbiAgRXJyb3JOb3RGb3VuZCxcbiAgRXJyb3JCYXNpYyxcbiAgRXJyb3JOb3RFeGlzdCxcbiAgRXJyb3JMaW1pdFxufSBmcm9tIFwiLi4vZXJyb3IuanNcIjtcbmltcG9ydCB0eXBlIHsgRG9jdW1lbnQgfSBmcm9tIFwiYnNvblwiO1xuaW1wb3J0IHsgc2VyaWFsaXplIH0gZnJvbSBcImJzb25cIjtcblxuZXhwb3J0IHR5cGUgTmV3TWFpbCA9IHtcbiAgYm9keTogc3RyaW5nO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGZpbGVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W107XG4gIHJlY2lwaWVudHNJZHM6IHN0cmluZ1tdO1xuICByZXBseVRvPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKHByb2dyZXNzOiBQcm9ncmVzcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuY29uc3QgZW5jcnlwdE5hbWUgPSBhc3luYyAobmFtZTogc3RyaW5nLCBuYW1lS2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGVuY3J5cHRTZWNyZXRzdHJlYW0oXG4gICAgc29kaXVtLmZyb21faGV4KG5hbWVLZXkpLFxuICAgIHNvZGl1bS5mcm9tX3N0cmluZyhuYW1lKVxuICApO1xuICBjb25zdCBuYW1lRW5jcnlwdGVkID0gc29kaXVtLnRvX2hleChkYXRhKTtcbiAgcmV0dXJuIG5hbWVFbmNyeXB0ZWQ7XG59O1xuXG5leHBvcnQgY2xhc3MgU2VjcmVjeUNsaWVudCBleHRlbmRzIEJhc2VDbGllbnQge1xuICBqd3Q6IHN0cmluZztcblxuICBqd3REZWNvZGVkOiBKd3RQYXlsb2FkO1xuXG4gICNrZXlzOiBLZXlQYWlyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHVhU2Vzc2lvbjogc3RyaW5nLFxuICAgIHVhS2V5czogS2V5UGFpcixcbiAgICB1YUp3dDogc3RyaW5nLFxuICAgIGVudjogU2VjcmVjeUVudlxuICApIHtcbiAgICBzdXBlcih1YVNlc3Npb24sIGVudik7XG4gICAgdGhpcy5qd3QgPSB1YUp3dDtcbiAgICB0aGlzLmp3dERlY29kZWQgPSBkZWNvZGUodWFKd3QpIGFzIEp3dFBheWxvYWQ7XG4gICAgdGhpcy4ja2V5cyA9IHVhS2V5cztcbiAgfVxuXG4gIGdldCBwdWJsaWNLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4ja2V5cy5wdWJsaWNLZXk7XG4gIH1cblxuICBnZXQgYXBwVXNlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuand0RGVjb2RlZC5zdWIgPz8gXCJcIjtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpbGVUb0hpc3Rvcnkoe1xuICAgIGZpbGVJZCxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgYWRkRmlsZVRvSGlzdG9yeSB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJtdXRhdGlvblwiKSh7XG4gICAgICBhZGRGaWxlVG9IaXN0b3J5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQWRkRmlsZVRvSGlzdG9yeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBhZGRGaWxlVG9IaXN0b3J5OiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZEZpbGVUb0hpc3RvcnkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChhZGRGaWxlVG9IaXN0b3J5Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGFkZEZpbGVUb0hpc3Rvcnk7XG4gICAgfVxuXG4gICAgaWYgKGFkZEZpbGVUb0hpc3RvcnkuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBhZGRGaWxlVG9IaXN0b3J5O1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBncWxOb2RlRnVsbFRvSW50ZXJuYWxGdWxsKFxuICAgICAgYWRkRmlsZVRvSGlzdG9yeS5hZGRGaWxlVG9IaXN0b3J5LFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG4gICAgY29uc3QgZmlsZSA9IG5vZGUuaGlzdG9yeS5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgY29uc3QgdXNlcnMgPSBub2RlLnVzZXJzLmZpbHRlcihcbiAgICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgIT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgICApO1xuICAgICAgY29uc3QgaW5wdXQ6IFNoYXJlRmlsZUluSGlzdG9yeUlucHV0ID0ge1xuICAgICAgICBmaWxlSWQ6IGZpbGUuaWQsXG4gICAgICAgIHVzZXJzOiB1c2Vycy5tYXAoKFt1XSkgPT4gKHtcbiAgICAgICAgICBpZDogdS5pZCxcbiAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZmlsZS5rZXkpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9KSlcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgICBzaGFyZUZpbGVJbkhpc3Rvcnk6IFtcbiAgICAgICAgICB7IGlucHV0LCBub2RlSWQgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIFNoYXJlRmlsZUluSGlzdG9yeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgc2hhcmVGaWxlSW5IaXN0b3J5OiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gaW50ZXJuYWxOb2RlVG9Ob2RlKG5vZGUpO1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGUoe1xuICAgIGZpbGUsXG4gICAgZW5jcnlwdFByb2dyZXNzLFxuICAgIHVwbG9hZFByb2dyZXNzLFxuICAgIHNpZ25hbFxuICB9OiB7XG4gICAgZmlsZTogZ2xvYmFsVGhpcy5GaWxlIHwgVWludDhBcnJheTtcbiAgICBlbmNyeXB0UHJvZ3Jlc3M/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+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIikoe1xuICAgICAgdXNlcjogW1xuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVc2VyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgYXBwU2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgICBjbG91ZEZpbGVEYXlzRm9yRGVsZXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNsb3VkRm9sZGVyRGF5c0ZvckRlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBoaXN0b3J5RmlsZURheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgICAgICAgaGlzdG9yeU1heEZpbGVDb3VudDogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXIudXNlcj8uYXBwU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdXNlci51c2VyLmFwcFNldHRpbmdzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEp3dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmp3dERlY29kZWQuZXhwICYmIHRoaXMuand0RGVjb2RlZC5leHAgKiAxMDAwIDwgRGF0ZS5ub3coKSkge1xuICAgICAgcmV0dXJuIHRoaXMuand0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ2V0Snd0IH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIpKHtcbiAgICAgIGdldEp3dDogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5jbHVkZUVtYWlsOiAhIXRoaXMuand0RGVjb2RlZC5lbWFpbFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBKd3RSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgand0OiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWdldEp3dCkge1xuICAgICAgcmV0dXJuIHRoaXMuand0O1xuICAgIH1cblxuICAgIGlmIChnZXRKd3QuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZ2V0Snd0Lm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRoaXMuand0ID0gZ2V0Snd0Lmp3dDtcbiAgICB0aGlzLmp3dERlY29kZWQgPSBkZWNvZGUoZ2V0Snd0Lmp3dCkgYXMgSnd0UGF5bG9hZDtcblxuICAgIGNvbnN0IHNlc3Npb25TdG9yYWdlID0gZ2V0U3RvcmFnZSh0cnVlKTtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBnZXRTdG9yYWdlKGZhbHNlKTtcblxuICAgIGNvbnN0IHNlc3Npb25Kd3QgPSBzZXNzaW9uU3RvcmFnZS5qd3QubG9hZCgpO1xuICAgIGNvbnN0IGxvY2FsSnd0ID0gbG9jYWxTdG9yYWdlLmp3dC5sb2FkKCk7XG5cbiAgICBpZiAoc2Vzc2lvbkp3dCkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuand0LnNhdmUoZ2V0Snd0Lmp3dCk7XG4gICAgfVxuXG4gICAgaWYgKGxvY2FsSnd0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuand0LnNhdmUoZ2V0Snd0Lmp3dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldEp3dC5qd3Q7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBcHBTZXR0aW5ncyhcbiAgICBzZXR0aW5nczogUGFydGlhbDxVc2VyQXBwU2V0dGluZ3M+XG4gICk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFVzZXJBcHBTZXR0aW5ncz4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgdXBkYXRlQXBwU2V0dGluZ3MgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwibXV0YXRpb25cIikoe1xuICAgICAgdXBkYXRlQXBwU2V0dGluZ3M6IFtcbiAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBkYXRlQXBwU2V0dGluZ3NSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXBkYXRlQXBwU2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgY2xvdWRGaWxlRGF5c0ZvckRlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgY2xvdWRGb2xkZXJEYXlzRm9yRGVsZXRlOiB0cnVlLFxuICAgICAgICAgICAgICBoaXN0b3J5RmlsZURheXNGb3JEZWxldGU6IHRydWUsXG4gICAgICAgICAgICAgIGhpc3RvcnlNYXhGaWxlQ291bnQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXBkYXRlQXBwU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVBcHBTZXR0aW5ncy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVBcHBTZXR0aW5ncztcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlQXBwU2V0dGluZ3MuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVBcHBTZXR0aW5ncztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHVwZGF0ZUFwcFNldHRpbmdzLnVwZGF0ZUFwcFNldHRpbmdzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlY2VpdmVkTWFpbHMoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8UmVjZWl2ZWRNYWlsW10+IHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1c2VyIH0gPSBhd2FpdCB0aGlzLmNsaWVudChcInF1ZXJ5XCIsIHtcbiAgICAgIHNjYWxhcnM6IHtcbiAgICAgICAgRGF0ZVRpbWU6IHtcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBuZXcgRGF0ZShlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgdXNlcjogW1xuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVc2VyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgcmVjZWl2ZWRNYWlsczogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXIudXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVE9ETyBnZXQgYWN0dWFsIG1haWxzIG9uIHRoaXMgYXBwIG9ubHlcblxuICAgIGNvbnN0IHJlY2VpdmVkTWFpbHMgPSBuZXcgQXJyYXk8UmVjZWl2ZWRNYWlsPigpO1xuXG4gICAgZm9yIChjb25zdCBtIG9mIHVzZXIudXNlci5yZWNlaXZlZE1haWxzKSB7XG4gICAgICBjb25zdCBtYWlsID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobSwgdGhpcy4ja2V5cyk7XG4gICAgICBpZiAobWFpbCkge1xuICAgICAgICByZWNlaXZlZE1haWxzLnB1c2gobWFpbCBhcyBSZWNlaXZlZE1haWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVjZWl2ZWRNYWlsc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBzZW50TWFpbHMoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8U2VudE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBzZW50TWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCBzZW50TWFpbHMgPSBuZXcgQXJyYXk8U2VudE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgdXNlci51c2VyLnNlbnRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgc2VudE1haWxzLnB1c2gobWFpbCBhcyBTZW50TWFpbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBzZW50TWFpbHNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZHJhZnRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxEcmFmdE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuY2xpZW50KFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBkcmFmdE1haWxzOiBtYWlsU2VsZWN0b3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVzZXIuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEZvdW5kXCIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmICghdXNlci51c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUT0RPIGdldCBhY3R1YWwgbWFpbHMgb24gdGhpcyBhcHAgb25seVxuXG4gICAgY29uc3QgZHJhZnRNYWlscyA9IG5ldyBBcnJheTxEcmFmdE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgdXNlci51c2VyLmRyYWZ0TWFpbHMpIHtcbiAgICAgIGNvbnN0IGRyYWZ0ID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobSwgdGhpcy4ja2V5cykgYXMgRHJhZnRNYWlsO1xuICAgICAgaWYgKGRyYWZ0KSB7XG4gICAgICAgIGRyYWZ0TWFpbHMucHVzaChkcmFmdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkcmFmdE1haWxzXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyTm9kZSA9IGFzeW5jIChcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBwdWJsaWNLZXk6IHN0cmluZ1xuICApOiBQcm9taXNlPE5hbWVLZXlJbnB1dCB8IG51bGw+ID0+IHtcbiAgICBsZXQgbm9kZSA9IG5vZGVzQ2FjaGUuZ2V0KG5vZGVJZCk7XG5cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubm9kZSh7IGlkOiBub2RlSWQgfSk7XG4gICAgICBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcblxuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWVLZXkgPSBub2RlLmFjY2Vzcz8ubmFtZUtleTtcblxuICAgIGlmICghbmFtZUtleSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBub2RlLmlkLFxuICAgICAgbmFtZUtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgobmFtZUtleSksXG4gICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgZmlsZXM6XG4gICAgICAgIFwiaGlzdG9yeVwiIGluIG5vZGVcbiAgICAgICAgICA/IG5vZGUuaGlzdG9yeS5tYXAoZiA9PiAoe1xuICAgICAgICAgICAgICBpZDogZi5pZCxcbiAgICAgICAgICAgICAga2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZi5rZXkpLFxuICAgICAgICAgICAgICAgICAgcHVibGljS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICA6IFtdXG4gICAgfTtcbiAgfTtcblxuICBhc3luYyB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQoKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8bnVtYmVyPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVucmVhZFJlY2VpdmVkTWFpbHNDb3VudCB9ID0gYXdhaXQgdGhpcy5jbGllbnQoXCJxdWVyeVwiKSh7XG4gICAgICB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQ6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gVW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50UmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgY291bnQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCF1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50LmNvdW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VhY2hVc2VyID0gYXN5bmMgKFxuICAgIGZpbGVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10sXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBpZE9yTWFpbDogc3RyaW5nXG4gICk6IFByb21pc2U8TWFpbFJlY2lwaWVudElucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCB1ID0gdXNlcnNDYWNoZS5nZXQoaWRPck1haWwpO1xuXG4gICAgaWYgKCF1IHx8ICEoXCJwdWJsaWNLZXlcIiBpbiB1KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVxID0gYXdhaXQgdGhpcy51c2VyKHtcbiAgICAgICAgICB1c2VySWQ6IGlkT3JNYWlsLFxuICAgICAgICAgIHdpdGhQdWJsaWNLZXk6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVxKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcS5fX3R5cGVuYW1lICE9PSBcIlN1Y2Nlc3NSZXNwb25zZVwiKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdSA9IHJlcS5kYXRhO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCEoXCJwdWJsaWNLZXlcIiBpbiB1KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2VyICR7aWRPck1haWx9IGhhdmUgbm8gcHVibGljIGtleWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudHNGaWxlcyA9IG5ldyBBcnJheTxNYWlsRmlsZUlucHV0PigpO1xuXG4gICAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgICBsZXQgZmlsZUluSGlzdG9yeSA9IGZpbGVzQ2FjaGUuZ2V0KGYuaWQpO1xuICAgICAgaWYgKCFmaWxlSW5IaXN0b3J5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZSh7IGlkOiBmLmlkIH0pO1xuICAgICAgICBmaWxlSW5IaXN0b3J5ID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZUluSGlzdG9yeSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2YubmFtZX0gKCR7Zi5pZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSBmaWxlSW5IaXN0b3J5LmtleTtcbiAgICAgIHJlY2lwaWVudHNGaWxlcy5wdXNoKHtcbiAgICAgICAgaWQ6IGYuaWQsXG4gICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNpcGllbnRJZDogdS5pZCxcbiAgICAgIGJvZHk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgIHUucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgc3ViamVjdDogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoc3ViamVjdCksXG4gICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczogcmVjaXBpZW50c0ZpbGVzXG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUdBLE9BQU9BLEVBQVAsTUFBZSxJQUFmO0FBQ0EsT0FBT0MsS0FBUCxNQUFrQixPQUFsQjtBQUVBLFNBQVNDLFVBQVQsUUFBMkIsa0JBQTNCO0FBQ0EsU0FBU0MsVUFBVCxFQUFxQkMsVUFBckIsRUFBaUNDLFVBQWpDLFFBQW1ELGFBQW5EO0FBRUEsU0FBU0Msa0JBQVQsRUFBNkJDLG1CQUE3QixRQUF3RCxtQkFBeEQ7QUFDQSxTQUFTQyxRQUFULEVBQW1CQyxVQUFuQixRQUFxQyxvQkFBckM7QUFDQSxTQUNFQyx5QkFERixFQUVFQyxpQkFGRixFQUdFQyx5QkFIRixFQUlFQyxrQkFKRixRQUtPLG1CQUxQO0FBeUJBLFNBQVNDLGlCQUFULFFBQWtDLG1CQUFsQztBQUNBLFNBQVNDLE1BQVQsUUFBdUIsY0FBdkI7QUFFQSxTQUFTQyxnQkFBVCxFQUEyQkMsZ0JBQTNCLFFBQW1ELG9CQUFuRDtBQUVBLFNBQVNDLFFBQVQsUUFBeUIsU0FBekI7QUFDQSxTQUFTQyxHQUFULFFBQW9CLGtCQUFwQjtBQUNBLFNBQVNDLE9BQVQsRUFBa0JDLE9BQWxCLFFBQWlDLHFCQUFqQztBQUNBLFNBQ0VDLE1BREYsRUFFRUMsV0FGRixFQUdFQyxTQUhGLEVBSUVDLGVBSkYsUUFLTyxtQkFMUDtBQU1BLFNBQ0VDLFlBREYsRUFFRUMsWUFGRixFQUdF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